Tizen 2.0 Release tizen_2.0 accepted/tizen_2.0/20130215.203832 submit/tizen_2.0/20130215.191726
authorHyungKyu Song <hk76.song@samsung.com>
Fri, 15 Feb 2013 15:13:29 +0000 (00:13 +0900)
committerHyungKyu Song <hk76.song@samsung.com>
Fri, 15 Feb 2013 15:13:29 +0000 (00:13 +0900)
697 files changed:
ChangeLog [new file with mode: 0644]
ChangeLog.20 [new file with mode: 0644]
ChangeLog.21 [new file with mode: 0644]
ChangeLog.22 [new file with mode: 0644]
ChangeLog.23 [new file with mode: 0644]
Jamfile [new file with mode: 0644]
Jamrules [new file with mode: 0644]
Makefile [new file with mode: 0644]
README [new file with mode: 0644]
README.git [new file with mode: 0644]
TC/_export_env.sh [new file with mode: 0755]
TC/_export_target_env.sh [new file with mode: 0755]
TC/build.sh [new file with mode: 0755]
TC/clean.sh [new file with mode: 0755]
TC/config [new file with mode: 0755]
TC/execute.sh [new file with mode: 0755]
TC/testcase/Makefile [new file with mode: 0755]
TC/testcase/tslist [new file with mode: 0755]
TC/testcase/utc_ft_bench.c [new file with mode: 0755]
TC/testcase/utc_ft_diff.c [new file with mode: 0755]
TC/testcase/utc_ft_dump.c [new file with mode: 0755]
TC/testcase/utc_ft_gamma.c [new file with mode: 0755]
TC/testcase/utc_ft_grid.c [new file with mode: 0755]
TC/testcase/utc_ft_lint.c [new file with mode: 0755]
TC/testcase/utc_ft_multi.c [new file with mode: 0755]
TC/testcase/utc_ft_string.c [new file with mode: 0755]
TC/testcase/utc_ft_view.c [new file with mode: 0755]
TC/tet_scen [new file with mode: 0755]
TC/tetbuild.cfg [new file with mode: 0755]
TC/tetclean.cfg [new file with mode: 0755]
TC/tetexec.cfg [new file with mode: 0755]
autogen.sh [new file with mode: 0644]
builds/amiga/README [new file with mode: 0644]
builds/amiga/include/freetype/config/ftconfig.h [new file with mode: 0644]
builds/amiga/include/freetype/config/ftmodule.h [new file with mode: 0644]
builds/amiga/makefile [new file with mode: 0644]
builds/amiga/makefile.os4 [new file with mode: 0644]
builds/amiga/smakefile [new file with mode: 0644]
builds/amiga/src/base/ftdebug.c [new file with mode: 0644]
builds/amiga/src/base/ftsystem.c [new file with mode: 0644]
builds/ansi/ansi-def.mk [new file with mode: 0644]
builds/ansi/ansi.mk [new file with mode: 0644]
builds/atari/ATARI.H [new file with mode: 0644]
builds/atari/FNames.SIC [new file with mode: 0644]
builds/atari/FREETYPE.PRJ [new file with mode: 0644]
builds/atari/README.TXT [new file with mode: 0644]
builds/atari/deflinejoiner.awk [new file with mode: 0644]
builds/atari/gen-purec-patch.sh [new file with mode: 0755]
builds/beos/beos-def.mk [new file with mode: 0644]
builds/beos/beos.mk [new file with mode: 0644]
builds/beos/detect.mk [new file with mode: 0644]
builds/compiler/ansi-cc.mk [new file with mode: 0644]
builds/compiler/bcc-dev.mk [new file with mode: 0644]
builds/compiler/bcc.mk [new file with mode: 0644]
builds/compiler/emx.mk [new file with mode: 0644]
builds/compiler/gcc-dev.mk [new file with mode: 0644]
builds/compiler/gcc.mk [new file with mode: 0644]
builds/compiler/intelc.mk [new file with mode: 0644]
builds/compiler/unix-lcc.mk [new file with mode: 0644]
builds/compiler/visualage.mk [new file with mode: 0644]
builds/compiler/visualc.mk [new file with mode: 0644]
builds/compiler/watcom.mk [new file with mode: 0644]
builds/compiler/win-lcc.mk [new file with mode: 0644]
builds/detect.mk [new file with mode: 0644]
builds/dos/detect.mk [new file with mode: 0644]
builds/dos/dos-def.mk [new file with mode: 0644]
builds/dos/dos-emx.mk [new file with mode: 0644]
builds/dos/dos-gcc.mk [new file with mode: 0644]
builds/dos/dos-wat.mk [new file with mode: 0644]
builds/exports.mk [new file with mode: 0644]
builds/freetype.mk [new file with mode: 0644]
builds/link_dos.mk [new file with mode: 0644]
builds/link_std.mk [new file with mode: 0644]
builds/mac/FreeType.m68k_cfm.make.txt [new file with mode: 0644]
builds/mac/FreeType.m68k_far.make.txt [new file with mode: 0644]
builds/mac/FreeType.ppc_carbon.make.txt [new file with mode: 0644]
builds/mac/FreeType.ppc_classic.make.txt [new file with mode: 0644]
builds/mac/README [new file with mode: 0644]
builds/mac/ascii2mpw.py [new file with mode: 0755]
builds/mac/ftlib.prj.xml [new file with mode: 0644]
builds/mac/ftmac.c [new file with mode: 0644]
builds/modules.mk [new file with mode: 0644]
builds/newline [new file with mode: 0644]
builds/os2/detect.mk [new file with mode: 0644]
builds/os2/os2-def.mk [new file with mode: 0644]
builds/os2/os2-dev.mk [new file with mode: 0644]
builds/os2/os2-gcc.mk [new file with mode: 0644]
builds/symbian/bld.inf [new file with mode: 0644]
builds/symbian/freetype.mmp [new file with mode: 0644]
builds/toplevel.mk [new file with mode: 0644]
builds/unix/.gitignore [new file with mode: 0644]
builds/unix/configure.raw [new file with mode: 0644]
builds/unix/detect.mk [new file with mode: 0644]
builds/unix/freetype-config.in [new file with mode: 0644]
builds/unix/freetype2.in [new file with mode: 0644]
builds/unix/freetype2.m4 [new file with mode: 0644]
builds/unix/ft-munmap.m4 [new file with mode: 0644]
builds/unix/ft2unix.h [new file with mode: 0644]
builds/unix/ftconfig.in [new file with mode: 0644]
builds/unix/ftsystem.c [new file with mode: 0644]
builds/unix/install-sh [new file with mode: 0755]
builds/unix/install.mk [new file with mode: 0644]
builds/unix/mkinstalldirs [new file with mode: 0755]
builds/unix/unix-cc.in [new file with mode: 0644]
builds/unix/unix-def.in [new file with mode: 0644]
builds/unix/unix-dev.mk [new file with mode: 0644]
builds/unix/unix-lcc.mk [new file with mode: 0644]
builds/unix/unix.mk [new file with mode: 0644]
builds/unix/unixddef.mk [new file with mode: 0644]
builds/vms/ftconfig.h [new file with mode: 0644]
builds/vms/ftsystem.c [new file with mode: 0644]
builds/win32/detect.mk [new file with mode: 0644]
builds/win32/ftdebug.c [new file with mode: 0644]
builds/win32/vc2005/freetype.sln [new file with mode: 0644]
builds/win32/vc2005/freetype.vcproj [new file with mode: 0644]
builds/win32/vc2005/index.html [new file with mode: 0644]
builds/win32/vc2008/freetype.sln [new file with mode: 0644]
builds/win32/vc2008/freetype.vcproj [new file with mode: 0644]
builds/win32/vc2008/index.html [new file with mode: 0644]
builds/win32/vc2010/freetype.sln [new file with mode: 0644]
builds/win32/vc2010/freetype.vcxproj [new file with mode: 0644]
builds/win32/vc2010/freetype.vcxproj.filters [new file with mode: 0644]
builds/win32/vc2010/index.html [new file with mode: 0644]
builds/win32/visualc/freetype.dsp [new file with mode: 0644]
builds/win32/visualc/freetype.dsw [new file with mode: 0644]
builds/win32/visualc/freetype.sln [new file with mode: 0644]
builds/win32/visualc/freetype.vcproj [new file with mode: 0644]
builds/win32/visualc/index.html [new file with mode: 0644]
builds/win32/visualce/freetype.dsp [new file with mode: 0644]
builds/win32/visualce/freetype.dsw [new file with mode: 0644]
builds/win32/visualce/freetype.vcproj [new file with mode: 0644]
builds/win32/visualce/index.html [new file with mode: 0644]
builds/win32/w32-bcc.mk [new file with mode: 0644]
builds/win32/w32-bccd.mk [new file with mode: 0644]
builds/win32/w32-dev.mk [new file with mode: 0644]
builds/win32/w32-gcc.mk [new file with mode: 0644]
builds/win32/w32-icc.mk [new file with mode: 0644]
builds/win32/w32-intl.mk [new file with mode: 0644]
builds/win32/w32-lcc.mk [new file with mode: 0644]
builds/win32/w32-mingw32.mk [new file with mode: 0644]
builds/win32/w32-vcc.mk [new file with mode: 0644]
builds/win32/w32-wat.mk [new file with mode: 0644]
builds/win32/win32-def.mk [new file with mode: 0644]
builds/wince/ftdebug.c [new file with mode: 0644]
builds/wince/vc2005-ce/freetype.sln [new file with mode: 0644]
builds/wince/vc2005-ce/freetype.vcproj [new file with mode: 0644]
builds/wince/vc2005-ce/index.html [new file with mode: 0644]
builds/wince/vc2008-ce/freetype.sln [new file with mode: 0644]
builds/wince/vc2008-ce/freetype.vcproj [new file with mode: 0644]
builds/wince/vc2008-ce/index.html [new file with mode: 0644]
configure [new file with mode: 0755]
debian/changelog [new file with mode: 0644]
debian/compat [new file with mode: 0644]
debian/control [new file with mode: 0644]
debian/copyright [new file with mode: 0644]
debian/dirs [new file with mode: 0644]
debian/docs [new file with mode: 0644]
debian/libfreetype6-dev.install.in [new file with mode: 0644]
debian/libfreetype6.install.in [new file with mode: 0644]
debian/rules [new file with mode: 0755]
devel/ft2build.h [new file with mode: 0644]
devel/ftoption.h [new file with mode: 0644]
docs/CHANGES [new file with mode: 0644]
docs/CUSTOMIZE [new file with mode: 0644]
docs/DEBUG [new file with mode: 0644]
docs/FTL.TXT [new file with mode: 0644]
docs/GPLv2.TXT [new file with mode: 0644]
docs/INSTALL [new file with mode: 0644]
docs/INSTALL.ANY [new file with mode: 0644]
docs/INSTALL.CROSS [new file with mode: 0644]
docs/INSTALL.GNU [new file with mode: 0644]
docs/INSTALL.MAC [new file with mode: 0644]
docs/INSTALL.UNIX [new file with mode: 0644]
docs/INSTALL.VMS [new file with mode: 0644]
docs/LICENSE.TXT [new file with mode: 0644]
docs/MAKEPP [new file with mode: 0644]
docs/PROBLEMS [new file with mode: 0644]
docs/TODO [new file with mode: 0644]
docs/VERSION.DLL [new file with mode: 0644]
docs/formats.txt [new file with mode: 0644]
docs/raster.txt [new file with mode: 0644]
docs/reference/.gitignore [new file with mode: 0644]
docs/reference/README [new file with mode: 0644]
docs/release [new file with mode: 0644]
ft2demos/ftbench [new file with mode: 0755]
ft2demos/ftdiff [new file with mode: 0755]
ft2demos/ftdump [new file with mode: 0755]
ft2demos/ftgamma [new file with mode: 0755]
ft2demos/ftgrid [new file with mode: 0755]
ft2demos/ftlint [new file with mode: 0755]
ft2demos/ftmulti [new file with mode: 0755]
ft2demos/ftstring [new file with mode: 0755]
ft2demos/ftview [new file with mode: 0755]
include/freetype/config/ftconfig.h [new file with mode: 0644]
include/freetype/config/ftheader.h [new file with mode: 0644]
include/freetype/config/ftmodule.h [new file with mode: 0644]
include/freetype/config/ftoption.h [new file with mode: 0644]
include/freetype/config/ftstdlib.h [new file with mode: 0644]
include/freetype/freetype.h [new file with mode: 0644]
include/freetype/ftadvanc.h [new file with mode: 0644]
include/freetype/ftbbox.h [new file with mode: 0644]
include/freetype/ftbdf.h [new file with mode: 0644]
include/freetype/ftbitmap.h [new file with mode: 0644]
include/freetype/ftbzip2.h [new file with mode: 0644]
include/freetype/ftcache.h [new file with mode: 0644]
include/freetype/ftchapters.h [new file with mode: 0644]
include/freetype/ftcid.h [new file with mode: 0644]
include/freetype/fterrdef.h [new file with mode: 0644]
include/freetype/fterrors.h [new file with mode: 0644]
include/freetype/ftgasp.h [new file with mode: 0644]
include/freetype/ftglyph.h [new file with mode: 0644]
include/freetype/ftgxval.h [new file with mode: 0644]
include/freetype/ftgzip.h [new file with mode: 0644]
include/freetype/ftimage.h [new file with mode: 0644]
include/freetype/ftincrem.h [new file with mode: 0644]
include/freetype/ftlcdfil.h [new file with mode: 0644]
include/freetype/ftlist.h [new file with mode: 0644]
include/freetype/ftlzw.h [new file with mode: 0644]
include/freetype/ftmac.h [new file with mode: 0644]
include/freetype/ftmm.h [new file with mode: 0644]
include/freetype/ftmodapi.h [new file with mode: 0644]
include/freetype/ftmoderr.h [new file with mode: 0644]
include/freetype/ftotval.h [new file with mode: 0644]
include/freetype/ftoutln.h [new file with mode: 0644]
include/freetype/ftpfr.h [new file with mode: 0644]
include/freetype/ftrender.h [new file with mode: 0644]
include/freetype/ftsizes.h [new file with mode: 0644]
include/freetype/ftsnames.h [new file with mode: 0644]
include/freetype/ftstroke.h [new file with mode: 0644]
include/freetype/ftsynth.h [new file with mode: 0644]
include/freetype/ftsystem.h [new file with mode: 0644]
include/freetype/fttrigon.h [new file with mode: 0644]
include/freetype/fttypes.h [new file with mode: 0644]
include/freetype/ftwinfnt.h [new file with mode: 0644]
include/freetype/ftxf86.h [new file with mode: 0644]
include/freetype/internal/autohint.h [new file with mode: 0644]
include/freetype/internal/ftcalc.h [new file with mode: 0644]
include/freetype/internal/ftdebug.h [new file with mode: 0644]
include/freetype/internal/ftdriver.h [new file with mode: 0644]
include/freetype/internal/ftgloadr.h [new file with mode: 0644]
include/freetype/internal/ftmemory.h [new file with mode: 0644]
include/freetype/internal/ftobjs.h [new file with mode: 0644]
include/freetype/internal/ftpic.h [new file with mode: 0644]
include/freetype/internal/ftrfork.h [new file with mode: 0644]
include/freetype/internal/ftserv.h [new file with mode: 0644]
include/freetype/internal/ftstream.h [new file with mode: 0644]
include/freetype/internal/fttrace.h [new file with mode: 0644]
include/freetype/internal/ftvalid.h [new file with mode: 0644]
include/freetype/internal/internal.h [new file with mode: 0644]
include/freetype/internal/psaux.h [new file with mode: 0644]
include/freetype/internal/pshints.h [new file with mode: 0644]
include/freetype/internal/services/svbdf.h [new file with mode: 0644]
include/freetype/internal/services/svcid.h [new file with mode: 0644]
include/freetype/internal/services/svgldict.h [new file with mode: 0644]
include/freetype/internal/services/svgxval.h [new file with mode: 0644]
include/freetype/internal/services/svkern.h [new file with mode: 0644]
include/freetype/internal/services/svmm.h [new file with mode: 0644]
include/freetype/internal/services/svotval.h [new file with mode: 0644]
include/freetype/internal/services/svpfr.h [new file with mode: 0644]
include/freetype/internal/services/svpostnm.h [new file with mode: 0644]
include/freetype/internal/services/svpscmap.h [new file with mode: 0644]
include/freetype/internal/services/svpsinfo.h [new file with mode: 0644]
include/freetype/internal/services/svsfnt.h [new file with mode: 0644]
include/freetype/internal/services/svttcmap.h [new file with mode: 0644]
include/freetype/internal/services/svtteng.h [new file with mode: 0644]
include/freetype/internal/services/svttglyf.h [new file with mode: 0644]
include/freetype/internal/services/svwinfnt.h [new file with mode: 0644]
include/freetype/internal/services/svxf86nm.h [new file with mode: 0644]
include/freetype/internal/sfnt.h [new file with mode: 0644]
include/freetype/internal/t1types.h [new file with mode: 0644]
include/freetype/internal/tttypes.h [new file with mode: 0644]
include/freetype/t1tables.h [new file with mode: 0644]
include/freetype/ttnameid.h [new file with mode: 0644]
include/freetype/tttables.h [new file with mode: 0644]
include/freetype/tttags.h [new file with mode: 0644]
include/freetype/ttunpat.h [new file with mode: 0644]
include/ft2build.h [new file with mode: 0644]
modules.cfg [new file with mode: 0644]
objs/.gitignore [new file with mode: 0644]
objs/README [new file with mode: 0644]
packaging/freetype.manifest [new file with mode: 0644]
packaging/freetype.spec [new file with mode: 0644]
src/Jamfile [new file with mode: 0644]
src/autofit/Jamfile [new file with mode: 0644]
src/autofit/afangles.c [new file with mode: 0644]
src/autofit/afangles.h [new file with mode: 0644]
src/autofit/afcjk.c [new file with mode: 0644]
src/autofit/afcjk.h [new file with mode: 0644]
src/autofit/afdummy.c [new file with mode: 0644]
src/autofit/afdummy.h [new file with mode: 0644]
src/autofit/aferrors.h [new file with mode: 0644]
src/autofit/afglobal.c [new file with mode: 0644]
src/autofit/afglobal.h [new file with mode: 0644]
src/autofit/afhints.c [new file with mode: 0644]
src/autofit/afhints.h [new file with mode: 0644]
src/autofit/afindic.c [new file with mode: 0644]
src/autofit/afindic.h [new file with mode: 0644]
src/autofit/aflatin.c [new file with mode: 0644]
src/autofit/aflatin.h [new file with mode: 0644]
src/autofit/aflatin2.c [new file with mode: 0644]
src/autofit/aflatin2.h [new file with mode: 0644]
src/autofit/afloader.c [new file with mode: 0644]
src/autofit/afloader.h [new file with mode: 0644]
src/autofit/afmodule.c [new file with mode: 0644]
src/autofit/afmodule.h [new file with mode: 0644]
src/autofit/afpic.c [new file with mode: 0644]
src/autofit/afpic.h [new file with mode: 0644]
src/autofit/aftypes.h [new file with mode: 0644]
src/autofit/afwarp.c [new file with mode: 0644]
src/autofit/afwarp.h [new file with mode: 0644]
src/autofit/autofit.c [new file with mode: 0644]
src/autofit/module.mk [new file with mode: 0644]
src/autofit/rules.mk [new file with mode: 0644]
src/base/Jamfile [new file with mode: 0644]
src/base/basepic.c [new file with mode: 0644]
src/base/basepic.h [new file with mode: 0644]
src/base/ftadvanc.c [new file with mode: 0644]
src/base/ftapi.c [new file with mode: 0644]
src/base/ftbase.c [new file with mode: 0644]
src/base/ftbase.h [new file with mode: 0644]
src/base/ftbbox.c [new file with mode: 0644]
src/base/ftbdf.c [new file with mode: 0644]
src/base/ftbitmap.c [new file with mode: 0644]
src/base/ftcalc.c [new file with mode: 0644]
src/base/ftcid.c [new file with mode: 0644]
src/base/ftdbgmem.c [new file with mode: 0644]
src/base/ftdebug.c [new file with mode: 0644]
src/base/ftfstype.c [new file with mode: 0644]
src/base/ftgasp.c [new file with mode: 0644]
src/base/ftgloadr.c [new file with mode: 0644]
src/base/ftglyph.c [new file with mode: 0644]
src/base/ftgxval.c [new file with mode: 0644]
src/base/ftinit.c [new file with mode: 0644]
src/base/ftlcdfil.c [new file with mode: 0644]
src/base/ftmac.c [new file with mode: 0644]
src/base/ftmm.c [new file with mode: 0644]
src/base/ftobjs.c [new file with mode: 0644]
src/base/ftotval.c [new file with mode: 0644]
src/base/ftoutln.c [new file with mode: 0644]
src/base/ftpatent.c [new file with mode: 0644]
src/base/ftpfr.c [new file with mode: 0644]
src/base/ftpic.c [new file with mode: 0644]
src/base/ftrfork.c [new file with mode: 0644]
src/base/ftsnames.c [new file with mode: 0644]
src/base/ftstream.c [new file with mode: 0644]
src/base/ftstroke.c [new file with mode: 0644]
src/base/ftsynth.c [new file with mode: 0644]
src/base/ftsystem.c [new file with mode: 0644]
src/base/fttrigon.c [new file with mode: 0644]
src/base/fttype1.c [new file with mode: 0644]
src/base/ftutil.c [new file with mode: 0644]
src/base/ftwinfnt.c [new file with mode: 0644]
src/base/ftxf86.c [new file with mode: 0644]
src/base/rules.mk [new file with mode: 0644]
src/bdf/Jamfile [new file with mode: 0644]
src/bdf/README [new file with mode: 0644]
src/bdf/bdf.c [new file with mode: 0644]
src/bdf/bdf.h [new file with mode: 0644]
src/bdf/bdfdrivr.c [new file with mode: 0644]
src/bdf/bdfdrivr.h [new file with mode: 0644]
src/bdf/bdferror.h [new file with mode: 0644]
src/bdf/bdflib.c [new file with mode: 0644]
src/bdf/module.mk [new file with mode: 0644]
src/bdf/rules.mk [new file with mode: 0644]
src/bzip2/Jamfile [new file with mode: 0644]
src/bzip2/ftbzip2.c [new file with mode: 0644]
src/bzip2/rules.mk [new file with mode: 0644]
src/cache/Jamfile [new file with mode: 0644]
src/cache/ftcache.c [new file with mode: 0644]
src/cache/ftcbasic.c [new file with mode: 0644]
src/cache/ftccache.c [new file with mode: 0644]
src/cache/ftccache.h [new file with mode: 0644]
src/cache/ftccback.h [new file with mode: 0644]
src/cache/ftccmap.c [new file with mode: 0644]
src/cache/ftcerror.h [new file with mode: 0644]
src/cache/ftcglyph.c [new file with mode: 0644]
src/cache/ftcglyph.h [new file with mode: 0644]
src/cache/ftcimage.c [new file with mode: 0644]
src/cache/ftcimage.h [new file with mode: 0644]
src/cache/ftcmanag.c [new file with mode: 0644]
src/cache/ftcmanag.h [new file with mode: 0644]
src/cache/ftcmru.c [new file with mode: 0644]
src/cache/ftcmru.h [new file with mode: 0644]
src/cache/ftcsbits.c [new file with mode: 0644]
src/cache/ftcsbits.h [new file with mode: 0644]
src/cache/rules.mk [new file with mode: 0644]
src/cff/Jamfile [new file with mode: 0644]
src/cff/cff.c [new file with mode: 0644]
src/cff/cffcmap.c [new file with mode: 0644]
src/cff/cffcmap.h [new file with mode: 0644]
src/cff/cffdrivr.c [new file with mode: 0644]
src/cff/cffdrivr.h [new file with mode: 0644]
src/cff/cfferrs.h [new file with mode: 0644]
src/cff/cffgload.c [new file with mode: 0644]
src/cff/cffgload.h [new file with mode: 0644]
src/cff/cffload.c [new file with mode: 0644]
src/cff/cffload.h [new file with mode: 0644]
src/cff/cffobjs.c [new file with mode: 0644]
src/cff/cffobjs.h [new file with mode: 0644]
src/cff/cffparse.c [new file with mode: 0644]
src/cff/cffparse.h [new file with mode: 0644]
src/cff/cffpic.c [new file with mode: 0644]
src/cff/cffpic.h [new file with mode: 0644]
src/cff/cfftoken.h [new file with mode: 0644]
src/cff/cfftypes.h [new file with mode: 0644]
src/cff/module.mk [new file with mode: 0644]
src/cff/rules.mk [new file with mode: 0644]
src/cid/Jamfile [new file with mode: 0644]
src/cid/ciderrs.h [new file with mode: 0644]
src/cid/cidgload.c [new file with mode: 0644]
src/cid/cidgload.h [new file with mode: 0644]
src/cid/cidload.c [new file with mode: 0644]
src/cid/cidload.h [new file with mode: 0644]
src/cid/cidobjs.c [new file with mode: 0644]
src/cid/cidobjs.h [new file with mode: 0644]
src/cid/cidparse.c [new file with mode: 0644]
src/cid/cidparse.h [new file with mode: 0644]
src/cid/cidriver.c [new file with mode: 0644]
src/cid/cidriver.h [new file with mode: 0644]
src/cid/cidtoken.h [new file with mode: 0644]
src/cid/module.mk [new file with mode: 0644]
src/cid/rules.mk [new file with mode: 0644]
src/cid/type1cid.c [new file with mode: 0644]
src/gxvalid/Jamfile [new file with mode: 0644]
src/gxvalid/README [new file with mode: 0644]
src/gxvalid/gxvalid.c [new file with mode: 0644]
src/gxvalid/gxvalid.h [new file with mode: 0644]
src/gxvalid/gxvbsln.c [new file with mode: 0644]
src/gxvalid/gxvcommn.c [new file with mode: 0644]
src/gxvalid/gxvcommn.h [new file with mode: 0644]
src/gxvalid/gxverror.h [new file with mode: 0644]
src/gxvalid/gxvfeat.c [new file with mode: 0644]
src/gxvalid/gxvfeat.h [new file with mode: 0644]
src/gxvalid/gxvfgen.c [new file with mode: 0644]
src/gxvalid/gxvjust.c [new file with mode: 0644]
src/gxvalid/gxvkern.c [new file with mode: 0644]
src/gxvalid/gxvlcar.c [new file with mode: 0644]
src/gxvalid/gxvmod.c [new file with mode: 0644]
src/gxvalid/gxvmod.h [new file with mode: 0644]
src/gxvalid/gxvmort.c [new file with mode: 0644]
src/gxvalid/gxvmort.h [new file with mode: 0644]
src/gxvalid/gxvmort0.c [new file with mode: 0644]
src/gxvalid/gxvmort1.c [new file with mode: 0644]
src/gxvalid/gxvmort2.c [new file with mode: 0644]
src/gxvalid/gxvmort4.c [new file with mode: 0644]
src/gxvalid/gxvmort5.c [new file with mode: 0644]
src/gxvalid/gxvmorx.c [new file with mode: 0644]
src/gxvalid/gxvmorx.h [new file with mode: 0644]
src/gxvalid/gxvmorx0.c [new file with mode: 0644]
src/gxvalid/gxvmorx1.c [new file with mode: 0644]
src/gxvalid/gxvmorx2.c [new file with mode: 0644]
src/gxvalid/gxvmorx4.c [new file with mode: 0644]
src/gxvalid/gxvmorx5.c [new file with mode: 0644]
src/gxvalid/gxvopbd.c [new file with mode: 0644]
src/gxvalid/gxvprop.c [new file with mode: 0644]
src/gxvalid/gxvtrak.c [new file with mode: 0644]
src/gxvalid/module.mk [new file with mode: 0644]
src/gxvalid/rules.mk [new file with mode: 0644]
src/gzip/Jamfile [new file with mode: 0644]
src/gzip/adler32.c [new file with mode: 0644]
src/gzip/ftgzip.c [new file with mode: 0644]
src/gzip/infblock.c [new file with mode: 0644]
src/gzip/infblock.h [new file with mode: 0644]
src/gzip/infcodes.c [new file with mode: 0644]
src/gzip/infcodes.h [new file with mode: 0644]
src/gzip/inffixed.h [new file with mode: 0644]
src/gzip/inflate.c [new file with mode: 0644]
src/gzip/inftrees.c [new file with mode: 0644]
src/gzip/inftrees.h [new file with mode: 0644]
src/gzip/infutil.c [new file with mode: 0644]
src/gzip/infutil.h [new file with mode: 0644]
src/gzip/rules.mk [new file with mode: 0644]
src/gzip/zconf.h [new file with mode: 0644]
src/gzip/zlib.h [new file with mode: 0644]
src/gzip/zutil.c [new file with mode: 0644]
src/gzip/zutil.h [new file with mode: 0644]
src/lzw/Jamfile [new file with mode: 0644]
src/lzw/ftlzw.c [new file with mode: 0644]
src/lzw/ftzopen.c [new file with mode: 0644]
src/lzw/ftzopen.h [new file with mode: 0644]
src/lzw/rules.mk [new file with mode: 0644]
src/otvalid/Jamfile [new file with mode: 0644]
src/otvalid/module.mk [new file with mode: 0644]
src/otvalid/otvalid.c [new file with mode: 0644]
src/otvalid/otvalid.h [new file with mode: 0644]
src/otvalid/otvbase.c [new file with mode: 0644]
src/otvalid/otvcommn.c [new file with mode: 0644]
src/otvalid/otvcommn.h [new file with mode: 0644]
src/otvalid/otverror.h [new file with mode: 0644]
src/otvalid/otvgdef.c [new file with mode: 0644]
src/otvalid/otvgpos.c [new file with mode: 0644]
src/otvalid/otvgpos.h [new file with mode: 0644]
src/otvalid/otvgsub.c [new file with mode: 0644]
src/otvalid/otvjstf.c [new file with mode: 0644]
src/otvalid/otvmath.c [new file with mode: 0644]
src/otvalid/otvmod.c [new file with mode: 0644]
src/otvalid/otvmod.h [new file with mode: 0644]
src/otvalid/rules.mk [new file with mode: 0644]
src/pcf/Jamfile [new file with mode: 0644]
src/pcf/README [new file with mode: 0644]
src/pcf/module.mk [new file with mode: 0644]
src/pcf/pcf.c [new file with mode: 0644]
src/pcf/pcf.h [new file with mode: 0644]
src/pcf/pcfdrivr.c [new file with mode: 0644]
src/pcf/pcfdrivr.h [new file with mode: 0644]
src/pcf/pcferror.h [new file with mode: 0644]
src/pcf/pcfread.c [new file with mode: 0644]
src/pcf/pcfread.h [new file with mode: 0644]
src/pcf/pcfutil.c [new file with mode: 0644]
src/pcf/pcfutil.h [new file with mode: 0644]
src/pcf/rules.mk [new file with mode: 0644]
src/pfr/Jamfile [new file with mode: 0644]
src/pfr/module.mk [new file with mode: 0644]
src/pfr/pfr.c [new file with mode: 0644]
src/pfr/pfrcmap.c [new file with mode: 0644]
src/pfr/pfrcmap.h [new file with mode: 0644]
src/pfr/pfrdrivr.c [new file with mode: 0644]
src/pfr/pfrdrivr.h [new file with mode: 0644]
src/pfr/pfrerror.h [new file with mode: 0644]
src/pfr/pfrgload.c [new file with mode: 0644]
src/pfr/pfrgload.h [new file with mode: 0644]
src/pfr/pfrload.c [new file with mode: 0644]
src/pfr/pfrload.h [new file with mode: 0644]
src/pfr/pfrobjs.c [new file with mode: 0644]
src/pfr/pfrobjs.h [new file with mode: 0644]
src/pfr/pfrsbit.c [new file with mode: 0644]
src/pfr/pfrsbit.h [new file with mode: 0644]
src/pfr/pfrtypes.h [new file with mode: 0644]
src/pfr/rules.mk [new file with mode: 0644]
src/psaux/Jamfile [new file with mode: 0644]
src/psaux/afmparse.c [new file with mode: 0644]
src/psaux/afmparse.h [new file with mode: 0644]
src/psaux/module.mk [new file with mode: 0644]
src/psaux/psaux.c [new file with mode: 0644]
src/psaux/psauxerr.h [new file with mode: 0644]
src/psaux/psauxmod.c [new file with mode: 0644]
src/psaux/psauxmod.h [new file with mode: 0644]
src/psaux/psconv.c [new file with mode: 0644]
src/psaux/psconv.h [new file with mode: 0644]
src/psaux/psobjs.c [new file with mode: 0644]
src/psaux/psobjs.h [new file with mode: 0644]
src/psaux/rules.mk [new file with mode: 0644]
src/psaux/t1cmap.c [new file with mode: 0644]
src/psaux/t1cmap.h [new file with mode: 0644]
src/psaux/t1decode.c [new file with mode: 0644]
src/psaux/t1decode.h [new file with mode: 0644]
src/pshinter/Jamfile [new file with mode: 0644]
src/pshinter/module.mk [new file with mode: 0644]
src/pshinter/pshalgo.c [new file with mode: 0644]
src/pshinter/pshalgo.h [new file with mode: 0644]
src/pshinter/pshglob.c [new file with mode: 0644]
src/pshinter/pshglob.h [new file with mode: 0644]
src/pshinter/pshinter.c [new file with mode: 0644]
src/pshinter/pshmod.c [new file with mode: 0644]
src/pshinter/pshmod.h [new file with mode: 0644]
src/pshinter/pshnterr.h [new file with mode: 0644]
src/pshinter/pshpic.c [new file with mode: 0644]
src/pshinter/pshpic.h [new file with mode: 0644]
src/pshinter/pshrec.c [new file with mode: 0644]
src/pshinter/pshrec.h [new file with mode: 0644]
src/pshinter/rules.mk [new file with mode: 0644]
src/psnames/Jamfile [new file with mode: 0644]
src/psnames/module.mk [new file with mode: 0644]
src/psnames/psmodule.c [new file with mode: 0644]
src/psnames/psmodule.h [new file with mode: 0644]
src/psnames/psnamerr.h [new file with mode: 0644]
src/psnames/psnames.c [new file with mode: 0644]
src/psnames/pspic.c [new file with mode: 0644]
src/psnames/pspic.h [new file with mode: 0644]
src/psnames/pstables.h [new file with mode: 0644]
src/psnames/rules.mk [new file with mode: 0644]
src/raster/Jamfile [new file with mode: 0644]
src/raster/ftmisc.h [new file with mode: 0644]
src/raster/ftraster.c [new file with mode: 0644]
src/raster/ftraster.h [new file with mode: 0644]
src/raster/ftrend1.c [new file with mode: 0644]
src/raster/ftrend1.h [new file with mode: 0644]
src/raster/module.mk [new file with mode: 0644]
src/raster/raster.c [new file with mode: 0644]
src/raster/rasterrs.h [new file with mode: 0644]
src/raster/rastpic.c [new file with mode: 0644]
src/raster/rastpic.h [new file with mode: 0644]
src/raster/rules.mk [new file with mode: 0644]
src/sfnt/Jamfile [new file with mode: 0644]
src/sfnt/module.mk [new file with mode: 0644]
src/sfnt/rules.mk [new file with mode: 0644]
src/sfnt/sfdriver.c [new file with mode: 0644]
src/sfnt/sfdriver.h [new file with mode: 0644]
src/sfnt/sferrors.h [new file with mode: 0644]
src/sfnt/sfnt.c [new file with mode: 0644]
src/sfnt/sfntpic.c [new file with mode: 0644]
src/sfnt/sfntpic.h [new file with mode: 0644]
src/sfnt/sfobjs.c [new file with mode: 0644]
src/sfnt/sfobjs.h [new file with mode: 0644]
src/sfnt/ttbdf.c [new file with mode: 0644]
src/sfnt/ttbdf.h [new file with mode: 0644]
src/sfnt/ttcmap.c [new file with mode: 0644]
src/sfnt/ttcmap.h [new file with mode: 0644]
src/sfnt/ttcmapc.h [new file with mode: 0644]
src/sfnt/ttkern.c [new file with mode: 0644]
src/sfnt/ttkern.h [new file with mode: 0644]
src/sfnt/ttload.c [new file with mode: 0644]
src/sfnt/ttload.h [new file with mode: 0644]
src/sfnt/ttmtx.c [new file with mode: 0644]
src/sfnt/ttmtx.h [new file with mode: 0644]
src/sfnt/ttpost.c [new file with mode: 0644]
src/sfnt/ttpost.h [new file with mode: 0644]
src/sfnt/ttsbit.c [new file with mode: 0644]
src/sfnt/ttsbit.h [new file with mode: 0644]
src/sfnt/ttsbit0.c [new file with mode: 0644]
src/smooth/Jamfile [new file with mode: 0644]
src/smooth/ftgrays.c [new file with mode: 0644]
src/smooth/ftgrays.h [new file with mode: 0644]
src/smooth/ftsmerrs.h [new file with mode: 0644]
src/smooth/ftsmooth.c [new file with mode: 0644]
src/smooth/ftsmooth.h [new file with mode: 0644]
src/smooth/ftspic.c [new file with mode: 0644]
src/smooth/ftspic.h [new file with mode: 0644]
src/smooth/module.mk [new file with mode: 0644]
src/smooth/rules.mk [new file with mode: 0644]
src/smooth/smooth.c [new file with mode: 0644]
src/tools/Jamfile [new file with mode: 0644]
src/tools/apinames.c [new file with mode: 0644]
src/tools/chktrcmp.py [new file with mode: 0755]
src/tools/cordic.py [new file with mode: 0644]
src/tools/docmaker/.gitignore [new file with mode: 0644]
src/tools/docmaker/content.py [new file with mode: 0644]
src/tools/docmaker/docbeauty.py [new file with mode: 0644]
src/tools/docmaker/docmaker.py [new file with mode: 0644]
src/tools/docmaker/formatter.py [new file with mode: 0644]
src/tools/docmaker/sources.py [new file with mode: 0644]
src/tools/docmaker/tohtml.py [new file with mode: 0644]
src/tools/docmaker/utils.py [new file with mode: 0644]
src/tools/ftrandom/Makefile [new file with mode: 0644]
src/tools/ftrandom/README [new file with mode: 0644]
src/tools/ftrandom/ftrandom.c [new file with mode: 0644]
src/tools/glnames.py [new file with mode: 0644]
src/tools/test_afm.c [new file with mode: 0644]
src/tools/test_bbox.c [new file with mode: 0644]
src/tools/test_trig.c [new file with mode: 0644]
src/truetype/Jamfile [new file with mode: 0644]
src/truetype/module.mk [new file with mode: 0644]
src/truetype/rules.mk [new file with mode: 0644]
src/truetype/truetype.c [new file with mode: 0644]
src/truetype/ttdriver.c [new file with mode: 0644]
src/truetype/ttdriver.h [new file with mode: 0644]
src/truetype/tterrors.h [new file with mode: 0644]
src/truetype/ttgload.c [new file with mode: 0644]
src/truetype/ttgload.h [new file with mode: 0644]
src/truetype/ttgxvar.c [new file with mode: 0644]
src/truetype/ttgxvar.h [new file with mode: 0644]
src/truetype/ttinterp.c [new file with mode: 0644]
src/truetype/ttinterp.h [new file with mode: 0644]
src/truetype/ttobjs.c [new file with mode: 0644]
src/truetype/ttobjs.h [new file with mode: 0644]
src/truetype/ttpic.c [new file with mode: 0644]
src/truetype/ttpic.h [new file with mode: 0644]
src/truetype/ttpload.c [new file with mode: 0644]
src/truetype/ttpload.h [new file with mode: 0644]
src/type1/Jamfile [new file with mode: 0644]
src/type1/module.mk [new file with mode: 0644]
src/type1/rules.mk [new file with mode: 0644]
src/type1/t1afm.c [new file with mode: 0644]
src/type1/t1afm.h [new file with mode: 0644]
src/type1/t1driver.c [new file with mode: 0644]
src/type1/t1driver.h [new file with mode: 0644]
src/type1/t1errors.h [new file with mode: 0644]
src/type1/t1gload.c [new file with mode: 0644]
src/type1/t1gload.h [new file with mode: 0644]
src/type1/t1load.c [new file with mode: 0644]
src/type1/t1load.h [new file with mode: 0644]
src/type1/t1objs.c [new file with mode: 0644]
src/type1/t1objs.h [new file with mode: 0644]
src/type1/t1parse.c [new file with mode: 0644]
src/type1/t1parse.h [new file with mode: 0644]
src/type1/t1tokens.h [new file with mode: 0644]
src/type1/type1.c [new file with mode: 0644]
src/type42/Jamfile [new file with mode: 0644]
src/type42/module.mk [new file with mode: 0644]
src/type42/rules.mk [new file with mode: 0644]
src/type42/t42drivr.c [new file with mode: 0644]
src/type42/t42drivr.h [new file with mode: 0644]
src/type42/t42error.h [new file with mode: 0644]
src/type42/t42objs.c [new file with mode: 0644]
src/type42/t42objs.h [new file with mode: 0644]
src/type42/t42parse.c [new file with mode: 0644]
src/type42/t42parse.h [new file with mode: 0644]
src/type42/t42types.h [new file with mode: 0644]
src/type42/type42.c [new file with mode: 0644]
src/winfonts/Jamfile [new file with mode: 0644]
src/winfonts/fnterrs.h [new file with mode: 0644]
src/winfonts/module.mk [new file with mode: 0644]
src/winfonts/rules.mk [new file with mode: 0644]
src/winfonts/winfnt.c [new file with mode: 0644]
src/winfonts/winfnt.h [new file with mode: 0644]
version.sed [new file with mode: 0644]
vms_make.com [new file with mode: 0644]

diff --git a/ChangeLog b/ChangeLog
new file mode 100644 (file)
index 0000000..9afc1aa
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,4076 @@
+2012-03-08  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.4.9 released.
+       =========================
+
+
+       Tag sources with `VER-2-4-9'.
+
+       * docs/CHANGES: Updated.
+
+       * docs/VERSION.DLL: Update documentation and bump version number to
+       2.4.9.
+
+       * README, Jamfile (RefDoc),
+       builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html,
+       builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html,
+       builds/win32/vc2010/freetype.vcxproj, builds/win32/vc2010/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj,
+       builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp,
+       builds/win32/visualce/freetype.vcproj,
+       builds/win32/visualce/index.html,
+       builds/wince/vc2005-ce/freetype.vcproj,
+       builds/wince/vc2005-ce/index.html,
+       builds/wince/vc2008-ce/freetype.vcproj,
+       builds/wince/vc2008-ce/index.html: s/2.4.8/2.4.9/, s/248/249/.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 9.
+
+       * builds/unix/configure.raw (version_info): Set to 14:1:8.
+
+2012-03-08  Werner Lemberg  <wl@gnu.org>
+
+       [bdf] Add missing overflow check.
+
+       * src/bdf/bdflib.c (_bdf_parse_glyphs) <BITMAP>: Add threshold for
+       `glyph->bpr'.
+
+2012-03-07  Vinnie Falco  <vinnie.falco@gmail.com>
+
+       Prepare source code for amalgamation.
+
+       * src\autofit\aferrors.h, src\bdf\bdferror.h, src\bzip2\ftbzip2.c,
+       src\cache\ftcerror.h, src\cff\cfferrs.h, src\cid\ciderrs.h,
+       src\gxvalid\gxverror.h, src\gzip\ftgzip.c, src\lzw\ftlzw.c,
+       src\otvalid\otverror.h, src\pcf\pcferror.h, src\pfr\pfrerror.h,
+       src\psaux\psauxerr.h, src\pshinter\pshnterr.h,
+       src\psnames\psnamerr.h, src\raster\rasterrs.h, src\sfnt\sferrors.h,
+       src\smooth\ftsmerrs.h, src\truetype\tterrors.h,
+       src\type1\t1errors.h, src\type42\t42error.h, src\winfonts\fnterrs.h:
+       Add #undef FT_ERR_PREFIX before #define FT_ERR_PREFIX.
+
+2012-03-03  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #35660.
+
+       For some divisions, we use casts to 32bit entities.  Always guard
+       against division by zero with these casts also.
+
+       * src/base/ftcalc.c (ft_div64by32): Remove redundant cast.
+       (FT_MulDiv, FT_MulDiv_No_Round): Add 32bit cast.
+       (FT_DivFix): Add 32bit cast (this omission triggered the bug).
+
+2012-03-03  Werner Lemberg  <wl@gnu.org>
+
+       [psaux] Fix handling of track kerning.
+
+       * src/psaux/afmparse.c (afm_parse_track_kern): Don't inverse sign
+       for `min_kern'.  It is indeed quite common that track kerning
+       *increases* spacing for very small sizes.
+
+2012-03-02  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Fix Savannah bug #35689.
+
+       * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check first outline
+       point.
+
+2012-03-01  Werner Lemberg  <wl@gnu.org>
+
+       [bdf] Fix Savannah bug #35656.
+
+       * src/bdf/bdflib.c (_bdf_parse_glyphs) <_BDF_BITMAP>: Check validity
+       of nibble characters instead of accessing `a2i' array.
+
+2012-03-01  Werner Lemberg  <wl@gnu.org>
+
+       [winfonts] Fix Savannah bug #35659.
+
+       * src/winfonts/winfnt.c (FNT_Face_Init): Check number of glyphs.
+
+2012-03-01  Werner Lemberg  <wl@gnu.org>
+
+       [bdf] Fix Savannah bug #35658.
+
+       * src/bdf/bdflib.c (_bdf_list_split): Initialize `field' elements
+       properly.
+
+2012-03-01  Werner Lemberg  <wl@gnu.org>
+
+       [psaux] Fix Savannah bug #35657.
+
+       If in function `skip_spaces' the routine `skip_comment' comes to the
+       end of buffer, `cur' is still increased by one, so we need to check
+       for `p >= limit' and not `p == limit'.
+
+       * src/psaux/psconv.c (PS_Conv_Strtol, PS_Conv_ToFixed,
+       PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Fix boundary checking.
+
+2012-03-01  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Fix Savannah bug #35646.
+
+       * src/truetype/ttinterp.c (Ins_MIRP): Typo, present since ages.  The
+       code is now in sync with the other operators (e.g. MSIRP) which
+       modify twilight points.
+
+2012-03-01  Werner Lemberg  <wl@gnu.org>
+
+       [bdf] Fix Savannah bug #35643.
+
+       * src/bdf/bdflib.c (_bdf_list_ensure): Bring code in sync with
+       comment before `_bdf_list_split', this is, really allocate at least
+       five `field' elements.
+
+2012-03-01  Werner Lemberg  <wl@gnu.org>
+
+       [bdf] Fix Savannah bug #35641.
+
+       * src/bdf/bdflib.c (_bdf_parse_glyphs) <DWIDTH, BBX>: Abort if
+       _BDF_ENCODING isn't set.  We need this because access to the `glyph'
+       variable might be undefined otherwise.
+
+2012-03-01  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Fix Savannah bug #35640.
+
+       * src/truetype/ttinterp.c (SkipCode, TT_RunIns): Fix boundary check
+       for NPUSHB and NPUSHW instructions.
+
+2012-02-29  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Fix Savannah bug #35601.
+
+       * src/truetype/ttinterp.c (Ins_SHZ): Use number of points instead of
+       last point for loop.
+       Also remove redundant boundary check.
+
+2012-02-29  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Remove redundant check.
+
+       * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Remove redundant
+       second check for ordered contour start points.
+
+2012-02-29  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Make SHC instruction behave similar to MS rasterizer.
+
+       * src/truetype/ttinterp.c (Ins_SHC): Handle virtual contour in
+       twilight zone.
+
+2012-02-29  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       Avoid modulo operators against a power-of-two denominator.
+
+       * src/afcjk.c (af_hint_normal_stem), src/base/ftoutln.c
+       (ft_contour_has), src/cff/cffgload.c (cff_decoder_parse_charstrings)
+       <cff_op_vvcurveto, cff_op_hhcurveto, cff_op_hvcurveto>,
+       src/gxvalid/gxvcommn.c (GXV_32BIT_ALIGNMENT_VALIDATE),
+       src/gxvalid/gxvfeat.c (gxv_feat_setting_validate): Replace `%' with
+       `&' operator.
+
+2012-02-29  Werner Lemberg  <wl@gnu.org>
+
+       [autofit] Don't synchronize digit widths for light rendering mode.
+
+       We don't hint horizontally in this mode.
+
+       * src/autofit/afloader.c (af_loader_load_g) <Hint_Metrics>:
+       Implement it.
+
+2012-02-26  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [type42] Minor code optimization (again).
+
+       * src/type42/t42parse.c (t42_parse_sfnts): Simplify previous change.
+
+2012-02-26  Mateusz Jurczyk  <mjurczyk@google.com>
+           Werner Lemberg  <wl@gnu.org>
+
+       [smooth] Fix Savannah bug #35604.
+
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic): Use `FT_Pos'
+       instead of `FT_UInt' for some variables and update comparisons
+       accordingly.  A detailed analysis can be found in the bug report.
+
+2012-02-26  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [type42] Minor code optimization.
+
+       * src/type42/t42parse.c (t42_parse_sfnts): Use bitmask instead of
+       modulo operator.
+
+2012-02-26  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2012-02-26  Werner Lemberg  <wl@gnu.org>
+
+       [type1] Fix Savannah bug #35608.
+
+       * src/type1/t1parse.c (T1_Get_Private_Dict): Reject too short
+       dictionaries.
+
+2012-02-26  Werner Lemberg  <wl@gnu.org>
+
+       [bdf] Support `ENCODING -1 <n>' format.
+
+       * src/bdf/bdflib.c (_bdf_parse_glyphs) <ENCODING>: Implement it.
+
+2012-02-26  Werner Lemberg  <wl@gnu.org>
+
+       [bdf] Fix Savannah bug #35607.
+
+       * src/bdf/bdflib.c (_bdf_parse_glyphs) <ENCODING>: Normalize
+       negative encoding values.
+
+2012-02-26  Werner Lemberg  <wl@gnu.org>
+
+       [type1] Fix Savannah bug #35606.
+
+       * src/type1/t1load.c (parse_subrs): Add proper guards for `strncmp'.
+
+       * src/psaux/psobjs.c (ps_parser_skip_PS_token): Emit error message
+       only if cur < limit.
+
+2012-02-25  Werner Lemberg  <wl@gnu.org>
+
+       [pcf] Fix Savannah bug #35603.
+
+       * src/pcf/pcfread.c (pcf_get_properties): Assure final zero byte in
+       `strings' array.
+
+2012-02-25  Werner Lemberg  <wl@gnu.org>
+
+       [type42] Fix Savannah bug #35602.
+
+       * src/type42/t42parse.c (t42_parse_sfnts): Check `string_size' more
+       thoroughly.
+
+2012-02-25  Werner Lemberg  <wl@gnu.org>
+
+       [bdf] Fix Savannah bugs #35599 and #35600.
+
+       * src/bdf/bdflib.c (ACMSG16): New warning message.
+       (_bdf_parse_glyphs) <_BDF_BITMAP>: Check line length.
+
+2012-02-24  Werner Lemberg  <wl@gnu.org>
+
+       [bdf] Fix Savannah bugs #35597 and #35598.
+
+       * src/bdf/bdflib.c (_bdf_is_atom): Fix handling of property value.
+
+2012-02-24  Vinnie Falco  <vinnie.falco@gmail.com>
+
+       Prepare source code for amalgamation (6/6).
+
+       * src/cff/cffdrivr.c: s/Load_Glyph/cff_glyph_load/.
+
+       * src/cid/cidload.c: s/parse_font_matrix/cid_parse_font_matrix/.
+       s/t1_init_loader/cid_init_loader/.
+       s/t1_done_loader/cid_done_loader/.
+
+       * src/pxaux/t1cmap.c: s/t1_get_glyph_name/psaux_get_glyph_name/.
+
+       * src/truetype/ttdriver.c: s/Load_Glyph/tt_glyph_load/.
+
+       * src/type1/t1load.c: s/parse_font_matrix/t1_parse_font_matrix/.
+
+2012-02-24  Vinnie Falco  <vinnie.falco@gmail.com>
+
+       Prepare source code for amalgamation (5/6).
+
+       * include/freetype/fterrors.h: Undefine FT_KEEP_ERR_PREFIX after
+       using it.
+
+2012-02-22  Vinnie Falco  <vinnie.falco@gmail.com>
+
+       Prepare source code for amalgamation (4/6).
+
+       * src/smooth/ftgrays.c, src/raster/ftraster.c: Undefine RAS_ARG,
+       RAS_ARGS, RAS_VAR, and RAS_VARS before defining it.
+
+       * src/smooth/ftgrays.c: s/TRaster/black_TRaster/,
+       s/PRaster/black_PRaster/.
+       * src/raster/ftraster.c: s/TRaster/gray_TRaster/,
+       s/PRaster/gray_PRaster/.
+
+2012-02-20  Vinnie Falco  <vinnie.falco@gmail.com>
+
+       Prepare source code for amalgamation (3/6).
+
+       * src/smooth/ftgrays.c: s/TWorker/black_TWorker/,
+       s/PWorker/black_PWorker/.
+       * src/raster/ftraster.c: s/TWorker/gray_TWorker/,
+       s/PWorker/gray_PWorker/.
+
+2012-02-20  Vinnie Falco  <vinnie.falco@gmail.com>
+
+       Prepare source code for amalgamation (2/6).
+
+       * src/smooth/ftgrays.c, src/raster/ftraster.c: Undefine FLOOR,
+       CEILING, TRUNC, and SCALED before defining it.
+
+2012-02-20  Vinnie Falco  <vinnie.falco@gmail.com>
+
+       Prepare source code for amalgamation (1/6).
+
+       See discussion starting at
+
+         http://lists.gnu.org/archive/html/freetype-devel/2012-01/msg00037.html
+
+       * src/smooth/ftgrays.c: s/TBand/gray_TBand/.
+       * src/raster/ftraster.c: s/TBand/black_TBand/.
+
+2012-02-17  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [autofit] Fix outline flags.
+
+       * src/autofit/afloader.c (af_loader_load_g): Don't reassign
+       `outline.flags' so that this information is preserved.  See
+       discussion starting at
+
+         http://lists.gnu.org/archive/html/freetype-devel/2012-02/msg00046.html
+
+2012-02-11  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Fix Savannah bug #35466.
+
+       Jump instructions are now bound to the current function.  The MS
+       Windows rasterizer behaves the same, as confirmed by Greg Hitchcock.
+
+       * src/truetype/ttinterp.h (TT_CallRec): Add `Cur_End' element.
+       * src/truetype/ttobjs.h (TT_DefRecord): Add `end' element.
+
+       * src/truetype/ttinterp.c (DO_JROT, DO_JMPR, DO_JROF): Check upper
+       bound of jump address.
+       (Ins_FDEF, Ins_CALL, Ins_LOOPCALL, Ins_UNKNOWN, TT_RunIns): Updated.
+
+2012-02-11  Werner Lemberg  <wl@gnu.org>
+
+       We don't use `extensions'.
+
+       * include/freetype/internal/ftobjs.h (FT_DriverRec): Remove
+       `extensions' field.
+
+2012-02-11  Werner Lemberg  <wl@gnu.org>
+
+       Clean up `generic' fields.
+
+       * include/freetype/internal/ftobjs.h (FT_ModuleRec, FT_LibraryRec):
+       Remove `generic' field since users can't access it.
+
+       * src/base/ftobjs.c (FT_Done_GlyphSlot): Call `generic.finalizer' as
+       advertised in the documentation of FT_Generic.
+       (Destroy_Module, FT_Done_Library): Updated to changes in `ftobjs.h'.
+
+2012-02-07  Werner Lemberg  <wl@gnu.org>
+
+       [autofit] Harmonize function arguments.
+
+       * src/autofit/afloader.c, src/autofit/afloader.h: Use `FT_Int32' for
+       `load_flags'.
+
+2012-02-07  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffobjs.c (cff_face_init): Remove unnecessary casts.
+
+2012-01-17  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [gxvalid] Fix Savannah bug #35286.
+
+       Patch submitted by anonymous reporter.
+
+       * src/gxvalid/gxvcommn.c (gxv_XStateTable_subtable_setup):
+       gxv_set_length_by_ulong_offset() must be called with 3, not 4,
+       the number of the subtables in the state tables; classTable,
+       stateArray, entryTable.
+
+2012-01-17  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [raccess] Modify for PIC build.
+
+       Based on the patch provided by Erik Dahlstrom <ed@opera.com>,
+       http://lists.gnu.org/archive/html/freetype-devel/2012-01/msg00010.html
+
+       Also `raccess_guess_table[]' and `raccess_rule_by_darwin_vfs()'
+       are renamed with `ft_' suffixes.
+
+       * src/base/ftbase.h: `raccess_rule_by_darwin_vfs()' is renamed
+       to `ft_raccess_rule_by_darwin_vfs()'.
+       * src/base/ftobjs.c: Ditto.
+
+       * src/base/ftrfork.c: Declarations of FT_RFork_Rule,
+       raccess_guess_rec, are moved to...
+       * include/freetype/internal/ftrfork.h: Here.
+
+       * include/freetype/internal/ftrfork.h:
+       FT_RFORK_RULE_ARRAY_{BEGIN,ENTRY,END} macros are defined
+       to replace raccess_guess_table[] in both of PIC and non-PIC
+       modes.
+       * src/base/ftrfork.c: raccess_guess_table[] array is rewritten
+       by FT_RFORK_RULE_ARRAY_{BEGIN,ENTRY,END}.
+
+       * src/base/basepic.h (BasePIC): Add `ft_raccess_guess_table'
+       storage.  (FT_RACCESS_GUESS_TABLE_GET): New macro to retrieve
+       the function pointer from `ft_raccess_guess_table' storage in
+       `BasePIC' structure.
+       * src/base/ftrfork.c (FT_Raccess_Guess): Rewritten with
+       FT_RACCESS_GUESS_TABLE_GET.
+       (raccess_get_rule_type_from_rule_index): Add `library' as the
+       first argument to the function, to retrieve the storage of
+       `ft_raccess_guess_table' from it.  Also `raccess_guess_table'
+       is replaced by FT_RACCESS_GUESS_TABLE_GET.
+       (ft_raccess_rule_by_darwin_vfs): Ditto.
+
+2012-01-16  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Remove trailing spaces.
+
+2012-01-16  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Formatting PIC related sources.
+
+       * src/autofit/afpic.c: Harmonize to FT2 coding conventions.
+       * src/base/basepic.c: Ditto.
+       * src/base/ftpic.c: Ditto.
+       * src/cff/cffpic.c: Ditto.
+       * src/pshinter/pshpic.c: Ditto.
+       * src/psnames/pspic.c: Ditto.
+       * src/raster/rastpic.c: Ditto.
+       * src/sfnt/sfntpic.c: Ditto.
+       * src/smooth/ftspic.c: Ditto.
+       * src/truetype/ttpic.c: Ditto.
+
+2012-01-16  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [autofit] Fix the inclusion of `aflatin2.h' in PIC file.
+
+       * src/autofit/afpic.c: Include `aflatin2.h' when
+       FT_OPTION_AUTOFIT2 is defined, as afglobal.c does so.
+       Unconditionally inclusion causes declared but unimplemented
+       warning by GCC 4.6.
+
+2012-01-16  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cff] Remove redundant declarations of cff_cmap_XXX_class_rec.
+
+       * src/cff/cffpic.c: The declarations of
+       FT_Init_Class_cff_cmap_encoding_class_rec() and
+       FT_Init_Class_cff_cmap_unicode_class_rec() are removed.
+       They can be obtained by the inclusion of cffcmap.h.
+       cffcmap.h invokes FT_DECLARE_CMAP_CLASS() and it declares
+       FT_Init_Class_cff_cmap_encoding_class_rec() etc in PIC mode.
+
+2012-01-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Fix redundant declaration warning in PIC mode.
+
+       Originally FT_DEFINE_{DRIVER,MODULE,RENDERER}() macros were
+       designed to declare xxx_pic_{free,init} by themselves.
+       Because these macros are used at the end of the module
+       interface (e.g. ttdriver.c) and the wrapper source to build
+       a module as a single object (e.g. truetype.c) includes
+       the PIC file (e.g. ttpic.c) before the module interface,
+       these macros are expanded AFTER xxx_pic_{free,init} body
+       when the modules are built as single object.
+       The declaration after the implementation causes the redundant
+       declaration warnings, so the declarations are moved to module
+       PIC headers (e.g. ttpic.h).  Separating to other header files
+       are needed for multi build.
+
+       * include/freetype/internal/ftdriver.h (FT_DEFINE_DRIVER):
+       Remove class_##_pic_free and class_##_pic_init declarations.
+       * include/freetype/internal/ftobjs.h (FT_DEFINE_RENDERER,
+       FT_DEFINE_MODULE): Ditto.
+
+       * src/base/basepic.h: Insert a comment and fix coding style.
+       * src/autofit/afpic.h: Declare autofit_module_class_pic_{free,
+       init}.
+       * src/cff/cffpic.h: Declare cff_driver_class_pic_{free,init}.
+       * src/pshinter/pshpic.h: Declare pshinter_module_class_pic_{free,
+       init}.
+       * src/psnames/pspic.h: Declare psnames_module_class_pic_{free,
+       init}.
+       * src/raster/rastpic.h: Declare
+       ft_raster{1,5}_renderer_class_pic_{free,init}
+       * src/sfnt/sfntpic.h: Declare sfnt_module_class_pic_{free,init}.
+       * src/smooth/ftspic.h: Declare
+       ft_smooth_{,lcd_,lcdv_}renderer_class_pic_{free,init}.
+       * src/truetype/ttpic.h: Declare tt_driver_class_pic_{free,init}.
+
+2012-01-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Make pspic.c to include module error header to fix multi build.
+
+       * src/psnames/pspic.c: Include `psnamerr.h'.
+
+2012-01-14  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [base] Fix a dereference of uninitialized variable in PIC mode.
+
+       * src/base/ftglyph.c (FT_Glyph_To_Bitmap): `glyph' must be
+       set before derefering to obtain `library'.  The initialization
+       of `clazz', `glyph', `library' and NULL pointer check are
+       reordered to minimize PIC conditonals.
+
+2012-01-14  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [base] Insert explicit cast for GCC 4.6 in PIC mode.
+
+       * src/base/ftinit.c (FT_Add_Default_Modules): Under PIC
+       configuration, FT_DEFAULT_MODULES_GET returns
+       FT_Module_Class** pointer, GCC 4.6 warns that
+       const FT_Module_Class* const* variable is warned as
+       inappropriate to store it.  To calm it, explicit cast is
+       inserted.  Also `library' is checked to prevent the NULL
+       pointer dereference in FT_DEFAULT_MODULES_GET.
+
+2012-01-13  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Fix PIC build broken by d9145241fe378104ba4c12a42534549faacc92e6.
+
+       Under PIC configuration, FT_{CFF,PSCMAPS,SFNT,TT}_SERVICES_GET
+       take no arguments but derefer the variable named `library'
+       internally.
+
+       * src/cff/cffdrivr.c (cff_get_interface): Declare `library' and
+       set it if non-NULL driver is passed.
+       * src/truetype/ttdriver.c (tt_get_interface): Ditto.
+
+       * src/sfnt/sfdriver.c (sfnt_get_interface): Declare `library'
+       under PIC configuration, and set it if non-NULL module is given.
+       * src/psnames/psmodule.c (psnames_get_interface): Ditto.
+
+2012-01-13  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Make PIC files include module error headers, to use the error codes
+       with per-module prefix.
+
+       * src/autofit/afpic.c: Include `aferrors.h'.
+       * src/cff/cffpic.c: Include `cfferrs.h'.
+       * src/pshinter/pshpic.c: Include `pshnterr.h'.
+       * src/raster/rastpic.c: Include `rasterrs.h'.
+       * src/sfnt/sfntpic.c: Include `sferrors.h'.
+       * src/smooth/ftspic.c: Include `ftsmerrs.h'.
+       * src/truetype/ttpic.c: Include `tterrors.h'.
+
+2012-01-04  Tobias Ringström  <tobias@ringis.se>
+
+       [truetype] Fix IP instruction if x_ppem != y_ppem.
+
+       * src/truetype/ttinterp.c (Ins_IP): Scale `orus' coordinates
+       properly.
+
+2012-01-02  Werner Lemberg  <wl@gnu.org>
+
+       Fix tracing message for `loca' table.
+
+       * src/truetype/ttpload.c (tt_face_get_location): Don't emit a
+       warning message if the last `loca' entry references an empty glyph.
+
+2011-12-10  Werner Lemberg  <wl@gnu.org>
+
+       Add some variable initializations.
+       Reported by Richard COOK <rscook@unicode.org>.
+
+       * src/type1/t1driver.c (t1_ps_get_font_value): Initialize `val'.
+       * src/smooth/ftgrays.c (gray_render_conic): Initialize `levels'
+       earlier.
+
+2011-12-08  Werner Lemberg  <wl@gnu.org>
+
+       Fix serious scaling bug in `FT_Get_Advances'.
+
+       * src/base/ftadvanc.c (FT_Get_Advances): Advance values returned by
+       `FT_Load_Glyph' must be simply multiplied by 1024.
+
+2011-12-08  Werner Lemberg  <wl@gnu.org>
+
+       * src/bdf/bdflib.c (_bdf_parse_start): Drop redundant error tracing.
+
+2011-12-02  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [mac] Unify DARWIN_NO_CARBON with FT_MACINTOSH.
+
+       Originally FT_MACINTOSH was a pure auto macro and DARWIN_NO_CARBON
+       was a configurable macro to disable Carbon-dependent code.  Because
+       now configure script sets DARWIN_NO_CARBON by default and disables
+       Darwin & Carbon-dependent codes, these macros can be unified.
+       FT_MACINTOSH (undefined by default) is kept and DARWIN_NO_CARBON
+       (defined by default) is removed, because DARWIN_NO_CARBON violates
+       FT_XXX naming convention of public macros, and a macro configured by
+       default is not portable for the building without configure (e.g.
+       make devel).
+
+       * builds/unix/configure.raw: Define FT_MACINTOSH if Carbon-based
+       old Mac font support is requested and Carbon is available.
+       * builds/unix/ftconfig.in: Undefine FT_MACINTOSH when the support
+       for Mac OS X without Carbon (e.g.  Mac OS X 10.4 for ppc64) is
+       requested.
+       * include/freetype/config/ftconfig.in: Ditto.
+       * builds/vms/ftconfig.h: Ditto.
+
+       * src/base/ftbase.h: Remove DARWIN_NO_CARBON.
+       * src/base/ftbase.c: Ditto.
+       * src/base/ftobjs.c: Ditto.
+       * src/base/ftrfork.c: Ditto.
+
+       * src/base/ftmac.c: Compile the body if FT_MACINTOSH is defined
+       (same with TT_USE_BYTECODE_INTERPRETER in ttinterp.c).
+       * builds/mac/ftmac.c: Ditto.
+
+       * builds/mac/FreeType.m68k_cfm.make.txt: Define FT_MACINTOSH.
+       * builds/mac/FreeType.m68k_far.make.txt: Ditto.
+       * builds/mac/FreeType.ppc_classic.make.txt: Ditto.
+       * builds/mac/FreeType.ppc_carbon.make.txt: Ditto.
+
+2011-11-30  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Fix Savannah bug #34728 (`make devel' on Mac OS X).
+
+       * builds/toplevel.mk: Check `/dev/null' to identify the Unix-
+       like systems without `init' nor `hurd' (e.g. Mac OS X >= 10.4).
+       * builds/unix/detect.mk: Ditto.
+
+2011-11-30  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [apinames] Fix the overflow of signed integer hash.
+
+       * src/tools/apinames.c (names_add): Change the type of `h' from
+       int to unsigned int, to prevent undefined behaviour in the
+       overflow of signed integers (overflow of unsigned int is defined
+       to be wrap around).  Found by clang test suggested by Sean
+       McBride.
+
+2011-11-30  Werner Lemberg  <wl@gnu.org>
+
+       [winfonts] Remove casts.
+
+       * src/winfonts/winfnt.c (winfnt_driver_class): Remove all casts and
+       update affected functions.
+       (FNT_Size_Select): Fix number of arguments.
+
+2011-11-30  Werner Lemberg  <wl@gnu.org>
+
+       [type42] Remove casts.
+
+       * src/type42/t42driver.c (t42_driver_class): Remove all casts and
+       update affected functions.
+
+       * src/type42/t42objs.c, src/type42/t42objs.h: Updated for t42driver
+       changes.
+
+2011-11-30  Werner Lemberg  <wl@gnu.org>
+
+       [type1] Remove casts.
+
+       * src/type1/t1driver.c (t1_driver_class): Remove all casts and
+       update affected functions.
+
+       * src/type1/t1gload.c, src/type1/t1gload.h, src/type1/t1objs.c:
+       Updated for t1driver changes.
+       src/type1/t1objs.h (T1_Driver): Remove unused typedef.
+       Updated for t1driver changes.
+
+2011-11-27  Werner Lemberg  <wl@gnu.org>
+
+       [bdf] Fix Savannah bug #34896.
+
+       ENCODING now covers the whole Unicode range.
+
+       Note, however, that this change is quite expensive since it
+       increases the size of three arrays by almost 400kByte in total.  The
+       right fix is to replace the logic with something smarter.
+       Additionally, there exist very old BDFs for three-byte CCCII
+       encoding which exceeds the range of Unicode (another reason to have
+       a smarter logic).
+
+       * src/bdf/bdf.h (bdf_font_t): Increase size of `nmod' and `umod'
+       arrays.
+       * src/bdf/bdflib.c (bdf_parse_t): Increase size of `have' array.
+
+2011-11-27  Werner Lemberg  <wl@gnu.org>
+
+       [bdf] Improve tracing.
+
+       * src/bdf/bdflib.c (DBGMSG1, DBGMSG2): New macros.
+       (_bdf_parse_glyphs): Use them.
+
+2011-11-26  Werner Lemberg  <wl@gnu.org>
+
+       Improve tracing.
+
+       * src/bdf/bdfdrivr.c (BDF_Face_Done), src/pcf/pcfdrivr.c
+       (PCF_Face_Done): Remove tracing message.
+
+       * src/bdf/bdfdrivr.c (BDF_Face_Init), src/cff/cffobjs.c
+       (cff_face_init), src/cid/cidobjs.c (cid_face_init),
+       src/pfr/pfrobjs.c (pfr_face_init), src/sfnt/sfobjs.c
+       (sfnt_init_face), src/truetype/ttobjs.c (tt_face_init),
+       src/type1/t1objs.c (T1_Face_Init), src/type42/t42objs.c
+       (T42_Face_Init), src/winfonts/winfnt.c (FNT_Face_Init): Add
+       `greeting' message.
+
+       * src/sfnt/sfobjs.c (sfnt_open_font), src/type42/t42objs.c
+       (T42_Open_Face): Improve tracing.
+
+2011-11-26  Werner Lemberg  <wl@gnu.org>
+
+       [cid] Fix error code.
+
+       * src/cid/cidparse.c (cid_parser_new): Do it.
+
+2011-11-26  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Fix error code.
+
+       * src/cff/cffload.c (cff_font_load): Do it.
+
+2011-11-26  Werner Lemberg  <wl@gnu.org>
+
+       Add new error code FT_Err_Missing_Module.
+
+       Previously, FreeType misleadingly returned
+       FT_Err_Unknown_File_Format if a module was missing (or a test was
+       missing completely).
+
+       * include/freetype/fterrdef.h (FT_Err_Missing_Module): Define.
+
+       * src/cff/cffobjs.c (cff_face_init), src/cff/cffdrivr.c
+       (cff_get_glyph_name), src/cid/cidobjs.c (cid_face_init),
+       src/sfnt/sfobjs.c (sfnt_init_face), src/truetype/ttobjs.c
+       (tt_face_init), src/type1/t1objs.c (T1_Face_Init),
+       src/type42/t42objs.c (T42_Face_Init, T42_Driver_Init): Updated.
+
+       * src/type1/t1afm.c (T1_Read_Metrics), src/type/t1objs.c
+       (T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Remove now
+       redundant test for `psaux'.
+
+2011-11-25  Werner Lemberg  <wl@gnu.org>
+
+       [bdf] Add more error messages.
+
+       * src/bdf/bdflib.c (_bdf_set_default_spacing, _bdf_add_property):
+       Add line number argument.
+       Update all callers.
+       (ERRMSG5, ERRMSG6, ERRMSG7, ERRMSG8, ERRMSG9): New macros.
+       (_bdf_readstream, _bdf_set_default_spacing, _bdf_add_property,
+       _bdf_parse_glyphs, _bdf_parse_start): Add error messages.
+
+2011-11-24  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/fterrors.h: Remove dead code.
+
+2011-11-15  Werner Lemberg  <wl@gnu.org>
+
+       * docs/releases: Updated.
+
+2011-11-15  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.4.8 released.
+       =========================
+
+
+       Tag sources with `VER-2-4-8'.
+
+       * docs/CHANGES: Updated.
+
+       * docs/VERSION.DLL: Update documentation and bump version number to
+       2.4.8.
+
+       * README, Jamfile (RefDoc),
+       builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html,
+       builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html,
+       builds/win32/vc2010/freetype.vcxproj, builds/win32/vc2010/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj,
+       builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp,
+       builds/win32/visualce/freetype.vcproj,
+       builds/win32/visualce/index.html,
+       builds/wince/vc2005-ce/freetype.vcproj,
+       builds/wince/vc2005-ce/index.html,
+       builds/wince/vc2008-ce/freetype.vcproj,
+       builds/wince/vc2008-ce/index.html: s/2.4.7/2.4.8/, s/247/248/.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 8.
+
+       * builds/unix/configure.raw (version_info): Set to 14:0:8.
+
+2011-11-13  Chris Liddell  <chris.liddell@artifex.com>
+
+       Add FT_Get_PS_Font_Value() API.
+
+       This allows a Type 1 font face to be interrogated to retrieve most
+       of the dictionary keys (keys not relevant to FreeType's Type 1
+       interpreter are not available).
+
+       * include/freetype/internal/services/svpsinfo.h
+       (PS_GetFontValueFunc): New typedef.
+       (PSInfo): Add `ps_get_font_value'.
+       (FT_DEFINE_SERVICE_PSINFOREC): Updated.
+
+       * include/freetype/internal/t1types.h (T1_EncodingType): Moved to...
+       * include/freetype/t1tables.h: Here.
+       (PS_Dict_Keys): New enumeration.
+       (FT_Get_PS_Font_Value): New declaration.
+
+       * src/base/fttype1.c (FT_Get_PS_Font_Value): New function.
+
+       * src/type1/t1driver.c (t1_ps_get_font_value): This new function
+       does the real job.
+       (t1_service_ps_info): Add it.
+
+       * src/cff/cffdrivr.c (cff_service_ps_info), src/cid/cidriver.c
+       (cid_service_ps_info), src/type42/t42drivr.c (t42_service_ps_info):
+       Updated.
+
+2011-11-08  Braden Thomas  <bthomas@apple.com>
+
+       [cid] Various loading fixes.
+
+       * src/cid/cidload.c (cid_load_keyword) <default>,
+       (parse_font_matrix, parse_expansion_factor): Correctly check number
+       of dictionaries.
+       (cid_read_subrs): Protect against invalid values of `num_subrs'.
+       Assure that the elements of the `offsets' array are ascending.
+
+2011-11-05  Werner Lemberg  <wl@gnu.org>
+
+       * README: We use copyright ranges also.
+
+       According to
+
+         http://www.gnu.org/prep/maintain/html_node/Copyright-Notices.html
+
+       this should be mentioned explicitly.
+
+2011-10-30  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [raccess] Supplement for previous fix.
+
+       * src/base/ftbase.h (raccess_rule_by_darwin_vfs): Do not declare
+       it on native Mac OS X.
+       * src/base/ftrfork.c (raccess_get_rule_type_from_rule_index):
+       Hide raccess_get_rule_type_from_rule_index() on native Mac OS X
+       too.
+
+2011-10-30  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [raccess] Hide raccess_rule_by_darwin_vfs() on native Mac OS X.
+
+       * src/base/ftrfork.c (raccess_rule_by_darwin_vfs): Do not
+       compile on native Mac OS X because it is not used.
+
+2011-10-25  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Fix MD instruction for twilight zone.
+
+       * src/truetype/ttinterp.c (Ins_MD): Without this fix, the MD
+       instruction applied to original coordinates of twilight points
+       always returns zero.
+
+2011-10-18  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.4.7 released.
+       =========================
+
+
+       Tag sources with `VER-2-4-7'.
+
+       * docs/CHANGES: Updated.
+
+       * docs/VERSION.DLL: Update documentation and bump version number to
+       2.4.7.
+
+       * README, Jamfile (RefDoc),
+       builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html,
+       builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html,
+       builds/win32/vc2010/freetype.vcxproj, builds/win32/vc2010/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj,
+       builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp,
+       builds/win32/visualce/freetype.vcproj,
+       builds/win32/visualce/index.html,
+       builds/wince/vc2005-ce/freetype.vcproj,
+       builds/wince/vc2005-ce/index.html,
+       builds/wince/vc2008-ce/freetype.vcproj,
+       builds/wince/vc2008-ce/index.html: s/2.4.6/2.4.7/, s/246/247/.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 7.
+
+       * builds/unix/configure.raw (version_info): Set to 13:2:7.
+
+2011-10-15  Kal Conley  <kcconley@gmail.com>
+
+       Fix handling of transformations if no renderer is present.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Thinko.
+
+2011-10-15  Kal Conley  <kcconley@gmail.com>
+
+       Fix conditions for autohinting.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Handle
+       FT_LOAD_IGNORE_TRANSFORM.
+
+2011-10-07  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [gxvalid] Fix a bug to detect too large offset in morx table.
+
+       * src/gxvalid/gxvmorx2.c
+       (gxv_morx_subtable_type2_ligActionIndex_validate): Fix a bug
+       that too large positive offset cannot be detected.
+
+2011-10-01  Braden Thomas  <bthomas@apple.com>
+
+       Handle some border cases.
+
+       * include/freetype/config/ftstdlib.h (FT_USHORT_MAX): New macro.
+
+       * src/base/ftbitmap.c (FT_Bitmap_Convert): Protect against invalid
+       value of `target->rows'.
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Add check for
+       flex start.
+
+       * src/raster/ftrend1.c (ft_raster1_render): Check `width' and
+       `height'.
+
+       * src/truetype/ttgxvar.c (TT_Vary_Get_Glyph_Deltas): Protect against
+       invalid values in `localpoints' array.
+
+2011-10-01  Werner Lemberg  <wl@gnu.org>
+
+       [psnames] Handle zapfdingbats.
+       Problem reported by Nicolas Rougier <Nicolas.Rougier@inria.fr>.
+
+       * src/tools/glnames.py (adobe_glyph_list): Add data from AGL's
+       `zapfdingbats.txt' file.
+
+       * src/psnames/pstables.h: Regenerated.
+
+2011-09-27  Simon Bünzli  <zeniko@gmail.com>
+
+       Fix Savannah bug #34189.
+
+       * src/type1/t1load.c (T1_Open_Face): Initialize
+       `face->len_buildchar'.
+
+2011-09-26  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Dump SIDs while tracing.
+
+       * src/cff/cffobjs.c (cff_face_init): Do it.
+
+       * src/cff/cffparse.c (cff_parser_run) [FT_DEBUG_LEVEL_TRACE]
+       <cff_kind_string>: Identify as SID.
+
+2011-09-17  Werner Lemberg  <wl@gnu.org>
+
+       Remove unused FT_ALIGNMENT macro.
+
+       * builds/unix/ftconfig.in, builds/vms/ftconfig.h,
+       include/freetype/config/ftconfig.h: Do it.
+
+2011-09-17  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [smooth] Slightly optimize conic and cubic flatterners.
+
+       * src/smooth/ftgrays.c (gray_render_conic, gray_render_cubic): Move
+       out some code from the main loop to speed it up.
+
+2011-09-11  Tomas Hoger  <thoger@redhat.com>
+
+       Slightly improve LZW_CLEAR handling.
+
+       * src/lzw/ftzopen.c (ft_lzwstate_io) <FT_LZW_PHASE_CODE>:
+       Ensure that subsequent (modulo garbage byte(s)) LZW_CLEAR codes are
+       handled as clear codes.  This also re-sets old_code and old_char to
+       predictable values, which is a little better than using `random'
+       ones if the code following LZW_CLEAR is invalid.
+
+2011-09-11  Tomas Hoger  <thoger@redhat.com>
+
+       Add explicit LZW decompression stack size limit.
+
+       Stack larger than 1<<LZW_MAX_BITS is never needed if prefix table is
+       constructed correctly.  It's even less than that, see e.g.
+       libarchive code comment for a better size upper bound:
+
+         http://code.google.com/p/libarchive/source/browse/trunk/libarchive/archive_read_support_filter_compress.c?r=3635#121
+
+       This patch adds explicit stack size limit, enforced when stack is
+       realloced.
+
+       An alternative is to ensure that code < state->prefix[code - 256]
+       when traversing prefix table.  Such check is less efficient and
+       should not be required if prefix table is constructed correctly in
+       the first place.
+
+       * src/lzw/ftzopen.c (ft_lzwstate_stack_grow): Implement it.
+
+2011-09-11  Tomas Hoger  <thoger@redhat.com>
+
+       Protect against loops in the prefix table.
+
+       LZW decompressor did not sufficiently check codes read from the
+       input LZW stream.  A specially-crafted or corrupted input could
+       create a loop in the prefix table, which leads to memory usage
+       spikes, as there's no decompression stack size limit.
+
+       * src/lzw/ftzopen.c (ft_lzwstate_io) <FT_LZW_PHASE_START>: First
+       code in valid LZW stream must be 0..255.
+       <FT_LZW_PHASE_CODE>: In the special KwKwK case, code == free_ent,
+       code > free_ent is invalid.
+
+2011-09-09  Werner Lemberg  <wl@gnu.org>
+
+       Better tracing of metrics.
+
+       * src/base/ftobjs.c (FT_Request_Size, FT_Select_Size): Decorate with
+       FT_TRACE.
+
+2011-09-07  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #33816.
+
+       * src/cff/cfftypes.h (CFF_FontRecDictRec): New member
+       `has_font_matrix'.
+       * src/cff/cffparse.c (cff_parse_font_matrix): Set it.
+       Update tracing output.
+       * src/cff/cffobjs.c (cff_face_init): Use it so that the heuristics
+       can be removed.
+
+2011-08-30  Werner Lemberg  <wl@gnu.org>
+
+       Better tracing of metrics.
+
+       * src/base/ftobjs.c (FT_Select_Metrics, FT_Request_Metrics):
+       Decorate with FT_TRACE.
+
+2011-08-25  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Better tracing of the parsing process.
+
+       * src/cff/cffload.c (cff_subfont_load, cff_font_load): Decorate with
+       FT_TRACE.
+
+       * src/cff/cffparse.c (cff_parse_font_matrix, cff_parse_font_bbox,
+       cff_parse_private_dict, cff_parse_cid_ros): Updated.
+       (CFF_FIELD_NUM, CFF_FIELD_FIXED, CFF_FIELD_FIXED_1000,
+       CFF_FIELD_STRING, CFF_FIELD_BOOL, CFF_FIELD_CALLBACK, CFF_FIELD,
+       CFF_FIELD_DELTA): Add argument for ID.
+       (cff_parser_run): Decorate with FT_TRACE.
+
+       * src/cff/cffparse.h (CFF_Field_Handler) [FT_DEBUG_LEVEL_TRACE]: Add
+       `id' member.
+
+       * src/cff/cfftoken.h: Add IDs to all fields.
+
+2011-08-16  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #34022.
+
+       * README, docs/INSTALL: Remove references to UPGRADE.UNIX.
+
+2011-08-15  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #34018.
+
+       * docs/UPGRADE.UNIX: Removed.  Obsolete.
+
+2011-08-15  David Bevan  <david.bevan@pb.com>
+
+       Fix Savannah bug #33992.
+
+       * src/base/ftstroke.c (FT_Stroker_ParseOutline): Fix border case.
+
+2011-08-12  Werner Lemberg  <wl@gnu.org
+
+       [truetype] Fix degenerate case in S{P,F,DP}VTL opcodes.
+
+       * src/truetype/ttinterp.c (Ins_SxVTL): Handle p1 == p2 specially.
+       (Ins_SDPVTL): Handle v1 == v2 specially.
+
+2011-08-09  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #33975.
+
+       * src/cff/cffparse.c (cff_parse_font_matrix): Fix typo.
+
+2011-07-29  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.4.6 released.
+       =========================
+
+
+       Tag sources with `VER-2-4-6'.
+
+       * docs/CHANGES: Updated.
+
+       * docs/VERSION.DLL: Update documentation and bump version number to
+       2.4.6.
+
+       * README, Jamfile (RefDoc),
+       builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html,
+       builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html,
+       builds/win32/vc2010/freetype.vcxproj, builds/win32/vc2010/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj,
+       builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp,
+       builds/win32/visualce/freetype.vcproj,
+       builds/win32/visualce/index.html,
+       builds/wince/vc2005-ce/freetype.vcproj,
+       builds/wince/vc2005-ce/index.html,
+       builds/wince/vc2008-ce/freetype.vcproj,
+       builds/wince/vc2008-ce/index.html: s/2.4.5/2.4.6/, s/245/246/.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 6.
+
+       * builds/unix/configure.raw (version_info): Set to 13:1:7.
+
+2011-07-29  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Add some more tracing infos.
+
+       * src/cff/cffparse.c (cff_parse_font_matrix, cff_parse_font_bbox,
+       cff_parse_cid_ros): Add tracing.
+
+2011-07-22  Dirk Müller  <dmueller@suse.de>
+
+       [psaux, type1] Fix null pointer dereferences.
+
+       Found with font fuzzying.
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Check
+       `decoder->buildchar'.
+
+       * src/type1/t1load.c (t1_load_keyword): Check `blend->num_designs'.
+
+2011-07-20  Chris Morgan  <cmorgan@cybexintl.com>
+
+       Add FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT.
+
+       Useful for embedded systems which don't need file stream support.
+
+       * src/base/ftsystem.c, src/base/ftobjs.c (FT_Stream_New): Implement
+       it.
+
+2011-07-20  Elton Chung  <elton328@gmail.com>
+
+       * src/base/ftpatent.c (FT_Face_SetUnpatentedHinting): Fix typo.
+
+2011-07-16  Steven Chu  <steven.f.chu@gmail.com>
+
+       [truetype] Fix metrics on size request for scalable fonts.
+
+       * src/truetype/ttdriver.c (tt_size_request): Fix copying metrics
+       from TT_Size to FT_Size if scalable font.
+
+       See
+
+         http://lists.gnu.org/archive/html/freetype-devel/2011-07/msg00049.html
+
+       for some comparison images.
+
+2011-07-14  Matthias Drochner  <M.Drochner@fz-juelich.de>.
+
+       [psaux] Fix potential sign extension problems.
+
+       When shifting right a signed value, it is not defined by the
+       C standard whether one gets a sign extension or not.  Use a macro to
+       do an explicit cast from a signed short (assuming that this is
+       16bit) to an int.
+
+       * src/psaux/t1decode.c (Fix2Int): New macro.
+       Use it where appropriate.
+
+2011-07-14  Werner Lemberg  <wl@gnu.org>
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings)
+       <op_callothersubr>: Better handling of subroutine index 0.
+       From Matthias Drochner <M.Drochner@fz-juelich.de>.
+
+2011-07-10  Алексей Подтележников  <apodtele@gmail.com>
+
+       [psaux] Optimize previous commit.
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings)
+       <op_callothersubr>: Move error check down to avoid testing twice for
+       good cases.
+
+2011-07-08  Werner Lemberg  <wl@gnu.org>
+
+       [psaux] Add better argument check for `callothersubr'.
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings)
+       <op_callothersubr>: Reject negative arguments.
+
+2011-07-07  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] Try harder to find non-zero values for ascender and descender.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Consult `OS/2' table in case
+       the `hhea' table's values are zero.
+
+2011-07-03  Werner Lemberg  <wl@gnu.org>
+
+       Fix previous commit.
+
+       We want to unset FT_FACE_FLAG_SCALABLE only if there are bitmap
+       strikes in the font.
+
+       * src/truetype/ttobjs.c (tt_face_init): Implement it.
+
+       * docs/CHANGES: Updated.
+
+2011-07-02  Just Fill Bugs  <mozbugbox@yahoo.com.au>
+
+       Fix Savannah bug #33246.
+
+       * src/truetype/ttobjs.c (tt_check_single_notdef): New function.
+       (tt_face_init): Use it to test FT_FACE_FLAG_SCALABLE.
+
+2011-07-02  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2011-07-02  David Bevan  <david.bevan@pb.com>
+
+       [ftstroke] Major revision.
+
+       The main problems
+       -----------------
+
+         o If FT_STROKER_LINEJOIN_BEVEL was specified, unlimited miter
+           joins (not bevel joins) were generated.  Indeed, the meanings of
+           `miter' and `bevel' were incorrectly reversed (consistently) in
+           both the code and comments.
+
+         o The way bevel joins were constructed (whether specified
+           explicitly, or created as a result of exceeding the miter limit)
+           did not match what is required for stroked text in PostScript or
+           PDF.
+
+       The main fixes
+       --------------
+
+         o The behaviour of FT_STROKER_LINEJOIN_BEVEL has been corrected.
+
+         o A new line join style, FT_STROKER_LINEJOIN_MITER_FIXED, has been
+           introduced to support PostScript and PDF miter joins.
+
+         o FT_STROKER_LINEJOIN_MITER_VARIABLE has been introduced as an
+           alias for FT_STROKER_LINEJOIN_MITER.
+
+       Additionally, a variety of stroking errors have been fixed.  These
+       would cause various artifacts (including points `at infinity'),
+       especially when stroking poor quality fonts.
+
+       See
+
+         http://lists.gnu.org/archive/html/freetype-devel/2011-07/msg00001.html
+
+       for example documents.  The FreeType stroker now produces results
+       very similar to that produced by GhostScript and Distiller for these
+       fonts.
+
+       Other problems
+       --------------
+
+       The following problems have been resolved:
+
+         o Inside corners could be generated incorrectly.  Intersecting the
+           inside corner could cause a missing triangular area and other
+           effects.
+
+           The intersection point can only be used if the join is between
+           two lines and both lines are long enough.  The `optimization'
+           condition in `ft_stroker_inside' has been corrected; this
+           requires the line length to be passed into various functions and
+           stored in `FT_StrokerRec'.
+
+         o Incorrect cubic curves could be generated.  The angle
+           calculations in `FT_Stroker_CubicTo' have been corrected to
+           handle the case of the curve crossing the +/-PI direction.
+
+         o If the border radius was greater than the radius of curvature of
+           a curve, then the negative sector would end up outside (not
+           inside) the border.  This situation is now recognized and the
+           negative sector is circumnavigated in the opposite direction.
+           (If round line joins are being used, this code is disabled
+           because the line join will always cover the negative sector.)
+
+         o When a curve is split, the arcs may not join smoothly (especially
+           if the curve turns sharply back on itself).  Changes in
+           direction between adjacent arcs were not handled.  A round
+           corner is now added if the deviation from one arc to the next is
+           greater than a suitable threshold.
+
+         o The current direction wasn't retained if a the outline contained
+           a zero length lineto or a curve that was determined to be
+           `basically a point'.  This could cause a spurious join to be
+           added.
+
+         o Cubics with close control points could be mishandled.  All eight
+           cases are now distinguished correctly.
+
+       Other improvements
+       ------------------
+
+       o Borders for cubic curves could be too `flat'.
+         FT_SMALL_CUBIC_THRESHOLD has been reduced a little to prevent
+         this.
+
+       o The handling and use of movable points has been simplified a
+         little.
+
+       o Various values are now computed only if the results are actually
+         needed.
+
+       o The directions of the outer and inner borders have been swapped,
+         as recommended by Graham Asher.
+
+       * src/base/ftstroke.c: Revised.
+       * include/freetype/ftstroke.h: Updated.
+
+2011-06-30  İsmail Dönmez <ismail@namtrac.org>
+
+       * builds/toplevel.mk: We use git, not CVS, thus skip `.gitignore'.
+
+2011-06-29  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #33663.
+
+       * src/bdf/bdflib.c (_bdf_parse_glyphs): Handle negative values for
+       ENCODING correctly.
+
+       * docs/CHANGES: Document it.
+
+2011-06-24  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.4.5 released.
+       =========================
+
+
+       Tag sources with `VER-2-4-5'.
+
+       * docs/CHANGES: Updated.
+
+       * docs/VERSION.DLL: Update documentation and bump version number to
+       2.4.5
+
+       * README, Jamfile (RefDoc),
+       builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html,
+       builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html,
+       builds/win32/vc2010/freetype.vcxproj, builds/win32/vc2010/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj,
+       builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp,
+       builds/win32/visualce/freetype.vcproj,
+       builds/win32/visualce/index.html,
+       builds/wince/vc2005-ce/freetype.vcproj,
+       builds/wince/vc2005-ce/index.html,
+       builds/wince/vc2008-ce/freetype.vcproj,
+       builds/wince/vc2008-ce/index.html: s/2.4.4/2.4.5/, s/244/245/.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 5.
+
+       * builds/unix/configure.raw (version_info): Set to 13:0:7.
+
+2011-06-20  Werner Lemberg  <wl@gnu.org>
+
+       * src/autofit/aflatin.c (af_latin_metrics_scale_dim): Fix change
+       from 2011-05-04.
+
+2011-06-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [gxvalid] make the `prop' validation tracing verbose.
+
+       * src/gxvalid/gxvprop.c: Add tracing messages for errors.
+
+2011-06-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [autogen.sh] Reflect environment variable LIBTOOLIZE.
+
+2011-06-18  Werner Lemberg <wl@gnu.org>
+
+       Update license documentation.
+
+       * docs/GPL.TXT: Renamed to...
+       * docs/GPLv2.TXT: This.
+
+       * docs/LICENSE.TXT: Updated.
+
+2011-06-14  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Fix g++4.6 compiler warnings in module drivers.
+
+       The background is same with previous commit.
+
+       * src/truetype/ttgxvar.c (ft_var_readpackedpoints):
+       Init `points'.  (TT_Vary_Get_Glyph_Deltas): Init
+       `delta_xy'.  (TT_Get_MM_Var): Init `mmvar'.
+       * src/type1/t1load.c (T1_Get_MM_Var): Ditto.
+       * src/cff/cffdrivr.c (cff_ps_get_font_info): Init
+       `font_info'.
+       * src/cff/cffload.c (cff_index_get_pointers): Init `t'.
+       (cff_font_load): Init `sub'.
+       * src/cff/cffobjs.c (cff_size_init): Init `internal'.
+       (cff_face_init): Init `cff'.
+       * src/pfr/pfrload.c (pfr_extra_item_load_stem_snaps):
+       Init `snaps'.
+       * src/pcf/pcfread.c (pcf_get_properties): Init `properties'.
+       (pcf_get_bitmaps): Init `offsets'.  (pcf_get_encodings):
+       Init `tmpEncoding'.
+       * src/sfnt/ttload.c (tt_face_load_gasp): Init `gaspranges'.
+       * src/sfnt/ttsbit.c (Load_SBit_Image): Init `components'.
+       * src/cache/ftcmru.c (FTC_MruList_New): Init `node'.
+       * src/gzip/ftgzip.c (FT_Stream_OpenGzip): Init `zip' and
+       `zip_buff'.
+       * src/lzw/ftlzw.c (FT_Stream_OpenLZW): Init `zip'.
+       * src/bzip2/ftbzip2.c (FT_Stream_OpenBzip2): Init `zip'.
+
+2011-06-14  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [base] Fix g++4.6 compiler warnings in src/base/*.c.
+
+       Passing uninitialized pointer to FT_NEW() families is
+       not problematic theoretically (as far as the returned
+       pointer is checked before writing), but g++4.6 dislikes
+       it and warns by -Wuninitialized.  Initialize them by NULL.
+
+       * src/base/ftobjs.c (FT_Stream_New): Init `stream'.
+       (new_memory_stream): Ditto.
+       (FT_New_GlyphSlot): Init `slot'.
+       (FT_CMap_New): Init `cmap'.
+       (open_face_PS_from_sfnt_stream): Init `sfnt_ps'.
+       (Mac_Read_POST_Resource): Init `pfb_data'.
+       (Mac_Read_sfnt_Resource): Init `sfnt_data'.
+       * src/base/ftrfork.c (FT_Raccess_Get_DataOffsets):
+       Init `offsets_internal' and `ref'.
+       (raccess_guess_darwin_hfsplus): Init `newpath'.
+       (raccess_guess_darwin_newvfs): Ditto.
+       * src/base/ftbitmap.c (ft_bitmap_assure_buffer):
+       Init `buffer'.
+       * src/base/ftstroke.c (FT_Stroker_New): Init `stroker'.
+
+2011-06-14  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [gxvalid] Cleanup.
+
+       Some invalid, overrunning, unrecommended non-zero values
+       are cared in paranoid validation mode only.  There are
+       many lines looking like:
+
+         if ( valid->root->level >= FT_VALIDATE_PARANOID )
+           FT_INVALID_xxx;
+
+       To simplify them, GXV_SET_ERR_IF_PARANOID( err ) is
+       introduced for more paranoid validation in future.
+
+       * src/gxvalid/gxvcommn.h (IS_PARANOID_VALIDATION):
+       New macro to assure valid->root->level is more or
+       equal to FT_VALIDATE_PARANOID.  (GXV_SET_ERR_IF_PARANOID):
+       New macro to raise an error if in paranoid validation.
+       * src/gxvalid/gxvcommn.c: Use GXV_SET_ERR_IF_PARANOID().
+       * src/gxvalid/gxvfeat.c: Ditto.
+       * src/gxvalid/gxvjust.c: Ditto.
+       * src/gxvalid/gxvkern.c: Ditto.
+       * src/gxvalid/gxvmort.c: Ditto.
+       * src/gxvalid/gxvmort0.c: Ditto.
+       * src/gxvalid/gxvmort1.c: Ditto.
+       * src/gxvalid/gxvmort2.c: Ditto.
+       * src/gxvalid/gxvmorx1.c: Ditto.
+       * src/gxvalid/gxvmorx2.c: Ditto.
+
+2011-06-14  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [gxvalid] Fix gcc4.6 compiler warnings in gxvtrak.c.
+
+       * src/gxvalid/gxvtrak.c (gxv_trak_trackTable_validate):
+       Check different entries pointing same traking value.
+       (gxv_trak_validate): Remove unused variable `table_size'.
+
+2011-06-14  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [gxvalid] Fix gcc4.6 compiler warnings in gxvmorx*.c.
+
+       * src/gxvalid/gxvmorx.c (gxv_morx_subtables_validate):
+       Conditionalize unvalidated variable `subFeatureFlags'.
+       (gxv_morx_chain_validate): Conditionalize unvalidated
+       variable `defaultFlags'.
+
+       * src/gxvalid/gxmorx0.c
+       (gxv_morx_subtable_type0_entry_validate):
+       Conditionalize unvalidated variables; `markFirst',
+       `dontAdvance', `markLast', `verb'.
+
+       * src/gxvalid/gxmorx1.c
+       (gxv_morx_subtable_type1_entry_validate): Conditionalize
+       unvalidated variables; `setMark', `dontAdvance'.
+
+       * src/gxvalid/gxvmorx2.c
+       (gxv_morx_subtable_type2_ligActionOffset_validate):
+       Conditionalize unvalidated variables; `last', `store'.
+       Checking for overrunning offset is added.
+       (gxv_morx_subtable_type2_entry_validate):
+       Conditionalize unvalidated variables; `setComponent',
+       `dontAdvance', `performAction'.
+       (gxv_morx_subtable_type2_ligatureTable_validate):
+       Check if the GID for ligature does not exceed the
+       max GID in `maxp' table.
+
+       * src/gxvalid/gxvmort5.c
+       (gxv_morx_subtable_type5_InsertList_validate):
+       Conditionalize unvalidated loading of `insert_glyphID'
+       array.  (gxv_morx_subtable_type5_entry_validate):
+       Conditionalize unvalidated variables; `setMark',
+       `dontAdvance', `currentIsKashidaLike',
+       `markedIsKashidaLike', `currentInsertBefore',
+       `markedInsertBefore'.
+
+2011-06-14  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [gxvalid] Fix gcc4.6 compiler warnings in gxvmort*.c.
+
+       * src/gxvalid/gxvmort.c (gxv_mort_subtables_validate):
+       Conditionalize unvalidated variable `subFeatureFlags'.
+       (gxv_mort_chain_validate): Conditionalize unvalidated
+       variable `defaultFlags'.
+
+       * src/gxvalid/gxmort0.c
+       (gxv_mort_subtable_type0_entry_validate): Check the
+       conflict of the marks for the glyphs.
+
+       * src/gxvalid/gxmort1.c
+       (gxv_mort_subtable_type1_offset_to_subst_validate):
+       Local variables `min_gid', `max_gid' are replaced by
+       variables in the validator.
+       (gxv_mort_subtable_type1_entry_validate): Conditionalize
+       unvalidated variables; `setMark', `dontAdvance'.
+       (gxv_mort_subtable_type1_substTable_validate):
+       Validate the GID by the min/max GIDs in the validator.
+
+       * src/gxvalid/gxvmort2.c
+       (gxv_mort_subtable_type2_ligActionOffset_validate):
+       Conditionalize unvalidated variables; `last', `store'.
+       Checking for overrunning offset is added.
+       (gxv_mort_subtable_type2_entry_validate):
+       Conditionalize unvalidated variables; `setComponent',
+       `dontAdvance'.
+       (gxv_mort_subtable_type2_ligatureTable_validate):
+       Check if the GID for ligature does not exceed the
+       max GID in `maxp' table.
+
+       * src/gxvalid/gxvmort5.c
+       (gxv_mort_subtable_type5_InsertList_validate):
+       Conditionalize unvalidated loading of `insert_glyphID'
+       array.  (gxv_mort_subtable_type5_entry_validate):
+       Conditionalize unvalidated variables; `setMark',
+       `dontAdvance', `currentIsKashidaLike',
+       `markedIsKashidaLike', `currentInsertBefore',
+       `markedInsertBefore'.
+
+2011-06-14  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [gxvalid] Fix gcc4.6 compiler warnings in gxvkern.c.
+
+       * src/gxvalid/gxvkern.c
+       (gxv_kern_subtable_fmt0_pairs_validate): Conditionalize
+       unvalidated variable `kernValue'.
+       (gxv_kern_subtable_fmt1_entry_validate): Conditionalize
+       unvalidated variables; `push', `dontAdvance', `kernAction',
+       `kernValue'.
+       (gxv_kern_coverage_new_apple_validate): Conditionalize
+       trace-only variables; `kernVertical', `kernCrossStream',
+       `kernVariation'.
+       (gxv_kern_coverage_classic_apple_validate): Conditionalize
+       trace-only variables; `horizontal', `cross_stream'.
+       (gxv_kern_coverage_classic_microsoft_validate):
+       Conditionalize trace-only variables; `horizontal',
+       `minimum', `cross_stream', `override'.
+       (gxv_kern_subtable_validate): Conditionalize trace-only
+       variables; `version', `tupleIndex'.
+
+2011-06-14  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [gxvalid] Fix gcc4.6 compiler warnings in gxvjust.c.
+
+       * src/gxvalid/gxvjust.c (gxv_just_check_max_gid):
+       New function to unify the checks of too large GID.
+       (gxv_just_wdp_entry_validate): Conditionalize unvalidated
+       variables; `beforeGrowLimit', `beforeShrinkGrowLimit',
+       `afterGrowLimit', `afterShrinkGrowLimit', `growFlags',
+       `shrinkFlags'.  Additional check for non-zero values in
+       unused storage `justClass' is added.
+       (gxv_just_actSubrecord_type0_validate): Conditionalize
+       unvalidated variable `order'.  GID is checked by
+       gxv_just_check_max_gid().  Additional check for upside-down
+       relationship between `lowerLimit' and `upperLimit' is added.
+       (gxv_just_actSubrecord_type1_validate): GID is checked by
+       gxv_just_check_max_gid().
+       (gxv_just_actSubrecord_type2_validate): Conditionalize
+       unvalidated variable `substThreshhold'.  GID is checked by
+       gxv_just_check_max_gid().
+       (gxv_just_actSubrecord_type5_validate): GID is checked by
+       gxv_just_check_max_gid().
+       (gxv_just_classTable_entry_validate): Conditionalize
+       unvalidated variables; `setMark', `dontAdvance',
+       `markClass', `currentClass'.
+
+2011-06-14  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [gxvalid] Preparation to fix gcc4.6 compiler warnings.
+
+       * src/gxvalid/gxvcommn.h (GXV_LOAD_TRACE_VARS): New macro to
+       conditionalize the variable which is only used for trace messages.
+       Automatically set by FT_DEBUG_LEVEL_TRACE.
+       (GXV_LOAD_UNUSED_VARS): New macro to conditionalize the loading of
+       unvalidated variables.  Undefined by default to calm gcc4.6 warning.
+       (GXV_ValidatorRec.{min_gid,max_gid}): New variables to hold defined
+       GID ranges, for the comparison of GID ranges in different subtables.
+
+2011-06-08  Werner Lemberg  <wl@gnu.org>
+
+       [autofit] Remove unused structure member.
+
+       * src/autofit/afhints.h (AF_SegmentRec): Remove `contour'.
+       * src/autofit/aflatin.c (af_latin_hints_compute_segments),
+       src/autofit/aflatin2.c (af_latin2_hints_compute_segments): Updated.
+
+2011-05-30  Werner Lemberg  <wl@gnu.org>
+
+       Fix g++ 4.6 compilation.
+
+       * src/autofit/afhints.c (af_glyph_hints_dump_segments,
+       af_glyph_hints_dump_edges): Use cast.
+
+2011-05-30  Werner Lemberg  <wl@gnu.org>
+
+       Fix gcc 4.6 compiler warnings.
+
+       * src/autofit/afcjk.c (af_cjk_metrics_init_blues): Use casts and
+       remove unused variables.
+       * src/autofit/aflatin.c (af_latin_hints_compute_edges): Comment out
+       `up_dir'.
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic): Use `height_org'
+       and `width_org' conditionalized.
+
+2011-05-28  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [mac] Conditionalize the inclusion of `AvailabilityMacros.h'.
+
+       The native SDK on earliest Mac OS X (10.0-10.1) did not have
+       `AvailabilityMacros.h'.  To prevent the inclusion of missing
+       header file, ECANCELED (introduced in 10.2) in POSIX header
+       file <errno.h> is checked to detect the system version.
+
+       * include/freetype/config/ftconfig.h: Conditionalize the
+       inclusion of `AvailabilityMacros.h'.
+       * builds/unix/ftconfig.in: Ditto.
+       * builds/vms/ftconfig.h: Ditto.
+
+2011-05-27  Werner Lemberg  <wl@gnu.org>
+
+       [autofit] Improve tracing of hinting process.
+
+       * src/autofit/aflatin.c (af_latin_hint_edges): Add tracing message
+       `ADJUST'.
+
+2011-05-26  Werner Lemberg  <wl@gnu.org>
+
+       [autofit] Fix trace message.
+
+       * src/autofit/aflatin.c (af_latin_hint_edges): Show correct value in
+       tracing message.
+
+2011-05-24  Daniel Zimmermann  <netzimme@googlemail.com>
+
+       Reduce warnings for MS Visual Studio 2010.
+
+       * src/autofit/afhints.c (af_glyph_hints_get_num_segments,
+       af_glyph_hints_get_segment_offset) [!FT_DEBUG_AUTOFIT]: Provide
+       return value.
+       * src/cff/cffgload.c (cff_slot_load): Add cast.
+       * src/truetype/ttobjs.c (tt_check_trickyness_sfnt_ids): Use proper
+       loop variable type.
+
+2011-05-16  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Automake component `builds/unix/install-sh' is removed.
+
+       * builds/unix/install-sh: Removed.  It is not needed to
+       include repository, because autogen.sh installs it.
+       * builds/unix/.gitignore: Register install-sh.
+
+2011-05-12  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [autofit] Make trace message for CJK bluezone more verbose.
+
+2011-05-08  Just Fill Bugs  <mozbugbox@yahoo.com.au>
+            suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [autofit] Add bluezones for CJK Ideographs.
+
+       To remove extremas of vertical strokes of CJK Ideographs at
+       low resolution and make the top and bottom horizontal stems
+       aligned, bluezones for CJK Ideographs are calculated from
+       sample glyphs.  At present, vertical bluezones (bluezones
+       to align vertical stems) are disabled by default.  For detail, see
+       http://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00070.html
+       http://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00092.html
+       http://lists.gnu.org/archive/html/freetype-devel/2011-05/msg00001.html
+
+       * include/freetype/internal/fttrace.h: New trace component `afcjk'.
+       * src/autofit/afcjk.h (AF_CJK{Blue,Axis,Metric}Rec): Add CJK version
+       for AF_Latin{Blue,Axis,Metric}Rec.
+       (af_cjk_metrics_check_digits): Ditto, shared with Indic module.
+       (af_cjk_metrics_init_widths): Ditto.
+       (af_cjk_metrics_init): Take AF_CJKMetric instead of AF_LatinMetric.
+       (af_cjk_metrics_scale): Ditto (declaration).
+       (af_cjk_hints_init): Ditto (declaration).
+       (af_cjk_hints_apply): Ditto (declaration).
+       * src/autofit/afcjk.c (af_cjk_metrics_scale): Ditto (body).
+       (af_cjk_hints_init): Ditto (body).
+       (af_cjk_hints_apply): Ditto (body).
+       (af_cjk_metrics_init_widths): Duplicate af_latin_metrics_init_widths.
+       (af_cjk_metrics_check_digits): Duplicate af_latin_metrics_check_digits.
+       (af_cjk_metrics_init): Call CJK bluezone initializer.
+       (af_cjk_metrics_scale_dim): Add code to scale bluezones.
+       (af_cjk_hints_compute_blue_edges): New function, CJK version of
+       af_latin_hints_compute_blue_edges.
+       (af_cjk_metrics_init_blues): New function, CJK version of
+       af_latin_metrics_init_blues.
+       (af_cjk_hints_edges): Add code to align the edge stems to blue zones.
+
+       * src/autofit/afindic.c (af_indic_metrics_init): Take AF_CJKMetric
+       instead of AF_LatinMetric, and initialize as af_cjk_metrics_init.
+       However bluezones are not initialized.
+       (af_indic_metrics_scale): Take AF_CJKMetric instead of AF_LatinMetric.
+       (af_indic_hints_init): Ditto.
+       (af_indic_hints_apply): Ditto.
+
+       * docs/CHANGES: Note about CJK bluezone support.
+
+2011-05-06  Werner Lemberg  <wl@gnu.org>
+
+       [autofit] Remove unused struct member.
+
+       * src/autofit/aflatin.h (AF_LatinAxis): Remove `control_overshoot'.
+
+2011-05-04  Werner Lemberg  <wl@gnu.org>
+
+       * src/autofit/aflatin.c (af_latin_metrics_scale_dim): Simplify.
+
+2011-05-01  Just Fill Bugs  <mozbugbox@yahoo.com.au>
+            Werner Lemberg  <wl@gnu.org>
+
+       [autofit] Add more debugging functions.
+
+       * src/autofit/afhints.c (af_glyph_hints_get_num_segments,
+       af_glyph_hints_get_segment_offset): New functions.
+
+2011-05-01  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Add new option `--disable-mmap' to configure script.
+
+       * builds/unix/configure.raw: New option `--disable-mmap'
+       is added.  It is for the developers to simulate the systems
+       without mmap() (like 4.3BSD, minix etc) on POSIX systems.
+
+2011-04-30  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [truetype] Always recalculate the sfnt table checksum.
+
+       * src/truetype/ttobjs.c (tt_get_sfnt_checksum): Recalculate
+       the sfnt table checksum even if non-zero value is written in
+       the TrueType font header.  Some bad PDF generators write
+       wrong values.  For details see examples and benchmark tests
+       of the latency by recalculation:
+       http://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00091.html
+       http://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00096.html
+
+2011-04-30  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [truetype] Register a set of tricky fonts, NEC FA family.
+
+       * src/truetype/ttobjs.c (tt_check_trickyness_sfnt_ids):
+       Add 8 checksum sets for NEC FA family.  For the tricky fonts
+       without some tables (e.g. NEC FA fonts lack cvt table),
+       extra check is added to assure that a zero-length table in the
+       registry is not included in the font.
+
+2011-04-29  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [truetype] Fix a bug in the sfnt table checksum getter.
+
+       * src/truetype/ttobjs.c (tt_get_sfnt_checksum): Check the
+       return value of face->goto_table() correctly.
+
+2011-04-28  Werner Lemberg  <wl@gnu.org>
+
+       [autofit] Improve tracing messages.
+
+       * src/autofit/aflatin.c (af_latin_metrics_init_blues,
+       af_latin_align_linked_edge, af_latin_hint_edges): Do it.
+
+2011-04-25  Kan-Ru Chen  <kanru@kanru.info>
+
+       [truetype] Always check the checksum to identify tricky fonts.
+
+       Because some PDF generators mangle the family name badly,
+       the trickyness check by the checksum should be invoked always.
+       For sample PDF, see
+       http://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00073.html
+
+       * src/truetype/ttobjs.c (tt_check_trickyness): Even when
+       tt_check_trickyness_family() finds no trickyness,
+       tt_check_trickyness_sfnt_ids() is invoked.
+
+2011-04-22  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [autofit] Add more Indic scripts with hanging baseline.
+
+       * src/autofit/afindic.c (af_indic_uniranges): Tibetan, Limbu,
+       Sundanese, Meetei Mayak, Syloti Nagri and Sharada scripts are
+       added.
+
+2011-04-21  Behdad Esfahbod  <behdad@behdad.org>
+
+       Always ignore global advance.
+
+       This makes FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH redundant,
+       deprecated, and ignored.  The new behavior is what every major user
+       of FreeType has been requesting.  Global advance is broken in many
+       CJK fonts.  Just ignoring it by default makes most sense.
+
+       * src/truetype/ttdriver.c (tt_get_advances),
+       src/truetype/ttgload.c (TT_Get_HMetrics, TT_Get_VMetrics,
+       tt_get_metrics, compute_glyph_metrics, TT_Load_Glyph),
+       src/truetype/ttgload.h: Implement it.
+
+       * docs/CHANGES: Updated.
+
+2011-04-21  rainy6144  <rainy6144@gmail.com>
+
+       [autofit] Blur CJK stems if too many to preserve their gaps.
+
+       When there are too many stems to preserve their gaps in the
+       rasterization of CJK Ideographs at a low resolution, blur the
+       stems instead of showing clumped stems.  See
+       http://lists.gnu.org/archive/html/freetype-devel/2011-02/msg00011.html
+       http://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00046.html
+       for details.
+
+       * src/autofit/afcjk.c (af_cjk_hint_edges): Store the position of
+       the previous stem by `has_last_stem' and `last_stem_pos', and skip
+       a stem if the current and previous stem are too near to preserve
+       the gap.
+
+2011-04-18  Werner Lemberg  <wl@gnu.org>
+
+       Integrate autofitter debugging stuff.
+
+       * devel/ftoption.h, include/freetype/config/ftoption.h
+       (FT_DEBUG_AUTOFIT): New macro.
+
+       * include/freetype/internal/fttrace.h: Add trace components for
+       autofitter.
+
+       * src/autofit/aftypes.h (AF_LOG): Removed.
+       (_af_debug): Removed.
+
+       * src/autofit/*: s/AF_DEBUG/FT_DEBUG_AUTOFIT/.
+       s/AF_LOG/FT_TRACE5/.
+       Define FT_COMPONENT where necessary.
+
+2011-04-18  Werner Lemberg  <wl@gnu.org>
+
+       Synchronize config files.
+
+       * builds/unix/ftconfig.in: Copy missing assembler routines from
+       include/freetype/config/ftconfig.h.
+
+2011-04-13  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #33047.
+
+       Patch submitted by anonymous reporter.
+
+       * src/psaux/psobjs.c (ps_table_add): Use FT_PtrDist for pointer
+       difference.
+
+2011-04-11  Kan-Ru Chen  <kanru@kanru.info>
+
+       Fix reading of signed integers from files on 64bit platforms.
+
+       Previously, signed integers were converted to unsigned integers, but
+       this can fail because of sign extension.  For example, 0xa344a1eb
+       becomes 0xffffffffa344a1eb.
+
+       We now do the reverse which is always correct because the integer
+       size is the same during the cast from unsigned to signed.
+
+       * include/freetype/internal/ftstream.h, src/base/ftstream.c
+       (FT_Stream_Get*): Replace with...
+       (FT_Stream_GetU*): Functions which read unsigned integers.
+       Update all macros accordingly.
+
+       * src/gzip/ftgzip.c (ft_gzip_get_uncompressed_size): Updated.
+
+2011-04-07  Werner Lemberg  <wl@gnu.org>
+
+       Update Unicode ranges for CJK autofitter; in particular, add Hangul.
+
+       * src/autofit/afcjk.c (af_cjk_uniranges): Update to Unicode 6.0.
+
+2011-04-04  Werner Lemberg  <wl@gnu.org>
+
+       Fix formatting of autofit debug dumps.
+
+       * src/autofit/afhints.c (af_glyph_hints_dump_points,
+       af_glyph_hints_dump_segments, af_glyph_hints_dump_edges): Adjust
+       column widths.
+
+2011-03-30  Werner Lemberg  <wl@gnu.org>
+
+       * src/autofit/aftypes.h (AF_OutlineRec): Removed, unused.
+
+2011-03-24  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cfftypes.h (CFF_MAX_CID_FONTS): Increase to 256.
+       This limit is given on p. 37 of Adobe Technical Note #5014.
+
+2011-03-23  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttpload.c (tt_face_load_loca): Fix mismatch warning.
+
+2011-03-20  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfobjs.c (sfnt_open_font): Check number of TTC subfonts.
+
+2011-03-19  Werner Lemberg  <wl@gnu.org>
+
+       More C++ compilation fixes.
+
+       * src/autofit/afhints.c (af_glyph_hints_dump_points,
+       af_glyph_hints_dump_segments, af_glyph_hints_dump_edges)
+       [__cplusplus]: Protect with `extern "C"'.
+
+2011-03-18  Werner Lemberg  <wl@gnu.org>
+
+       C++ compilation fixes.
+
+       * src/autofit/aflatin.c (af_latin_hints_apply), src/autofit/afcjk.c
+       (af_cjk_hints_apply): Use cast for `dim'.
+
+2011-03-17  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       A better fix for Savannah bug #32671.
+
+       * src/smooth/ftgrays.c (gray_render_conic): Clean up code and
+       replace WHILE loop with a more natural DO-WHILE construct.
+
+2011-03-16  Werner Lemberg  <wl@gnu.org>.
+
+       * src/base/ftstroke.c (FT_StrokerRec): Remove unused `valid' field.
+       Suggested by Graham Asher.
+
+2011-03-09  Werner Lemberg  <wl@gnu.org>
+
+       Make FT_Sfnt_Table_Info return the number of SFNT tables.
+
+       * src/sfnt/sfdriver.c (sfnt_table_info): Implement it.
+       * include/freetype/tttables.h: Update documentation.
+       * docs/CHANGES: Updated.
+
+2011-03-07  Bram Tassyns  <bramt@enfocus.be>
+
+       Fix Savannah bug #27988.
+
+       * src/cff/cffobjs.c (remove_style): New function.
+       (cff_face_init): Use it to strip off the style part of the family
+       name.
+
+2011-03-07  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2011-03-07  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       Quick fix for Savannah bug #32671.
+
+       This isn't the optimal solution yet, but it restores the previous
+       rendering quality (more or less).
+
+       * src/smooth/ftgrays.c (gray_render_conic): Do more splitting.
+
+2011-03-06  Werner Lemberg  <wl@gnu.org>
+
+       Fix autohinting fallback.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Assure that we only check TTFs,
+       ignoring CFF-based OTFs.
+
+2011-02-27  Werner Lemberg  <wl@gnu.org>
+
+       Add AF_CONFIG_OPTION_USE_WARPER to control the autofit warper.
+
+       * devel/ftoption.h, include/freetype/config/ftoption.h
+       (AF_CONFIG_OPTION_USE_WARPER): New macro.
+       * src/autofit/aftypes.h (AF_USE_WARPER): Remove.
+
+       * src/autofit/*: s/AF_USE_WARPER/AF_CONFIG_OPTION_USE_WARPER/.
+
+       * src/autofit/afwarp.c [!AF_CONFIG_OPTION_USE_WARPER]: Replace dummy
+       variable assignment with a typedef.
+
+2011-02-26  Werner Lemberg  <wl@gnu.org>
+
+       [autofit] Slight simplifications.
+
+       * src/autofit/aflatin.c (af_latin_hints_link_segments): Remove
+       test which always returns false.
+       (af_latin_hints_compute_blue_edges): Remove redundant assignment.
+
+2011-02-24  Werner Lemberg  <wl@gnu.org>
+
+       * docs/PROBLEMS: Mention rendering differences on different
+       platforms.
+       Suggested and worded by Jason Owen <jason.a.owen@gmail.com>.
+
+2011-02-24  Werner Lemberg  <wl@gnu.org>
+
+       [autofit] Comment out unused code.
+
+       * src/autofit/aflatin.c, src/autofit/aflatin2.c
+       (af_latin_hints_compute_edges): Do it.
+
+2011-02-24  Werner Lemberg  <wl@gnu.org>
+
+       * src/autofit/afhints.h (AF_GlyphHints): Remove unused field.
+
+2011-02-20  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cache] Fix an off-by-one bug in `FTC_Manager_RemoveFaceID'.
+       Found by <ychen1392001@yahoo.com.cn>, see detail in
+
+         http://lists.gnu.org/archive/html/freetype/2011-01/msg00023.html
+
+       * src/cache/ftccache.c (FTC_Cache_RemoveFaceID): Check the node
+       buckets[cache->p + cache->mask] too.
+
+2011-02-19  Kevin Kofler  <kevin.kofler@chello.at>
+
+       Fall back to autohinting if a TTF/OTF doesn't contain any bytecode.
+       This is Savannah patch #7471.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Implement it.
+
+2011-02-19  John Tytgat  <John.Tytgat@esko.com>
+
+       [cff] Fix subset prefix removal.
+       This is Savannah patch #7465.
+
+       * src/cff/cffobjs.c (remove_subset_prefix): Update length after
+       subset prefix removal.
+
+2011-02-13  Bradley Grainger  <bgrainger@logos.com>
+
+       Add inline assembly version of FT_MulFix for MSVC.
+
+       * include/freetype/config/ftconfig.h: Ported the FT_MulFix_i386
+       function from GNU inline assembly syntax (see #ifdef __GNUC__ block
+       above) to MASM syntax for Microsoft Visual C++.
+
+2011-02-13  Bradley Grainger  <bgrainger@logos.com>
+
+       Add project and solution files in Visual Studio 2010 format.
+
+       * builds/win32/.gitignore: Ignore user-specific cache files.
+       * builds/win32/vc2010/: Add VS2010 project & solution files, created
+       by upgrading builds/win32/vc2008/freetype.vcproj.
+       * objs/.gitignore: Ignore Visual Studio output files.
+
+2011-02-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/autofit/afdummy.c: Include `aferrors.h'.
+       Problem reported by Chris Liddell <chris.liddell@artifex.com>.
+
+2011-02-01  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Ignore unknown operators in charstrings.
+       Patch suggested by Miles.Lau <sunliang_liu@foxitsoftware.com>.
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings): Emit tracing
+       message for unknown operators and continue instead of exiting with a
+       syntax error.
+
+2011-02-01  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] FT_LOAD_PEDANTIC now affects `prep' and `fpgm' also.
+
+       * src/truetype/ttgload.c (tt_loader_init): Handle
+       `FT_LOAD_PEDANTIC'.
+       * src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep,
+       tt_size_init_bytecode, tt_size_ready_bytecode): New argument to
+       handle pedantic mode.
+       * src/truetype/ttobjs.h: Updated.
+
+2011-01-31  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Protect jump instructions against endless loops.
+
+       * src/truetype/interp.c (DO_JROT, DO_JMPR, DO_JROF): Exit with error
+       if offset is zero.
+
+2011-01-31  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Improve handling of invalid references.
+
+       * src/truetype/interp.c: Set even more TT_Err_Invalid_Reference
+       error codes only if pedantic hinting is active.  At the same time,
+       try to provide sane values which hopefully allow useful
+       continuation.  Exception to this is CALL and LOOPCALL – due to
+       possible stack corruption it is necessary to bail out.
+
+2011-01-31  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Improve handling of stack underflow.
+
+       * src/truetype/ttinterp.c (TT_RunIns, Ins_FLIPPT, Ins_DELTAP,
+       Ins_DELTAC): Exit with error only if `pedantic_hinting' is set.
+       Otherwise, try to do something sane.
+
+2011-01-30  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttmtx.c (tt_face_load_hmtx): Fix tracing message.
+
+2011-01-30  LIU Sun-Liang  <sunliang_liu@foxitsoftware.com>
+
+       [truetype]: Fix behaviour of MIAP for invalid arguments.
+
+       * src/truetype/ttinterp.c (Ins_MIAP): Set reference points even in
+       case of error.
+
+2011-01-18  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Fix handling of MIRP instruction.
+
+       Thanks to Greg Hitchcock who explained the issue.
+
+       * src/truetype/ttinterp.c (Ins_MIRP): Replace a `>=' operator with
+       `>' since the description in the specification is incorrect.
+       This fixes, for example, glyph `two' in font `Helvetica Neue LT Com
+       65 medium' at 15ppem.
+
+2011-01-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Fix ARM assembly code in include/freetype/config/ftconfig.h.
+
+       * include/freetype/config/ftconfig.h (FT_MulFix_arm):
+       Copy the maintained code from builds/unix/ftconfig.in.
+       Old GNU binutils could not accept the reduced syntax
+       `orr %0, %2, lsl #16'.  Un-omitted syntax like RVCT,
+       `orr %0, %0, %2, lsl #16' is better.  Reported by
+       Johnson Y. Yan.  The bug report by Qt developers is
+       considered too.
+
+       http://bugreports.qt.nokia.com/browse/QTBUG-6521
+
+2011-01-15  Werner Lemberg  <wl@gnu.org>
+
+       [raster] Make bbox handling the same as with Microsoft's rasterizer.
+
+       Right before B/W rasterizing, the bbox gets simply rounded to
+       integers.  This fixes, for example, glyph `three' in font `Helvetica
+       Neue LT Com 65 Medium' at 11ppem.
+
+       Thanks to Greg Hitchcock who explained this behaviour.
+
+       * src/raster/ftrend1.c (ft_raster1_render): Implement it.
+
+2011-01-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Copy -mcpu=* & -march=* options from CFLAGS to LDFLAGS.
+
+       * builds/unix/configure.raw: Consider recent gcc-standard
+       flags to specify architecture in CFLAGS & LDFLAGS
+       harmonization.  Requested by Savannah bug #32114, to
+       support multilib feature of BuildRoot SDK correctly.
+
+2011-01-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Fix off-by-one bug in CFLAGS & LDFLAGS harmonizer.
+
+       * builds/unix/configure.raw: Some important options that
+       included in CFLAGS but not in LDFLAGS are copied to
+       LDFLAGS, but the last option in CFLAGS was not checked.
+
+2011-01-13  Werner Lemberg  <wl@gnu.org>
+
+       [raster] Add undocumented drop-out rule to the other bbox side also.
+
+       * src/raster/ftraster.c (Vertical_Sweep_Drop,
+       Horizontal_Sweep_Drop): Implement it.
+
+2011-01-13  Werner Lemberg  <wl@gnu.org>
+
+       [raster] Reduce jitter value.
+
+       This catches a rendering problem with glyph `x' from Tahoma at
+       10ppem.  It seems that the increase of the precision in the change
+       from 2009-06-11 makes a larger jitter value unnecessary.
+
+       * src/raster/ftraster.c (Set_High_Precision): Implement it.
+
+2011-01-13  Werner Lemberg  <wl@gnu.org>
+
+       [raster] Handle drop-outs at glyph borders according to Microsoft.
+
+       If a drop-out rule would switch on a pixel outside of the glyph's
+       bounding box, use the right (or top) pixel instead.  This is an
+       undocumented feature, but some fonts like `Helvetica Neue LT Com 65
+       Medium' heavily rely on it.
+
+       Thanks to Greg Hitchcock who explained this behaviour.
+
+       * src/raster/ftraster.c (Vertical_Sweep_Drop,
+       Horizontal_Sweep_Drop): Implement it.
+
+2011-01-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cache] Fix Savannah bug #31923, patch drafted by Harsha.
+
+       When a node comparator changes the cached nodes during the
+       search of a node matching with queried properties, the
+       pointers obtained before the function should be updated to
+       prevent the dereference to freed or reallocated nodes.
+       To minimize the rescan of the linked list, the update is
+       executed when the comparator notifies the change of cached
+       nodes. This change depends previous change:
+       38b272ffbbdaae276d636aec4ef84af407d16181
+
+       * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): Rescan the
+       top node if the cached nodes are changed.
+       * src/cache/ftccache.c (FTC_Cache_Lookup): Ditto.
+
+2011-01-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cache] Notice if a cache query induced the node list change.
+
+       Some node comparators (comparing the cache node contents and the
+       properties specified by the query) can flush the cache node to
+       prevent the cache inflation.  The change may invalidate the pointers
+       to the node obtained before the node comparison, so it should be
+       noticed to the caller.  The problem caused by the cache node
+       changing is reported by Harsha, see Savannah bug #31923.
+
+       * src/cache/ftccache.h (FTC_Node_CompareFunc): Add new argument
+       `FT_Bool* list_changed' to indicate the change of the cached nodes
+       to the caller.
+       (FTC_CACHE_LOOKUP_CMP): Watch the change of the cached nodes by
+       `_list_changed'.
+       (FTC_CACHE_TRYLOOP_END): Take new macro argument `_list_changed'
+       and update it when `FTC_Manager_FlushN' flushes any nodes.
+
+       * src/cache/ftccback.h (ftc_snode_compare): Updated to fit with new
+       FTC_Node_CompareFunc type.
+       (ftc_gnode_compare): Ditto.
+
+       * src/cache/ftcbasic.c: Include FT_INTERNAL_OBJECTS_H to use
+       TRUE/FALSE macros.
+       (ftc_basic_gnode_compare_faceid): New argument `FT_Bool*
+       list_changed' to indicate the change of the cache nodes (anyway, it
+       is always FALSE).
+
+       * src/cache/ftccmap.c: Include FT_INTERNAL_OBJECTS_H to use
+       TRUE/FALSE macros.
+       (ftc_cmap_node_compare): New argument `FT_Bool* list_changed' to
+       indicate the change of the cache nodes (anyway, it is always FALSE).
+       (ftc_cmap_node_remove_faceid): Ditto.
+
+       * src/cache/ftccache.c (FTC_Cache_NewNode): Pass a NULL pointer to
+       `FTC_CACHE_TRYLOOP_END', because the result is not needed.
+       (FTC_Cache_Lookup): Watch the change of the cache nodes by
+       `list_changed'.
+       (FTC_Cache_RemoveFaceID): Ditto.
+
+       * src/cache/ftcglyph.c: Include FT_INTERNAL_OBJECTS_H to use
+       TRUE/FALSE macros.
+       (ftc_gnode_compare): New argument `FT_Bool* list_changed' to
+       indicate the change of the cache nodes (anyway, it is always FALSE).
+       (FTC_GNode_Compare): New argument `FT_Bool* list_changed' to be
+       passed to `ftc_gnode_compare'.
+       * src/cache/ftcglyph.h (FTC_GNode_Compare): Ditto.
+
+       * src/cache/ftcsbits.c (ftc_snode_compare): New argument `FT_Bool*
+       list_changed' to indicate the change of the cache nodes, anyway.  It
+       is updated by `FTC_CACHE_TRYLOOP'.
+       (FTC_SNode_Compare): New argument `FT_Bool* list_changed' to be
+       passed to `ftc_snode_compare'.
+       * src/cache/ftcsbits.h (FTC_SNode_Compare): Ditto.
+
+2011-01-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cache] Fit `FTC_GNode_Compare' to `FTC_Node_CompareFunc'.
+
+       * src/cache/ftcglyph.h (FTC_GNode_Compare): Add the 3rd
+       argument `FTC_Cache  cache' to fit FTC_Node_CompareFunc
+       prototype.
+       * src/cache/ftcglyph.c (FTC_GNode_Compare): Ditto. Anyway,
+       `cache' is not used by its child `ftc_gnode_compare'.
+
+2011-01-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cache] Deduplicate the code to get the top node by a hash.
+
+       There are several duplicated code fragments getting the top node
+       from a cache by a given hash, like:
+
+           idx = hash & cache->mask;
+           if ( idx < cache->p )
+             idx = hash & ( cache->mask * 2 + 1 );
+           pnode = cache->buckets + idx;
+
+       To remove duplication, a cpp-macro to do same work
+       `FTC_NODE__TOP_FOR_HASH' is introduced.  For non-inlined
+       configuration, non-`ftc_get_top_node_for_hash' is also introduced.
+
+       * src/cache/ftccache.h (FTC_NODE__TOP_FOR_HASH): Declare
+       and implement inlined version.
+       (FTC_CACHE_LOOKUP_CMP): Use `FTC_NODE__TOP_FOR_HASH'.
+       * src/cache/ftccache.c (ftc_get_top_node_for_hash): Non-inlined
+       version.
+       (ftc_node_hash_unlink): Use `FTC_NODE__TOP_FOR_HASH'.
+       (ftc_node_hash_link): Ditto.
+       (FTC_Cache_Lookup): Ditto.
+
+2011-01-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cache] inline-specific functions are conditionalized.
+
+       * src/cache/ftcglyph.c (FTC_GNode_Compare): Conditionalized for
+       inlined configuration.  This function is a thin wrapper of
+       `ftc_gnode_compare' for inlined `FTC_CACHE_LOOKUP_CMP' (see
+       `nodecmp' argument).  Under non-inlined configuration,
+       `ftc_gnode_compare' is invoked by `FTC_Cache_Lookup', via
+       `FTC_Cache->clazz.node_compare'.
+
+       * src/cache/ftcglyph.h (FTC_GNode_Compare): Ditto.
+       * src/cache/ftcsbits.c (FTC_SNode_Compare): Ditto, for
+       `ftc_snode_compare'.
+       * src/cache/ftcsbits.h (FTC_SNode_Compare): Ditto.
+
+2011-01-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cache] Correct a type mismatch under non-inlined config.
+
+       * src/cache/ftcglyph.h (FTC_GCACHE_LOOKUP_CMP): `FTC_GCache_Lookup'
+       takes the node via a pointer `FTC_Node*', differently from cpp-macro
+       `FTC_CACHE_LOOKUP_CMP'.
+
+2011-01-06  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Update Jamfile to include Bzip2 support.
+
+       * Jamfile: Include src/bzip2 to project.
+       Comments for lzw, gzip, bzip2 are changed to clarify that
+       they are for compressed PCF fonts, not others.
+       (e.g. compressed BDF fonts are not supported yet)
+
+2011-01-05  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Update Symbian project files to include Bzip2 support.
+
+       Currently, it provides `FT_Stream_OpenBzip2' that returns
+       unimplemented error always, to prevent unresolved symbol
+       error for the applications designed for Unix systems.
+
+       * builds/symbian/bld.inf: Include ftbzip2.h.
+       * builds/symbian/freetype.mmp: Include ftbzip2.c.
+
+2011-01-05  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Update classic MacOS makefiles to include Bzip2 support.
+
+       Currently, it provides `FT_Stream_OpenBzip2' that returns
+       unimplemented error always, to prevent unresolved symbol
+       error for the applications designed for Unix systems.
+
+       * builds/mac/FreeType.m68k_cfm.make.txt: Include ftbzip2.c.o.
+       * builds/mac/FreeType.m68k_far.make.txt: Ditto.
+       * builds/mac/FreeType.ppc_carbon.make.txt: Include ftbzip2.c.x.
+       * builds/mac/FreeType.ppc_classic.make.txt: Ditto.
+
+2011-01-05  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Update Amiga makefiles to include Bzip2 support.
+
+       Currently, it provides `FT_Stream_OpenBzip2' that returns
+       unimplemented error always, to prevent unresolved symbol
+       error for the applications designed for Unix systems.
+
+       * builds/amiga/makefile: Include bzip2.ppc.o built from ftbzip2.c.
+       * builds/amiga/makefile.os4: Include bzip2.o built from ftbzip2.c.
+       * builds/amiga/smakefile: Ditto.
+
+2011-01-05  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Update pkg-config tools to reflect Bzip2 support.
+
+       * builds/unix/freetype-config.in: Include `-lbz2' to
+       --libs output, if built with Bzip2 support.
+       * builds/unix/freetype2.in: Ditto.
+
+2011-01-05  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/unix/configure.raw: Remove `SYSTEM_BZ2LIB' macro.
+
+       SYSTEM_ZLIB is used to switch the builtin zlib source
+       or system zlib source out of FreeType2.  But ftbzip2
+       module has no builtin bzip2 library and always requires
+       system bzip2 library.  Thus SYSTEM_BZ2LIB is always yes,
+       it is not used.
+
+2011-01-03  Werner Lemberg  <wl@gnu.org>
+
+       */rules.mk: Handle `*pic.c' files.
+
+2010-12-31  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cfftypes.h (CFF_MAX_CID_FONTS): Increase to 64.
+       Problem reported by Tom Bishop <wenlin@wenlin.com>.
+
+2010-12-31  Werner Lemberg  <wl@gnu.org>
+
+       Improve bzip2 support.
+
+       * include/freetype/ftmoderr.h: Add bzip2.
+
+       * docs/INSTALL.ANY, docs/CHANGES: Updated.
+
+       * src/pcf/README: Updated.
+       * include/freetype/internal/pcftypes.h: Obsolete, removed.
+
+2010-12-31  Joel Klinghed  <the_jk@yahoo.com>
+
+       Add bzip2 compression support to handle *.pcf.bz2 files.
+
+       * builds/unix/configure.raw: Test for libbz2 library.
+
+       * devel/ftoption.h, include/freetype/config/ftoption.h
+       (FT_CONFIG_OPTION_USE_BZIP2): Define.
+       * include/freetype/config/ftheader.h (FT_BZIP2_H): Define.
+
+       * include/freetype/ftbzip2.h: New file.
+
+       * src/bzip2/*: New files.
+
+       * src/pcf/pcf.h: s/gzip_/comp_/.
+       * src/pcf/pcfdrvr.c: Include FT_BZIP2_H.
+       s/gzip_/comp_/.
+       (PCF_Face_Init): Handle bzip2 compressed files.
+
+       * docs/formats.txt, modules.cfg: Updated.
+
+2010-12-25  Harsha  <mm.harsha@gmail.com>
+
+       Apply Savannah patch #7422.
+
+       If we encounter a space in a string then the sbit buffer is NULL,
+       height and width are 0s.  So the check in ftc_snode_compare will
+       always pass for spaces (comparision with 255).  Here the comments
+       above the condition are proper but the implementation is not.  When
+       we create an snode I think it is the proper way to initialize the
+       width to 255 and then put a check for being equal to 255 in snode
+       compare function.
+
+       * src/cache/ftcsbits.c (FTC_SNode_New): Initialize sbit widths with
+       value 255.
+       (ftc_snode_compare): Fix condition.
+
+2010-12-13  Werner Lemberg  <wl@gnu.org>
+
+       Fix parameter handling of `FT_Set_Renderer'.
+       Reported by Kirill Tishin <siege@bk.ru>.
+
+       * src/base/ftobjs.c (FT_Set_Renderer): Increment `parameters'.
+
+2010-12-09  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Allow `hlineto' and `vlineto' without arguments.
+
+       We simply ignore such instructions.  This is invalid, but it doesn't
+       harm; and indeed, there exist such subsetted fonts in PDFs.
+
+       Reported by Albert Astals Cid <aacid@kde.org>.
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings)
+       [cff_op_hlineto]: Ignore instruction if there aren't any arguments
+       on the stack.
+
+2010-11-28  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.4.4 released.
+       =========================
+
+
+       Tag sources with `VER-2-4-4'.
+
+       * docs/CHANGES: Updated.
+
+       * docs/VERSION.DLL: Update documentation and bump version number to
+       2.4.4
+
+       * README, Jamfile (RefDoc),
+       builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html,
+       builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj,
+       builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp,
+       builds/win32/visualce/freetype.vcproj,
+       builds/win32/visualce/index.html,
+       builds/wince/vc2005-ce/freetype.vcproj,
+       builds/wince/vc2005-ce/index.html,
+       builds/wince/vc2008-ce/freetype.vcproj,
+       builds/wince/vc2008-ce/index.html: s/2.4.3/2.4.4/, s/243/244/.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 4.
+
+       * builds/unix/configure.raw (version_info): Set to 12:2:6.
+
+2010-11-28  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [ftsmooth]: Minor code simplification.
+
+       * src/smooth/ftgrays (gray_render_cubic): Do only one comparison
+       instead of two.
+
+2010-11-26  Johnson Y. Yan  <yinsen_yan@foxitsoftware.com>
+
+       [truetype] Better multi-threading support.
+
+       * src/truetype/ttinterp.c (TT_Load_Context): Reset glyph zone
+       references.
+
+2010-11-23  John Tytgat  <John.Tytgat@esko.com>
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstring): Expand
+       start_point, check_points, add_point, add_point1, close_contour
+       macros.
+       Remove add_contour macro.
+       Return error code from t1_builder_start_point and
+       t1_builder_check_points when there was one (instead of returning 0).
+
+2010-11-22  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [truetype] Identify the tricky fonts by cvt/fpgm/prep checksums.
+       Some Latin TrueType fonts are still expected to be unhinted.
+       Fix Savannah bug #31645.
+
+       * src/truetype/ttobjs.c (tt_check_trickyness): Divided to...
+       (tt_check_trickyness_family): this checking family name, and
+       (tt_check_trickyness_sfnt_ids): this checking cvt/fpgm/prep.
+       (tt_get_sfnt_checksum): Function to retrieve the sfnt checksum
+       for specified subtable even if cleared by lazy PDF generators.
+       (tt_synth_sfnt_checksum): Function to calculate the checksum.
+
+2010-11-18  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Fix `loca' handling for inconsistent number of glyphs.
+       Reported by Johnson Y. Yan <yinsen_yan@foxitsoftware.com>.
+
+       * src/truetype/ttpload.c (tt_face_load_loca): While sanitizing,
+       handle case where `loca' is the last table in the font.
+
+2010-11-18  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] Ignore all errors while loading `OS/2' table.
+       Suggested by Johnson Y. Yan <yinsen_yan@foxitsoftware.com>.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Do it.
+
+2010-11-18  Johnson Y. Yan  <yinsen_yan@foxitsoftware.com>
+
+       [type1] Fix matrix normalization.
+
+       * src/type1/t1load.c (parse_font_matrix): Handle sign of scaling
+       factor.
+
+2010-11-18  Werner Lemberg  <wl@gnu.org>
+
+       [type1] Improve guard against malformed data.
+       Based on a patch submitted by Johnson Y. Yan
+       <yinsen_yan@foxitsoftware.com>
+
+       * src/type1/t1load.c (read_binary_data): Check `size'.
+
+2010-11-17  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] While tracing, output table checksums also.
+
+       * src/sfnt/ttload.c (tt_face_load_font_dir): Do it.
+
+2010-11-04  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [UVS] Fix `find_variant_selector_charmap', Savannah bug #31545.
+
+       Since 2010-07-04, `find_variant_selector_charmap' returns
+       the first cmap subtable always under rogue-compatible
+       configuration, it causes NULL pointer dereference and
+       make UVS-related functions crashed.
+
+       * src/base/ftobjs.c (Fix find_variant_selector_charmap):
+       Returns UVS cmap correctly.
+
+2010-11-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [ftsmooth] Improve rendering.
+
+       * src/smooth/ftsmooth.c (gray_render_conic): Since version 2.4.3,
+       cubic deviations have been estimated _after_ UPSCALE, whereas
+       conic ones have been evaluated _before_ UPSCALE, which produces
+       inferior rendering results.  Fix this.
+       Partially undo change from 2010-10-15 by using ONE_PIXEL/4; this has
+       been tested with demo images sent to the mailing list.  See
+
+         http://lists.gnu.org/archive/html/freetype-devel/2010-10/msg00055.html
+
+       and later mails in this thread.
+
+2010-10-28  Werner Lemberg  <wl@gnu.org>
+
+       [ftraster] Minor fixes.
+
+       Reported by Tom Bishop <wenlin@wenlin.com>.
+
+       * src/raster/ftraster.c (ULong): Remove unused typedef.
+       (TWorker): Remove unused variable `precision_mask'.
+
+2010-10-28  Werner Lemberg  <wl@gnu.org>
+
+       [ftraster] Fix rendering.
+
+       Problem reported by Tom Bishop <wenlin@wenlin.com>; see
+       thread starting with
+
+         http://lists.gnu.org/archive/html/freetype/2010-10/msg00049.html
+
+       * src/raster/ftraster.c (Line_Up): Replace FMulDiv with SMulDiv
+       since the involved multiplication exceeds 32 bits.
+
+2010-10-25  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Revert a change of `_idx' type in `FTC_CACHE_LOOKUP_CMP'.
+
+       * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): Revert
+       the type of `_idx' from FT_PtrDist (by previous change)
+       to original FT_UFast, to match with FT_CacheRec.
+
+2010-10-24  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cache] Change the hash types to FT_PtrDist.
+
+       On LLP64 platforms (e.g. Win64), FT_ULong (32-bit)
+       variables are inappropriate to calculate hash values
+       from the memory address (64-bit).  The hash variables
+       are extended from FT_ULong to FT_PtrDist and new
+       hashing macro functions are introduced.  The hash
+       values on 16-bit memory platforms are changed, but
+       ILP32 and LP64 are not changed.  The hash value in
+       the cache subsystem is not reverted to the memory
+       address, so using signed type FT_PtrDist is safe.
+
+       * src/cache/ftccache.h (_FTC_FACE_ID_HASH): New hash
+       function to replace `FTC_FACE_ID_HASH' for portability.
+       * src/cache/ftcmanag.h (FTC_SCALER_HASH): Replace
+       `FTC_FACE_ID_HASH' by `_FTC_FACE_ID_HASH'.
+       * src/cache/ftccmap.c (FTC_CMAP_HASH): Ditto.
+
+       * src/cache/ftccache.h (FTC_NodeRec): The type of the
+       member `hash' is changed from FT_UInt32 to FT_PtrDist.
+
+       * src/cache/ftccache.h (FTC_Cache_Lookup): The type of the
+       argument `hash' is changed from FT_UInt32 to FT_PtrDist.
+       (FTC_Cache_NewNode): Ditto.
+       * src/cache/ftccache.c (ftc_cache_add): Ditto.
+       (FTC_Cache_Lookup): Ditto.  (FTC_Cache_NewNode): Ditto.
+       * src/cache/ftcglyph.h (FTC_GCache_Lookup): Ditto.
+       * src/cache/ftcglyph.c (FTC_GCache_Lookup): Ditto.
+
+       * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): The type
+       of the internal variable `hash' is changed to FT_PtrDist
+       from FT_UInt32.  (FTC_ImageCache_LookupScaler): Ditto.
+       (FTC_SBitCache_Lookup): Ditto.
+       (FTC_SBitCache_LookupScaler): Ditto.
+       * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Ditto.
+       * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): Ditto.
+       Also the type of the internal variable `_idx' is changed to
+       FT_PtrDist from FT_UFast for better pointer calculation.
+
+2010-10-24  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cache] Hide internal macros incompatible with LLP64.
+
+       `FT_POINTER_TO_ULONG', `FTC_FACE_ID_HASH', and
+       `FTC_IMAGE_TYPE_HASH' are enclosed by
+       FT_CONFIG_OPTION_OLD_INTERNALS and hidden from
+       normal clients.
+
+       For the history of these macros, see the investigation:
+       http://lists.gnu.org/archive/html/freetype/2010-10/msg00022.html
+
+2010-10-24  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Change the type of `FT_MEM_VAL' from FT_ULong to FT_PtrDist.
+
+       On LLP64 platforms (e.g. Win64), unsigned long (32-bit)
+       cannot cover the memory address (64-bit).  `FT_MEM_VAL' is
+       used for hashing only and not dereferred, so using signed
+       type FT_PtrDist is safe.
+
+       * src/base/ftdbgmem.c (FT_MEM_VAL): Change the type of the
+       return value from FT_ULong to FT_PtrDist.
+       (ft_mem_table_resize): The type of hash is changed to
+       FT_PtrDist.  (ft_mem_table_get_nodep): Ditto.
+
+2010-10-24  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Replace "%lx" for memory address by "%p", LLP64 platforms.
+
+       On LLP64 platforms (e.g. Win64), long (32-bit) cannot cover
+       the memory address (64-bit).  Also the casts from the pointer
+       type to long int should be removed to preserve the address
+       correctly.
+
+       * src/raster/ftraster.c (New_Profile): Replace "%lx" by "%p".
+       (End_Profile) Ditto.
+       * src/truetype/ttinterp.c (Init_Context): Ditto.
+
+2010-10-15  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       Fix thinko in spline flattening.
+
+       FT_MAX_CURVE_DEVIATION is dependent on the value of ONE_PIXEL.
+
+       * src/smooth/ftgrays.c (FT_MAX_CURVE_DEVIATION): Remove it and
+       replace it everywhere with ONE_PIXEL/8.
+
+2010-10-13  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [raccess] Skip unrequired resource access rules by Darwin VFS.
+
+       When a resource fork access rule by Darwin VFS could open the
+       resource fork but no font is found in it, the rest of rules
+       by Darwin VFS are skipped.  It reduces the warnings of the
+       deprecated resource fork access method by recent Darwin kernel.
+       Fix MacPorts ticket #18859:
+               http://trac.macports.org/ticket/18859
+
+       * src/base/ftobjs.c (load_face_in_embedded_rfork):
+       When `FT_Stream_New' returns FT_Err_Cannot_Open_Stream, it
+       means that the file is possible to be `fopen'-ed but zero-sized.
+       Also there is a case that the resource fork is not zero-sized,
+       but no supported font exists in it.  If a rule by Darwin VFS
+       falls into such cases, there is no need to try other Darwin VFS
+       rules anymore.  Such cases are marked by vfs_rfork_has_no_font.
+       If it is TRUE, the Darwin VFS rules are skipped.
+
+2010-10-13  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [raccess] Grouping resource access rules based on Darwin VFS.
+
+       MacOS X/Darwin kernel supports a few tricky methods to access
+       a resource fork via ANSI C or POSIX interface.  Current resource
+       fork accessor tries all possible methods to support all kernels.
+       But if a method could open a resource fork but no font is found,
+       there is no need to try other methods older than tested method.
+       To determine whether the rule index is for Darwin VFS, a local
+       function `ftrfork.c::raccess_rule_by_darwin_vfs' is introduced.
+       To use this function in ftobjs.c etc but it should be inlined,
+       it is exposed by ftbase.h.
+
+       * src/base/ftrfork.c (FT_RFork_Rule): New enum type to identify
+       the rules to access the resource fork.
+       (raccess_guess_rec): New structure to bind the rule function and
+       rule enum type.
+       (FT_Raccess_Guess): The list of the rule functions is replaced by
+       (raccess_guess_table): This.  This is exposed to be used by other
+       intra module functions.
+       (raccess_rule_by_darwin_vfs): A function to return a boolean
+       if the rule specified by the rule index is based on Darwin VFS.
+
+2010-10-13  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Prevent to open a FT_Stream for zero-sized file on non-Unix.
+
+       builds/unix/ftsystem.c prevents to open an useless stream from
+       zero-sized file and returns FT_Err_Cannot_Open_Stream, but the
+       stream drivers for ANSI C, Amiga and VMS return useless streams.
+       For cross-platform consistency, all stream drivers should act
+       same.
+
+       * src/base/ftsystem.c (FT_Stream_Open): If the size of the opened
+       file is zero, FT_Err_Cannot_Open_Stream is returned.
+       * builds/amiga/src/base/ftsystem.c (FT_Stream_Open): Ditto.
+       * src/vms/ftsystem.c (FT_Stream_Open): Ditto.
+
+2010-10-12  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #31310.
+
+       * src/truetype/ttgxvar.c (ft_var_readpackedpoints): Protect against
+       invalid `runcnt' values.
+
+2010-10-08  Chris Liddell  <chris.liddell@artifex.com>
+
+       Fix Savannah bug #31275.
+
+       * src/sfnt/ttpost.c: Include FT_INTERNAL_DEBUG_H.
+
+2010-10-06  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Improve error handling of `SHZ' bytecode instruction.
+       Problem reported by Chris Evans <scarybeasts@gmail.com>.
+
+       * src/truetype/ttinterp.c (Ins_SHZ): Check `last_point'.
+
+2010-10-05  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #31253.
+       Patch submitted by an anonymous reporter.
+
+       * configure: Use `awk' instead of `sed' to manipulate output of `ls
+       -id'.
+
+2010-10-03  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.4.3 released.
+       =========================
+
+
+       Tag sources with `VER-2-4-3'.
+
+       * docs/CHANGES: Updated.
+
+       * docs/VERSION.DLL: Update documentation and bump version number to
+       2.4.3
+
+       * README, Jamfile (RefDoc),
+       builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html,
+       builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj,
+       builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp,
+       builds/win32/visualce/freetype.vcproj,
+       builds/win32/visualce/index.html,
+       builds/wince/vc2005-ce/freetype.vcproj,
+       builds/wince/vc2005-ce/index.html,
+       builds/wince/vc2008-ce/freetype.vcproj,
+       builds/wince/vc2008-ce/index.html: s/2.4.2/2.4.3/, s/242/243/.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 3.
+
+       * builds/unix/configure.raw (version_info): Set to 12:1:6.
+
+2010-10-03  Werner Lemberg  <wl@gnu.org>
+
+       Avoid `configure' issues with symbolic links.
+       Based on a patch from Alexander Stohr <Alexander.Stohr@gmx.de>.
+
+       * configure: Compare directories using `ls -id'.
+       Check existence of `reference' subdirectory before creating it.
+
+2010-10-02  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #31088 (sort of).
+
+       * src/sfnt/ttload.c (tt_face_load_maxp): Always allocate at least 64
+       function entries.
+
+2010-10-02  Werner Lemberg  <wl@gnu.org>
+
+       [smooth] Fix splitting of cubics for negative values.
+
+       Reported by Róbert Márki <gsmiko@gmail.com>; see
+       http://lists.gnu.org/archive/html/freetype/2010-09/msg00019.html.
+
+       * src/smooth/ftgrays.c (gray_render_cubic): Fix thinko.
+
+2010-10-01  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Fix Savannah bug #31040.
+
+       * src/truetype/ttinterp.c (free_buffer_in_size): Remove.
+       (TT_RunIns): Updated.
+
+2010-09-20  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [sfnt] Make error message filling NULL names less verbose.
+
+       * src/sfnt/ttpost.c (load_format_20): Showing 1 summary message
+       when we fill `post' names by NULL, instead of per-entry message.
+
+2010-09-20  Graham Asher  <graham.asher@btinternet.com>
+           David Bevan  <david.bevan@pb.com>
+
+       [smooth] Fix and improve spline flattening.
+
+       This fixes the flattening of cubic, S-shaped curves and speeds up
+       the handling of both the conic and cubic arcs.
+
+       See the discussions on the freetype-devel mailing list in late
+       August and September 2010 for details.
+
+       * src/smooth/ftgrays.c (FT_MAX_CURVE_DEVIATION): New macro.
+       (TWorker): Remove `conic_level' and `cubic_level' elements.
+       (gray_render_conic): Simplify algorithm.
+       (gray_render_cubic): New algorithm; details are given in the code
+       comments.
+       (gray_convert_glyph): Remove heuristics.
+
+2010-09-19  Werner Lemberg  <wl@gnu.org>
+
+       Minor fixes.
+
+       * src/cff/cffload.c (cff_charset_compute_cids): `charset->sids[i]'
+       is `FT_UShort'.
+       (cff_index_access_element): Don't use additions in comparison.
+       * src/sfnt/ttpost.c (load_format_20): Make `post_limit' of type
+       `FT_Long'.
+       Don't use additions in comparison.
+       Improve tracing messages.
+       (load_format_25, load_post_names): Make `post_limit' of type
+       `FT_Long'.
+
+2010-09-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cff] Truncate the element length at the end of the stream.
+       See Savannah bug #30975.
+
+       * src/cff/cffload.c (cff_index_access_element): `off2', the offset
+       to the next element is truncated at the end of the stream to prevent
+       invalid I/O.  As `off1', the offset to the requested element has
+       been checked by `FT_STREAM_SEEK', `off2' should be checked
+       similarly.
+
+2010-09-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cff] Ignore CID > 0xFFFFU.
+       See Savannah bug #30975.
+
+       * src/cff/cffload.c (cff_charset_compute_cids): Ignore CID if
+       greater than 0xFFFFU.  CFF font spec does not mention maximum CID in
+       the font, but PostScript and PDF spec define that maximum CID is
+       0xFFFFU.
+
+2010-09-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cff] Make trace message in` cff_charset_load' verbose.
+       See Savannah bug #30975.
+
+       * src/cff/cffload.c (cff_charset_load): Report the original `nleft'
+       and truncated `nleft'.
+
+2010-09-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cff] Correct `max_cid' from CID array length to max CID.
+       See Savannah bug #30975.
+
+       * src/cff/cffload.c (cff_charset_compute_cids): Don't increment
+       max_cid after detecting max CID.  The array CFF_Charset->cids is
+       allocated by max_cid + 1.
+       (cff_charset_cid_to_gindex): Permit CID is less than or equal to
+       CFF_Charset->max_cid.
+       * src/cff/cffobjs.c (cff_face_init): FT_Face->num_glyphs is
+       calculated as CFF_Charset->max_cid + 1.
+
+2010-09-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [truetype] Sanitize the broken offsets in `loca'.
+       See Savannah bug #31040.
+
+       * src/truetype/ttpload.c (tt_face_get_location): If `pos1', the
+       offset to the requested entry in `glyf' exceeds the end of the
+       table, return offset=0, length=0.  If `pos2', the offset to the next
+       entry in `glyf' exceeds the end of the table, truncate the entry
+       length at the end of `glyf' table.
+
+2010-09-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [sfnt] Prevent overrunning in `post' table parser.
+       See Savannah bug #31040.
+
+       * src/sfnt/ttpost.c (load_post_names): Get the length of `post'
+       table and pass the limit of `post' table to `load_format_20' and
+       `load_format_25'.
+       (load_format_20): Stop the parsing when we reached at the limit of
+       `post' table.  If more glyph names are required, they are filled by
+       NULL names.
+
+2010-09-17  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [truetype] Don't duplicate size->twilight structure to be freed.
+       See Savannah bug #31040 for detail.
+
+       * src/truetype/ttinterp.c (free_buffer_in_size): Don't duplicate
+       FT_GlyphZoneRec size->twilight to be freed.  If duplicated,
+       `FT_FREE' erases the duplicated pointers only and leave original
+       pointers.  They can cause the double-free crash when the burst
+       errors occur in TrueType interpreter and `free_buffer_in_size' is
+       invoked repeatedly.
+
+2010-09-15  Werner Lemberg  <wl@gnu.org>
+
+       Make bytecode debugging with FontForge work again.
+
+       * src/truetype/ttinterp.c (TT_RunIns): Don't call
+       `free_buffer_in_size' in case of error if a debugger is active.
+
+2010-09-14  Werner Lemberg  <wl@gnu.org>
+
+       Improve tracing messages.
+
+       * src/truetype/ttinterp.c (TT_RunIns): Improve wording of tracing
+       message.
+       * src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep): Add
+       tracing message.
+       * src/truetype/ttgload.c (tt_loader_init): Add tracing message.
+       * src/cache/ftcsbits.c (ftc_snode_load): Emit tracing message if
+       glyph doesn't fit into a small bitmap container.
+
+2010-09-13  Werner Lemberg  <wl@gnu.org>
+
+       Fix minor issues reported by <muktha.narayan@wipro.com>.
+
+       * src/autofit/aflatin.c (af_latin_compute_stem_width): Remove
+       redundant conditional check.
+       * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Ditto.
+       * src/cff/cffload.c (cff_encoding_load): Remove conditional check
+       which always evaluates to `true'.
+       * src/pshinter/pshalgo.c (ps_glyph_interpolate_strong_points):
+       Ditto.
+       * src/truetype/ttinterp.c (Ins_IUP): Ditto.
+       * src/cid/cidgload.c (cid_slot_load_glyph): Don't check for NULL if
+       value is already dereferenced.
+       * src/winfonts/winfnt.c (FNT_Load_Glyph): Fix check of `face'.
+
+2010-08-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Ignore the environmental setting of LIBTOOL.
+       Patch is suggested by Adrian Bunk, to prevent unexpected
+       reflection of environmental LIBTOOL.  See:
+       http://savannah.nongnu.org/patch/?7290
+
+       * builds/unix/unix-cc.in: LIBTOOL is unconditionally set to
+       $(FT_LIBTOOL_DIR)/libtool.  FT_LIBTOOL_DIR is set to $(BUILD_DIR)
+       by default.
+       * configure: When configured for the building out of source tee,
+       FT_LIBTOOL_DIR is set to $(OBJ_DIR).
+
+2010-08-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [truetype] Decrease the trace level catching the interpreter error.
+
+       * src/truetype/ttinterp.c (TT_RunIns): Decrease the trace level
+       showing the error when the interpreter returns with an error,
+       from` FT_TRACE7' to `FT_TRACE1'.
+
+2010-08-30  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [truetype] Prevent bytecode reuse after the interpretation error.
+
+       * src/truetype/ttinterp.c (free_buffer_in_size): New function to
+       free the buffer allocated during the interpretation of this glyph.
+       (TT_RunIns): Unset FT_Face->size->{cvt_ready,bytecode_ready} if
+       an error occurs in the bytecode interpretation.  The interpretation
+       of invalid bytecode may break the function definitions and referring
+       them in later interpretation is danger.  By unsetting these flags,
+       `fpgm' and `prep' tables are executed again in next interpretation.
+
+       This fixes Savannah bug #30798, reported by Robert Święcki.
+
+2010-08-29  Werner Lemberg  <wl@gnu.org>
+
+       [ftraster] Pacify compiler.
+
+       * src/raster/ftraster.c (ft_black_new) [_STANDALONE_]: `memory' is
+       not used.
+
+2010-08-29  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Allow SIDs >= 65000.
+
+       * src/cff/cffload.c (cff_charset_load): Fix change from 2009-03-20:
+       The threshold for SIDs is not applicable here.  I misinterpreted the
+       `SID values 65000 and above are available for implementation use'
+       sentence in the CFF specification.
+
+       Problem reported by Ivan Ninčić <inincic@pdftron.com>.
+
+2010-08-28  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Force hinting when the font lacks its familyname.
+
+       In Type42 or Type11 font embedded in PostScript & PDF, TrueType sfnt
+       stream may lack `name' table because they are not required.  Hinting
+       for nameless fonts is safer for PDFs including embedded Chinese
+       fonts.  Written by David Bevan, see:
+
+       http://lists.gnu.org/archive/html/freetype-devel/2010-08/msg00021.html
+       http://lists.freedesktop.org/archives/poppler/2010-August/006310.html
+
+       * src/truetype/ttobjs.c (tt_check_trickyness): If a NULL pointer by
+       nameless font is given, TRUE is returned to enable hinting.
+
+2010-08-28  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Register yet another tricky TrueType font.
+
+       * src/truetype/ttobjs.c (tt_check_trickyness): Add `HuaTianKaiTi?',
+       a Kaishu typeface paired with `HuaTianSongTi?' by Huatian
+       Information Industry.
+
+2010-08-17  Teijo Kinnunen <Teijo.Kinnunen@nuance.com>
+
+       Fix Savannah bug #30788.
+
+       * src/cache/ftccache.c (FTC_Cache_Clear): Check `cache->buckets' for
+       NULL too.
+
+2010-08-10  Werner Lemberg  <wl@gnu.org>
+
+       Try to fix Savannah bug #30717 (and probably #30719 too).
+
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic): Add another
+       overflow test for `width' and `height'.
+
+2010-08-06  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.4.2 released.
+       =========================
+
+
+       Tag sources with `VER-2-4-2'.
+
+       * docs/CHANGES: Updated.
+
+       * docs/VERSION.DLL: Update documentation and bump version number to
+       2.4.2
+
+       * README, Jamfile (RefDoc),
+       builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html,
+       builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj,
+       builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp,
+       builds/win32/visualce/freetype.vcproj,
+       builds/win32/visualce/index.html,
+       builds/wince/vc2005-ce/freetype.vcproj,
+       builds/wince/vc2005-ce/index.html,
+       builds/wince/vc2008-ce/freetype.vcproj,
+       builds/wince/vc2008-ce/index.html: s/2.4.1/2.4.2/, s/241/242/.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 2.
+
+       * builds/unix/configure.raw (version_info): Set to 12:0:6.
+
+2010-08-06  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Fix Savannah bug #30648.
+
+       * src/base/ftobjs.c (FT_Done_Library): Specify the order of font
+       drivers during the face closing process.  Type42 faces should be
+       closed before TrueType faces, because a Type42 face refers to
+       another internal TrueType face which is created from sfnt[] array on
+       the memory.
+
+2010-08-06  Yuriy Kaminskiy  <yumkam@mail.ru>
+
+       [raster] Fix valgrind warning.
+
+       * src/raster/ftraster.c (Decompose_Curve) <default>: Access point[0]
+       only if we don't hit `limit'.
+
+2010-08-06  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Fix Savannah bug #30658.
+
+       * src/base/ftobjs.c (Mac_Read_POST_Resource): Check that the total
+       length of collected POST segments does not overrun the allocated
+       buffer.
+
+2010-08-06  Yuriy Kaminskiy  <yumkam@mail.ru>
+
+       Fix conditional usage of FT_MulFix_i386.
+       With -ansi flag, gcc does not define `i386', only `__i386__'.
+
+       * include/freetype/config/ftconfig.h, builds/unix/ftconfig.in:
+       s/i386/__i386__/.
+
+2010-08-05  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30657.
+
+       * src/truetype/ttinterp.c (BOUNDSL): New macro.
+       Change `BOUNDS' to `BOUNDSL' where appropriate.
+
+       * src/truetype/ttinterp.h (TT_ExecContextRec): Fix type of
+       `cvtSize'.
+
+2010-08-05  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30656.
+
+       * src/type42/t42parse.c (t42_parse_sfnts): Protect against negative
+       string_size.
+       Fix comparison.
+
+2010-08-05  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cff] Don't use any values in decoder after parsing error.
+
+       * src/cff/cffgload.c (cff_slot_load): Skip the evaluations
+       of the values in decoder, if `cff_decoder_parse_charstrings'
+       returns any error.
+
+2010-08-04  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30644.
+
+       * src/base/ftstream.c (FT_Stream_EnterFrame): Fix comparison.
+
+2010-08-04  Werner Lemberg  <wl@gnu.org>
+
+       `make devel' fails if FT_CONFIG_OPTION_OLD_INTERNALS is set.
+
+       * devel/ftoption.h: Synchronize with
+       include/freetype/config/ftoption.h.
+
+2010-08-04  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cff] Improve stack overflow test.
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings): Check stack
+       after execution of operations too.
+
+2010-07-18  Werner Lemberg  <wl@gnu.org>
+
+       Add reference counters and to FT_Library and FT_Face objects.
+
+       * include/freetype/freetype.h (FT_Reference_Face): New function.
+       * include/freetype/ftmodapi.h (FT_Rererence_Library): New function.
+
+       * include/freetype/internal/ftobjs.h (FT_Face_InternalRec,
+       FT_LibraryRec): New field `refcount'.
+
+       * src/base/ftobjs.c (FT_Open_Face, FT_New_Library): Handle
+       `refcount'.
+       (FT_Reference_Face, FT_Reference_Library): Implement new functions.
+       (FT_Done_Face, FT_Done_Library): Handle `refcount'.
+
+       * docs/CHANGES: Updated.
+
+2010-07-18  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.4.1 released.
+       =========================
+
+
+       Tag sources with `VER-2-4-1'.
+
+       * docs/CHANGES: Updated.
+
+       * docs/VERSION.DLL: Update documentation and bump version number to
+       2.4.1.
+
+       * README, Jamfile (RefDoc),
+       builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html,
+       builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj,
+       builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp,
+       builds/win32/visualce/freetype.vcproj,
+       builds/win32/visualce/index.html,
+       builds/wince/vc2005-ce/freetype.vcproj,
+       builds/wince/vc2005-ce/index.html,
+       builds/wince/vc2008-ce/freetype.vcproj,
+       builds/wince/vc2008-ce/index.html: s/2.4.0/2.4.1/, s/240/241/.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 1.
+
+       * builds/unix/configure.raw (version_info): Set to 11:1:5.
+
+2010-07-17  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Final try to fix `hintmask' and `cntrmask' limit check.
+
+       Problem reported by Tobias Wolf <towolf@gmail.com>.
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings)
+       <cff_op_hintmask>: Sigh.  I'm apparently too silly to fix this
+       correctly in less than three tries.
+
+2010-07-12  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.4.0 released.
+       =========================
+
+
+       Tag sources with `VER-2-4-0'.
+
+       * docs/CHANGES: Updated.
+
+       * docs/VERSION.DLL: Update documentation and bump version number to
+       2.4.0.
+
+       * README, Jamfile (RefDoc),
+       builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html,
+       builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj,
+       builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp,
+       builds/win32/visualce/freetype.vcproj,
+       builds/win32/visualce/index.html,
+       builds/wince/vc2005-ce/freetype.vcproj,
+       builds/wince/vc2005-ce/index.html,
+       builds/wince/vc2008-ce/freetype.vcproj,
+       builds/wince/vc2008-ce/index.html: s/2.3.12/2.4.0/, s/2312/240/.
+
+       * include/freetype/freetype.h (FREETYPE_MINOR): Set to 4.
+       (FREETYPE_PATCH): Set to 0.
+
+       * builds/unix/configure.raw (version_info): Set to 11:0:5.
+
+2010-07-12  Werner Lemberg  <wl@gnu.org>
+
+       Remove C++ warnings.
+
+       */*: Initialize pointers where necessary to make g++ happy.
+
+2010-07-12  malc  <av1474@comtv.ru>
+           Richard Henderson  <rth@redhat.com>
+
+       Fix type-punning issues with C++.
+
+       * include/freetype/internal/ftmemory.h (FT_ASSIGNP) [__cplusplus]:
+       Emulate a `typeof' operator with an inline template which uses
+       `static_cast'.
+
+2010-07-11  Werner Lemberg  <wl@gnu.org>
+
+       Fix C++ compilation issue.
+
+       * src/tools/apinames.c (names_dump) <OUTPUT_WATCOM_LBC>: Fix
+       type of `dot' variable.
+
+2010-07-10  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Fix another case reported in Savannah bug #30373.
+       Permit a face for Type1, Type42 and CFF without charmap,
+       patch by Tor Andersson.
+
+       * src/type1/t1objs.c (T1_Face_Init): Reset the error if it
+       is FT_Err_No_Unicode_Glyph_Name.
+       * src/type42/t42objs.c (T42_Face_Init): Ditto.
+       * src/cff/cffobjs.c (cff_face_init): Ditto.
+
+2010-07-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Use defined macros to set {platform,encoding}_id.
+
+       * src/bdf/bdfdrivr.c: Include ttnameid.h and use macros to
+       set charmap.{platfom,encoding}_id.
+       * src/pcf/pcfdrivr.c: Ditto.
+       * src/winfonts/winfnt.c: Ditto.
+       * src/type1/t1objs.c: Ditto.
+       * src/type42/t42objs.c: Ditto.
+       * src/cff/cffobjs.c: Ditto.
+       * src/pfr/pfrobjs.c: Ditto.
+
+2010-07-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Fix Savannah bug #30373.
+       Too serious check of errors by `FT_CMap_New' since 2010-07-04
+       is fixed. Reported by Tor Andersson.
+
+       * include/freetype/fterrdef.h
+       (PSnames_Err_No_Unicode_Glyph_Name): New error code to
+       indicate the Unicode charmap synthesis failed because
+       no Unicode glyph name is found.
+
+       * src/psnames/psmodule.c (ps_unicodes_init): Return
+       PSnames_Err_No_Unicode_Glyph_Name when no Unicode glyph name
+       is found in the font.
+       * src/cff/cffcmap.c (cff_cmap_unicode_init): Return
+       CFF_Err_No_Unicode_Glyph_Name when no SID is available.
+
+       * src/type1/t1objs.c (T1_Face_Init): Proceed if `FT_CMap_New'
+       is failed by the lack of Unicode glyph name.
+       * src/type42/t42objs.c (T42_Face_Init): Ditto.
+       * src/cff/cffobjs.c (cff_face_init): Ditto.
+
+2010-07-09  Ken Sharp  <ken.sharp@artifex.com>
+
+       Make ftraster.c compile in stand-alone mode with MSVC compiler.
+
+       * src/raster/ftmisc.h (FT_Int64) [_WIN32, _WIN64]: Fix typedef
+       since there is no `inttypes.h' for MSVC.
+
+2010-07-08  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30361.
+
+       * src/truetype/ttinterp.c (Ins_IUP): Fix bounds check.
+
+2010-07-06  Werner Lemberg  <wl@gnu.org>
+
+       Pacify compiler.
+
+       * src/cff/cffload.c (cff_index_get_pointers): Initialize
+       `new_bytes'.
+
+2010-07-05  Eugene A. Shatokhin  <spectre@ispras.ru>
+
+       Fix Savannah bug #27648.
+
+       * src/base/ftobjs.c (ft_remove_renderer, FT_Add_Module): Call
+       `raster_done' only if we have an outline glyph format.
+
+2010-07-05  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30030.
+
+       * builds/win32/*/freetype.vcproj: Add ftxf86.c.
+
+2010-07-05  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Next try to fix `hintmask' and `cntrmask' limit check.
+
+       Problem reported by malc <av1474@comtv.ru>.
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings)
+       <cff_op_hintmask>: It is possible that there is just a single byte
+       after the `hintmask' or `cntrmask', e.g., a `return' instruction.
+
+2010-07-04  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Restrict the number of the charmaps in a rogue-compatible mode.
+       Fix for Savannah bug #30059.
+
+       * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Replace `16' the
+       minimum character code passed by a legacy rogue client by...
+       * include/freetype/config/ftoption.h (FT_MAX_CHARMAP_CACHEABLE):
+       This.  It is undefined when FT_CONFIG_OPTION_OLD_INTERNALS is
+       undefined (thus the rogue client compatibility is not required).
+
+       * src/cff/cffobjs.c (cff_face_init): Abort the automatic
+       selection or synthesis of Unicode cmap subtable when the charmap
+       index exceeds FT_MAX_CHARMAP_CACHEABLE.
+       * src/sfnt/ttcmap.c (tt_face_build_cmaps): Issue error message
+       when the charmap index exceeds FT_MAX_CHARMAP_CACHEABLE.
+
+       * src/base/ftobjs.c (find_unicode_charmap): When Unicode charmap
+       is found after FT_MAX_CHARMAP_CACHEABLE, ignore it and search
+       earlier one.
+       (find_variant_selector_charmap): When UVS charmap is found after
+       FT_MAX_CHARMAP_CACHEABLE, ignore it and search earlier one.
+       (FT_Select_Charmap): When a charmap matching with requested
+       encoding but after FT_MAX_CHARMAP_CACHEABLE, ignore and search
+       earlier one.
+       (FT_Set_Charmap): When a charmap matching with requested
+       charmap but after FT_MAX_CHARMAP_CACHEABLE, ignore and search
+       earlier one.
+       (FT_Get_Charmap_Index): When a requested charmap is found
+       after FT_MAX_CHARMAP_CACHEABLE, return the inverted charmap
+       index.
+
+2010-07-04  Werner Lemberg  <wl@gnu.org>
+
+       TrueType hinting is no longer patented.
+
+       * include/freetype/config/ftoption.h, devel/ftoption.h
+       (TT_CONFIG_OPTION_BYTECODE_INTERPRETER): Define.
+       (TT_CONFIG_OPTION_UNPATENTED_HINTING): Undefine.
+
+       * docs/CHANGES, docs/INSTALL, include/freetype/freetype.h: Updated.
+       * docs/TRUETYPE, docs/PATENTS: Removed.
+
+2010-07-04  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Check error value by `FT_CMap_New'.
+
+       * src/cff/cffobjs.c (cff_face_init): Check error value by
+       `FT_CMap_New'.
+       * src/pfr/pfrobjs.c (pfr_face_init): Ditto.
+       * src/type1/t1jobjs.c (T1_Face_Init): Ditto.
+       * src/type42/t42jobjs.c (T42_Face_Init): Ditto.
+
+2010-07-03  Werner Lemberg  <wl@gnu.org>
+
+       Make ftgrays.c compile stand-alone again.
+
+       * src/smooth/ftgrays.c [_STANDALONE_]: Include `stddef.h'.
+       (FT_INT_MAX, FT_PtrDist)[_STANDALONE_]: Define.
+
+2010-07-02  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Additional fix for Savannah bug #30306.
+
+       * src/base/ftobjs.c (Mac_Read_POST_Resource): If the type of the
+       POST fragment is 0, the segment is completely ignored.  The declared
+       length of the segment is not cared at all.  According to Adobe
+       Technical Note 5040, type 0 segment is a comment only and should not
+       be loaded for the interpreter.  Reported by Robert Święcki.
+
+2010-07-01  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Protect against code range underflow.
+
+       * src/truetype/ttinterp.c (DO_JROT, DO_JMPR, DO_JROF): Don't allow
+       negative IP values.
+
+2010-07-01  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Add rudimentary tracing for bytecode instructions.
+
+       * src/truetype/ttinterp.c (opcode_name) [FT_DEBUG_LEVEL_TRACE]: New
+       array.
+       (TT_RunIns): Trace opcodes.
+
+2010-06-30  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30263.
+
+       * src/smooth/ftgrays.c (gray_render_span): Use cast to `unsigned
+       int' to avoid integer overflow.
+
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic): Use smaller
+       threshold values for `width' and `height'.  This is not directly
+       related to the bug fix but makes sense anyway.
+
+2010-07-01  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Initial fix for Savannah bug #30306.
+
+       * src/base/ftobjs.c (Mac_Read_POST_Resource): Check `rlen', the
+       length of fragment declared in the POST fragment header, and prevent
+       an underflow in length calculation.  Some fonts set the length to
+       zero in spite of the existence of a following 16bit `type'.
+       Reported by Robert Święcki.
+
+2010-07-01  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Additional fix for Savannah bug #30248 and #30249.
+
+       * src/base/ftobjs.c (Mac_Read_POST_Resource): Check the buffer size
+       during gathering PFB fragments embedded in LaserWriter PS font for
+       Macintosh.  Reported by Robert Święcki.
+
+2010-06-30  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       Minor optimizations by avoiding divisions.
+
+       * src/sfnt/ttkern.c (tt_face_load_kern, tt_face_get_kerning):
+       Replace divisions with multiplication in comparisons.
+
+2010-06-29  Werner Lemberg  <wl@gnu.org>
+
+       Fix minor tracing issues.
+
+       * src/cff/cffgload.c, src/truetype/ttgload.c: Adjust tracing levels.
+
+2010-06-27  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Really fix `hintmask' and `cntrmask' limit check.
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings)
+       <cff_op_hintmask>: Fix thinko and handle tracing also.
+
+2010-06-27  Werner Lemberg  <wl@gnu.org>
+
+       Fix valgrind warning.
+
+       * src/base/ftoutln.c (FT_Outline_Get_Orientation): Initialize
+       `result' array.
+
+2010-06-27  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Fix memory leak.
+
+       * src/cff/cffgload.c (cff_operator_seac): Free charstrings even in
+       case of errors.
+
+2010-06-27  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Protect against invalid `hintmask' and `cntrmask' operators.
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings)
+       <cff_op_hintmask>: Ensure that we don't exceed `limit' while parsing
+       the bit masks of the `hintmask' and `cntrmask' operators.
+
+2010-06-26  Werner Lemberg  <wl@gnu.org>
+
+       Fix PFR change 2010-06-24.
+
+       * src/pfr/pfrgload.c (pfr_glyph_load_simple): Really protect against
+       invalid indices.
+
+2010-06-26  Werner Lemberg  <wl@gnu.org>
+
+       Improve PFR tracing messages.
+
+       * src/pfr/pfrgload.c (pfr_glyph_load_rec): Emit tracing messages for
+       simple and compound glyph offsets.
+
+2010-06-26  Werner Lemberg  <wl@gnu.org>
+
+       Fix last PFR change.
+
+       * src/pfr/pfrobjs.c (pfr_face_init): Fix rejection logic.
+
+2010-06-26  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30262.
+
+       * src/sfnt/ttload.c (tt_face_load_maxp): Limit `maxComponentDepth'
+       arbitrarily to 100 to avoid stack exhaustion.
+
+2010-06-26  Werner Lemberg  <wl@gnu.org>
+
+       Add some memory checks (mainly for debugging).
+
+       * src/base/ftstream.c (FT_Stream_EnterFrame): Exit with error
+       if the frame size is larger than the stream size.
+
+       * src/base/ftsystem.c (ft_ansi_stream_io): Exit with error if
+       seeking a position larger than the stream size.
+
+2010-06-25  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30261.
+
+       * src/pfr/pfrobjs.c (pfr_face_init): Reject fonts which contain
+       neither outline nor bitmap glyphs.
+
+2010-06-25  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30254.
+
+       * src/cff/cffload.c (cff_index_get_pointers): Do sanity check for
+       first offset also.
+
+2010-06-25  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Initial fix for Savannah bug #30248 and #30249.
+
+       * src/base/ftobjs.c (Mac_Read_POST_Resource): Check the error during
+       reading a PFB fragment embedded in LaserWriter PS font for Macintosh.
+       Reported by Robert Święcki.
+
+2010-06-24  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30247.
+
+       * src/pcf/pcfread.c (pcf_get_metrics): Disallow (invalid) fonts with
+       zero metrics.
+
+2010-06-24  Graham Asher  <graham.asher@btinternet.com>
+
+       * src/smooth/ftgrays.c (gray_render_cubic): Fix algorithm.
+       The previous version was too aggressive, as demonstrated in
+       http://lists.gnu.org/archive/html/freetype-devel/2010-06/msg00020.html.
+
+2010-06-24  Werner Lemberg  <wl@gnu.org>
+
+       */*: Use module specific error names where appropriate.
+
+2010-06-24  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30236.
+
+       * src/sfnt/ttcmap.c (tt_face_build_cmaps): Improve check for pointer
+       to `cmap_table'.
+
+2010-06-24  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30235.
+
+       * src/pfr/pfrgload.c (pfr_glyph_load_simple): Protect against
+       invalid indices if there aren't any coordinates for indexing.
+
+2010-06-24  Werner Lemberg  <wl@gnu.org>
+
+       [bdf]: Font properties are optional.
+
+       * src/bdf/bdflib.c (_bdf_readstream): Use special error code to
+       indicate a redo operation.
+       (_bdf_parse_start): Handle `CHARS' keyword here too and pass current
+       input line to `_bdf_parse_glyph'.
+
+2010-06-23  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30220.
+
+       * include/freetype/fterrdef.h
+       (BDF_Err_Missing_Fontboundingbox_Field): New error code.
+
+       * src/bdf/bdflib.c (_bdf_parse_start): Check for missing
+       `FONTBOUNDINGBOX' field.
+       Avoid memory leak if there are multiple `FONT' lines (which is
+       invalid but doesn't hurt).
+
+2010-06-21  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30168.
+
+       * src/pfr/pfrgload.c (pfr_glyph_load_compound): Limit the number of
+       subglyphs to avoid endless recursion.
+
+2010-06-20  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30145.
+
+       * src/psaux/psobjs.c (t1_builder_add_contour): Protect against
+       `outline == NULL' which might happen in invalid fonts.
+
+2010-06-19  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30135.
+
+       * src/bdf/bdflib.c (_bdf_list_join): Don't modify value in static
+       string `empty'.
+       (_bdf_parse_glyph): Avoid memory leak in case of error.
+
+2010-06-15  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30108.
+
+       * src/autofit/afglobal.c (af_face_globals_compute_script_coverage):
+       Properly mask AF_DIGIT bit in comparison.
+
+2010-06-11  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30106.
+
+       Point numbers for FreeType's implementation of hinting masks are
+       collected before the final number of points of a glyph has been
+       determined; in particular, the code for handling the `endchar'
+       opcode can reduce the number of points.
+
+       * src/pshinter/pshalgo.c (psh_glyph_find_strong_points): Assure that
+       `end_point' is not larger than `glyph->num_points'.
+
+2010-06-11  Werner Lemberg  <wl@gnu.org>
+
+       [cff]: Improve debugging output.
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings)
+       <cff_op_hintmask>: Implement it.
+
+2010-06-10  Graham Asher  <graham.asher@btinternet.com>
+
+       ftgrays: Speed up rendering of small cubic splines.
+
+       * src/smooth/ftgrays.c (gray_render_cubic): Implement new,
+       simplified algorithm to find out whether the spline can be replaced
+       with two straight lines.  See this thread for more:
+
+         http://lists.gnu.org/archive/html/freetype-devel/2010-06/msg00000.html
+
+2010-06-09  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30082.
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings)
+       <cff_op_callothersubr>: Protect against stack underflow.
+
+2010-06-08  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30053.
+
+       * src/cff/cffparse.c (cff_parse_real): Handle border case where
+       `fraction_length' has value 10.
+
+2010-06-07  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #30052.
+       This bug has been introduced with commit 2415cbf3.
+
+       * src/base/ftobjs.c (FT_Get_First_Char, FT_Get_Next_Char): Protect
+       against endless loop in case of corrupted font header data.
+
+2010-05-26  Werner Lemberg  <wl@gnu.org>
+
+       Remove unused variable.
+       Found by Graham.
+
+       * src/autofit/afhints.c (af_glyph_hints_reload): Remove unused
+       variable `first' in first block.
+
+2010-05-22  Werner Lemberg  <wl@gnu.org>
+
+       Fix various memory problems found by linuxtesting.org.
+
+       * src/base/ftgxval.c (FT_TrueTypeGX_Free, FT_ClassicKern_Free),
+       src/base/ftotval.c (FT_OpenType_Free), src/base/ftpfr.c
+       (ft_pfr_check): Check `face'.
+
+       * src/base/ftobjs.c (FT_Get_Charmap_Index): Check `charmap' and
+       `charmap->face'.
+       (FT_Render_Glyph): Check `slot->face'.
+       (FT_Get_SubGlyph_Info): Check `glyph->subglyphs'.
+
+2010-05-22  Werner Lemberg  <wl@gnu.org>
+
+       autofit: Remove dead code.
+       Suggested by Graham.
+
+       * src/autofit/afhints.c (af_glyph_hints_compute_inflections):
+       Removed.
+       (af_glyph_hints_reload): Remove third argument.
+       Update all callers.
+
+2010-05-21  Bram Tassyns  <bramt@enfocus.be>
+
+       Fix Savannah bug #27987.
+
+       * src/cff/cffobjs.c (remove_subset_prefix): New function.
+       (cff_face_init): Use it to adjust `cffface->family_name'.
+
+2010-05-20  Werner Lemberg  <wl@gnu.org>
+
+       TrueType: Make FreeType ignore maxSizeOfInstructions in `maxp'.
+
+       Acroread does the same.
+
+       * src/truetype/ttgload.c (TT_Process_Composite_Glyph): Call
+       `Update_Max' to adjust size of instructions array if necessary and
+       add a rough safety check.
+
+       (load_truetype_glyph): Save `loader->byte_len' before recursive
+       call.
+
+       * src/truetype/ttinterp.h, src/truetype/ttinterp.c (Update_Max):
+       Declare it as FT_LOCAL.
+
+2010-05-18  Hongbo Ni  <hongbo@njstar.com>
+
+       Apply Savannah patch #7196.
+
+       * src/cff/cffgload.c (cff_slot_load): Prevent crash if CFF subfont
+       index is out of range.
+
+2010-05-11  Werner Lemberg  <wl@gnu.org>
+
+       * docs/formats.txt: Give pointer to PCF documentation.
+       Information provided by Alan Coopersmith
+       <alan.coopersmith@oracle.com>.
+
+2010-05-10  Ken Sharp  <ken.sharp@artifex.com>
+
+       Fix Savannah bug #29846.
+
+       Previously we discovered fonts which used `setcurrentpoint' to set
+       the initial point of a contour to 0,0.  This caused FreeType to
+       raise an error, because the `setcurrentpoint' operator is only
+       supposed to be used with the results from an OtherSubr subroutine.
+
+       This was fixed by simply ignoring the error and carrying on.
+
+       Now we have found a font which uses setcurrentpoint to actually
+       establish a non-zero point for a contour during the course of a
+       glyph program.  FWIW, these files may be produced by an application
+       called `Intaglio' on the Mac, when converting TrueType fonts to
+       Type 1.
+
+       The fix allows the new invalid behaviour, the old invalid behaviour
+       and real proper usage of the operator to work the same way as Adobe
+       interpreters apparently do.
+
+       (t1_decoder_parse_charstrings): Make `setcurrentpoint' use the top
+       two elements of the stack to establish unconditionally the current x
+       and y coordinates.
+
+       Make the `flex' subroutine handling (OtherSubr 0) put the current
+       x,y coordinates onto the stack, instead of two dummy uninitialised
+       values.
+
+2010-04-14  Ken Sharp  <ken.sharp@artifex.com>
+
+       Fix Savannah bug #29444.
+
+       * src/psaux/psobjs.c (t1_builder_start_point): Accept (invalid)
+       `lineto' immediately after `hsbw', in accordance with Acrobat, GS,
+       and others.
+
+2010-04-14  Michał Cichoń  <thedmd@artifexmundi.com>
+
+       Fix Savannah bug #27999.
+
+       * src/cache/ftcmanag.c (FTC_Manager_RemoveFaceID): Only remove
+       selected entry, not all.
+
+2010-04-06  Jonathan Kew  <jfkthame@gmail.com>
+
+       Add overflow check to `fvar' table.
+
+       * src/truetype/ttgxvar.c (TT_Get_MM_Var): Check axis and instance
+       count.
+
+2010-04-05  Ken Sharp  <ken.sharp@artifex.com>
+
+       Fix Savannah bug #29335.
+
+       * src/raster/ftraster.c (Line_Up): Use slow multiplication to
+       prevent overflow.  This shouldn't have any serious impact on speed,
+       however.
+
+2010-04-05  Werner Lemberg  <wl@gnu.org>
+
+       Add new function `FT_Library_SetLcdFilterWeights'.
+
+       This is based on code written by Lifter
+       <http://unixforum.org/index.php?showuser=11691>.  It fixes
+       FreeDesktop bug #27386.
+
+       * src/base/ftlcdfil.c (FT_Library_SetLcdFilterWeights): New
+       function.
+
+       * include/freetype/ftlcdfil.h: Updated.
+
+       * docs/CHANGES: Updated.
+
+2010-04-01  John Tytgat  <John.Tytgat@esko.com>
+
+       Fix Savannah bug #29404.
+
+       * src/truetype/ttgload.c: Revert change 2752bd1a (check on bit 1
+       of `head' table of TrueType fonts).
+
+2010-03-14  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Fix `multi build' for Tytgat's CFF driver improvement.
+
+       * src/base/cffload.h (cff_index_get_name): Added.
+
+2010-03-12  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Remove duplicated inclusion of `FT_OUTLINE_H' in ftobjs.c.
+
+       * src/base/ftobjs.c: Remove 2nd inclusion of `FT_OUTLINE_H'.
+
+2010-03-11  Chris Liddell  <chris.liddell@artifex.com>
+
+       Fix Savannah bug #27442.
+
+       * src/raster/ftraster.c (ft_black_reset): Fix `buffer_size'.
+
+2010-03-09  Werner Lemberg  <wl@gnu.org>
+
+       Remove unused variable.
+       Reported by Graham.
+
+       * src/cff/cffparse.c (cff_parse_real): Remove `rest'.
+
+2010-03-02  John Tytgat  <John.Tytgat@esko.com>
+
+       Improve CFF string (especially glyphname) lookup performance.
+
+       We do this by avoiding memory allocation and file I/O.  This is
+       Savannah patch #7104.
+
+       * src/cff/cfftypes.h: Include PS cmaps service and
+       FT_INTERNAL_POSTSCRIPT_HINTS_H.
+       (CFF_SubFontRec): Remove `num_local_subrs'.
+       (CFF_FontRec): Add `num_strings', `strings', and `string_pool'
+       fields.
+       Remove `string_index' and `num_global_subrs' fields.
+       Use real types instead of `void' for `pshinter' and `psnames' fields.
+
+       * src/cff/cffload.c: Don't include PS cmaps service.
+       (cff_index_get_pointers): Add `pool' parameter which allows to
+       insert an extra NUL character for each String INDEX entry.
+       (cff_index_get_name): Make it a local function.
+       (cff_index_get_string): New function.
+       (cff_subfont_load): Updated.
+       (cff_font_load): Initialize `num_strings', `strings', and
+       `string_pool' fields in the `CFF_FontRec' structure.
+       (cff_index_get_sid_string): Use `cff_index_get_string' instead of
+       `cff_index_get_name'.
+       (cff_font_done): Updated.
+
+       * src/cff/cffload.h: Don't include PS cmaps service.
+       (cff_index_get_string): Added.
+       (cff_index_get_sid_string): Updated.
+
+       * src/cff/cffobjs.c: Don't include PS cmaps service and
+       FT_INTERNAL_POSTSCRIPT_HINTS_H.
+       (cff_size_get_globals_funcs, cff_slot_init): Updated.
+       (cff_face_init): Follow `cff_index_get_name',
+       `cff_index_get_string', and `cff_index_get_sid_string' changes.
+
+       * src/cff/cffcmap.c (cff_sid_free_glyph_name): Removed.
+       (cff_sid_to_glyph_name): Use `cff_index_get_cid_string'.
+       (cff_cmap_unicode_init): Updated.
+
+       * src/cff/cffdrivr.c: Don't include PS cmap service.
+       (cff_get_glyph_name): Avoid unnecessary lookup for POSTSCRIPT_CMAPS
+       service.
+       (cff_get_glyph_name, cff_ps_get_font_info, cff_get_ros): Follow API
+       `cff_index_get_sid_string' change.
+       (cff_get_name_index): Use `cff_index_get_string' instead of
+       `cff_index_get_name'.
+
+       * src/cff/cffgload.c: Don't include FT_INTERNAL_POSTSCRIPT_HINTS_H.
+       (cff_decoder_init, cff_decoder_prepare): Updated.
+
+2010-02-27  Werner Lemberg  <wl@gnu.org>
+
+       Simplify code.
+       Suggested by Behdad.
+
+       * src/base/ftobjs.c (FT_Get_First_Char): Don't use a loop since we
+       call FT_Get_Next_Char anyway if necessary.
+
+2010-02-26  Behdad Esfahbod  <behdad@behdad.org>
+
+       Improve handling of invalid glyph indices in char->index functions.
+
+       * src/base/ftobjs.c (FT_Get_First_Char, FT_Get_Next_Char): Use a
+       loop.
+
+2010-02-18  Chris Liddell  <chris.liddell@artifex.com>
+
+       Fix Savannah bug #28905.
+
+       Initialize phantom points before calling the incremental interface
+       to update glyph metrics.
+
+       * src/truetype/ttgload.c (tt_get_metrics_incr_overrides)
+       [FT_CONFIG_OPTION_INCREMENTAL]: New function, split off from...
+       (tt_get_metrics): This.
+       Updated.
+       (load_truetype_glyph): Use tt_get_metrics_incr_overrides.
+
+----------------------------------------------------------------------------
+
+Copyright 2010-2012 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:
diff --git a/ChangeLog.20 b/ChangeLog.20
new file mode 100644 (file)
index 0000000..8fcc5e7
--- /dev/null
@@ -0,0 +1,2613 @@
+2002-02-09  Werner Lemberg  <wl@gnu.org>
+
+       * README: Fix typo.
+       * docs/CHANGES: Minor fixes.
+
+
+       * Version 2.0.8 released.
+       =========================
+
+
+2002-02-08  David Turner  <david@freetype.org>
+
+       * docs/CHANGES: Updating for 2.0.8.
+
+       * include/freetype/freetype.h: Setting `PATCH_LEVEL' to 8 and
+       removing `FT_Get_Next_Char' from the API (temporarily).
+
+       * include/freetype/freetype.h: Adding comments to FT_Get_Next_Char;
+       note that this function might temporarily be removed for the 2.0.8
+       release.
+
+2002-02-07  David Turner  <david@freetype.org>
+
+       * src/pcf/pcfread.c (pcf_load_font): Removed immature support of
+       the AVERAGE_WIDTH property.
+
+2002-02-06  David Turner  <david@freetype.org>
+
+       * src/sfnt/sfobjs.c (SFNT_Load_Face): Since many fonts embedded in
+       PDF documents do not include 'cmap', 'post' and 'name' tables, the
+       SFNT face loader has been changed to not immediately report an
+       error if these are not present.
+
+       Note that the specification _requires_ these tables, but Adobe
+       seems to ignore it completely.
+
+       * src/sfnt/ttcmap.c: Removing compiler warnings.
+
+       * src/pcf/pcfread.c (pcf_read_TOC): Use FT_UInt.
+       (pcf_parse_metric, pcf_parse_compressed_metric): Removed.  Code
+       is now in ...
+       (pcf_get_metric): Here.
+       (pcfSeekToType): Renamed to ...
+       (pcf_seek_to_table_type): This.
+       Use FT_Int.
+       (pcfHasType): Renamed to ...
+       (pcf_has_table_type): This.
+       Use FT_Int.
+       (find_property): Renamed to ...
+       (pcf_find_property): This.
+       Use FT_Int.
+       (pcf_get_bitmaps, pcf_get_encodings): Handle invalid PCF fonts
+       better (delaying format checks out of FT_Access_Frame ..
+       FT_Forget_Frame blocks to avoid leaving the stream in an incorrect
+       state when encountering an invalid PCF font).
+
+       * src/pcf/pcfdriver.c (PCF_Done_Face): Renamed to ...
+       (PCF_Face_Done): This.
+       (PCF_Init_Face): Renamed to ...
+       (PCF_Face_Init): This.
+       (PCF_Get_Char_Index): Renamed to ...
+       (PCF_Char_Get_Index): This.
+       (PCF_Get_Next_Char): Renamed to ...
+       (PCF_Char_Get_Next): This.
+       (pcf_driver_class): Updated.
+
+       * src/pcf/pcf.h (PCF_Done_Face): Removed.
+
+2002-02-06  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * src/pcf/pcfdriver.c (FT_Done_Face): Fixed small memory leak.
+
+       * src/pcf/pcfread.c (pcf_load_font): Now handles the `AVERAGE_WIDTH'
+       property to return correct character pixel (width/height) pairs for
+       embedded bitmaps.
+
+2002-02-04  Keith Packard  <keithp@keithp.com>
+
+       Adding the function `FT_Get_Next_Char', doing the obvious thing
+       w.r.t. the selected charmap.
+
+       * include/freetype/freetype.h: Add prototype.
+       * include/freetype/internal/ftdriver.h: Add `FTDriver_getNextChar'
+       typedef.
+       (FT_Driver_Class): Use it.
+       * include/freetype/internal/psnames.h: Add `PS_Next_Unicode_Func'
+       typedef.
+       (PSNames_Interface): Use it.
+       * include/freetype/internal/tttypes.h: Add `TT_CharNext_Func'
+       typedef.
+       (TT_CMapTable): Use it.
+
+       * src/base/ftobjs.c (FT_Get_Next_Char): New function, implementing
+       high-level API.
+       * src/cff/cffdrivr.c (cff_get_next_char): New function.
+       (cff_driver_class): Add it.
+       * src/cid/cidriver.c (Cid_Get_Next_Char): New function.
+       (t1cid_driver_class): Add it.
+       * src/pcf/pcfdriver.c (PCF_Get_Next_Char): New function.
+       (pcf_driver_class): Add it.
+       * src/psnames/psmodule.c (PS_Next_Unicode): New function.
+       (psnames_interface): Add it.
+       * src/sfnt/ttcmap.c (code_to_next0, code_to_next2, code_to_next4,
+       code_to_next6, code_to_next_8_12, code_to_next_10): New auxiliary
+       functions.
+       (TT_CharMap_Load): Use them.
+       * src/truetype/ttdriver.c (Get_Next_Char): New function.
+       (tt_driver_class): Add it.
+       * src/type1/t1driver.c (Get_Next_Char): New function.
+       (t1_driver_class): Add it.
+       * src/winfonts/winfnt.c (FNT_Get_Next_Char): New function.
+       (winfnt_driver_class): Add it.
+
+       * src/pcf/pcfread.c (pcf_load_font): For now, report Unicode for
+       Unicode and Latin 1 encodings.
+
+2002-02-02  Keith Packard  <keithp@keithp.com>
+
+       * builds/unix/freetype-config.in: Add missing `fi'.
+
+
+       * Version 2.0.7 released.
+       =========================
+
+
+2002-02-01  David Turner  <david@freetype.org>
+
+       * include/freetype/freetype.h: Increasing FREETYPE_PATCH to 7
+       for the new release.
+
+2002-01-31  David Turner  <david@freetype.org>
+
+       * README, README.UNX, docs/CHANGES: Updating documentation for the
+       2.0.7 release.
+
+2002-01-30  David Turner  <david@freetype.org>
+
+       * INSTALL: Moved to ...
+       * docs/INSTALL: Here to avoid conflicts with the `install' script on
+       Windows, where the filesystem doesn't preserve case.
+
+2002-01-29  David Turner  <david@freetype.org>
+
+       * configure: Fixed the script.  It previously didn't accept more
+       than one argument correctly.  For example, when typing:
+
+         ./configure --disable-shared --disable-nls
+
+       the `--disable-nls' was incorrectly sent to the `make' program.
+
+2002-01-29  Werner Lemberg  <wl@gnu.org>
+
+       * README.UNX: Fix typo.
+       * builds/unix/install.mk (uninstall): Fix library name for libtool.
+
+2002-01-28  Francesco Zappa Nardelli  <Francesco.Zappa.Nardelli@ens.fr>
+
+       * src/pcf/pcfdriver.c (PCF_Done_Face): Fix incorrect destruction of
+       the face object (face->toc.tables, face->root.family_name,
+       face->root.available_size, face->charset_encoding,
+       face->charset_registry are now freed).  Thanks to Niels Moseley.
+
+2002-01-28  Roberto Alameda  <ojancano@geekmail.de>
+
+       * src/type1/t1load.c (parse_encoding): Set `loader->num_chars'.
+
+2002-01-28  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (parse_subrs, parse_charstrings): Use copy
+       of `base' string for decrypting to not modify the original data.
+       Based on a patch by Jakub Bogusz <qboosh@pld.org.pl>.
+
+2002-01-27  Giuliano Pochini  <pochini@shiny.it>
+
+       * src/smooth/ftgrays.c (gray_render_scanline): Fix bug which caused
+       bad rendering of thin lines (less than one pixel thick).
+
+2002-01-25  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffdrivr.c (cff_get_name_index): Make last patch work
+       actually.
+
+2002-01-25  Martin Zinser  <zinser@decus.de>
+
+       * src/cache/ftccache.c (ftc_node_done, ftc_node_destroy): Fix
+       compilation warnings.
+       * src/base/descrip.mms (OBJS): Add `ftmm.obj'.
+       * src/cache/descrip.mms (ftcache.obj): Dependencies added.
+
+2002-01-25  WANG Yi  <wangyi@founder.com.cn>
+
+       * src/cff/cffdrivr.c (cff_get_name_index): Fix deallocation bug.
+
+2002-01-21  Antoine Leca  <Antoine-Freetype@Leca-Marti.org>
+
+       * docs/PATENTS: Typo fixed (thanks to Detlef `Hawkeye' Würkner) in
+       the URL for the online resource.
+
+2002-01-18  Ian Brown  <ian.brown@printsoft.de>
+
+       * builds/win32/ftdebug.c: New file.
+       * builds/win32/visualc/freetype.dsp: Updated.
+
+2002-01-18  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * builds/amiga/src/base/ftsystem.c: Updated for AmigaOS 3.9.
+       * builds/amiga/README: Updated.
+
+2002-01-18  Ian Brown  <ian.brown@printsoft.de>
+
+       * builds/win32/visualc/freetype.dsp: Updated.
+
+2002-01-13  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/freetype2.a4: The script was still buggy.
+       * builds/unix/freetype-config.in: Make it really work for any install
+       prefix.
+
+2002-01-10  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/freetype2.a4: Fix some serious bugs.
+
+2002-01-09  David Turner  <david@freetype.org>
+
+       * builds/unix/configure.ac: Build top-level Jamfile.
+
+2002-01-09  Maxim Shemanarev  <mcseemagg@yahoo.com>
+
+       * src/smooth/ftgrays.c (gray_render_line): Small optimization to
+       the smooth anti-aliased renderer that deals with vertical segments.
+       This results in a 5-7% speedup in rendering speed.
+
+2002-01-08  David Turner  <david@freetype.org>
+
+       Added some wrapper scripts to make the installation more
+       Unix-friendly.
+
+       * configure, install: New files.
+
+       * INSTALL, README.UNX: Updated installation documentation to use the
+       new 'configure' and 'install' scripts.
+
+2002-01-07  David Turner  <david@freetype.org>
+
+
+       * Version 2.0.6 released.
+       =========================
+
+
+       * docs/BUGS, docs/CHANGES: Updating documentation for 2.0.6 release.
+
+       * src/tools/docmaker.py: Fixed HTML quoting in sources.
+       (html_format): Replaced with ...
+       (html_quote): New function.
+       (html_quote0): New function.
+       (DocCode::dump_html): Small improvement.
+       (DocParagraph::dump, DocBlock::html): Use html_quote0 and html_quote.
+
+       * include/freetype/config/ftoption.h: Setting default options for
+       a release build (debugging off, bytecode interpreter off).
+
+       * src/base/ftobjs.c, src/base/ftoutln.c, src/cache/ftccmap.c,
+       src/cff/cffload.c, src/cff/cffobjs.c, src/pshinter/pshalgo2.c,
+       src/sfnt/ttload.c, src/sfnt/ttsbit.c: Removing small compiler
+       warnings (in pedantic compilation modes).
+
+2002-01-05  David Turner  <david@freetype.org>
+
+       * src/autohint/ahhint.c (ah_align_linked_edge): Modified computation
+       of auto-hinted stem widths; this avoids color fringes in
+       `ClearType-like' rendering.
+
+       * src/truetype/ttgload.c (TT_Load_Glyph_Header,
+       TT_Load_Simple_Glyph, TT_Load_Composite_Glyph, load_truetype_glyph):
+       Modified the TrueType loader to make it more paranoid; this avoids
+       nasty buffer overflows in the case of invalid glyph data (as
+       encountered in the output of some buggy font converters).
+
+2002-01-04  David Turner  <david@freetype.org>
+
+       * README.UNX: Added special README file for Unix users.
+
+       * builds/unix/ftsystem.c (FT_New_Stream): Fixed typo.
+
+       * src/base/ftobjs.c: Added #include FT_OUTLINE_H to get rid
+       of compiler warnings.
+
+       * src/base/ftoutln.c (FT_Outline_Check): Remove compiler warning.
+
+2002-01-03  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1objs.c (T1_Face_Init): Add cast to avoid compiler
+       warning.
+
+2002-01-03  Keith Packard  <keithp@keithp.com>
+
+       * builds/unix/ftsystem.c (FT_New_Stream): Added a fix to ensure that
+       all FreeType input streams are closed in child processes of a `fork'
+       on Unix systems.  This is important to avoid (potential) access
+       control issues.
+
+2002-01-03  David Turner  <david@freetype.org>
+
+       * src/type1/t1objs.c (T1_Face_Init): Fixed a bug that crashed the
+       library when dealing with certain weird fonts like `Stalingrad', in
+       `sadn.pfb' (this font has no full font name entry).
+
+       * src/base/ftoutln.c, include/freetype/ftoutln.h (FT_Outline_Check):
+       New function to check the consistency of outline data.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Use `FT_Outline_Check' to
+       ensure that loaded glyphs are valid.  This allows certain fonts like
+       `tt1095m_.ttf' to be loaded even though it appears they contain
+       really funky glyphs.
+
+       There still is a bug there, though.
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Fix error condition.
+
+2001-12-30  David Turner  <david@freetype.org>
+
+       * src/autohint/ahhint.c (ah_hinter_load): Fix advance width
+       computation of auto-hinted glyphs.  This noticeably improves the
+       spacing of letters in KDE and Gnome.
+
+2001-12-25  Antoine Leca  <Antoine-Freetype@Leca-Marti.org>
+
+       * builds/dos/detect.mk: Correcting the order for Borland compilers:
+       16-bit bcc was never selected, always overridden by 32-bit bcc32.
+
+2001-12-22  Francesco Zappa Nardelli  <Francesco.Zappa.Nardelli@ens.fr>
+
+       * src/pfc/pcfread.c (pcf_load_font): Handle property `POINT_SIZE'
+       and fix incorrect computation of `available_sizes'.
+
+2001-12-22  David Turner  <david@freetype.org>
+
+       * src/autohint/ahhint.c (ah_hinter_load): Auto-hinted glyphs had an
+       incorrect glyph advance in the case of mono-width fonts (like
+       Courier, Andale Mono, and others).
+
+2001-12-22  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * builds/amiga/*: Adaptations to latest changes.
+       Support added for MorphOS.
+
+2001-12-22  Werner Lemberg  <wl@gnu.org>
+
+       * src/pshinter/pshrec.c (FT_COMPONENT): Redefine to `trace_pshrec'.
+       (ps_mask_table_merge, ps_hints_open, ps_hints_stem,
+       ps_hints_t1stem3, ps_hints_t2mask, ps_hints_t2counter): Fix
+       FT_ERROR messages.
+       * src/pshinter/pshalgo1.c (FT_COMPONENT): Define as
+       `trace_pshalgo1'.
+       * src/pshinter/pshalgo2.c (FT_COMPONENT): Define as
+       `trace_pshalgo2'.
+       * include/freetype/internal/ftdebug.h (FT_Trace): Updated.
+
+       * docs/modules.txt: New file.
+
+2001-12-21  David Turner  <david@freetype.org>
+
+       * src/pshinter/pshrec.c (ps_hints_t2mask, ps_hints_t2counter):
+       Ignore invalid `hintmask' and `cntrmask' operators (instead of
+       returning an error).  Glyph 2028 of the CFF font `MSung-Light-Acro'
+       couldn't be rendered otherwise (it seems its charstring is buggy,
+       though this requires more analysis).
+       (FT_COMPONENT): Define.
+
+       * src/cff/cffgload.c (CFF_Parse_CharStrings), src/psaux/t1decode.c
+       (T1_Decoder_Parse_Charstrings), src/pshinter/pshalgo2.c (*), Fixed a
+       bug where the X and Y axis where inverted in the postscript hinter.
+       This caused problem when displaying on non-square surfaces.
+
+       * src/pshinter/pshalgo2.c: s/vertical/dimension/.
+
+       * src/pshinter/pshglob.c (psh_globals_new): Replaced a floating
+       point constant with a fixed-float equivalent.  For some reasons not
+       all compilers are capable of directly computing a floating pointer
+       constant casted to FT_Fixed, and will link a math library instead.
+
+2001-12-20  Werner Lemberg  <wl@gnu.org>
+
+       * src/cache/ftccache.c (ftc_node_destroy, ftc_cache_lookup): Fix
+       tracing strings.
+       * src/cache/ftccmap.c (ftc_cmap_family_init): Ditto.
+       * src/cache/ftcmanag.c (ftc_family_table_alloc,
+       ftc_family_table_free, FTC_Manager_Check): Ditto.
+       * src/cache/ftcsbits.c (ftc_sbit_node_load): Ditto.
+
+       * src/base/ftobjs.c (FT_Done_Library): Remove compiler warning.
+
+2001-12-20  David Turner  <david@freetype.org>
+
+       Added PostScript hinter support to the CFF and CID drivers.
+
+       * include/freetype/internal/cfftypes.h (CFF_Font): New member
+       `pshinter'.
+       * src/cff/cffload.c (CFF_Get_Standard_Encoding): New function.
+       * src/cff/cffload.h: Updated.
+       * src/cff/cffgload.c (CFF_Init_Builder): Renamed to ...
+       (CFF_Builder_Init): This.
+       Added new argument `hinting'.
+       (CFF_Done_Builder): Renamed to ...
+       (CFF_Builder_Done): This.
+       (CFF_Init_Decoder): Added new argument `hinting'.
+       (CFF_Parse_CharStrings): Implement vstem support.
+       (CFF_Load_Glyph): Updated.
+       Add hinting support.
+       (cff_lookup_glyph_by_stdcharcode): Use CFF_Get_Standard_Encoding().
+       (cff_argument_counts): Updated.
+       * src/cff/cffgload.h: Updated.
+       * src/cff/cffobjs.c: Include FT_INTERNAL_POSTSCRIPT_HINTS_H.
+       (CFF_Size_Get_Globals_Funcs, CFF_Size_Done, CFF_Size_Init,
+       CFF_Size_Reset, CFF_GlyphSlot_Done, CFF_GLyphSlot_Init): New
+       functions.
+       (CFF_Init_Face): Renamed to ...
+       (CFF_Face_Init): This.
+       Add hinter support.
+       (CFF_Done_Face): Renamed to ...
+       (CFF_Face_Done): This.
+       (CFF_Init_Driver): Renamed to ...
+       (CFF_Driver_Init): This.
+       (CFF_Done_Driver): Renamed to ...
+       (CFF_Driver_Done): This.
+       * src/cff/cffobjs.h: Updated.
+       * src/cff/cffdrivr.c (cff_driver_class): Updated.
+
+       * include/freetype/internal/t1types.h (CID_FaceRec): New member
+       `pshinter'.
+       * src/cid/cidgload.c (CID_Load_Glyph): Add hinter support.
+       * src/cid/cidobjs.c: Include FT_INTERNAL_POSTSCRIPT_HINTS_H.
+       (CID_GlyphSlot_Done, CID_GlyphSlot_Init, CID_Size_Get_Globals_Funcs,
+       CID_Size_Done, CID_Size_Init, CID_Size_Reset): New functions.
+       (CID_Done_Face): Renamed to ...
+       (CID_Face_Done): This.
+       (CID_Init_Face): Renamed to ...
+       (CID_Face_Init): This.
+       Add hinting support.
+       (CID_Init_Driver): Renamed to ...
+       (CID_Driver_Init): This.
+       (CID_Done_Driver): Renamed to ...
+       (CID_Driver_Done): This.
+       * src/cid/cidobjs.h: Updated.
+       * src/cidriver.c: Updated.
+
+       * src/pshinter/pshrec.c (t2_hint_stems): Fixed.
+
+       * src/base/ftobjs.c (FT_Done_Library): Fixed a stupid bug that
+       crashed the library on exit.
+
+       * src/type1/t1gload.c (T1_Load_Glyph): Enable font matrix
+       transformation of hinted glyphs.
+
+       * src/cid/cidload.c (cid_read_subrs): Fix error condition.
+
+       * src/cid/cidobjs.c (CID_Face_Done): Fixed a memory leak; the subrs
+       routines were never released when CID faces were destroyed.
+
+       * src/cff/cffload.h, src/cff/cffload.c, src/cff/cffgload.c: Updated
+       to move the definition of encoding tables back within `cffload.c'
+       instead of making them part of a shared header (causing problems in
+       `multi' builds).  This reverts change 2001-08-08.
+
+       * docs/CHANGES: Updated for 2.0.6 release.
+       * docs/TODO: Added `stem3 and counter hints support' to the TODO
+       list for the Postscript hinter.
+       * docs/BUGS: Closed the AUTOHINT-NO-SBITS bug.
+
+2001-12-19  David Turner  <david@freetype.org>
+
+       * include/freetype/cache/ftcache.h: Added comments to indicate that
+       some of the exported functions should only be used by applications
+       that need to implement custom cache types.
+
+       * src/truetype/ttgload.c (cur_to_org, org_to_cur): Fixed a nasty bug
+       that prevented composites from loading correctly, due to missing
+       parentheses around macro parameters.
+
+       * src/sfnt/sfobjs.c (SFNT_Load_Face): Make the `post' and `name'
+       tables optional to load PCL fonts properly.
+
+       * src/truetype/ttgload.c (TT_Load_Glyph), src/base/ftobjs.c
+       (FT_Load_Glyph), include/freetype/freetype.h (FT_LOAD_SBITS_ONLY):
+       `Fixed' the bug that prevented embedded bitmaps to be loaded when
+       the auto-hinter is used.  This actually is a hack but will be enough
+       until the internal re-design scheduled for FreeType 2.1.
+
+       * src/raster/ftrend1.c (ft_raster1_render): Fixed a nasty outline
+       shifting bug in the monochrome renderer.
+
+       * README: Updated version numbers to 2.0.6.
+
+2001-12-17  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Fix test for invalid
+       glyph header.
+
+2001-12-15  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Remove compiler warning.
+       * include/freetype/ftcache.h (FTC_Node_Unref): Removed.  It is
+       already in ftcmanag.h.
+       * src/cache/ftcsbits.c (ftc_sbit_node_load): Remove unused variable
+       `gfam'.
+       * src/cache/ftcmanag.c (ftc_family_table_alloc,
+       * ftc_family_table_free): Use FT_EXPORT_DEF.
+       * include/freetype/cache/ftcmanag.h: Updated.
+       * src/cache/ftccache.c (ftc_node_destroy): Use FT_EXPORT_DEF.
+       * src/cache/ftccmap.c (ftc_cmap_node_init): Remove unused variable
+       `cfam'.
+       Remove compiler warning.
+       (FTC_CMapCache_Lookup): Remove compiler warnings.
+       (ftc_cmap_family_init): Ditto.
+       (FTC_CMapCache_Lookup): Ditto.
+
+       * builds/unix/configure.ac: Increase `version_info' to 8:0:2.
+       * builds/unix/configure: Regenerated.
+
+2001-12-14  Werner Lemberg  <wl@gnu.org>
+
+       * builds/mac/README: Updated.
+
+2001-12-14  Scott Long  <scott@swiftview.com>
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Fixing crash when
+       dealing with invalid fonts (i.e. glyph size < 10 bytes).
+
+2001-12-14  Sam Latinga  <slouken@devolution.com>
+
+       * builds/mac/freetype.make: A new Makefile to build with MPW on
+       MacOS classic.
+
+2001-12-14  David Turner  <david@freetype.org>
+
+       * src/truetype/ttgload.c (TT_Load_Glyph), src/type1/t1gload.c
+       (T1_Load_Glyph), src/cid/cidgload.c (CID_Load_Glyph),
+       src/cff/cffgload.c (CFF_Load_Glyph): Fixed a serious bug common to
+       all font drivers (the advance width was never hinted when it
+       should).
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): New macro.
+       * src/base/ftdbgmem.c (debug_mem_dummy) [!FT_DEBUG_MEMORY]: Don't
+       use `extern' keyword.
+
+2001-12-12  David Turner  <david@freetype.org>
+
+       * src/pshinter/pshglob.c (psh_blues_scale_zones, psh_blues_snap_stem
+       psh_globals_new): Adding correct BlueScale/BlueShift support, plus
+       family blues processing.
+       * src/pshinter/pshglob.h (PSH_BluesRec): Updated.
+
+       Started adding support for the Postscript hinter in the CFF module.
+
+       * src/cff/cffgload.c: Include FT_INTERNAL_POSTSCRIPT_HINTS_H.
+       (CFF_Parse_CharStrings): Implement it.
+       * src/cff/cffgload.h: Updated.
+
+2001-12-12  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/freetype2.m4: Some portability fixes.
+
+2001-12-11  Jouk Jansen  <joukj@hrem.stm.tudelft.nl>
+
+       * src/base/descrip.mms (OBJS): Add ftdebug.obj.
+
+2001-12-11  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttload.c (TT_Load_Generic_Header): Typos.
+
+2001-12-11  David Turner  <david@freetype.org>
+
+       * builds/unix/freetype-config.in: Modified the script to prevent
+       passing `-L/usr/lib' to gcc.
+
+       * docs/FTL.TXT: Simple fix (change `LICENSE.TXT' to `FTL.TXT').
+
+       * builds/unix/freetype2.m4: New file for checking configure paths.
+       We need to install it in $(prefix)/share/aclocal/freetype2.m4 but I
+       didn't modify builds/unix/install.mk yet.
+
+       * INSTALL: Updated the instructions to build shared libraries with
+       Jam.  They were simply wrong.
+
+       * src/base/fttrigon.c (FT_Cos): Fixed a small bug that caused
+       slightly improper results for `FT_Cos' and `FT_Sin' (example:
+       FT_Sin(0) == -1!).
+
+2001-12-11  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * include/freetype/internal/ftstream.h (GET_LongLE, GET_ULongLE):
+       Fixed incorrect argument types.
+
+2001-12-10  Francesco Zappa Nardelli  <Francesco.Zappa.Nardelli@ens.fr>
+
+       * src/pcf/pcfdriver.c (PCF_Init_Face): Allow Xft to use PCF fonts
+       by setting the `face->metrics.max_advance' correctly.
+
+2001-12-07  David Turner  <david@freetype.org>
+
+       * include/freetype/cache/ftccmap.h, src/cache/ftccmap.c: Added new
+       charmap cache.
+       * src/cache/ftcache.c: Updated.
+
+       * src/autohint/ahhint.c (ah_hinter_hint_edges): s/UNUSED/FT_UNUSED/.
+
+2001-12-06  Leonard Rosenthol  <leonardr@lazerware.com>
+
+       Added support for reading .dfont files on Mac OS X.  Also added a
+       new routine which looks up a given font by name in the Mac OS and
+       returns the disk file where it resides.
+
+       * src/base/ftmac.c: Include <Files.h> and <TextUtils.h>.
+       (is_dfont): New auxiliary function.
+       (FT_New_Face_From_dfont): New function.
+       (FT_GetFile_From_Mac_Name): New exported function.
+       (FT_New_Face): Updated.
+       * include/freetype/ftmac.h: Updated.
+
+2001-12-06  David Turner  <david@freetype.org>
+
+       * src/cache/Jamfile, src/cache/rules.mk: Updated.
+
+2001-12-06  Werner Lemberg  <wl@gnu.org>
+
+       * INSTALL: Small update.
+
+2001-12-05  David Turner  <david@freetype.org>
+
+       * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Re-ordered code for
+       debugging purposes.
+       Comment out use of `origin'.
+
+       * src/smooth/ftsmooth.c (ft_smooth_render): Fixed a nasty hidden bug
+       where outline shifting wasn't correctly undone after bitmap
+       rasterization.  This created problems with certain glyphs (like '"'
+       of certain fonts) and the cache system.
+
+       * src/pshinter/pshalgo1.c (psh1_hint_table_init): Fix typo.
+       * src/pshinter/pshalgo2.c (psh2_hint_table_init): Fix typo.
+       (ps2_hints_apply): Small fix.
+
+2001-12-05  David Turner  <david@freetype.org>
+
+       * src/pshinter/pshalgo2.c (psh2_hint_table_init),
+       src/pshinter/pshalgo1.c (psh1_hint_table_init): Removed compiler
+       warnings.
+
+       * include/freetype/ftcache.h, include/freetype/cache/*, src/cache/*:
+       Yet another massive rewrite of the caching sub-system in order to
+       both increase performance and allow simpler cache sub-classing.  As
+       an example, the code for the image and sbit caches is now much
+       simpler.
+
+       I still need to update the documentation in
+       www/freetype2/docs/cache.html to reflect the new design though.
+
+       * include/freetype/config/ftheader.h (FT_CACHE_CHARMAP_H): New
+       macro.
+       (FT_CACHE_INTERNAL_CACHE_H): Updated.
+
+2001-12-05  David Krause  <freetype@davidkrause.com>
+
+       * docs/license.txt: s/X Windows/X Window System/.
+
+2001-12-04  Werner Lemberg  <wl@gnu.org>
+
+       * src/raster/ftraster.c: Fix definition condition of MEM_Set().
+       * src/smooth/ftgrays.c (M_Y): Change value to 192.
+       * src/base/ftdbgmem.c (ft_mem_table_destroy): Fix printf() parameter.
+       Remove unused variable.
+       * src/cache/ftcimage.c (ftc_image_node_init,
+       ftc_image_node_compare): Remove unused variables.
+       * src/cache/ftcsbits.c (ftc_sbit_node_weight): Remove unused
+       variable.
+       * src/raster/ftraster.c (MEM_Set): Move definition down to avoid
+       compiler warning.
+       * src/autohint/ahhint.c (ah_hinter_hint_edges): Use UNUSED() to
+       avoid compiler warnings.
+       * src/pcf/pcfread.c (tableNames): Use `const'.
+       (pcf_read_TOC): Change counter name to avoid compiler warning.
+       Use `const'.
+       * src/pshinter/pshrec.c (ps_hints_close): Remove redundant
+       declaration.
+       * src/pshinter/pshalgo1.c (psh1_hint_table_init): Rename variables
+       to avoid shadowing.
+       * src/pshinter/pshalgo2.c (psh2_hint_table_activate_mask): Ditto.
+       * src/type1/t1objs.h: Remove double declarations of `T1_Size_Init()'
+       and `T1_Size_Done()'.
+
+2001-11-20  Antoine Leca  <antoineleca@multimania.com>
+
+       * include/freetype/ttnameid.h: Added some new Microsoft language
+       codes and LCIDs as found in MSDN (Passport SDK).  Also added
+       comments about the meaning of bit 57 of the `OS/2' table
+       (TT_UCR_SURROGATES) which (with OpenType v.1.3) now means `there is
+       a character beyond 0xFFFF in this font'.  Thanks to Detlef Würkner
+       <TetiSoft@apg.lahn.de> for noticing this.
+
+2001-11-20  David Turner  <david@freetype.org>
+
+       * src/pshinter/{pshalgo2.c, pshalgo1.c}: Fixed stupid bug in sorting
+       routine that created nasty alignment artefacts.
+
+       * src/pshinter/pshrec.c, tests/gview.c: Debugging updates.
+
+       * src/smooth/ftgrays.c: De-activated experimental gamma support.
+       Apparently, `optimal' gamma tables depend on the monitor type,
+       resolution and general karma, so it's better to compute them outside
+       of the rasterizer itself.
+       (gray_convert_glyph): Use `volatile' keyword.
+
+2001-10-29  David Turner  <david@freetype.org>
+
+       Adding experimental `gamma' support.  This produces smoother glyphs
+       at small sizes for very little cost.
+
+       * src/smooth/ftgrays.c (grays_init_gamma): New function.
+       (gray_raster_new): Use it.
+
+       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).
+
+       * src/autohint/ahglyph.c (ah_outline_load,
+       ah_outline_link_segments): Implement it.
+       Fix typos.
+       (ah_outline_save, ah_outline_compute_segments): Fix typos.
+       * src/autohint/ahhint.c (ah_align_serif_edge): New argument
+       `vertical'.  Implement improvement.
+       (ah_hint_edges_3, ah_hinter_hint_edges): Implement it.
+       Fix typos.
+       (ah_hinter_align_strong_points, ah_hinter_align_weak_points): Fix
+       typos.
+       (ah_hinter_load): Set `ah_debug_hinter' if DEBUG_HINTER is defined.
+       * src/autohint/ahmodule.c: Implement support for DEBUG_HINTER macro.
+       * src/autohint/ahtypes.h: Ditto.
+       (AH_Hinter): Remove `disable_horz_edges' and `disable_vert_edges'
+       (making them global as `ah_debug_disable_horz' and
+       `ah_debug_disable_vert').
+       Fix typos.
+
+       * tests/gview.c: Updated the debugging glyph viewer to show the
+       hints generated by the `autohint' module.
+
+2001-10-27  David Turner  <david@freetype.org>
+
+       * src/cache/ftcchunk.c (ftc_chunk_cache_lookup): Fixed a bug that
+       considerably lowered the performance of the abstract chunk cache.
+
+2001-10-26  David Turner  <david@freetype.org>
+
+       * include/freetype/ftcache.h, include/freetype/cache/*.h,
+       src/cache/*.c: Major re-design of the cache sub-system to provide
+       better performance as well as an `Acquire'/`Release' API.  Seems to
+       work well here, but probably needs a bit more testing.
+
+2001-10-26  Leonard Rosenthol  <leonardr@lazerware.com>
+
+       * builds/mac/README: Updated to reflect my taking over the project
+       and that is now being actively maintained.
+
+       * src/base/ftmac.c (parse_fond): Applied patches from Paul Miller
+       <paulm@profoundeffects.com> to support loading a face other than the
+       first from a FOND resource.
+       (FT_New_Face_From_FOND): Updated.
+
+2001-10-25  Leonard Rosenthol  <leonardr@lazerware.com>
+
+       * builds/mac/ftlib.prj: Update of CodeWarrior project file for Mac
+       OS for latest version (7) of CWPro and for recent changes to the FT
+       source tree.
+
+2001-10-25  David Turner  <david@freetype.org>
+
+       * include/freetype/config/ftoption.h: Updated comments to explain
+       precisely how to use project-specific macro definitions without
+       modifying this file manually.
+
+       (FT_CONFIG_FORCE_INT64): Define.
+
+       (FT_DEBUG_MEMORY): New macro.
+
+2001-10-24  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * builds/unix/ftsystem.c (FT_New_Memory): Added a missing `{'.
+
+2001-10-23  David Turner  <david@freetype.org>
+
+       * include/freetype/internal/ftmemory.h, src/base/ftdbgmem.c:
+       Improvements to the memory debugger to report more information in
+       case of errors.  Also, some allocations that occurred through REALLOC
+       couldn't be previously caught correctly.
+
+       * src/autohint/ahglyph.c (ah_outline_compute_segments,
+       ah_outline_compute_edges), src/raster/ftraster.c (ft_black_new),
+       src/smooth/ftgrays.c (gray_render_span, gray_raster_new): Replaced
+       liberal uses of memset() by the MEM_Set() macro.
+
+2001-10-23  David Turner  <david@freetype.org>
+
+       * src/raster/ftraster.c (Update): Removed to be inlined in ...
+       (Sort): Updated.
+
+2001-10-22  David Turner  <david@freetype.org>
+
+       * builds/unix/ftsystem.c (FT_New_Memory, FT_Done_Memory),
+       builds/vms/ftsystem.c (FT_New_Memory, FT_Done_Memory),
+       builds/amiga/ftsystem.c (FT_New_Memory, FT_Done_Memory),
+       src/base/ftdbgmem.c: Updated the memory debugger and
+       platform-specific implementations of `ftsystem' in order to be able
+       to debug memory allocations on Unix, VMS and Amiga too!
+
+       * src/pshinter/pshalgo2.c (psh2_hint_table_record_mask): Removed
+       some bogus warnings.
+
+       * include/freetype/internal/ftmemory.h, src/base/ftdbgmem.c:
+       Modified the debugging memory manager to report the location (source
+       file name + line number) where leaked memory blocks are allocated in
+       the source file.
+
+       * src/base/ftdbgmem.c: New debugging memory manager.  You must
+       define the FT_DEBUG_MEMORY macro in `ftoption.h' to enable it.  It
+       will record every memory block allocated and report simple errors
+       like memory leaks and double deletes.
+
+       * src/base/Jamfile: Include ftdbgmem.
+       * src/base/rules.mk: Ditto.
+       * src/base/ftbase.c: Include ftdbgmem.c.
+
+       * include/freetype/config/ftoption.h: Added the FT_DEBUG_MEMORY
+       macro definition.
+
+       * src/base/ftsystem.c (FT_New_Memory, FT_Done_Memory): Modified the
+       base component to use the debugging memory manager when the macro
+       FT_DEBUG_MEMORY is defined.
+
+2001-10-21  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/cff/cffload.c (CFF_Done_Font): Free subfonts array only if
+       we are working with a CID keyed CFF font.  Otherwise, a variable
+       that was never allocated memory might freed.  This is a correction
+       to the previous patch for freeing subfonts.
+
+2001-10-21  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/cff/cffload.c (CFF_Done_Font): Free the subfonts array to
+       avoid a memory leak.
+
+2001-10-21  David Turner  <david@freetype.org>
+
+       * src/pshinter/pshalgo2.c, src/pshinter/pshalgo1.c,
+       src/pshinter/pshglob.c: Removing compiler warnings in pedantic modes
+       (in multi-object compilation mode, mainly).
+
+2001-10-20  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/type1/t1load.c (parse_encoding): Add a test to make sure
+       that custom encodings (i.e., neither StandardEncoding nor
+       ExpertEncoding) are not loaded twice when the Type 1 font is
+       synthetic.
+
+       * src/type1/t1load.c (parse_font_name, parse_subrs): Added a test
+       for when loading synthetic fonts to make sure that the font name
+       and subroutines are not loaded twice.  This is to remove a memory
+       leak that occurred because the original memory blocks for these
+       objects were not deallocated when the objects were parsed the
+       second time.
+
+2001-10-19  David Turner  <david@freetype.org>
+
+       * src/smooth/ftgrays.c, src/pshinter/pshglob.h,
+       src/pshinter/pshrec.c, src/pshinter/pshalgo2.c: Getting rid of
+       compiler warnings.
+
+       * src/pshinter/module.mk, src/pshinter/rules.mk: Adding control
+       files to build the PostScript hinter with the `old' build system.
+
+2001-10-19  Jacob Jansen  <joukj@hrem.stm.tudelft.nl>
+
+       * descrip.mms, src/pshinter/descrip.mms: Updates to the VMS build
+       files.
+
+2001-10-18  David Turner  <david@freetype.org>
+
+       * src/psnames/pstables.h, src/tools/glnames.py: Rewrote the
+       `glnames.py' script used to generate the `pstables.h' header file.
+       The old one contained a serious bug that made FreeType return
+       incorrect glyph names for certain glyphs.
+
+       * src/truetype/ttdriver.c (Set_Char_Sizes): Changing computation of
+       pixel size from character size to use rounding.  This is an
+       experiment to see whether this gives values similar to Windows for
+       scaled ascent/descent/etc.
+
+       * src/base/ftcalc.c (FT_Div64by32): Changed the implementation
+       slightly since the original code was mis-compiled on Mac machines
+       using the MPW C compiler.
+
+       * src/base/ftobjs.c (FT_Realloc): When a memory block was grown
+       through FT_Realloc(), the new bytes were not set to 0, which created
+       some strange bugs in the PostScript hinter.
+       (destroy_face): Don't deallocate unconditionally.
+
+       * src/cid/cidgload.c (CID_Compute_Max_Advance, CID_Load_Glyph):
+       Adding support to new PostScript hinter.
+
+       * include/freetype/internal/psglobal.h,
+       include/freetype/internal/pshints.h,
+       include/freetype/config/ftmodule.h, src/pshinter/Jamfile,
+       src/pshinter/pshalgo.h, src/pshinter/pshalgo1.h,
+       src/pshinter/pshalgo1.c, src/pshinter/pshalgo2.h,
+       src/pshinter/pshalgo2.c, src/pshinter/pshglob.h,
+       src/pshinter/pshglob.c, src/pshinter/pshinter.c,
+       src/pshinter/pshmod.c, src/pshinter/pshmod.h, src/pshinter/pshrec.c,
+       src/pshinter/pshrec.h: Adding new PostScript hinter module.
+
+       * include/freetype/internal/ftobjs.h,
+       include/freetype/internal/internal.h,
+       include/freetype/internal/psaux.h,
+       include/freetype/internal/t1types.h, src/psaux/psobjs.c,
+       src/psaux/psobjs.h, src/psaux/t1decode.h, src/psaux/t1decode.c,
+       src/type1/t1driver.c, src/type1/t1gload.c, src/type1/t1objs.c,
+       src/type1/t1objs.h: Updates to use the new PostScript hinter.
+
+       * tests/Jamfile, tests/gview.c: Adding a new glyph hinting
+       viewer/debugger to the source tree.  Note that you will _not_ be
+       able to compile it since it depends on an unavailable graphics
+       library named `Nirvana' to render vector images.
+
+2001-10-17  David Turner  <david@freetype.org>
+
+
+       * Version 2.0.5 released.
+       =========================
+
+
+       * include/freetype/freetype.h, include/internal/ftobjs.h,
+       src/base/ftobjs.c, src/type1/t1driver.c: Adding a new function named
+       'FT_Get_Postscript_Name' to retrieve the PostScript name of a given
+       font.  Should work with all formats except pure CFF/CEF fonts (this
+       will be added soon).
+
+       * src/cid/cidriver (cid_get_postscript_name): New function.
+       (CID_Get_Interface): Handle `postscript_name' interface.
+
+       * src/sfnt/sfdriver.c (get_sfnt_postscript_name): New function.
+       (SFNT_Get_Interface): Handle `postscript_name' interface.
+
+       * src/type1/t1driver.c (t1_get_ps_name): New function.
+       (Get_Interface): Handle `postscript_name' interface.
+
+       * README, docs/CHANGES: Updated for 2.0.5 release.
+
+2001-10-08  David Turner  <david@freetype.org>
+
+       Fixed a bug in `glnames.py' that prevented it from generating
+       correct glyph names tables.  This resulted in the unavailability of
+       certain glyphs like `Cacute', `cacute' and `lslash' in Unicode
+       charmaps, even if these were present in the font (causing problems
+       for Polish users).
+
+       * src/tools/glnames.py (mac_standard_names): Fixed.
+       (t1_standard_strings): Some fixes and renamed to ...
+       (sid_standard_names): This.
+       (t1_expert_encoding): Fixed.
+       (the_adobe_glyph_list): Renamed to ...
+       (adobe_glyph_names): This.
+       (the_adobe_glyphs): Renamed to ...
+       (adobe_glyph_values): This.
+       (dump_mac_indices, dump_glyph_list, dump_unicode_values, main):
+       Updated.
+       * src/psnames/pstables.h: Regenerated.
+       * src/psnames/psmodule.c (PS_Unicode_Value): Fix offset.
+       Fix return value.
+       Use `sid_standard_table' and `ps_names_to_unicode' instead of
+       `t1_standard_glyphs' and `names_to_unicode'.
+       (PS_Macintosh_Name): Use `ps_glyph_names' instead of
+       `standard_glyph_names'.
+       (PS_Standard_Strings): Use `sid_standard_names' instead of
+       `t1_standard_glyphs'.
+
+       * doc/BUGS, doc/TODO: New documents.
+
+2001-10-07  Richard Barber  <rich@solutionuk.com>
+
+       * src/cache/ftlru.c (FT_Lru_Lookup_Node): Fixed a bug that prevented
+       correct LRU behaviour.
+
+2001-10-07  David Turner  <david@freetype.org>
+
+       setjmp() and longjmp() are now used for rollback (i.e. when memory
+       pool overflow occurs).
+
+       Function names are now all uniformly prefixed with `gray_'.
+
+       * src/smooth/ftgrays.c: Include <setjmp.h>.
+       (ErrRaster_MemoryOverflow): New macro.
+       (TArea): New type to store area values in each cell (using `int' was
+       too small on 16-bit systems).  <limits.h> is included to properly
+       get the needed data type.
+       (TCell, TRaster): Use it.
+       (TRaster): New element `jump_buffer'.
+       (gray_compute_cbox): Use `RAS_ARG' as the only parameter and get
+       `outline' from it.
+       (gray_record_cell): Use longjmp().
+       (gray_set_cell): Use gray_record_cell() for error handling.
+       (gray_render_line, gray_render_conic, gray_render_cubic): Simplify.
+       (gray_convert_glyph_inner): New function, using setjmp().
+       (gray_convert_glyph): Use it.
+
+2001-10-07  David Turner  <david@freetype.org>
+
+       Provide a public API to manage multiple size objects for a given
+       FT_Face in the new header file `ftsizes.h'.
+
+       * include/freetype/ftsizes.h: New header file,
+       * include/freetype/internal/ftobjs.h: Use it.
+       Remove declarations of FT_New_Size and FT_Done_Size (moved to
+       ftsizes.h).
+       * include/freetype/config/ftheader.h (FT_SIZES_H): New macro.
+       * src/base/ftobjs.c (FT_Activate_Size): New function.
+       * src/cache/ftcmanag.c: Include ftsizes.h.
+       (ftc_manager_init_size, ftc_manager_flush_size): Use
+       FT_Activate_Size.
+
+2001-09-20  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * builds/amiga/*: Added port to Amiga with the SAS/C compiler.
+
+2001-09-15  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * src/type1/t1afm.c (T1_Done_AFM): Free `afm'.
+
+2001-09-10  Yao Zhang  <yzhang@sharemedia.com>
+
+       * src/sfnt/ttcmap.c (code_to_index2): Handle code values with
+       hi-byte == 0 correctly.
+
+2001-09-10  Werner Lemberg  <wl@gnu.org>
+
+       * builds/link-std.mk ($(PROJECT_LIBRARY)): Fix typo.
+
+2001-08-30  Martin Muskens  <mmuskens@aurelon.com>
+
+       * src/type1/t1load.c (parse_font_matrix): A new way to compute the
+       units per EM with greater accuracy (important for embedded T1 fonts
+       in PDF documents that were automatically generated from TrueType
+       ones).
+
+       * src/type1/t1load.c (is_alpha): Now supports `+' in font names;
+       this is used in embedded fonts.
+
+       * src/psaux/psobjs.c (PS_Table_Add): Fixed a reallocation bug that
+       generated a dangling pointer reference.
+
+2001-08-30  Anthony Feik  <afeick@hotmail.com>
+
+       * src/type1/t1afm.c (T1_Read_Afm): Now correctly sets the flag
+       FT_FACE_FLAG_KERNING when appropriate for Type1 + AFM files.
+
+2001-08-25  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttload.c (TT_Load_CMap): Fix frame length of
+       `cmap_rec_fields'.
+
+       * include/freetype/fterrors.h [!FT_CONFIG_OPTION_USE_MODULE_ERRORS]:
+       Undefine FT_ERR_BASE before defining again.
+
+2001-08-22  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttinterp.h: Fix prototype of TT_Move_Func.
+
+2001-08-21  Werner Lemberg  <wl@gnu.org>
+
+       * builds/dos/dos-def.mk (NO_OUTPUT): Don't use `&>' but `>'.
+
+2001-08-21  David Turner  <david@freetype.org>
+
+       * include/freetype/config/ftoption.h: Changed the default setting
+       for FT_CONFIG_OPTION_USE_MODULE_ERRORS to undefined, since it breaks
+       source compatibility in a few cases.  Updated the comment to explain
+       that too.
+
+2001-08-17  Martin Muskens  <mmuskens@aurelon.com>
+
+       * src/base/ftcalc.c (FT_MulDiv): Fixed serious typo.
+
+2001-08-12  Werner Lemberg  <wl@gnu.org>
+
+       Updating to OpenType 1.3.
+
+       * include/freetype/internal/tttypes.h (TT_CMap0, TT_CMap2, TT_CMap4,
+       TT_CMap6): Adding field `language'.
+       (TT_CMapTable): Removing field `language'.
+       Type of `length' field changed to FT_ULong.
+       Adding fields for cmaps format 8, 10, and 12.
+       (TT_CMapGroup): New auxiliary structure.
+       (TT_CMap8_12, TT_CMap10): New structures.
+       * include/freetype/tttables.h (TT_HoriHeader, TT_VertHeader):
+       Removed last element of `Reserved' array.
+       * include/freetype/ttnameid.h (TT_PLATFORM_CUSTOM, TT_MS_ID_UCS_4,
+       TT_NAME_ID_CID_FINDFONT_NAME): New macros.
+
+       * src/sfnt/ttcmap.c (TT_CharMap_Load): Updated loading of `language'
+       field to the new structures.
+       Fixed freeing of arrays in case of unsuccessful loads.
+       Added support for loading format 8, 10, and 12 cmaps.
+       (TT_CharMap_Free): Added support for freeing format 8, 10, and 12
+       cmaps.
+       (code_to_index4): Small improvement.
+       (code_to_index6): Ditto.
+       (code_to_index8_12, code_to_index10): New functions.
+       * src/sfnt/ttload.c (TT_Load_Metrics_Header): Updated to new
+       structure.
+       (TT_Load_CMap): Ditto.
+
+       * src/sfnt/sfobjs.c (tt_encodings): Add MS UCS4 table (before MS
+       Unicode).
+
+2001-08-11  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1driver.c (t1_get_name_index): Fix compiler warning.
+
+2001-08-09  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/cff/cffdrivr.c (get_cff_glyph_name): Renamed to
+       cff_get_glyph_name for consistency.
+
+       (cff_get_glyph_index): Minor documentation change.
+
+       * src/type1/t1driver.c (t1_get_name_index): New function used in
+       Get_Interface as the function returned when the `name_index'
+       function is requested.
+
+       (get_t1_glyph_name): Renamed to t1_get_glyph_name for consistency.
+
+2001-08-08  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/cff/cffload.c: Removed definitions of cff_isoadobe_charset,
+       cff_expert_charset, cff_expertsubset_charset, cff_standard_encoding,
+       and cff_expert_encoding arrays to cffload.h.
+
+       * src/cff/cffload.h: Added definitions of cff_isoadobe_charset,
+       cff_expert_charset, cff_expertsubset_charset, cff_standard_encoding,
+       and cff_expert_encoding arrays.
+
+       * src/cff/cffdrivr.c (cff_get_name_index): New function, returned
+       when `cff_get_interface' is called with a request for the
+       `name_index' function.
+
+       (cff_get_interface): Modified so that it returns the function
+       `cff_get_name_index' when the `name_index' function is requested.
+
+       * src/base/ftobjs.c (FT_Get_Name_Index): New function, used to
+       return a glyph index for a given glyph name only if the driver
+       supports glyph names.
+
+       * include/freetype/internal/ftobjs.h (FT_Name_Index_Requester):
+       New function pointer type definition used in the function
+       FT_Get_Name_Index.
+
+       * include/freetype/freetype.h (FT_Get_Name_Index): Added
+       documentation and prototype.
+
+2001-07-26  Werner Lemberg  <wl@gnu.org>
+
+       * builds/cygwin/*: Removed.  Use the unix stuff instead.
+
+2001-07-26  Jouk Jansen  <joukj@hrem.stm.tudelft.nl>
+
+       * builds/vms/ftconfig.h (FT_CALLBACK_DEF): Updated to change dated
+       2001-06-27.
+
+2001-07-17  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/psaux.h (PS_Table): Use FT_Offset for
+       `cursor' and `capacity'.
+       * src/psaux/psobjc.c (reallocate_t1_table): Use FT_Long for second
+       parameter.
+       (PS_Table_Add): Use FT_Offset for `new_size'.
+
+       Add support for version 0.5 maxp tables.
+
+       * src/sfnt/ttload.c (TT_Load_MaxProfile): Implement it.
+       (TT_Load_OS2): Initialize some values.
+
+2001-07-13  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftsynth.c: Include ftcalc.h unconditionally.
+
+2001-07-07  David Turner  <david@freetype.org>
+
+       * src/truetype/ttgload.c, src/truetype/ttinterp.c, src/pcf/pcfread:
+       Removed pedantic compiler warnings when the bytecode interpreter is
+       compiled in.
+
+2001-07-03  Werner Lemberg  <wl@gnu.org>
+
+       * src/autohint/ahhint.c (ah_hinter_align_weak_points): Remove
+       unused variable `edges'.
+       (ah_hinter_load): Remove unused variables `old_width' and
+       `new_width'.
+       * src/cid/cidload.c (cid_decrypt): Use `U' for constant (again).
+       * src/psaux/psobjs.c (T1_Decrypt): Ditto.
+       * src/type1/t1parse.c (T1_Get_Private_Dict): Ditto.
+
+2001-06-28  David Turner  <david@freetype.org>
+
+       * include/internal/ftstream.h: Modified the definitions
+       of the FT_GET_XXXX and NEXT_XXXX macros for 16-bit correctness.
+
+2001-06-26  Werner Lemberg  <wl@gnu.org>
+
+       * src/cid/cidload.c, src/cid/cidload.h (cid_decrypt): Use FT_Offset
+       instead of FT_Int as type for `length' parameter.
+       * include/freetype/internal/psaux.h (PSAux_Interface): Updated.
+
+2001-06-27  Wolfgang Domröse  <porthos.domroese@harz.de>
+
+       * src/psaux/psobjs.c, src/psaux/psobjs.h (T1_Decrypt): Use FT_Offset
+       instead of FT_Int as type for `length' parameter.
+
+
+       * Version 2.0.4 released.
+       =========================
+
+
+2001-06-27  David Turner  <david@freetype.org>
+
+       * builds/unix/ftconfig.in: Changed the definition of the
+       FT_CALLBACK_DEF macro.
+
+       * include/freetype/ftconfig.h, src/*/*.c: Changed the definition and
+       use of the FT_CALLBACK_DEF macro in order to support 16-bit
+       compilers.
+
+       * builds/unix/ftconfig.in: Changed the definition of the
+       FT_CALLBACK_DEF macro.
+
+       * src/sfnt/ttload.c (TT_Load_Kern): The kern table loader now ensures
+       that the kerning table is correctly sorted (some problem fonts don't
+       have a correct kern table).
+
+2001-06-26  Wolfgang Domröse  <porthos.domroese@harz.de>
+
+       * include/freetype/internal/ftstream.h (FT_GET_OFF3_LE): Fix typo.
+
+2001-06-24  David Turner  <david@freetype.org>
+
+       * src/base/ftcalc.c (ft_div64by32): Fixed the source to work
+       correctly on 16-bit systems.
+
+2001-06-23  Anthony Fok  <fok@debian.org>
+
+       * debian/*: Added Debian package build directory for 2.0.4.
+
+2001-06-22  David Turner  <david@freetype.org>
+
+       * docs/PATENTS: Added patents disclaimer.  This one was missing!
+
+       * docs/CHANGES, docs/todo: Updated for the upcoming 2.0.4 release.
+
+2001-06-20  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/config/ftconfig.h: Add two more `L's to
+       constants.
+       Add missing semicolons.
+
+       * builds/toplevel.mk: Do similar change as for
+       builds/unix/detect.mk.
+
+       * include/freetype/freetype.h (FT_ENC_TAG): New version to make it
+       easier to redefine.
+       * include/freetype/ftimage.h (FT_IMAGE_TAG): Ditto.
+
+       * src/pcf/pcfread.c (pcf_get_encodings): Add cast.
+
+2001-06-19  David Turner  <david@freetype.org>
+
+       * builds/win32/visualc/freetype.dsp, builds/win32/visualc/index.html:
+       Updated the Visual C++ project (for the 2.0.4 release).
+
+       * builds/unix/detect.mk: Added rule for AIX detection (which uses
+       /usr/sbin/init instead of /sbin/init).
+
+       * include/freetype/fterrors.h, src/*/*err*.h: Updated some of the
+       error macros to simplify handling of new error scheme.
+
+2001-06-19  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/fttypes.h (FT_ERROR_MODULE): New macro.
+
+2001-06-19  David Turner  <david@freetype.org>
+
+       Removing _lots_ of compiler warnings when the most pedantic warning
+       levels of Visual C++ and Borland C++ are used.  Too many files to be
+       listed here, but FT2 now compiles without warnings with VC++ and the
+       `/W4' warning level (lint-style).
+
+       * include/freetype/freetype.h (FT_New_Memory_Face): Updated
+       documentation.
+       * include/freetype/fttypes.h (FT_BOOL): New macro.
+       * include/freetype/internal/ftdebug.h: Add #pragma for Visual C++
+       to suppress warning.
+       * include/freetype/internal/ftstream.h (FT_GET_SHORT_{BE,LE},
+       FT_GET_OFF3_{BE,LE}, FT_GET_LONG_{BE,LE}): New macros.
+       (NEXT_*): Use them.
+       * src/autohint/ahglobal.c: Include FT_INTERNAL_DEBUG_H.
+       (FT_New_Memory_Face): Add `const' to function declaration.
+
+2001-06-18  Werner Lemberg  <wl@gnu.org>
+
+       Minor cleanups to remove compiler warnings.
+
+       * include/freetype/cache/ftcmanag.h (FTC_MAX_BYTES_DEFAULT): Use
+       `L' for constant.
+       * include/freetype/config/ftoption.h (FT_RENDER_POOL_SIZE): Ditto.
+       * src/base/ftcalc.c (FT_MulDiv): Use `L' for constant.
+       * src/base/ftglyph.c (FT_Glyph_Get_CBox): Remove `error' variable.
+       * src/base/fttrigon.c (ft_trig_arctan_table): Use `L' for constants.
+       * src/base/ftobjs.c (FT_Done_Size): Fix return value.
+       (FT_Set_Char_Size, FT_Set_Pixel_Sizes, FT_Get_Kerning): Remove
+       unused `memory' variable.
+       * src/autohint/ahglyph.c (ah_get_orientation): Use `L' for constant.
+       * src/autohint/ahhint.c (ah_hint_edges_3,
+       ah_hinter_align_edge_points): Remove unused `before' and `after'
+       variables.
+       (ah_hinter_align_weak_points): Remove unused `edge_limit' variable.
+       (ah_hinter_load): Remove unused `new_advance', `start_contour',
+       and `metrics' variables.
+       * src/cff/cffload.c (CFF_Load_Encoding): Remove dead code to avoid
+       compiler warning.
+       * src/cff/cffobjs.c (CFF_Init_Face): Remove unused `base_offset'
+       variable.
+       * src/cff/cffgload.c (CFF_Parse_CharStrings): Remove unused
+       `outline' variable.
+       (cff_compute_bias): Use `U' for constant.
+       * src/cid/cidload.c (cid_decrypt): Ditto.
+       * src/psaux/psobjs.c (T1_Decrypt): Ditto.
+       * src/psaux/t1decode.c (T1_Decoder_Parse_CharStrings): Ditto.
+       * src/sfnt/ttload.c (TT_Load_Kern): Remove unused `version'
+       variable.
+       * src/sfnt/ttsbit.c (TT_Load_SBit_Image): Remove unused `top'
+       variable.
+       * src/truetype/ttgload.c (load_truetype_glyph): Remove unused
+       `num_contours' and `ins_offset' variables.
+       (compute_glyph_metrics): Remove unused `Top' and `x_scale'
+       variables.
+       (TT_Load_Glyph): Remove unused `memory' variable.
+       * src/smooth/ftgrays.c (grays_raster_render): Use `L' for constants.
+
+2001-06-18  Werner Lemberg  <wl@gnu.org>
+
+       Make the new error scheme source compatible with older FT versions
+       by introducing another layer.
+
+       * include/freetype/fterrors.h (FT_ERRORDEF_, FT_NOERRORDEF_): New
+       macros.
+       (FT_NOERRORDEF): Removed.
+       * include/*/*err*.h: Use FT_ERRORDEF_ and FT_NOERRORDEF_.
+
+2001-06-16  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/freetype.h (FT_ENC_TAG): New macro.
+       (FT_Encoding_): Use it.
+       * include/freetype/ftimage.h (FT_IMAGE_TAG): Define it
+       conditionally.
+
+2001-06-14  David Turner  <david@freetype.org>
+
+       Modified the TrueType interpreter to let it use the new
+       trigonometric functions provided in `fttrigon.h'.  This gets rid of
+       some old 64-bit computation routines, as well as many warnings when
+       compiling the library with the `long long' 64-bit integer type.
+
+       * include/freetype/config/ftoption.h: Undefine
+       FT_CONFIG_OPTION_OLD_CALCS.
+       * include/freetype/internal/ftcalc.h: Rearrange use of
+       FT_CONFIG_OPTION_OLD_CALCS.
+       * src/base/ftcalc.c: Add declaration of FT_Int64 if
+       FT_CONFIG_OPTION_OLD_CALCS isn't defined.
+       * src/truetype/ttinterp.c: Use FT_TRIGONOMETRY_H.
+       (Norm): Add a special version if FT_CONFIG_OPTION_OLD_CALCS isn't
+       defined.
+       (Current_Ratio, Normalize): Simplify code.
+
+2001-06-11  Mike Owens  <MOwens@amtdatasouth.com>
+
+       * src/base/ftcalc.c (FT_MulDiv, FT_DivFix, FT_Sqrt64): Remove
+       compiler warnings.
+
+2001-06-08  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/configure.in: Renamed to ...
+       * builds/unix/configure.ac: This to make sure that autoconf 2.50 is
+       needed.
+       Run `autoupdate' on it.
+       Increase `version_info' to 7:0:1.
+       * builds/unix/configure: Regenerated.
+
+2001-06-08  David Turner  <david@freetype.org>
+
+       * src/autohint/ahhint.c (ah_hinter_load_glyph): Fixed a bug that
+       corrupted transformed glyphs that were auto-hinted (the transform
+       was applied twice).
+
+       Fixed a bug that returned an invalid linear width for composite
+       TrueType glyphs.
+
+       * include/internal/tttypes.h (TT_Loader_): Two new elements `linear'
+       and `linear_def'.
+       * src/truetype/ttgload.c (load_truetype_glyph,
+       compute_glyph_metrics): Use it.
+
+       * include/fttypes.h (FT_ERROR_BASE): New macro.
+       * src/base/ftobjs.c (FT_Open_Face, FT_Render_Glyph_Internal): Use it
+       to make source code work with the new error scheme implemented by
+       Werner.
+       * src/base/ftoutln.c (FT_Outline_Render): Ditto.
+
+2001-06-07  Werner Lemberg  <wl@gnu.org>
+
+       Updating to libtool 1.4.0 and autoconf 2.50.
+
+       * builds/unix/ltconfig: Removed.
+       * builds/unix/ltmain.sh, builds/unix/configure.in,
+       builds/unix/aclocal.m4: Updated.
+       * builds/unix/configure: Regenerated.
+
+2001-06-06  Werner Lemberg  <wl@gnu.org>
+
+       Complete redesign of error codes.  Please check ftmoderr.h for more
+       details.
+
+       * include/freetype/internal/cfferrs.h,
+       include/freetype/internal/tterrors.h,
+       include/freetype/internal/t1errors.h: Removed.  Replaced with files
+       local to the module.  All extra error codes have been moved to
+       `fterrors.h'.
+
+       * src/sfnt/ttpost.h: Move error codes to `fterrors.h'.
+
+       * src/autohint/aherrors.h, src/cache/ftcerror.h, src/cff/cfferrs.h,
+       src/cid/ciderrs.h, src/pcf/pcferror.h, src/psaux/psauxerr.h,
+       src/psnames/psnamerr.h, src/raster/rasterrs.h, src/sfnt/sferrors.h,
+       src/smooth/ftsmerrs.h, src/truetype/tterrors.h,
+       src/type1/t1errors.h, src/winfonts/fnterrs.h: New files defining the
+       error names for the module it belongs to.
+
+       * include/freetype/ftmoderr.h: New file, defining the module error
+       offsets.  Its structure is similar to `fterrors.h'.
+
+       * include/freetype/fterrors.h (FT_NOERRORDEF): New macro.
+       (FT_ERRORDEF): Redefined to use module error offsets.
+       All internal error codes are now public; unused error codes have
+       been removed, some are new.
+
+       * include/freetype/config/ftheader.h (FT_MODULE_ERRORS_H): New
+       macro.
+       * include/freetype/config/ftoption.h
+       (FT_CONFIG_OPTION_USE_MODULE_ERRORS): New macro.
+
+       All other source files have been updated to use the new error codes;
+       some already existing (internal) error codes local to a module have
+       been renamed to give them the same name as in the base module.
+
+       All make files have been updated to include the local error files.
+
+2001-06-06  Werner Lemberg  <wl@gnu.org>
+
+       * src/cid/cidtokens.h: Replaced with...
+       * src/cid/cidtoken.h: This file for 8+3 consistency.
+
+       * src/raster/ftraster.c: Use macros for header file names.
+
+       * src/include/freetype/tttables.h (TT_HoriHeader_, TT_VertHeader_):
+       Fix length of `Reserved' array.  Note that this isn't the real fix
+       since recent OpenType specs have introduced a `CaretOffset' field
+       instead of the first reserved byte.
+
+2001-05-29  Werner Lemberg  <wl@gnu.org>
+
+       * INSTALL: Minor fixes.
+
+
+       * Version 2.0.3 released.
+       =========================
+
+
+2001-05-29  David Turner  <david@freetype.org>
+
+       * INSTALL, docs/CHANGES: Updated.
+
+2001-05-25  David Turner  <david@freetype.org>
+
+       Moved several documents from the top-level to the `docs' directory.
+
+       * src/base/ftcalc.c (FT_DivFix): Small fix to return value.
+
+2001-05-16  David Turner  <david@freetype.org>
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Fixed a bug in the
+       composite loader.  Spotted by Keith Packard.
+       * src/base/ftobjs.c (FT_GlyphLoader_Check_Points,
+       FT_GlyphLoader_Check_Subglyphs): Ditto.
+
+2001-05-14  David Turner  <david@freetype.org>
+
+       Fixed the incorrect blue zone computations, and improved the
+       composite support.  Note that these changes result in improved
+       rendering, while sometimes introducing their own artefacts.  This is
+       probably the last big change to the autohinter before the
+       introduction of a complete replacement.
+
+       * src/autohint/ahglobal.c (sort_values): Fix loop.
+       * src/autohint/ahglyph.c: Removed some obsolete code.
+       (ah_outline_compute_edges): Modify code to set the ah_edge_round
+       flag.
+       (ah_outline_compute_blue_edges): Add code to compute active blue
+       zones.
+       * src/autohint/ahhint.c (ah_hinter_glyph_load): Change load_flags
+       value.
+
+       * src/base/ftcalc.c (FT_DivFix): Fixed a bug in the 64-bit code that
+       created incorrect scale factors!
+       (FT_Round_Fix, FT_CeilFix, FT_FloorFix): Minor improvements.
+
+2001-05-12  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/ftbbox.h: FTBBOX_H -> __FTBBOX_H__.
+       * include/freetype/fttrigon.h: __FT_TRIGONOMETRY_H__ ->
+       __FTTRIGON_H__.
+       Include FT_FREETYPE_H.
+       Beautified; added copyright.
+       * src/base/fttrigon.c: Beautified; added copyright.
+
+2001-05-11  David Turner  <david@freetype.org>
+
+       * src/cff/cffparse.c (cff_parse_font_matrix), src/cid/cidload.c
+       (parse_font_matrix), src/type1/t1load.c (parse_font_matrix): Fixed
+       the incorrect EM size computation.
+
+       * include/freetype/fttrigon.h, src/base/fttrigon.c: New files,
+       adding trigonometric functions to the core API (using Cordic
+       algorithms).
+       * src/base/ftbase.c, src/base/Jamfile, src/base/rules.mk: Use them.
+
+       * builds/newline: New file.
+       * builds/top_level.mk, builds/detect.mk: Use it.  This fixes
+       problems with Make on Windows 2000, as well as problems when `make
+       distclean' is invoked on a non-Unix platform when there is no
+       `config.mk' in the current directory.
+
+       * builds/freetype.mk: Fixed a problem with object deletions under
+       Dos/Windows/OS/2 systems.
+
+       Added new directory to hold tools and test programs.
+
+       * docs/docmaker.py, docs/glnames.py: Moved to...
+       * src/tools/docmaker.py, src/tools/glnames.py: This place.
+       * src/tools/cordic.py: New file used to compute arctangent table
+       needed by fttrigon.c.
+       * src/tools/test_bbox.c, src/tools/test_trig.c: New test files.
+
+       * src/tools/docmaker.py: Improved the script to add the current date
+       at the footer of each web page (useful to distinguish between
+       versions).
+
+       * Jamfile: Fixed incorrect HDRMACRO argument.
+
+       * TODO: Removed the cubic arc bbox computation note, since it has been
+       fixed recently.
+       * src/base/ftbbox.c (test_cubic_zero): Renamed to...
+       (test_cubic_extrema): This function.  Use `UL' for unsigned long
+       constants.
+
+       * include/freetype/t1tables.h, include/freetype/config/ftoption.h:
+       Formatting.
+
+2001-05-10  David Turner  <david@freetype.org>
+
+       * src/base/ftobjs.c (FT_Open_Face): Fixed a small memory leak
+       which happened when trying to open 0-size font files!
+
+2001-05-09  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/ftcalc.h: Move declaration of
+       FT_SqrtFixed() out of `#ifdef FT_LONG64'.
+
+2001-05-08  Francesco Zappa Nardelli  <Francesco.Zappa.Nardelli@ens.fr>
+
+       * src/pcfdriver.c (PCF_Load_Glyph): Fixed incorrect bitmap width
+       computation.
+
+2001-05-08  David Turner  <david@freetype.org>
+
+       * docs/docmaker.py: Updated the DocMaker script in order to add
+       command line options (--output,--prefix,--title), fix the erroneous
+       line numbers reported during errors and warnings, and other
+       formatting issues.
+
+       * src/base/ftcalc.c (FT_MulDiv, FT_MulFix, FT_DivFix): Various tiny
+       fixes related to rounding in 64-bits routines and
+       pseudo-`optimizations'.
+
+2001-04-27  David Turner  <david@freetype.org>
+
+       * src/base/ftbbox.c (BBox_Cubic_Check): Fixed the coefficient
+       normalization algorithm (invalid final bit position, and invalid
+       shift computation).
+
+2001-04-26  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/config.guess, builds/unix/config.sub: Updated to
+       latest versions from gnu.org.
+
+       * builds/compiler/gcc-dev.mk: Add `-Wno-long-long' flag.
+
+       * include/freetype/internal/ftcalc.h: Define FT_SqrtFixed()
+       unconditionally.
+       * src/base/ftbbox.c: Include FT_INTERNAL_CALC_H.
+       Fix compiler warnings.
+       * src/base/ftcalc.c: Fix (potential) compiler warnings.
+
+2001-04-26  David Turner  <david@freetype.org>
+
+       * src/base/ftcalc.c (FT_SqrtFixed): Corrected/optimized the 32-bit
+       fixed-point square root computation.  It is now used even with
+       64-bits integers, as it is _much_ faster than calling FT_Sqrt64 :-)
+
+       * src/base/ftbbox.c: Removed invalid `#include FT_BEZIER_H' line.
+
+2001-04-25  David Turner  <david@freetype.org>
+
+       * src/base/ftbbox.c (BBox_Cubic_Check): Rewrote function to use
+       direct computations with 16.16 values instead of sub-divisions.  It
+       is now slower, but proves a point :-)
+
+       * src/raster/ftraster.c, src/smooth/ftgrays.c, src/base/ftbbox.c:
+       Fixed the Bézier stack depths.
+
+       * src/base/ftcalc.c (FT_MulFix): Minor rounding fix.
+
+       * builds/beos: Added BeOS-specific files to the old build system
+       (no changes were necessary to support BeOS in the Jamfile though).
+
+2001-04-20  David Turner  <david@freetype.org>
+
+       * ftconfig.h, ftoption.h: Updated `ftconfig.h' to detect 64-bit int
+       types on platforms where Autoconf is not available).  Also removed
+       FTCALC_USE_LONG_LONG and replaced it with
+       FT_CONFIG_OPTION_FORCE_INT64.
+
+       * builds/win32/freetype.dsp: Updated the Visual C++ project file.
+       Doesn't create a DLL yet.
+
+       * cffgload.c: Removed a compilation warning.
+
+2001-04-10  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * t1load.c (parse_charstrings): Changed code for placing .notdef
+       glyph into slot 0 so that we no longer have a memory access
+       violation.
+
+       * t1load.h: In structure T1_Loader, added swap_table (of type
+       PS_Table) to facilitate placing the .notdef glyph into slot 0.
+
+2001-04-10  Francesco Zappa Nardelli  <francesco.zappa.nardelli@ens.fr>
+
+       * src/pcf/pcfdriver.c (PCF_Get_Char_Index): Fix return value.
+
+2001-04-09  Laurence Withers  <lwithers@lwithers.demon.co.uk>
+
+       * builds/dos/detect.mk: Add support for bash.
+
+2001-04-05  Werner Lemberg  <wl@gnu.org>
+
+       * builds/os2/*.mk: These files have been forgotten to update to
+       the structure of similar makefiles.
+       * builds/dos/*.mk: Ditto.
+       * builds/ansi/*.mk: Ditto.
+
+       * builds/win32/win32-def.mk (BUILD): Fix typo.
+
+       * builds/compiler/*.mk (CLEAN_LIBRARY): Don't use NO_OUTPUT.
+       This is already used in the link_*.mk files.
+
+2001-04-03  Werner Lemberg  <wl@gnu.org>
+
+       * src/*/Jamfile: Slight changes to make files more cryptic.
+
+2001-04-03  Werner Lemberg  <wl@gnu.org>
+
+       * Jamfile, src/Jamfile, src/*/Jamfile: Formatted.  Slight changes
+       to give files identical structure.
+
+2001-04-02  Werner Lemberg  <wl@gnu.org>
+
+       * CHANGES: Reformatted, minor fixes.
+       * TODO: Updated.
+       * README: Formatting.
+       * include/freetype/freetype.h: Formatting.
+
+       * Jamfile: Fix typo.
+
+       * src/cff/cffparse.c: Move error code #defines to...
+       * include/freetype/internal/cfferrs.h: This file.
+       * src/cff/cffdrivr.c, src/cff/cffobjs.c, src/cff/cffload.c: Replaced
+       `FT_Err_*' with `CFF_Err_*'.
+       * src/cid/cidparse.c: Replaced `FT_Err_*' with `T1_Err_*'.
+       * src/psaux/psobjs.c, src/psaux/t1decode.c: Ditto.
+       * src/sfnt/sfobcs.c, src/sfnt/ttload.c: Replaced `FT_Err_*' with
+       `TT_Err_*'.
+       * src/truetype/ttgload.c, src/truetype/ttobjs.c: Ditto.
+       * src/type1/t1gload.c, src/type1/t1load.c, src/type1/t1objs.c,
+       src/type1/t1parse.c: Replaced `FT_Err_*' with `T1_Err_*'.
+
+       * include/freetype/internal/cfferrs.h: Add
+       `CFF_Err_Unknown_File_Format'.
+       * include/freetype/internal/t1errors.h: Add
+       `T1_Err_Unknown_File_Format'.
+       * include/freetype/internal/tterrors.h: Add
+       `TT_Err_Unknown_File_Format'.
+
+       * src/cff/cffload.h: Add `cff_*_encoding' and `cff_*_charset'
+       references.
+       * src/psaux/psobjs.c: Include `FT_INTERNAL_TYPE1_ERRORS_H'.
+
+       * src/cff/cffobjs.c (CFF_Init_Face, CFF_Done_Face): Use
+       FT_LOCAL_DEF.
+       * src/cid/cidobjs.c (CID_Done_Driver): Ditto.
+       * src/trutype/ttobjs.c (TT_Init_Face, TT_Done_Face, TT_Init_Size):
+       Ditto.
+       * src/type1/t1objs.c (T1_Done_Driver): Ditto.
+       * src/pcf/pcfdriver.c (PCF_Done_Face): Ditto.
+       * src/pcf/pcf.h: Use FT_LOCAL for `PCF_Done_Face'.
+
+2001-04-02  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/sfnt/ttload.c (TT_Load_Metrics): Fix an improper pointer
+       dereference.  Submitted by Herbert Duerr <duerr@sun.com>.
+
+2001-03-26  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * include/freetype/config/ftconfig.h: Changed hexadecimal
+       constants to use suffix U to avoid problems with HP-UX's c89
+       compiler.  Submitted by G.W. Lucas <glucas@sonalysts.com>.
+
+2001-03-24  David Turner  <david.turner@freetype.org>
+
+       * Jamrules, Jamfile, src/Jamfile, src/*/Jamfile: Adding jamfiles to
+       the source tree.  See www.freetype.org/jam/index.html for details.
+
+
+       * Version 2.0.2 released.
+       =========================
+
+
+2001-03-20  Werner Lemberg  <wl@gnu.org>
+
+       * builds/win32/detekt.mk: Fix .PHONY target for Intel compiler.
+
+2001-03-20  David Turner  <david.turner@freetype.org>
+
+       * include/freetype/config/ftheader.h, include/freetype/ftsnames.h:
+       Renamed `ftnames.h' to `ftsnames.h', and FT_NAMES_H to
+       FT_SFNT_NAMES_H.
+
+       * docs/docmaker.py: Added generation of INDEX link in table of
+       contents.
+
+       * INSTALL, docs/BUILD: Updated documentation to indicate that the
+       compilation process has changed slightly (no more `src' required in
+       the include path).
+
+       * builds/*/*-def.mk: Changed the objects directory from `obj' to
+       `objs'.
+
+       * include/freetype/config/ftheader.h: Removed obsolete macros like
+       FT_SOURCE_FILE, etc. and added cache-specific macro definitions that
+       were previously defined in <freetype/ftcache.h>.  Added comments to
+       be included in a new API Reference section.
+
+       * src/*/*: Removed the use of FT_SOURCE_FILE, etc.  Now, each
+       component needs to add its own directory to the include path at
+       compile time.  Modified all `rules.mk' and `descrip.mms'
+       accordingly.
+
+2001-03-20  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/configure.in: Add $ft_version.
+       * builds/unix/freetype-config.in: Use it.
+       * builds/unix/configure: Updated.
+
+2001-03-19  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/type1/t1load.c (parse_font_matrix): Assign the units per em
+       value an unsigned short value, first by shifting right 16 bits,
+       then by casting the results to FT_UShort.
+
+       * src/cff/cffparse.c (cff_parse_font_bbox): Assign the units per em
+       value an unsigned short value, first by shifting right 16 bits,
+       then by casting the results to FT_UShort.
+
+2001-03-17  David Turner  <david.turner@freetype.org>
+
+       * src/cid/cidobjs.c, src/cid/cidload.c, src/pcf/pcfread.c,
+       src/type1/t1load.c, src/type1/t1objs.c: Added a few casts to remove
+       compiler warnings in pedantic modes.
+
+       * include/config/ft2build.h, include/config/ftheader.h: The file
+       `ft2build.h' was renamed to `ftheader.h' to avoid conflicts with the
+       top-level <ft2build.h>.
+
+       * include/config/ftheader.h: Added new section describing the #include
+       macros.
+
+2001-03-17  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/cff/cffparse.c (cff_parse_font_bbox): Obtain rounded FT_Fixed
+       values for the bounding box numbers.
+
+       * src/cff/cffobjs.c (CFF_Init_Face): When processing a CFF/CEF font,
+       set `root->ascender' (`root->descender') to the integer part of
+       `root->bbox.yMax' (`root->bbox.yMin', respectively).
+
+2001-03-16  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/cff/cffdrivr.c (get_cff_glyph_name):  New function.  Used in
+       cff_get_interface to facilitate getting a glyph name for glyph index
+       via FT_Get_Glyph_Name().
+
+       (cff_get_interface): Added support for getting a glyph name via the
+       `glyph_name' module interface.  Uses the new function
+       get_cff_glyph_name().
+       Submitted by Sander van der Wal <svdwal@xs4all.nl>.
+
+       * src/cff/cffobjs.c (CFF_Init_Face): Logical or the face flags with
+       FT_FACE_FLAG_GLYPH_NAMES only if FT_CONFIG_OPTION_NO_GLYPH_NAMES is
+       not defined.  This is to add support for getting a glyph name from a
+       glyph index via FT_Get_Glyph_Name().
+       Submitted by Sander van der Wal <svdwal@xs4all.nl>.
+
+       * src/cff/cffgload.c (CFF_Parse_CharStrings): Added support for
+       deprecated operator `dotsection'.
+       Submitted by Sander van der Wal <svdwal@xs4all.nl>.
+
+2001-03-12  Werner Lemberg  <wl@gnu.org>
+
+       * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Fix error
+       messages.
+
+       * INSTALL, docs/BUILD: We need GNU make 3.78.1 or newer.
+
+2001-03-12  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * include/freetype/internal/psaux.h:  Changed the lenIV member of
+       the T1_Decoder_ struct to be an FT_Int instead of an FT_UInt.
+
+       * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings):  Adjust
+       for lenIV seed bytes at the start of a decrypted subroutine.
+
+       * src/cid/cidload.c (cid_read_subrs): Decrypt subroutines only
+       if lenIV >= 0.
+
+       * src/cid/cidgload.c (cid_load_glyph): Decrypt charstrings only
+       if lenIV >= 0.
+
+2001-03-11  Werner Lemberg  <wl@gnu.org>
+
+       * TODO: Updated.
+
+       * src/pcf/pcfread.c: Put READ_Fields() always in a conditional to
+       avoid compiler warnings.
+
+2001-03-10  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * TODO: New file.
+
+       * include/freetype/freetype.h: Added prototypes and notes for
+       three new functions: FT_RoundFix, FT_CeilFix, and FT_FloorFix.
+       * src/base/ftcalc.c (FT_RoundFix, FT_CeilFix, FT_FloorFix): Added
+       implementation code.
+
+       * src/cid/cidobjs.c (CID_Init_Face): Use calculated units_per_EM,
+       and if that is not available, default to 1000 units per EM.  Changed
+       assignment code for ascender and descender values.
+       * src/cid/cidload.c (parse_font_matrix): Added units_per_EM
+       processing.
+       (parse_font_bbox): Changed to use FT_Fixed number handling.
+
+       * src/type1/t1objs.c (T1_Init_Face): Changed the assignment code
+       for ascender, descender, and max_advance_width.
+       * src/type1/t1load.c (parse_font_bbox): Changed to use FT_Fixed
+       number handling.
+
+2001-03-10  Henrik Grubbström  <grubba@roxen.com>
+
+       * src/*/*.c: Added many casts to make code more 64bit-safe.
+
+2001-03-07  Werner Lemberg  <wl@gnu.org>
+
+       * INSTALL, docs/BUILD: We need GNU make 3.78 or newer.
+
+2001-03-07  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/type1/t1objs.c (T1_Init_Face): Minor correction: We must wait
+       until parse_font_bbox is changed before we use logical shift rights
+       in the assignments of `root->ascender', `root->descender', and
+       `root->max_advance_width'.
+
+       (T1_Done_Face): Free `char_name' table to avoid a memory leak.
+       Submitted by Sander van der Wal <svdwal@xs4all.nl>.
+
+2001-03-05  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/cff/cffgload.c (CFF_Load_Glyph): Set glyph control data to the
+       the Type 2 glyph charstring (used by conversion programs).
+       Submitted by Ha Shao <hashao@chinese.com>.
+
+2001-03-04  Antoine Leca  <Antoine.Leca@renault.fr>
+
+       * include/freetype/ttnameid.h: Correct a stupid typo which prevented
+       correct compilation (TT_MS_LANGID_TIGRIGNA_ETHIOPIA appeared twice).
+
+2001-03-04  Werner Lemberg  <wl@gnu.org>
+
+       * src/autohint/ahtypes.h (AH_Hinter): Add elements
+       `disable_horz_edges', `disable_vert_edges'.
+       * src/autohint/ahhint.c (ah_hint_edges_3, ah_hinter_hint_edges): Use
+       them (and remove static variables with the same names).
+       * src/pcf/pcfutil.c (BitOrderInvert): Add `const'.
+       * docs/glnames.py: Updated to latest pstables.h changes.
+
+       * builds/unix/detect.mk: Add test for Hurd.
+       * builds/hurd/detect.mk: Removed.
+
+2001-03-04  Sander van der Wal  <svdwal@xs4all.nl>
+
+       * src/psnames/pstables.h: Add more `const'.
+       * src/pcf/pcfutil.c: Ditto.
+
+2001-03-04  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Fixing typo
+       (FT_Glyph_Done -> FT_Done_Glyph).
+
+2001-03-01  Antoine Leca  <Antoine.Leca@renault.fr>
+
+       * include/freetype/ttnameid.h: Added some new Microsoft language
+       codes and LCIDs as found in Office Xp.
+
+2001-02-28  David Turner  <david.turner@freetype.org>
+
+       * builds/hurd/detect.mk: New file.  Added support to detect the GNU
+       Hurd operating system as Unix-like.  Fix submitted by Anthony Fok
+       <foka@debian.org>.
+
+       * src/type1/t1gload.c (T1_Load_Glyph): Set glyph control data to the
+       the Type 1 glyph charstring (used by conversion programs).
+       Submitted by Ha Shao <hashao@chinese.com>.
+
+2001-02-22  David Turner  <david.turner@freetype.org>
+
+       * src/base/ftgrays.c (grays_sweep): The function didn't exit
+       immediately if `num_cells' was 0 as it should.  Thanks to Boris for
+       finding this out.
+
+       * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Fixed memory leak when
+       bitmap rendering fails (thanks to Graham Asher).
+
+2001-02-13  Werner Lemberg  <wl@gnu.org>
+
+       * docs/docmaker.py (DocSection::add_element): Use
+       `self.print_error()'.
+
+       * builds/unix/config.{guess,sub}: Updated (from ftp.gnu.org).
+
+2001-02-13  David Turner  <david.turner@freetype.org>
+
+       * docs/docmaker.py, include/freetype/*.h: Updated the DocMaker
+       script to support chapters and section block ordering.  Updated the
+       public header files accordingly.
+
+       * src/base/ftglyph.c (FT_Glyph_Copy): Advance width and glyph format
+       were not correctly copied.
+
+2001-02-08  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/cff/cffparse.c (cff_parse_font_matrix): Removed an
+       unnecessary fprintf( stderr, ... ).
+
+2001-02-07  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/type1/t1objs.c (T1_Init_Face): Added code to get the
+       units_per_EM from the value assigned in parse_font_matrix, if
+       available.  Default to 1000 if not available.
+
+       * src/cff/cffparse.c (cff_parse_font_matrix): Added logic to get
+       the units_per_EM from the FontMatrix.
+
+       (cff_parse_fixed_thousand): New function.  Gets a real number from
+       the CFF font, but multiplies by 1000 (this is to avoid rounding
+       errors when placing this real number into a 16.16 fixed number).
+
+       (cff_parse_real): Added code so that the integer part is moved
+       into the high sixteen bits of the 16.16 fixed number.
+
+       * src/cff/cffobjs.c (CFF_Init_Face): Added logic to get the units
+       per EM from the CFF dictionary, if available.
+
+       * include/freetype/internal/cfftypes.h: In struct CFF_Font_Dict_,
+       added a units_per_em member to facilitate passing of units_per_em
+       from function cff_parse_font_matrix.
+
+       * src/type1/t1load.c (is_alpha): Make `-' a legal alphanumeric
+       character.  This is so that font names with `-' are fully parsed,
+       etc...
+
+2001-02-02  Werner Lemberg  <wl@gnu.org>
+
+       * src/psaux/psobjs.c (shift_elements): Remove if clause (which is
+       obsolete now).
+
+       (reallocate_t1_table, PS_Table_Done): Replace REALLOC() with ALLOC()
+       + MEM_Copy() to avoid a memory bug.
+
+2001-02-01  David Turner  <david.turner@freetype.org>
+
+       * docs/docmaker.py: Improved the index sorting routine to place
+       capital letters before small ones.  Added the `<order>' marker to
+       section blocks in order to give the order of blocks.
+
+2001-01-30  Antoine Leca  <Antoine.Leca@renault.fr>
+
+       * include/freetype/ttnameid.h: Latest updates to Microsoft language
+       ID codes.
+
+2001-01-24  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/cff/t1load.c (parse_font_matrix): Added heuristic to get
+       units_per_EM from the font matrix.
+
+       (parse_dict): Deleted test to see whether the FontInfo keyword has
+       been seen.  Deletion of this test allows fonts without FontInfo
+       dictionaries to be parsed by the Type 1 driver.
+
+       (T1_Open_Face): Deleted empty subroutines array test to make sure
+       fonts with no subroutines still are parsed.
+
+2001-01-17  Francesco Zappa Nardelli  <francesco.zappa.nardelli@ens.fr>
+
+       * src/pcfread.c (pcf_get_properties, pcf_get_metrics,
+       pcf_get_bitmaps): Fix compiler errors.
+
+2001-01-11  David Turner  <david.turner@freetype.org>
+
+       * src/pcf/pcfread.c: Removed some compilation warnings related
+       to comparison of signed vs. unsigned integers.
+
+       * include/freetype/internal/ftdebug.h: Changed the debug trace
+       constants from trace_t2xxxx to trace_cffxxxx to be able to compile
+       the CFF driver in debug mode.
+
+2001-01-11  Matthew Crosby  <mcrosby@marthon.org>
+
+       * builds/unix/freetype-config.in: Fix problems with separate
+       --prefix and --exec-prefix.
+
+2001-01-11  David Turner  <david.turner@freetype.org>
+
+       * docs/docmaker.py: Added cross-references generation as well as
+       more robust handling of pathname wildcard matching.
+
+2001-01-10  Werner Lemberg  <wl@gnu.org>
+
+       * docs/docmaker.py: Minor improvements to reduce unwanted spaces
+       and empty lines in output.
+
+2001-01-09  David Turner  <david.turner@freetype.org>
+
+       * docs/docmaker.py: Improved script to generate table of contents
+       and index pages.  It also supports wildcards on non Unix systems.
+
+       * include/freetype/*.h, include/freetype/cache/*.h: Updated comments
+       to include section definitions/delimitations for the API Reference
+       generator.
+
+       * include/freetype/freetype.h: Moved declaration of
+       `FT_Generic_Finalizer' and the `FT_Generic' structure to...
+       * include/freetype/fttypes.h: here.
+
+2001-01-04  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/ttnameid.h: Updated Unicode code range comments.
+
+2001-01-03  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/cff/rules.mk: Use cffgload.{c,h} instead of t2gload.{c,h}.
+
+       * include/freetype/internal/internal.h: Changed to use cfftypes.h
+       (cfferrs.h) instead of t2types.h (t2errors.h, respectively).
+
+       * include/freetype/internal/cfftypes.h: Merged in changes from
+       t2types.h and made this the canonical `types' header for the CFF
+       driver.
+
+       * include/freetype/internal/t2types.h: This file was merged with
+       cfftypes.h and is no longer necessary.
+
+       * include/freetype/internal/t2errors.h: Renamed to cfferrs.h.
+
+       * src/cff/cffobjs.c, src/cff/cffobjs.h, src/cff/cffparse.c,
+       src/cff/cffdrivr.c, src/cff/cff.c, src/cff/cffload.c,
+       src/cff/cffgload.c, src/cff/cffgload.h: Changed to use
+       cffgload.{c,h} instead of t2gload.{c,h}.  All occurrences of t2_
+       (T2_) were replaced with cff_ (CFF_, respectively).
+
+       * src/cff/t2gload.h: Renamed cffgload.h.
+
+       * src/cff/t2gload.c: Renamed cffgload.c
+
+2000-01-02  Jouk Jansen  <joukj@hrem.stm.tudelft.nl>
+
+       * builds/vms: Support files for VMS architecture added.
+       * descrip.mms, src/*/descrip.mms: VMS makefiles added.
+       * README.VMS: New file.
+
+2000-01-01  Werner Lemberg  <wl@gnu.org>
+
+       * LICENSE.TXT: Added info about PCF driver license.
+
+2001-01-01  Francesco Zappa Nardelli  <francesco.zappa.nardelli@ens.fr>
+
+       * src/pcf/*: New driver module for PCF font format (used in
+       X Window System).
+       * include/freetype/internal/ftdebug.h (FT_Trace): Added values for
+       PCF driver.
+       * include/freetype/internal/pcftypes.h: New file.
+       * include/freetype/config/ftmodule.h: Added PCF driver module.
+
+2001-01-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/winfonts/winfnt.c (FNT_Get_Char_Index): Fix parameter type.
+
+2000-12-31  Werner Lemberg  <wl@gnu.org>
+
+       * builds/modules.mk (clean_module_list): Fixed deletion of module
+       file in case `make make_module_list' is called before `make setup'.
+
+2000-12-30  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffload.c (CFF_Load_Charset): Improved error messages.
+       (CFF_Load_Charset, CFF_Load_Encoding): Remove unnecessary variable
+       definition.
+
+2000-12-30  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * include/freetype/internal/t2types.h,
+       include/freetype/internal/cfftypes.h: Changed the structures for
+       CFF_Encoding and CFF_Encoding for the new implementations of the
+       charset and encoding parsers in the CFF driver.
+
+       * src/cff/t2gload.c (t2_lookup_glyph_by_stdcharcode,
+       t2_operator_seac): Added these functions for use in implementing the
+       seac emulation provided by the Type 2 endchar operator.
+       (T2_Parse_CharStrings): Added seac emulation for the endchar
+       operator.
+
+       * src/cff/cffload.c (CFF_Load_Encoding, CFF_Load_Charset,
+       CFF_Done_Encoding, CFF_Done_Charset): Extended to load and parse the
+       charset/encoding tables, and free the memory used by them when the
+       CFF driver is finished with them.  Added tables
+
+           cff_isoadobe_charset
+           cff_expert_charset
+           cff_expertsubset_charset
+           cff_standard_encoding
+           cff_expert_encoding
+
+       so that the encoding/charset parser can handle predefined encodings and
+       charsets.
+
+2000-12-24  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/cff/t2gload.c (T2_Load_Glyph): Added code so that the font
+       transform is applied.
+
+       * src/cff/cffparse.c (cff_parse_font_matrix): Added code so that
+       the font matrix numbers are scaled by 1/(matrix->yy).  Also, the
+       offset vector now contains integer values instead of 16.16 fixed
+       numbers.
+
+2000-12-22  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/autohint/ahhint.c (ah_hinter_load_glyph):
+       Removed unnecessary comments and commented-out code.
+
+2000-12-21  David Turner  <david.turner@freetype.org>
+
+       * src/cid/cidafm.c, src/cid/cidafm.h: removed un-needed files,
+       we'll work on supporting CID AFM files later I guess :-)
+
+2000-12-21  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/autohint/ahhint.c (ah_hinter_load, ah_hinter_load_glyph):
+       Changed so that fonts with a non-standard FontMatrix render
+       correctly.  Previously, the first glyph rendered from such a
+       font did not have the transformation matrix applied.
+
+2000-12-17  Werner Lemberg  <wl@gnu.org>
+
+       * *.mk: Added lots of `.PHONY' targets.
+
+2000-12-17  Karsten Fleischer  <kfleisc1@ford.com>
+
+       * *.mk: Implemented `platform' target to disable auto-detection.
+
+2000-12-14  Werner Lemberg  <wl@gnu.org>
+
+       * docs/design/modules.html: Removed.  Covered by design-*.html.
+
+       * INSTALL: Added info about makepp.
+
+2000-12-14  David Turner  <david.turner@freetype.org>
+
+       Added support for clipped direct rendering in the smooth renderer.
+       This should not break binary compatibility of existing applications.
+
+       * include/freetype/fttypes.h, include/freetype/ftimage.h: Move
+       definition of the FT_BBox structure from the former to the latter.
+       * include/freetype/ftimage.h: Add `ft_raster_flag_clip' value to
+       FT_Raster_Flag enumeration.
+       Add `clip_box' element to FT_Raster_Params structure.
+       * src/smooth/ftgrays.c (grays_convert_glyph): Implement it.
+
+       * INSTALL: Updated installation instructions on Win32, listing the
+       new `make setup list' target used to list supported
+       compilers/targets.
+
+       * src/raster/ftraster.c (ft_black_render): Test for unsupported
+       direct rendering before testing arguments.
+
+2000-12-13  David Turner  <david.turner@freetype.org>
+
+       * include/freetype/config/ft2build.h,
+       include/freetype/internal/internal.h: Fixed header inclusion macros
+       to use direct definitions.  This is the only way to do these things
+       in a portable way :-(  The rest of the code should follow shortly
+       though everything compiles now.
+
+       * builds/compiler/intelc.mk, builds/compiler/watcom.mk: New files.
+
+       * builds/win32/detect.mk: Added support for the Intel C/C++
+       compiler, as well as _preliminary_ (read: doesn't work!) support for
+       Watcom.  Also added a new setup target.  Type `make setup list' for
+       a list of supported command-line compilers on Win32.
+
+       * src/base/ftdebug.c: Added dummy symbol to avoid empty file if
+       conditionals are off.
+
+2000-12-13  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/ftsystem.c: Fixed typos.  Fixed inclusion of wrong
+       ftconfig.h file.
+
+2000-12-12  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/config/ft2build.h (FT2_ROOT, FT2_CONFIG_ROOT):
+       Removed.  ANSI C doesn't (explicitly) allow macro expansion in
+       arguments using `##'.
+       (FT2_PUBLIC_FILE, FT2_CONFIG_FILE, FT2_INTERNAL_FILE): Use directory
+       names directly.  Make them configurable.  Use `##' to strip leading
+       and trailing spaces from arguments.
+
+       * builds/unix/ft2unix.h: Adapted.
+
+       * src/base/ftsystem.c (ft_alloc, ft_realloc, ft_free, ft_io_stream,
+       ft_close_stream): Use FT_CALLBACK_DEF.
+
+       * builds/unix/ftsystem.c: Use new header scheme.
+       (FT_Done_Memory): Use free() from FT_Memory structure.
+
+       * src/base/ftinit.c, src/base/ftmac.c: Header scheme fixes.
+
+2000-12-11  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/config/ft2build.h (FT2_CONFIG_ROOT,
+       FT2_PUBLIC_FILE, FT2_CONFIG_FILE, FT2_INTERNAL_FILE,
+       FT_SOURCE_FILE): Use `##' operator to be really ANSI C compliant.
+
+2000-12-09  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/detect.mk: Remove unused USE_CFLAGS variable.
+
+2000-12-08  Werner Lemberg  <wl@gnu.org>
+
+       * */*.h: Changed body inclusion macro names to start and end with
+       `__' (those which haven't converted yet).  Fixed minor conversion
+       issues.
+
+       * src/winfonts/winfnt.c: Updated to new header inclusion scheme.
+
+       * src/truetype/ttinterp.c: Remove unused CALC_Length() macro.
+
+2000-12-07  David Turner  <david.turner@freetype.org>
+
+       * */*.[ch]: Changed source files to adhere to the new
+       header inclusion scheme.  Not completely tested but works for now
+       here.
+
+       * src/cff/t2driver.c: Renamed and updated to...
+       * src/cff/cffdrivr.c: New file.
+       * src/cff/t2driver.h: Renamed and updated to...
+       * src/cff/cffdrivr.h: New file.
+       * src/cff/t2load.c: Renamed and updated to...
+       * src/cff/cffload.c: New file.
+       * src/cff/t2load.h: Renamed and updated to...
+       * src/cff/cffload.h: New file.
+       * src/cff/t2objs.c: Renamed and updated to...
+       * src/cff/cffobjs.c: New file.
+       * src/cff/t2objs.h: Renamed and updated to...
+       * src/cff/cffobjs.h: New file.
+       * src/cff/t2parse.c: Renamed and updated to...
+       * src/cff/cffparse.c: New file.
+       * src/cff/t2parse.h: Renamed and updated to...
+       * src/cff/cffparse.h: New file.
+       * src/cff/t2tokens.h: Renamed and updated to...
+       * src/cff/cfftoken.h: New file.
+
+       * src/cff/cff.c, src/cff/rules.mk: Updated.
+
+2000-12-06  David Turner  <david.turner@freetype.org>
+
+       * src/cache/ftlru.c (FT_Lru_Done): Fixed memory leak.
+
+2000-12-06  Werner Lemberg  <wl@gnu.org>
+
+       * builds/module.mk: Replaced `xxx #' with `xxx$(space).
+       * builds/os2/detekt.mk, builds/win32/detekt.mk: Moved comment to
+       avoid trailing spaces in variable.
+       * builds/freetype.mk: Use $(D) instead of $D to make statement more
+       readable.
+
+       * docs/docmaker.py: Formatting.
+
+2000-12-05  David Turner  <david.turner@freetype.org>
+
+       * src/psaux/psauxmod.c: Fixed a broken inclusion of component
+       header files (an FT_FLAT_COMPILE test was missing).
+
+       * src/cache/ftcmanag.c (FTC_Manager_Done): Fixed a bug that caused
+       an occasional crash when the function was called (due to a dangling
+       pointer).
+
+       * src/base/ftsystem.c (FT_Done_Memory): Fixed an obvious bug:
+       The ANSI `free()' function was called instead of `memory->free()'.
+
+       * docs/docmaker.py: Added section filtering, multi-page generation
+       (index page generation is still missing though).
+
+2000-12-04  David Turner  <david.turner@freetype.org>
+
+       * builds/unix/install.mk, builds/unix/ft2unix.h: The file `ft2unix.h'
+       is now installed as <ft2build.h> for Unix systems.  Note that we
+       still use the `freetype2/freetype' installation path for now.
+
+       * */*.[ch]: Now using <ft2build.h> as the default build and setup
+       configuration file in all public headers.  Internal source files
+       still need some changes though.
+
+       * builds/devel/ft2build.h, builds/devel/ftoption.h: Created a new
+       directory to hold all development options for both the Unix and
+       Win32 developer builds.
+
+       * builds/win32/detect.mk, builds/win32/w32-bccd.mk,
+       builds/win32/w32-dev.mk: Changed the developer build targets to
+       `devel-gcc' and `devel-bcc' in order to be able to develop with the
+       Borland C++ compiler.
+
+2000-12-01  David Turner  <david.turner@freetype.org>
+
+
+       * Version 2.0.1 released.
+       =========================
+
+
+       * builds/unix/configure.in, builds/unix/configure,
+       builds/cygwin/configure.in, builds/cygwin/configure: Setting
+       `version_info' to 6:1:0 for the 2.0.1 release.
+
+       * CHANGES: Added a summary of changes between 2.0.1 and 2.0.
+
+       * builds/unix/ftconfig.in, builds/cygwin/ftconfig.in: Changes
+       to allow compilation under Unix with the Unix-specific config
+       files.
+
+2000-12-01  Werner Lemberg  <wl@gnu.org>
+
+       * INSTALL: Revised.
+       * builds/compiler/bcc-dev.mk, builds/compiler/visualage.mk,
+       builds/compiler/bcc.mk, builds/win32/w32-bcc.mk,
+       builds/win32/w32-bccd.mk: Revised.
+       * include/freetype/config/ftbuild.h,
+       include/freetype/internal/internal.h: Revised.
+       * include/freetype/ftimage.h: Updated to new header inclusion scheme.
+
+2000-11-30  Werner Lemberg  <wl@gnu.org>
+
+       * builds/toplevel.mk (.PHONY): Adding `distclean'.
+       * builds/unix/detect.mk (.PHONY): Adding `devel', `unix', `lcc',
+       `setup'.
+
+2000-11-30  David Turner  <david.turner@freetype.ogr>
+
+       * INSTALL: Slightly updated the quick starter documentation to
+       include IDE compilation, prevent against BSD Make, and specify `make
+       setup' instead of a single `make' for build configuration.
+
+       * include/config/ftbuild.h, include/internal/internal.h: Added new
+       configuration files used to determine the location of all public,
+       configuration, and internal header files for FreeType 2.  Modified
+       all headers under `include/freetype' to reflect this change.  Note
+       that we still need to change the library source files themselves
+       though.
+
+       * builds/compiler/bcc.mk, builds/compiler/bcc-dev.mk,
+       builds/win32/w32-bcc.mk, builds/win32/w32-bccd.mk,
+       builds/win32/detect.mk: Added new files to support compilation with
+       the free Borland C++ command-line compiler.  Modified the detection
+       rules to recognize the new `bcc32' target in `make setup bcc32'.
+
+       * src/sfnt/ttcmap.c, src/sfnt/ttpost.c, src/sfnt/ttsbit.c,
+       src/truetype/ttobjs.c, src/truetype/ttgload.c,
+       src/truetype/ttinterp.c: Fixed a few comparisons that Borland C++
+       didn't really like.  Basically, this compiler complains when FT_UInt
+       is compared to FT_UShort (apparently, it promotes `UShort' to `Int'
+       in these cases).
+
+2000-11-30  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * t2objs.c (T2_Init_Face): Added calculation of `face->height' for
+       pure CFF fonts.
+
+       * t1objs.c (T1_Init_Face): Fixed computation of `face->height'.
+
+2000-11-29  David Turner  <david.turner@freetype.org>
+
+       * src/base/ftbbox.c (BBox_Conic_Check): Fixed a really stupid
+       bug in the formula used to compute the conic Bézier extrema
+       of non-monotonous arcs.
+
+2000-11-29  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftcalc.c (FT_SqrtFixed), src/base/ftobjs.c
+       (FT_Set_Renderer): Use FT_EXPORT_DEF.
+       * src/cache/ftcimage.c (FTC_Image_Cache_Lookup),
+       src/cache/ftcmanag.c (FTC_Manager_Done, FTC_Manager_Reset,
+       FTC_Manager_Lookup_Face, FTC_Manager_Lookup_Size,
+       FTC_Manager_Register_Cache), src/cache/ftcsbits.c
+       (FTC_SBit_Cache_Lookup): Ditto.
+
+       * src/include/freetype/cache/ftcglyph.h (FTC_GlyphNode_Init),
+       src/include/freetype/ftmac.h (FT_New_Face_From_FOND): Use FT_EXPORT.
+
+2000-11-29  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfdriver.c: Include ttsbit.h and ttpost.h only
+       conditionally.
+
+       * src/truetype/ttdriver.c (Set_Char_Sizes, Set_Pixel_Sizes): Set
+       `size->strike_index' only conditionally.
+
+       * src/type1/t1driver.c, src/type1/t1objs.c: Include t1afm.h only
+       conditionally.
+
+       * src/winfonts/winfnt.h: Move all type definitions to...
+       * src/include/freetype/internal/fnttypes.h: New file.
+       * src/winfonts/winfnt.c: Use it.
+
+2000-11-29  ??? ???  <darin@eazel.com>
+
+       * include/freetype/internal/ftdebug.h: Replaced FT_CAT and FT_XCAT
+       with a direct solution (which also satisfies picky compilers).
+
+2000-11-28  YAMANO-UCHI Hidetoshi  <mer@din.or.jp>
+
+       * src/truetype/ttobjs.c (TT_Init_Size): Fix #ifdef's to work with
+       disabled interpreter also.
+
+       * src/base/ftnames.c (FT_Get_Sfnt_Name_Count): Fix incorrect
+       parentheses.
+
+2000-11-26  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/cff/t2gload.c (T2_Parse_CharStrings): Added logic to glyph
+       width setting code to take into account even/odd argument counts
+       and glyph width operand before endchar/hmoveto/vmoveto.
+
+2000-11-26  Werner Lemberg  <wl@gnu.org>
+
+       * builds/ansi/ansi.mk: Fix inclusion order of files.
+
+2000-11-26  Keith Packard  <keithp@keithp.com>
+
+       * src/type1/t1objs.c (T1_Init_Face): Compute style flags.
+
+2000-11-26  Werner Lemberg  <wl@gnu.org>
+
+       * builds/compiler/ansi-cc.mk (CLEAN_LIBRARY): Fix rule and
+       conditional.
+
+2000-11-23  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (parse_subrs, parse_charstrings): Use decrypt
+       function from PSAux module.
+
+       * src/type1/t1parse.c (T1_Done_Parse): Renamed to...
+       (T1_Finalize_Parser): New function (to avoid name clash with a
+       function in the PSAux module).
+       (T1_Decrypt): Removed since it is duplicated in the PSAux module.
+       (T1_Get_Private_Dict): Added `psaux' as new parameter; use decrypt
+       function from PSAux module.
+
+       * src/type1/t1parse.h: Adapted.
+
+2000-11-22  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/cff/t2objs.c (T2_Init_Face): For pure CFF fonts, set
+       `root->num_faces' to `cff->num_faces' and set `units_per_EM'
+       to 1000.
+
+       * src/cff/t2parse.c (parse_t2_real): Fixed real number parsing
+       loop.
+
+       * src/cff/t2load.c (T2_Get_String): Called T2_Get_Name with a
+       sid that was off by one.
+
+2000-11-16  David Turner  <david@freetype.org>
+
+       * src/autohint/ahtypes.h (AH_Hinter): Added new fields to control
+       auto-hinting of synthetic Type 1 fonts.
+
+       * src/autohint/ahhint.c (ah_hinter_load, ah_hinter_load_glyph):
+       Added auto-hinting support of synthetic Type 1 fonts.
+
+2000-11-12  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * src/sfnt/ttload.c (TT_LookUp_Table, TT_Load_Generic_Table): Change
+       tracing output.
+
+       * src/sfnt/sfobjs.c (SFNT_Load_Face): Set boolean variable
+       `has-outline' to true only if the font has a `glyf' or `CFF ' table.
+
+2000-11-11  Werner Lemberg  <wl@gnu.org>
+
+       * builds/win32/visualc/freetype.dsp: Fix raster1->raster and
+       type1z->type1.
+
+2000-11-11  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * builds/unix/freetype-config.in, builds/cygwin/freetype-config.in:
+       Added a --libtool option.  When freetype-config --libtool is
+       invoked, the absolute path to the libtool convenience library
+       is returned.
+
+2000-11-11  Werner Lemberg  <wl@gnu.org>
+
+       * builds/cygwin/cygwin-def.in: Same fix as previous.
+
+2000-11-10  Tom Kacvinsky  <tkacvins@freetype.org>
+
+       * builds/unix/unix-def.in: Add
+
+           INSTALL_PROGRAM := @INSTALL_PROGRAM@
+           INSTALL_SCRIPT  := @INSTALL_SCRIPT@
+
+       so that installation of freetype-config does not fail.
+
+2000-11-10  Werner Lemberg  <wl@gnu.org>
+
+       * builds/cygwin/freetype-config.in, builds/unix/freetype-config.in:
+       Move test down for empty --exec-prefix.
+       Fix --version.
+
+       * builds/cygwin/install.mk, builds/unix/install.mk: Use
+       $(INSTALL_SCRIPT) for installation of freetype-config.
+
+       * builds/cygwin/install.mk: Fix clean target names.
+
+2000-11-09  David Turner  <david@freetype.org>
+
+
+       * Version 2.0 released.
+       =======================
+
+----------------------------------------------------------------------------
+
+Copyright 2000, 2001, 2002, 2007 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:
diff --git a/ChangeLog.21 b/ChangeLog.21
new file mode 100644 (file)
index 0000000..d6371d1
--- /dev/null
@@ -0,0 +1,9439 @@
+2005-06-08  Werner Lemberg  <wl@gnu.org>
+
+
+       * Version 2.1.10 released.
+       ==========================
+
+
+       * src/pcf/readme: Renamed to...
+       * src/pcf/README: This.
+
+2005-06-07  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * builds/amiga/*: Added copyright notes, reworked some comments.
+
+2005-06-05  Werner Lemberg  <wl@gnu.org>
+
+       * Add copyright notices to all files which don't have one.
+
+       * docs/license.txt: Renamed to...
+       * docs/LICENSE.TXT: This.
+       * docs/FTL.txt: Renamed to...
+       * docs/FTL.TXT: This.
+       * docs/GPL.txt: Renamed to...
+       * docs/GPL.TXT: This.
+
+       * docs/PATENTS: Slightly reworded.  Suggested by Sylvain Beucler
+       <beuc@gnu.org>.
+
+2005-06-04  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/ftimage.h (FT_Outline_MoveToFunc,
+       FT_Outline_LineToFunc, FT_Outline_ConicToFunc,
+       FT_Outline_CubicToFunc, FT_Raster_RenderFunc),
+       include/freetype/ftrender.h (FT_Glyph_TransformFunc,
+       FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Don't use
+       `const' to stay compatible with FreeType 2.1.9.
+
+2005-06-01  Adam D. Moss  <adam@gimp.org>
+
+       * src/base/ftstroke.c (ft_stroker_inside): Revert `sigma' patch from
+       2004-07-11; this gives much better results under normal
+       circumstances.
+
+2005-05-30  Chia I Wu  <b90201047@ntu.edu.tw>
+
+       * include/freetype/ftbitmap.h (FT_Bitmap_Embolden): Minor
+       documentation improvements.
+
+       * include/freetype/ftoutln.h (FT_Outline_Embolden): Fix typos.
+
+       * src/base/ftbitmap.c (FT_Bitmap_Embolden): Add support for bitmap
+       of pixel_mode FT_PIXEL_MODE_GRAY2 or FT_PIXEL_MODE_GRAY4.
+       If xstr is larger than 8 and bitmap is of pixel_mode
+       FT_PIXEL_MODE_MONO, set xstr to 8 instead of returning error.
+
+2005-05-29  Chia I Wu  <b90201047@ntu.edu.tw>
+
+       * src/base/ftbitmap.c (FT_Bitmap_Embolden): Fix emboldening bitmap
+       of mode FT_PIXEL_MODE_GRAY.  Also add support for mode
+       FT_PIXEL_MODE_LCD and FT_PIXEL_MODE_LCD_V.
+       (ft_bitmap_assure_buffer): FT_PIXEL_MODE_LCD and FT_PIXEL_MODE_LCD_V
+       should have ppb (pixel per byte) 1.
+       Zero the padding when there's no need to allocate memory.
+
+       * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Handle slot->advance
+       too.
+       More suited emboldening strength.
+
+2005-05-28  Chia I Wu  <b90201047@ntu.edu.tw>
+
+       * src/base/ftbitmap.c (FT_Bitmap_Embolden): Handle negative pitch.
+       Handle FT_PIXEL_MODE_GRAY with num_gray != 256.
+       Improve speed for FT_PIXEL_MODE_GRAY.
+       (ft_bitmap_assure_buffer): Accept FT_PIXEL_MODE_LCD and
+       FT_PIXEL_MODE_LCD_V.
+
+2005-05-27  Chia I Wu  <b90201047@ntu.edu.tw>
+
+       * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Initialize `error'.
+
+       * src/base/ftobjs.c (ft_cmap_done_internal): New function.
+       (FT_CMap_Done): Remove cmap from cmap list.
+       (destroy_charmaps, FT_CMap_New): Don't call FT_CMap_Done but
+       ft_cmap_done_internal.
+
+2005-05-26  Werner Lemberg  <wl@gnu.org>
+
+       * docs/GPL.txt: Update postal address of FSF.
+
+2005-05-26  Chia I Wu  <b90201047@ntu.edu.tw>
+
+       * include/freetype/ftbitmap.h (FT_Bitmap_Embolden): Improve
+       documentation.
+
+       * src/base/ftsynth.c (FT_BOLD_THRESHOLD): Removed.
+       (FT_GlyphSlot_Embolden): Check whether slot is bitmap owner.
+       Always modify the metrics.
+
+2005-05-24  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2005-05-24  Chia I Wu  <b90201047@ntu.edu.tw>
+
+       * include/freetype/ftbitmap.h (FT_Bitmap_Embolden): New declaration.
+
+       * include/freetype/ftoutln.h (FT_Outline_Embolden): New declaration.
+
+       * src/base/ftbitmap.c (ft_bitmap_assure_buffer): New auxiliary
+       function.
+       (FT_Bitmap_Embolden): New function.
+
+       * src/base/ftoutln.c (FT_Outline_Embolden): New function.
+
+       * src/base/ftsynth.c: Don't include FT_INTERNAL_CALC_H and
+       FT_TRIGONOMETRY_H but FT_BITMAP_H.
+       (FT_GlyphSlot_Embolden): Use FT_Outline_Embolden or
+       FT_Bitmap_Embolden.
+
+2005-05-24  Werner Lemberg  <wl@gnu.org>
+
+       * configure: Always remove config.mk, builds/unix/unix-def.mk, and
+       builds/unix/unix-cc.mk.  This fixes repeated calls of the script.
+       Reported by Nelson Beebe and Behdad Esfahbod.
+
+       * README.CVS: Mention file permissions.
+
+2005-05-23  Werner Lemberg  <wl@gnu.org>
+
+       * builds/amiga/makefile.os4 (WARNINGS), builds/compiler/gcc-dev.mk
+       (CFLAGS), builds/compiler/gcc.mk (CFLAGS): Remove
+       -fno-strict-aliasing.
+
+       * src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttsbit0.c --
+       it is currently loaded from ttsbit.c.
+
+2005-05-23  Behdad Esfahbod  <behdad@cs.toronto.edu>
+
+       Say you have `(Foo*)x' and want to assign, pass, or return it as
+       `(Bar*)'.  If you simply say `x' or `(Bar*)x', then the C compiler
+       would warn you that type casting incompatible pointer types breaks
+       strict-aliasing.  The solution is to cast to `(void*)' instead which
+       is the generic pointer type, so the compiler knows that it should
+       make no strict-aliasing assumption on `x'.  But the problem with
+       `(void*)x' is that seems like in C++, unlike C, `void*' is not a
+       generic pointer type and assigning `void*' to `Bar*' without a cast
+       causes an error.  The solution is to cast to `Bar*' too, with
+       `(Bar*)(void*)x' as the result -- this is what the patch does.
+
+       * include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP),
+       include/freetype/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): Remove
+       cast on lvalue, use a temporary pointer instead.
+       Cast temporarily to (void*) to not break strict aliasing.
+
+       * include/freetype/internal/ftmemory.h (FT_MEM_ALLOC,
+       FT_MEM_REALLOC, FT_MEM_QALLOC, FT_MEM_QREALLOC, FT_MEM_FREE),
+       src/base/ftglyph.c (FT_Glyph_To_Bitmap): Cast temporarily to (void*)
+       to not break strict aliasing.
+
+       * src/base/ftinit.c (FT_USE_MODULE): Fix wrong type information.
+
+       * builds/unix/configure.ac (XX_CFLAGS): Remove -fno-strict-aliasing.
+
+2005-05-23  David Turner  <dturner@freetype.org>
+
+       Fix Savannah bug #12213 (incorrect behaviour of the cache sub-system
+       in low-memory conditions).
+
+       * include/freetype/cache/ftccache.h (FTC_CACHE_TRYLOOP,
+       FTC_CACHE_TRYLOOP_END): New macros.
+
+       * src/cache/ftccache.c (FTC_Cache_NewNode), src/cache/ftcsbits.c
+       (ftc_snode_compare): Use FT_CACHE_TRYLOOP and FTC_CACE_TRYLOOP_END.
+
+2005-05-23  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/rules.mk (BASE_SRC): Don't add ftsynth.c here but...
+       (BASE_EXT_SRC): Here.
+
+2005-05-22  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftrfork.c (raccess_guess_apple_generic): Mark
+       `version_number' and `entry_length' as unused.
+       (raccess_guess_linux_double_from_file_name): Remove `memory'.
+       (raccess_make_file_name): Mark `error' as unused.
+
+       * src/bdf/bdflib.c (_bdf_parse_properties): Remove `memory'.
+
+       * src/cid/cidobjs.c (cid_face_init): Remove `psnames'.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Remove `memory'.
+
+       * src/truetype/ttgxvar.c (ft_var_readpackedpoints,
+       ft_var_readpackeddeltas, ft_var_load_avar): Mark `error' as unused.
+
+       * src/base/rules.mk (BASE_SRC): Add ftsynth.c.
+
+2005-05-21  David Turner  <david@freetype.org>
+
+       * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Fix a bug that
+       produced unpleasant artefacts when trying to embolden very sharp
+       corners.
+
+2005-05-20  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2005-05-20  Chia I Wu  <b90201047@ntu.edu.tw>
+
+       * src/base/ftbitmap.c: Don't include FT_FREETYPE_H and FT_IMAGE_H
+       but FT_BITMAP_H.
+       (FT_Bitmap_Copy): New function (from ftglyph.c).
+
+       * include/freetype/ftbitmap.h (FT_Bitmap_Copy): New public
+       definition.
+
+       * src/base/ftglyph.c: Include FT_BITMAP_H.
+       (ft_bitmap_copy): Move to ftbitmap.c.
+       (ft_bitmap_glyph_init): Remove `memory' variable.
+       Create new bitmap object if FT_GLYPH_OWN_BITMAP isn't set.
+       (ft_bitmap_glyph_copy): Use FT_Bitmap_Copy.
+       (ft_bitmap_glyph_done): Use FT_Bitmap_Done.
+       (ft_outline_glyph_init): Use FT_Outline_Copy.
+
+       * src/base/ftoutln.c (FT_Outline_Copy): Handle source == target.
+       (FT_Outline_Done_Internal): Check for valid `memory' pointer.
+       (FT_Outline_Translate, FT_Outline_Reverse, FT_Outline_Render,
+       FT_Outline_Transform): Check for valid `outline' pointer.
+
+       * src/base/ftobjs.c (FT_New_GlyphSlot): Prepend glyph slot to
+       face->glyph, otherwise a new second glyph slot cannot be created.
+       (FT_Done_GlyphSlot): Fix memory leak.
+       (FT_Open_Face): Updated -- face->glyph is already managed by
+       FT_New_GlyphSlot.
+
+       * src/type42/t42objs.c (T42_GlyphSlot_Done): Updated.
+
+2005-05-20  Kirill Smelkov  <kirr@mns.spb.ru>
+
+       * include/freetype/ftimage.h (FT_Raster_Params),
+       include/freetype/ftoutln.h (FT_Outline_Translate,
+       FT_Outline_Transform), src/base/ftoutln.c (FT_Outline_Translate,
+       FT_Outline_Transform): Decorate parameters with `const' where
+       appropriate.
+       Update all callers.
+
+       * src/raster/ftraster.c (ft_black_reset), src/smooth/ftgrays.c
+       (gray_raster_reset): Remove `const' from `pool_base' argument.
+
+2005-05-18  Kirill Smelkov  <kirr@mns.spb.ru>
+
+       * src/raster/ftmisc.h: New file.  Only needed if ftraster.c is
+       compiled as stand-alone.
+
+       * src/raster/ftraster.c: Add comment how to compile as stand-alone.
+       s/FT_CONFIG_OPTION_STATIC_RASTER/FT_STATIC_RASTER/.
+       s/TT_STATIC_RASTER/FT_STATIC_RASTER/.
+       [_STANDALONE_]: Include ftimage.h and ftmisc.h.
+       (FT_TRACE1, FT_TRACE6, ft_memset, FT_MEM_ZERO): Define
+       conditionally.
+       (Render_Glyph, Render_Gray_Glyph): Return Raster_Err_None (or
+       Raster_Err_Unsupported).
+       (ft_black_new) [_STANDALONE_]: Fix type of `the_raster'.
+       (ft_black_init, ft_black_reset, ft_black_set_mode, ft_black_render):
+       Use `ras', not `raster'.
+       (ft_black_done): Use FT_UNUSED_RASTER.
+       (Horizontal_Sweep_Init, Horizontal_Sweep_Step,
+       Horizontal_Gray_Sweep_Span): Use FT_UNUSED_RASTER.
+
+2005-05-18  Werner Lemberg  <wl@gnu.org>
+
+       * docs/announce: Start updating.
+
+       * docs/CHANGES: Updated.
+
+2005-05-16  Vitaliy Pasternak  <v_a_pasternak@mail.ru>
+
+       * builds/win32/visualc/freetype.vcproj: Updated.
+       Exclude debug info for `Release' versions to reduce library size.
+
+2005-05-16  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftobjs.c (FT_Open_Face): Make it work as documented, this
+       is, ignore `aface' completely if face_index < 0.  Reported by David
+       Osborn <spam@habitualhiatus.com>.
+
+2005-05-16  Kirill Smelkov  <kirr@mns.spb.ru>
+
+       * include/freetype/ftimage.h (FT_Outline_MoveToFunc,
+       FT_Outline_LineTo_Func, FT_Outline_ConicToFunc,
+       FT_Outline_CubicToFunc), src/smooth/ftgrays.c (gray_render_conic,
+       gray_render_cubic, gray_move_to, gray_line_to, gray_conic_to,
+       gray_cubic_to, gray_render_span, gray_sweep): Decorate parameters
+       with `const' where appropriate.
+
+2005-05-11  Kirill Smelkov  <kirr@mns.spb.ru>
+
+       * include/freetype/ftimage.h (FT_Raster_RenderFunc),
+       include/freetype/ftrender.h (FT_Glyph_TransformFunc,
+       FT_Renderer_Render_Func, FT_Renderer_TransformFunc),
+       src/base/ftglyph.c (ft_outline_glyph_transform),
+       src/raster/ftrend1.c (ft_raster1_transform, ft_raster1_render),
+       src/smooth/ftgrays.c (FT_Outline_Decompose, gray_raster_render),
+       src/smooth/ftsmooth.c (ft_smooth_transform,
+       ft_smooth_render_generic, ft_smooth_render, ft_smooth_render_lcd,
+       ft_smooth_render_lcd_v): Decorate parameters with `const' where
+       appropriate.
+
+       * src/raster/ftraster.c (RASTER_RENDER_POOL): Removed.  Obsolete.
+       (ft_black_render): Decorate parameters with `const' where
+       appropriate.
+
+2005-05-11  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttcmap.c (tt_cmap4_set_range): Fix typo (FT_PEEK_SHORT ->
+       FT_PEEK_USHORT) which caused crashes.  Reported by Ismail Donmez
+       <ismail@kde.org.tr>.
+
+2005-05-08  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/ftserv.h (FT_FACE_FIND_GLOBAL_SERVICE)
+       [__cplusplus]: Fix typo.
+
+2005-05-07  Werner Lemberg  <wl@gnu.org>
+
+       Handle unsorted SFNT type 4 cmaps correctly (reported by Dirck
+       Blaskey <listtarget@danbala.com>).
+
+       * src/sfnt/ttcmap.h (TT_CMap): Add member `unsorted'.
+       * src/sfnt/ttcmac.c: Use SFNT_Err_Ok where appropriate.
+
+       (tt_cmap0_validate, tt_cmap2_validate, tt_cmap6_validate,
+       tt_cmap8_validate, tt_cmap10_validate, tt_cmap12_validate): Use
+       `FT_Error' as return type.
+       (tt_cmap4_validate): Use `FT_Error' as return type.
+       Return error code for unsorted cmap.
+       (tt_cmap4_char_index, tt_cmap4_char_next): Use old code for unsorted
+       cmaps.
+       (tt_face_build_cmaps): Set `unsorted' variable in cmap.
+
+2005-05-07  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttpload.c (tt_face_get_location): Fix typo.
+
+2005-05-06  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffobjs.c (cff_face_init): Set ppem value in top
+       dictionary for SFNT-based CFF.
+
+2005-05-05  Werner Lemberg  <wl@gnu.org>
+
+       Handle malformed `loca' table entries.
+
+       * docs/TODO: Add some bugs which should be fixed.
+
+       * include/freetype/internal/tttypes.h (TT_FaceRec): Add `glyf_len'
+       element.
+
+       * src/truetype/ttpload.c (tt_face_load_loca): Get length of `glyf'
+       table.
+       (tt_face_get_location): Fix computation of `asize' for malformed
+       `loca' entries.
+
+2005-05-01  David Turner  <david@freetype.org>
+
+       * Jamfile: Remove `otvalid' from the list of compiled modules.
+
+       * include/freetype/internal/ftserv.h: Add compiler pragmas to get
+       rid of annoying warnings with Visual C++ compiler in maximum warning
+       mode.
+
+       * src/autofit/afhints.c, src/autofit/aflatin.c, src/base/ftstroke.c,
+       src/bdf/bdfdrivr.c, src/cache/ftcbasic.c, src/cache/ftccmap.c,
+       src/cache/ftcmanag.c, src/cff/cffload.c, src/cid/cidload.c,
+       src/lzw/zopen.c, src/otvalid/otvgdef.c, src/pcf/pcfread.c,
+       src/sfnt/sfobjs.c, src/truetype/ttgxvar.c: Remove compiler warnings.
+
+2005-04-28  Werner Lemberg  <wl@gnu.org>
+
+       * docs/TODO: Updated.
+
+2005-04-24  Werner Lemberg  <wl@gnu.org>
+
+       * src/otvalid/otvcommn.c
+       (otv_GSUBGPOS_have_MarkAttachmentType_flag): Handle table == 0.
+
+2005-04-16  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffobjs.c (cff_face_init): Set default upem value in top
+       font dict also.
+       Handle font matrix settings in subfonts.
+
+       * src/cff/cffgload.c (cff_slot_load): Use the correct font matrix
+       for CID-keyed fonts with subfonts.
+
+       * docs/formats.txt: Updated.
+
+2005-04-14  Kirill Smelkov  <kirr@mns.spb.ru>
+
+       * include/freetype/freetype.h (FT_Vector_Transform),
+       include/freetype/ftimage.h (FT_Raster_Params),
+       include/freetype/ftoutln.h, src/base/ftoutln.c (FT_Outline_Get_CBox,
+       FT_Outline_Copy, FT_Outline_Transform, FT_Vector_Transform,
+       FT_Outline_Get_Bitmap), src/raster/ftraster.c (ft_black_render),
+       src/smooth/ftgrays.c (gray_raster_render): Decorate parameters with
+       `const' where appropriate.
+
+2005-04-14  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (parse_charstrings): Catch this non-standard
+       beginning of the /CharStrings dictionary:
+
+         /CharStrings 118 dict def
+         Private begin
+         CharStrings begin
+
+       * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Fix arguments
+       to call of tt_sbit_decoder_load_bitmap.
+
+2005-04-13  Werner Lemberg  <wl@gnu.org>
+
+       * docs/TODO: Updated.
+
+       * autogen.sh: Use `--force' for all commands.
+
+2005-04-09  Werner Lemberg  <wl@gnu.org>
+
+       * src/pshinter/pshalgo.c (ps_hints_apply): Change scaling values
+       only if `fitted' is not zero.
+
+2005-04-06  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgload.c (tt_face_get_metrics) [FT_OPTIMIZE_MEMORY]:
+       Fix typo which sometimes causes wrong metrics for the last glyph.
+
+2005-04-04  David Turner  <david@freetype.org>
+
+       * devel/ftoption.h, include/freetype/config/ftoption.h
+       (FT_OPTIMIZE_MEMORY): Comment out this macro for the upcoming 2.1.10
+       release.
+       (*_CHESTER_*): Removed.  No longer used.
+
+       * src/autofit/afhints.c (af_axis_hints_new_segment,
+       af_axis_hints_new_edge): Small tweak to use less heap memory.
+
+2005-04-03  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1parse.c (T1_New_Parser): Relax the check for a valid
+       first line in the font.
+
+2005-04-03  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES, include/freetype/freetype.h: Improve documentation
+       of FT_Set_Pixel_Sizes and FT_Set_Char_Size.
+
+2005-03-26  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * builds/amiga/src/base/ftsystem.c (ft_amiga_stream_io): Fix buffer
+       offsets after a large read.
+
+2005-03-26  Werner Lemberg  <wl@gnu.org>
+
+       * src/autofit/afglobal.c (af_face_globals_get_metrics):
+       s/index/gidx/.
+
+       * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Fix compiler
+       warnings.
+
+       * src/sfnt/rules.mk (SFNT_DRV_SRC): Add ttsbit0.c.
+
+       * src/sfnt/ttsbit0.h: Dummy file for build with `make'.
+
+2005-03-26  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       Update of the Amiga port.
+
+       * builds/amiga/makefile, builds/amiga/makefile.os4,
+       builds/amiga/smakefile: Included the base extension files
+       (ftbitmap.c, ftotval.c, ftpfr.c, ftstroke.c, ftxf86.c).
+
+2005-03-25  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       Update of the Amiga port.
+
+       * builds/amiga/makefile, builds/amiga/smakefile: Handle new modules.
+
+       * builds/amiga/makefile.os4: Makefile for AmigaOS4 SDK.
+
+       * builds/amiga/README: Updated.
+
+       * builds/amiga/include/freetype/config/ftconfig.h: Handle gcc for
+       AmigaOS4.
+
+       * builds/amiga/include/freetype/config/ftmodule.h: Handle new
+       modules.
+
+       * builds/amiga/src/base/ftdebug.c: Updated to current version of
+       default ftdebug.c.
+       Add various include files and macros to have proper support for
+       both AmigaOS4 and older AmigaOS versions.
+       Don't declare KVPrintF explicitly.
+       Replace getenv with GetVar.
+       Actually enable debugging code.
+
+       * builds/amiga/src/base/ftsystem.c: Major rewrite.
+
+2005-03-23  Werner Lemberg  <wl@gnu.org>
+
+       * tests/*: Removed.
+
+2005-03-23  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES, docs/INSTALL.ANY: Updated.
+
+       * include/freetype/ftmoderr.h: Replace `Autohint' with `Autofit'.
+       Add `OTvalid'.
+
+       * src/autofit/aferrors.h: New file.
+
+       * src/autofit/afglobal.c, src/autofit/afhints.c,
+       src/autofit/aflatin.c, src/autofit/afloader.c: s/FT_Err_/AF_Err_/.
+       Include aferrors.h.
+
+       * src/autofit/rules.mk (AUTOF_DRV_H): Include aferrors.h.
+
+       * src/otvalid/otverror.h: s/FT_Mod_Err_OTV/FT_Mod_Err_OTvalid/.
+
+2005-03-22  David Turner  <david@freetype.org>
+
+       * src/autohint/*: Removed.
+       * Jamfile: Updated.
+
+2005-03-15  David Turner  <david@freetype.org>
+
+       * src/bdf/bdflib.c: Remove compiler warnings.
+       (hash_rehash, hash_init): Don't call FT_MEM_ZERO.
+       (_bdf_list_t): Add `memory' field.
+       (_bdf_list_init, _bdf_list_done, _bdf_list_ensure): New functions.
+       (_bdf_shift, _bdf_join): Rename to...
+       (_bdf_list_shift, _bdf_list_join): This.
+       (_bdf_split): Renamed to...
+       (_bdf_list_split): This.  Use new functions.
+       (bdf_internal_readstream): Removed.
+       (NO_SKIP): New macro.
+       (_bdf_readstream): Rewritten.
+       (bdf_create_property, _bdf_add_comment): Improve allocation.
+       (_bdf_set_default_spacing, _bdf_parse_glyphs): Updated.  Improve
+       allocation.
+       (_bdf_parse_properties, _bdf_parse_start): Updated.
+       (bdf_load_font): Updated to use new functions.
+
+       * src/type1/t1parse.c (check_type1_format): New function.
+       (T1_New_Parser): Use it to check font header before allocating
+       anything on the heap.
+
+       * src/type42/t42parse.c (t42_parser_init): Modify functions to check
+       the font header before allocating anything on the heap.
+
+       * include/freetype/internal/ftmemory.h (FT_ARRAY_MAX,
+       FT_ARRAY_CHECK): New macros.
+
+       * src/base/ftstream.c (FT_Stream_TryRead): New function.
+       * include/freetype/internal/ftstream.h: Updated.
+
+       * src/pcf/pcfread.c (pcf_read_TOC), src/pcf/pcfutil.c
+       (BitOrderInvert, TwoByteSwap, FourByteSwap): Minor fixes and
+       simplifications.  Try to protect the PCF driver from doing stupid
+       things with broken fonts.
+
+       * src/lzw/ftlzw.c (FT_Stream_OpenLZW): Check the LZW header before
+       doing anything else.  This avoids unnecessary heap allocations
+       (400KByte of heap memory for the LZW decoder).
+
+       * src/gzip/ftgzip.c (FT_Stream_OpenGZip): Ditto for the gzip
+       decoder, although the code savings are smaller.
+
+       * docs/CHANGES: Updated.
+
+2005-03-10  David Turner  <david@freetype.org>
+
+       * src/tools/glnames.py: Add comment to explain the compression
+       being used for the Adobe Glyph List.
+
+2005-03-10  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttpload.c (tt_face_load_cvt, tt_face_load_fpgm):
+       Fix serious typo which prevented correct TT rendering.
+
+       * include/freetype/internal/ftmemory.h: Undo change from 2005-03-03.
+       To suppress warnings it is sufficient to use `-fno-strict-aliasing'.
+
+2005-03-10  Werner Lemberg  <wl@gnu.org>
+
+       * src/tools/glnames.py: Formatted.
+       Format output to be in sync with other FreeType code.
+       Import `re' and `os.path'.
+       (StringTable) <__init__>: Add parameter to initialize master table
+       name.
+       (StringTable) <dump>: Don't pass master table name.
+       (StringTable) <dump_sublist>: Emit explanatory comment.
+       Simplify and make output more human readable.
+       (t1_bias, glyph_list, adobe_glyph_names): Removed.  Unused.
+       (main): Use `basename' for file name in header.
+
+       * src/psnames/pstables.h: Regenerated.
+
+2005-03-09  David Turner  <david@freetype.org>
+
+       * src/tools/glnames.py: Rewrite the generator for the `pstables.h'
+       header file which contains various constant tables related to glyph
+       names.  It now uses a different, more compact storage scheme that
+       saves about 20KB.  This also closes Savannah bug #12262.
+
+       * src/psnames/pstables.h: Regenerated.
+
+       * src/psnames/psmodule.c (ps_unicode_value): Use
+       `ft_get_adobe_glyph_index', a new function defined in `pstables.h'.
+       (ps_get_macintosh_name, ps_get_standard_strings): Updated.
+
+       * src/base/ftobjs.c (FT_Set_Char_Sizes): Handle fractional sizes
+       more carefully.  This fixes Savannah bug #12263.
+
+2005-03-06  David Turner  <david@freetype.org>
+
+       * src/otvalid/otvgsub.c, src/otvalid/otvgpos.c: Make static tables
+       constant.
+
+       * src/autofit/aflatin.c (af_latin_metrics_init): Fix Savannah bug
+       #12212 (auto-hinter refuses to work if no Unicode charmap in font).
+
+2005-03-05  Werner Lemberg  <wl@gnu.org>
+
+       * autogen.sh: New script for bootstrapping.
+
+       * README.CVS: New file which documents bootstrapping.
+
+       * builds/unix/aclocal.m4, builds/unix/config.guess,
+       builds/unix/config.sub, builds/unix/configure,
+       builds/unix/ltmain.sh: Removed.
+
+2005-03-04  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftutil.c: Include FT_INTERNAL_OBJECTS_H.
+
+2005-03-03  Werner Lemberg  <wl@gnu.org>
+
+       Various fixes for C and C++ compiling.
+
+       * src/autofit/*: Add copyright messages.
+
+       * src/autofit/afhints.c (af_glyph_hints_done): Don't use
+       `AF_Dimension' but `int' for loop counter.
+
+       * src/autofit/aflatin.c (af_latin_metrics_init_widths): Don't use
+       `AF_Dimension' but `int' for loop counter.
+       Use proper enumeration value for `render_mode'.
+       (af_latin_metrics_scale_dim): Don't shadow variables.
+       (af_latin_hints_compute_segments): Use proper cast for `major_dir'
+       and `segment_dir'.
+       (af_latin_align_linked_edge, af_latin_hint_edges): Fix arguments of call to
+       `af_latin_compute_stem_width'.
+       (af_latin_hints_apply): Don't use `AF_Dimension' but `int' for loop
+       counter.
+
+       * src/base/ftdbgmem.c (ft_mem_table_get_source, FT_DumpMemory): Use
+       proper cast for memory allocation.
+
+       * src/cff/cffdrivr.c (cff_get_kerning): Use proper cast for
+       initialization of `sfnt'.
+
+       * src/sfnt/sfdriver.c: Include `ttkern.h'.
+
+       * src/sfnt/ttkern.c (tt_face_get_kerning): Don't shadow variables.
+
+       * src/truetype/ttgload.c: Include `ttpload.h'.
+
+2005-03-03  David Turner  <david@freetype.org>
+
+       * include/freetype/internal/ftmemory.h (FT_ALLOC, FT_REALLOC,
+       FT_QALLOC, FT_QREALLOC) [gcc >= 3.3]: Provide macro versions which
+       avoid compiler warnings.
+       (FT_NEW, FT_NEW_ARRAY, FT_RENEW_ARRAY, FT_QNEW, FT_QNEW_ARRAY,
+       FT_QRENEW_ARRAY, FT_ALLOC_ARRAY, FT_REALLOC_ARRAY): Updated.
+
+       * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE,
+       FT_FACE_FIND_GLOBAL_SERVICE, FT_FACE_LOOKUP_SERVICE) [__cplusplus]:
+       Provide macro versions which avoid compiler warnings.
+
+       * src/base/ftutil.c (ft_highpow2): New utility function.
+
+       * include/freetype/internal/ftobjs.h: Updated.
+
+       * src/pfr/pfrload.c (pfr_get_gindex, pfr_compare_kern_pairs,
+       pfr_sort_kerning_pairs): Don't define if FT_OPTIMIZE_MEMORY is set.
+       (pfr_phy_font_done): Don't handle `kern_pairs' if FT_OPTIMIZE_MEMORY
+       is set.
+       (pfr_phy_font_load): Don't call `pfr_sort_kerning_pairs' if
+       FT_OPTIMIZE_MEMORY is set.
+
+       * src/pfr/pfrobjs.c (pfr_slot_load): Comment out some code which
+       doesn't work with broken fonts.
+       (pfr_face_get_kerning) [FT_OPTIMIZE_MEMORY]: Implement.
+
+       * src/pfr/pfrtypes.h (PFR_KernItemRec): Optimize member types.
+       (PFR_NEXT_KPAIR): New macro.
+       (PFR_PhyFontRec): Don't define `kern_pairs' if FT_OPTIMIZE_MEMORY is
+       set.
+
+       * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Introduce
+       temporary variable to avoid gcc warning.
+       (tt_face_load_sbit_image): Mark unused variables with FT_UNUSED.
+
+       * src/truetype/ttpload.c (tt_face_load_loca) [FT_OPTIMIZE_MEMORY]:
+       Remove redundant variable.
+
+       * include/freetype/config/ftmodule.h: Moving the order of drivers to
+       speed up font loading.  The PCF and BDF loaders are still slow and
+       consume far too much memory.
+
+2005-03-03  Werner Lemberg  <wl@gnu.org>
+
+       * devel/ftoption.h: Updated to recent changes.
+
+2005-03-02  Werner Lemberg  <wl@gnu.org>
+
+       * src/autofit/afdummy.c, src/autofit/afdummy.h
+       (af_dummy_script_class): Fix type.
+
+       * src/autofit/aflatin.c, src/autofit/aflatin.h
+       (af_latin_script_class): Fix type.
+
+       * src/autofit/rules.mk (AUTOF_DRV_SRC): Fix typo.
+
+2005-03-01  David Turner  <david@freetype.org>
+
+       * src/sfnt/ttkern.c (tt_face_load_kern, tt_face_get_kerning),
+       src/sfnt/ttsbit0.c (tt_face_load_sbit_strikes,
+       tt_sbit_decoder_load_byte_aligned, tt_sbit_decoder_load_compound,
+       tt_sbit_decoder_load_image), src/sfnt/ttload.c
+       (tt_face_load_metrics): Remove compiler warnings
+       -- redundant variables, missing initializations, etc.
+
+       * src/sfnt/ttsbit.h: Handle FT_OPTIMIZE_MEMORY.
+
+       * src/autofit/rules.mk, src/autofit/module.mk,
+       src/autofit/afangles.h: New files.
+
+       * src/autofit/afhints.c (af_axis_hints_new_segment,
+       af_axis_hints_new_edge): New functions.
+       (af_glyph_hints_done): Do proper deallocation.
+       (af_glyph_hints_reload): Only reallocate points array.  This
+       drastically reduces heap usage.
+
+       * src/autofit/afhints.h (AF_PointRec, AF_SegmentRec): Optimize
+       member types and positions.
+       (AF_AxisHintsRec): Add `max_segments' and `max_edges'.
+       (af_axis_hints_new_segment, af_axis_hints_new_edge): New prototypes.
+
+       * src/autofit/aflatin.c (af_latin_metricsc_scale): Don't call
+       AF_SCALER_EQUAL_SCALES.
+       (af_latin_hints_compute_segments): Change return type to FT_Error.
+       Update all callers.
+       Improve segment allocation.
+       (af_latin_hints_compute_edges): Change return type to FT_Error.
+       Update all callers.
+       Improve edge allocation and link handling.
+       (af_latin_hints_detect_features): Change return type to FT_Error.
+       Update all callers.
+
+       * src/autofit/aflatin.h: Updated.
+
+       * src/autofit/afloader.c (af_loader_load_g)
+       <FT_GLYPH_FORMAT_OUTLINE>: Assure axis->num_edges > 1.  This fixes
+       a bug with certain fonts.
+
+       * include/freetype/config/ftmodule.h: The auto-fitter is now the
+       only supported auto-hinting module.
+
+       * include/freetype/config/ftstdlib.h (FT_INT_MAX): New macro.
+
+2005-02-28  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttpload.c (tt_face_load_loca): Fix typo.
+
+       * src/sfnt/ttkern.c: Include `ttkern.h'.
+       (FT_COMPONENT): Updated.
+
+       * include/freetype/internal/fttrace.h: Add entry for `ttkern'.
+
+       * src/sfnt/ttsbit0.c: s/FT_Err_/SFNT_Err_/.
+       Decorate constants with `U' and `L' where necessary.
+
+       * src/sfnt/ttcmap.c (tt_cmap4_next): Remove unused variable.
+
+2005-02-28  David Turner  <david@freetype.org>
+
+       * src/base/ftdbgmem.c (FT_DumpMemory): Added sorting of memory
+       sources according to decreasing maximum cumulative allocations.
+       (ft_mem_source_compare): New auxiliary function.
+
+       * src/sfnt/ttsbit0.c: New file, implementing a heap-optimized
+       embedded bitmap loader.
+
+       * src/sfnt/ttsbit.c: Include `ft2build.h', FT_INTERNAL_DEBUG_H,
+       FT_INTERNAL_STREAM_H, FT_TRUETYPE_TAGS_H.
+       Load `ttsbit0.c' if FT_OPTIMIZE_MEMORY is set, otherwise use
+       file contents.
+       (tt_face_load_sbit_strikes): Set up root fields to indicate the
+       strikes.  This fixes Savannah bug #12107.
+       Use `static' keyword for `sbit_line_metrics_field',
+       `strike_start_fields', `strike_end_fields'.
+
+       * include/freetype/internal/tttypes.h (TT_FaceRec): Define
+       `sbit_table', `sbit_table_size', `sbit_num_strikes' if
+       FT_OPTIMIZE_MEMORY is set.
+       Don't define `num_sbit_strikes' and `sbit_strikes' if
+       FT_OPTIMIZE_MEMORY is set.
+
+       * src/cff/cffobjs.c (sbit_size_reset): Handle FT_OPTIMIZE_MEMORY.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Fixed bug that prevented
+       loading SFNT fonts without a `kern' table.
+       Properly pass root->face_flags.
+       Remove code for TT_CONFIG_OPTION_EMBEDDED_BITMAPS.
+
+       * src/sfnt/sfdriver.c (sfnt_interface)
+       [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: Don't use `tt_find_sbit_image'
+       and `tt_load_sbit_metrics'.
+
+       * src/sfnt/ttcmap.c: Optimize linear charmap scanning for Format 4.
+       (OPT_CMAP4): New macro.
+       (TT_CMap4Rec) [OPT_CMAP4]: New structure.
+       (tt_cmap4_init, tt_cmap4_set_range, tt_cmap4_next, tt_cmap4_reset)
+       [OPT_CMAP4]: New functions.
+       (tt_cmap4_char_next) [OPT_CMAP4]: Use `tt_cmap4_next' and
+       `tt_cmap4_reset'.
+       (tt_cmap4_class_rec) [OPT_CMAP4]: Use `TT_CMap4Rec' and
+       `tt_cmap4_init'.
+
+       * src/truetype/ttobjs.c (Reset_SBit_Size): Handle
+       FT_OPTIMIZE_MEMORY.
+
+       * src/autofit/afhints.h (AF_PointRec, AF_SegmentRec, AF_EdgeRec):
+       Optimize member types.
+
+       * src/autofit/afloader.c (af_loader_done): Call
+       `af_glyph_hints_done'.
+
+2005-02-27  David Turner  <david@freetype.org>
+
+       * src/sfnt/ttkern.c (tt_face_load_kern): Fix a small bug which
+       caused invalid (random) return values for the horizontal kerning.
+
+2005-02-25  David Turner  <david@freetype.org>
+
+       Implement several memory optimizations to drastically reduce the
+       heap usage of FreeType, especially in the case of memory-mapped
+       files.  The idea is to avoid loading and decoding tables in the
+       heap, and instead access the raw data whenever possible (i.e., when
+       it doesn't compromise performance).
+
+       This has several benefits: For example, opening vera.ttf now uses
+       just a small amount of memory (even when the FT_Library footprint is
+       accounted for), until you start loading glyphs.  Even then, you save
+       at least 20KB compared to the non-optimized case.  Performance of
+       various operations, including open and close, has also been
+       dramatically improved.
+
+       More optimizations to come, especially for the auto-hinter.
+
+       * include/freetype/internal/sfnt.h (TT_Face_GetKerningFunc): New
+       function type.
+       (SFNT_Interface): Add it.
+
+       * include/freetype/internal/tttypes.h (TT_HdmxEntryRec, TT_HdmxRec,
+       TT_Kern0_PairRec): Don't define if FT_OPTIMIZE_MEMORY is set.
+       (TT_FaceRec): Define `horz_metrics', `horz_metrics_size',
+       `vert_metrics', `vert_metrics_size', `hdmx_table',
+       `hdmx_table_size', `hdmx_record_count', `hdmx_record_size',
+       `hdmx_record_sizes', `kern_table', `kern_table_size,
+       `num_kern_tables', `kern_avail_bits', `kern_order_bits' if
+       FT_OPTIMIZE_MEMORY is set.
+       Don't define `hdmx', `num_kern_pairs', `kern_table_index',
+       `kern_pairs' if FT_OPTIMIZE_MEMORY is set.
+
+       * src/base/ftdbgmem.c (ft_mem_table_set): Don't shadow variable.
+       Fix compiler warning.
+
+       * src/cff/cffdrivr.c (Get_Kerning): Renamed to...
+       (cff_get_kerning): This.  Simplify.
+       (cff_driver_class): Updated.
+
+       * src/sfnt/Jamfile (_sources): Add `ttkern'.
+       * src/sfnt/rules.mk (SFNT_DRV_SRC): Add `ttkern.c'.
+
+       * src/sfnt/sfdriver.c (sfnt_interface): Add `tt_face_get_kerning'.
+
+       * src/sfnt/sfnt.c: Include `ttkern.c'.
+
+       * src/sfnt/sfobjs.c: Include `ttkern.h'.
+       (sfnt_load_face): Consider the `kern' and `gasp' table as optional.
+       (sfnt_done_face): Call `tt_face_done_kern'.
+       Handle horizontal metrics for FT_OPTIMIZE_MEMORY.
+
+       * src/sfnt/ttkern.c, src/sfnt/ttkern.h: New files.  Code has been
+       taken from `ttload.c' and `ttload.h'.
+       Provide special versions of `tt_face_load_kern',
+       `tt_face_get_kerning', and `tt_face_done_kern' for
+       FT_OPTIMIZE_MEMORY.
+
+       * src/sfnt/ttload.c (tt_face_load_metrics, tt_face_load_hdmx,
+       tt_face_free_hdmx): Provide version for FT_OPTIMIZE_MEMORY.
+       (tt_face_load_kern, tt_kern_pair_compare, TT_KERN_INDEX): Moved to
+       `ttkern.c'.
+
+       * src/sfnt/ttload.h: Updated.
+
+       * src/sfnt/ttsbit.c (sbit_metrics_field): Add `static' keyword.
+
+       * src/truetype/ttdriver.c (Get_Kerning): Renamed to...
+       (tt_get_kerning): This.  Simplify.
+       (tt_driver_class): Updated.
+
+       * src/truetype/ttgload.c (TT_Get_Metrics): Renamed to...
+       (tt_face_get_metrics): This.  Provide version for FT_OPTIMIZE_MEMORY.
+       Update all callers.
+       (Get_Advance_Widths): Replaced with...
+       (Get_Advance_WidthPtr): This.  Provide version for
+       FT_OPTIMIZE_MEMORY.
+       Update all callers.
+
+       * src/truetype/ttgload.h: Updated.
+
+2005-02-22  David Turner  <david@freetype.org>
+
+       * src/base/ftdbgmem.c: Partly rewritten.  Added the ability to list
+       all allocation sites in the memory debugger.  Also a new function
+       FT_DumpMemory() was added.  It is only available in builds with
+       FT_DEBUG_MEMORY defined, and you must declare it in your own code to
+       use it, i.e., with something like:
+
+         extern void FT_DumpMemory( FT_Memory );
+
+         ...
+
+         FT_DumpMemory( memory );
+
+       * include/freetype/config/ftoption.h
+       (TT_CONFIG_OPTION_BYTECODE_INTERPRETER): Comment out definition --
+       again.
+       (FT_OPTIMIZE_MEMORY): New configuration macro to control various
+       optimizations for reducing the heap footprint of memory-mapped
+       TrueType files.
+
+       * include/freetype/internal/ftmemory.h (FT_ARRAY_ZERO): New
+       convenience macro.
+
+       * include/freetype/internal/tttypes.h (TT_FaceRec)
+       [FT_OPTIMIZE_MEMORY]: Use optimized types for `num_locations' and
+       `glyph_locations'.
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Call
+       `tt_face_get_location'.
+
+       * src/truetype/ttobjs.c (tt_face_init)
+       [FT_CONFIG_OPTION_INCREMENTAL]: Improve error handling.
+       (tt_face_done): Call `tt_face_done_loca'.
+
+       * src/truetype/ttpload.c (tt_face_get_location, tt_face_done_loca):
+       New functions.  If FT_OPTIMIZE_MEMORY is set, the locations table is
+       read directly from memory-mapped streams, instead of being decoded
+       into the heap.
+       (tt_face_load_loca) [FT_OPTIMIZE_MEMORY]: New implementation.
+       (tt_face_load_cvt, tt_face_load_fpgm): Only load table if the
+       bytecode interpreter is compiled in.
+
+       * src/truetype/ttpload.h: Updated.
+
+       * src/autohint/ahglyph.c (ah_outline_load): Improve allocation
+       logic.
+
+2005-02-20  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/ltmain.sh: Regenerated with `libtoolize --force
+       --copy' from libtool 1.5.14.
+       * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from
+       automake 1.9.4.
+
+       * builds/unix/config.guess, builds/unix/config.sub: Updated from
+       `config' CVS module at subversions.gnu.org.
+
+       * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from
+       `texinfo' CVS module at subversions.gnu.org.
+
+2005-02-14  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffcmap.c (cff_cmap_unicode_init): Don't try to build
+       a cmap for a CID-keyed font which doesn't have SIDs.
+
+2005-02-13  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (read_binary_data): Return more meaningful
+       value.
+       (parse_encoding, parse_subrs, parse_charstrings, parse_dict): Check
+       parser error value after call to T1_Skip_PS_Token (where necessary).
+
+       * src/type1/t1parse.c (T1_Get_Private_Dict): Check parser error
+       value after call to T1_Skip_PS_Token.
+
+       * src/cid/cidparse.c (cid_parser_new): Check parser error value
+       after call to cid_parser_skip_PS_token.
+
+       * src/type42/t42parse.c (t42_parse_encoding, t42_parse_sfnts,
+       t42_parse_charstrings, t42_parse_dict): Check parser error value
+       after call to T1_Skip_PS_Token (where necessary).
+
+       * src/psaux/psobjc.c (skip_string, ps_parser_skip_PS_token,
+       ps_tobytes): Add error messages.
+
+2005-02-12  Werner Lemberg  <wl@gnu.org>
+
+       * configure: Output more variables to the created Makefile so that
+       it can be used for ft2demos also (if the FT2DEMOS variable is
+       defined).
+
+2005-02-10  David Turner  <david@freetype.org>
+
+       * src/pfr/pfrgload.c (pfr_glyph_load): Fix an unbounded growing
+       dynamic array when loading a glyph from a PFR font (Savannah bug
+       #11921).
+
+       * src/base/ftbitmap.c (FT_Bitmap_Convert): Small improvements to the
+       conversion function (mainly stupid optimization).
+
+       * src/base/Jamfile: Adding ftbitmap.c to the list of compiled files.
+
+2005-02-10  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/freetype-config.in: Add new flag `--ftversion' to
+       return the FreeType version.  Suggested by George Williams
+       <gww@silcom.com>.
+
+       * docs/CHANGES: Updated.
+
+2005-02-09  Werner Lemberg  <wl@gnu.org>
+
+       * src/otvalid/otvmod.c (otv_validate): Deallocate arrays in case
+       of error.  Reported by YAMANO-UCHI Hidetoshi <mer@din.or.jp>.
+
+2005-02-08  Werner Lemberg  <wl@gnu.org>
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings)
+       <op_closepath>: Accept `T1_Parse_Have_Moveto' state also which can
+       happen in empty glyphs.  Reported by Ian Brown
+       <ian.brown@printsoft.de> (Savannah bug #11856).
+
+2005-02-04  Werner Lemberg  <wl@gnu.org>
+
+       * src/otlayout/*: Removed.  Obsolete.
+
+2004-12-28  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/ltmain.sh: Regenerated with `libtoolize --force
+       --copy' from libtool 1.5.10.
+       * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from
+       automake 1.9.4.
+       * builds/unix/configure: Regenerated with autoconf 2.59b.
+
+       * builds/unix/config.guess, builds/unix/config.sub: Updated from
+       `config' CVS module at subversions.gnu.org.
+
+       * builds/unix/install-sh: Updated from
+       `texinfo' CVS module at subversions.gnu.org.
+
+       * builds/unix/ftsystem.c (FT_Stream_Open): Add proper cast for
+       ft_alloc.
+       Fix compiler warning.
+
+2004-12-27  Dirck Blaskey  <listtarget@danbala.com>
+
+       * src/cff/cffobjs.c (cff_face_init): Improve computation of
+       FT_STYLE_BOLD_FLAG.
+
+2004-12-27  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffobjs.c (cff_face_init): A CFF within an SFNT can have
+       only a single font.  This is undocumented but has been verified on
+       the opentype list.
+
+2004-12-26  Werner Lemberg  <wl@gnu.org>
+
+       * Jamfile (FT2_COMPONENTS): Add `otvalid'.
+
+2004-12-25  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftbitmap.c (FT_Bitmap_Convert): Fix compiler warning.
+
+2004-12-15  Werner Lemberg  <wl@gnu.org>
+
+       * vms_make.com: Add ftbitmap.obj.
+
+2004-12-14  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftbitmap.c, include/freetype/ftbitmap.h: New files for
+       handling various bitmap formats.
+
+       * include/freetype/config/ftheader.h (FT_BITMAP_H): New macro.
+
+       * src/base/rules.mk (BASE_EXT_SRC): Add ftbitmap.c.
+
+       * src/bdf/bdfdrivr.c (BDF_Glyph_Load): Don't convert bitmaps to 8bpp
+       but return them as-is.
+
+       * docs/CHANGES: Mention new bitmap API.
+       * include/freetype/ftchapter.s: Updated.
+
+2004-12-11  Robert Clark  <freetype@ratty.org.uk>
+
+       * src/base/ftobjs.c (FT_Get_Kerning): Make kerning amount
+       dependent on ppem by scaling down for ppem < 25, then do normal
+       rounding.  This gives slightly better results than rounding towards
+       zero.
+
+2004-12-09  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftobjs.c (FT_Get_Kerning): Always round towards zero
+       for FT_KERNING_DEFAULT.  This greatly enhances the kerning for
+       small ppem values.
+
+2004-12-08  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftobjs.c (ft_glyphslot_clear): Reset `lsb_delta' and
+       `rsb_delta'.
+
+2004-12-05  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/install.mk (install): Use $(OBJ_BUILD) for ftconfig.h.
+
+2004-12-03  Antoine Leca  <Antoine-Freetype@Leca-Marti.org>
+
+       * include/freetype/ttnameid.h: Updated to latest
+       specifications from Microsoft.
+
+2004-11-26  Jouk Jansen  <joukj@hrem.stm.tudelft.nl>
+
+       * vms_make.com: Include ftbbox.c.
+       Fix `ccopt'.
+       Handle `otvalid' module.
+       Update `vmslib.dat' default values.
+       Fixes to `libs.opt'.
+
+2004-11-23  Anders Kaseorg  <anders@kaseorg.com>
+
+       * src/base/ftoutln.c (FT_OrientationExtremumRec,
+       ft_orientation_extremum_compute): Removed.
+       (FT_Outline_Get_Orientation): Rewritten, simplified.
+
+       * src/autohint/ahglyph.c: Include FT_OUTLINE_H.
+       (ah_test_extremum, ah_get_orientation): Removed.
+       (ah_outline_load): Use FT_Outline_Get_Orientation.
+
+       * src/base/ftsynth.c (ft_test_extrama, ft_get_orientation): Removed.
+       (FT_GlyphSlot_Embolden): Use FT_Outline_Get_Orientation.
+
+2004-11-23  Fernando Papa  <fpapa@netgate.com.uy>
+
+       * src/truetype/ttinterp.h: Fix typo.
+
+2004-11-22  Antoine Leca  <Antoine-Freetype@Leca-Marti.org>
+
+       * builds/win32/detect.mk: Corrected logic that detects Windows NT to
+       use the previous change even if win32 is forced.  Corrected
+       detection of win32 on Win9X.
+
+       * builds/dos/detect.mk: Added same correction as for win32 about
+       COPY on Windows NT.  Detection of plain DOS 7.x.
+
+2004-11-22  Werner Lemberg  <wl@gnu.org>
+
+       * builds/detect.mk: Undo change from 2004-11-20.
+       * builds/win32/detect.mk: If the `OS' environment variable contains
+       `Windows_NT', use `cmd.exe /c copy' for copying files.
+
+2004-11-20  Werner Lemberg  <wl@gnu.org>
+
+       * builds/detect.mk (dos_setup): Use `cmd.exe' for copying
+       $(CONFIG_MK) to force lowercase file name under Windows.
+
+2004-11-19  Werner Lemberg  <wl@gnu.org>
+
+       Fix a serious bug in the TT hinter.
+
+       * src/truetype/ttgload.c (TT_Process_Simple_Glyph): Don't shift
+       points vertically before hinting.
+
+       * docs/CHANGES: Updated.
+
+       * src/cache/ftcglyph.c (FTC_GNode_UnselectFamily,
+       FTC_GCache_Lookup): A new try to fix comparison with zero.
+
+2004-11-16  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/configure.ac: Add `-fno-strict-aliasing' if gcc is
+       used.
+       * builds/unix/configure: Regenerated.
+       * builds/unix/config.guess, builds/unix/config.sub: Updated from
+       `config' CVS module at subversions.gnu.org.
+
+2004-11-16  Dr. Martin P.J. Zinser  <zinser@decus.de>
+
+       * src/cache/ftcglyph.c (FTC_GNode_UnselectFamily,
+       FTC_GCache_Lookup): Fix comparison with zero.
+
+       * docs/INSTALL.VMS: Updated.
+
+       * vms_make.com: Updated.  All `descrip.mms' files are now created
+       automatically.
+
+       * src/*/descrip.mms: Removed.
+
+2004-11-16  Owen Taylor  <otaylor@redhat.com>
+
+       * builds/unix/freetype-config.in: Suppress -L$libdir for
+       /usr/lib64 as well as /usr/lib.  (Reported by Dan Winship -
+       https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=139199)
+
+2004-11-11  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffdrivr.c (cff_service_ps_info): Updated.
+       * src/cid/cidriver.c (cid_service_ps_info): Updated.
+       * src/type42/t42drivr.c (t42_ps_get_font_private): New function.
+       (t42_service_ps_info): Updated.
+
+       * src/type42/t42parse.c (t42_parse_dict): Remove compiler warning.
+
+2004-11-11  David Bevan  <dbevan@emtex.com>
+
+       Add new function FT_Get_PS_Font_Private().
+
+       * include/freetype/internal/services/svpsinfo.h
+       (PS_GetFontPrivateFunc): New service function.
+
+       * include/freetype/t1tables.h, src/base/fttype1.c
+       (FT_Get_PS_Font_Private): New function.
+
+       * src/type1/t1driver.c (t1_ps_get_font_private): New function.
+       (t1_service_ps_info): Updated.
+
+2004-10-13  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/config/ftstdlib.h: Include `stddef.h'.
+       (ft_ptrdiff_t): Define.
+
+       * include/freetype/fttypes.h (FT_PtrDist): Use `ft_ptrdiff_t'.
+
+       * src/cid/cidload.c (cid_parse_dict), src/type1/t1load.c
+       (parse_dict): Fix compiler warning.
+
+2004-10-11  Joshua Neal  <jneal@csdaily.com>
+
+       * src/sfnt/ttcmap.c (tt_face_build_cmaps): Check for pointer
+       overflow.
+
+       * src/sfnt/ttload.c (tt_face_load_hdmx): Protect against bad input.
+       Don't use FT_QNEW_ARRAY but FT_NEW_ARRAY to make deallocation work
+       in case of failure.
+
+       * src/sfnt/ttsbit.c (Load_SBit_Range): Check range intervals.
+       (tt_face_load_sbit_strikes): Allocate `strike_sbit_ranges' after
+       frame test.
+
+       * src/truetype/ttgload.c (TTLoad_Simple_Glyph): Add assertion for
+       `flag'.
+
+2004-10-09  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2004-10-09  Boris Letocha  <b.letocha@cz.gmc.net>
+
+       Fix handling of NPUSHW if skipped in data stream.
+
+       * src/truetype/ttinterp.c (opcode_length): Set value for NPUSHW
+       to -2.
+       (SkipCode, TT_RunIns): Use opcode_length value for computation of
+       bytes to be skipped.
+
+2004-09-10  Jouk Jansen  <joukj@hrem.stm.tudelft.nl>
+
+       * vms_make.com: Updated.
+
+2004-09-09  Werner Lemberg  <wl@gnu.org>
+
+       Adding OpenType validation module.  The code is based on the
+       (unfinished) `otlayout' module but has been heavily modified to make
+       it much more compact.
+
+       * src/otvalid/*: New module.
+
+       * include/freetype/ftotval.h, src/base/ftotval.c,
+       include/freetype/internal/services/svotval.h: New files.
+
+       * include/freetype/config/ftmodule.h: Add otv_module_class.
+       * include/freetype/config/ftheader.h (FT_OPENTYPE_VALIDATE_H): New
+       macro.
+       * include/freetype/internal/ftserv.h
+       (FT_SERVICE_OPENTYPE_VALIDATE_H): New macro.
+       * include/freetype/internal/fttrace.h (otvmodule, otvcommon,
+       otvbase, otvgdef, otvgpos, otvgsub, otvjstf): New trace components.
+
+       * include/freetype/ftchapters.h: Updated.
+
+       * src/base/Jamfile (Library), src/base/descrip.mms (OBJS),
+       src/base/rules.mk (BASE_EXT_SRC): Updated.
+
+       * docs/CHANGES: Updated.
+
+2004-09-08  Werner Lemberg  <wl@gnu.org>
+
+       * src/tools/docmaker/sources.py (re_source_block_format2) <column>:
+       Use lookahead assertion to not match `*/'.  This removes spurious
+       insertions of `/' in the HTML output.
+
+2004-09-07  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgxvar.c (TT_Vary_Get_Glyph_Deltas): Fix call to
+       FT_NEW_ARRAY.
+
+2004-09-04  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/ftobjs.h: Don't include
+       FT_CONFIG_STANDARD_LIBRARY_H.
+       (FT_Validator, FT_ValidationLevel, FT_ValidatorRec, FT_VALIDATOR,
+       ft_validator_init, ft_validator_run, ft_validator_error, FT_INVALID,
+       FT_INVALID_TOO_SHORT, FT_INVALID_OFFSET, FT_INVALID_FORMAT,
+       FT_INVALID_GLYPH_ID, FT_INVALID_DATA): Move to...
+
+       * include/freetype/internal/ftvalid.h: New file.
+       Make FT_INVALID return module-specific error codes.
+
+       * include/freetype/internal/internal.h (FT_INTERNAL_VALIDATE_H): New
+       macro.
+
+       * include/freetype/fterrors.h: Undefine FT_ERR_PREFIX only if
+       FT_KEEP_ERR_PREFIX isn't defined.
+
+       * src/base/ftobjs.c: Include FT_INTERNAL_VALIDATE_H.
+
+       * src/sfnt/ttcmap.h: Don't include FT_INTERNAL_OBJECTS_H but
+       FT_INTERNAL_VALIDATE_H.
+
+       * src/sfnt/ttcmap.c: Don't include FT_INTERNAL_OBJECTS_H but
+       FT_INTERNAL_VALIDATE_H.
+       Include sferrors.h before FT_INTERNAL_VALIDATE_H.
+       s/FT_Err_Ok/SFNT_Err_Ok/.
+
+       * src/sfnt/sferrors.h: Define FT_KEEP_ERR_PREFIX.
+
+       * src/type1/t1afm.c: Include t1errors.h.
+
+2004-09-03  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftdebug.c (ft_debug_init): Highest debug level is 7,
+       not 6.
+       * docs/DEBUG: Updated.
+
+2004-08-30  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/tttags.h (TTAG_BASE, TTAG_GDEF, TTAG_GPOS,
+       TTAG_JSTF): New tags.
+
+       * include/freetype/fttypes.h (FT_Bytes, FT_Tag): New typedefs.
+       (FT_Int): Add `signed'.
+
+2004-08-29  Werner Lemberg  <wl@gnu.org>
+
+       * src/otlayout/otlgpos.c (otl_gpos_subtable_validate): Add argument
+       to pass number of lookups.
+       Update all callers.
+       Don't call otl_lookup_list_validate but otl_lookup_validate.
+       (otl_gpos_validate): Call otl_lookup_list_validate instead of
+       otl_gpos_subtable_validate.
+
+       * src/otlayout/otlgpos.h: Updated.
+
+       * src/otlayout/otljstf.c (otl_jstf_max_validate): Add argument to
+       pass number of lookups.
+       Update all callers.
+
+
+       * src/cff/cffparse.c (cff_parse_real): s/exp/exponent/ to avoid
+       compiler warning.
+
+
+       * src/sfnt/ttcmap0.c, src/sfnt/ttcmap0.h: Renamed to...
+       * src/sfnt/ttcmap.c, src/sfnt/ttcmap.h: This.
+       * src/sfnt/Jamfile, src/sfnt/rules.mk, src/sfnt/sfdriver.c,
+       src/sfnt/sfnt.c, src/sfnt/sfobjs.c: Updated.
+
+
+       * builds/compiler/gcc-dev.mk (CFLAGS): Don't add `-Wnested-externs'
+       if compiler is g++ (v3.3.3 emits a warning otherwise).
+
+2004-08-28  Werner Lemberg  <wl@gnu.org>
+
+       * src/otlayout/otlgpos.c (otl_value_length): Return number of bytes,
+       not number of 16bit entities.
+       (otl_gpos_lookup2_validate): Check class definition tables for
+       format 2.
+       Fix loop for format 2.
+       (otl_liga_mark2_validate): Fix offset for otl_anchor_validate.
+
+2004-08-27  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftmac.c: Don't include truetype/ttobjs.h.
+       Don't include type1/t1objs.h.
+       (FT_New_Face_From_FSSpec) [!__MWERKS__]: Remove compiler warnings.
+
+2004-08-27  Mathieu Malaterre  <mathieu@malaterre.com>
+
+       * src/base/ftmac.c: Handle OS_INLINE for xlc compiler also.
+
+2004-08-27  Werner Lemberg  <wl@gnu.org>
+
+       * src/otlayout/otlayout.h: Add copyright.
+       (OTL_INVALID_OFFSET): Removed.
+
+       * src/otlayout/otlgdef.h: Include otlayout.h.
+       Comment out inclusion of otltable.h.
+
+       * src/otlayout/otlgpos.c (otl_gpos_lookup4_validate): Fix call
+       to otl_base_array_validate.
+       (otl_liga_mark2_validate): Fix `for' loop.
+
+       * src/otlayout/otlgsub.c (otl_ligature_validate): Check `glyph_id',
+       not components array.
+
+       * src/otlcommn.c (otl_lookup_get_count, otl_feature_get_count):
+       Comment out.
+       (otl_lookup_list_get_count, otl_feature_list_get_count): Activate.
+       (otl_feature_list_validate, otl_gsubgpos_get_lookup_count):
+       s/otl_lookup_get_count/otl_lookup_list_get_count/.
+       (otl_script_list_validate):
+       s/otl_feature_get_count/otl_feature_list_get_count/.
+       (otl_script_validate): Call otl_lang_validate for default language.
+
+       * src/otlayout/otlcommn.h: Updated.
+
+2004-08-16  Werner Lemberg  <wl@gnu.org>
+
+       * src/otlayout/otlgpos.c (otl_gpos_lookup1_validate,
+       otl_gpos_lookup2_validate, otl_gpos_lookup3_validate,
+       otl_gpos_lookup4_validate, otl_gpos_lookup5_validate,
+       otl_gpos_lookup6_validate, otl_gpos_lookup9_validate,
+       otl_gpos_validate): Update
+       function arguments.
+       (otl_gpos_lookup7_validate, otl_gpos_lookup8_validate): Update
+       function arguments.
+       Handle NULL offsets correctly.
+       Check sequence and lookup indices for format 3.
+       (otl_pos_rule_validate, otl_chain_pos_rule_validate): Add argument
+       to pass lookup count.
+       Check sequence and glyph indices.
+       (otl_gpos_subtable_validate): Update function arguments.
+       Update callers.
+
+       * src/otlayout/otlgpos.h: Updated.
+
+       * src/otlayout/otlgsub.c (otl_gsub_lookup1_validate,
+       otl_gsub_lookup3_validate, otl_gsub_lookup8_validate): Update
+       function arguments.
+       Add glyph index checks.
+       (otl_sequence_validate, otl_alternate_set_validate,
+       otl_ligature_validate): Add argument to pass glyph count.
+       Update callers.
+       Add glyph index check.
+       (otl_gsub_lookup2_validate, otl_gsub_lookup4_validate): Update
+       function arguments.
+       (otl_ligature_set_validate): Add argument to pass glyph count.
+       Update caller.
+       (otl_sub_class_rule_validate,
+       otl_sub_class_rule_set_validate): Removed.
+       (otl_sub_rule_validate, otl_chain_sub_rule_validate): Add argument
+       to pass lookup count.
+       Update callers.
+       Add lookup index check.
+       (otl_sub_rule_set_validate, otl_chain_sub_rule_set_validate): Add
+       argument to pass lookup count.
+       Update callers.
+       (otl_gsub_lookup5_validate): Update function arguments.
+       Handle NULL offsets correctly.
+       Don't call otl_sub_class_rule_set_validate but
+       otl_sub_rule_set_validate.
+       Check sequence and lookup indices for format 3.
+       (otl_gsub_lookup6_validate): Update function arguments.
+       Handle NULL offsets correctly.
+       Check sequence and lookup indices for format 3.
+       (otl_gsub_lookup7_validate, otl_gsub_validate): Update function
+       arguments.
+
+       * src/otlayout/otlgsub.h: Updated.
+
+       * src/otlayout/otlbase.c (otl_base_validate): Handle NULL offsets
+       correctly.
+
+       * src/otlayout/otlcommn.c (otl_class_definition_validate): Fix
+       compiler warning.
+       (otl_coverage_get_first, otl_coverage_get_last): New functions.
+       (otl_lookup_validate): Add arguments to pass lookup and glyph
+       counts.
+       Update callers.
+       (otl_lookup_list_validate): Add argument to pass glyph count.
+       Update callers.
+
+       * src/otlayout/otlcommn.h: Updated.
+
+       * src/otlayout/otljstf.c (otl_jstf_extender_validate,
+       otl_jstf_max_validate, otl_jstf_script_validate,
+       otl_jstf_priority_validate, otl_jstf_lang_validate): Add parameter
+       to validate glyph indices.
+       Update callers.
+       (otl_jstf_validate): Add parameter which specifies number of glyphs
+       in font.
+
+       * src/otlayout/otljstf.h: Updated.
+
+2004-08-15  Werner Lemberg  <wl@gnu.org>
+
+       * src/otlayout/otlgpos.c (otl_liga_mark2_validate): Add parameter
+       to handle possible NULL values properly.
+       Update all callers.
+
+2004-08-15  Werner Lemberg  <wl@gnu.org>
+
+       * src/otlayout/gpos.c: Rename counting variables to be more
+       meaningful.
+       Add copyright.
+       (otl_liga_attach_validate): Renamed to...
+       (otl_liga_mark2_validate): This.
+       Update all callers.
+       (otl_mark2_array_validate): Removed.
+       (otl_gpos_lookup6_validate): Call otl_liga_mark2_validate, not
+       otl_mark2_array_validate.
+       (otl_pos_class_set_validate, otl_pos_class_rule_validate): Removed.
+       (otl_gpos_lookup7_validate): Complete code for format 2.
+       (otl_chain_pos_class_rule_validate,
+       otl_chain_pos_class_set_validate): Removed.
+       (otl_gpos_lookup8_validate): Don't call
+       otl_chain_pos_class_set_validate but
+       otl_chain_pos_rule_set_validate.
+       Simplify some code.
+
+       * src/otlayout/otlgpos.h: Add copyright.
+
+2004-08-14  Werner Lemberg  <wl@gnu.org>
+
+       * src/otlayout/otljstf.c (otl_jstf_gsub_mods_validate): Removed.
+       (otl_jstf_gpos_mods_validate): Renamed to...
+       (otl_jstf_gsubgpos_mods_validate): This.
+       Test whether lookup_count is zero.
+       (otl_jstf_priority_validate): Use otl_jstf_gsubgpos_mods_validate.
+       (otl_jstf_validate): Initialize gsub_lookup_count and
+       gpos_lookup_count if gsub or gpos is zero.
+
+       * src/otlayout/otlgsub.c: Rename counting variables to be more
+       meaningful.
+       Add copyright.
+       (otl_gsub_lookup1_validate): Simplify code.
+       (otl_gsub_lookup2_validate, otl_gsub_lookup3_validate,
+       otl_gsub_lookup4_validate, otl_gsub_lookup7_validate): Remove unused
+       variables.
+       (otl_gsub_lookup5_validate): Remove unused variable.
+       Fix call to otl_sub_rule_set_validate and
+       otl_sub_class_rule_set_validate.
+       (otl_chain_sub_class_rule_validate,
+       otl_chain_sub_class_set_validate): Removed.
+       (otl_gsub_lookup6_validate): Remove unused variable.
+       Fix call to otl_chain_sub_rule_set_validate.
+       (otl_gsub_lookup7_validate): Handle lookup type 8 also.
+       (otl_gsub_lookup8_validate: New function.
+       (otl_gsub_lookup1_apply, otl_gsub_lookup2_apply,
+       otl_gsub_lookup3_apply): Commented out.
+       (otl_gsub_validate_funcs): Add otl_gsub_lookup7_validate and
+       otl_gsub_lookup8_validate.
+       (otl_gsub_validate): Updated.
+
+       * src/otlayout/otlgsub.h: Add copyright.
+
+       * src/otlayout/otlcommn.c, src/otlayout/otlcommn.h
+       (otl_coverage_get_index): Comment out.
+
+2004-08-13  Werner Lemberg  <wl@gnu.org>
+
+       * src/otlayout/otlcommn.c (otl_gsubgpos_get_lookup_count): New
+       function.
+       * src/otlayout/otlcommn.h: Updated.
+
+       * src/otlayout/otlbase.c: Rename counting variables to be more
+       meaningful.
+       Add copyright message.
+       * src/otlayout/otlbase.h: Add copyright message.
+
+       * src/otlayout/otlgdef.c: Rename counting variables to be more
+       meaningful.
+       Add copyright message.
+       Use OTL_CHECK everywhere.
+       (otl_caret_value_validate): Remove unused variable.
+       (otl_gdef_validate): All tables are optional.
+       * src/otlayout/otlgdef.h: Add copyright message.
+
+       * src/otlayout/otljstf.c: Rename counting variables to be more
+       meaningful.
+       Add copyright message.
+       (otl_jstf_gsub_mods_validate, otl_jstf_gpos_mods_validate): Add
+       parameter to pass lookup count.
+       Update all callers.
+       Check lookup array.
+       (otl_jstf_max_validate):
+       s/otl_gpos_subtable_check/otl_gpos_subtable_validate/.
+       (otl_jstf_priority_validate, otl_jstf_lang_validate,
+       otl_jstf_script_validate): Add two parameters to pass lookup counts.
+       Update all callers.
+       (otl_jstf_validate): Add two parameters to pass GPOS and GSUB
+       table offsets; use otl_gsubgpos_get_lookup_count to convert extract
+       lookup counts.
+       Fix typo.
+       * src/otlayout/otljstf.h: Updated.
+       Add copyright message.
+
+       * src/otlayout/otlgpos.c (otl_gpos_subtable_validate): New function.
+       (otl_gpos_validate): Use it.
+       * src/otlayout/otlgpos.h: Updated.
+
+2004-08-13  Werner Lemberg  <wl@gnu.org>
+
+       * src/otlayout/otcommn.c: Use OTL_CHECK everywhere.
+       (otl_coverage_validate): Initialize `p',
+       s/count/num_glyphs/.
+       s/start_cover/start_coverage/.
+       (otl_coverage_get_index): Return OTL_Long, not OTL_Int.
+       Remove unused variables.
+       (otl_class_definition_validate): s/count/num_glyphs/.
+       Remove unused variables.
+       (otl_class_definition_get_value, otl_device_table_get_start,
+       otl_device_table_get_end, otl_device_table_get_delta,
+       otl_lookup_get_table, otl_lookup_list_get_count,
+       otl_lookup_list_get_lookup, otl_lookup_list_get_table,
+       otl_feature_get_lookups, otl_feature_list_get_count,
+       otl_feature_list_get_feature, otl_lang_get_count,
+       otl_lang_get_req_feature, otl_lang_get_features): Commented out
+       temporarily until we really need it.
+       (otl_lookup_validate): Removed.
+       (otl_lookup_table_validate): Renamed to ...
+       (otl_lookup_validate): This.  Update callers.
+       (otl_lookup_list_validate): Remove already commented out definition
+       and move the other definition up.
+       (otl_feature_validate): Add parameter to pass number of lookups.
+       Update callers.
+       Check lookup indices.
+       (otl_feature_list_validate): Add parameter to pass lookup table.
+       Update callers.
+       (otl_lang_validate): Add parameter to pass number of features.
+       Update callers.
+       Handle req_feature and check feature indices.
+       (otl_script_validate): Add parameter to pass number of features.
+       Update callers.
+       (otl_script_list_validate): Add parameter to pass feature table.
+       Update callers.
+
+       * src/otlayout/otcommn.h: s/LOCALDEF/LOCAL/.
+       Comment out the same functions as in otcommn.c.
+       (otl_script_list_get_script): Removed.
+
+       * src/otlayout/otlgsub.c (otl_gsub_lookup1_apply): Change `index' to
+       type OTL_Long.
+       (otl_gsub_lookup2_apply, otl_gsub_lookup3_apply): Change `index' to
+       type OTL_Long.
+       Fix test.
+       (otl_gsub_validate): Fix order of validation.
+
+       * src/otlayout/otlgpos.c (otl_gpos_validate): Fix order of
+       validation.
+
+2004-08-12  Werner Lemberg  <wl@gnu.org>
+
+       Make otlayout module compile (without actually working).
+
+       * src/otlayout/*: s/OTL_Valid/OTL_Validator/.
+       s/NULL/0/.
+
+       * src/otlayout/otlayout.h: Fix various typos.
+       (OTL_Bool): New typedef.
+       (OTL_Int, OTL_Long, OTL_Int16, OTL_Int32): Use `signed' keyword.
+       (OTL_Err_InvalidArgument): Removed.
+       (OTL_Err_InvalidData, OTL_Err_InvalidSize): New enum values.
+       (OTL_MAKE_TAG): Add missing parenthesis.
+       (OTL_INVALID_DATA): Use OTL_Err_InvalidData.
+       (OTL_INVALID_TOO_SHORT): Use OTL_Err_InvalidSize.
+       (OTL_INVALID_FORMAT, OTL_INVALID_OFFSET): New macros.
+
+       * src/otlayout/otlgpos.c: s/FT_/OTL_/.
+       s/OTL_Short/OTL_Int16/.
+       (otl_gpos_pairset_validate): Add return type.
+       (otl_base_array_validate): Fix call to otl_anchor_validate.
+       (otl_liga_array_validate): Fix call to otl_liga_attach_validate.
+       (otl_gpos_lookup5_validate): Fix typos.
+       (otl_gpos_lookup6_validate): Fix call to otl_mark2_array_validate.
+       (otl_gpos_lookup7_validate): Comment out unfinished code.
+       Fix typos.
+
+       * src/otlayout/otlgsub.c: Add forward declaration for
+       otl_gsub_validate_funcs.
+       (otl_gsub_lookup1_apply, otl_gsub_lookup2_apply,
+       otl_gsub_lookup3_apply): Fix call to otl_parser_check_property.
+       s/otl_coverage_lookup/otl_coverage_get_index/.
+       (otl_ligature_validate): Add missing variable declaration.
+       (otl_sub_rule_validate): Fix typo.
+       (otl_sub_class_rule_validate): Add missing variable declaration.
+       Fix typo.
+       (otl_gsub_lookup5_validate): Fix typo.
+       (otl_gsub_lookup6_validate): Fix call to
+       otl_chain_sub_class_set_validate.
+       (otl_gsub_validate_funcs): Don't use `const'.
+
+       * src/otlayout/otlcommn.c (otl_class_definition_get_value,
+       otl_device_table_validate, otl_device_table_get_delta,
+       otl_lookup_validate, otl_script_validate): Add missing
+       variable declarations.
+       (otl_lookup_list_validate): Comment out first definition.
+       (otl_lookup_list_foreach, otl_feature_list_foreach): Comment out.
+       (otl_feature_list_validate):
+       s/otl_feature_table_validate/otl_feature_validate/.
+       (otl_script_list_validate):
+       s/otl_script_table_validate/otl_script_validate/.
+
+       * src/otlayout/otlcommn.h: Comment out first declaration.
+       (otl_lookup_list_foreach, otl_feature_list_foreach): Comment out.
+
+       * src/otlayout/otlbase.c (otl_base_coord_validate): Fix call to
+       otl_device_table_validate.
+       (otl_base_script_validate): Add missing variable declarations.
+       (otl_base_script_list_validate): Fix call to
+       otl_base_script_validate.
+       (otl_axis_table_validate): Fix calls to otl_base_tag_list_validate
+       and otl_base_script_list_validate.
+       (otl_base_validate): Fix calls to otl_axis_table_validate.
+
+       * src/otlayout/otlgdef.c (otl_attach_list_validate): Fix call to
+       otl_attach_point_validate.
+       (otl_caret_value_validate): Add missing variable declaration.
+       Fix call to otl_device_table_validate.
+       (otl_ligature_glyph_validate): Fix call to otl_caret_value_validate.
+       (otl_ligature_caret_list_validate): Fix call to
+       otl_ligature_glyph_validate.
+       (otl_gdef_validate): Fix calls to otl_class_definition_validate,
+       otl_attach_list_validate, otl_ligature_caret_list_validate, and
+       otl_class_definition_validate.
+
+       * src/otlayout/otltable.h (otl_table_validate, otl_table_init,
+       otl_table_set_script): Comment out.
+
+       * src/otlayout/otlparse.h (OTL_ParserRec):
+       s/OTL_Alternate/OTL_GSUB_Alternate/.
+       (OTL_ParseError): Add OTL_Err_Parser_Memory and
+       OTL_Err_Parser_Internal.
+       (otl_parser_error): Fix typo.
+       (otl_parser_check_property): Remove third argument.
+
+       * src/otlayout/otlparse.c (otl_string_ensure):
+       s/OTL_Parse_Err_Memory/OTL_Err_Parser_Memory/.
+       (OTL_STRING_ENSURE, otl_parser_error, otl_parser_get_index,
+       otl_parser_replace_1, otl_parser_replace_n): Fix typos.
+       (OTL_PARSER_UNCOVERED): Removed.
+       (otl_parser_check_property): Remove third argument.
+
+       * src/otlayout/otljstf.c (otl_jstf_priority_validate): Add missing
+       variable declaration.
+
+       * src/otlayout/otlutils.h (OTL_MEM_REALLOC): Fix typo.
+
+2004-08-11  Danny  <dannyboynow@yahoo.com>
+
+       * src/base/ftstream.c (FT_Stream_Close): Don't reset stream->close
+       to NULL.  This allows custom close functions to delete the FT_STREAM
+       object.
+
+2004-08-11  Werner Lemberg  <wl@gnu.org>
+
+       Add API to get information about SFNT tables.
+
+       * include/freetype/internal/services/svsfnt.h
+       (FT_SFNT_Table_Info_Func): New typedef.
+       (SFNT_Table): Add it.
+
+       * src/base/ftobjs (FT_Sfnt_Table_Info): New function.
+
+       * include/freetype/tttables.h: Updated.
+
+       * src/sfnt/sfdriver.c (sfnt_table_info): New function.
+       (sfnt_service_sfnt_table): Add it.
+
+       * docs/CHANGES: Updated.
+
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 10.
+
+       * builds/unix/configure.ac (version_info): Set to 9:8:3.
+       * builds/unix/configure: Updated.
+
+       * builds/win32/visualc/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/.
+
+       * builds/freetype.mk (refdoc), README, Jamfile (RefDoc):
+       s/2.1.9/2.1.10/.
+
+       * docs/CHANGES, docs/VERSION.DLL: Updated.
+
+2004-08-11  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * src/base/ftrfork.c (FT_Raccess_Guess)
+       [!FT_CONFIG_OPTION_GUESSING_EMBEDDED_FORK]: Remove compiler
+       warnings.
+
+2004-08-06  Adam Piotrowski  <st_intel@poczta.onet.pl>
+
+       * src/pfr/pfrload.c (pfr_sort_kerning_pairs): Single-byte
+       adjustments are unsigned, not signed.
+
+2004-08-05  David Turner  <david@freetype.org>
+
+       `Activate' gray-scale specifing hinting within the TrueType
+       bytecode interpreter.  This is an experimental feature which
+       should probably be made optional.
+
+       * src/truetype/ttgload.c (TT_Process_Simple_Glyph,
+       load_truetype_glyph): Move the code to set the pedantic_hinting flag
+       to...
+       (TT_Load_Glyph): Here.
+       Set `grayscale' flag except for `FT_LOAD_TARGET_MONO'.
+
+       * src/truetyep/ttinterp.c (Ins_GETINFO): Return MS rasterizer
+       version 1.7.
+       Return rotation and stretching info only if glyph is rotated or
+       stretched, respectively.
+       Handle grayscale info.
+
+       * src/truetype/ttinterp.h (TT_ExecContextRec): Add `grayscale'
+       member.
+
+2004-08-02  George Williams  <gww@silcom.com>
+
+       * src/base/ftobjs.c (FT_Attach_File): Initialize `open.stream'.
+
+2004-08-01  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2004-08-01  George Williams  <gww@silcom.com>
+
+       FreeType now can read kerning values from PFM files.
+
+       * src/type1/t1afm.c (T1_Done_AFM): Renamed to...
+       (T1_Done_Metrics): This.
+       Update all callers.
+       (T1_Read_AFM): Make it static.
+       Don't enter and leave a frame.
+       (LITTLE_ENDIAN_USHORT, LITTLE_ENDIAN_UINT): New macros.
+       (T1_Read_PFM): New function.
+       (T1_Read_Metrics): New higher-level function to be used instead of
+       T1\1fRead_AFM.
+       Update all callers.
+
+2004-07-31  Werner Lemberg  <wl@gnu.org>
+
+       * src/pcf/pcfread (pcf_load_font), src/bdf/bdfdrivr.c
+       (BDF_Face_Init), src/truetype/ttgxvar (TT_Get_MM_Var,
+       tt_face_vary_cvt): Fix compiler warnings.
+
+2004-07-26  Søren Sandmann  <sandmann@daimi.au.dk>
+
+       * src/pcf/pcfread.c (pcf_interpret_style): Always allocate memory for
+       face->style_name.
+       * src/pcf/pcfdrivr.c (PCF_Face_Done): Free `style_name'.
+
+2004-07-26  Darren J Longhorn  <darren.longhorn@redcom.co.uk>
+
+       * include/freetype/config/ftconfig.h (FT_SIZEOF_LONG): Recognize
+       five-byte `long' (which is avoided then).
+
+2004-07-25  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * src/pcf/pcfdrivr.c (PCF_Set_Pixel_Size): Compare heights, not
+       ppem values.
+       (PCF_Set_Point_Size): Don't call PCF_Set_Pixel_Size but provide own
+       code to compare ppem values.
+       * src/bdf/bdfdrivr.c (BDF_Set_Pixel_Size): Compare heights, not
+       ppem values.
+       (BDF_Set_Point_Size): Don't call BDF_Set_Pixel_Size but provide own
+       code to compare ppem values.
+
+2004-07-25  Kornfeld Eliyahu Peter  <peter@e-kadmon.net>
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Handle
+       TT_NAME_ID_PREFERRED_FAMILY and TT_NAME_ID_PREFERRED_SUBFAMILY.
+
+2004-07-24  Derek B. Noonburg  <derekn@foolabs.com>
+
+       * src/cff/cffload.c (cff_font_load): Always create inverse mapping.
+       Even if the charstring count is the same as the CID count, it is
+       still possible that the font uses a different CID -> GID mapping.
+
+2004-07-23  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttobjs.c (tt_face_init): Accept 0x00020000 format tag
+       found in some Arphic fonts made for Chinese version of Windows 3.1.
+
+2004-07-17  David Turner  <david@freetype.org>
+
+       Fixed a dangling pointer bug in the cache code that happened in very
+       rare cases, i.e., when a new family object was destroyed by an
+       out-of-memory condition during a glyph node initialization.  The
+       function FTC_Cache_Lookup would flush the cache and restart the
+       lookup with a bad pointer.
+
+       * include/freetype/cache/ftcglyph.h (FTC_FAMILY_TREE): New macro.
+       (FTC_GCACHE_LOOKUP_CMP): Use it.
+       Handle reference count in `num_nodes' correctly.
+
+       * src/cache/ftcglyph.c (FTC_GNode_UnselectFamily): Use
+       FTC_FAMILY_FREE.
+       (FTC_GCache_Lookup): Handle reference count in `num_nodes' correctly.
+
+       * src/cache/ftcmanag.c (FTC_Manager_FlushN): Fixed a cache flushing
+       bug.
+
+       * src/truetype/ttinterp.c (Normalize): Fixed a bug that caused
+       long and unnecessary delays while normalizing huge vectors.
+
+2004-07-15  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+       * src/base/ftstroke.c (FT_Stroker_ParseOutline): Fix compiler
+       warning.
+
+2004-07-15  David Turner  <david@freetype.org>
+
+       * src/base/ftstroke.c (FT_Stroker_ParseOutline): Single points
+       are not stroked, preventing a bug with pala.ttf and other
+       fonts.
+
+       * include/freetype/ftstroke.h: Updating documentation comments.
+
+2004-07-13  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftstroke.c (ft_stroke_border_reverse): Removed.  Unused.
+
+2004-07-12  David Turner  <david@freetype.org>
+
+       * src/base/ftstroke.c (ft_stroke_border_close): Add second parameter
+       to indicate reversion of points.
+       Update all callers.
+       (ft_stroke_border_reverse): Fix initialization of `point1' and
+       `tag1'.
+
+       * src/cache/ftcsbits.c (ftc_snode_load): Fixing advance computation
+       for transformed glyphs.
+
+2004-07-11  David Turner  <david@freetype.org>
+
+       Fix bugs that prevented the stroker to correctly generate stroked
+       paths from closed paths, i.e., nearly all glyphs in vectorial fonts.
+
+       The code is still _very_ buggy though; treat with special care.
+
+       * src/base/ftstroke.c (FT_STROKE_TAG_BEGIN_END): New macro.
+       (ft_stroke_border_reverse): New function.
+       (ft_stroker_inside): Remove local variable `sigma'; use different
+       threshold.
+       (ft_stroker_add_reverse_left): Switch begin/end tags if necessary.
+       (FT_Stroker_EndSubPath): Call ft_stroker_inside and
+       ft_stroke_border_reverse.
+
+2004-06-26  Peter Kovar  <peter.kovar@r3.roburnet.sk>
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Fix typo.
+
+2004-06-25  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1afm.c (afm_atoindex): Fix boundary test.  Reported
+       by Dirck Blaskey.
+
+2004-06-24  David Turner  <david@freetype.org>
+
+
+       * Version 2.1.9 released.
+       =========================
+
+
+       * src/truetype/ttgload.c, src/truetype/ttxgvar.c: Removing
+       compiler warnings.
+
+2004-06-23  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/ftmemory.h [FT_DEBUG_MEMORY]: Declare
+       FT_QAlloc_Debug and FT_QRealloc_Debug.
+
+       * src/base/ftutil.c (FT_QAlloc): Fix error and debug messages.
+       (FT_QRealloc): Call FT_QAlloc if original pointer is NULL.
+       Fix error message.
+
+2004-06-23  David Turner  <david@freetype.org>
+
+       * include/freetype/internal/ftmemory.h, src/base/ftutil.c
+       (FT_QAlloc, FT_QRealloc), src/base/ftdbgmem.c (FT_QAlloc_Debug,
+       FT_QRealloc_Debug): New functions that perform allocation without
+       zero-ing out the corresponding blocks.
+
+       * include/freetype/internal/ftmemory.h (FT_MEM_QALLOC,
+       FT_MEM_QREALLOC, FT_MEM_QNEW, FT_MEM_QNEW_ARRAY,
+       FT_MEM_QRENEW_ARRAY, FT_QALLOC, FT_QREALLOC, FT_QNEW, FT_QNEW_ARRAY,
+       FT_QRENEW_ARRAY): New macros.
+
+       * src/base/ftstream.c (FT_Stream_EnterFrame): Use FT_QALLOC.
+       * src/gzip/ftgzip.c (FT_Stream_OpenGzip):  Use FT_QNEW_ARRAY.
+       * src/sfnt/sfobjs.c (tt_face_get_name): Use FT_QNEW_ARRAY.
+
+       * src/sfnt/ttload.c (tt_face_load_directory, tt_face_load_metrics,
+       tt_face_load_gasp): Use FT_QNEW_ARRAY.
+       (tt_face_load_kern): Use FT_QNEW_ARRAY.
+       Small optimization in the kerning table verifier; this speeds up
+       TrueType face opening by about 7%.
+       (tt_face_load_hdmx): Use FT_QNEW_ARRAY and FT_QALLOC.
+
+       * include/freetype/config/ftmodule.h: Changed the order of modules,
+       putting TrueType and Type 1 first.  This dramatically improves the
+       performance of face open/close operations.  For example, putting the
+       TrueType driver first in the list results in a 5x speedup when
+       opening `Vera.ttf'.
+
+       The very problem is that both the PCF and BDF drivers do a lot more
+       than necessary to detect that they cannot handle a font file.
+
+2004-06-22  Werner Lemberg  <wl@gnu.org>
+
+       * src/pcf/pcfread.c (pcf_read_TOC, pcf_get_properties,
+       pcf_get_metrics, pcf_get_bitmaps, pcf_get_encodings): Improve
+       debugging messages.
+
+       * src/pcf/pcfdrivr.c (FT_COMPOMENT): Move up.
+       (PCF_Face_Init): Simplify code.
+
+       * src/bdf/bdfdrivr.h (BDF_FaceRec): New element `default_glyph'.
+
+       * src/bdf/bdflib.c (_bdf_add_property, _bdf_parse_start),
+       src/bdf/bdf.h (bdf_font_t): s/default_glyph/default_char/.
+
+       * src/bdf/bdfdrivr.c (BDF_Face_Init): Fix number of glyphs.
+       Set `default_glyph'.
+       (BDF_Glyph_Load): Use `default_glyph' for undefined glyph.
+
+       * docs/CHANGES: Updated.
+
+2004-06-21  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2004-06-21  David Turner  <david@freetype.org>
+
+       * src/truetype/ttgload.c (TT_Process_Simple_Glyph,
+       load_truetype_glyph): Don't access (unrounded)
+       `TT_Size.root.metrics' but (rounded) `TT_Size.metrics'.  This fixes
+       a scaling bug that caused incorrect rendering when the bytecode
+       interpreter was enabled.
+
+2004-06-14  Huw D M Davies  <h.davies1@physics.ox.ac.uk>
+
+       * src/winfonts/winfnt.c (FNT_Face_Init): Set x_ppem and y_ppem
+       based on pixel_width and pixel_height.
+       (FNT_Size_Set_Pixels): Updated.
+
+2004-06-14  Werner Lemberg  <wl@gnu.org>
+
+       * src/lzw/zopen.c: Comment out inclusion of signal.h and unistd.h.
+       Reported by Hyvärinen Jyrki Juhani.
+
+2004-06-11  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2004-06-10  David Turner  <david@freetype.org>
+
+       * src/base/ftobject.c, src/base/fthash.c, src/base/ftexcept.c,
+       src/base/ftsysio.c, src/base/ftsysmem.c, src/base/ftlist.c: Removed.
+       Obsolete.
+
+       * src/raster/ftraster.c (Alignment, PAlignment): New union to fix
+       problems with 64bit systems.
+       (AlignProfileSize): Use it.
+
+2004-06-08  David Turner  <david@freetype.org>
+
+       * include/freetype/freetype.h (FT_GlyphMetrics): Move `lsb_delta'
+       and `rsb_delta' elements to...
+       (FT_GlyphSlotRec): Here to retain binary compatibility with older
+       FreeType versions.
+       Update all users.
+
+       * src/sfnt/sfobjs.c (tt_face_get_name): Remove compiler warning.
+
+       * src/winfonts/winfnt.c (FNT_Load_Glyph): Add missing initialization
+       of slot->metrics.width and slot->metrics.height when loading a
+       Windows FNT glyph.  Thanks to Huw Davies.
+
+       * include/freetype/cache/ftcmru.h (FTC_MruNode_CompareFunc): Change
+       return type to FT_Bool.
+
+       * src/cache/ftbasic.c (ftc_basic_family_compare): Change return
+       type to FT_Bool.
+
+       * src/cache/ftccache.c (FTC_Cache_Init, ftc_cache_init): Make
+       the former call the latter, not vice versa.
+       (FTC_Cache_Done, ftc_cache_done): Ditto.
+
+       * src/cache/ftcglyph.c (FTC_GNode_Compare, ftc_gnode_compare): Make
+       the former call the latter, not vice versa.
+       (FTC_GCache_Init, ftc_gcache_init): Ditto.
+       (FTC_GCache_Done, ftc_gcache_done): Ditto.
+
+       * src/cache/ftcimage.c (FTC_INode_Free, ftc_inode_free): Make the
+       former call the latter, not vice versa.
+       (FTC_INode_Weight, ftc_inode_weight): Ditto.
+
+       * src/cache/ftcmanag.c (ftc_size_node_compare,
+       ftc_size_node_compare_faceid, ftc_face_node_compare): Change return
+       type to FT_Bool.
+
+       * src/cache/ftcsbits.c (FTC_SNode_Free, ftc_snode_free): Make the
+       former call the latter, not vice versa.
+       (FTC_SNode_Weight, ftc_snode_weight): Ditto.
+       (FTC_SNode_Compare, ftc_snode_compare): Ditto.
+
+       * src/cache/ftcsbits.c: Fix some bugs and inefficiencies in the cache
+       sub-system.
+
+2004-06-05  Werner Lemberg  <wl@gnu.org>
+
+       * src/autofit/afloader.c (af_loader_load_g): Set `lsb_delta' and
+       `rsb_delta' in slot->metrics and tune side bearings slightly.
+
+2004-06-04  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2004-06-04  David Chester  <davidchester@gmx.net>
+
+       Improve inter-letter spacing for autohinted glyphs.
+
+       * include/freetype/freetype.h (FT_Glyph_Metrics): Add elements
+       `lsb_delta' and `rsb_delta'.
+
+       * src/autohint/ahhint.c (ah_hinter_load): Set `lsb_delta' and
+       `rsb_delta' in slot->metrics and tune side bearings slightly.
+
+2004-06-04  David Turner  <david@freetype.org>
+
+       * src/autofit/*: Important fixes to the auto-fitter.  The output
+       now seems to be 100% equivalent to the auto-hinter, while being
+       about 2% faster (which proves that script-specific algorithm
+       selection isn't a performance problem).
+
+       To test it, change `autohint' to `autofit' in
+       <freetype/config/ftmodule.h> and recompile.
+
+       A few more testing is needed before making this the official
+       auto-hinting module.
+
+2004-06-02  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgload.c (compute_glyph_metrics): Fix compiler
+       warnings.
+
+2004-06-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfobjs.c (tt_face_get_name): Make sure that an English
+       name record for the Apple platform is preferred to a non-English
+       entry for the Microsoft platform.  Problem reported by HANDA
+       Ken'ichi.
+
+2004-05-19  George Williams  <gww@silcom.com>
+
+       * src/type1/t1load.c (mm_axis_unmap, mm_weights_unmap): New
+       auxiliary functions.
+       (T1_Get_MM_Var): Provide axis tags.
+       Use mm_axis_unmap and mm_weights_unmap to provide default values
+       for design and normalized axis coordinates.
+
+       * include/freetype/t1tables.h (PS_DesignMapRec): Change type of
+       `design_points' to FT_Long.
+       Update all users.
+
+2004-05-17  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftbbox.c (BBox_Conic_Check): Fix boundary cases.
+       Reported by Mikey Anbary <manbary@vizrt.com>.
+
+2004-05-15  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfobjs.c (sfnt_done_face): Free face->postscript_name.
+
+2004-05-15  George Williams  <gww@silcom.com>
+
+       * src/sfnt/ttload.c (tt_face_load_max_profile): Always set
+       face->root.num_glyphs.
+
+2004-05-14  Masatake YAMATO  <jet@gyve.org>
+           George Williams  <gww@silcom.com>
+
+       * src/sfnt/ttload.c (sfnt_dir_check): Handle `bhed' properly.
+
+2004-05-14  Werner Lemberg  <wl@gnu.org>
+
+       * src/cache/ftcbasic.c (ftc_basic_family_compare,
+       ftc_basic_family_init, ftc_basic_family_get_count,
+       ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph,
+       ftc_basic_gnode_compare_faceid): Adjust parameters and return types
+       to prototypes given in header files from include/freetype/cache.
+       Use casts to proper types locally.
+       (ftc_basic_image_family_class, ftc_basic_image_cache_class,
+       ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class): Remove
+       casts.
+
+       * src/cache/ftccback.h: Adjust parameters and return types to
+       prototypes given in header files from include/freetype/cache.
+
+       * src/cache/ftcimage.c (ftc_inode_free, ftc_inode_new,
+       ftc_inode_weight): Adjust parameters and return types to prototypes
+       given in header files from include/freetype/cache.  Use casts to
+       proper types locally.
+
+       * src/cache/ftcsbits.c (ftc_snode_free, ftc_snode_new,
+       ftc_snode_weight, ftc_snode_compare): Adjust parameters and return
+       types to prototypes given in header files from
+       include/freetype/cache.  Use casts to proper types locally.
+
+       * src/cache/ftccmap.c (ftc_cmap_node_free, ftc_cmap_node_new,
+       ftc_cmap_node_weight, ftc_cmap_node_compare,
+       ftc_cmap_node_remove_faceid): Adjust parameters and return types to
+       prototypes given in header files from include/freetype/cache.  Use
+       casts to proper types locally.
+       (ftc_cmap_cache_class): Remove casts.
+
+       * src/cache/ftcglyph.c (ftc_gnode_compare, ftc_gcache_init,
+       ftc_gcache_done): Adjust parameters and return types to prototypes
+       given in header files from include/freetype/cache.  Use casts to
+       proper types locally.
+
+       * src/cache/ftcmanag.c (ftc_size_node_done, ftc_size_node_compare,
+       ftc_size_node_init, ftc_size_node_reset,
+       ftc_size_node_compare_faceid, ftc_face_node_init,
+       ftc_face_node_done, ftc_face_node_compare: Adjust parameters and
+       return types to prototypes given in header files from
+       include/freetype/cache.  Use casts to proper types locally.
+
+       (ftc_size_list_class, ftc_face_list_class): Remove casts.
+
+2004-05-13  Werner Lemberg  <wl@gnu.org>
+
+       * src/autohint/ahmodule.c (ft_autohinter_init, ft_autohinter_done):
+       Use FT_Module as parameter and do a cast to FT_AutoHinter locally.
+       (autohint_module_class): Remove casts.
+
+       * src/base/ftglyph.c (ft_bitmap_glyph_init, ft_bitmap_glyph_copy,
+       ft_bitmap_glyph_done, ft_bitmap_glyph_bbox, ft_outline_glyph_init,
+       ft_outline_glyph_done, ft_outline_glyph_copy,
+       ft_outline_glyph_transform, ft_outline_glyph_bbox,
+       ft_outline_glyph_prepare): Use FT_Glyph as parameter and do a cast
+       to FT_XXXGlyph locally.
+       Use FT_CALLBACK_DEF throughout.
+       (ft_bitmap_glyph_class, ft_outline_glyph_class): Remove casts.
+
+       * src/bdf/bdfdrivr.c (bdf_cmap_init, bdf_cmap_done,
+       bdf_cmap_char_index, bdf_cmap_char_next): Use FT_CMap as parameter
+       and do a cast to BDF_CMap locally.
+       (bdf_cmap_class): Remove casts.
+
+2004-05-12  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffgload.h (CFF_Builder): Remove `error'.
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings): Replace
+       `Memory_Error' with `Fail' und update all users.
+
+2004-05-11  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/psaux.h (T1_ParseState): New
+       enumeration.
+       (T1_BuilderRec): Replace `path_begun' with `parse_state'.
+       Remove `error'.
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Replace
+       `Memory_Error' with `Fail' and update all users.
+       Don't use `builder->error'.
+       Replace `path_begun' with `parse_state' and check parsing states.
+
+       * src/psaux/psobjs.c (t1_builder_init, t1_builder_start_point):
+       Replace `path_begun' with `parse_state' and check parsing states.
+
+2004-05-10  George Williams  <gww@silcom.com>
+
+       * src/truetype/ttxgvar.c (ft_var_load_avar): Do free arrays in case
+       of error -- `avar' is optional so we can't rely on tt_done_blend
+       being called automatically.
+
+2004-05-09  George Williams  <gww@silcom.com>
+
+       * src/truetype/ttxgvar.c (ft_var_load_avar, ft_var_load_gvar): Fix
+       error handling.
+
+2004-05-07  Werner Lemberg  <wl@gnu.org>
+
+       * src/pfr/pfrobjs.c, src/pfr/pfrobjs.h (pfr_face_init,
+       pfr_face_done, pfr_face_get_kerning, pfr_slot_init, pfr_slot_done,
+       pfr_slot_load): Don't use PFR_XXX but FT_XXX arguments which are
+       typecast to the proper PFR_XXX types within the function.
+       Update code accordingly.
+
+       * src/pfr/pfrdrivr.c (pfr_get_kerning, pfr_get_advance,
+       pfr_get_metrics, pfr_get_service): Don't use PFR_XXX but FT_XXX
+       arguments which are typecast to the proper PFR_XXX types within the
+       function.
+       Update code accordingly.
+       Use FT_CALLBACK_DEF throughout.
+       (pfr_metrics_service_rec, pfr_driver_class): Remove casts.
+
+2004-05-06  Masatake YAMATO  <jet@gyve.org>
+
+       * src/truetype/ttgxvar.c (ft_var_load_gvar): Use FT_FACE_STREAM.
+       (*): Rename local variable OffsetToData to offsetToData.
+
+2004-05-06  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffobjs.c (cff_size_done, cff_size_init, cff_size_reset,
+       cff_slot_done, cff_slot_init, cff_face_init, cff_face_done): Access
+       root fields directly.
+       * src/cff/cffdrivr.c (Load_Glyph): Access root fields directly.
+
+       * src/truetype/ttgload.c (TT_Process_Simple_Glyph): Save current
+       frame before calling TT_Vary_Get_Glyph_Deltas.
+
+       * src/pcf/pcfdrivr.c (PCF_CMapRec): Rename `cmap' to `root' for
+       consistency.
+       (pcf_cmap_init, pcf_cmap_done, pcf_cmap_char_index,
+       pcf_cmap_char_next): Don't use PCF_XXX but FT_XXX arguments which
+       are typecast to the proper PCF_XXX types within the function.
+       Update code accordingly.
+       (pcf_cmap_class): Remove casts.
+       (PCF_Face_Done, PCF_Face_Init, PCF_Set_Pixel_Size): Don't use
+       PCF_XXX but FT_XXX arguments which are typecast to the proper
+       PCF_XXX types within the function.
+       Update code accordingly.
+       Use FT_CALLBACK_DEF throughout.
+       (PCF_Set_Point_Size): New wrapper function.
+       (PCF_Glyph_Load, pcf_driver_requester): Use FT_CALLBACK_DEF.
+       (pcf_driver_class): Remove casts.
+
+2004-05-04  Steve Hartwell  <shspamsink@comcast.net>
+
+       * src/truetype/ttobjs.c (tt_driver_done): Fix typo.
+
+2004-05-04  Werner Lemberg  <wl@gnu.org>
+
+       * src/bdf/bdfdrivr.c (BDF_Face_Done, BDF_Face_Init,
+       BDF_Set_Pixel_Size): Don't use BDF_XXX but FT_XXX arguments which
+       are typecast to the proper BDF_XXX types within the function.
+       Update code accordingly.
+       Use FT_CALLBACK_DEF throughout.
+       (BDF_Set_Point_Size): New wrapper function.
+       (bdf_driver_class): Remove casts.
+
+       * src/cff/cffdrivr.c (Get_Kerning, Load_Glyph, cff_get_interface):
+       Don't use CFF_XXX but FT_XXX arguments which are typecast to the
+       proper CFF_XXX types within the function.
+       Update code accordingly.
+       Use FT_CALLBACK_DEF throughout.
+       (cff_driver_class): Remove casts.
+
+       * src/cff/cffobjs.h, src/cff/cffobjs.c (cff_size_done,
+       cff_size_init, cff_size_reset, cff_slot_done, cff_slot_init,
+       cff_face_init, cff_face_done, cff_driver_init, cff_driver_done):
+       Don't use CFF_XXX but FT_XXX arguments which are typecast to the
+       proper CFF_XXX types within the function.
+       Update code accordingly.
+       (cff_point_size_reset): New wrapper function.
+
+       * src/cid/cidobjs.h, src/cid/cidobjs.c (cid_slot_done,
+       cid_slot_init, cid_size_done, cid_size_init, cid_size_reset,
+       cid_face_done, cid_face_init, cid_driver_init, cid_driver_done):
+       Don't use CID_XXX but FT_XXX arguments which are typecast to the
+       proper CID_XXX types within the function.
+       Update code accordingly.
+       (cid_point_size_reset): New wrapper function.
+
+       * src/cid/cidgload.c, src/cid/cidgload.h (cid_slot_load_glyph):
+       Don't use CID_XXX but FT_XXX arguments which are typecast to the
+       proper CID_XXX types within the function.
+       Update code accordingly.
+
+       * src/cid/cidriver.c (cid_get_interface):
+       Don't use CID_XXX but FT_XXX arguments which are typecast to the
+       proper CID_XXX types within the function.
+       Update code accordingly.
+       Use FT_CALLBACK_DEF.
+       (t1cid_driver_class): Remove casts.
+
+       * src/truetype/ttdriver.c (tt_get_interface): Use FT_CALLBACK_DEF.
+       * src/truetype/ttgxvar.c (ft_var_load_avar): Don't free non-local
+       variables (this is done later).
+       (ft_var_load_avar): Fix call to FT_FRAME_ENTER.
+       (TT_Get_MM_Var): Fix size for `fvar_fields'.
+       (TT_Vary_Get_Glyph_Deltas): Handle deallocation of local variables
+       correctly.
+
+       * src/base/ftdbgmem.c (ft_mem_debug_realloc): Don't abort if
+       current size is zero.
+
+2004-05-03  Steve Hartwell  <shspamsink@comcast.net>
+
+       * src/truetype/ttobjs.h, src/truetype/ttobjs.c (tt_face_init,
+       tt_face_done, tt_size_init, tt_size_done, tt_driver_init,
+       tt_driver_done): Don't use TT_XXX but FT_XXX arguments which are
+       typecast to the proper TT_XXX types within the function.
+       Update code accordingly.
+
+       * src/truetype/ttdriver.c (Get_Kerning, Set_Char_Sizes,
+       Set_Pixel_Sizes, Load_Glyph, tt_get_interface): Don't use TT_XXX but
+       FT_XXX arguments which are typecast to the proper TT_XXX types
+       within the function.
+       Update code accordingly.
+       (tt_driver_class): Remove casts.
+
+2004-05-02  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttload.c (tt_face_free_names): Check that `table->names'
+       is not NULL.  Reported by Gordon Childs <gchilds@quickcut.com.au>.
+
+2004-04-29  Werner Lemberg  <wl@gnu.org>
+
+       * docs/formats.txt: Add more information on PFR format.
+
+2004-04-28  Werner Lemberg  <wl@gnu.org>
+
+       * docs/formats.txt: New file.
+       * docs/CHANGES: Updated.
+
+2004-04-28  Masatake YAMATO  <jet@gyve.org>
+
+       * include/freetype/internal/tttypes.h (GX_BlendRec_)
+       [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Fix a typo.
+
+       * src/truetype/ttgxvar.h (GX_BlendRec_): Fix a typo.
+
+2004-04-27  Masatake YAMATO  <jet@gyve.org>
+
+       * src/truetype/ttgxvar.h: Use FT_LOCAL instead of FT_LOCAL_DEF
+       for function declarations.
+
+2004-04-25  George Williams  <gww@silcom.com>
+
+       * src/truetype/ttgxvar.c (ft_var_apply_tuple): Fix typo.
+
+2004-04-25  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/Jamfile, docs/CHANGES: Updated.
+
+2004-04-24  Werner Lemberg  <wl@gnu.org>
+
+       * src/pcf/pcfdrivr.c: Revert change from 2004-04-17.
+       * src/pcf/pcfutil.c: Use FT_LOCAL_DEF.
+       * src/pcf/pcfutil.h: Include FT_CONFIG_CONFIG_H.
+       Use FT_BEGIN_HEADER and FT_END_HEADER.
+       Use FT_LOCAL.
+
+2004-04-24  George Williams  <gww@silcom.com>
+
+       Add support for Apple's distortable font technology (in GX fonts).
+
+       * devel/ftoption.h, include/freetype/config/ftoption.h
+       (TT_CONFIG_OPTION_GX_VAR_SUPPORT): New macro.
+
+       * include/freetype/ftmm.h (FT_Var_Axis, FT_Var_Named_Style,
+       FT_MM_Var): New structures.
+       (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
+       FT_Set_Var_Blend_Coordinates): New function declarations.
+
+       * include/freetype/internal/services/svmm.h (FT_Get_MM_Var_Func,
+       FT_Set_Var_Design_Func): New typedefs.
+       Update MultiMasters service.
+
+       * include/freetype/internal/tttypes.h
+       [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include FT_MULTIPLE_MASTERS_H.
+       (GX_Blend) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New typedef.
+       (TT_Face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New members `doblend'
+       and `blend'.
+
+       * include/freetype/tttags.h (TTAG_avar, TTAG_cvar, TTAG_gvar): New
+       macros.
+
+       * include/freetype/internal/fttrace.h: Add `ttgxvar'.
+
+       * src/base/ftmm.c (FT_Get_MM_Var, FT_Set_Var_Design_Coordinates,
+       FT_Set_Var_Blend_Coordinates): New functions.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face)
+       [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Set FT_FACE_FLAG_MULTIPLE_MASTERS
+       flag for GX var fonts.
+
+       * src/truetype/ttgxvar.c, src/truetype/ttgxvar.h: New files.
+
+       * src/truetype/truetype.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
+       ttgxvar.c.
+
+       * src/truetype/ttdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
+       FT_MULTIPLE_MASTERS_H, FT_SERVICE_MULTIPLE_MASTERS_H, and ttgxvar.h.
+       (tt_service_gx_multi_masters) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
+       New service.
+       (tt_services) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
+
+       * src/truetype/ttgload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
+       ttgxvar.h.
+       (TT_Process_Simple_Glyph, load_truetype_glyph)
+       [TT_CONFIG_OPTION_GX_VAR_SUPPORT] :Support GX var fonts.
+
+       * src/truetype/ttobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
+       ttgxvar.h.
+       (tt_done_face) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
+       tt_done_blend.
+
+       * src/truetype/ttpload.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
+       ttgxvar.h.
+       (tt_face_load_cvt)  [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Call
+       tt_face_vary_cvt.
+
+       * src/truetype/rules.mk (TT_DRV_SRC): Add ttgxvar.c.
+
+       * src/type1/t1driver.c (t1_service_multi_masters): Add T1_Get_MM_Var
+       and T1_Set_Var_Design.
+
+       * src/type1/t1load.c (FT_INT_TO_FIXED, FT_FIXED_TO_INT): New macros.
+       (T1_Get_MM_Var, T1_Set_Var_Design): New functions.
+
+       * src/type1/t1load.h (T1_Get_MM_Var, T1_Set_Var_Design): New
+       function declarations.
+
+2004-04-23  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/ftcache.h (FT_Get_CharMap_Index): Rename
+       declaration and move to...
+       * include/freetype/freetype.h (FT_Get_Charmap_Index): Here.
+       (FREETYPE_PATCH): Set to 9.
+
+       * src/base/ftobjs.c (FT_Get_Charmap_Index): New function.
+
+       * builds/unix/configure.ac (version_info): Set to 9:7:3.
+       * builds/unix/configure: Updated.
+
+       * builds/win32/visualc/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj: s/218/219/.
+
+       * builds/freetype.mk (refdoc), README, Jamfile (RefDoc):
+       s/2.1.8/2.1.9/.
+
+       * docs/CHANGES, docs/VERSION.DLL: Updated.
+
+2004-04-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffparse.c (cff_parser_run), src/psaux/psobjs.c
+       (ps_parser_load_field): Use FT_CHAR_BIT.
+
+2004-04-21  David Turner  <david@freetype.org>
+
+
+       * Version 2.1.8 released.
+       =========================
+
+
+       * src/cff/cffobjs.c (cff_face_init): Fix a small memory leak.
+
+       * src/autofit/afloader.c (af_loader_load_g), src/autofit/afmodule.c
+       (af_autofitter_load_glyph), src/base/ftdebug.c (FT_Trace_Get_Name):
+       Remove compiler warnings.
+
+       * src/autofit/aftypes.h: Undefine AF_DEBUG.
+
+       * src/lzw/zopen.c (rmask), src/pcf/pcfdrivr.c (pcf_service_bdf,
+       pcf_services), src/pcf/pcfread.c (tableNames), src/psaux/psobjs.c
+       (ft_char_table), src/type42/t42drivr.c (t42_service_glyph_dict,
+       t42_service_ps_font_name): Decorate data arrays with `const' to
+       avoid populating the `.data' segment.
+
+       * src/lzw/Jamfile: New file.
+
+2004-04-20  Werner Lemberg  <wl@gnu.org>
+
+       * src/psaux/psobjs.c (T1Radix): Renamed to...
+       (ps_radix): This.
+       Update current cursor position.
+
+       * docs/CHANGES: Updated.
+
+2004-04-18  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgload.c, src/truetype/ttgload.h (TT_Load_Glyph),
+       src/ttdriver.c (Load_Glyph): Change type of `glyph_index' to
+       FT_UInt.  From Lex Warners.
+
+2004-04-17  Chisato Yamauchi  <cyamauch@a.phys.nagoya-u.ac.jp>
+
+       * src/sfnt/ttload.c (tt_face_load_sfnt_header): Really fix change
+       from 2004-03-19.
+
+       * src/bdf/bdfdrivr.c (BDF_Face_Init): Use `ft_strlen'.
+
+       * src/pcf/pcfutil.c, src/pcf/pcfutil.h: Decorate functions with
+       `static'.
+       Remove unused function `RepadBitmap'.
+       * src/pcf/pcfdrivr.c: Don't include pcfutil.h.
+
+2004-04-16  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/freetype-config.in (usage): Fix and improve usage
+       information.
+
+2004-04-15  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/ftconfig.in, builds/vms/ftconfig.h: Define
+       FT_CHAR_BIT.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Don't apply autohinting if
+       glyph is vertically distorted or mirrored.
+
+       * src/cff/cffgload.c (cff_slot_load): Handle zero `size' properly
+       for embedded bitmaps.
+
+       * docs/CHANGES: Updated.
+
+2004-04-15  bytesoftware  <bytesoftware@btinternet.com>
+
+       * include/freetype/config/ftconfig.h, src/base/ftstream.c
+       (FT_Stream_ReadFields): More fixes using FT_CHAR_BIT.
+
+2004-04-14  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/config/ftconfig.h (FT_CHAR_BIT): New macro.
+
+2004-04-14  Alex Strelnikov  <ptktyrf@mail.ru>
+
+       * src/cache/ftcsbits.c (ftc_snode_load): Initialize `*asize' in case
+       of error.
+
+2004-04-14  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftmac.c [__GNUC__]: Define OS_INLINE.
+       * builds/unix/configure.ac: Don't try to remove `-ansi' compilation
+       switch on the Mac.
+
+       * builds/unix/ltmain.sh: Regenerated with `libtoolize --force
+       --copy' from libtool 1.5.6.
+       * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from
+       automake 1.8a.
+       * builds/unix/configure: Regenerated with autoconf 2.59a.
+
+2004-04-13  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/config/ftconfig.h: Use CHAR_BIT to define
+       size of FT_SIZEOF_xxx.
+
+2004-04-12  Chisato Yamauchi  <cyamauch@a.phys.nagoya-u.ac.jp>
+
+       * include/freetype/internal/sfnt.h (TT_Find_SBit_Image_Func,
+       TT_Load_SBit_Metrics_Func): New typedefs.
+       (SFNT_Interface): Add find_sbit_image and load_sbit_metrics.
+
+       * src/sfnt/sfdriver.c (sfnt_interface): Updated.
+       * src/sfnt/ttsbit.h (tt_find_sbit_image, tt_load_sbit_metrics): New
+       declarations.
+       * src/sfnt/ttsbit.c (find_sbit_image): Renamed to...
+       (tt_find_sbit_image): This.
+       Updated all callers.
+       (load_sbit_metrics): Renamed to...
+       (tt_load_sbit_metrics): This.
+       Updated all callers.
+
+2004-04-12  Werner Lemberg  <wl@gnu.org>
+
+       * configure: Accept makepp also.
+
+       * builds/unix/detect.mk: Use proper path to unix-def.mk.
+       * builds/unix/unix-def.in (BUILD_DIR, PLATFORM): Remove.
+       * builds/unix/unix.mk (BUILD_DIR, PLATFORM): Define.
+       Use BUILD_DIR.
+
+       * docs/INSTALL, docs/INSTALL.GNU, docs/INSTALL.UNX: Update
+       documentation on makepp.
+
+2004-04-11  Werner Lemberg  <wl@gnu.org>
+
+       * src/lzw/zopen.c: Don't include sys/param.h and sys/stat.h.
+
+2004-04-10  Werner Lemberg  <wl@gnu.org>
+
+       * src/lzw/ftlzw.c: Include zopen.h dependent on
+       FT_CONFIG_OPTION_USE_LZW.
+
+       * src/base/ftdebug.c: s/index/idx/ to avoid compiler warnings.
+
+2004-04-02  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/ltmain.sh: Regenerated with `libtoolize --force
+       --copy' from libtool 1.5.2.
+       * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from
+       automake 1.8a.
+       * builds/unix/configure: Regenerated with autoconf 2.59a.
+
+2004-04-01  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/ft-munmap.m4 (FT_MUNMAP_PARAM): Fix arguments of
+       AC_COMPILE_IFELSE.
+       * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from
+       automake 1.8a.
+       * builds/unix/configure: Regenerated with autoconf 2.59a.
+       * builds/unix/config.guess, builds/unix/config.sub: Updated from
+       `config' CVS module at subversions.gnu.org.
+       * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from
+       `texinfo' CVS module at subversions.gnu.org.
+       * builds/freetype.mk (refdoc): Updated.
+
+2004-03-31  Werner Lemberg  <wl@gnu.org>
+
+       Handle broken FNT files which don't have a trailing NULL byte
+       in the face name string.
+
+       * src/winfonts/winfnt.h (FNT_FontRec): New member `family_name'.
+       * src/winfonts/winfnt.c (fnt_font_done): Free font->family_name.
+       (FNT_Face_Init): Append a final zero byte to the font face name.
+
+2004-03-30  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttload.c (tt_face_load_sfnt_header): Fix change from
+       2004-03-19.
+
+2004-03-27  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/descrip.mms (OBJS): Add ftbbox.obj.
+
+2004-03-26  George Williams  <gww@silcom.com>
+
+       Add vertical phantom points.
+
+       * include/freetype/internal/tttypes.h (TT_LoaderRec): Add
+       `top_bearing', `vadvance', `pp3', and `pp4'.
+
+       * src/autofit/afloader.c (af_loader_load_g): Handle two more points.
+
+       * src/autohint/ahhint.c (ah_hinter_load): Handle two more points.
+       * src/truetype/ttgload.c (Get_VMetrics): New function.
+       (TT_Load_Simple_Glyph, TT_Process_Simple_Glyph): Handle two more
+       points.
+       (load_truetype_glyph): Use Get_VMetrics.
+       Handle two more points.
+       (compute_glyph_metrics): Thanks to vertical phantom points we now
+       can always compute `advance_height' and `top_bearing'.
+       * src/truetype/ttobjs.h (TT_SubglyphRec): Add vertical phantom
+       points.
+
+
+       * src/autohint/ahglyph.c (ah_outline_load): Fix allocation of
+       `news'.
+
+2004-03-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/bdf/bdfdrivr.c (BDF_Glyph_Load): Fix left side bearing.
+
+2004-03-20  Steve Hartwell  <shspamsink@comcast.net>
+
+       * src/cache/ftcmru.c (FTC_MruList_RemoveSelection): Handle a NULL
+       value for `selection' as `select all'.
+
+2004-03-19  Steve Hartwell  <shspamsink@comcast.net>
+
+       * src/sfnt/ttload.c (tt_face_load_sfnt_header): Reject face_index
+       values > 0 if loading non-TTC fonts.
+
+       * src/base/ftmac.c (open_face_from_buffer): Set positive face_index
+       to zero before calling FT_Open_Face.
+
+       * docs/CHANGES: Updated.
+
+2004-03-04  Werner Lemberg  <wl@gnu.org>
+
+       * Jamfile, vms_make.com, builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype/vcproj, include/freetype/ftmoderr.h:
+       Add LZW module.
+
+       * Jamfile.in: Removed.
+
+       * docs/CHANGES: Updated.
+
+       * include/freetype/internal/ftobjs.h: s/MIN/FT_MIN/, s/MAX/FT_MAX/,
+       s/ABS/FT_ABS/.  Updated all callers.
+
+       * src/type1/t1load.c (parse_dict), src/pcf/pcfdrivr.c
+       (PCF_Face_Init): Use FT_ERROR_BASE.
+
+2004-03-04  Albert Chin  <china@thewrittenword.com>
+
+       Add support for PCF fonts compressed with LZW (extension .pcf.Z,
+       created with `compress').
+
+       * include/freetype/config/ftoption.h, devel/ftoption.h
+       (FT_CONFIG_OPTION_USE_LZW): New macro.
+
+       * include/freetype/ftlzw.h: New file.
+       * include/freetype/config/ftheader.h (FT_LZW_H): New macro for
+       ftlzw.h.
+
+       * src/lzw/*: New files.
+
+       * src/pcf/pcfdrivr.c: Include FT_LZW_H.
+       (PCF_Face_Init): Try LZW also.
+
+       * src/gzip/ftgzip.c: s/0/Gzip_Err_Ok/ where appropriate.
+       Beautify.
+
+2004-03-03  Werner Lemberg  <wl@gnu.org>
+
+       * src/pshinter/pshalgo.c (psh_hint_table_init): Simplify code.
+
+2004-03-02  Werner Lemberg  <wl@gnu.org>
+
+       Add embedded bitmap support to CFF driver.
+
+       * src/cff/cffobjs.h (CFF_SizeRec): New structure.
+
+       * src/cff/cffgload.c (cff_builder_init): Updated.
+       (cff_slot_load): Updated.
+       [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: Load sbit.
+
+       * src/cff/cffobjs.c (sbit_size_reset)
+       [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: New function.
+       (cff_size_get_globals_funcs, cff_size_done, cff_size_init): Updated.
+       (cff_size_reset): Updated.
+       [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: Call sbit_size_reset.
+
+       * src/cff/cffdrivr.c (Load_Glyph): Updated.
+       (cff_driver_class): Use CFF_SizeRec.
+
+       * docs/CHANGES: Updated.
+
+2004-03-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/pshinter/pshglob.c (psh_globals_scale_widths): Don't use
+       FT_RoundFix but FT_PIX_ROUND.
+       (psh_blues_snap_stem): Don't use blue_shift but blue_threshold.
+
+       * src/pshinter/pshalgo.c (PSH_STRONG_THRESHOLD_MAXIMUM): New macro.
+       (psh_glyph_find_string_points): Use PSH_STRONG_THRESHOLD_MAXIMUM.
+       (psh_glyph_find_blue_points): New function.  Needed for fonts like
+       p052003l.pfb (URW Palladio L Roman) which have flex curves at the
+       base line within blue zones, but the flex curves aren't covered by
+       hints.
+       (ps_hints_apply): Use psh_glyph_find_blue_points.
+
+2004-02-27  Garrick Meeker  <garrick@digitalanarchy.com>
+
+       * builds/unix/configure.ac: Fix compiler flags for
+       `--with-old-mac-fonts'.
+       * builds/unix/configure: Regenerated.
+
+       * src/base/ftmac.c: s/TARGET_API_MAC_CARBON/!TARGET_API_MAC_OS8/.
+       (FT_New_Face_From_Resource): New function.
+       (FT_New_Face): Use FT_New_Face_From_Resource.
+       (FT_New_Face_From_FSSpec): Use FT_New_Face_From_Resource.
+       [__MWERKS__]: Don't include FSp_fopen.h.
+
+2004-02-26  Werner Lemberg  <wl@gnu.org>
+
+       * src/pshinter/pshglob.c (psh_globals_new): Fix value of
+       `dim->stdw.count'.
+       Don't assign default values to blue scale and blue shift.
+
+2004-02-25  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2004-02-25  Garrick Meeker  <garrick@digitalanarchy.com>
+           Steve Hartwell  <shspamsink@comcast.net>
+
+       Improve MacOS fond support.  Provide a new API
+       `FT_New_Face_From_FSSpec' similar to `FT_New_Face'.
+
+       * src/base/ftmac.c [__MWERKS__]: Include FSp_fpopen.h.
+       STREAM_FILE [__MWERKS__]: New macro.
+       (ft_FSp_stream_close, ft_FSp_stream_io) [__MWERKS__]: New functions.
+       (file_spec_from_path) [__MWERKS__]: Updated #if statement.
+       (get_file_type, make_lwfn_spec): Use `const' for argument.
+       (is_dfont) [TARGET_API_MAC_CARBON]: Removed.
+       (count_face_sfnt, count_faces): New functions.
+       (parse_fond): Do some range checking.
+       (read_lwfn): Change type of second argument.
+       No longer call FSpOpenResFile.
+       (OpenFileAsResource): New function.
+       (FT_New_Face_From_LWFN): Use `const' for second argument.
+       Use OpenFileAsResource.
+       (FT_New_Face_From_Suitcase): Change type of second argument.
+       No longer call FSpOpenResFile.
+       Loop over all resource indices.
+       (FT_New_Face_From_dfont) [TARGET_API_MAC_CARBON]: Removed.
+       (FT_GetFile_From_Mac_Name): Use `const' for first argument.
+       (ResourceForkSize): Removed.
+       (FT_New_Face): Updated to use new functions.
+       (FT_New_Face_From_FSSpec): New function.
+
+       * include/freetype/ftmac.h: Updated.
+
+2004-02-24  Malcolm Taylor  <mtaylor@clear.net.nz>
+
+       * src/autohint/ahhint.c (ah_hinter_load) <FT_GLYPH_FORMAT_OUTLINE>:
+       Handle case where outline->num_vedges is zero while computing hinted
+       metrics.
+
+2004-02-24  Gordon Childs  <gchilds@quickcut.com.au>
+
+       * src/cff/cffcmap.c (cff_cmap_unicode_init): Provide correct value
+       for `count'.
+
+2004-02-24  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/t1tables.h (PS_PrivateRec): Add
+       `expansion_factor'.
+
+       * src/pshinter/pshglob (psh_blues_scale_zones): Fix computation
+       of blues->no_overshoots -- `blues_scale' is stored with a
+       magnification of 1000, and `scale' returns fractional pixels.
+
+       * src/type1/t1load.c (T1_Open_Face): Initialize `blue_shift',
+       `blue_fuzz', `expansion_factor', and `blue_scale' according to the
+       Type 1 specification.
+
+       * src/type1/t1tokens.h: Handle `ExpansionFactor'.
+
+       * docs/CHANGES: Updated.
+
+2004-02-24  Masatake YAMATO  <jet@gyve.org>
+
+       Provide generic access to MacOS resource forks.
+
+       * src/base/ftrfork.c, include/freetype/internal/ftrfork.h: New
+       files.
+
+       * src/base/ftobjs.c: Include FT_INTERNAL_RFORK_H.
+       (Mac_Read_POST_Resource, Mac_Read_sfnt_Resource): Remove arguments
+       `resource_listoffset' and `resource_data' and adapt code
+       accordingly.  These values are calculated outside of the function
+       now.
+       Add new argument `offsets'.
+       (IsMacResource): Use `FT_Raccess_Get_HeaderInfo' and
+       `FT_Raccess_Get_DataOffsets'.
+       (load_face_in_embedded_rfork): New function.
+       (load_mac_face): Use load_face_in_embedded_rfork.
+       (ft_input_stream_new): Renamed to...
+       (FT_Stream_New): This.  Use FT_BASE_DEF.  Updated all callers.
+       (ft_input_stream_free): Renamed to...
+       (FT_Stream_Free): This.  Use FT_BASE_DEF.  Updated all callers.
+
+       * src/base/ftbase.c: Include ftrfork.c.
+
+       * src/base/rules.mk (BASE_SRC), src/base/Jamfile: Updated.
+
+       * include/freetype/internal/internal.h (FT_INTERNAL_RFORK_H):
+       New macro.
+
+       * include/freetype/internal/fttrace.h: Added `rfork' as a new
+       trace definition.
+
+       * include/freetype/internal/ftstream.h: Declare FT_Stream_New and
+       FT_Stream_Free.
+
+       * include/freetype/config/ftoption.h, devel/ftoption.h
+       (FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK): New option.
+
+       * include/freetype/config/ftstdlib.h (ft_strrchr): New macro.
+
+2004-02-23  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+       * include/freetype/internal/ftdebug.h: Include FT_FREETYPE_H.
+
+2004-02-23  Masatake YAMATO  <jet@gyve.org>
+
+       Provide a simple API to control FreeType's tracing levels.
+
+       * include/freetype/internal/ftdebug.h (FT_Trace_Get_Count,
+       FT_Trace_Get_Name): New declarations.
+
+       * src/base/ftdebug.c (FT_Trace_Get_Count, FT_Trace_Get_Name): New
+       functions.
+
+2004-02-23  David Turner  <david@freetype.org>
+
+       * src/autofit/afhints.c, src/autofit/afhints.h,
+       src/autofit/aflatin.c, src/autofit/afloader.c, src/types.h: Grave
+       bugs have been fixed.  The auto-fitter works, doesn't crash, but
+       still produces unexpected results...
+
+2004-02-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/pshinter/pshalgo.c (PSH_STRONG_THRESHOLD): Changed to hold
+       the accepted shift for strong points in fractional pixels (which
+       is a heuristic value).
+       (psh_glyph_find_strong_points): Compute threshold for
+       psh_hint_table_find_strong_points.
+       (psh_hint_table_find_strong_point): Add parameter to pass threshold.
+
+2004-02-20  Werner Lemberg  <wl@gnu.org>
+
+       * src/pshinter/pshrec.c (ps_mask_table_set_bits): Don't call
+       ps_mask_table_alloc but ps_mask_table_last.
+       (ps_hints_t2mask): Use correct position and number for vertical
+       and horizontal hinter mask bits.
+
+       * docs/CHANGES: Updated.
+
+2004-02-19  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftstroke.c (FT_Glyph_StrokeBorder): Fix enum handling.
+       * src/cff/cffdrivr.c (cff_get_cmap_info): Remove compiler warning.
+
+2004-02-18  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/freetype.h: Document FT_LOAD_TARGET_XXX properly.
+
+       * src/base/ftglyph.c (ft_bitmap_glyph_class,
+       ft_outline_glyph_class): Tag with FT_CALLBACK_TABLE_DEF.
+
+       * src/smooth/ftsmooth.c (ft_smooth_render): Handle
+       FT_RENDER_MODE_LIGHT.
+
+2004-02-17  Werner Lemberg  <wl@gnu.org>
+
+       Fix callback functions in cache module.
+
+       * src/cache/ftccback.h: New file for callback declarations.
+
+       * src/cache/ftcbasic.c (ftc_basic_family_compare,
+       ftc_basic_family_init, ftc_basic_family_get_count,
+       ftc_basic_family_load_bitmap, ftc_basic_family_load_glyph,
+       ftc_basic_gnode_compare_faceid): Use FT_CALLBACK_DEF.
+       (ftc_basic_image_family_class, ftc_basic_image_cache_class,
+       ftc_basic_sbit_family_class, ftc_basic_sbit_cache_class):
+       Use FT_CALLBACK_TABLE_DEF and local wrapper functions.
+
+       * src/cache/ftccache.c: Include ftccback.h.
+       (ftc_cache_init, ftc_cache_done): New wrapper functions which use
+       FT_LOCAL_DEF.
+
+       * src/cache/ftccmap.c: Include ftccback.h.
+       (ftc_cmap_cache_class): Use local wrapper functions.
+
+       * src/cache/ftcglyph.c: Include ftccback.h.
+       (ftc_gnode_compare, ftc_gcache_init, ftc_gcache_done): New wrapper
+       functions which use FT_LOCAL_DEF.
+
+       * src/cache/ftcimage.c: Include ftccback.h.
+       (ftc_inode_free, ftc_inode_new, ftc_inode_weight): New wrapper
+       functions which use FT_LOCAL_DEF.
+
+       * src/cache/ftcmanag.c (ftc_size_list_class, ftc_face_list_class):
+       Use FT_CALLBACK_TABLE_DEF.
+
+       * src/cache;/ftcsbits.c: Include ftccback.h.
+       (ftc_snode_free, ftc_snode_new, ftc_snode_weight,
+       ftc_snode_compare): New wrapper functions which use FT_LOCAL_DEF.
+
+       * src/cache/rules.mk (CACHE_DRV_H): Add ftccback.h.
+
+2004-02-17  Masatake YAMATO  <jet@gyve.org>
+
+       * include/freetype/ftmac.h (FT_GetFile_From_Mac_Name): Fix a typo
+       (FT_EXPORT_DEF -> FT_EXPORT).
+
+       * include/freetype/ftxf86.h (FT_Get_X11_Font_Format): Ditto.
+
+2004-02-15  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftobjs.c (FT_Set_Char_Size): Fix typo.
+
+2004-02-14  Masatake YAMATO  <jet@gyve.org>
+
+       * builds/unix/ftsystem.c: Include errno.h.
+       (ft_close_stream): Renamed to...
+       (ft_close_stream_by_munmap): This.
+       (ft_close_stream_by_free): New function.
+       (FT_Stream_Open): Use fallback method if mmap fails.
+       Use proper function for closing the stream.
+
+2004-02-14  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (parse_dict): Initialize `start_binary'.
+
+2004-02-13  Robert Etheridge  <roberte@stcc.cc.tx.us>
+
+       * src/type42/t42objs.c (T42_Face_Init), src/type1/t1objs.c
+       (T1_Face_Init), src/cid/cidobjs.c (cid_face_init): Fix computation
+       of underline_position and underline_thickness.
+
+2004-02-12  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftobjs.c (FT_Set_Char_Size): Return immediately if
+       ppem values don't change.  Suggested by Graham Asher.
+
+2004-02-11  Werner Lemberg  <wl@gnu.org>
+
+       * src/cid/cidload.c (cid_face_open): Always allocate
+       face->cid_stream so that we can deallocate it safely.
+
+2004-02-10  Werner Lemberg  <wl@gnu.org>
+
+       Make the PS parser more tolerant w.r.t. non-standard font data.  In
+       general, an error is only reported in case of a syntax error; a
+       wrong type is now simply ignored (if possible).  To be independent
+       of the order of various MM-specific keywords, the parse_shared_dict
+       routine has been removed -- the PS parser is now capable to skip
+       this data.  It no longer fails on parsing e.g.
+
+         dup /WeightVector exch def
+
+       Since the token following /WeightVector isn't `[' (starting an
+       array) it is simply ignored.
+
+       * include/freetype/fterrdef.h: Define `FT_Err_Ignore' (0xA2) as a
+       new internal error value.
+
+       * src/type1/t1load.c (parse_blend_axis_types,
+       parse_blend_design_positions, parse_blend_design_map): Return
+       T1_Err_Ignore if no proper array is following the keyword.
+       (parse_weight_vector): Use T1_ToTokenArray, initializing `blend'
+       structure, if necessary.
+       Return T1_Err_Ignore if no proper array is following the keyword.
+       (parse_shared_dict): Removed.
+       (parse_encoding): Set parser->root.error to return T1_Err_Ignore
+       if no result can be obtained.
+       Check for errors before accessing `elements' array.
+       (t1_keywords): Remove /shareddict.
+       (parse_dict): Reset error if t1_load_keyword returns T1_Err_Ignore.
+       Set keyword_flag only in case of success.
+       Check error code if skipping an unrecognized token.
+       (T1_Open_Face) [!T1_CONFIG_OPTION_NO_MM_SUPPORT]: Call T1_Done_Blend
+       if blend commands haven't set up a proper MM font.
+
+       * src/psaux/psobjs.c (ps_parser_load_field_table): Remove special
+       code for synthetic fonts.
+       Return PSaux_Err_Ignore if no proper value has been found.
+
+2004-02-09  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings)
+       <cff_op_endchar>: Preserve glyph width before calling
+       cff_operator_seac.
+
+2004-02-09  Martin Muskens  <mmuskens@aurelon.com>
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings): Handle special
+       first argument for `hintmask' and `cntrmask' operators also.
+
+2004-02-08  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/configure.in: Call AC_SUBST for `enable_shared',
+       `hardcode_libdir_flag_spec', and `wl'.
+       * builds/unix/configure: Regenerated.
+
+       * builds/unix/freetype-config.in: Make --prefix and --exec-prefix
+       actually work.
+       Report a proper --rpath (or -R) value for --libs argument if a
+       shared library has been built.
+
+       * docs/CHANGES: Updated.
+
+2004-02-07  Keith Packard  <keithp@keithp.com>
+
+       * src/bdf/bdfdrivr.c (BDF_Face_Init, BDF_Set_Pixel_Size): Fix
+       computation of various vertical and horizontal metric values.
+
+       * src/pcfdrivr.c (PCF_Set_Pixel_Size), src/pcfread (pcf_load_font):
+       Ditto.
+
+2004-02-07  Werner Lemberg  <wl@gnu.org>
+
+       * builds/win32/visualc/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.dsw, docs/CHANGES: Updated.
+
+2004-02-07  Vitaliy Pasternak  <v_a_pasternak@mail.ru>
+
+       * builds/win32/visualc/freetype.sln,
+       builds/win32/visualc/freetype.vcproj: New files for VS.NET 2003.
+
+2004-02-03  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP):
+       Initialize `node'.
+       * src/type1/t1load.c (parse_dict): Initialize `have_integer'.
+
+2004-02-02  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (parse_dict): Handle `RD' and `-|' commands
+       outside of /Subrs or /CharStrings.  This can happen if there is
+       additional code manipulating those two arrays so that FreeType
+       doesn't recognize them properly.
+       (T1_Open_Face): Improve an error message.
+
+2004-02-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (parse_charstrings): Exit immediately if
+       there are no elements in /CharStrings.  This is needed for fonts
+       like Optima-Oblique which not only define /CharStrings but access it
+       also.
+
+2004-02-01  David Turner  <david@freetype.org>
+
+       * src/sfnt/Jamfile: Removing `ttcmap' from the list of sources.
+
+       * include/freetype/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP)
+       <FTC_INLINE>: Provide macro version which doesn't use inline code.
+       * include/freetype/cache/ftcglyph.h (FTC_GCACHE_LOOKUP_CMP)
+       <FTC_INLINE>: Ditto.
+       Use FTC_MRULIST_LOOKUP_CMP.
+       * include/freetype/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): New
+       macro.
+       (FTC_MRULIST_LOOKUP): Use it.
+
+       * src/cache/Jamfile (_sources), src/cache/descrip.mms: Updated.
+       * src/cache/ftcbasic.c: Fix compiler warnings.
+       * src/cache/ftcmanag.c (FTC_Manager_LookupSize,
+       FTC_Manager_LookupFace) <FTC_INLINE>: Use FTC_MRULIST_LOOKUP_CMP.
+       * src/cache/ftcmru.c (FTC_MruList_Find): Fix a bug (found after
+       heavy testing).
+
+       * Jamfile: Updating `refdoc' target, and adding `autohint' to the
+       list of modules to build.  Both the autohinter and autofitter will
+       be built by default.  But which one will be used is determined by
+       the content of `ftmodule.h'.
+
+       * src/autofit/*: Many updates, but the code is still buggy...
+
+2004-01-31  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffgload.c (cff_operator_seac): Fix magnitude of
+       accent offset.
+       Update code similarly to the seac support for Type 1 fonts.
+       (cff_decoder_parse_charstrings) <cff_op_endchar>: Fix magnitude
+       of accent offset.
+       Don't hint glyphs twice if seac is emulated.
+       <cff_op_flex>: Assign correct point tags.
+       * docs/CHANGES: Updated.
+
+2004-01-30  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1parse.c (T1_Get_Private_Dict): Use FT_MEM_MOVE, not
+       FT_MEM_COPY, for copying the private dict.
+
+       * src/type1/t1load.c (parse_subrs): Assign number of subrs only
+       in first run.
+       (parse_charstrings): Parse /CharStrings in second run without
+       assigning values.
+       (parse_dict): Skip all /CharStrings arrays but the first.  We need
+       this for non-standard fonts like `Optima' which have different
+       outlines depending on the resolution.  Note that there is no
+       guarantee that we get fitting /Subrs and /CharStrings arrays; this
+       can only be done by a real PS interpreter.
+
+2004-01-29  Antoine Leca  <Antoine-Freetype@Leca-Marti.org>
+
+       * builds/win32/visualc/index.html: New file, giving detailed
+       explanations about forcing CR+LF line endings for the VC++ project
+       files.
+
+2004-01-22  Garrick Meeker  <garrick@digitalanarchy.com>
+
+       * src/cff/cffload.c (cff_subfont_load): Initialize `dict'.
+
+2004-01-22  Werner Lemberg  <wl@gnu.org>
+
+       Add support for the hexadecimal representation of binary data
+       started with `StartData' in CID-keyed Type 1 fonts.
+
+       * include/freetype/internal/t1types.h (CID_FaceRec): Add new
+       members `binary_data' and `cid_stream'.
+
+       * src/cid/cidload.c (cid_read_subrs): Use `face->cid_stream'.
+       (cid_hex_to_binary): New auxiliary function.
+       (cid_face_open): Add new argument `face_index' to return quickly
+       if less than zero.  Updated all callers.
+       Call `cid_hex_to_binary', then open and assign memory stream to
+       `face->cid_stream' if `parser->binary_length' is non-zero.
+       * src/cid/cidload.h: Updated.
+
+       * src/cid/cidobjs.c (cid_face_done): Free `binary_data' and
+       `cid_stream'.
+
+       * src/cid/cidparse.c (cid_parser_new): Check arguments to
+       `StartData' and set parser->binary_length accordingly.
+       * src/cid/cidparse.h (CID_Parser): New member `binary_length'.
+
+       * src/cid/cidgload.c (cid_load_glyph): Use `face->cid_stream'.
+
+       * docs/CHANGES: Updated.
+
+2004-01-21  Werner Lemberg  <wl@gnu.org>
+
+       include/freetype/config/ftstdlib.h (ft_atoi): Replaced with...
+       (ft_atol): This.
+       * src/base/ftdbgmem.c: s/atol/ft_atol/.
+       * src/type42/t42drivr.c: s/ft_atoi/ft_atol/.
+
+2004-01-20  Masatake YAMATO  <jet@gyve.org>
+
+       * include/freetype/ftcache.h: Delete duplicated definition of
+       FTC_FaceID.
+
+       * src/cff/cffdrivr.c (cff_get_cmap_info): Call sfnt module's TT CMap
+       Info service function if the cmap comes from sfnt.  Return 0 if the
+       cmap is sythesized in cff module.
+
+2004-01-20  David Turner  <david@freetype.org>
+
+       * src/cache/ftcmanag.c (ftc_size_node_compare): Call
+       FT_Activate_Size.
+
+2004-01-20  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1parse.c (T1_Get_Private_Dict): Skip exactly one
+       CR, LF, or CR/LF after `eexec'.
+
+2004-01-18  David Turner  <david@freetype.org>
+
+       * src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Remove compiler
+       warning.
+
+       * src/tools/docmaker/*: Updating beautifier tool.
+
+2004-01-15  David Turner  <david@freetype.org>
+
+       * src/base/ftoutln.c (ft_orientation_extremum_compute): Fix
+       infinite loop bug.
+
+       * include/freetype/ftstroke.h: Include FT_GLYPH_H.
+       (FT_Stroker_Rewind, FT_Glyph_Stroke, FT_Glyph_StrokeBorder): New
+       declarations.
+
+       * src/base/ftstroke.c: Include FT_INTERNAL_OBJECTS_H.
+       (FT_Outline_GetOutsideBorder): Inverse result.
+       (FT_Stroker_Rewind, FT_Glyph_Stroke, FT_GlyphStrokeBorder): New
+       functions.
+       (FT_Stroker_EndSubPath): Close path if needed.
+       (FT_Stroker_Set, FT_Stroker_ParseOutline): Use FT_Stroker_Rewind.
+
+       * include/freetype/cache/ftcmanag.h (FTC_ScalerRec,
+       FTC_Manager_LookupSize): Moved to...
+       * include/freetype/ftcache.h (FTC_ScalerRec,
+       FTC_Manager_LookupSize): Here.
+
+       * src/tools/docmaker/docbeauty.py: New file to beautify the
+       documentation comments (e.g., to convert them to single block border
+       mode).
+       * src/tools/docmaker/docmaker.py (file_exists, make_file_list):
+       Moved to...
+       * src/tools/docmaker/utils.py (file_exists, make_file_list): Here.
+
+2004-01-14  David Turner  <david@freetype.org>
+
+       * include/freetype/internal/ftmemory.h (FT_ARRAY_COPY,
+       FT_ARRAY_MOVE): New macros to make copying arrays easier.
+       Updated all relevant code to use them.
+
+2004-01-14  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffload.c (cff_font_load): Load charstrings_index earlier.
+       Use number of charstrings as argument to CFF_Load_FD_Select (as
+       documented in the CFF specs).
+
+2004-01-13  Graham Asher  <graham.asher@btinternet.com>
+
+       * src/pshinter/pshalgo.c (psh_glyph_init): Move assignment of
+       `glyph->memory' up to free arrays properly in case of failure.
+
+2004-01-10  Masatake YAMATO  <jet@gyve.org>
+
+       Make `FT_Get_CMap_Language_ID' work with CFF.  Bug reported by
+       Steve Hartwell <shspamsink@comcast.net>.
+
+       * src/cff/cffdrivr.c: Include FT_SERVICE_TT_CMAP_H.
+       (cff_services): Added an entry for FT_SERVICE_ID_TT_CMAP.
+       (cff_get_cmap_info): New function.
+       (cff_service_get_cmap_info) New entry for cff_services.
+
+       * src/sfnt/ttcmap0.c: Exit loop after a format match has been found.
+       Suggested by Steve Hartwell <shspamsink@comcast.net>.
+
+2004-01-03  Masatake YAMATO  <jet@gyve.org>
+
+       * src/base/ftobjs.c (destroy_charmaps): New function.
+       (destroy_face, open_face): Use `destroy_charmaps'.
+
+2004-01-01  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2004-01-01  Michael Jansson  <mjan@em2-solutions.com>
+
+       * src/winfonts/winfnt.c (FNT_Size_Set_Pixels): Fix sign of
+       size->metrics.descender.
+
+2003-12-31  Wolfgang Domröse  <porthos.domroese@harz.de>
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings)
+       [FT_DEBUG_LEVEL_TRACE]: Use `%ld' in FT_TRACE4.
+       <cff_op_flex1>: Change type of dx and dy to FT_Pos and remove
+       cast for accessing arguments.
+
+2003-12-31  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Revert previous
+       change.  It's not necessary.
+
+2003-12-29  Smith Charles  <smith.charles@free.fr>
+
+       * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Handle `repeated
+       flags set' correctly.
+
+2003-12-29  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffobjs.c (cff_face_init): Fix memory leak by deallocating
+       `full' and `weight' properly.
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings)
+       <cff_op_hintmask> [FT_DEBUG_LEVEL_TRACE]: Use `0x' as prefix for
+       tracing output.
+
+2003-12-26  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/sfnt.h (TT_Set_SBit_Strike_Func):
+       Use FT_UInt for ppem values.
+       * src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Use FT_UInt for
+       ppem values.
+       * src/sfnt/ttsbit.h: Updated.
+
+       * src/base/ftobjs.c (FT_Set_Pixel_Sizes): Don't allow ppem values
+       larger than -0FFFF.
+
+2003-12-25  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/fttrigon.c, src/base/ftgloadr.c: Inlude
+       FT_INTERNAL_OBJECTS_H.
+
+       * src/base/ftstroke.c (FT_Outline_GetInsideBorder,
+       FT_Outline_GetOutsideBorder): s/or/o/ to make it compile with
+       C++ compilers.
+
+       * src/cache/ftcmru.c, include/freetype/cache/ftcmru.h:
+       s/select/selection/ to avoid compiler warning.
+       * src/cff/cffload.h: s/select/ftselect/ to avoid potential
+       compiler warning.
+
+2003-12-24  Werner Lemberg  <wl@gnu.org>
+
+       * src/cache/ftcsbits.c (FTC_SNode_Weight):
+       s/FTC_SBIT_ITEM_PER_NODE/FTC_SBIT_ITEMS_PER_NODE/.
+
+2003-12-24  David Turner  <david@freetype.org>
+
+       * Fixed compilation problems in the cache sub-system.
+
+       * Partial updates to src/autofit.
+
+       * Jamfile (FT2_COMPONENTS): Add autofit module.
+
+2003-12-23  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffgload.c (cff_lookup_glyph_by_stdcharcode): Handle
+       CID-keyed fonts.
+
+2003-12-23  David Turner  <david@freetype.org>
+
+       * include/freetype/internal/ftobjs.h (FT_PAD_FLOOR, FT_PAD_ROUND,
+       FT_PAD_CEIL, FT_PIX_FLOOR, FT_PIX_ROUND, FT_CEIL): New macros.  They
+       are used to avoid compiler warnings with very pedantic compilers.
+       Note that `(x) & -64' causes a warning if (x) is not signed.  Use
+       `(x) & ~63' instead!
+       Updated all related code.
+
+       Add support for extraction of `inside' and `outside' borders.
+
+       * src/base/ftstroke.c (FT_StrokerBorder): New enumeration.
+       (FT_Outline_GetInsideBorder, FT_Outline_GetOutsideBorder,
+       FT_Stroker_GetBorderCounts, FT_Stroker_ExportBorder): New functions.
+       (FT_StrokeBorderRec): New boolean member `valid'.
+       (ft_stroke_border_get_counts): Updated.
+       * include/freetype/ftstroke.h: Updated.
+
+2003-12-22  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/ftwinfnt.h (FT_WinFNT_ID_*): New definitions
+       to describe the `charset' field in FT_WinFNT_HeaderRec.
+       * src/winfonts/winfnt.c (FNT_Face_Init): Set encoding to
+       FT_ENCODING_NONE except for FT_WinFNT_ID_MAC.
+
+       * include/freetype/freetype.h (FT_Encoding): Improve comment,
+       based on work by Detlef Würkner <TetiSoft@apg.lahn.de>.
+
+       * docs/CHANGES: Updated.
+
+2003-12-22  David Turner  <david@freetype.org>
+
+       * include/freetype/ftcache.h,
+       include/freetype/cache/ftcmanag.h,
+       include/freetype/cache/ftccache.h,
+       include/freetype/cache/ftcmanag.h,
+       include/freetype/cache/ftcmru.h (added),
+       include/freetype/cache/ftlru.h (removed),
+       include/freetype/cache/ftcsbits.h,
+       include/freetype/cache/ftcimage.h,
+       include/freetype/cache/ftcglyph.h,
+       src/cache/ftcmru.c,
+       src/cache/ftcmanag.c,
+       src/cache/ftccache.c,
+       src/cache/ftcglyph.c,
+       src/cache/ftcimage.c,
+       src/cache/ftcsbits.c,
+       src/cache/ftccmap.c,
+       src/cache/ftcbasic.c (added),
+       src/cache/ftclru.c (removed):
+
+         *Complete* rewrite of the cache sub-system to `solve' the
+         following points:
+
+           - all public APIs have been moved to FT_CACHE_H, everything
+             under `include/freetype/cache' is only needed by client
+             applications that want to implement their own caches
+
+           - a new function named FTC_Manager_RemoveFaceID to deal
+             with the uninstallation of FaceIDs
+
+           - the image and sbit cache are now abstract classes, that
+             can be extended much more easily by client applications
+
+           - better performance in certain areas.  Further optimizations
+             to come shortly anyway...
+
+           - the FTC_CMapCache_Lookup function has changed its signature,
+             charmaps can now only be retrieved by index
+
+           - FTC_Manager_Lookup_Face => FTC_Manager_LookupFace
+             FTC_Manager_Lookup_Size => FTC_Manager_LookupSize (still in
+             private header for the moment)
+
+2003-12-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (parse_dict): Stop parsing if `eexec' keyword
+       is encountered.
+
+2003-12-19  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cfftypes.h (CFF_MAX_CID_FONTS): Increase to 32.  For
+       example, the Japanese Hiragino font already contains 15 subfonts.
+
+       * src/cff/cffload.c (cff_font_load): Deallocate `sids' array for
+       CID-keyed fonts.
+
+       * devel/ftoption.h: Define FT_DEBUG_MEMORY.
+
+2003-12-18  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/ttnameid.h (TT_ADOBE_ID_LATIN_1): New macro.
+       * src/type1/t1objs.c (T1_Face_Init): Use TT_ADOBE_ID* values.
+
+2003-12-18  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cfftypes.h (CFF_FontRecDictRec): Change type of
+       `cid_count' to `FT_ULong'.
+
+       * src/cff/cffgload.c (cff_slot_load): Take care of empty `cids'
+       array.
+
+       * src/cff/cffload.c (cff_charset_done): Free `cids' array.
+       (cff_font_load): Create cids array only for CID-keyed fonts which
+       are subsetted.
+
+       * src/cff/cffobjs.c (cff_face_init): Check the availability of
+       the PSNames modules for non-pure CFFs also.
+       Set FT_FACE_FLAG_GLYPH_NAMES for a non-pure CFF also if it isn't
+       CID-keyed.
+
+       * src/cff/rules.mk (CFF_DRV_H): Add cfftypes.h.
+
+2003-12-17  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfobjs.c (sfnt_init_face): Don't set
+       FT_FACE_FLAG_GLYPH_NAMES if the font contains a version 3.0 `post'
+       table.
+
+       * docs/CHANGES: Updated.
+
+2003-12-17  Masatake YAMATO  <jet@gyve.org>
+
+       Add new function FT_Get_CMap_Language_ID to extract the language ID
+       for TrueType/sfnt fonts.
+
+       * include/freetype/internal/services/svttcmap.h: New file.
+       * include/freetype/internal/ftserv.h (FT_SERVICE_TT_CMAP_H): Add
+       svttcmap.h.
+
+       * src/sfnt/sfdriver.c: Include ttcmap0.h.
+       (tt_service_get_cmap_info): New service.
+       (sfnt_services): Updated.
+
+       * src/sfnt/ttcmap0.c (tt_cmap*_get_info): New functions.
+       (tt_cmap*_class_rec): Add tt_cmap*_get_info members.
+       (tt_get_cmap_info): New function.
+       * src/sfnt/ttcmap0.h: Include FT_SERVICE_TT_CMAP_H.
+       (TT_CMap_ClassRec): New field `get_cmap_info'.
+       (tt_get_cmap_info): New declaration.
+
+       * src/base/ftobjs.c: Include FT_SERVICE_TT_CMAP_H.
+       (FT_Get_CMap_Language_ID): New function implementation.
+       * include/freetype/tttables.h (FT_Get_CMap_Language_ID): New
+       function declaration.
+
+2003-12-16  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttcmap.c, src/sfnt/ttcmap.h: Removed.  Obsolete.
+
+       * include/freetype/internal/sfnt.h (SFNT_Interface): Remove
+       obsolete fields `load_charmap' and `free_charmap'.
+       (TT_CharMap_Load_Func, TT_CharMap_Free_Func): Removed.
+       * src/sfnt/sfnt.c: Don't include ttcmap.c.
+       * src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttcmap.c.
+       * src/sfnt/ttload.c: Don't include ttcmap.h.
+       * src/sfnt/sfdriver.c: Don't include ttcmap.h.
+       (sfnt_interface): Updated.
+
+       * include/freetype/internal/tttypes.h (TT_TableDirRec,
+       TT_CMapDirRec, TT_CMapDirEntryRec, TT_CMap0, TT_CMap2SubHeaderRec,
+       TT_CMap2Rec, TT_CMap4Segment, TT_CMap4Rec, TT_CMap6,
+       TT_CMapGroupRec, TT_CMap8_12Rec, TT_CMap10Rec, TT_CharMap_Func,
+       TT_CharNext_Func, TT_CMapTableRec, TT_CharMapRec): Removed.
+       Obsolete.
+       * src/cff/cffobjs.h (CFF_CharMapRec): Removed.  Obsolete.
+
+2003-12-15  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2003-12-15  Wolfgang Domröse  <porthos.domroese@harz.de>
+
+       * builds/atari/*: New directory for building FreeType 2 on Atari
+       with the PureC compiler.
+
+2003-12-12  Wolfgang Domröse  <porthos.domroese@harz.de>
+
+       * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Add
+       cast.
+       * src/cff/cffdrivr.c (cff_ps_has_glyph_names): Assure that return
+       value is either 0 or 1.
+
+2003-12-12  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffdrivr.c (cff_get_glyph_name): Improve error message.
+       (cff_get_name_index): Return if no PSNames service is available.
+       (cff_ps_has_glyph_names): Handle CID-keyed fonts correctly.
+       * src/cff/cfftypes.h (CFF_CharsetRec): New field `cids', used for
+       CID-keyed fonts.  This is the inverse mapping of `sids'.
+       * src/cff/cffload.c (cff_charset_load): New argument `invert'.
+       Initialize charset->cids if `invert' is set.
+       (cff_font_load): In call to cff_charset_load, set `invert' to true
+       for CID-keyed fonts.
+       * src/cff/cffgload.c (cff_slot_load): Handle glyph index as CID
+       and map it to the real glyph index.
+
+       * docs/CHANGES: Updated.
+
+2003-12-11  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffobjs.c (cff_face_init): Don't set
+       FT_FACE_FLAG_GLYPH_NAMES for CID-keyed fonts.
+       Don't construct a cmap for CID-keyed fonts.
+
+2003-12-10  Werner Lemberg  <wl@gnu.org>
+
+       Use implementation specific SID value 0xFFFF to indicate that
+       a dictionary element is missing.
+
+       * src/cff/cffload.c (cff_subfont_load): Initialize all fields
+       which hold SIDs to 0xFFFF.
+       (cff_index_get_sid_string): Handle SID value 0xFFFF.
+       Handle case where `psnames' is zero.
+       (cff_font_load): Updated.
+       Don't load encoding for CID-keyed CFFs.
+
+       * src/cff/cffobjs.c (cff_face_init): Updated.
+       Don't check for PSNames module if font is CID-keyed.
+       Compute style name properly (using the same algorithm as in the
+       CID driver).
+       Fix computation of style flags.
+
+       * src/cff/cfftoken.h: Comment out handling of base_font_name.
+       Rename `postscript' field to `embedded_postscript'
+       * src/cff/cfftypes.h (CFF_FontRecDictRec): Remove `base_font_name'
+       and `postscript'.
+
+2003-12-10  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * src/pcf/pcfdrivr.c (pcf_get_charset_id): New function (a clone
+       of the similar BDF function).
+       (pcf_service_bdf): Use it.
+
+2003-12-09  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Set FT_FACE_FLAG_GLYPH_NAMES
+       only if a `post' table is present.
+
+2003-12-09  George Williams  <gww@silcom.com>
+
+       * src/base/ftobjs.c (load_mac_face): Recent versions of Linux
+       support Mac's HFS+ file system, thus enable code to read /rsrc on
+       non-Macintosh platforms also.
+
+2003-12-08  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/psaux.h (PS_TableRec): Change type
+       of `lengths' to FT_PtrDist.
+       (T1_DecoderRec): Change type of `subrs_len' to FT_PtrDist.
+       * include/freetype/internal/t1types.h (T1_FontRec): Change type
+       of `subrs_len' and `charstrings_len' to FT_PtrDist.
+
+       * src/base/ftobjs.c (Mac_Read_POST_Resource): Replace `junk'
+       variable with better solution.
+       (IsMacResource): Remove unused variable `map_len'.
+       Replace `junk' variable with better solution.
+       (FT_Open_Face) [!FT_MACINTOSH]: Add conditional
+       FT_CONFIG_OPTION_MAC_FONTS.
+
+2003-12-08  Wolfgang Domröse  <porthos.domroese@harz.de>
+
+       * src/autohint/ahhint.c (ah_hinter_hint_edges,
+       ah_hinter_align_strong_points): Add some casts.
+
+       * src/base/ftoutln.c (FT_OrientationExtremumRec): Change type
+       of `pos' to FT_Long.
+
+       * src/base/ftobjs.c (Mac_Read_POST_Resource,
+       Mac_Read_sfnt_Resource): Change type of `len' to FT_Long.
+
+       * src/type42/t42parse.c (t42_parse_dict): Add cast for `n_keywords'.
+
+2003-12-07  Werner Lemberg  <wl@gnu.org>
+
+       * docs/raster.txt: New file, taken from FreeType 1 and completely
+       revised.
+
+2003-12-04  Masatake YAMATO  <jet@gyve.org>
+
+       * src/type1/t1driver.c (Get_Interface): Remove FT_UNUSED for
+       t1_interface.  t1_interface is used.
+
+2003-11-27  David Turner  <david@freetype.org>
+
+       * src/pfr/pfrdrivr.c (pfr_get_metrics): Revert incorrect change of
+       2003-11-23: For PFR fonts, metrics->x_scale and metrics->y_scale are
+       the scaling values for outline units, not for metric units.
+
+2003-11-25  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftcalc.c, include/freetype/internal/ftcalc.h
+       (FT_MulDiv_No_Round): Surround code with `#ifdef
+       TT_CONFIG_OPTION_BYTECODE_INTERPRETER ... #endif'.
+
+2003-11-23  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftcalc.c (FT_MulDiv_No_Round): New function (32 and
+       64 bit version).
+       * include/freetype/internal/ftcalc.h: Updated.
+
+       * src/truetype/ttinterp.c (TT_MULDIV_NO_ROUND): New macro.
+       (TT_INT64): Removed.
+       (DO_DIV): Use TT_MULDIV_NO_ROUND.
+
+       * src/pfr/pfrdrivr.c (pfr_get_metrics): Directly use
+       metrics->x_scale and metrics->y_scale.
+
+2003-11-22  Rogier van Dalen  <R.C.van.Dalen@umail.leidenuniv.nl>
+
+       * src/truetype/ttinterp.c (CUR_Func_move_orig): New macro.
+       (Direct_Move_Orig, Direct_Move_Orig_X, Direct_Move_Orig_Y): New
+       functions.  Similar to Direct_Move, Direct_Move_X, and
+       Direct_Move_Y but without touching.
+       (Compute_Funcs): Use new functions.
+
+       (Round_None, Round_To_Grid, Round_To_Half_Grid, Round_Down_To_Grid,
+       Round_Up_To_Grid, Round_To_Double_Grid, Round_Super,
+       Round_Super_45): Fix rounding of value zero.
+
+       (DO_DIV): Don't use TT_MULDIV.
+
+       (Ins_SHC): This instruction actually touches the points.
+       (Ins_MSIRP): Fix undocumented behaviour.
+
+       * src/truetype/ttinterp.h (TT_ExecContextRec): Updated.
+
+2003-11-22  Werner Lemberg  <wl@gnu.org>
+
+       * docs/VERSION.DLL, docs/CHANGES: Updated.
+
+       * src/base/ftobjs.c (FT_Set_Char_Size): Make metrics->x_scale and
+       metrics->y_scale really precise.
+
+       (FT_Load_Glyph): Update computation of linearHoriAdvance and
+       linearVertAdvance.
+
+       * src/truetype/ttinterp.c (Update_Max): Use FT_REALLOC.
+
+2003-11-22  David Turner  <david@freetype.org>
+
+       * src/autofit/*: More updates.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 8.
+       * builds/unix/configure.ac (version_info): Set to 9:6:3.
+       * README: Updated.
+
+2003-11-13  John A. Boyd Jr.  <jaboydjr@netwalk.com>
+
+       * src/bdf/bdfdrivr.c (bdf_interpret_style), src/pcf/pcfread.c
+       (pcf_interpret_style): Replace spaces with dashes in properties
+       SETWIDTH_NAME and ADD_STYLE_NAME to simplify parsing.
+
+2003-11-11  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2003-11-11  John A. Boyd Jr.  <jaboydjr@netwalk.com>
+
+       Handle SETWIDTH_NAME and ADD_STYLE_NAME properties for BDF and PCF
+       fonts.
+
+       * src/bdf/bdfdrivr.c (bdf_interpret_style): New auxiliary function.
+       (BDF_Face_Init): Don't handle style properties but call
+       bdf_interpret_style.
+
+       * src/pcf/pcfread.c (pcf_interpret_style): New auxiliary function.
+       (pcf_load_font): Don't handle style properties but call
+       pcf_interpret_style.
+
+2003-11-07  Werner Lemberg  <wl@gnu.org>
+
+
+       * Version 2.1.7 released.
+       =========================
+
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 7.
+
+       * builds/unix/ft2unix.h: Fix comments.
+
+       * builds/unix/ftconfig.in: Synchronized with ANSI version.
+       Use `#undef' in templates as recommended in the autoconf
+       documentation.
+       Since real `#undef' lines don't survive during configuration, use
+       `/undef' instead; the postprocessing facility of the
+       AC_CONFIG_HEADERS autoconf macro converts them to `#undef'.
+
+       * builds/unix/install.mk (install): Install Unix version of
+       `ftconfig.h'.
+
+       * builds/unix/unix-cc.in (CFLAGS): Set FT_CONFIG_CONFIG_H macro
+       to include the correct `ftconfig.h' file.
+
+       * builds/unix/ft-munmap.m4 (FT_MUNMAP_DECL): Removed.
+       (FT_MUNMAP_PARAM): Updated syntax to autoconf 2.59.
+
+       * builds/unix/freetype2.m4: Updated syntax to autoconf 2.59.
+
+       * builds/unix/configure.ac: Use AC_CONFIG_HEADERS instead of
+       AC_CONFIG_HEADER to create ftconfig.h, and use second argument
+       to replace `/undef' with `#undef'.
+       Don't use FT_MUNMAP_DECL but AC_CHECK_DECLS to check for munmap.
+       Use AS_HELP_STRING in AC_ARG_WITH.
+       Update syntax to autoconf 2.59.
+
+       * builds/unix/ltmain.sh: Regenerated with `libtoolize --force
+       --copy' from libtool 1.5.
+       * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from
+       automake 1.7.8.
+       * builds/unix/configure: Regenerated with autoconf 2.59.
+       * builds/unix/config.guess, builds/unix/config.sub: Updated from
+       `config' CVS module at subversions.gnu.org
+       * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from
+       `texinfo' CVS module at subversions.gnu.org.
+
+       * builds/vms/ftconfig.h: Synchronized with ANSI version.
+
+       * docs/CUSTOMIZE: Fix documentation error.
+       * docs/CHANGES, docs/VERSION.DLL, docs/release: Updated.
+
+       * builds/freetype.mk (refdoc): Updated --title.
+
+2003-11-07  David Turner  <david@freetype.org>
+
+
+       * Version 2.1.6 released.
+       =========================
+
+
+       * install: Removed.  Obsolete.
+
+2003-11-04  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfdriver.c: Include FT_SERVICE_SFNT_H.
+       (sfnt_service_sfnt_table): New service.
+       (sfnt_services): Updated.
+
+       * docs/license.txt: Reworded.
+
+2003-11-03  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/*: Add a guard to all public header files which
+       load FT_FREETYPE_H to reject freetype.h from FreeType 1.
+
+2003-11-02  Patrick Welche  <prlw1@newn.cam.ac.uk>
+
+       * builds/unix/freetype2.m4, builds/unix/ft-munmap.m4: Protect
+       first argument of AC_DEFUN with brackets to avoid possible
+       expansion.
+
+2003-11-02  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/cache/ftcglyph.h: Don't include stddef.h.
+
+       * include/freetype/freetype.h: Fix check for ft2build.h.
+
+2003-11-01  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/freetype.h: Check that ft2build.h has been
+       loaded first.
+
+       * src/base/fttype1.c (FT_Get_PS_Font_Info): Fix incorrectly applied
+       patch.
+
+2003-10-31  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * src/base/fttype1.c (FT_Get_PS_Font_Info, FT_Has_PS_Glyph_Names):
+       Fix parameter order in calls to FT_FACE_FIND_SERVICE.
+
+2003-10-31  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/ftserv.h
+       (FT_SERVICE_POSTSCRIPT_NAMES_H): Removed.  Unused.
+
+       * src/type42/t42drivr.c (t42_services): Updated.
+
+2003-10-29  David Turner  <david@freetype.org>
+
+       * include/freetype/internal/bdftypes.h: Removed.  Obsolete.
+       * src/base/ftbdf.c: Updated.
+
+       * include/freetype/internal/cfftypes.h: Moved to...
+       * src/cff/cfftypes.h: This place since no other module needs to
+       know about those types.
+
+       * include/freetype/internal/t42types.h: Moved to...
+       * src/type42/t42types.h: This place since no other module needs to
+       know about those types.
+
+       * include/freetype/internal/services/svbdf.h: Include FT_BDF_H.
+
+       * include/freetype/internal/services/svpsname.h: Renamed to...
+       * include/freetype/internal/services/svpscmap.h: This.
+       Updated `FT_Service_PsNames' -> `FT_Service_PsCMaps' and
+       `POSTSCRIPT_NAMES' -> `POSTSCRIPT_CMAPS' everywhere.
+
+       * include/freetype/internal/services/svpsinfo.h: New file, providing
+       PostScript info service.
+
+       * include/freetype/internal/ftserv.h (FT_SERVICE_POSTSCRIPT_CMAPS_H,
+       FT_SERVICE_POSTSCRIPT_INFO_H): New macros for svpscmap.h and
+       svpsinfo.h.
+       * include/freetype/internal/internal.h (FT_INTERNAL_TYPE42_TYPES_H,
+       FT_INTERNAL_CFF_TYPES_H, FT_INTERNAL_BDF_TYPES_H): Removed.
+
+       * src/base/fttype1.c: Don't include FT_INTERNAL_TYPE1_TYPES_H and
+       FT_INTERNAL_TYPE42_TYPES_H but FT_INTERNAL_SERVICE_H and
+       FT_SERVICE_POSTSCRIPT_INFO_H.
+       (FT_Get_PS_Font_Info, FT_Has_PS_Glyph_Names): Use new
+       POSTSCRIPT_INFO service.
+
+       * src/cff/cffdrivr.c: Include FT_SERVICE_POSTSCRIPT_INFO_H.
+       (cff_ps_has_glyph_names): New function.
+       (cff_service_ps_info): New service.
+       (cff_services): Updated.
+
+       * src/cff/cffload.h, src/cff/cffobjs.h, src/cff/cffparse.h: Don't
+       include FT_INTERNAL_CFF_TYPES_H but cfftypes.h directly.
+
+       * src/cif/cidriver.c: Include FT_SERVICE_POSTSCRIPT_INFO_H.
+       (cid_ps_get_font_info): New function.
+       (cid_service_ps_info): New service.
+       (cid_services): Updated.
+
+       * src/type1/t1driver.c: Include FT_SERVICE_POSTSCRIPT_INFO_H.
+       (t1_ps_get_font_info, t1_ps_has_glyph_names): New functions.
+       (t1_service_ps_info): New service.
+       (t1_services): Updated.
+
+       * src/type42/t42drivr.c: Include FT_SERVICE_POSTSCRIPT_INFO_H.
+       (t42_ps_get_font_info, t42_ps_has_glyph_names): New functions.
+       (t42_service_ps_info): New service.
+
+       * src/type42/t42objs.h: Don't include FT_INTERNAL_TYPE42_TYPES_H
+       but t42types.h directly.
+
+       * src/psnames/psmodule.c (psnames_interface, psnames_services):
+       Renamed to...
+       (pscmaps_interface, pscmaps_services): This.
+       Updated all users.
+
+
+       * src/gzip/infblock.c (inflate_blocks): Remove compiler warning.
+
+2003-10-22  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (parse_encoding): Handle `/Encoding [ ... ]'.
+
+       * src/type1/t1parse.c (T1_Get_Private_Dict): Test whether `eexec'
+       is real.
+
+       * src/type42/t42parse.c (t42_parse_encoding): Improve boundary
+       checking while parsing.
+
+       * docs/CHANGES: Updated.
+
+2003-10-21  Josselin Mouette  <joss@debian.org>
+
+       * include/freetype/internal/t1types.h (T1_FontRec): `paint_type'
+       and `stroke_width' aren't pointers.
+
+       * src/type42/t42objs.c (T42_Face_Done), src/type1/t1objs.c
+       (T1_Face_Done): Don't free `paint_type' and `stroke_width'.
+
+2003-10-20  Graham Asher  <graham.asher@btinternet.com>
+
+       * src/winfonts/winfnt.c (fnt_cmap_class): Fix position of `const'.
+
+2003-10-19  Werner Lemberg  <wl@gnu.org>
+
+       * src/autohint/ahhint.c (ah_hinter_load_glyph): Patch from
+       2003-08-18 introduced a severe bug (FT_Render_Glyph was called
+       twice under some circumstances, causing strange results).  This
+       is fixed now by clearing the FT_LOAD_RENDER bit of `load_flags'.
+
+       * src/base/ftpfr.c (FT_Get_PFR_Metrics): Initialize `error'.
+       * src/psaux/psobjs.c (ps_tobytes): Initialize `n'.
+       * src/type42/t42parse.c (t42_parse_sfnts): Initialize `string_size'.
+
+2003-10-16  Werner Lemberg  <wl@gnu.org>
+
+       Completely revised Type 42 parser.  It now handles both fonts
+       produced with ttftot42 (tested version 0.3.1) and
+       TrueTypeToType42.ps (tested version May 2001; it is necessary to
+       fix the broken header comment to be `%!PS-TrueTypeFont...').
+
+       * src/type42/t42objs.c (T42_GlyphSlot_Load): Change fourth
+       parameter to `FT_UInt'.
+       * src/type42/t42objs.h: Updated.
+
+       * src/type42/t42parse.h (T42_ParserRec): Change type of `in_memory'
+       to FT_Bool.
+       (T42_Loader): Change type of `num_chars' and `num_glyphs' to
+       FT_UInt.
+       Add `swap_table' element.
+       * src/type42/t42parse.c (T42_KEYWORD_COUNT, T1_ToFixed,
+       T1_ToCoordArray, T1_ToTokenArray): Removed.
+       (T1_ToBytes): New macro.
+       (t42_is_alpha, t42_hexval): Removed.
+       (t42_is_space): Handle `\0'.
+       (t42_parse_encoding): Updated to use new PostScript parser routines
+       from psaux.
+       Handle `/Encoding [ ... ]' also.
+       (T42_Load_Status): New enumeration.
+       (t42_parse_sfnts): Updated to use new PostScript parser routines
+       from psaux.
+       (t42_parse_charstrings): Updated to use new PostScript parser
+       routines from psaux.
+       Handle `/CharStrings << ... >>' also.
+       Don't expect that /.notdef is the first element in dictionary.  Copy
+       code from type1 module to handle this.
+       (t42_parse_dict): Updated to use new PostScript parser routines
+       from psaux.
+       Remove code for synthetic fonts (which can't occur in Type 42
+       fonts).
+       (t42_loader_done): Release `swap_table'.
+
+       * src/psaux/psobjs.c (skip_string): Increase `cur' properly.
+
+       * src/type1/t1load.c (parse_charstrings): Make test for `.notdef'
+       faster.
+
+2003-10-15  Graham Asher  <graham.asher@btinternet.com>
+
+       * src/autohint/ahglobal.c (blue_chars), src/winfonts/winfnt.c
+       (fnt_cmap_class_rec, fnt_cmap_class), src/bdf/bdflib.c (empty,
+       _num_bdf_properties), src/gzip/infutil.c (inflate_mask),
+       src/gzip/inffixed.h (fixed_bl, fixed_bd, fixed_tl, fixed_td),
+       src/gzip/inftrees.h (inflate_trees_fixed), srf/gzip/inftrees.c
+       (inflate_trees_fixed): Decorate with more `const' to avoid
+       writable global variables which are disallowed on ARM.
+
+2003-10-08  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (parse_font_matrix, parse_charstrings): Remove
+       code specially for synthetic fonts; this is handled elsewhere.
+       (parse_encoding): Remove code specially for synthetic fonts; this is
+       handled elsewhere.
+       Improve boundary checking while parsing.
+       (parse_dict): Improve boundary checking while parsing.
+       Use ft_memcmp to simplify code.
+
+2003-10-07  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (parse_subrs, parse_dict): Handle synthetic
+       fonts properly.
+       (parse_charstrings): Copy correct number of characters into
+       `name_table'.
+
+2003-10-06  Werner Lemberg  <wl@gnu.org>
+
+       Heavy modification of the PS parser to handle comments and strings
+       correctly.  This doesn't slow down the loading of PS fonts
+       significantly since charstrings aren't affected.
+
+       * include/freetype/config/ftstdlib.h (ft_xdigit): Renamed to...
+       (ft_isxdigit): This.  Updated all callers.
+       (ft_isdigit): New alias to `isdigit'.
+
+       * include/freetype/internal/psaux.h (PS_Parser_FuncsRec): Renamed
+       `skip_alpha' to `skip_PS_token'.
+       Add parameter to `to_bytes' and change some argument types.
+
+       * src/psaux/psauxmod.c (ps_parser_funcs): Updated.
+       * src/psaux/psobjs.c (ft_char_table): New array to map character
+       codes (ASCII and EBCDIC) of digits to numbers.
+       (OP): New auxiliary macro holding either `>=' or `<' depending on
+       the character encoding.
+       (skip_comment): New function.
+       (skip_spaces): Use it.
+       (skip_alpha): Removed.
+       (skip_literal_string, skip_string): New functions.
+       (ps_parser_skip_PS_token): New function.  This is a better
+       replacement of...
+       (ps_parser_skip_alpha): Removed.
+       (ps_parser_to_token, ps_parser_to_token_array): Updated.
+       (T1Radix): Rewritten, using `ft_char_table'.
+       (t1_toint): Renamed to...
+       (ps_toint): This.  Update all callers.
+       Use `ft_char_table'.
+       (ps_tobytes): Add parameter to handle delimiters and change some
+       argument types.
+       Use `ft_char_table'.
+       (t1_tofixed): Renamed to...
+       (ps_tofixed): This.  Update all callers.
+       Use `ft_char_table'.
+       (t1_tocoordarray): Renamed and updated to...
+       (ps_tocoordarray): This.  Update all callers.
+       (t1_tofixedarray): Renamed and updated to...
+       (ps_tofixedarray): This.  Update all callers.
+       (t1_tobool): Renamed to...
+       (ps_tobool): This.  Update all callers.
+       (ps_parser_load_field): Updated.
+       (ps_parser_load_field_table): Use `T1_MAX_TABLE_ELEMENTS'
+       everywhere.
+       (ps_parser_to_int, ps_parser_to_fixed, ps_parser_to_coord_array,
+       ps_parser_to_fixed_array): Skip spaces.  Updated.
+       (ps_parser_to_bytes): Add parameter to handle delimiters and change
+       some argument types.  Updated.
+       * src/psaux/psobjs.h: Updated.
+
+       * src/cid/cidload.c (cid_parse_dict): Updated.
+       * src/cid/cidparse.c (cid_parser_new): Check whether the `StartData'
+       token was really found.
+       * src/cid/cidparse.h (cid_parser_skip_alpha): Updated and renamed
+       to...
+       (cid_parser_skip_PS_token): This.
+
+       * src/type1/t1parse.h (T1_ParserRec): Use `FT_Bool' for boolean
+       fields.
+       (T1_Skip_Alpha): Replaced with...
+       (T1_Skip_PS_Token): This new macro.
+       * src/type1/t1parse.c (hexa_value): Removed.
+       (T1_Get_Private_Dict): Use `ft_isxdigit' and
+       `psaux->ps_parser_funcs_to_bytes' for handling ASCII hexadecimal
+       encoding.
+       After decrypting, replace the four random bytes at the beginning
+       with whitespace.
+       * src/type1/t1load.c (t1_allocate_blend): Use proper error values.
+       (parser_blend_design_positions, parse_blend_design_map,
+       parse_weight_vector): Updated.
+       (is_space): Handle `\f' also.
+       (is_name_char): Removed.
+       (read_binary_data): Updated.
+       (parse_encoding): Use `ft_isdigit'.
+       Updated.
+       (parse_subrs): Updated.
+       (TABLE_EXTEND): New macro.
+       (parse_charstrings): Updated.
+       Provide a workaround for buggy fonts which have more entries in the
+       /CharStrings dictionary then expected; the function now adds some
+       slots and skips entries which still exceed the new limit.
+       (parse_dict): Updated.
+       Terminate on the token `closefile'.
+
+       * src/type42/t42parse.c (T1_Skip_Alpha): Replaced with...
+       (T1_Skip_PS_Token): This new macro.  Updated all callers.
+       (t42_parse_encoding): Use `ft_isdigit'.
+
+
+       * src/base/ftmm.c (ft_face_get_mm_service): Return FT_Err_OK if
+       success.
+
+2003-10-05  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/ftmodule.h: Renamed to...
+       * include/freetype/ftmodapi.h: This to avoid duplicate file names.
+       * include/freetype/config/ftheader.h (FT_MODULE_H): Updated.
+
+2003-10-04  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftoutln.c (FT_OrientationExtremumRec,
+       FT_Outline_Get_Orientation): Trivial typo fixes to make it compile.
+
+2003-10-02  Markus F.X.J. Oberhumer  <markus@oberhumer.com>
+
+       * src/winfonts/winfnt.c (FT_WinFNT_HeaderRec): `color_table_offset'
+       has four bytes, not two.
+       Fix all users.
+       (fnt_font_load, FNT_Load_Glyph): Add more font validity tests.
+
+2003-10-01  David Turner  <david@freetype.org>
+
+       * src/autofit/*: Adding first source files of the new multi-script
+       `auto-fitter'.
+
+       * include/freetype/ftoutln.h (FT_Orientation): New enumeration.
+       (FT_Outline_Get_Orientation): New declaration.
+
+       * src/base/ftoutln.c (FT_OrientationExtremumRec): New structure.
+       (ft_orientation_extremum_compute): New auxiliary function.
+       (FT_Outline_Get_Orientation): New function to compute the fill
+       orientation of a given glyph outline.
+
+       * include/freetype/internal/ftserv.h (FT_FACE_LOOKUP_SERVICE): Fixed
+       trivial bug which could crash the font engine when a cached service
+       pointer was retrieved.
+
+2003-09-30  Werner Lemberg  <wl@gnu.org>
+
+       * src/cid/cidload.c (cid_parse_dict): Skip token if no keyword is
+       found.
+
+       * src/type1/t1parse.c (IS_T1_WHITESPACE, IS_T1_LINESPACE,
+       IS_T1_SPACE): Removed.
+       (PFB_Tag): Removed.
+       (read_pfb_tag): Don't use PFB_Tag.
+
+       * src/type42/t42parse.c (t42_is_space): Handle `\f' also.
+       (t42_parse_encoding): Handle synthetic fonts.
+
+2003-09-29  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/t1types.h: Don't include
+       FT_INTERNAL_OBJECTS_H but FT_INTERNAL_SERVICE_H.
+       * src/truetype/ttobjs.c: Don't include
+       FT_SERVICE_POSTSCRIPT_NAMES_H.
+
+2003-09-29  David Turner  <david@freetype.org>
+
+       Added new service to handle glyph name dictionaries, replacing the
+       old internal header named `psnames.h' by `services/svpsname.h'.
+       Note that this is different from `services/svpostnm.h' which only
+       handles the retrieval of PostScript font names for a given face.
+       (Should we merge these two services into a single header?)
+
+       * include/freetype/internal/psnames.h: Removed.  Most of its
+       contents is moved to...
+       * include/freetype/internal/services/svpsname.h: New file.
+
+       * include/freetype/internal/services/svpostnm.h
+       (FT_SERVICE_ID_POSTSCRIPT_NAME): Replaced with...
+       (FT_SERVICE_ID_POSTSCRIPT_FONT_NAME): New macro.
+       (PsName): Service named changed to...
+       (PsFontName): This.
+       Updated `FT_Service_PsName' -> `FT_Service_PsFontName' and
+       `POSTSCRIPT_NAME' -> `POSTSCRIPT_FONT_NAME' everywhere.
+
+       * include/freetype/internal/internal.h
+       (FT_INTERNAL_POSTSCRIPT_NAMES_H): Removed.
+       * include/freetype/internal/psaux.h: Include
+       FT_SERVICE_POSTSCRIPT_NAMES_H.
+       (T1_DecoderRec): Updated type of `psnames'.
+       * include/freetype/internal/t1types.h: Don't include
+       FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H.
+       Include FT_INTERNAL_OBJECTS_H.
+       * include/freetype/internal/t42types.h: Don't include
+       FT_INTERNAL_POSTSCRIPT_NAMES_H.
+       * include/freetype/internal/tttypes.h (TT_FaceRec): Updated.
+
+       * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE): Changed
+       order of parameters.  All callers updated.
+       (FT_FACE_FIND_GLOBAL_SERVICE): New macro to look up a service
+       globally, checking all modules.
+       (FT_ServiceCacheRec): Updated.
+       (FT_SERVICE_POSTSCRIPT_NAMES_H): New macro for accessing
+       `svpsname.h'.
+
+       * include/freetype/internal/ftobjs.h, src/base/ftobjs.c
+       (ft_module_get_service): New function.
+
+       * src/cff/cffdrivr.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H
+       but FT_SERVICE_POSTSCRIPT_NAMES_H.
+       (cff_get_glyph_name, cff_get_name_index): Use new POSTSCRIPT_NAMES
+       service.
+       * src/cff/cffcmap.c (cff_cmap_unicode_init): Updated.
+       * src/cff/cffload.c, src/cff/cffload.h:  Don't include
+       FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H.
+       (cff_index_get_sid_string): Updated.
+       * src/cff/cffobjs.c:  Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H
+       but FT_SERVICE_POSTSCRIPT_NAMES_H.
+       (cff_face_init): Use new POSTSCRIPT_NAMES service.
+       * src/cff/cffobjs.h:  Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H
+       but FT_SERVICE_POSTSCRIPT_NAMES_H.
+
+       * src/cid/cidobjs.c:  Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H
+       but FT_SERVICE_POSTSCRIPT_NAMES_H.
+       (cid_face_init): Use new POSTSCRIPT_NAMES service.
+       * src/cid/cidriver.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H.
+
+       * src/psaux/t1cmap.c (t1_cmap_std_init, t1_cmap_unicode_init): Use
+       new POSTSCRIPT_NAMES service.
+       * src/psaux/t1decode.h (t1_lookup_glyph_by_stdcharcode,
+       t1_decode_init): Use new POSTSCRIPT_NAMES service.
+       * src/psaux/t1cmap.h, src/psaux/t1decode.h: Dont' include
+       FT_INTERNAL_POSTSCRIPT_NAMES_H.
+
+       * src/psnames/psmodule.c:  Don't include
+       FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H.
+       (ps_build_unicode_table): Renamed to...
+       (ps_unicodes_init): This.
+       (ps_lookup_unicode): Renamed to...
+       (ps_unicodes_char_index): This.
+       (ps_next_unicode): Renamed to...
+       (ps_unicodes_char_next): This.
+       (psnames_interface): Updated.
+       (psnames_services): New services list.
+       (psnames_get_service): New function.
+       (psnames_module_class): Updated.
+
+       * src/sfnt/sfobjs.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H
+       but FT_SERVICE_POSTSCRIPT_NAMES_H.
+       (sfnt_init_face): Use new POSTSCRIPT_NAMES service.
+       * src/sfnt/ttpost.c: Don't include FT_INTERNAL_POSTSCRIPT_NAMES_H
+       but FT_SERVICE_POSTSCRIPT_NAMES_H.
+       (tt_face_get_ps_name): Updated.
+
+       * src/truetype/ttobjs.c:  Don't include
+       FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H.
+
+       * src/type1/t1driver.c:  Don't include
+       FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H.
+       * src/type1/t1objs.c:  Don't include
+       FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H.
+       (T1_Face_Init): Use new POSTSCRIPT_NAMES service.
+
+       * src/type42/t42drivr.c (t42_get_ps_name): Renamed to...
+       (t42_get_ps_font_name): This.
+       (t42_service_ps_name): Renamed to...
+       (t42_service_ps_font_name): This.
+       (t42_services): Updated.
+       * src/type42/t42objs.c (T42_Face_Init): Use new POSTSCRIPT_NAMES
+       service.
+       * src/type42/t42objs.h:  Don't include
+       FT_INTERNAL_POSTSCRIPT_NAMES_H but FT_SERVICE_POSTSCRIPT_NAMES_H.
+
+
+       * src/base/ftglyph.c (FT_Get_Glyph): Don't access `slot' before
+       testing its validity.  Reported by Henry Maddocks
+       <maddocks@metservice.com>.
+
+2003-09-21  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE):
+       Fix compilation warning (s/pptr/Pptr/).
+
+       * include/freetype/internal/internal.h (FT_INTERNAL_PFR_H,
+       FT_INTERNAL_FNT_TYPES_H): Removed.
+
+2003-09-21  David Turner  <david@freetype.org>
+
+       Migrating the PFR and WINFNT drivers to the new service-based
+       internal API.
+
+       * include/freetype/internal/fnttypes.h: Removed.  Most of its data
+       are moved to winfnt.h and...
+       * include/freetype/internal/services/svwinfnt.h: New file.
+
+       * include/freetype/internal/pfr.h: Removed.  Most of its data are
+       moved to...
+       * include/freetype/internal/services/svpfr.h: New file.
+
+       * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE,
+       FT_FACE_LOOKUP_SERVICE): Simplify fix of 2003-09-16 by removing
+       pointer type argument.
+       Updated all callers.
+       Update macro names of services header files.
+
+       * src/base/ftobjs.c (FT_Get_Name_Index): Simplified code.
+
+       * src/base/ftpfr.c: Include FT_SERVICE_PFR_H instead of
+       FT_INTERNAL_PFR_H.
+       (ft_pfr_check, FT_Get_PFR_Metrics, FT_Get_PFR_Kerning,
+       FT_Get_PFR_Advance): Use services provided in `PFR_METRICS'.
+
+       * src/base/ftwinfnt.c: Include FT_SERVICE_WINFNT_H instead of
+       FT_INTERNAL_FNT_TYPES_H.
+       (FT_Get_WinFNT_Header): Use service provided in `WINFNT'.
+
+       * src/pfr/pfrdrivr.c: Include FT_SERVICE_PFR_H and
+       FT_SERVICE_XFREE86_NAME_H instead of FT_INTERNAL_PFR_H.
+       (pfr_service_bdf): Updated.
+       (pfr_services): New services list.
+       (pfr_get_service): New function.
+       (pfr_driver_class): Updated.
+
+       * src/winfonts/winfnt.c: Include FT_SERVICE_WINFNT_H and
+       FT_SERVICE_XFREE86_NAME_H instead of FT_INTERNAL_FNT_TYPES_H.
+       (winfnt_get_header, winfnt_get_service): New functions.
+       (winfnt_service_rec): New structure providing WINFNT services.
+       (winfnt_services): New services list.
+       (winfnt_driver_class): Updated.
+       * src/winfonts/winfnt.h: Add most of the removed fnttypes.h data.
+
+       * src/sfnt/sfdriver.c (sfnt_service_ps_name): Fix typo.
+
+       * src/type1/t1driver.c (t1_service_ps_name): Fix typo.
+
+       * src/cff/cffobjs.c, src/cid/cidobjs.c, src/pfr/pfrsbit.c,
+       src/psaux/psobjs.c, src/sfnt/sfobjs.c, src/truetype/ttobjs.c,
+       src/type1/t1objs.c, src/type42/t42objs.c: Removing various compiler
+       warnings.
+
+2003-09-19  David Bevan  <dbevan@emtex.com>
+
+       * src/type1/t1parse.c (pfb_tag_fields): Removed.
+       (read_pfb_tag): Fix code so that it doesn't fail on end-of-file
+       indicator (0x8003).
+       * docs/CHANGES: Updated.
+
+2003-09-16  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/ftserv.h (FT_FACE_FIND_SERVICE,
+       FT_FACE_LOOKUP_SERVICE): Add parameter to pass pointer type.
+       Ugly, I know, but this is needed for compilation with C++ --
+       maybe someone knows a better solution?
+       Updated all callers.
+
+       * src/base/ftobjs.c (FT_Get_Name_Index, FT_Get_Glyph_Name): Remove
+       C++ compiler warnings.
+
+       * src/base/ftbdf.c (FT_Get_BDF_Charset_ID, FT_Get_BDF_Property):
+       Fix order of arguments passed to FT_FACE_FIND_SERVICE.
+
+2003-09-15  Werner Lemberg  <wl@gnu.org>
+
+       Avoid header files with identical names.
+
+       * include/freetype/internal/services/bdf.h: Renamed to...
+       * include/freetype/internal/services/svbdf.h: This.
+       Add copyright notice.
+       * include/freetype/internal/services/glyfdict.h: Renamed to...
+       * include/freetype/internal/services/svgldict.h: This.
+       Add copyright notice.
+       * include/freetype/internal/services/multmast.h: Renamed to...
+       * include/freetype/internal/services/svmm.h: This.
+       Add copyright notice.
+       Add FT_BEGIN_HEADER and FT_END_HEADER.
+       * include/freetype/internal/services/sfnt.h: Renamed to...
+       * include/freetype/internal/services/svsfnt.h: This.
+       Add copyright notice.
+       * include/freetype/internal/services/postname.h: Renamed to...
+       * include/freetype/internal/services/svpostnm.h: This.
+       Add copyright notice.
+       * include/freetype/internal/services/xf86name.h: Renamed to...
+       * include/freetype/internal/services/svxf86nm.h: This.
+       Add copyright notice.
+
+       * include/freetype/internal/ftserv.h: Add FT_BEGIN_HEADER and
+       FT_END_HEADER.
+       Add copyright notice.
+       Update macro names of services header files.
+
+       * builds/freetype.mk (SERVICES_DIR): New variable.
+       (BASE_H): Add services header files.
+
+2003-09-11  Werner Lemberg  <wl@gnu.org>
+
+       * builds/toplevel.mk (distclean): Remove `builds/unix/freetype2.pc'.
+
+       * src/cff/cffdrivr.c: Don't load headers twice.
+
+       * include/freetype/internal/ftserv.h (FT_SERVICE_SFNT_H): New macro.
+       * src/base/ftobjs.c: Include FT_SERVICE_SFNT_H.
+
+       * src/cff/cffcmap.c: Include `cfferrs.h'.
+       * src/pfr/pfrdrivr.c: Include `pfrerror.h'.
+       * src/sfnt/sfdriver.c: Include `sferrors.h'.
+       * src/psaux/psobjs.h: Add declaration for `ps_parser_to_bytes'.
+
+2003-09-11  David Turner  <david@freetype.org>
+
+       Introducing the concept of `module services'.  This is the first
+       step towards a massive simplification of the engine's internals, in
+       order to get rid of various numbers of hacks.
+
+       Note that these changes will break source & binary compatibility for
+       authors of external font drivers.
+
+       * include/freetype/config/ftconfig.h (FT_BEGIN_STMNT, FT_END_STMNT,
+       FT_DUMMY_STMNT): New macros.
+
+       * include/freetype/internal/ftserv.h: New file, containing the new
+       structures and macros to provide `services'.
+
+       * include/freetype/internal/internal.h (FT_INTERNAL_EXTENSION_H,
+       FT_INTERNAL_EXTEND_H, FT_INTERNAL_HASH_H, FT_INTERNAL_OBJECT_H):
+       Removed, obsolete.
+       (FT_INTERNAL_SERVICE_H): New macro for `ftserv.h'.
+
+       * include/freetype/internal/services/bdf.h,
+       include/freetype/internal/services/glyfdict.h,
+       include/freetype/internal/services/postname.h,
+       include/freetype/internal/services/xf86name.h: New files.
+
+       * include/freetype/ftmm.h (FT_Get_MM_Func, FT_Set_MM_Design_Func,
+       FT_Set_MM_Blend_Func): Function pointers moved (in modified form)
+       to...
+       * include/freetype/internal/services/multmast.h: New file.
+
+       * include/freetype/internal/sfnt.h (SFNT_Interface): `get_interface'
+       is now of type `FT_Module_Requester'.
+       (SFNT_Get_Interface_Func, SFNT_Load_Table_Func): Function pointers
+       moved (in modified form) to...
+       * include/freetype/internal/services/sfnt.h: New file.
+
+       * include/freetype/tttables.h (FT_Get_Sfnt_Table_Func): Function
+       pointer moved (in modified form) to `services/sfnt.h'.
+
+       * include/freetype/ftmodule.h (FT_Module_Interface): Make it a
+       a typedef to `FT_Pointer'.
+
+       * include/freetype/internal/tttypes.h (TT_FaceRec): Add
+       `postscript_name'.
+       * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove
+       `postscript_name'.
+       Add `services' element.
+       (FT_LibraryRec): Remove `meta_class'.
+
+       * src/base/ftbdf.c: Include FT_SERVICE_BDF_H.
+       (test_font_type): Removed.
+       (FT_Get_BDF_Charset_ID, FT_Get_BDF_Property): Use services
+       provided in `FT_SERVICE_ID_BDF'.
+
+       * src/base/ftmm.c: Include FT_SERVICE_MULTIPLE_MASTERS_H.
+       (ft_face_get_mm_service): New auxiliary function to get services
+       from `FT_SERVICE_ID_MULTI_MASTERS'.
+       (FT_Get_Multi_Master, FT_Set_MM_Design_Coordinates,
+       FT_Set_MM_Blend_Coordinates): Use `ft_face_get_mm_service'.
+
+       * src/base/ftobjs.c: Include FT_SERVICE_POSTSCRIPT_NAME_H and
+       FT_SERVICE_GLYPH_DICT_H.
+       (ft_service_list_lookup): New function to get a specific service.
+       (destroy_face): Updated.
+       (Mac_Read_POST_Resource): Simplify some code.
+       (IsMacResource): Fix warnings.
+       (FT_Get_Name_Index, FT_Get_Glyph_Name): Use services provided in
+       `FT_SERVICE_ID_GLYPH_DICT'.
+       (FT_Get_Postscript_Name): Use service provided in
+       `FT_SERVICE_ID_POSTSCRIPT_NAME'.
+       (FT_Get_Sfnt_Table, FT_Load_Sfnt_Table): Use services provided in
+       `FT_SERVICE_ID_SFNT_TABLE'.
+
+       * src/base/ftxf86.c: Include FT_SERVICE_XFREE86_NAME_H.
+       (FT_Get_X11_Font_Format): Use service provided in
+       `FT_SERVICE_ID_XF86_NAME'.
+
+       * src/bdf/bdfdrivr.c: Include FT_SERVICE_BDF_H and
+       FT_SERVICE_XFREE86_NAME_H.
+       (bdf_get_charset_id): New function.
+       (bdf_service_bdf): New structure providing BDF services.
+       (bdf_services): New services list.
+       (bdf_driver_requester): Use `ft_service_list_lookup'.
+
+       * src/cff/cffdrivr.c: Include FT_SERVICE_XFREE86_NAME_H and
+       FT_SERVICE_GLYPH_DICT_H.
+       (cff_service_glyph_dict): New structure providing CFF services.
+       (cff_services): New services list.
+       (cff_get_interface): Use `ft_service_list_lookup'.
+
+       * src/cid/cidriver.c: Include FT_SERVICE_POSTSCRIPT_NAME_H and
+       FT_SERVICE_XFREE86_NAME_H.
+       (cid_service_ps_name): New structure providing CID services.
+       (cid_services): New services list.
+       (cid_get_interface): Use `ft_service_list_lookup'.
+
+       * src/pcf/pcfdrivr.c: Include FT_SERVICE_BDF_H and
+       FT_SERVICE_XFREE86_NAME_H.
+       (pcf_service_bdf): New structure providing PCF services.
+       (pcf_services): New services list.
+       (pcf_driver_requester): Use `ft_service_list_lookup'.
+
+       * src/sfnt/sfdriver.c: Include FT_SERVICE_GLYPH_DICT_H and
+       FT_SERVICE_POSTSCRIPT_NAME_H.
+       (get_sfnt_glyph_name): Renamed to...
+       (sfnt_get_glyph_name): This.
+       (get_sfnt_postscript_name): Renamed to...
+       (sfnt_get_ps_name): This.
+       Updated.
+       (sfnt_service_glyph_dict, sfnt_service_ps_name): New structures
+       providing services.
+       (sfnt_services): New services list.
+       (sfnt_get_interface): Use `ft_service_list_lookup'.
+
+       * src/truetype/ttdriver.c: Include FT_SERVICE_XFREE86_NAME_H.
+       (tt_services): New services list.
+       (tt_get_interface): Use `ft_service_list_lookup'.
+
+       * src/type1/t1driver.c: Include FT_SERVICE_MULTIPLE_MASTERS_H,
+       FT_SERVICE_GLYPH_DICT_H, FT_SERVICE_XFREE86_NAME_H, and
+       FT_SERVICE_POSTSCRIPT_NAME_H.
+       (t1_service_glyph_dict, t1_service_ps_name,
+       t1_service_multi_masters): New structures providing Type 1 services.
+       (t1_services): New services list.
+       (Get_Interface): Use `ft_service_list_lookup'.
+
+       * src/type42/t42drivr.c: Include FT_SERVICE_XFREE86_NAME_H,
+       FT_SERVICE_GLYPH_DICT_H, and FT_SERVICE_POSTSCRIPT_NAME_H.
+       (t42_service_glyph_dict, t42_service_ps_name): New strucures
+       providing Type 42 services.
+       (t42_services): New services list.
+       (T42_Get_Interface): Use `ft_service_list_lookup'.
+
+
+       * README, docs/CHANGES: Updating version numbers for 2.1.6, and
+       removing obsolete warnings in the documentation.
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 6.
+       * builds/unix/configure.ac (version_info): Set to 9:5:3.
+       * builds/unix/configure: Regenerated.
+
+       * include/freetype/internal/ftcore.h,
+       include/freetype/internal/ftexcept.h,
+       include/freetype/internal/fthash.h,
+       include/freetype/internal/ftobject.h: Removed.  Obsolete.
+
+2003-09-09  David Turner  <david@freetype.org>
+
+       Fixing PFR kerning support.  The tables within the font file contain
+       (charcode,charcode) kerning pairs, we need to convert them to
+       (gindex,gindex).
+
+       * src/base/ftpfr.c (ft_pfr_check): Fix serious typo.
+       * src/pfr/prfload.c: Remove dead code.
+       (pfr_get_gindex, pfr_compare_kern_pairs, pfr_sort_kerning_pairs):
+       New functions.
+       (pfr_phy_font_done): Free `kern_pairs'.
+       (pfr_phy_font_load): Call `pfr_sort_kerning_pairs'.
+       * src/pfr/pfrobjs.c (pfr_face_get_kerning): Fix kerning extraction.
+       * src/pfr/pfrtypes.h (PFR_KERN_PAIR_INDEX): New macro.
+       (PFR_KernPairRec): Make `kerning' an FT_Int.
+       (PFR_PhyFontRec): New element `kern_pairs'.
+       (PFR_KernFlags): Values of PFR_KERN_2BYTE_CHAR and
+       PFR_KERN_2BYTE_ADJ were erroneously reversed.
+
+       * include/freetype/ftoption.h: Commenting out the macro
+       TT_CONFIG_OPTION_BYTECODE_INTERPRETER.
+
+2003-09-02  David Turner  <david@freetype.org>
+
+
+       * Version 2.1.5 released.
+       =========================
+
+
+2003-08-31  Manish Singh  <yosh@gimp.org>
+
+       * src/bdf/bdflib.c (_bdf_readstream): Don't use FT_MEM_COPY but
+       FT_MEM_MOVE.
+
+2003-08-30  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/freetype.h (FT_ENCODING_SJIS, FT_ENCODING_GB2312,
+       FT_ENCODING_BIG5, FT_ENCODING_WANSUNG, FT_ENCODING_JOHAB): New
+       enumerations of FT_Encoding.  The FT_ENCODING_MS_* variants except
+       FT_ENCODING_MS_SYMBOL are now deprecated.
+       Updated all users.
+       * docs/CHANGES: Document it.
+
+2003-08-27  Werner Lemberg  <wl@gnu.org>
+
+       * src/bdf/bdfdrivr.c (BDF_Face_Init): Accept lowercase characters
+       for spacing.
+
+2003-08-27  Mike FABIAN  <mfabian@suse.de>
+
+       * src/pcf/pcfread.c (pcf_load_font), src/bdf/bdfdrivr.c
+       (BDF_Face_Init): Accept lowercase characters for slant and weight.
+
+2003-08-18  David Turner  <david@freetype.org>
+
+       * include/freetype/config/ftoption.h: Disabling TrueType bytecode
+       interpreter until the UNPATENTED_HINTING works as advertised.
+
+       * src/autohint/ahhint.c (ah_hinter_load_glyph): Use `|' for
+       setting `load_flags'.
+
+       * Jamfile: Adding the `refdoc' target to the Jamfile in order to
+       build the API Reference in `docs/reference' automatically.
+
+       * include/freetype/t1tables.h (PS_FontInfoRec), src/cid/cidtoken.h,
+       src/type1/t1tokens.h, src/type42/t42parse.c: Resetting the types of
+       `italic_angle', `underline_position', and `underline_thickness' to
+       their previous values (i.e., long, short, and ushort) in order to
+       avoid breaking binary compatibility.
+
+       * include/freetype/ttunpat.h: Fixing documentation comment.
+
+       * include/freetype/config/ftoption.h, devel/ftoption.h
+       (TT_CONFIG_OPTION_OPTION_COMPILE_UNPATENTED_HINTING): Replaced
+       with...
+       (TT_CONFIG_OPTION_UNPATENTED_HINTING): This.  Updated all users.
+       (TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING): Removed.
+
+       * include/freetype/internal/ftobjs.h (FT_DEBUG_HOOK_TYPE1): Removed.
+       (FT_DEBUG_HOOK_UNPATENTED_HINTING): New macro.  Use this with
+       `FT_Set_Debug_Hook' to get the same effect as the removed
+       TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING.
+
+       * src/truetype/ttobjs.c (tt_face_init): Use
+       `FT_DEBUG_HOOK_UNPATENTED_HINTING'.
+
+2003-08-06  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1gload.c (T1_Load_Glyph), src/cff/cffgload.c
+       (cff_slot_load), src/cid/cidgload.c (cid_slot_load_glyph): Fix
+       previous change.
+
+2003-08-05  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1gload.c (T1_Load_Glyph), src/cff/cffgload.c
+       (cff_slot_load), src/cid/cidgload.c (cid_slot_load_glyph): Apply
+       font matrix to advance width also.
+       * docs/CHANGES: Updated.
+
+2003-07-26  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/configure.ac (version_info): Set to 9:4:3.
+       * builds/unix/configure: Updated.
+       * docs/CHANGES, docs/VERSION.DLL: Updated.
+
+       * include/freetype/freetype.h (FT_GlyphSlot): Change 2003-06-16
+       also breaks binary compatibility.  Reintroduce an unsigned integer
+       at the old position of `flags' called `reserved'.
+
+2003-07-25  Werner Lemberg  <wl@gnu.org>
+
+       Make API reference valid HTML 4.01 transitional.
+
+       * src/tools/docmaker/tohtml.py (html_header_1): Add doctype
+       and charset.
+       (html_header_2): Fix style elements and add some more.
+       Fix syntax.
+       (block_header, block_footer, description_header, description_footer,
+       marker_header, marker_footer, source_header, source_footer,
+       chapter_header): Don't use <center>...</center> but `align=center'
+       table attribute.
+       (chapter_inter, chapter_footer): Add <li> and use special <ul>
+       class.
+       Use double quotes around table widths given in percent.
+       (keyword_prefix, keyword_suffix): Don't change font colour directly
+       but use a new <span> class.
+       (section_synopsis_header, section_synopsis_footer): Don't change
+       colour.
+       (code_header, code_footer): Don't change font colour directly but
+       use a special <pre> class.
+       (print_html_field): <tr> gets the `valign' attribute, not <table>.
+       (print_html_field_list): Ditto.
+       (index_exit): Don't use <center>...</center> but `align=center'
+       table attribute.
+       (section_enter): Ditto.
+       (toc_exit): Don't emit </table>.
+       (block_enter): Use <h4><a>, not <a><h4>.
+       (__init__): Fix tag order in self.html_footer.
+
+2003-07-25  David Turner  <david@freetype.org>
+
+       This change reimplements fix from 2003-05-30 without breaking
+       binary compatibility.
+
+       * include/freetype/t1tables.h (PS_FontInfoRec): `italic_angle',
+       `is_fixed_pitch', `underline_position', `underline_thickness' are
+       reverted to be normal values.
+
+       * include/freetype/internal/psaux.h (T1_FieldType): Remove
+       `T1_FIELD_TYPE_BOOL_P', `T1_FIELD_TYPE_INTEGER_P',
+       `T1_FIELD_TYPE_FIXED_P', `T1_FIELD_TYPE_FIXED_1000_P'.
+       (T1_FIELD_TYPE_BOOL_P, T1_FIELD_NUM_P, T1_FIELD_FIXED_P,
+       T1_FIELD_FIXED_1000_P): Removed.
+       (T1_FIELD_TYPE_BOOL): Renamed to...
+       (T1_FIELD_BOOL): New macro.  Updated all callers.
+
+       * src/type42/t42parse.c: `italic_angle', `is_fixed_pitch',
+       `underline_position', `underline_thickness', `paint_type',
+       `stroke_width' are reverted to be normal values.
+       (T42_KEYWORD_COUNT): New macro.
+       (t42_parse_dict): New array `keyword_flags' to mark that a value has
+       already been assigned to a dictionary entry.
+       * src/type42/t42objs.c (T42_Face_Init, T42_Face_Done): Updated.
+
+       * src/cid/cidtoken.h: `italic_angle', `is_fixed_pitch',
+       `underline_position', `underline_thickness' are reverted to be
+       normal values.
+       * src/cid/cidobjs.c (cid_face_done, cid_face_init): Updated.
+
+       * src/psaux/psobjs.c (ps_parser_load_field): Updated.
+
+       * src/type1/t1tokens.h: `italic_angle', `is_fixed_pitch',
+       `underline_position', `underline_thickness', `paint_type',
+       `stroke_width' are reverted to be normal values.
+       * src/type1/t1objs.c (T1_Face_Done, T1_Face_Init): Updated.
+       * src/type1/t1load.c (T1_FIELD_COUNT): New macro.
+       (parse_dict): Add parameter for keyword flags.
+       Record only first instance of a field.
+       (T1_Open_Face): New array `keyword_flags'.
+
+2003-07-24  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 5.
+       * builds/unix/configure.ac (version_info): Set to 10:0:3.
+       * builds/unix/configure: Updated.
+       * builds/freetype.mk (refdoc): Fix --title.
+
+       * docs/CHANGES, docs/VERSION.DLL, README: Updated.
+
+       * src/tools/docmaker/sources.py (re_crossref): Fix regular
+       expression to handle trailing punctuation characters.
+       * src/tools/docmaker/tohtml.py (make_html_word): Updated.
+
+       * docs/release: New file.
+
+2003-07-23  YAMANO-UCHI Hidetoshi  <mer@din.or.jp>
+
+       * include/freetype/internal/psaux.h (PS_Parser_FuncsRec): New
+       member function `to_bytes'.
+
+       * src/psaux/psauxmod.c (ps_parser_funcs): New member
+       `ps_parser_to_bytes'.
+       (psaux_module_class): Increase version to 0x20000L.
+
+       * src/psaux/psobjs.c (IS_T1_LINESPACE): Add \f.
+       (IS_T1_NULLSPACE): New macro.
+       (IS_T1_SPACE): Add it.
+       (skip_spaces, skip_alpha): New functions.
+       (ps_parser_skip_spaces, ps_parser_skip_alpha): Use them.
+       (ps_tobytes, ps_parser_to_bytes): New functions.
+
+2003-07-07  Werner Lemberg  <wl@gnu.org>
+
+       * builds/freetype.mk (DOC_DIR): New variable.
+       (refdoc): Use *_DIR variables.
+       (distclean): Remove documentation files.
+
+       * builds/detect.mk (std_setup, dos_setup): Mention `make refdoc'.
+
+       * configure: Set DOC_DIR variable.
+
+2003-07-07  Patrik Hägglund  <patrik.hagglund@bredband.net>
+
+       * builds/freetype.mk (refdoc): New target to build the
+       documentation.
+       (.PHONY): Updated.
+
+       * include/freetype/freetype.h: Improve documentation of FT_CharMap.
+       * include/freetype/ftimage,h: Fix documentation of FT_OUTLINE_FLAGS.
+       * include/freetype/tttables.h: Document FT_Sfnt_Tag.
+
+2003-07-06  Werner Lemberg  <wl@gnu.org>
+
+       * src/bdf/bdfdrivr.c (BDF_Face_Init), src/pcf/pcfread.c
+       (pcf_load_font): Fix computation of height if PIXEL_SIZE property is
+       missing.
+
+2003-07-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/cache/ftcsbits.c (ftc_sbit_node_compare): Only add `size' if
+       there is no error.  Reported by Knut St. Osmundsen
+       <bird-freetype@anduin.net>.
+
+2003-06-30  Werner Lemberg  <wl@gnu.org>
+
+       A new try to synchronize bitmap font access.
+
+       * include/freetype/freetype.h (FT_Bitmap_Size): `height' is now
+       defined to return the baseline-to-baseline distance.  This was
+       already the value returned by the BDF and PCF drivers.
+
+       The `width' field now gives the average width.  I wasn't able to
+       find something better.  It should be taken as informative only.
+
+       New fields `size', `x_ppem', and `y_ppem'.
+
+       * src/pcf/pcfread.c (pcf_load_font): Updated to properly fill
+       FT_Bitmap_Size.
+       Do proper rounding and conversion from 72.27 to 72 points.
+
+       * src/bdf/bdfdrivr.c (BDF_Face_Init): Updated to properly fill
+       FT_Bitmap_Size.
+       Do proper rounding and conversion from 72.27 to 72 points.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Updated to properly fill
+       FT_Bitmap_Size.
+
+       * src/winfonts/winfnt.c (FNT_Face_Init): Updated to properly fill
+       FT_Bitmap_Size.
+
+2003-06-29  Werner Lemberg  <wl@gnu.org>
+
+       Redesigning the FNT driver to return multiple faces, not multiple
+       strikes.  At least one font (app850.fon from WinME) contains
+       different FNT charmaps for its subfonts.  Consequently, the previous
+       design of having multiple bitmap strikes in a single font face fails
+       since we have only one charmap per face.
+
+       * include/freetype/internal/fnttypes.h (FNT_Size_Rec): Removed.
+       (FNT_FaceRec): Remove `num_fonts' field and replace `fonts' with
+       `font'.
+
+       * src/base/ftwinfnt.c (FT_Get_WinFNT_Header): Updated.
+
+       * src/winfonts/winfnt.c (fnt_font_load): Don't set pixel_width equal
+       to pixel_height.
+       (fnt_face_done_fonts): Removed.
+       (fnt_face_get_dll_fonts): Renamed to...
+       (fnt_face_get_dll_font): This.  Add second function argument to
+       select face index.
+       Updated to load just one subfont.
+       (fnt_font_done, FNT_Face_Done): Updated.
+       (FNT_Face_Init): Handle `face_index'.
+       Updated.
+       (FNT_Size_Set_Pixels): Simplified; similar to BDF and PCF, the
+       bitmap width is now ignored.
+       (FNT_Load_Glyph): Updated.
+       Fix glyph index computation.
+       (winfnt_driver_class): Updated.
+
+2003-06-25  Owen Taylor  <otaylor@redhat.com>
+
+       * src/sfnt/ttload.c (tt_face_load_hdmx): Don't assign
+       num_records until we actually decide to load the table,
+       otherwise, we'll segfault in tt_face_free_hdmx.
+
+2003-06-24  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffdrivr.c (cff_get_glyph_name): Protect against zero
+       glyph name pointer.  Reported by Mikey Anbary <manbary@vizrt.com>.
+
+2003-06-23  Werner Lemberg  <wl@gnu.org>
+
+       * src/tools/glnames.py: Updated to AGL 2.0.
+       * src/psnames/pstables.h: Regenerated.
+
+2003-06-22  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/cache/ftcglyph.h, include/freetype/ttnameid.h,
+       src/base/ftcalc.c, src/base/fttrigon.c, src/cff/cffgload.c,
+       src/otlayout/otlgsub.c, src/pshinter/pshrec.c,
+       src/psnames/psmodule.c, src/sfnt/sfobjs.c, src/truetype/ttdriver.c:
+       Decorate constants with `U' and `L' if appropriate.
+
+       * include/freetype/ftmoderr.h: Updated to include recent module
+       additions.
+
+       * src/pshinter/pshnterr.h (FT_ERR_BASE): Define as
+       `FT_Mod_Err_PShinter'.
+       * src/type42/t42error.h (FT_ERR_BASE): Define as
+       `FT_Mod_Err_Type42'.
+
+       * src/pshinter/pshrec.h (PS_HINTS_MAGIC): Removed.  Not used.
+
+       * include/freetype/config/ftconfig.h [__MWERKS__]: Define FT_LONG64
+       and FT_INT64.
+
+2003-06-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/winfonts/winfnt.c (FNT_Load_Glyph): Use first_char in
+       computation of glyph_index.
+       (FNT_Size_Set_Pixels): To find a strike, first check pixel_height
+       only, then try to find a better hit by comparing pixel_width also.
+       Without this fix it isn't possible to access all strikes.
+       Also compute metrics.max_advance to be in sync with other bitmap
+       drivers.
+
+       * src/base/ftobjs.c (FT_Set_Char_Size): Remove redundant code.
+       (FT_Set_Pixel_Size): Assign value to `metrics' after validation of
+       arguments.
+
+2003-06-20  Werner Lemberg  <wl@gnu.org>
+
+       Synchronize computation of height and width for bitmap strikes.  The
+       `width' field in the FT_Bitmap_Size structure is now only useful to
+       enumerate different strikes.  The `max_advance' field of the
+       FT_Size_Metrics structure should be used to get the (maximum) width
+       of a strike.
+
+       * src/bdf/bdfdrivr.c (BDF_Face_Init): Don't use AVERAGE_WIDTH for
+       computing `available_sizes->width' but make it always equal to
+       `available_sizes->height'.
+
+       * src/pcf/pcfread.c (pcf_load_font): Don't use RESOLUTION_X for
+       computing `available_sizes->width' but make it always equal to
+       `available_sizes->height'.
+
+       * src/truetype/ttdriver.c (Set_Pixel_Sizes): Pass only single
+       argument to function.
+
+       * src/psnames/psmodule.c (ps_unicode_value): Handle `.' after
+       `uniXXXX' and `uXXXX[X[X]]'.
+
+2003-06-19  Werner Lemberg  <wl@gnu.org>
+
+       * src/bdf/bdfdrivr.c: s/FT_Err_/BDF_Err/.
+       * src/cache/ftccache.c, src/cache/ftcsbits.c, src/cache/ftlru.c:
+       s/FT_Err_/FTC_Err_/.
+       * src/cff/cffcmap.c: s/FT_Err_/CFF_Err_/.
+       * src/pcf/pcfdrivr.c: s/FT_Err_/PCF_Err_/.
+       * src/psaux/t1cmap.c: Include psauxerr.h.
+       s/FT_Err_/PSaux_Err_/.
+       * src/pshinter/pshnterr.h: New file.
+       * src/pshinter/rules.mk: Updated.
+       * src/pshinter/pshalgo.c, src/pshinter/pshrec.c: Include pshnterr.h.
+       s/FT_Err_/PSH_Err_/.
+       * src/pfr/pfrdrivr.c, src/pfr/pfrobjs.c, src/pfr/pfrsbit.c:
+       s/FT_Err_/PFR_Err_/.
+       * src/sfnt/sfdriver.c, src/sfnt/sfobjs.c, src/sfnt/ttcmap0.c,
+       src/sfnt/ttload.c: s/FT_Err_/SFNT_Err_/.
+       * src/truetype/ttgload.c: s/FT_Err_/TT_Err_/.
+       * src/gzip/ftgzip.c: Load FT_MODULE_ERRORS_H and define
+       FT_ERR_PREFIX and FT_ERR_BASE.
+       s/FT_Err_/Gzip_Err_/.
+
+2003-06-19  Dirck Blaskey  <listtarget@danbala.com>
+
+       * src/cff/cffload (cff_encoding_load): `nleft' must be FT_UInt,
+       otherwise adding 1 might wrap the result.
+
+2003-06-18  Werner Lemberg  <wl@gnu.org>
+
+       * src/psnames/psmodule.c (ps_unicode_value): Add support to
+       recognize `uXXXX[X[X]]' glyph names.
+       Don't handle glyph names starting with `uni' which have more than
+       four digits.
+
+2003-06-16  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/freetype.h (FT_Open_Flags): Replaced with
+       #defines for the constants.
+       (FT_Open_Args): Change type of `flags' to FT_UInt.
+       (FT_GlyphSlot): Move `flags' to FT_Slot_Internal.
+
+       * include/freetype/ftimage.h (FT_Outline_Flags, FT_Raster_Flag):
+       Replaced with #defines for the constants.
+
+       * include/freetype/internal/ftobjs.h (FT_Slot_Internal): New
+       field `flags' (from FT_GlyphSlot).
+       Updated all affected source files.
+       (FT_GLYPH_OWN_BITMAP): New macro (from ftgloadr.h).
+
+       * include/freetype/internal/ftgloadr.h (FT_GLYPH_OWN_BITMAP): Moved
+       to ftobjs.h.
+
+       * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Use dummy
+       FT_GlyphSlot_Internal object.
+
+2003-06-15  Werner Lemberg  <wl@gnu.org>
+
+       * builds/compiler/gcc.mk, builds/compiler/gcc-dev.mk (CFLAGS):
+       Add -fno-strict-aliasing to get rid of zillion warnings from gcc
+       version 3.3.
+
+2003-06-14  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/ftglyph.h (ft_glyph_bbox_unscaled,
+       ft_glyph_bbox_subpixels, ft_glyph_bbox_gridfit,
+       ft_glyph_bbox_truncate, ft_glyph_bbox_pixels): Replaced with
+       FT_GLYPH_BBOX_UNSCALED, FT_GLYPH_BBOX_SUBPIXELS,
+       FT_GLYPH_BBIX_GRIDFIT, FT_GLYPH_BBOX_TRUNCATE, FT_GLYPH_BBOX_PIXELS.
+       The lowercase variants are now (deprecated aliases) to the uppercase
+       versions.
+       Updated all other files.
+
+       * include/freetype/ftmodule.h (ft_module_font_driver,
+       ft_module_renderer, ft_module_hinter, ft_module_styler,
+       ft_module_driver_scalable, ft_module_driver_no_outlines,
+       ft_module_driver_has_hinter): Replaced with FT_MODULE_FONT_DRIVER,
+       FT_MODULE_RENDERER, FT_MODULE_HINTER, FT_MODULE_STYLER,
+       FT_MODULE_DRIVER_SCALABLE, FT_MODULE_DRIVER_NO_OUTLINES,
+       FT_MODULE_DRIVER_HAS_HINTER.
+       The lowercase variants are now (deprecated aliases) to the uppercase
+       versions.
+       Updated all other files.
+
+       * src/base/ftglyph.c (FT_Glyph_Get_CBox): Handle bbox_mode better
+       as enumeration.
+
+       * src/pcf/pcfdrivr.c (pcf_driver_class), src/winfonts/winfnt.c
+       (winfnt_driver_class), src/bdf/bdfdrivr.c (bdf_driver_class): Add
+       the FT_MODULE_DRIVER_NO_OUTLINES flag.
+
+2003-06-13  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * src/pfr/pfrobjs.c (pfr_slot_load): Apply font matrix.
+
+2003-06-13  Werner Lemberg  <wl@gnu.org>
+
+       * builds/dos/detect.mk: Test not only for `Dos' but for `DOS' also.
+
+       * builds/dos/dos-emx.mk, builds/compiler/emx.mk: New files for
+       EMX gcc compiler.
+       * builds/dos/detect.mk: Add target `emx'.
+
+       * builds/compiler/watcom.mk (LINK_LIBRARY): GNU Make for DOS doesn't
+       like a trailing semicolon; add a dummy command.
+
+       * src/cid/cidload.c: Remove parse_font_bbox code (already enclosed
+       with #if 0 ... #endif).
+
+       * src/type1/t1tokens.h: Handle /FontName.
+       * src/type1/t1load.c (parse_font_name): Removed.
+       Remove parse_font_bbox code (already enclosed with #if 0 ...
+       #endif).
+
+       * src/type42/t42parse.c (t42_parse_font_name): Removed.
+       Remove t42_parse_font_bbox code (already enclosed with #if 0 ...
+       #endif).
+       (t42_keywords): Handle /FontName with T1_FIELD_KEY.
+
+2003-06-12  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/psaux.h (T1_FieldType): Add
+       T1_FIELD_TYPE_KEY.
+       (T1_FIELD_KEY): New macro.
+       * src/psaux/psobjs.c (ps_parser_load_field): Handle
+       T1_FIELD_TYPE_KEY.
+
+       * src/cid/cidtoken.h: Use T1_FIELD_KEY for /CIDFontName.
+
+2003-06-11  Alexander Malmberg  <alexander@malmberg.org>
+
+       * src/cache/ftlru.c (FT_LruList_Remove_Selection): Decrease
+       number of nodes.
+       (FT_LruList_Lookup): Fix assertion for out-of-memory case.
+
+2003-06-11  Werner Lemberg  <wl@gnu.org>
+
+       * src/cid/cidload.c (cid_decrypt): Removed.
+       (cid_read_subrs): Use t1_decrypt from psaux module.
+       * src/cid/cidload.h: Updated.
+       * src/cid/cidgload.c (cid_load_glyph): Use t1_decrypt from psaux
+       module.
+
+2003-06-10  Werner Lemberg  <wl@gnu.org>
+
+       * src/cid/cidobjs.c: Apply change 2003-05-31 from <Ron.Dev@gmx.de>.
+       Compute style flags.
+       Fix computation of root->height.
+       * src/cid/cidtoken.h: Handle FontBBox.
+       * src/cid/cidload.c (cid_load_keyword): Handle
+       T1_FIELD_LOCATION_BBOX.
+       (parse_font_bbox): Commented out.
+       (cid_field_record): Comment out element for parsing FontBBox.
+
+       * src/type42/t42parse.c (t42_parse_font_bbox): Commented out.
+       (t42_keywords): Handle FontBBox with T1_FIELD_BBOX, not with
+       T1_FIELD_CALLBACK.
+       (t42_parse_font_bbox): Commented out.
+       (t42_load_keyword): Handle T1_FIELD_LOCATION_BBOX.
+       * src/type42/t42objs.c (T42_Face_Init): Apply change 2003-05-31
+       from <Ron.Dev@gmx.de>.
+
+2003-06-09  George Williams  <gww@silcom.com>
+
+       * src/truetype/ttinterp.c (SetSuperRound) <0x30>: Follow Apple's
+       TrueType specification.
+       (Ins_MDRP, Ins_MIRP): Fix single width cut-in test.
+
+2003-06-09  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * src/gzip/ftgzip.c: (inflate_mask): Replaced with...
+       (NO_INFLATE_MASK): This.
+       * src/gzip/infutil.h: Declare `inflate_mask' conditionally by
+       NO_INFLATE_MASK.
+
+2003-06-09  Alexis S. L. Carvalho  <alexis@cecm.usp.br>
+
+       * src/gzip/ftgzip.c (ft_gzip_file_fill_output): Handle Z_STREAM_END
+       correctly.
+
+2003-06-09  Wolfgang Domröse  <porthos.domroese@harz.de>
+
+       * src/pshinter/pshglob.c (psh_globals_new): Change calculation of
+       dim->stdw.count to avoid compiler problem.
+
+       * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Move the block
+       variables to the beginning of the function to avoid compiler
+       problems.
+       Add casts necessary for 16bit compilers.
+
+2003-06-09  Werner Lemberg  <wl@gnu.org>
+
+       * src/pfr/rules.mk (PFR_DRV_SRC): Add pfrsbit.c.
+       (PFR_DRV_H): Add pfrtypes.h.
+
+       * include/freetype/config/ftconfig.h: s/__MWKS__/__MWERKS__/.
+
+2003-06-08  Karl Schultz  <kschultz@rsinc.com>
+
+       * src/pfr/pfrsbit.c (pfr_bitwriter_init): Change type of third
+       argument to FT_Bool.
+       (pfr_lookup_bitmap_data): Change type of third and fourth argument
+       to FT_UInt.  Updated caller.
+       (pfr_load_bitmap_bits): Change type of fourth argument to FT_Bool.
+
+2003-06-08  Werner Lemberg  <wl@gnu.org>
+
+       Completely revised FreeType's make management.
+
+       . In all makefiles `/' is used as the path separator.  The
+         conversion to the real path separators is done as late as
+         possible using $(subst ...).
+
+       . $(HOSTSEP) no longer exists.  Now, $(SEP) gives the path separator
+         for the operating system, and the new $(COMPILER_SEP) the path
+         separator for the compiler tools.
+
+       . $(BUILD) has been renamed to $(BUILD_DIR).  In general, all
+         directory variables end with `_DIR'.  The variants ending in `_'
+         (like `BASE_' have been removed).
+
+       The following ChangeLog entries only describe changes which are
+       not related to the redesign.
+
+       * builds/beos/beos-def.mk (BUILD_DIR): Fix typo.
+       * builds/compiler/watcom.mk (LINK_LIBRARY): Fix linker call to avoid
+       overlong arguments as suggested by J. Ali Harlow
+       <ali@avrc.city.ac.uk>.
+       * builds/dos/dos-wat.mk: New file.
+       * builds/freetype.mk (FREETYPE_H): Include header files from the
+       `devel' subdirectory.
+
+       * builds/os2/os2-dev.mk, builds/unix/unixddef.mk,
+       builds/unix/unixddef.mk, builds/win32/w32-bccd.mk,
+       builds/win32/w32-dev.mk (BUILD_DIR): Fix path.
+
+       * builds/unix/configure.ac, builds/unix/configure: Updated.
+       * builds/unix/unix-def.in (DISTCLEAN): Add `freetype2.pc'.
+
+2003-06-07  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftmac.c (FT_New_Face_From_SFNT): s/rlen/sfnt_size/ to
+       make it compile.
+
+       * devel/ftoption.h: Updated.
+
+2003-06-07  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * include/freetype/internal/psaux.h, src/truetype/ttgload.h:
+       s/index/idx/ to fix compiler warnings.
+
+       * src/sfnt/ttcmap0.c (tt_face_build_cmaps): Use more `volatile' to
+       fix compiler warning.
+
+       * src/gzip/ftgzip.c (BUILDFIXED): Removed.
+       * src/gzip/inftrees.c (inflate_trees_fixed) [!BUILDFIXED]: Use
+       FT_UNUSED to remove compiler warning.
+
+2003-06-06  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/ftstroker.h: Renamed to...
+       * include/freetype/ftstroke.h: This.
+
+       * src/base/ftstroker.c: Renamed to...
+       * src/base/ftstroke.c: This.
+
+       * include/freetype/config/ftheader.h (FT_STROKER_H): Updated.
+
+       * src/base/descrip.mms, src/base/Jamfile, src/base/rules.mk:
+       Updated.
+
+       * src/pcf/pcfdriver.c: Renamed to...
+       * src/pcf/pcfdrivr.c: This.
+       * src/pcf/pcfdriver.h: Renamed to...
+       * src/pcf/pcfdrivr.h: This.
+
+       * src/pcf/Jamfile, src/pcf/rules.mk: Updated.
+
+2003-06-05  Wenlin Institute (Tom Bishop)  <wenlin@wenlin.com>
+
+       * src/base/ftmac.c (file_spec_from_path) [TARGET_API_MAC_CARBON]:
+       Add `#if !defined(__MWERKS__)'.
+
+2003-06-05  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/psaux.h (T1_FieldType): Add
+       T1_FIELD_TYPE_FIXED_1000 and T1_FIELD_TYPE_FIXED_1000_P.
+       (T1_FIELD_FIXED_1000, T1_FIELD_FIXED_1000_P): New macros.
+       * src/psaux/psobjs.c (ps_parser_load_field): Handle
+       T1_FIELD_TYPE_FIXED_1000 and T1_FIELD_TYPE_FIXED_1000_P.
+
+       * src/cff/cffparse.c (cff_kind_fixed_thousand): New enumeration.
+       (CFF_FIELD_FIXED_1000): New macro.
+       (cff_parser_run): Handle cff_kind_fixed_thousand.
+       * src/cff/cfftoken.h: Use CFF_FIELD_FIXED_1000 for blue_scale.
+       * src/cff/cffload (cff_subfont_load): Fix default values of
+       expansion_factor and blue_scale.
+
+       * src/cif/cidtoken.h, src/type1/t1tokens.h: Use T1_FIELD_FIXED_1000
+       for blue_scale.
+
+       * src/pshinter/pshglob.c (psh_globals_new): Fix default value of
+       blue_scale.
+
+2003-06-04  Wolfgang Domröse  <porthos.domroese@harz.de>
+
+       * include/freetype/internal/ftdriver.h,
+       include/freetype/internal/ftobjs.h,
+       include/freetype/internal/psaux.h, src/cid/cidgload.c,
+       src/psaux/psobjs.c, src/psaux/t1decode.c, src/psaux/psobjs.h,
+       src/pshinter/pshrec.c, src/pshinter/pshalgo.c,
+       src/psnames/psmodule.c, src/raster/ftraster.c, src/sfnt/sfobjs.c,
+       src/smooth/ftgrays.c, src/smooth/ftsmooth.c, src/truetype/ttobjs.c,
+       src/truetype/ttdriver.c, src/truetype/ttgload.c, src/type1/t1afm.c,
+       src/type1/t1gload.c, src/type1/t1gload.h, src/type1/t1load.c,
+       src/type1/t1objs.c, src/type42/t42parse.c, src/type42/t42parse.h:
+       Many casts and slight argument type changes to make it work with
+       a 16bit compiler.
+
+2003-06-04  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/config/ftoption.h: Defining
+       TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING by default is a bad idea
+       since some fonts (e.g. Arial) produce worse results than without
+       hinting.  Reverted.
+
+2003-06-04  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgload.c (load_truetype_glyph)
+       [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Call
+       FT_GlyphLoader_CheckPoints before adding phantom points.  This fixes
+       a segfault bug with fonts (e.g. htst3.ttf) which have nested
+       subglyphs more than one level deep.  Reported by Anthony Fok.
+
+       * include/freetype/config/ftoption.h: Define
+       TT_CONFIG_OPTION_BYTECODE_INTERPRETER,
+       TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING, and
+       TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING to make it the new
+       default.
+
+2003-06-03  Werner Lemberg  <wl@gnu.org>
+
+       * src/autohint/ahhint.c (ah_hinter_hint_edges): Removed.  Just a
+       wrapper for ah_hint_edges.
+       (ah_hint_edges): Renamed to...
+       (ah_hinter_hint_edges): This.
+
+       * src/base/ftobjs.c (FT_Set_Hint_Flags): Removed.  Unused.
+
+       * include/freetype/internal/ftobjs.h (FT_Face_InternalRec),
+       include/freetype/internal/psaux.h (T1_DecoderRec),
+       src/cff/cffgload.h (CFF_Builder): Remove `hint_flags' field.
+       Unused.
+
+       * src/cff/cffgload.c (cff_builder_init): Updated.
+       (cff_decoder_parse_charstrings) <cff_op_endchar>: Call hinter->apply
+       with decoder->hint_mode instead of builder->hint_flags.
+       * src/psaux/t1decode.c (t1_decoder_init): Updated.
+
+       * src/base/ftstroker.c (ft_stroke_border_export): s/index/idx/.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Commented out code which
+       increased root->height by 15% if the line gap was zero.  There exist
+       fonts (containing e.g. form drawing characters) which intentionally
+       have a zero line gap value.
+
+       * src/truetype/ttinterp.c (Free_Project, CUR_Func_freeProj):
+       Removed.  Unused.
+       Updated all callers.
+
+2003-06-02  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffobjs.c (cff_face_init): Use symbolic names for
+       Adobe specific encoding IDs (there was a wrong EID value for custom
+       encoding).
+
+       * src/cff/cffcmap.h (CFF_CMapStdRec): Remove `count'.
+       * src/cff/cffcmap.c (cff_cmap_encoding_init,
+       cff_cmap_encoding_done): Updated.
+       (cff_cmap_encoding_char_index, cff_cmap_encoding_char_next): Use
+       256 as limit for character code.
+
+2003-06-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/winfonts/winfnt.c (FNT_Load_Glyph): Revert change from
+       2003-03-20.
+
+2003-05-31  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/fttrigon.h (FT_Vector_Normalize): Removed.
+
+2003-05-31    <Ron.Dev@gmx.de>
+
+       * src/type1/t1objs.c (T1_Face_Init): Improve algorithm for guessing
+       the font style by ignoring spaces and hyphens.
+
+       * builds/unix/freetype2.in: Fix `Version' field.
+
+2003-05-30  Werner Lemberg  <wl@gnu.org>
+
+       Avoid overwriting of numeric font dictionary entries for synthetic
+       fonts.  Additionally, some entries were handled as `integer' instead
+       of `number'.
+
+       * include/freetype/internal/psaux.h (T1_FieldType): Add
+       T1_FIELD_TYPE_BOOL_P, T1_FIELD_TYPE_INTEGER_P, and
+       T1_FIELD_TYPE_FIXED_P.
+       (T1_FIELD_BOOL_P, T1_FIELD_NUM_P, T1_FIELD_FIXED_P): New macros.
+       * src/psaux/psobjs.c (ps_parser_load_field): Handle new field types.
+
+       * include/freetype/internal/cfftypes.h (CFF_FontRecDict),
+       src/cff/cfftoken.h: Change type of underline_position and
+       underline_thickness to FT_Fixed.
+       * src/cff/cffload.c (cff_subfont_load): Fix default values of
+       underline_position and underline_thickness.
+       * src/cff/cffobjs.c (cff_face_init): Set underline_position
+       and underline_thickness in `root'.
+
+       * include/freetype/internal/t1types.h (T1_Font): Change point_type
+       and stroke_width to pointers.
+       * include/freetype/t1tables.h (PS_FontInfo): Change italic_angle,
+       is_fixed_pitch, underline_position, and underline_thickness to
+       pointers.
+       * src/type1/t1tokens.h: Change italic_angle, is_fixed_pitch,
+       underline_position, and underline_thickness to pointers.  Change
+       the type of the latter two to `fixed'.
+       Change type of stroke_width to `fixed' and make it a pointer.
+       Change paint_type to pointer.
+       * src/type1/t1objs.c (T1_Face_Done): Updated.
+       (T1_Face_Init): Updated.
+       Fix assignment of underline_position and underline_thickness.
+
+       * src/cid/cidtoken.h: Change italic_angle, is_fixed_pitch,
+       underline_position, and underline_thickness to pointers.  Change
+       the type of the latter two to `fixed'.
+       Change type of stroke_width to `fixed'.
+       * src/cid/cidobjs.c (cid_face_done): Updated.
+       (cid_face_init): Updated.
+       Fix assignment of underline_position and underline_thickness.
+
+       * src/type42/t42parse.c: Change italic_angle, is_fixed_pitch,
+       underline_position, and underline_thickness to pointers.  Change the
+       type of the latter two to `fixed'.
+       Change type of stroke_width to `fixed' and make it a pointer.
+       Change paint_type to pointer.
+       * src/type42/t42objs.c (T42_Face_Init): Updated.
+       Fix assignment of underline_position and underline_thickness.
+       (T42_Face_Done): Updated.
+
+       * src/base/ftobjs.c (open_face_from_buffer): Fix compiler warning.
+       * src/pshinter/pshglob.c, src/pshinter/pshglob.h
+       (psh_globals_set_scale): Make it a local function.
+
+       * test/gview.c: Fix renaming ps3->ps typo.
+       Formatting.
+
+2003-05-29  Werner Lemberg  <wl@gnu.org>
+
+       * src/pshinter/pshalgo1.[ch], src/pshinter/pshalgo2.[ch]: Removed.
+       * src/pshinter/pshalgo.h: Removed.
+
+       * src/pshinter/pshalgo3.[ch]: Renamed to...
+       * src/pshinter/pshalgo.[ch]: New files.
+       s/PSH3/PSH/.
+       s/psh3/psh/.
+       s/ps3/ps/.
+
+       * src/pshinter/pshrec.c, src/pshinter/pshinter.c: Updated.
+       * src/pshinter/rules.mk, src/pshinter/Jamfile: Updated.
+
+       * src/pshinter/pshglob.[ch] (psh_dimension_snap_width): Commented
+       out.
+
+       * tests/gview.c: Remove code for pshalgo1 and pshalgo2.
+       Updated.
+
+2003-05-28  Martin Zinser  <zinser@decus.de>
+
+       * vms_make.com: Reworked support for shareable images on VMS.  The
+       first version was kind of a hack; the current implementation of the
+       procedure to extract the required symbols is much cleaner.
+
+       Reworked creation of MMS files, avoiding a number of temporary files
+       which were created in the previous version.
+
+       Further work on creating descrip.mms files on the fly.
+
+       * builds/vms/descrip.mms, src/autohint/descrip.mms,
+       src/type1/descrip.mms: Removed.
+
+2003-05-28  Werner Lemberg  <wl@gnu.org>
+
+       * src/pshinter/pshalgo3.c (psh3_glyph_compute_extrema): Skip
+       contours with only a single point to avoid segfault.
+
+       * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Activate code for
+       handling `origin'.
+
+2003-05-24  Werner Lemberg  <wl@gnu.org>
+
+       * src/autohint/ahtypes.h (AH_OPTION_NO_STRONG_INTERPOLATION):
+       Removed since unused.
+
+2003-05-21  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/config/ftstdlib.h (ft_strcat): New wrapper macro
+       for strcat.
+
+       * src/base/ftmac.c (create_lwfn_name): s/isupper/ft_isupper/.
+       (parse_font): s/memcpy/ft_memcpy/.
+       (is_dfont) [TARGET_API_MAC_CARBON]: s/memcmp/ft_memcmp/.
+       * src/base/ftobjs.c (load_mac_face) [FT_MACINTOSH]:
+       s/strlen/ft_strlen/.
+       s/strcat/ft_strcat/.
+       s/strcpy/ft_strcpy/.
+       * src/gzip/zutil.h: s/memset/ft_memset/.
+       s/memcmp/ft_memcmp/.
+
+       * src/bdf/bdfdrivr.c (BDF_Face_Init), src/pcf/pcfdriver.c
+       (PCF_Face_Init): Test for charset registry case-insensitively.
+
+       * src/gzip/ftgzip.c (ft_gzip_fil_io): Revert change from yesterday;
+       it has already been fixed differently.
+
+       * src/truetype/ttinterp.c (DO_SFVTL): Add missing braces around
+       if-clause.
+
+2003-05-21  Martin Zinser  <zinser@decus.de>
+
+       * t1load.c (parse_blend_axis_types): Fix compiler warning.
+
+       * descrip.mms: Removed.  Now created by...
+
+       * vms_make.com: New file.
+
+2003-05-21  Weiqi Gao  <weiqigao@networkusa.net>
+
+       * src/gzip/ftgzip.c (ft_gzip_file_io): Avoid zero value of `delta'
+       to prevent infinite loop.
+
+2003-05-21  Lars Clausen  <lrclause@cs.uiuc.edu>
+
+       * docs/VERSION.DLL: Provide better autoconf snippet to check
+       FreeType version.
+
+2003-05-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftobjs.c (open_face): Free `internal' not
+       `face->internal' in case of error to avoid possible segfault.
+
+       * src/pshinter/pshalgo3.c (ps3_hints_apply): Check whether we
+       actually have an outline.
+
+2003-05-20  David Chester  <davidchester@qmx.net>
+
+       * src/pshinter/pshalgo3.c (ps3_hints_apply): Try to optimize
+       y_scale so that the top of non-capital letters is aligned on a pixel
+       boundary whenever possible.
+
+       * src/autohint/ahhint.c (ah_hint_edges): Make sure that lowercase
+       m's maintain their symmetry.
+
+2003-05-20  Werner Lemberg  <wl@gnu.org>
+
+       * src/autohint/ahhint.c (ah_hinter_load_glyph): Oops!  David's
+       patch from yesterday has been resolved already in a different
+       way.  Reverted.
+
+2003-05-19  David Chester  <davidchester@qmx.net>
+
+       * src/autohint/ahhint.c (ah_hinter_load_glyph): Don't scale
+       y_scale locally but face->size->metrics.y_scale.
+
+2003-05-19  David Turner  <david@freetype.org>
+
+       * src/sfnt/ttcmap0.c (tt_cmap4_char_next): Select proper start
+       value for `hi' to avoid infinite loop.
+
+2003-05-18  Yong Sun  <sunyong@njstar.com>
+
+       * src/raster/ftraster.c (Insert_Y_Turn): Fix overflow test.
+
+2003-05-18  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/config/ftoption.h [FT_CONFIG_OPTION_MAC_FONTS]:
+       New macro.
+       * src/base/ftobjs.c: Use it to control mac font support on non-mac
+       platforms.
+
+2003-05-17  George Williams  <gww@silcom.com>
+
+       Implement partial support of Mac fonts on non-Mac platforms.
+
+       * src/base/ftobjs.c (memory_stream_close, new_memory_stream,
+       open_face_from_buffer, Mac_Read_POST_Resource,
+       Mac_Read_sfnt_Resource, IsMacResource, IsMacBinary, load_mac_face)
+       [!FT_MACINTOSH]: New functions.
+       (FT_Open_Face) [!FT_MACINTOSH]: Use load_mac_face.
+
+2003-05-17  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Scale linear advance width only
+       if FT_FACE_FLAG_SCALABLE is set (otherwise we have a division by
+       zero since FNT and friends don't define `face->units_per_EM').
+
+2003-05-15  David Turner  <david@freetype.org>
+
+       * src/base/fttrigon.c (FT_Vector_Rotate): Avoid rounding errors
+       for small values.
+
+2003-05-15  Werner Lemberg  <wl@gnu.org>
+
+       * src/autohint/ahtypes.h (AH_PointRec): Remove unused `in_angle'
+       and `out_angle' fields.
+
+2003-05-14  George Williams  <gww@silcom.com>
+
+       * src/base/ftmac.c (FT_New_Face_From_SFNT): Handle CFF files also.
+
+2003-05-14  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/freetype.h: Fix typo in comment
+       (FT_HAS_FIXED_SIZES).
+
+2003-05-10  Dan Williams  <dan@bigw.org>
+
+       * builds/unix/aclocal.m4: Comment out definition of
+       `allow_undefined_flag' for Darwin 1.3.
+       * builds/unix/configure.ac: Add option --with-old-mac-fonts.
+       * builds/unix/ltmain.sh: Fix version numbering for Darwin 1.3.
+       * builds/unix/configure: Regenerated.
+
+       * include/freetype/config/ftconfig.h: Fix conditions for defining
+       `FT_MACINTOSH'.
+       * src/base/ftbase.c: Include `ftmac.c' conditionally.
+       * src/base/ftmac.c: Handle __GNUC__.
+
+2003-05-07  YAMANO-UCHI Hidetoshi  <mer@din.or.jp>
+
+       * src/cid/cidload.c (is_alpha): Removed.
+       (cid_parse_dict): Use `cid_parser_skip_alpha' instead of `is_alpha'.
+
+2003-05-07  Werner Lemberg  <wl@gnu.org>
+
+       * src/autohint/ahoptim.c, src/autohint/ahoptim.h: Obsolete, removed.
+
+2003-05-07  David Turner  <david@freetype.org>
+
+       * src/autohint/ahglyph.c (ah_setup_uv): Exchange `for' loop and
+       `switch' statement to make it run faster.
+       (ah_outline_compute_segments): Reset `segment->score' and
+       `segment->link'.
+       (ah_outline_link_segments): Provide alternative code which does
+       the same but runs much faster.
+       Handle major direction also.
+       (ah_outline_compute_edges): Scale `edge_distance_threshold' down
+       after rounding instead of scaling comparison value in loop.
+
+       * src/autohint/ahhint.c (ah_hinter_align_stong_points): Provide
+       alternative code which runs faster.
+       Handle `before->scale == 0'.
+
+       * src/autohint/ahtypes.h (AH_SegmentRec): Move some fields down.
+       (AH_EdgeRec): Move some fields in structure.
+       New field `scale'.
+
+       * src/sfnt/ttcmap0.c (tt_cmap4_char_next): Use binary search.
+
+2003-05-02  Werner Lemberg  <wl@gnu.org>
+
+       * src/autohint/ahoptim.c (LOG): Renamed to...
+       (AH_OPTIM_LOG): This.
+       (AH_Dump_Springs): Fix log message format.
+
+       * src/autohint/ahhint.c (ah_hint_edges_3): Renamed to...
+       (ah_hint_edges): This.
+
+2002-05-02  Keith Packard  <keithp@keithp.com>
+
+       * src/bdf/bdfdrivr.c (BDF_Set_Pixel_Size): Initialize `max_advance'.
+
+2003-05-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/autohint/ahglyph.c (ah_test_extrema): Renamed to...
+       (ah_test_extremum): This.
+
+2003-04-28  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/configure.ac: Generate `freetype.pc' from
+       `freetype.in'.
+       * builds/unix/configure: Regenerated.
+       * builds/unix/install.mk (install, uninstall): Handle `freetype.pc'.
+
+2003-04-28  Gustavo J. A. M. Carneiro  <gjc@inescporto.pt>
+
+       * builds/unix/freetype2.in: New file.  Contains building information
+       for the `pkg-config' package.
+
+2003-04-28  David Turner  <david@freetype.org>
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Fix boundary check for
+       `glyph_index'.
+
+2003-04-25:  Graham Asher  <graham.asher@btinternet.com>
+
+       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.
+
+       * include/freetype/ttunpat.h: New file.  Defines
+       FT_PARAM_TAG_UNPATENTED_HINTING.
+
+       * include/freetype/config/ftheader.h (FT_TRUETYPE_UNPATENTED_H): New
+       macro to use when including ttunpat.h.
+
+       * include/freetype/config/ftoption.h
+       (TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING,
+       TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING): New configuration macros
+       (not defined, but in comments) for the unpatented hinting system.
+
+       * include/freetype/internal/tttypes.h (TT_FaceRec)
+       [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: New element `FT_Bool
+       unpatented_hinting'.
+
+       * src/truetype/ttinterp.c (NO_APPLE_PATENT, APPLE_THRESHOLD):
+       Removed.
+       (GUESS_VECTOR): New macro.
+       (TT_Run_Context) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]:
+       Set `both_x_axis'.
+       (tt_default_graphics_state)
+       [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Updated.
+       (Current_Ratio) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]:
+       Handle `unpatented_hinting'.
+       (Direct_Move) [NO_APPLE_PATENT]: Removed.
+       [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Insert assertion.
+       (Project, FreeProject)
+       [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Insert assertion.
+       (Compute_Funcs) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]:
+       Implement unpatented hinting.
+       (DO_SPVTCA, DO_SFVTCA, DO_SPVTL, DO_SFVTL, DO_SPVFS, DO_SFVFS,
+       Ins_SDPVTL): Call `GUESS_VECTOR'.
+       (DO_GPV, DO_GFV) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]:
+       Handle `unpatented_hinting'.
+       (Compute_Point_Displacement) [NO_APPLE_PATENT]: Removed.
+       [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Implement unpatented
+       hinting.
+       (Move_Zp2_Point, Ins_SHPIX, Ins_DELTAP, Ins_DELTAC)
+       [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Implement unpatented
+       hinting.
+       (TT_RunIns): Updated.
+
+       * src/truetype/ttobjs.c
+       [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Include
+       FT_TRUETYPE_UNPATENTED_H.
+       (tt_face_init) [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING,
+       TT_CONFIG_OPTION_FORCE_UNPATENTED_HINTING]: Check
+       FT_PARAM_TAG_UNPATENTED_HINTING.
+
+       * src/truetype/ttobjs.h (TT_GraphicsState)
+       [TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING]: Add `both_x_axis'.
+
+2003-04-25  Werner Lemberg  <wl@gnu.org>
+
+       * src/bdf/bdflib.c (hash_bucket, hash_lookup): Use `const' for first
+       argument.
+       (bdf_get_font_property): Use `const' for third argument.
+       Updated all callers.
+       * src/bdf/bdfdrivr.c (BDF_Face_Init): Set pixel width and height
+       similar to the PCF driver.
+       * src/bdf/bdf.h (_hashnode): Use `const' for `key'.
+       Updated.
+
+       * src/gzip/ftgzip.c: C++ doesn't like that the array `inflate_mask'
+       is declared twice.  It is perhaps better to modify the zlib source
+       files directly instead of this hack.
+       (zcalloc, zfree, ft_gzip_stream_close, ft_gzip_stream_io): Add casts
+       to make build with g++ successful.
+
+2003-04-24  Manish Singh  <yosh@gimp.org>
+
+       * src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c
+       (T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Split on `-'
+       also for searching the style name.
+
+2003-04-24  David Turner  <david@freetype.org>
+
+       * src/pcf/pcfread.c (pcf_load_font): Fixed the computation of
+       face->num_glyphs.  We must increase the value by 1 to respect the
+       convention that glyph index 0 always corresponds to the `missing
+       glyph'.
+
+2003-04-24  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/unix-cc.in (CFLAGS): Add @CPPFLAGS@.
+
+2003-04-24  Dieter Baron  <dillo@netbsd.org>
+
+       * builds/unix/freetype-config.in (cflags): Emit FreeType 2's include
+       files first.  Otherwise there are conflicts with FreeType 1
+       installed simultaneously.
+
+2003-04-23  Werner Lemberg  <wl@gnu.org>
+
+       Fixing bugs reported by Nelson Beebe.
+
+       * src/base/ftstroker.c (FT_Stroker_ParseOutline): Remove unused
+       variable `in_path'.
+
+       * src/base/ftobjs (ft_glyphslot_set_bitmap): Change type of
+       second argument to `FT_Byte*'.
+       * include/freetype/internal/ftobjs.h: Updated.
+
+       * src/bdf/bdflib.c (_bdf_readstream): Remove unused variable `res'.
+       (_bdf_parse_glyphs): Remove unused variable `next'.
+       Mark `call_data' as unused.
+
+       * src/cache/ftlru.c (FT_LruList_Lookup): Remove unused variable
+       `plast'.
+
+       * src/pcf/pcfread.c (pcf_seek_to_table_type): Slight recoding to
+       actually use `error'.
+       (pcf_load_font): Remove unused variable `avgw'.
+
+       * src/pfr/pfrobjs.c (pfr_face_get_kerning): Change return type
+       to `void'.
+       Mark `error' as unused.
+       * src/pfr/pfrobjs.h: Updated.
+       * src/pfr/pfrdrivr.c (pfr_get_kerning): Updated.
+
+       * src/sfnt/ttload.c (sfnt_dir_check): Remove unused variable
+       `format_tag'.
+
+       * src/sfnt/ttcmap0.c (tt_cmap6_validate, tt_cmap10_validate): Remove
+       unused variable `start'.
+       (tt_cmap10_char_next): Remove unused variable `result'
+
+       * src/sfnt/sfobjs.c (tt_face_get_name): Mark `error' as unused.
+
+       * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Mark `error' as
+       unused.
+
+       * src/type1/t1objs.c (T1_Face_Init): Remove unused variable
+       `pshinter'.
+
+       * src/type1/t1gload.c (T1_Load_Glyph): Use `glyph_data_loaded'
+       only for FT_CONFIG_OPTION_INCREMENTAL.
+
+2003-04-23  Akito Hirai  <akito@kde.gr.jp>
+
+       * src/sfnt/ttcmap0.c (tt_cmap4_validate): Provide a weak variant
+       of the glyph ID bounding check if FT_VALIDATE_TIGHT is not active.
+       Without this change, many CJK fonts from Dynalab are rejected.
+
+2003-04-23  Joe Marcus Clarke  <marcus@FreeBSD.org>
+
+       * src/base/ftbdf.c (FT_Get_BDF_Property): Check for valid
+       `get_interface'.
+
+2003-04-23  Paul Miller  <paulm@profoundeffects.com>
+
+       * src/base/ftmac.c (parse_fond): Fix handling of style names.
+
+2003-04-23  Werner Lemberg  <wl@gnu.org>
+
+       * src/pfr/pfrload.c (pfr_extra_item_load_font_id): Use FT_PtrDist
+       instead of FT_Uint for `len'.
+
+2003-04-22  Werner Lemberg  <wl@gnu.org>
+
+       * src/gzip/ftgzip.c (zcalloc) [!FT_CONFIG_OPTION_SYSTEM_ZLIB]:
+       Convert K&R format to modern C usage.
+       (FT_Stream_OpenGzip): Use long constant.
+
+2003-04-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/cache/ftccache.c (ftc_cache_lookup): Remove shadow declaration
+       of `manager'.
+
+2003-04-20  Werner Lemberg  <wl@gnu.org>
+
+       * doc/INSTALL.UNX: Cleaned up.
+
+2003-04-09  Torrey Lyons  <torrey@mrcla.com>
+
+       * src/base/ftmac.c (open_face_from_buffer): Removed a double-free
+       bug that had nasty consequences when trying to open an `invalid'
+       font on a Mac.
+
+2003-04-09  Mike Fabian  <mfabian@suse.de>
+
+       * src/bdf/bdfdrivr.h (BDF_encoding_el), src/pcf/pcf.h
+       (PCF_EncodingRec): Changed FT_Short to FT_UShort in order to be able
+       to access more than 32768 glyphs in fonts.
+
+2003-04-08  David Turner  <david@freetype.org>
+
+
+       * Version 2.1.4 released.
+       =========================
+
+
+2003-04-03  Martin Muskens  <mmuskens@aurelon.com>
+
+       * src/type1/t1load.c (T1_Open_Face): Fixed the code to make it
+       handle special cases where a font only contains a `.notdef' glyph
+       (happens in PDF-embedded fonts).  Otherwise, FT_Panic was called.
+
+2003-03-27  David Turner  <david@freetype.org>
+
+       * README: Udpated.
+
+       * README.UNX: Removed (now replaced by docs/INSTALL.UNX).
+
+       * src/pshinter/pshalgo3.c: The hinter now performs as in 2.1.3 and
+       will ignore stem quantization only when FT_LOAD_TARGET_SMOOTH is
+       used.
+       (psh3_dimension_quantize_len): Enabled.
+       (psh3_hint_align): Enable commented code.
+       (psh3_hint_align_light): Commented out.
+
+       * src/base/ftobjs.c (FT_Set_Char_Size): Changed the default
+       computations to include rounding in all cases; this is required to
+       provide accurate kerning data when native TrueType hinting is
+       enabled.
+
+       * src/type1/t1load.c (is_name_char): The Type 1 loader now accepts
+       more general names according to the PostScript specification (the
+       previous one was too restrictive).
+       (parse_font_name, parse_encoding, parse_charstrings, parse_dict):
+       Use `is_name_char'.
+       (parse_subrs): Handle empty arrays.
+
+2003-03-20  David Turner  <david@freetype.org>
+
+       Serious rewriting of the documentation.
+
+       * docs/BUGS, docs/BUILD: Removed.
+       * docs/DEBUG.TXT: Renamed to...
+       * docs/DEBUG: This.
+       * docs/CUSTOMIZE, docs/TRUETYPE, docs/UPGRADE.UNX: New files.
+       * docs/INSTALL.ANY, docs/INSTALL.UNX, docs/INSTALL.GNU New files,
+       containing platform specific information previously in INSTALL.
+       * docs/readme.vms: Renamed to...
+       * docs/INSTALL.VMS: This.
+
+       * docs/*: Updated.
+
+       Introduced three new functions to deal with glyph bitmaps within
+       FT_GlyphSlot objects:
+
+         ft_glyphslot_free_bitmap
+         ft_glyphslot_alloc_bitmap
+         ft_glyphslot_set_bitmap
+
+       These functions are much more convenient to use than managing the
+       FT_GLYPH_OWN_BITMAP flag manually.
+
+       * include/freetype/internal/ftobjs.h (ft_glyphslot_free_bitmap,
+       ft_glyphslot_alloc_bitmap, ft_glyphslot_set_bitmap): New functions.
+       * src/base/ftobjs.c: Implement them.
+       (ft_glyphslot_done): Use ft_glyphslot_free_bitmap.
+
+       * src/bdf/bdfdrivr.c (BDF_Glyph_Load), src/pcf/pcfdriver.c
+       (PCF_Glyph_Load): Remove unused variable `memory'.
+       Use `ft_glyphslot_*' functions.
+       Don't set `FT_GLYPH_OWN_BITMAP'.
+
+       * src/pfr/pfrsbit.c (pfr_slot_load_bitmap): Use
+       `ft_glyphslot_alloc_bitmap'.
+
+       * src/sfnt/ttsbit.c (Load_SBit_Image): Change 5th argument to type
+       `FT_GlyphSlot'.
+       Adding argument `depth' to handle recursive calls.
+       Use `ft_glyphslot_alloc_bitmap'.
+       (tt_face_load_sbit_image): Remove unused variable `memory'.
+       Don't handle `FT_GLYPH_OWN_BITMAP'.
+       Update call to Load_SBit_Image.
+
+       * src/type42/t42objs.c (ft_glyphslot_clear): Renamed to...
+       (t42_glyphslot_clear): This.  Updated caller.
+       Call `ft_glyphslot_free_bitmap'.
+
+       * src/winfonts/winfnt.c (FNT_Load_Glyph): Use
+       `ft_glyphslot_set_bitmap'.
+       Don't handle `FT_GLYPH_OWN_BITMAP'.
+
+       * src/cache/ftlru.c (FT_LruList_Lookup): Fixed an invalid assertion
+       check.
+
+       * src/autohint/ahglyph.c (ah_outline_load): Add two scaling
+       arguments.
+       * src/autohint/ahglyph.h: Updated.
+       * src/autohint/ahhint.c (ah_hinter_load): Updated.
+       * src/autohint/ahglobal.c (ah_hinter_compute_widths): Updated.
+
+       * src/cache/ftccache.c (ftc_family_done): Fixed small bug that could
+       crash the cache in rare circumstances (mostly with broken fonts).
+
+2003-03-15  David Turner  <david@freetype.org>
+
+       * src/truetype/ttdriver.c (Set_Char_Sizes): Fixed a small rounding
+       bug.  Actually, it seems that previous versions of FreeType didn't
+       perform TrueType rounding exactly as appropriate.
+
+2003-03-14  David Turner  <david@freetype.org>
+
+       * src/truetype/ttdriver.c (Set_Char_Sizes): Fixing the small
+       TrueType native rendering glitches; they came from a small rounding
+       error.
+
+2003-03-13  David Turner  <david@freetype.org>
+
+       Added new environment variables to control memory debugging with
+       FreeType.  See the description of `FT2_DEBUG_MEMORY',
+       `FT2_ALLOC_TOTAL_MAX' and `FT2_ALLOC_COUNT_MAX' in DEBUG.TXT.
+
+       * src/base/ftdbgmem.c (FT_MemTableRec): Add `alloc_count',
+       `bound_total', `alloc_total_max', `bound_count', `alloc_count_max'.
+       (ft_mem_debug_alloc): Handle new variables.
+       (ft_mem_debug_init): s/FT_DEBUG_MEMORY/FT2_DEBUG_MEMORY/.
+       Handle new environment variables.
+       * docs/DEBUG.TXT: Updated.
+
+       Fixed the cache sub-system to correctly deal with out-of-memory
+       conditions.
+
+       * src/cache/ftccache.c (ftc_node_destroy): Comment out generic
+       check.
+       (ftc_cache_lookup): Implement loop.
+       * src/cache/ftccmap.c: Define FT_COMPONENT.
+       * src/cache/ftcsbits.c (ftc_sbit_node_load): Handle
+       FT_Err_Out_Of_Memory.
+       * src/cache/ftlru.c: Include FT_INTERNAL_DEBUG_H.
+       (FT_LruList_Lookup): Implement loop.
+
+       * src/pfr/pfrobjs.c (pfr_face_done): Fix memory leak.
+       (pfr_face_init): Fixing compiler warnings.
+
+       * src/psaux/psobjs.c (reallocate_t1_table): Fixed a bug (memory
+       leak) that only happened when a try to resize an array would end in
+       an out-of-memory condition.
+
+       * src/smooth/ftgrays.c (gray_convert_glyph): Removed compiler
+       warnings / volatile bug.
+
+       * src/truetype/ttobjs.c (tt_glyphzone_done): Removed segmentation
+       fault that happened in tight memory environments.
+
+2003-02-28  Pixel  <pixel@mandrakesoft.com>
+
+       * src/gzip/ftgzip.c (ft_gzip_file_done): Fixed memory leak: The ZLib
+       stream was not properly finalized.
+
+2003-02-25  Anthony Fok  <anthony@thizlinux.com>
+
+       * src/cache/ftccmap.c: Include FT_TRUETYPE_IDS_H.
+       (ftc_cmap_family_init): The cmap cache now
+       supports UCS-4 charmaps when available in Asian fonts.
+
+       * src/sfnt/ttload.c, src/base/ftobjs.c: Changed `asian' to `Asian'
+       in comments.
+
+2003-02-25  David Turner  <david@freetype.org>
+
+       * src/gzip/ftgzip.c (ft_gzip_file_fill_output): Fixed a bug that
+       caused FreeType to loop endlessly when trying to read certain
+       compressed gzip files.  The following test reveals the bug:
+
+         touch 0123456789 ; gzip 0123456789 ; ftdump 0123456789.gz
+
+       Several fixes to the PFR font driver:
+
+       - The list of available embedded bitmaps was not correctly set in
+         the root FT_FaceRec structure describing the face.
+
+       - The glyph loader always tried to load the outlines when
+         FT_LOAD_SBITS_ONLY was specified.
+
+       - The table loaded now scans for *undocumented* elements of a
+         physical font's auxiliary data record.  This is necessary to
+         retrieve the `real' family and style names.
+
+       NOTE THAT THESE CHANGES THE FAMILY NAME OF MANY PFR FONTS!
+
+       * src/pfr/pfrload.c (pfr_aux_name_load): New function.
+       (pfr_phy_font_done): Free `family_name' and `style_name' also.
+       Remove unused variables.
+       (pfr_phy_font_load): Extract useful information from the auxiliary
+       bytes.
+
+       * src/pfr/pfrobjs.c (pfr_face_done): Set pointers to NULL.
+       (pfr_face_init): Provide fallback values for `family_name' and
+       `style_name'.
+       Handle strikes.
+       (pfr_slot_load): Handle FT_LOAD_SBITS_ONLY.
+       * src/pfr/pfrtypes.h (PFR_PhyFontRec): Add fields `ascent',
+       `descent', `leading', `family_name', and `style_name'.
+
+       * src/truetype/ttdriver.c (Set_Char_Sizes): Fixed a rounding bug
+       when computing the scale factors for a given character size in
+       points with resolution.
+
+       * devel/ft2build.h, devel/ftoption.h: New files (in a new directory)
+       which are special development versions of include/ft2build.h and
+       include/freetype/config/ftoption.h, respectively.
+
+2003-02-18  David Turner  <david@freetype.org>
+
+       Fixing the slight distortion problem that occurred due to the latest
+       auto-hinter changes.
+
+       * src/base/ftobjs.c (ft_recompute_scaled_metrics): Fix rounding.
+
+       * src/truetype/ttdriver.c (Set_Char_Sizes): New variable `metrics2'.
+       [!TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Removed.
+
+       * src/truetype/ttobjs.h (TT_SizeRec): New field `metrics'.
+       * src/truetype/ttobjs.c (Reset_Outline_Size): Fix initialization of
+       `metrics'.
+       [FT_CONFIG_CHESTER_ASCENDER]: Code removed.
+       (Reset_SBit_Size): Fix initialization of `metrics'.
+
+       * src/truetype/ttinterp.c (TT_Load_Context): Fix initialization of
+       `exec->metrics'.
+
+       * src/autohint/ahhint.c (ah_hinter_load): Disabled the advance width
+       `correction' which seemed to provide more trouble than benefits.
+
+2003-02-13  Graham Asher  <graham.asher@btinternet.com>
+
+       Changed the incremental loading interface in a way that makes it
+       simpler and allows glyph metrics to be changed (e.g., by adding a
+       constant, as required by CFF fonts) rather than just overridden.
+       This was required to make the GhostScript-to-FreeType bridge work.
+
+       * src/cff/cffgload.c (cff_slot_load) [FT_CONFIG_OPTION_INCREMENTAL]:
+       Allow metrics to be overridden.
+       * src/cid/cidgload.c (cid_load_glyph) [FT_CONFIG_OPTION_INCREMENTAL]:
+       Ditto.
+
+       * src/truetype/ttgload.c (load_truetype_glyph)
+       [FT_CONFIG_OPTION_INCREMENTAL]: Simplify.
+       (compute_glyph_metrics) [FT_CONFIG_OPTION_INCREMENTAL]: Code block
+       moved down.
+
+       * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String)
+       [FT_CONFIG_OPTION_INCREMENTAL]: Updated.
+
+       * include/freetype/ftincrem.h: Updated.
+
+2003-01-31  David Turner  <david@freetype.org>
+
+       * docs/CHANGES, docs/VERSION.DLL, docs/TODO: Updating documentation
+       for the 2.1.4 release.
+
+       * builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/index.html: Updating the project file for
+       2.1.4.
+
+       * src/gzip/adler32.c, src/gzip/ftgzip.c, src/gzip/infblock.c,
+       src/gzip/infcodes.c, src/gzip/inflate.c, src/gzip/inftrees.c,
+       src/gzip/infutil.c: Removed old-style (K&R)function definitions.
+       This avoids warnings with Visual C++ at its most pedantic mode.
+
+       * src/pfr/pfrsbit.c: Removed compiler warnings.
+
+       * src/cache/ftccmap.c (ftc_cmap_family_init): Changed an FT_ERROR
+       into an FT_TRACE1 since it caused `ftview' and others to dump too
+       much junk when trying to display a waterfall with a font without a
+       Unicode charmap (e.g.  SYMBOL.TTF).
+
+       Implemented FT_CONFIG_CHESTER_BLUE_SCALE, corresponding to the last
+       patch from David Chester, but with a much simpler (and saner)
+       implementation.
+
+       * src/autohint/ahhint.c (ah_hinter_load_glyph)
+       [FT_CONFIG_CHESTER_BLUE_SCALE]: Try to optimize the y_scale so that
+       the top of non-capital letters is aligned on a pixel boundary
+       whenever possible.
+
+       * src/base/ftobjs.c (FT_Set_Char_Size)
+       [FT_CONFIG_CHESTER_BLUE_SCALE]: Round differently.
+       * src/truetype/ttdriver.c (Set_Char_Sizes)
+       [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Do some rounding only
+       if this macro is defined.
+
+       * src/truetype/ttobjs.c (Reset_Outline_Size)
+       [FT_CONFIG_CHESTER_ASCENDER]: Round differently.
+
+       * src/pshinter/pshalgo3.c: Improved the Postscript hinter.  Getting
+       rid of stem snapping seems to work well here (though the stems are
+       still slightly moved to increase contrast).
+       (psh3_dimension_quantize_len): Commented out.
+       (psh3_hint_align_light): New function.
+       (psh3_hint_align): Comment out some code.
+
+       THIS IMPROVES ANTI-ALIASED RENDERING, BUT MONOCHROME AND LCD MODES
+       STILL SUCK.
+
+2003-01-22  David Chester  <davidchester@qmx.net>
+
+       * src/autohint/ahhint.c (ah_compute_stem_width): Small fix to the
+       stem width optimization.
+
+2003-01-22  David Turner  <david@freetype.org>
+
+       Adding a new API `FT_Get_BDF_Property' to retrieve the BDF
+       properties of a given PCF or BDF font.
+
+       * include/freetype/ftbdf.h (FT_PropertyType): New enumeration.
+       (BDF_Property, BDF_PropertyRec): New structure.
+       FT_Get_BDF_Property): New function.
+       * include/freetype/internal/bdftypes.h: Include FT_BDF_H.
+       (BDF_GetPropertyFunc): New function pointer.
+
+       * src/base/ftbdf.c (test_font_type): New helper function.
+       (FT_Get_BDF_Charset_ID): Use `test_font_type'.
+       (FT_Get_BDF_Property): New function.
+
+       * src/bdf/bdfdrivr.c: Include FT_BDF_H.
+       (bdf_get_bdf_property, bdf_driver_requester): New functions.
+       (bdf_driver_class): Use `bdf_driver_requester'.
+
+       * src/pcf/pcfdrivr.c: Include FT_BDF_H.
+       (pcf_get_bdf_property, pdc_driver_requester): New functions
+       (pcf_driver_class): Use `pcf_driver_requester'.
+
+       * src/pcf/pcfread.c: Include `pcfread.h'.
+       (pcf_find_property): Decorate it with FT_LOCAL_DEF.
+       * src/pcf/pcfread.h: New file, providing `pcf_find_property'.
+
+       * src/sfnt/ttload.c (sfnt_dir_check): Relaxed the `head' table size
+       verification to accept a few broken fonts who pad the size
+       incorrectly (the table should be padded, but its `size' field
+       shouldn't according to the specification).
+
+2003-01-18  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/ltmain.sh: Regenerated with `libtoolize --force
+       --copy' from libtool 1.4.3.
+       * builds/unix/aclocal.m4: Regenerated with `aclocal -I .' from
+       automake 1.7.1.
+       * builds/unix/configure: Regenerated with autoconf 2.54.
+       * builds/unix/config.guess, builds/unix/config.sub: Updated from
+       `config' CVS module at subversions.gnu.org.
+       * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from
+       `automake' CVS module at subversions.gnu.org.
+
+2003-01-15  David Turner  <david@freetype.org>
+
+       * include/freetype/freetype.h: Fixed documentation for
+       FT_Size_Metrics.
+
+2003-01-15  James Su  <suzhe@turbolinux.com.cn>
+
+       * src/gzip/ftgzip.c (ft_gzip_check_header): Bugfix: couldn't read
+       certain gzip-ed font files (typo: `&&' -> `&').
+
+2003-01-15  Huw D M Davies  <h.davies1@physics.ox.ac.uk>
+
+       Added a Windows .FNT specific API (mostly for Wine).  Also fixed a
+       nasty bug in the header loader which would cause invalid memory
+       overwrites.
+
+       * include/freetype/config/ftheader.h (FT_WINFONTS_H): New macro
+       for ftwinfnt.h.
+       * include/freetype/internal/fnttypes.h: Include FT_WINFONTS_H.
+       (FNT_FontRec): Updated.
+       Move Windows FNT definition to...
+       * include/freetype/ftwinfnt.h: This new file.
+       (FT_WinFNT_HeaderRec): Rename `reserved2' to `reserved1'.
+       * src/base/ftwinfnt.c: New file, providing `FT_Get_WinFNT_Header'.
+       * src/winfonts/winfnt.c (winfnt_header_fields): Updated.
+       Rename `reserved2' to `reserved1'.
+       (fnt_font_load): Updated.
+
+       * src/base/Jamfile, src/base/descrip.mms, src/base/rules.mk:
+       Updated.
+
+2003-01-14  Graham Asher  <graham.asher@btinternet.com>
+
+       * include/freetype/ftglyph.h, src/base/ftglyph.c: Added `const' to
+       the type of the first argument to FT_Matrix_Multiply, which isn't
+       changed -- this adds documentation and convenience.
+
+2003-01-13  Graham Asher  <graham.asher@btinternet.com>
+
+       * src/sfnt/ttload.c (tt_face_load_metrics)
+       [FT_CONFIG_OPTION_INCREMENTAL]: TrueType typefaces without
+       horizontal metrics (without the `hmtx' table) are now tolerated if
+       an incremental interface has been specified that has a
+       get_glyph_metrics function, implying that metrics will be supplied
+       from outside.  This happens for certain Type 42 fonts passed from
+       GhostScript.
+
+2003-01-11  David Chester  <davidchester@qmx.net>
+
+       Patches to the auto-hinter in order to slightly improve the output.
+       Note that everything is controlled through the new
+       FT_CONFIG_OPTION_CHESTER_HINTS defined in `ftoption.h'.  There are
+       also individual FT_CONFIG_CHESTER_XXX macros to control individual
+       `features'.
+
+       Note that all improvements are enabled by default, but can be
+       tweaked for optimization and testing purposes.  The configuration
+       macros will most likely disappear in the short future.
+
+       * include/freetype/config/ftoption.h
+       (FT_CONFIG_OPTION_CHESTER_HINTS): New macro.
+       (FT_CONFIG_CHESTER_{SMALL_F,ASCENDER,SERIF,STEM,BLUE_SCALE})
+       [FT_CONFIG_OPTION_CHESTER_HINTS]: New macros to control individual
+       features.
+
+       * src/autohint/ahglobal.c (blue_chars) [FT_CONFIG_CHESTER_SMALL_F]:
+       Add blue zone for `fijkdbh'.
+       * src/autohint/ahglobal.h (AH_IS_TOP_BLUE)
+       [FT_CONFIG_CHESTER_SMALL_F]: Use `AH_BLUE_SMALL_F_TOP'.
+       * src/autohint/ahglyph.c (ah_outline_compute_edges)
+       [FT_CONFIG_CHESTER_SERIF]: Use `AH_EDGE_SERIF'.
+       (ah_outline_compute_blue_edges) [FT_CONFIG_CHESTER_SMALL_F]:
+       Increase threshold for `best_dist'.
+       * src/autohint/ahhint.c (ah_compute_stem_width)
+       [FT_CONFIG_CHESTER_SERIF]: Provide new version for improved serif
+       handling.
+       (ah_align_linked_edge) [FT_CONFIG_CHESTER_SERIF]: Use special
+       version of `ah_compute_stem_width'.
+       (ah_hint_edges_3) [FT_CONFIG_CHESTER_STEM]: A new algorithm for stem
+       alignment when stem widths are less than 1.5 pixels wide centers the
+       stem slightly off-center of the center of a pixel (this increases
+       sharpness and consistency).
+       [FT_CONFIG_CHESTER_SERIF]: Use special version of
+       `ah_compute_stem_width'.
+       * src/autohint/ahtypes.h [FT_CONFIG_CHESTER_SMALL_F]: Add
+       `AH_BLUE_SMALL_F_TOP'.
+
+2003-01-11  David Turner  <david@freetype.org>
+
+       * include/freetype/internal/fnttypes.h (WinFNT_HeaderRec): Increase
+       size of `reserved2' to avoid memory overwrites.
+
+2003-01-08  Huw Davies  <huw@codeweavers.com>
+
+       * src/winfonts/winfnt.c (winfnt_header_fields): Read 16 bytes into
+       `reserved2', not `reserved'.
+
+       * src/base/ftobjs.c (find_unicode_charmap): Fixed the error code
+       returned when the font doesn't contain a Unicode charmap.  This
+       allows FT2 to load `symbol.ttf' and a few others correctly since the
+       last release.
+       (open_face): Fix return value.
+
+2003-01-08  Owen Taylor  <owen@redhat.com>
+
+       Implemented the FT_RENDER_MODE_LIGHT hinting mode in the auto and
+       postscript hinters.
+
+       * src/autohint/ahtypes.h (AH_HinterRec): Add `do_stem_adjust'.
+       * src/autohint/ahhint.c (ah_compute_stem_width): Handle
+       hinter->do_stem_adjust.
+       (ah_hinter_load_glyph): Set hinter->do_stem_adjust.
+
+       * src/pshinter/pshalgo3.h (PSH3_GlyphRec): Add `do_stem_adjust'.
+       * src/pshinter/pshalgo3.c (psh3_hint_align): Use `do_stem_adjust'.
+       (ps3_hints_apply): Handle FT_RENDER_MODE_LIGHT.
+
+       * include/freetype/freetype.h (FT_Render_Mode): Add
+       FT_RENDER_MODE_LIGHT.
+
+       * src/truetype/ttgload.c: Fixing the TrueType loader to handle
+       invalid composites correctly by limiting the recursion depth.
+       (TT_MAX_COMPOSITE_RECURSE): New macro.
+       (load_truetype_glyph): Add argument `recurse_count'.
+       Load a composite only if the numbers of contours is -1, emit error
+       otherwise.
+       (TT_Load_Glyph): Updated.
+
+2003-01-08  David Turner  <david@freetype.org>
+
+       * Jamrules, Jamfile, Jamfile.in, src/*/Jamfile: Small changes to
+       support the compilation of FreeType 2 as part of larger projects
+       with their own configuration options (only with Jam).
+
+2003-01-07  David Turner  <david@freetype.org>
+
+       * src/base/ftstroker.c: Probably the last bug-fixes to the stroker;
+       the API is likely to change, however.
+       (ft_stroke_border_close): Don't record empty paths.
+       (ft_stroke_border_get_counts): Increase `num_points' also in for loop.
+       (ft_stroke_border_export): Don't increase `write' twice in for loops.
+       (ft_stroker_outside): Handle `phi' together with `theta'.
+       (FT_Stroker_ParseOutline): New function.
+
+       * src/base/fttrigon.c (FT_Angle_Diff): Fixing function: It returned
+       invalid values for large negative angle differences (resulting in
+       incorrect stroker computations, among other things).
+
+       * src/cache/ftccache.c (ftc_node_hash_unlink): Removing incorrect
+       assertion, and changing code to avoid hash table size contraction.
+
+       * src/base/Jamfile, src/base/rules.mk, src/base/descrip.mms: Adding
+       `ftstroker' to default build, as optional component.
+
+2002-12-26  David Turner  <david@freetype.org>
+
+       * src/gzip/adler32.c, src/gzip/infblock.c, src/gzip/inflate.c,
+       src/gzip/inftrees.c, src/gzip/zconf.h, src/gzip/zlib.h,
+       src/gzip/zutil.h: Updates to allow compilation without compiler
+       warnings with LCC-Win32.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 4.
+       * builds/unix/configure.ac (version_info): Increased to 9:3:3.
+       * builds/unix/configure: Regenerated.
+       * docs/VERSION.DLL: Updated.
+
+2002-12-23  Anthony Fok  <anthony@thizlinux.com>
+
+       * builds/unix/configure.ac, builds/unix/unix-cc.in (LINK_LIBRARY),
+       builds/unix/unix-def.in (SYSTEM_ZLIB): Small fix to configure
+       sub-system on Unix to allow other programs to correctly link with
+       zlib when needed.
+
+2002-12-19  David Turner  <david@freetype.org>
+
+       * include/freetype/internal/sfnt.h (SFNT_Load_Table_Func): New
+       function pointer.
+
+       * include/freetype/tttables.h (FT_Load_Sfnt_Table): New function.
+       * src/base/ftobjs.c: Implement it.
+
+       * src/sfnt/sfdriver.c (sfnt_get_interface): Handle `load_sfnt'
+       module request.
+
+2002-12-17  David Turner  <david@freetype.org>
+
+       * src/base/ftobjs.c (find_unicode_charmap): Added some comments to
+       better explain what's happening there.
+       (open_face): Included Graham Asher's fix to prevent faces without
+       Unicode charmaps from loading.
+
+       * src/winfonts/winfnt.c: Included George Williams's fix to support
+       version 2 fonts correctly.
+       (winfnt_header_fields): Updated.
+       (fnt_font_load): Handle version 2 fonts.
+       (FNT_Load_Glyph): Updated.
+
+2002-12-16  David Turner  <david@freetype.org>
+
+       * docs/VERSION.DLL: Updating document to better explain the
+       differences between the three version numbers being used on Unix, as
+       well as providing an autoconf fragment provided by Lars Clausen.
+
+       * src/smooth/ftgrays.c (gray_render_conic): Fixed small bug that
+       prevented Bézier arcs with negative vertical coordinates to be
+       rendered appropriately.
+
+2002-12-02  Antoine Leca  <Antoine-Freetype@Leca-Marti.org>
+
+       * src/base/ftobjs.c: Modified the logic to get Unicode charmaps.
+       Now it loads UCS-4 charmaps when there is one.
+       (find_unicode_charmap): New function.
+       (open_face): Refer to the above one.
+       (FT_Select_Charmap): Idem.
+
+2002-11-29  Antoine Leca  <Antoine-Freetype@Leca-Marti.org>
+
+       * include/freetype/ftgzip.h: Correct the name of the controlling
+       macro (was __FTXF86_H__ ...).
+
+2002-11-27  Vincent Caron  <v.caron@zerodeux.net>
+
+       * builds/unix/unix-def.in, builds/unix/freetype-config.in,
+       builds/unix/configure.ac, src/gzip/rules.mk, src/gzip/ftgzip.c
+       [FT_CONFIG_OPTION_SYSTEM_ZLIB]: Adding support for system zlib
+       installations if available on the target platform (Unix only).
+
+2002-11-23  David Turner  <david@freetype.org>
+
+       * src/cff/cffload.c (cff_charset_load, cff_encoding_load): Modified
+       charset loader to accept pre-defined charsets, even when the font
+       contains fewer glyphs.  Also enforced more checks to ensure that we
+       never overflow the character codes array in the encoding.
+
+2002-11-22  Antoine Leca  <Antoine-Freetype@Leca-Marti.org>
+
+       * include/freetype/ttnameid.h: Updated to latest OpenType
+       specification.
+
+2002-11-18  David Turner  <david@freetype.org>
+
+
+       * Version 2.1.3 released.
+       =========================
+
+
+2002-11-07  David Turner  <david@freetype.org>
+
+       * src/cache/ftcsbit.c (ftc_sbit_node_load): Fixed a small bug that
+       caused problems with embedded bitmaps.
+
+       * src/otlayout/otlayout.h, src/otlyaout/otlconf.h,
+       src/otlayout/otlgsub.c, src/otlayout/otlgsub.h,
+       src/otlayout/otlparse.c, src/otlayout/otlparse.h,
+       src/otlayout/otlutils.h: Updating the OpenType Layout code, adding
+       support for the first GSUB lookups.  Nothing that really compiles
+       for now though.
+
+       * src/autohint/ahhint.c (ah_align_serif_edge): Disabled serif stem
+       width quantization.  It produces slightly better shapes though this
+       is not distinguishable with many fonts.
+       Remove other dead code.
+
+       * src/Jamfile, src/*/Jamfile: Simplified.
+       Use $(FT2_SRC_DIR).
+
+2002-11-06  David Turner  <david@freetype.org>
+
+       * include/freetype/freetype.h (FT_LOAD_TARGET_LIGHT): New macro.
+       (FT_LOAD_TARGET, FT_LOAD_TARGET_MODE): Use `& 15' instead of `& 7'.
+
+2002-11-05  David Turner  <david@freetype.org>
+
+       * include/freetype/config/ftoption.h, src/gzip/ftgzip.c: Added
+       support for the FT_CONFIG_OPTION_SYSTEM_ZLIB option, used to specify
+       the use of system-wide zlib.
+
+       Note that this macro, as well as
+       TT_CONFIG_OPTION_BYTECODE_INTERPRETER, is not #undef-ed anymore.
+       This allows the build system to define them depending on the
+       configuration (typically by adding -D flags at compile time).
+
+       * src/sfnt/ttcmap0.c (tt_face_build_cmaps): Removed compiler
+       warnings in optimized mode relative to the `volatile' local
+       variables.  This was not a compiler bug after all, but the fact that
+       a pointer to a volatile variable is not the same as a volatile
+       pointer to a variable :-)
+
+       The fix was to change
+         `volatile FT_Byte* p'
+       into
+         `FT_Byte* volatile p'.
+
+       * src/pfr/pfrload.c (pfr_phy_font_load), src/pfr/pfrdrivr.c
+       (pfr_get_metrics), src/gzip/inftrees.c: Removed compiler warnings in
+       optimized modes.
+
+       * src/gzip/*.[hc]: Modified our zlib copy in order to prevent
+       exporting any zlib function names outside of the component.  This
+       prevents linking problems on some platforms, when applications want
+       to link FreeType _and_ zlib together.
+
+2002-11-05  Juliusz  <jch@pps.jussieu.fr>
+
+       * src/psaux/psobjs.c (ps_table_add): Modified increment loop in
+       order to implement exponential behaviour.
+
+2002-11-01  David Turner  <david@freetype.org>
+
+       Added PFR-specific public API.  Fixed the kerning retrievel routine
+       (it returned invalid values when the outline and metrics resolution
+       differ).
+
+       * include/freetype/ftpfr.h, include/freetype/internal/pfr.h: New
+       files.
+
+       * include/freetype/internal/internal.h (FT_INTERNAL_PFR_H): New
+       macro for pfr.h.
+
+       * src/base/ftpfr.c: New file.
+       * src/base/Jamfile, src/base/descrip.mms: Updated.
+
+       * src/pfr/pfrdrivr.c: Include FT_INTERNAL_PFR_H.
+       (pfr_get_kerning, pfr_get_advance, pfr_get_metrics): New functions.
+       (pfr_service_rec): New format interface.
+       (pfr_driver_class): Use `pfr_service_rec'.
+       Replace `pfr_face_get_kerning' with `pfr_get_kerning'.
+       * src/pfr/pfrobjs.c: Remove dead code.
+
+       * src/base/ftobjs.c (ft_glyphslot_clear): Small internal fix to
+       better support bitmap-based font formats.
+
+       * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Fix handling of
+       `scale'.
+       Fix arguments to `FT_Vector_From_Polar'.
+
+2002-10-31  David Turner  <david@freetype.org>
+
+       Add support for automatic handling of gzip-compressed PCF files.
+
+       * src/gzip/*: New files, taken from the zlib package (except
+       ftgzip.c).
+
+       * include/freetype/ftgzip.h, src/gzip/ftgzip.c: New files.
+       * include/freetype/config/ftheader.h (FT_GZIP_H): New macro for
+       `ftgzip.h'.
+
+       * src/pcf/pcfdriver.c: Include FT_GZIP_H and FT_ERRORS_H.
+       (PCF_Face_Init): If normal open fails, try to open gzip stream.
+       (PCF_Face_Done): Close gzip stream.
+
+       * include/freetype/internal/pcftypes.h (PCF_Public_FaceRec),
+       src/pcf/pcf.h (PCF_FaceRec): Add `gzip_stream' and `gzip_source'.
+
+       * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_USE_ZLIB):
+       New macro.
+       (T1_CONFIG_OPTION_DISABLE_HINTER, FT_CONFIG_OPTION_USE_CMAPS
+       FT_CONFIG_OPTION_NO_CONVENIENCE_FUNCS,
+       FT_CONFIG_OPTION_ALTERNATE_GLYPH_FORMATS): Removed.
+
+       (FT_EXPORT, FT_EXPORT_DEF, FT_DEBUG_LEVEL_ERROR,
+       FT_DEBUG_LEVEL_TRACE, FT_DEBUG_MEMORY): Comment out definitions so
+       that platform specific configuration file can override.
+
+       * include/freetype/internal/ftstream.h: Include FT_SYSTEM_H.
+
+2002-10-30  David Turner  <david@freetype.org>
+
+       * FreeType 2.1.3rc3 released.
+
+2002-10-25  David Turner  <david@freetype.org>
+
+       * include/freetype/ftcache.h (FT_POINTER_TO_ULONG): New macro.
+       (FTC_FACE_ID_HASH): Rewritten, using FT_POINTER_TO_ULONG.
+
+2002-10-22  Giuseppe Ghibò  <ghibo@mandrakesoft.com>
+
+       * include/freetype/freetype.h (FT_Encoding): Fix entry for latin-2.
+
+2002-10-07  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/freetype.h (FT_Open_Face): Use `const' for `args'
+       (suggested by Graham).
+       * src/base/ftobjs.c (FT_Open_Face): Updated.
+       (ft_input_stream_new): Ditto.
+
+2002-10-05  David Turner  <david@freetype.org>
+
+       Adding support for embedded bitmaps to the PFR driver, and rewriting
+       its kerning loader/handler to use all kerning pairs in a physical
+       font (and not just the first item).
+
+       * src/pfr/pfr.c: Include `pfrsbit.c'.
+       * src/pfr/pfrgload.c: Include `pfrsbit.h'.
+       * src/pfr/pfrload.c (pfr_extra_item_load_kerning_pairs): Rewritten.
+       (pfr_phy_font_done, pfr_phy_font_load): Updated.
+       * src/pfr/pfrobks.c: Include `pfrsbit.h'.
+       (pfr_face_init): Handle kerning and embedded bitmaps.
+       (pfr_slot_load): Load embedded bitmaps.
+       (PFR_KERN_INDEX): Removed.
+       (pfr_face_get_kerning): Rewritten.
+       * src/pfr/pfrsbit.c, src/pfr/pfrsbit.h: New files.
+       * src/pfr/pfrtypes.h (PFR_KernItemRec): New structure.
+       (PFR_KERN_INDEX): New macro.
+       (PFR_PhyFontRec): Add items for kerning and embedded bitmaps.
+       * src/pfr/Jamfile (_sources) [FT2_MULTI]: Add `pfrsbit'.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Don't load bitmap fonts if
+       FT_LOAD_NO_RECURSE is set.
+       Load embedded bitmaps only if FT_LOAD_NO_BITMAP isn't set.
+
+       * src/tools/docmaker/content.py, src/tools/docmaker/sources.py,
+       src/tools/docmaker/tohtml.py: Fixing a few nasty bugs.
+
+       * src/sfnt/ttcmap0.c (tt_cmap4_validate): The validator for format 4
+       sub-tables is now capable of dealing with invalid `length' fields at
+       the start of the sub-table.  This allows fonts like `mg______.ttf'
+       (i.e.  Marriage) to return accurate charmaps.
+
+       * docs/CHANGES: Updated.
+
+2002-10-05  Werner Lemberg  <wl@gnu.org>
+
+       * src/smooth/ftgrays.c (SUBPIXELS): Add cast to `TPos'.
+       Update all callers.
+       (TRUNC): Add cast to `TCoord'.
+       Update all callers.
+       (TRaster): Use `TPos' for min_ex, max_ex, min_ey, max_ey, and
+       last_ey.
+       Update all casts.
+       (gray_render_line): Fix casts for `p' and `first'.
+
+2002-10-02  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * src/bdf/bdflib.c (bdf_load_font): Allocate the _bdf_parse_t
+       structure with FT_ALLOC instead of using the stack.
+
+2002-09-27  Werner Lemberg  <wl@gnu.org>
+
+       * src/include/freetype/internal/tttypes.h (num_sbit_strikes,
+       num_sbit_scales): Use `FT_ULong'.
+       * src/sfnt/sfobjs.c (sfnt_load_face): Updated accordingly.
+       * src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Ditto.
+       (find_sbit_image): Remove cast.
+       * src/raster/ftrend1.c (ft_raster1_render): Fix cast.
+
+2002-09-27  Wolfgang Domröse  <porthos.domroese@harz.de>
+
+       * src/sfnt/ttload.c (tt_face_load_names): Use cast.
+       * src/sfnt/ttcmap.c (code_to_next2): Use long constant.
+       (code_to_index4): Use cast.
+       (code_to_index8_12): Fix cast.
+       * src/sfnt/ttcmap0.c (tt_cmap4_char_next, tt_cmap8_char_index,
+       tt_cmap12_char_index): Use cast for `result'.
+       (tt_face_build_cmaps): Use cast.
+       * src/sfnt/sfobjs.c (tt_name_entry_ascii_from_ucs4): Use cast for
+       `code'.
+       (sfnt_load_face): Use FT_Int32 for `flags'.
+
+       * src/smooth/ftgrays.c (gray_render_scanline, gray_render_line,
+       gray_compute_cbox, gray_convert_glyph, gray_raster_reset): Add casts
+       to `TCoord' and `int'.
+       More 16bit fixes.
+       s/FT_Pos/TPos/.
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic): Add casts.
+
+2002-09-26  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttpost.c (load_post_names, tt_face_free_ps_names,
+       tt_face_get_ps_name): Replace switch statement with if clauses to
+       make it more portable.
+
+       * src/cff/cffobjs.c (cff_face_init): Ditto.
+
+       * include/freetype/ftmodule.h (FT_Module_Class): Use `FT_Long' for
+       `module_size'.
+       * include/freetype/ftrender.h (FT_Glyph_Class_): Use `FT_Long' for
+       `glyph_size'.
+
+       * src/base/ftobjs.c (FT_Render_Glyph): Change second parameter to
+       `FT_Render_Mode'.
+       (FT_Render_Glyph_Internal): Change third parameter to
+       `FT_Render_Mode'.
+       * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Change second parameter
+       to `FT_Render_Mode'.
+
+       * src/raster/ftrend1.c (ft_raster1_render): Change third parameter
+       to `FT_Render_Mode'.
+       * src/smooth/ftsmooth.c (ft_smooth_render, ft_smooth_render_lcd,
+       ft_smooth_render_lcd_v): Ditto.
+       (ft_smooth_render_generic): Change third and fifth parameter to
+       `FT_Render_Mode'.
+
+       * include/freetype/freetype.h, include/freetype/internal/ftobjs.h,
+       include/freetype/ftglyph.h: Updated.
+
+       * src/cff/cffdrivr.c (Load_Glyph), src/pcf/pcfdriver.c
+       (PCF_Glyph_Load), src/pfr/pfrobjs.c (pfr_slot_load),
+       src/winfonts/winfnt.c (FNT_Load_Glyph), src/t42/t42objs.c
+       (T42_GlyphSlot_Load), src/bdf/bdfdrivr.c (BDF_Glyph_Load): Change
+       fourth parameter to `FT_Int32'.
+
+       * src/pfr/pfrobjs.c (pfr_face_init): Add two missing parameters
+       and declare them as unused.
+
+       * src/cid/cidparse.h (CID_Parser): Use FT_Long for `postscript_len'.
+
+       * src/psnames/psnames.h (PS_Unicode_Value_Func): Change return
+       value to FT_UInt32.
+       * src/psnames/psmodule.c (ps_unicode_value, ps_build_unicode_table):
+       Updated accordingly.
+
+2002-09-26  Wolfgang Domröse  <porthos.domroese@harz.de>
+
+       * src/cff/cffdrivr.c (Get_Kerning): Use FT_Long for `middle'.
+       (cff_get_glyph_name): Use cast for result of ft_strlen.
+       * src/cff/cffparse.c (cff_parse_real): User cast for assigning
+       `exp'.
+       * src/cff/cffload.c (cff_index_get_pointers): Use FT_ULong for
+       some local variables.
+       (cff_charset_load, cff_encoding_load): Use casts to FT_UInt for some
+       switch statements.
+       (cff_font_load): Use cast in call to CFF_Load_FD_Select.
+       * src/cff/cffobjs.c (cff_size_init): Use more casts.
+       (cff_face_init): Use FT_Int32 for `flags'.
+       * src/cff/cffgload.c (cff_operator_seac): Use cast for assigning
+       `adx' and `ady'.
+       (cff_decoder_parse_charstrings): Use FT_ULong for third parameter.
+       Use more casts.
+       * src/cff/cffcmap.c (cff_cmap_unicode_init): Use cast for `count'.
+
+       * src/cid/cidload.c (cid_read_subrs): Use FT_ULong for `len'.
+       * src/cid/cidgload.c (cid_load_glyph): Add missing cast for
+       `cid_get_offset'.
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings) <18>: Use
+       cast for `num_points'.
+       (t1_decoder_init): Use cast for assigning `decoder->num_glyphs'.
+
+       * src/base/ftdebug.c (ft_debug_init): Use FT_Int.
+       * include/freetype/internal/ftdriver.h (FT_Slot_LoadFunc): Use
+       `FT_Int32' for fourth parameter.
+       * src/base/ftobjs.c (open_face): Use cast for calling
+       clazz->init_face.
+
+       * src/raster/ftraster.c (Set_High_Precision): Use `1' instead of
+       `1L'.
+       (Finalize_Profile_Table, Line_Up, ft_black_init): Use casts.
+       * src/raster/ftrend1.c (ft_raster1_render): Ditto.
+
+       * src/sfnt/sfnt_dir_check: Compare `magic' with unsigned long
+       constant.
+
+2002-09-26  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * builds/amiga/include/freetype/config/ftmodule.h: Updated.
+
+2002-09-25  David Turner  <david@freetype.org>
+
+       * src/autohint/ahtypes.h (AH_HINT_METRICS): Disabling metrics
+       hinting in the auto-hinter.  This produces much better anti-aliased
+       text.
+
+       * docs/CHANGES: Updating the changes documentation.
+
+2002-09-25  Anthony Fok  <anthony@thizlinux.com>
+
+       * src/sfnt/ttcmap0.c (tt_cmap4_validate, tt_cmap4_char_index,
+       tt_cmap4_char_next): Added support for opens___.ttf (it contains a
+       charmap that uses offset=0xFFFFU instead of 0x0000 to indicate a
+       missing glyph).
+
+2002-09-21  Wolfgang Domröse  <porthos.domroese@harz.de>
+
+       * src/truetype/ttdriver.c (Load_Glyph): Fourth parameter must be
+       FT_Int32.
+       * src/truetype/ttgload.c, src/truetype/ttgload.h (TT_Load_Glyph):
+       Ditto.
+
+2002-09-19  Wolfgang Domröse  <porthos.domroese@harz.de>
+
+       More 16bit fixes.
+
+       * src/autohint/ahglobal.c (sort_values): Use FT_Pos for `swap'.
+       (ah_hinter_compute_widths): Use FT_Pos for `dist'.
+       Use AH_MAX_WIDTHS.
+       * src/autohint/ahglyph.c (ah_outline_scale_blue_edges): Use FT_Pos
+       for `delta'.
+       (ah_outline_compute_edges): Replace some ints with FT_Int and
+       FT_Pos.
+       (ah_test_extrema): Clean up code.
+       (ah_get_orientation): Use 4 FT_Int variables instead of FT_BBox to
+       hold indices.
+       * src/autohint/ahtypes.h (AH_SegmentRec): Change type of `score'
+       to FT_Pos.
+
+2002-09-19  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/config.guess, builds/unix/config.sub: Updated to
+       recent versions.
+
+2002-09-18  David Turner  <david@freetype.org>
+
+       * src/base/ftobjs.c (FT_Library_Version): Bugfix.
+
+       * FreeType 2.1.3rc2 (release candidate 2) is released!
+
+2002-09-17  David Turner  <david@freetype.org>
+
+       * include/freetype/freetype.h, include/freetype/ftimage.h,
+       include/freetype/ftstroker.h, include/freetype/ftsysio.h,
+       include/freetype/ftsysmem.h, include/freetype/ttnameid.h: Updating
+       the in-source documentation.
+
+       * src/tools/docmaker/tohtml.py: Updating the HTML formatter in the
+       DocMaker tool.
+
+       * src/tools/docmaker.py: Removed.
+
+2002-09-17  Werner Lemberg  <wl@gnu.org>
+
+       More 16bit fixes.
+
+       * src/psaux/psobjs.c (reallocate_t1_table): Use FT_Long for
+       second parameter.
+
+2002-09-16  Werner Lemberg  <wl@gnu.org>
+
+       16bit fixes from Wolfgang Domröse.
+
+       * src/type1/t1parse.h (T1_ParserRec): Change type of `base_len'
+       and `private_len' to FT_Long.
+       * src/type1/t1parse.c (T1_Get_Private_Dict): Remove cast for
+       `private_len'.
+       * src/type1/t1load.c: Use FT_Int cast for most calls of T1_ToInt.
+       Use FT_PtrDist where appropriate.
+       (parse_encoding): Use FT_Long for `count' and `n'.
+       (read_binary_data): Use FT_Long* for second parameter.
+       * src/type1/t1afm.c (afm_atoindex): Use FT_PtrDist.
+
+       * src/cache/ftcsbits.c (ftc_sbit_node_load): Remove unused label.
+       * src/pshinter/pshalgo3.c (psh3_hint_align): Remove unused variable.
+
+2002-09-14  Werner Lemberg  <wl@gnu.org>
+
+       Making ftgrays.c compile stand-alone again.
+
+       * include/freetype/ftimage.h: Include ft2build.h only if _STANDALONE_
+       isn't defined.
+       * src/smooth/ftgrays.c [_STANDALONE_]: Define ft_memset,
+       FT_BEGIN_HEADER, FT_END_HEADER.
+       (FT_MEM_ZERO): Define.
+       (TRaster) [GRAYS_USE_GAMMA]: Use `unsigned char' instead of FT_Byte.
+       (gray_render_span, gray_init_gamma): Don't use `FT_UInt'.
+       Don't cast with `FT_Byte'.
+       (grays_init_gamma): Don't use `FT_UInt'.
+
+2002-09-14  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftinit.c (FT_Add_Default_Modules): Improve error message.
+       * src/pcf/pcfdriver.c (PCF_Face_Done): Improve tracing message.
+       * include/freetype/config/ftoption.h (FT_MAX_MODULES): Increased
+       to 32.
+
+2002-09-10  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/configure.ac (version_info): Set to 9:2:3.
+       * builds/unix/configure: Regenerated.
+       * docs/VERSION.DLL: Updated.
+
+2002-09-09  David Turner  <david@freetype.org>
+
+       * src/pshinter/pshalgo2.c (psh2_glyph_find_strong_points),
+       src/pshinter/pshalgo3.c (psh3_glyph_find_strong_points): Adding fix
+       to prevent seg fault when hints are provided in an empty glyph.
+
+       * src/cache/ftccache.i (GEN_CACHE_LOOKUP) [FT_DEBUG_LEVEL_ERROR]:
+       Removed conditional code.  This fixes a bug that prevented
+       compilation in debug mode of template instantiation.
+
+       * include/freetype/ftimage.h: Removed incorrect `zft_' definitions
+       and updated constants documentation comments.
+
+       * src/cff/cffparse.c (cff_parser_run): Fixed the CFF table loader.
+       It didn't accept empty arrays, and this prevented the loading of
+       certain fonts.
+
+       * include/freetype/freetype.h (FT_FaceRec): Updating documentation
+       comment.  The `descender' value is always *negative*, not positive.
+
+2002-09-09  Owen Taylor  <owen@redhat.com>
+
+       * src/pcf/pcfdriver.c (PCF_Glyph_Load): Fixing incorrect computation
+       of bitmap metrics.
+
+2002-09-08  David Turner  <david@freetype.org>
+
+       Various updates to correctly support sub-pixel rendering.
+
+       * include/freetype/config/ftmodule.h: Add two renderers for LCD.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Updated.
+
+       * src/smooth/ftsmooth.c (ft_smooth_render_lcd,
+       ft_smooth_render_lcd_v): Set FT_PIXEL_MODE_LCD and
+       FT_PIXEL_MODE_LCD_V, respectively.
+
+       * include/freetype/cache/ftcimage.h (FTC_ImageTypeRec): New
+       structure.
+       Updated all users.
+       (FTC_ImageDesc): Removed.
+       (FTC_ImageCache_Lookup): Second parameter is now of type
+       `FTC_ImageType'.
+       Updated all users.
+       (FTC_IMAGE_DESC_COMPARE): Updated and renamed to...
+       (FTC_IMAGE_TYPE_COMPARE): This.
+       (FTC_IMAGE_DESC_HASH): Updated and renamed to...
+       (FTC_IMAGE_TYPE_HASH): This.
+
+       * include/freetype/cache/ftcsbits.h (FTC_SBitRec): Field `num_grays'
+       replaced with `max_grays'.
+       `pitch' is now FT_Short.
+       (FTC_SBitCache_Lookup): Second parameter is now of type
+       `FTC_ImageType'.
+       Updated all users.
+
+       * src/cache/ftcimage.c (FTC_ImageQueryRec, FTC_ImageFamilyRec):
+       Updated.
+       (ftc_image_node_init): Updated.
+       Moved code to convert type flags to load flags to...
+       (FTC_Image_Cache_Lookup): This function.
+       (ftc_image_family_init): Updated.
+
+       * src/cache/ftcsbit.c (FTC_SBitQueryRec, FTC_SBitFamilyRec):
+       Updated.
+       (ftc_sbit_node_load): Updated.
+       Moved code to convert type flags to load flags to...
+       (FTC_SBitCache_Lookup): This function.
+
+       * src/autohint/ahtypes.h (AH_HinterRec): Replace `no_*_hints' with
+       `do_*_snapping'.
+       Update all users (with negation).
+       * src/autohint/ahhint.c (ah_compute_stem_width): Fix threshold for
+       `dist' for `delta' < 40.
+
+       * src/pshinter/pshalgo3.h (PSH3_GlyphRec): Replace `no_*_hints' with
+       `do_*_snapping'.
+       Update all users (with negation).
+       * src/pshinter/pshalgo3.c (psh3_dimension_quantize_len): New
+       function.
+       (psh3_hint_align): Use it.
+       Improve hinting code.
+       [STRONGER]: Removed.
+       (STRONGER): Removed.
+
+       * include/freetype/freetype.h (FT_Set_Hint_Flags, FT_HINT_*):
+       Removed.
+
+2002-09-05  Werner Lemberg  <wl@gnu.org>
+
+       * src/cid/cidobjs.c (CID_Size_Init): Renamed to...
+       (cid_size_init): This.
+       * src/psaux/psobjs.c (T1_Builder_Add_Point1): Renamed to...
+       (t1_builder_add_point1): This.
+
+       Updated all affected code.
+
+       * src/pshinter/pshalgo3.c (psh3_hint_align): Fix compiler warnings.
+       * src/type1/t1gload.c (T1_Compute_Max_Advance): Ditto.
+
+2002-09-04  David Turner  <david@freetype.org>
+
+       * include/freetype/freetype.h: Corrected the definition of
+       ft_encoding_symbol to be FT_ENCODING_MS_SYMBOL (instead of
+       the erroneous FT_ENCODING_SYMBOL).
+
+       * builds/unix/unix-def.in (datadir): Initialize it (thanks to
+       Anthony Fok).
+
+2002-08-29  David Turner  <david@freetype.org>
+
+       Slight modification to the Postscript hinter to slightly increase
+       the contrast of smooth hinting.  This is very similar to what the
+       auto-hinter does when it comes to stem width computations.  However,
+       it produces better results with well-hinted fonts.
+
+       * include/freetype/internal/psaux.h (T1_Decoder_FuncsRec): Add hint
+       mode to `init' member function.
+       (T1_DecoderRec): Add hint mode.
+       * include/freetype/internal/pshints (T1_Hints_ApplyFunc,
+       T2_Hints_ApplyFunc): Pass `hint_mode', not `hint_flags'.
+       * src/psaux/t1decode.c (t1_decoder_init): Add hint mode argument.
+       * src/pshinter/pshalgo1.c (ps1_hints_apply): Pass hint mode, not
+       hint flags.
+       * src/pshinter/pshalgo2.c (ps2_hints_apply): Ditto.
+       * src/pshinter/pshalgo3.c (ps3_hints_apply): Ditto.
+       (STRONGER): New macro.
+       (psh3_hint_align, psh3_hint_table_align_hints): Pass `glyph' instead
+       of `hint_flags'.
+       Implement announced changes.
+       * src/pshinter/pshalgo3.h (PSH3_GlyphRec): Add flags to control
+       vertical and horizontal hints and snapping.
+
+       * README, docs/CHANGES: Updating for the 2.1.3 release.
+
+2002-08-27  David Turner  <david@freetype.org>
+
+       * Massive re-formatting changes to many, many source files.  I don't
+       want to list them all here.  The operations performed were all
+       logical transformations of the sources:
+
+       - trying to convert all enums and constants to CAPITALIZED_STYLE,
+         #with define definitions like
+
+           #define my_old_constants   MY_NEW_CONSTANT
+
+       - big, big update of the documentation comments
+
+       * include/freetype/freetype.h, src/base/ftobjs.c,
+       src/smooth/ftsmooth.c, include/freetype/ftimage.h: Adding support
+       for LCD-optimized rendering though the new constants/enums:
+
+         FT_RENDER_MODE_LCD, FT_RENDER_MODE_LCD_V
+         FT_PIXEL_MODE_LCD,  FT_PIXEL_MODE_LCD_V
+
+       This is still work in progress, don't expect everything to work
+       correctly though most of the features have been implemented.
+
+       * Adding new FT_LOAD_XXX flags, used to specify both hinting and
+       rendering targets:
+
+         FT_LOAD_TARGET_NORMAL :: anti-aliased hinting & rendering
+         FT_LOAD_TARGET_MONO   :: monochrome bitmaps
+         FT_LOAD_TARGET_LCD    :: horizontal RGB/BGR decimated
+                                  hinting & rendering
+         FT_LOAD_TARGET_LCD_V  :: vertical RGB/BGR decimated
+                                  hinting & rendering
+
+       Note that FT_LOAD_TARGET_NORMAL is 0, which means that the default
+       behaviour of the font engine is _unchanged_.
+
+       * include/freetype/ftimage.h
+       (FT_Outline_{Move,Line,Conic,Cubic}To_Func): Renamed to...
+       (FT_Outline_{Move,Line,Conic,Cubic}ToFunc): This.
+       (FT_Raster_Span_Func): Renamed to ...
+       (FT_SpanFunc): This.
+       (FT_Raster_{New,Done,Reset,Set_Mode,Render}_Func): Renamed to ...
+       (FT_Raster_{New,Done,Reset,SetMode,Render}Func}: This.
+
+       Updated all affected code.
+
+       * include/freetype/ftrender.h
+       (FT_Glyph_{Init,Done,Transform,BBox,Copy,Prepare}_Func): Renamed
+       to ...
+       (FT_Glyph_{Init,Done,Transform,GetBBox,Copy,Prepare}Func): This.
+       (FTRenderer_{render,transform,getCBox,setMode}): Renamed to ...
+       (FT_Renderer_{RenderFunc,TransformFunc,GetCBoxFunc,SeteModeFunc}):
+       This.
+
+       Updated all affected code.
+
+       * src/autohint/ahtypes.h (AH_Point, AH_Segment, AH_Edge, AH_Globals,
+       AH_Face_Globals, AH_Outline, AH_Hinter): These typedefs are now
+       pointers to the corresponding `*Rec' structures.  All source files
+       have been updated accordingly.
+
+       * src/cff/cffgload.c (cff_decoder_init): Add hint mode as parameter.
+       * src/cff/cffgload.h (CFF_Decoder): Add `hint_mode' element.
+
+       * src/cid/cidgload.c (CID_Compute_Max_Advance): Renamed to...
+       (cid_face_compute_max_advance): This.
+       (CID_Load_Glyph): Renamed to...
+       (cid_slot_load_glyph): This.
+       * src/cid/cidload.c (CID_Open_Face): Renamed to...
+       (cid_face_open): This.
+       * src/cid/cidobjs.c (CID_GlyphSlot_{Done,Init}): Renamed to...
+       (cid_slot_{done,init}): This.
+       (CID_Size_{Get_Globals_Funcs,Done,Reset): Renamed to...
+       (cid_size_{get_globals_funcs,done,reset): This.
+       (CID_Face_{Done,Init}): Renamed to...
+       (cid_face_{done,init}): This.
+       (CID_Driver_{Done,Init}: Renamed to...
+       (cid_driver_{done,init}: This.
+       * src/cid/cidparse.c (CID_{New,Done}_Parser): Renamed to...
+       (cid_parser_{new,done}): This.
+       * src/cid/cidparse.h (CID_Skip_{Spaces,Alpha}): Renamed to...
+       (cid_parser_skip_{spaces,alpha}): This.
+       (CID_To{Int,Fixed,CoordArray,FixedArray,Token,TokenArray}): Renamed
+       to...
+       (cid_parser_to_{int,fixed,coord_array,fixed_array,token,token_array}):
+       This.
+       (CID_Load_{Field,Field_Table): Renamed to...
+       (cid_parser_load_{field,field_table}): This.
+       * src/cid/cidriver.c (CID_Get_Interface): Renamed to...
+       (cid_get_interface): This.
+
+       Updated all affected code.
+
+       * src/psaux/psobjs.c (PS_Table_*): Renamed to...
+       (ps_table_*): This.
+       (T1_Builder_*): Renamed to...
+       (t1_builder_*): This.
+       * src/psaux/t1decode.c (T1_Decoder_*): Renamed to...
+       (t1_decoder_*): This.
+
+       * src/psnames/psmodule.c (PS_*): Renamed to...
+       (ps_*): This.
+
+       Updated all affected code.
+
+       * src/sfnt/sfdriver (SFNT_Get_Interface): Renamed to...
+       (sfnt_get_interface): This.
+       * src/sfnt/sfobjs.c (SFNT_*): Renamed to...
+       (sfnt_*): This.
+       * src/sfnt/ttcmap.c (TT_CharMap_{Load,Free}): Renamed to...
+       (tt_face_{load,free}_charmap): This.
+       * src/sfnt/ttcmap0.c (TT_Build_CMaps): Renamed to...
+       (tt_face_build_cmaps): This.
+       * src/sfnt/ttload.c (TT_*): Renamed to...
+       (tt_face_*): This.
+       * src/sfnt/ttpost.c (TT_Post_Default_Names): Renamed to...
+       (tt_post_default_names): This.
+       (Load_*): Renamed to...
+       (load_*): This.
+       (TT_*): Renamed to...
+       (tt_face_*): This.
+       * src/sfnt/ttsbit.c (TT_*): Renamed to...
+       (tt_face_*): This.
+       ({Find,Load,Crop}_*): Renamed to...
+       ({find,load,crop}_*): This.
+
+       Updated all affected code.
+
+       * src/smooth/ftsmooth.c (ft_smooth_render): Renamed to...
+       (ft_smooth_render_generic): This.
+       Make function more generic by adding vertical and horizontal scaling
+       factors.
+       (ft_smooth_render, ft_smooth_render_lcd, ft_smooth_render_lcd_v):
+       New functions.
+
+       (ft_smooth_locd_renderer_class, ft_smooth_lcdv_renderer_class): New
+       classes.
+
+       * src/truetype/ttobjs.c (TT_{Done,New}_GlyphZone): Renamed to...
+       (tt_glyphzone_{done,new}): This.
+       (TT_{Face,Size,Driver}_*): Renamed to...
+       (tt_{face,size,driver}_*): This.
+       * src/truetype/ttpload.c (TT_Load_Locations): Renamed to...
+       (tt_face_load_loca): This.
+       (TT_Load_Programs): Renamed to...
+       (tt_face_load_fpgm): This.
+       (TT_*): Renamed to...
+       (tt_face_*): This.
+
+2002-08-27  Werner Lemberg  <wl@gnu.org>
+
+       * docs/VERSION.DLL: New file.
+
+2002-08-23  Graham Asher  <graham.asher@btinternet.com>
+
+       * src/cff/cffgload.c (cff_operator_seac)
+       [FT_CONFIG_OPTION_INCREMENTAL]: Incremental fonts (actually not
+       incremental in the case of CFF but just using callbacks to get glyph
+       recipes) pass the character code, not the glyph index, to the
+       get_glyph_data function; they have no valid charset table.
+
+       * src/cff/cffload.c (cff_font_load): Removed special cases for
+       FT_CONFIG_OPTION_INCREMENTAL, which are no longer necessary; CFF
+       fonts provided via the incremental interface now have to conform
+       more closely to the CFF font format.
+
+       * src/cff/cffload.h (cff_font_load): Removed argument now unneeded.
+
+       * src/cff/cffobjs.c (cff_face_init): Changed call to cff_font_load
+       to conform with new signature.
+
+2002-08-22  David Turner  <david@freetype.org>
+
+       * src/base/ftobject.c, src/base/ftsynth.c, src/base/ftstroker.c,
+       src/bdf/bdfdrivr.c: Removed compiler warnings.
+
+2002-08-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/pshinter/pshalgo3.c (psh3_glyph_compute_inflections,
+       psh3_glyph_compute_extrema, psh3_hint_table_find_strong_point): Fix
+       compiler warnings and resolve shadowing of local variables.
+
+2002-08-21  David Turner  <david@freetype.org>
+
+       The automatic and Postscript hinter now automatically detect
+       inflection points in glyph outlines and treats them specially.  This
+       is very useful to prevent nasty effect like the disappearing
+       diagonals of `S' and `s' in many, many fonts.
+
+       * src/autohint/ahtypes.h (ah_flag_inflection): New macro.
+       * src/autohint/ahangles.c (ah_angle_diff): New function.
+       * src/autohint/ahangles.h: Updated.
+       * src/autohint/ahglyph.c (ah_outline_compute_inflections): New
+       function.
+       (ah_outline_detect_features): Use it.
+       * src/autohint/ahhint.c (ah_hinter_align_strong_points)
+       [!AH_OPTION_NO_WEAK_INTERPOLATION]: Handle inflection.
+
+       * src/tools/docmaker/docmaker.py, src/tools/docmaker/utils.py,
+       src/tools/docmaker/tohtml.py: Updating the DocMaker tool.
+
+       * include/freetype/freetype.h: Changing the type of the `load_flags'
+       parameter from `FT_Int' to `FT_Int32', this in order to support more
+       options.  This should only break binary and/or source compatibility
+       on 16-bit platforms (Atari?).
+       (FT_LOAD_NO_AUTOHINT): New macro.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Updated.
+       Handle FT_LOAD_NO_AUTOHINT.
+       (FT_Load_Char): Updated.
+
+       * src/pshinter/pshalgo3.c, src/base/ftobjs.c, src/base/ftobject.c,
+       src/autohint/ahglyph.c, include/freetype/freetype.h: Fixing typos
+       and removing compiler warnings.
+
+2002-08-20  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgload.c (TT_Get_Metrics): Add guard for k = 0.
+
+2002-08-20  David Turner  <david@freetype.org>
+
+       * src/pshinter/pshalgo1.c, src/pshinter/pshalgo2.c,
+       src/pshinter/pshglob.c, src/pshinter/pshrec.c,
+       src/autohint/ahmodule.c [DEBUG_HINTER]: Removing compiler warnings
+       (only used in development builds anyway).
+
+       Improve support of local extrema and stem edge points.
+
+       * src/pshinter/pshalgo3.h (PSH3_Hint_TableRec): Use PSH3_ZoneRec
+       for `zones'.
+       (PSH3_DIR_UP, PSH3_DIR_DOWN): Exchange values.
+       (PSH3_DIR_HORIZONTAL, PSH3_DIR_VERTICAL): New macros.
+       (PSH3_DIR_COMPARE, PSH3_DIR_IS_HORIZONTAL, PSH3_IS_VERTICAL): New
+       macros.
+       (PSH3_POINT_INFLEX): New enum.
+       (psh3_point_{is,set}_{off,inflex}): New macros.
+       (PSH3_POINT_{EXTREMUM,POSITIVE,NEGATIVE,EDGE_MIN,EDGE_MAX): New
+       enum values.
+       (psh3_point_{is,set}_{extremum,positive,negative,edge_min,edge_max}):
+       New macros.
+       (PSH3_PointRec): New members `flags2' and `org_v'.
+       (PSH3_POINT_EQUAL_ARG, PSH3_POINT_ANGLE): New macros.
+
+       * src/pshinter/pshalgo3.c [DEBUG_HINTER]: Removing compiler
+       warnings.
+       (COMPUTE_INFLEXS): New macro.
+       (psh3_hint_align): Simplify some basic arithmetic computations.
+       (psh3_point_is_extremum): Removed.
+       (psh3_glyph_compute_inflections) [COMPUTE_INFLEXS]: New function.
+       (psh3_glyph_init) [COMPUTE_INFLEXS]: Use it.
+       (psh3_glyph_compute_extrema): New function.
+       (PSH3_STRONG_THRESHOLD): Increased to 30.
+       (psh3_hint_table_find_strong_point): Improved.
+       (psh3_glyph_find_strong_points,
+       psh3_glyph_interpolate_strong_points): Updated.
+       (psh3_hints_apply): Use psh3_glyph_compute_extrema.
+
+       * test/gview.c (draw_ps3_hint, ps3_draw_control_points): New
+       functions.
+       Other small updates.
+
+       * Jamfile: Small updates.
+
+2002-08-18  Arkadiusz Miskiewicz  <misiek@pld.ORG.PL>
+
+       * builds/unix/install.mk (install, uninstall): Add $(DESTDIR) to
+       make life easier for package maintainers.
+
+2002-08-18  Werner Lemberg  <wl@gnu.org>
+
+       * src/pcf/pcfdriver.c (PCF_Glyph_Load): Fix computation of
+       horiBearingX.
+       * src/bdf/bdfdrivr.c (BDF_GlyphLoad): Fix computation of
+       horiBearingY.
+
+2002-08-16  George Williams  <gww@silcom.com>
+
+       Add support for Apple composite glyphs.
+
+       * include/freetype/config/ftoption.h
+       (TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED): New macro.
+
+       * src/truetype/ttgload.c (OVERLAP_COMPOUND, SCALED_COMPONENT_OFFSET,
+       UNSCALED_COMPONENT_OFFSET): New macros for additional OpenType
+       glyph loading flags.
+       (load_truetype_glyph): Implement it.
+
+2002-08-16  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffgload.c (cff_free_glyph_data),
+       src/cff/cffload.c (cff_font_load): Use FT_UNUSED.
+
+2002-08-15  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Initialize `error'.
+       * src/sfnt/sfobjs.c (SFNT_Load_Face): Fix compiler warning.
+
+2002-08-15  Graham Asher  <graham.asher@btinternet.com>
+
+       Implemented the incremental font loading system for the CFF driver.
+       Tested using the GhostScript-to-FreeType bridge (under development).
+
+       * src/cff/cffgload.c (cff_get_glyph_data, cff_free_glyph_data): New
+       functions.
+       (cff_operator_seac, cff_compute_max_advance, cff_slot_load): Use
+       them.
+       * src/cff/cffload.c (cff_font_load): Add `face' parameter.
+       Load charset and encoding only if there are glyphs.
+       [FT_CONFIG_OPTION_INCREMENTAL]: Incremental fonts don't need
+       character recipes.
+       * src/cff/cffload.h, src/cff/cffobjs.c: Updated.
+
+       * src/cid/cidgload.c (cid_load_glyph)
+       [FT_CONFIG_OPTION_INCREMENTAL]: Corrected the incremental font
+       loading implementation to use the new system introduced on
+       2002-08-01.
+
+2002-08-06  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffcmap.c: Remove compiler warnings.
+       * src/cache/ftccache.c, src/cache/ftccache.i,
+       src/pfr/pfrload.c, src/pfr/pfrgload.c: s/index/idx/.
+       * src/cff/cffload.c: s/select/fdselect/.
+       * src/raster/ftraster.c: s/wait/waiting/.
+
+2002-08-01  Graham Asher  <graham.asher@btinternet.com>
+
+       * src/type1/t1load.c (T1_Open_Face): Tolerate a face with no
+       charstrings if there is an incremental loading interface.  Type 1
+       faces supplied by PostScript interpreters like GhostScript will
+       typically not provide any charstrings at load time, so this is
+       essential if they are to work.
+
+2002-08-01  Graham Asher  <graham.asher@btinternet.com>
+
+       Modified incremental loading interface to be closer to David's
+       preferences.  The header freetype.h is not now affected, the
+       interface is specified via an FT_Parameter, the pointer to the
+       interface is hidden in an internal part of the face record, and all
+       the definitions are in ftincrem.h.
+
+       * include/freetype/freetype.h [FT_CONFIG_OPTION_INCREMENTAL]:
+       Removed.
+       * include/freetype/internal/ftobjs.h [FT_CONFIG_OPTION_INCREMENTAL]:
+       Include FT_INCREMENTAL_H.
+       (FT_Face_InternalRec) [FT_CONFIG_OPTION_INCREMENTAL]: Add
+       `incremental_interface'.
+
+       * src/base/ftobjs.c (open_face, FT_Open_Face)
+       [FT_CONFIG_OPTION_INCREMENTAL]: Updated.
+       * src/sfnt/sfobjs.c (SFNT_Load_Face) [FT_CONFIG_OPTION_INCREMENTAL]:
+       Updated.
+
+       * src/truetype/ttgload.c (load_truetype_glyph)
+       [FT_CONFIG_OPTION_INCREMENTAL]: Updated.
+       Free loaded glyph data properly.
+       (compute_glyph_metrics, TT_Load_Glyph)
+       [FT_CONFIG_OPTION_INCREMENTAL]: Updated.
+       * src/truetype/ttobjs.c (TT_Face_Init)
+       [FT_CONFIG_OPTION_INCREMENTAL]: Updated.
+
+       * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String)
+       [FT_CONFIG_OPTION_INCREMENTAL]: Updated.
+       (T1_Parse_Glyph) [FT_CONFIG_OPTION_INCREMENTAL]: Updated.
+       Free loaded glyph data properly.
+       (T1_Load_Glyph): Updated.
+       [FT_CONFIG_OPTION_INCREMENTAL]: Free loaded glyph data properly.
+
+2002-07-30  David Turner  <david@freetype.org>
+
+       * include/freetype/ftincrem.h: Adding new experimental header file
+       to demonstrate a `cleaner' API to support incremental font loading.
+
+       * include/freetype/config/ftheader.h (FT_INCREMENTAL_H): New macro.
+
+       * src/tools/docmaker/*: Adding new (more advanced) version of
+       the DocMaker tool, using Python's sophisticated regexps.
+
+2002-07-28  Werner Lemberg  <wl@gnu.org>
+
+       s/ft_memset/FT_MEM_SET/.
+       s/FT_MEM_SET/FT_MEM_ZERO/ where appropriate.
+
+2002-07-27  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttload.c (sfnt_dir_check): Make it work with TTCs.
+
+2002-07-26  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgload.c (load_truetype_glyph)
+       [FT_CONFIG_OPTION_INCREMENTAL]: s/memset/ft_memset/.
+
+       * src/autohint/ahhint.c (ah_hint_edges_3): Fix compiler warning.
+       * src/cff/cffload.c (cff_encoding_load): Remove `memory' variable.
+       * src/cff/cffcmap.c (cff_cmap_encoding_init): Remove `psnames'
+       variable.
+       * src/truetype/ttgload.c (load_truetype_glyph): Remove statement
+       without effect.
+       * src/truetype/ttdriver (Get_Char_Index, Get_Next_Char): Removed.
+
+       * src/pshinter/pshalgo3.c (psh3_hint_table_record,
+       psh3_hint_table_init, psh3_hint_table_activate_mask): Fix error
+       message.
+
+2002-07-24  Graham Asher  <graham.asher@btinternet.com>
+
+       * src/truetype/ttobjs.c: Fix for bug reported by Sven Neumann
+       [sven@gimp.org] on the FreeType development forum: `If
+       FT_CONFIG_OPTION_INCREMENTAL is undefined (this is the default), the
+       TrueType loader crashes in line 852 of src/truetype/ttgload.c when
+       it tries to access face->glyph_locations.'
+
+2002-07-18  Graham Asher  <graham.asher@btinternet.com>
+
+       Added types and structures to support incremental typeface loading.
+       The FT_Incremental_Interface structure, defined in freetype.h, is
+       designed to be passed to FT_Open_Face to provide callback functions
+       to obtain glyph recipes and metrics, for fonts like those passed
+       from PostScript that do not necessarily provide all, or any, glyph
+       information, when first opened.
+
+       * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_INCREMENTAL):
+       New configuration macro to enable incremental face loading.  By
+       default it is not defined.
+
+       * include/freetype/freetype.h (FT_Basic_Glyph_Metrics,
+       FT_Get_Glyph_Data_Func, FT_Get_Glyph_Metrics_Func,
+       FT_Incremental_Interface_Funcs, FT_Incremental_Interface)
+       [FT_CONFIG_OPTION_INCREMENTAL]: New.
+       (FT_Open_Args, FT_FaceRec) [FT_CONFIG_OPTION_INCREMENTAL]: New field
+       `incremental_interface'.
+       (FT_Open_Flags) [FT_CONFIG_OPTION_INCREMENTAL]: New enum
+       `ft_open_incremental'.
+
+       * include/freetype/fttypes.h: Include FT_CONFIG_CONFIG_H.
+       (FT_Data): New structure to represent binary data.
+
+       * src/base/ftobjs.c (open_face) [FT_CONFIG_OPTION_INCREMENTAL]:
+       Add parameter for incremental loading.
+       (FT_Open_Face) [FT_CONFIG_OPTION_INCREMENTAL]: Use incremental
+       interface.
+
+       * src/truetype/ttgload.c (load_truetype_glyph)
+       [FT_CONFIG_OPTION_INCREMENTAL]: Added the incremental loading system
+       for the TrueType driver.
+       (compute_glyph_metrics): Return FT_Error.
+       [FT_CONFIG_OPTION_INCREMENTAL]: Check for overriding metrics.
+       (TT_Load_Glyph) [FT_CONFIG_OPTION_INCREMENTAL]: Don't look for
+       the glyph table while handling an incremental font.
+       Get glyph offset.
+
+       * src/truetype/ttobjs.c (TT_Face_Init)
+       [FT_CONFIG_OPTION_INCOREMENTAL]: Added the incremental loading
+       system for the TrueType driver.
+
+       * src/cid/cidgload.c (cid_load_glyph)
+       [FT_CONFIG_OPTION_INCREMENTAL]: Added the incremental loading system
+       for the CID driver.
+
+       * src/sfnt/sfobjs.c (SFNT_Load_Face) [FT_CONFIG_OPTION_INCREMENTAL]:
+       Changes to support incremental Type 42 fonts: Assume a font has
+       glyphs if it has an incremental interface object.
+
+       * src/type1/t1gload.c (T1_Parse_Glyph): Renamed to...
+       (T1_Parse_Glyph_And_Get_Char_String): This.
+       [FT_CONFIG_OPTION_INCREMENTAL]: Added support for incrementally
+       loaded Type 1 faces.
+       (T1_Parse_Glyph): New function.
+       (T1_Load_Glyph): Updated.
+
+2002-07-17  David Turner  <david@freetype.org>
+
+       Cleaning up the cache sub-system code; linear hashing is now the
+       default.
+
+       * include/freetype/cache/ftccache.h, src/cache/ftccache.i,
+       src/cache/ftccache.c [!FTC_CACHE_USE_LINEAR_HASHING]: Removed.
+       (FTC_CACHE_USE_LINEAR_HASHING: Removed also.
+
+       FT_CONFIG_OPTION_USE_CMAPS is now the default.
+
+       * include/freetype/internal/ftdriver.h (FT_Driver_ClassRec): Remove
+       `get_char_index' and `get_next_char'.
+
+       * include/freetype/config/ftoption.h,
+       include/freetype/internal/tttypes.h, src/base/ftobjs.c,
+       src/bdf/bdfdrivr.c, src/cff/cffobjs.c, src/pcf/pcfdrivr.c,
+       src/pfr/pfrdrivr.c, src/sfnt/sfobjs.c, src/sfnt/ttcmap0.c,
+       src/sfnt/ttcmap0.h, src/sfnt/ttload.c, src/type1/t1objs.c,
+       src/type42/t42objs.c, src/winfonts/winfnt.c
+       [!FT_CONFIG_OPTION_USE_CMAPS]: Removed.  The new cmap code is now
+       the default.
+
+       * src/type42/t42objs.c (T42_CMap_CharIndex, T42_CMap_CharNext):
+       Removed.
+       * src/type42/t42objs.h: Updated.
+
+       * src/cid/cidriver.c (Cid_Get_Char_Index, Cid_Get_Next_Char):
+       Removed.
+       (t1_cid_driver_class): Updated.
+       * src/truetype/ttdriver.c (tt_driver_class): Updated.
+       * src/type1/t1driver.c (Get_Char_Index, Get_Next_Char): Removed
+       (t1_driver_class): Updated.
+       * src/type42/t42drivr.c (t42_driver_class): Updated.
+
+       * src/base/ftobjs.c (open_face): Select Unicode cmap by default.
+
+       * src/sfnt/ttload.c (TT_Load_SFNT_Header): Fixed a recent bug that
+       prevented OpenType fonts to be recognized by FreeType.
+
+2002-07-11  David Turner  <david@freetype.org>
+
+       Changing the SFNT loader to check for SFNT-based font files
+       differently.  We now ignore the range `helper' fields and check the
+       `head' table's magic number instead.
+
+       * include/freetype/internal/tttypes.h (SFNT_HeaderRec): Add `offset'
+       field.
+
+       * src/sfnt/ttload.c (sfnt_dir_check): New function.
+       (TT_Load_SFNT_HeaderRec): Renamed to...
+       (TT_Load_SFNT_Header): This.
+       Implement new functionality.
+       * src/sfnt/ttload.h: Updated.
+       * src/sfnt/sfdriver.c (sfnt_interface): Updated.
+
+       * src/base/ftobject.c, src/base/fthash.c: Updated object sub-system
+       and dynamic hash table implementation (still experimental, don't
+       use).
+       * include/freetype/internal/fthash.h: Updated.
+       * include/freetype/internal/ftobjs.h (FT_LibraryRec): New member
+       `meta_class'.
+
+       Fixing a bug in the Type 1 loader that prevented valid font bounding
+       boxes to be loaded from multiple master fonts.
+
+       * include/freetype/t1tables.h (PS_BlendRec): Add `bboxes' field.
+
+       * include/freetype/internal/psaux.h (T1_FieldType): Add
+       `T1_FIELD_TYPE_BBOX'.
+       (T1_FieldLocation): Add `T1_FIELD_LOCATION_BBOX'.
+       (T1_FIELD_BBOX): New macro.
+
+       * src/psaux/psobjs.c (PS_Parser_LoadField): Handle T1_FIELD_TYPE_BBOX.
+       * src/type1/t1load.c (t1_allocate_blend): Create blend->bboxes.
+       (T1_Done_Blend): Free blend->bboxes.
+       (t1_load_keyword): Handle T1_FIELD_LOCATION_BBOX.
+       (parse_font_bbox): Commented out.
+       (t1_keywords): Comment out `parse_font_bbox'.
+       * src/type1/t1tokens.h: Define `FontBBox' field.
+
+2002-07-10  David Turner  <david@freetype.org>
+
+       * src/cff/cffobjs.c: Small fix to select the Unicode charmap by
+       default when needed.
+       Small fix to allow OpenType fonts to support Adobe charmaps when
+       needed.
+
+       * src/cff/cffcmap.c, src/cff/cffcmap.h: New files to support
+       charmaps for CFF fonts.
+
+       * src/cff/cff.c, src/cff/Jamfile, src/cff/rules.mk: Updated.
+
+       * include/freetype/internal/cfftypes.h (CFF_EncodingRec): Use
+       fixed-length arrays for `sids' and `codes'.  Add `count' member.
+       (CFF_FontRec): Add `psnames' member.
+
+       * src/cff/cffdrivr.c, src/cff/cffload.c, src/cff/cffload.h,
+       src/cff/cffobjs.c, src/cff/cffobjs.h, src/cff/cffparse.c,
+       src/cffparse.h, src/cff/cffgload.c, src/cff/cffgload.h: Adding
+       support for CFF charmaps, reformatting the sources, and removing
+       some bugs in the Encoding and Charset loaders.
+       Many fonts renamed to use lowercase only:
+
+         CFF_Builder_Init -> cff_builder_init
+         CFF_Builder_Done -> cff_builder_done
+         CFF_Init_Decoder -> cff_decoder_init
+         CFF_Parse_CharStrings -> cff_decoder_parse_charstrings
+         CFF_Load_Glyph -> cff_slot_load
+         CFF_Init_Decoder -> cff_decoder_init
+         CFF_Prepare_Decoder -> cff_decoder_prepare
+         CFF_Get_Standard_Encoding -> cff_get_standard_encoding
+         CFF_Access_Element -> cff_index_access_element
+         CFF_Forget_Element -> cff_index_forget_element
+         CFF_Get_Name -> cff_index_get_name
+         CFF_Get_String -> cff_index_get_sid_string
+         CFF_Get_FD -> cff_fd_select_get
+         CFF_Done_Charset -> cff_charset_done
+         CFF_Load_Charset -> cff_charset_load
+         CFF_Done_Encoding -> cff_encoding_done
+         CFF_Load_Encoding -> cff_encoding_load
+         CFF_Done_SubFont -> cff_subfont_done
+         CFF_Load_Font -> cff_font_load
+         CFF_Done_Font -> cff_font_done
+         CFF_Size_Get_Global_Funcs -> cff_size_get_global_funcs
+         CFF_Size_Done -> cff_size_done
+         CFF_Size_Init -> cff_size_init
+         CFF_Size_Reset -> cff_size_reset
+         CFF_GlyphSlot_Done -> cff_slot_done
+         CFF_GlyphSlot_Init -> cff_slot_init
+         CFF_StrCopy -> cff_strcpy
+         CFF_Face_Init -> cff_face_init
+         CFF_Face_Done -> cff_face_done
+         CFF_Driver_Init -> cff_driver_init
+         CFF_Driver_Done -> cff_driver_done
+         CFF_Parser_Init -> cff_parser_init
+         CFF_Parser_Run -> cff_parser_run
+
+         add_point -> cff_builder_add_point
+         add_point1 -> cff_builder_add_point1
+         add_contour -> cff_builder_add_contour
+         close_contour -> cff_builder_close_contour
+         cff_explicit_index -> cff_index_get_pointers
+
+2002-07-09  Owen Taylor  <owen@redhat.com>
+
+       * src/pshinter/pshglob.c (psh_globals_new): Fixed a bug that
+       prevented the hinter from using correct standard width and height
+       values, resulting in hinting bugs with certain fonts (e.g. Utopia).
+
+2002-07-07  David Turner  <david@freetype.org>
+
+       * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Added code to return
+       successfully when the function is called with a bitmap glyph (the
+       previous code simply returned with an error).
+
+       * docs/DEBUG.TXT: Adding debugging support documentation.
+
+       * src/base/ftdebug.c (ft_debug_init), builds/win32/ftdebug.c
+       (ft_debug_init), builds/amiga/src/ftdebug.c (ft_debug_init): Changed
+       the syntax of the FT2_DEBUG environment variable used to control
+       debugging output (i.e. logging and error messages).  It must now
+       look like:
+
+         any:6 memory:4 io:3   or
+         any:6,memory:4,io:3   or
+         any:6;memory:4;io:3
+
+2002-07-07  Owen Taylor  <owen@redhat.com>
+
+       * src/pshinter/pshglob.c (psh_blues_snap_stem): Adding support for
+       blue fuzz.
+       * src/pshinter/pshglob.h (PSH_BluesRec): Add `blue_fuzz' field.
+       * src/type1/t1load.c (T1_Open_Face): Initialize `blue_fuzz'.
+
+       Adding support for hinter-specific bit flags, and the new
+       FT_Set_Hint_Flags high-level API.
+
+       * include/freetype/freetype.h (FT_Set_Hint_Flags): New function.
+       (FT_HINT_NO_INTEGER_STEM, FT_HINT_NO_HSTEM_ALIGN,
+       FT_HINT_NO_VSTEM_ALIGN): New macros.
+
+       * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Add
+       `hint_flags' member.
+
+       * src/base/ftobjs.c (FT_Set_Hint_Flags): New function.
+
+       * include/freetype/internal/psaux.h (T1_DecoderRec): Add `hint_flags'
+       member.
+
+       * include/freetype/internal/pshints.h (T1_Hints_ApplyFunc,
+       T2_Hints_ApplyFunc): Add parameter to pass hint flags.
+
+       * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings,
+       T1_Decoder_Init): Use decoder->hint_flags.
+       * src/cff/cffgload.h (CFF_Builder): Add `hint_flags' field.
+       * src/cff/cffgload.c (CFF_Builder_Init): Set builder->hint_flags.
+       (CFF_Parse_CharStrings): Updated.
+       * src/pshinter/pshalgo1.c (ps1_hints_apply): Add parameter to handle
+       hint flags (unused).
+       * src/pshinter/pshalgo1.h: Updated.
+       * src/pshinter/pshalgo2.c (ps2_hints_apply): Add parameter to handle
+       hint flags (unused).
+       * src/pshinter/pshalgo2.h: Updated.
+       * src/pshinter/pshalgo3.c (ps3_hints_apply): Add parameter to handle
+       hint flags.
+       * src/pshinter/pshalgo3.h: Updated.
+
+2002-07-04  David Turner  <david@freetype.org>
+
+       * src/pfr/pfrobjs.c (pfr_slot_load): Fixed a small bug that returned
+       incorrect advances when the outline resolution was different from
+       the metrics resolution.
+
+       * src/autohint/ahhint.c: Removing compiler warnings.
+
+       * src/autohint/ahglyph.c: s/FT_MEM_SET/FT_ZERO/ where appropriate.
+       (ah_outline_link_segments): Slight improvements to the serif
+       detection code.  More work is needed though.
+
+2002-07-03  David Turner  <david@freetype.org>
+
+       Small improvements to the automatic hinter.  Uneven stem-widths have
+       now disappeared and everything looks much better, even if there are
+       still issues with serifed fonts.
+
+       * src/autohint/ahtypes.h (AH_Globals): Added `stds' array.
+       * src/autohint/ahhint.c (OPTIM_STEM_SNAP): New #define.
+       (ah_snap_width): Commented out.
+       (ah_align_linked_edge): Renamed to...
+       (ah_compute_stem_width): This.
+       Don't allow uneven stem-widths.
+       (ah_align_linked_edge): New function.
+       (ah_align_serifed_edge): Don't strengthen serifs.
+       (ah_hint_edges_3, ah_hinter_scale_globals): Updated.
+
+2002-07-03  Owen Taylor  <owen@redhat.com>
+
+       Adding new algorithm based on Owen Taylor's recent work.
+
+       * src/pshinter/pshalgo3.c, src/pshinter/pshalgo3.h: New files.
+       * src/pshinter/pshalgo.h: Updated.
+       Use pshalgo3 by default.
+       * src/pshinter/pshinter.c: Include pshalgo3.c.
+
+       * src/pshinter/Jamfile, src/pshinter/rules.mk: Updated.
+
+2002-07-01  Owen Taylor  <owen@redhat.com>
+
+       * src/pshinter/pshalgo2.c (psh2_glyph_find_strong_points): Fix a bug
+       where, if a glyph has more than hint mask, the second mask gets
+       applied to points that should have been covered by the first mask.
+
+2002-07-01  Keith Packard  <keithp@keithp.com>
+
+       * src/sfnt/ttcmap0.c (tt_cmap8_char_next, tt_cmap12_char_next):
+       Fixing the cmap 8 and 12 parsing routines.
+
+2002-07-01  David Turner  <david@freetype.org>
+
+       * src/base/ftsynth.c: Include FT_TRIGONOMETRY_H.
+       (FT_Outline_Embolden): Renamed to...
+       (FT_GlyphSlot_Embolden): This.
+       Updated to new trigonometric functions.
+       (FT_Outline_Oblique): Renamed to...
+       (FT_GlyphSlot_Oblique): This.
+       (ft_norm): Removed.
+       * include/freetype/ftsynth.h: Updated.
+
+2002-06-26  David Turner  <david@freetype.org>
+
+       * include/freetype/internal/ftobject.h: Updating the object
+       sub-system definitions (still experimental).
+
+       * src/base/fthash.c (ft_hash_remove): Fixing a small reallocation
+       bug.
+
+       * src/base/fttrigon.c (FT_Vector_From_Polar, FT_Angle_Diff): New
+       functions.
+       * include/freetype/fttrigon.h: Updated.
+
+
+       Adding path stroker component (work in progress).
+
+       * include/freetype/ftstroker.h, src/base/ftstroker.c: New files.
+       * src/base/Jamfile: Updated.
+
+       * include/freetype/config/ftheader.h (FT_STROKER_H): New macro.
+
+
+       * src/truetype/ttgload.c (TT_Load_Composite_Glyph),
+       src/base/ftoutln.c (FT_Vector_Transform): Fixed Werner's latest fix.
+       FT_Vector_Transform wasn't buggy, the TrueType composite loader was.
+
+2002-06-24  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 3.
+
+2002-06-21  David Turner  <david@freetype.org>
+
+
+       * Version 2.1.2 released.
+       =========================
+
+
+2002-06-21  Roberto Alameda  <ojancano@geekmail.de>.
+
+       * include/freetype/internal/t42types.h (T42_Font): Removed since
+       it is already in t42objs.h.
+       (T42_Face): Use T1_FontRec.
+
+       * src/base/fttype1.c (FT_Get_PS_Font_Info): Updated.
+       (FT_Has_PS_Glyph_Names): Check for type42 driver name also.
+       * src/type42/t42objs.h: Include FT_INTERNAL_TYPE42_TYPES_H.
+       (T42_Face): Removed since it is already in t42types.h.
+
+2002-06-21  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * src/pfrgload.c (pfr_glyph_load_compound): Fix loading of composite
+       glyphs.
+
+2002-06-21  Sven Neumann  <sven@convergence.de>
+
+       * src/prf/pfrtypes.h (PFR_KernPair): New structure.
+       (PFR_PhyFont): Use it.
+       (PFR_KernFlags): New enumeration.
+       * src/pfr/pfrload.c (pfr_extra_item_load_kerning_pairs): New
+       function.
+       (pfr_phy_font_extra_items): Use it.
+       (pfr_phy_font_done): Updated.
+       * src/pfr/pfrobjs.c (pfr_face_init): Set kerning flag conditionally.
+       (pfr_face_get_kerning): New function.
+       * src/pfr/pfrobjs.h: Updated.
+       * src/pfr/pfrdrivr.c (pfr_driver_class): Updated.
+
+2002-06-21  David Turner  <david@freetype.org>
+
+       * README, docs/CHANGES: Preparing the 2.1.2 release.
+
+2002-06-19  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * src/base/fttype1.c: Include FT_INTERNAL_TYPE42_TYPES_H.
+       (t1_face_check_cast): Removed.
+       (FT_Get_PS_Font_Info): Make it work with CID and Type 42 drivers
+       also.
+
+2002-06-19  Sebastien BARRE  <http://barre.nom.fr/contact.html#email>
+
+       * src/type42/t42parse.c (t42_parse_sfnts): Fix compiler warning.
+
+2002-06-19  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftoutln.c (FT_Vector_Transform): Fix serious typo
+       (xy <-> yx).
+       * src/truetype/ttgload.c (load_truetype_glyph): Replace `|' with
+       `||' to make code easier to read.
+
+2002-06-18  Roberto Alameda  <ojancano@geekmail.de>.
+
+       * src/type42/t42objs.c (t42_check_size_change): Removed.
+       (T42_Size_SetChars, T42_Size_SetPixels): Use FT_Activate_Size
+       instead.
+       (T42_GlyphSlot_Load): Remove call to t42_check_size_change.
+
+2002-06-18  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * src/psaux/t1cmap.c (t1_cmap_custom_char_index,
+       t1_cmap_custom_char_next): Fix index computation -- indices start
+       with 0 and not with cmap->first.
+
+       Provide default charmaps.
+
+       * src/bdf/bdfdrivr.c (BDF_Face_Init), src/pcf/pcfdriver.c
+       (PCF_Face_Init), src/pfr/pfrobjs.c (pfr_face_init),
+       src/type1/t1objs (T1_Face_Init), src/winfonts/winfnt.c
+       (FNT_Face_Init): Implement it.
+
+2002-06-17  Sven Neumann  <sven@gimp.org>
+
+       * src/pfr/pfrobjs.c (pfr_face_init): Fix typo.
+
+2002-06-16  Leonard Rosenthol  <leonardr@lazerware.com>
+
+       Updated Win32/VC++ projects to include the new PFR driver.
+
+       * builds/win32/visualc/freetype.dsp: Updated.
+
+2002-06-16  Anthony Fok  <fok@debian.org>
+
+       Install freetype2.m4.
+
+       * builds/unix/install.mk (install, uninstall): Handle it.
+
+2002-06-16  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       Same fix for PFR driver.
+
+       * src/pfr/pfrcmap.c (pfr_cmap_char_index, pfr_cmap_char_next):
+       Increase return value by 1.
+       * src/pfr/pfrobjs.c (pfr_slot_load): Decrease index by 1.
+
+2002-06-15  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       Fix glyph indices to make index zero always the undefined glyph.
+
+       * src/bdf/bdfdrivr.c (bdf_cmap_init): Don't decrease
+       cmap->num_encodings.
+       (bdf_cmap_char_index, bdf_cmap_char_next, BDF_Get_Char_Index):
+       Increase result by 1 for normal cases.
+       (BDF_Glyph_Load): Decrease index by 1.
+
+       * src/pcf/pcfdriver.c (pcf_cmap_char_index, pcf_cmap_char_next,
+       PCF_Char_Get_Index): Increase result by 1 for normal cases.
+       (PCF_Glyph_Load): Decrease index by 1.
+       * src/pcf/pcfread.c (pcf_get_encodings): Don't decrease j for
+       allocating `encoding'.
+
+       * src/base/ftobjs.c (FT_Load_Glyph, FT_Get_Glyph_Name): Fix
+       bounding tests.
+
+2002-06-14  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       Add new cmap support to BDF driver.
+
+       * src/bdf/bdfdrivr.c (BDF_CMapRec) [FT_CONFIG_OPTION_USE_CMAPS]:
+       New structure.
+       (bdf_cmap_init, bdf_cmap_done, bdf_cmap_char_index,
+       bdf_cmap_char_next) [FT_CONFIG_OPTION_USE_CMAPS]: New functions.
+       (BDF_Get_Char_Index) [!FT_CONFIG_OPTION_USE_CMAPS]: Use only
+       conditionally.
+       (BDF_Face_Init): Handle `AVERAGE_WIDTH' and `POINT_SIZE' keywords.
+       Implement new cmap handling.
+       (bdf_driver_class): Updated.
+
+2002-06-14  Werner Lemberg  <wl@gnu.org>
+
+       * Makefile, configure, */*.mk, builds/unix/unix-def.in,
+       docs/CHANGES, docs/INSTALL: s/TOP/TOP_DIR/.
+
+2002-06-12  Werner Lemberg  <wl@gnu.org>
+
+       * src/bdf/bdflib.c: s/FT_Short/short/ for consistency.
+
+2002-06-11  David Turner  <david@freetype.org>
+
+       * builds/win32/ftdebug.c: Added a missing #endif.
+
+       * src/sfnt/ttload.c, src/bdf/bdflib.c: Removing compiler warnings.
+
+       Removed the bug in Type 42 driver that prevented un-hinted outlines
+       to be loaded.
+
+       * src/type42/t42objs.c (T42_Face_Init): Call FT_Done_Size.
+       (T42_Size_Init): Call FT_Activate_Size.
+       (t42_check_size_change): New function.
+       (T42_Size_SetChars, T42_Size_SetPixels): Use it.
+       (ft_glyphslot_clear): Replace FT_MEM_SET with FT_ZERO.
+       (T42_GlyphSlot_Load): Use t42_check_size_change.
+       Initialize more fields of `glyph'.
+
+       * builds/win32/visualc/freetype.dsp: Updated.
+
+2002-06-09  David Turner  <david@freetype.org>
+
+
+       * Version 2.1.1 released.
+       =========================
+
+
+2002-06-08  Juliusz Chroboczek  <jch@pps.jussieu.fr>
+
+       * include/freetype/internal/ftobjs.h, src/autohint/ahglyph.c,
+       src/base/ftobjs.c, src/sfnt/ttcmap0.c, src/smooth/ftgrays.c: Don't
+       use `setjmp', `longjmp', and `jmp_buf' but `ft_setjmp', `ft_longjmp',
+       and `ft_jmp_buf'.
+       Removed direct references to <stdio.h> and <setjmp.h> when
+       appropriate, to eventually replace them with a
+       FT_CONFIG_STANDARD_LIBRARY_H.  Useful for the XFree86 Font Server
+       backend based on FT2.
+
+       * src/base/fttype1.c (FT_Has_PS_Glyph_Names): Fix return value.
+
+2002-06-08  David Turner  <david@freetype.org>
+
+       * src/pcf/pcfdriver.c (pcf_cmap_char_next): Fixed a bug that caused
+       the function to return invalid values.
+
+       * src/cache/ftccache.i: Removing a typo that prevented
+       the source's compilation.
+
+       * src/cache/ftccache.c (ftc_node_hash_unlink): Fixed a
+       bug that caused nasty memory overwrites.  The hash table's
+       buckets array wasn't correctly resized when shrunk.
+
+2002-06-08  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * builds/amiga/smakefile, builds/amiga/makefile: Updated.
+
+2002-06-08  Werner Lemberg  <wl@gnu.org>
+
+       * src/cache/ftccache.c (ftc_node_hash_unlink, ftc_node_hash_link)
+       [FTC_CACHE_USE_LINEAR_HASHING]: Fix returned error code.
+       Fix debugging messages.
+       * src/cache/ftccache.i (GEN_CACHE_LOOKUP): Move declaration of
+       `family' and `hash' up to make it compilable with g++.
+
+       * src/type42/t42error.h: New file.
+       * src/type42/t42drivr.c, src/type42/t42objs.c,
+       src/type42/t42parse.c: Use t42 error codes.
+       * src/type42/rules.mk: Updated.
+
+       * src/base/ftnames.c: Include FT_INTERNAL_STREAM_H.
+
+2002-06-08  David Turner  <david@freetype.org>
+
+       * src/cache/ftccmap.c: GEN_CACHE_FAMILY_COMPARE,
+       GEN_CACHE_NODE_COMPARE, GEN_CACHE_LOOKUP) [FTC_CACHE_USE_INLINE]:
+       New macros.
+       (ftc_cmap_cache_lookup) [!FTC_CACHE_USE_INLINE]: Typedef to
+       ftc_cache_lookup.
+       (FTC_CMapCache_Lookup): Updated.
+
+       Adding various experimental optimizations to the cache manager.
+
+       * include/freetype/cache/ftccache.h (FTC_CACHE_USE_INLINE,
+       FTC_CACHE_USE_LINEAR_HASHING): New options.
+       (FTC_CacheRec) [FTC_CACHE_USE_LINEAR_HASHING]: New elements `p',
+       `mask', and `slack'.
+
+       * src/cache/ftccache.c (FTC_HASH_MAX_LOAD, FTC_HASH_MIN_LOAD,
+       FTC_HASH_SUB_LOAD) [FTC_CACHE_USE_LINEAR_HASHING,
+       FTC_HASH_INITIAL_SIZE]: New macros.
+       (ftc_node_mru_link, ftc_node_mru_up): Optimized.
+       (ftc_node_hash_unlink, ftc_node_hash_link)
+       [FTC_CACHE_USE_LINEAR_HASHING]: New variants.
+       (FTC_PRIMES_MIN, FTC_PRIMES_MAX, ftc_primes, ftc_prime_closest,
+       FTC_CACHE_RESIZE_TEST, ftc_cache_resize)
+       [!FTC_CACHE_USE_LINEAR_HASHING]: Define it conditionally.
+       (ftc_cache_init, ftc_cache_clear) [FTC_CACHE_USE_LINEAR_HASHING]:
+       Updated.
+       (ftc_cache_lookup) [FTC_CACHE_USE_LINEAR_HASHING]: Implement it.
+
+       * src/cache/ftccache.i: New file.
+
+       * src/cache/ftcsbits.c (GEN_CACHE_FAMILY_COMPARE,
+       GEN_CACHE_NODE_COMPARE, GEN_CACHE_LOOKUP) [FTC_CACHE_USE_INLINE]:
+       New macros.
+       (ftc_sbit_cache_lookup) [!FTC_CACHE_USE_INLINE]: Typedef to
+       ftc_cache_lookup.
+       (FTC_SBitCache_Lookup): Updated.
+
+       * src/type42/t42parse.c: Removing duplicate function.
+
+2002-06-07  Graham Asher  <graham.asher@btinternet.com>
+
+       * src/base/ftobjs.c (FT_Render_Glyph_Internal): Changed definition
+       from FT_EXPORT_DEF to FT_BASE_DEF.
+
+2002-06-07  David Turner  <david@freetype.org>
+
+       Fixed the bug that prevented the correct display of fonts with
+       `ftview'.
+
+       * src/type42/t42drivr.c: Split into...
+       * src/type42/t42drivr.h, src/type42/t42parse.c,
+       src/type42/t42parse.h, src/type42/t42objs.h, src/type42/t42objs.c,
+       src/type42/type42.c: New files.
+
+       (t42_get_glyph_name, t42_get_ps_name, t42_get_name_index): Use
+       `face->type1'.
+
+       (Get_Interface): Renamed to...
+       (T42_Get_Interface): This.
+       Updated.
+       (T42_Open_Face, T42_Face_Done): Updated.
+       (T42_Face_Init): Add new cmap support.
+       Updated.
+       (T42_Driver_Init, T42_Driver_Done, T42_Size_Init, T42_Size_Done,
+       T42_GlyphSlot_Init, T42_GlyphSlot_Done): Updated.
+       (Get_Char_Index, Get_Next_Char): Renamed to...
+       (T42_CMap_CharIndex, T42_CMap_CharNext): This.
+       Updated.
+       (T42_Char_Size, T42_Pixel_Size): Renamed to...
+       (T42_Size_SetChars, T42_Size_SetPixels): This.
+       (T42_Load_Glyph): Renamed to...
+       (T42_GlyphSlot_Load): This.
+
+       (t42_init_loader, t42_done_loader): Renamed to...
+       (t42_loader_init, t42_loader_done): This.
+       (T42_New_Parser, T42_Finalize_Parser): Renamed to...
+       (t42_parser_init, t42_parser_done): This.
+       (parse_dict): Renamed to...
+       (t42_parse_dict): This.
+       (is_alpha, is_space, hexval): Renamed to...
+       (t42_is_alpha, t42_is_space, t42_hexval): This.
+       (parse_font_name, parse_font_bbox, parse_font_matrix,
+       parse_encoding, parse_sfnts, parse_charstrings, parse_dict):
+       Renamed to...
+       (t42_parse_font_name, t42_parse_font_bbox, t42_parse_font_matrix,
+       t42_parse_encoding, t42_parse_sfnts, t42_parse_charstrings,
+       t42_parse_dict): This.
+       Updated.
+
+       (t42_keywords): Updated.
+
+       * src/type42/Jamfile, src/type42/descrip.mms: Updated.
+
+2002-06-03  Werner Lemberg  <wl@gnu.org>
+
+       Add 8bpp support to BDF driver.
+
+       * src/bdf/bdflib.c (_bdf_parse_start): Handle 8bpp.
+       * src/bdf/bdfdrivr.c (BDF_Glyph_Load): Ditto.
+       * src/bdf/README: Updated.
+
+2002-06-02  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * src/pfr/pfrload.c (pfr_phy_font_done): Free `blue_values' array.
+
+2002-05-29  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * src/bdf/bdflib.c (_bdf_readstream): Allocate `buf' dynamically.
+       (_bdf_parse_glyphs): Use correct size for allocating
+       `font->unencoded'.
+       (bdf_load_font): Free array conditionally.
+       Return proper error code in case of failure.
+       * src/bdf/bdfdrivr.c (BDF_Face_Init): Make it more robust against
+       unusual fonts.
+
+2002-05-29  Werner Lemberg  <wl@gnu.org>
+
+       * src/bdf/descrip.mms, src/type42/descrip.mms: New files.
+       * descrip.mms (all): Updated.
+
+       * src/bdf/bdflib.c (_bdf_parse_glyphs): Fix typo which prevented
+       compilation.
+       * src/pshglob.c (psh_blues_scale_zones): Fix compiler warning.
+
+2002-05-28  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * builds/amiga/makefile, builds/amiga/smakefile,
+       amiga/include/freetype/config/ftmodule.h: Updated to include
+       support for BDF and Type42 drivers.
+
+       * docs/modules.txt: Updated.
+
+2005-05-28  David Turner  <david@freetype.org>
+
+       * docs/CHANGES: Updating file for next release (2.1.1).
+
+       * src/bdf/bdflib.c: Removing compiler warnings.
+
+       * include/freetype/ftxf86.h, src/base/ftxf86.c: New files.
+       They provide a new API (FT_Get_X11_Font_Format) to retrieve an
+       X11-compatible string describing the font format of a given face.
+       This was put in a new optional base source file, corresponding to a
+       new public header (named FT_XFREE86_H since this function should
+       only be used within the XFree86 font server IMO).
+
+       * include/freetype/config/ftheader.h (FT_XFREE86_H): New macro (not
+       documented yet).
+
+       * src/base/fttype1.c: New file, providing two new API functions
+       (FT_Get_PS_Font_Info and FT_Has_PS_Glyph_Names).
+       * include/freetype/t1tables.h: Updated.
+
+       * src/base/Jamfile, src/base/rules.mk, src/base/descrip.mms:
+       Updating build control files for the new files `ftxf86.c' and
+       `fttype1.c' in src/base.
+
+       * src/pshinter/pshglob.c (psh_blues_scale_zones): Fixed a bug that
+       prevented family blue zones substitution from hapenning correctly.
+
+       * include/freetype/ftbdf.h FT_Get_BDF_Charset_ID): Adding
+       documentation comment.
+
+2002-05-28  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftnames.c (FT_Get_Sfnt_Name): Don't use FT_STREAM_READ_AT
+       but FT_STREAM_READ.
+       Declare `stream' variable.
+
+       * src/bdf/bdflib.c (_bdf_parse_glyphs): Replace floating point math
+       with calls to `FT_MulDiv'.
+
+2002-05-28  David Turner  <david@freetype.org>
+
+       Fixing the SFNT name table loader to support various buggy fonts.
+       It now ignores empty name entries, entries with invalid pointer
+       Offsets and certain fonts containing tables with broken
+       `storageOffset' fields.
+
+       Name strings are now loaded on demand, which reduces the memory
+       requirements for a given FT_Face tremendously (for example, the name
+       table of Arial.ttf is about 10Kb and contains 70 names).
+
+       This is a temporary fix.  The whole name table loader and interface
+       will be rewritten in a much more cleanly way shortly, once CSEH have
+       been introduced in the sources.
+
+       * include/freetype/internal/tttypes.h (TT_NameEntryRec): Change
+       type of `stringOffset' to FT_ULong.
+       (TT_NameTableRec): Change type of `numNameRecords' and
+       `storageOffset' to FT_UInt.
+       Replace `storage' with `stream'.
+       * src/base/ftnames.c (FT_Get_Sfnt_Name): Load name on demand.
+       * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Ditto.
+       Make code more robust.
+       * src/sfnt/sfobjs.c (TT_NameEntry_ConvertFunc): New typedef.
+       (tt_face_get_name): Use it.
+       Make code more robust.
+       * src/sfnt/ttload.c (TT_Load_Names): Use `static' for arrays.
+       Handle invalid `storageOffset' data better.
+       Set length fields to zero for invalid or ignored data.
+       Remove code within FT_DEBUG_LEVEL_TRACE.
+       (TT_Free_Names): Updated.
+
+2002-05-24  Tim Mooney  <enchanter@users.sourceforge.net>
+
+       * builds/unix/ft-munmap.m4: New file, extracted FT_MUNMAP_DECL and
+       FT_MUNMAP_PARAM from aclocal.m4 into here, so aclocal.m4 can be
+       rebuilt from sources.  Set macro serial to 1, and use third argument
+       to AC_DEFINE for our two custom symbols, so ftconfig.in could one day
+       be rebuilt with autoheader (not recommended now, ftconfig.in is a
+       custom source file)
+
+2002-05-22  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/config/ftheader.h (FT_BEZIER_H): Removed.
+       (FT_BDF_H): New macro for accessing `ftbdf.h'.
+
+       * src/type42/t42drivr.c (hexval): Fix typo.
+
+2002-05-21  Martin Muskens  <mmuskens@aurelon.com>
+
+       * src/psaux/psobjs.c (T1Radix): New function.
+       (t1_toint): Use it to handle numbers in radix format.
+
+       * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Add dummy
+       for undocumented, obsolete opcode 15.
+
+2002-05-21  David Turner  <david@freetype.org>
+
+       * src/bdf/bdflib.c: Removed compiler warning, and changed all tables
+       to the `static const' storage specifier (instead of simply
+       `static').
+
+       * src/type42/t42drivr.c (hexval): Use more efficient code.
+       Removing compiler warnings.
+       * src/bdf/bdfdrivr.c: Removing compiler warnings.
+
+       * include/freetype/internal/ftbdf.h, src/base/ftbdf.c,
+       src/base/descrip.mms, src/base/Jamfile, src/base/rules.mk
+       (FT_Get_BDF_Charset_ID): New API to retrieve BDF-specific strings
+       from a face.  This is much cleaner than accessing the internal types
+       `BDF_Public_Face' defined in FT_INTERNAL_BDF_TYPES_H.
+
+2002-05-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/bdf/README: Mention Microsoft's SBIT tool.
+
+       * src/cff/cffdrivr.c, src/cid/cidriver.c, src/pcf/pcfdriver.c,
+       src/truetype/ttdriver.c, src/type1/t1driver.c,
+       src/winfonts/winfnt.c, src/type42/t42drivr.c, src/bdf/bdfdrivr.c
+       [FT_CONFIG_OPTION_DYNAMIC_DRIVERS]: Completely removed.  It has
+       been never used.
+
+2002-05-21  Roberto Alameda  <ojancano@geekmail.de>.
+
+       * src/type42/t42drivr.c: s/T42_ENCODING_TYPE_/T1_ENCODING_TYPE_/.
+       (parse_font_matrix): Remove unnecessary code.
+       (parse_sfnts): Initialize some variables.
+       (t42_driver_class) [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Use
+       ft_module_driver_has_hinter conditionally.
+       Moved some type 42 specific structure definitions to...
+       * include/freetype/internal/t42types.h: New file.
+       * include/freetype/internal/internal.h (FT_INTERNAL_T42_TYPES_H):
+       New macro.
+
+2002-05-20  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/cache/ftcsbits.h (FTC_SBit): Added a new field
+       `num_grays' for specifying the number of used gray levels.
+       * src/cache/ftcsbits.c (ftc_sbit_node_load): Initialize it.
+
+2002-05-19  Werner Lemberg  <wl@gnu.org>
+
+       Adding a driver for BDF fonts written by Francesco Zappa Nardelli
+       <Francesco.Zappa.Nardelli@ens.fr>.  Heavily modified by me to
+       better adapt it to FreeType, removing unneeded stuff.  Additionally,
+       it now supports Mark Leisher's BDF extension for anti-aliased
+       bitmap glyphs with 2 and 4 bpp.
+
+       * src/bdf/*: New driver.
+       * include/freetype/internal/bdftypes.h: New file.
+       * include/freetype/internal/fttrace.h: Added BDF driver components.
+       * include/freetype/fterrdef.h: Added error codes for BDF driver.
+       * include/freetype/config/ftmodule.h, src/Jamfile: Updated.
+       * include/freetype/internal/internal.h (FT_INTERNAL_BDF_TYPES_H):
+       New macro.
+
+       * include/freetype/config/ftstdlib.h (ft_sprintf): New alias for
+       sprintf.
+
+2002-05-18  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/fttrace.h: Added Type 42 driver
+       component.
+       * src/type42/t42drivr.c: Use it.
+
+       * include/freetype/internal/internal.h (FT_INTERNAL_PCF_TYPES_H):
+       New macro.
+
+2002-05-17  Werner Lemberg  <wl@gnu.org>
+
+       * src/type42/Jamfile: New file.
+
+2002-05-14  Werner Lemberg  <wl@gnu.org>
+
+       Adding a driver for Type42 fonts written by Roberto Alameda
+       <ojancano@geekmail.de>.
+
+       * src/type42/*: New driver.
+       * include/freetype/config/ftmodule.h, src/Jamfile: Updated.
+       * include/freetype/config/ftstdlib.h (ft_xdigit, ft_memcmp,
+       ft_atoi): New aliases for xdigit, memcmp, and atoi, respectively.
+
+2002-05-12  Owen Taylor  <otaylor@redhat.com>
+
+       * src/sfnt/ttload.c (TT_LookUp_Table): Protect against tables
+       with a zero length value.
+
+2002-05-12  Michael Pfeiffer  <michael.pfeiffer@utanet.at>
+
+       * builds/beos/beos.mk: Include `link-std.mk'.
+
+2002-05-12  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.h (T1_Loader): Renamed to...
+       (T1_LoaderRec): This.
+       (T1_Loader): Now pointer to T1_LoaderRec.
+       * src/type1/t1load.c: Updated.
+
+       * include/freetype/internal/t1types.h, src/type1/t1load.c,
+       src/type1/t1objs.c:
+       s/T1_ENCODING_TYPE_EXPORT/T1_ENCODING_TYPE_EXPERT/.
+
+2002-05-06  Werner Lemberg  <wl@gnu.org>
+
+       * README: Add a note regarding libttf vs. libfreetype.
+
+2002-05-05  Werner Lemberg  <wl@gnu.org>
+
+       FreeType 2 can now be built in an external directory with the
+       configure script also.
+
+       * builds/freetype.mk (INCLUDES): Add `OBJ_DIR'.
+
+       * builds/unix/detect.mk (have_mk): New variable to test for
+       external build.
+       (unix-def.mk): Defined according to value of `have_mk'.
+       * builds/unix/unix.mk (have_mk): New variable to test for
+       external build.
+       Select include paths for unix-def.mk and unix-cc.mk according
+       to value of `have_mk'.
+       * builds/unix/unix-def.in (OBJ_BUILD): New variable.
+       (DISTCLEAN): Use it.
+       * builds/unix/unix-cc.in (LIBTOOL): Define default value only
+       if not yet defined.
+       * builds/unix/install.mk (install): Use `OBJ_BUILD' for installing
+       freetype-config.
+
+       * configure: Don't depend on bash features.
+       (ft2_dir, abs_curr_dir, abs_ft2_dir): New variables (code
+       partially taken from Autoconf).
+       Build a dummy Makefile if not building in source tree.
+
+       * docs/INSTALL: Document it.
+
+2002-05-04  David Turner  <david@freetype.org>
+
+       * src/truetype/ttgload.c (TT_Load_Glyph): Finally fixing the last
+       bug that prevented FreeType 2.x and FreeType 1.x to produce
+       bit-by-bit identical monochrome glyph bitmaps with native TrueType
+       hinting.  The culprit was a single-bit flag that wasn't set
+       correctly by the TrueType glyph loader.
+
+       * src/otlayout/otlayout.h, src/otlayout/otlbase.c,
+       src/otlayout/otlbase.h, src/otlayout/otlconf.h,
+       src/otlayout/otlgdef.c, src/otlayout/otlgdef.h,
+       src/otlayout/otlgpos.c, src/otlayout/otlgpos.h,
+       src/otlayout/otlgsub.c, src/otlayout/otlgsub.h,
+       src/otlayout/otljstf.c, src/otlayout/otljstf.h,
+       src/otlayout/otltable.c, src/otlayout/otltable.h,
+       src/otlayout/otltags.h: New OpenType Layout source files.  The
+       module is still incomplete.
+
+2002-05-02  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttcmap0.c (tt_cmap4_char_index): Fix serious typo
+       (0xFFFU -> 0xFFFFU).
+
+2002-05-01  Werner Lemberg  <wl@gnu.org>
+
+       * docs/INSTALL: Fix URL of makepp.
+
+2002-05-01  David Turner  <david@freetype.org>
+
+       * src/sfnt/sfobjs.c (tt_face_get_name): Fixing a bug that caused
+       FreeType to crash when certain broken fonts (e.g. `hya6gb.ttf')
+       were opened.
+
+       * src/sfnt/ttload.c (TT_Load_Names): Applied a small work-around to
+       manage fonts containing a broken name table (e.g. `hya6gb.ttf').
+
+       * src/sfnt/ttcmap0.c (tt_cmap4_validate): Fixed over-restrictive
+       validation test.  The charmap validator now accepts overlapping
+       ranges in format 4 charmaps.
+
+       * src/sfnt/ttcmap0.c (tt_cmap4_char_index): Switched to a binary
+       search algorithm.  Certain fonts contain more than 170 distinct
+       segments!
+
+       * include/freetype/config/ftstdlib.h: Adding an alias for the `exit'
+       function.  This will be used in the near future to panic in case of
+       unexpected exception (which shouldn't happen in theory).
+
+       * include/freetype/internal/fthash.h, src/base/fthash.c: New files.
+       This is generic implementation of dynamic hash tables using a linear
+       algorithm (to get rid of `stalls' during resizes).  In the future
+       this will be used in at least three parts of the library: the cache
+       sub-system, the object sub-system, and the memory debugger.
+
+       * src/base/Jamfile: Updated.
+
+       * include/freetype/internal/internal.h (FT_INTERNAL_HASH_H,
+       FT_INTERNAL_OBJECT_H): New macros.
+
+       * include/freetype/internal/ftcore.h: New file to group all new
+       definitions related to exception handling and memory management.  It
+       is very likely that this file will disappear or be renamed in the
+       future.
+
+       * include/freetype/internal/ftobject.h, include/freetype/ftsysmem.h:
+       Adding comments to better explain the object sub-system as well as
+       the new memory manager interface.
+
+2002-04-30  Wenlin Institute (Tom Bishop)  <wenlin@wenlin.com>
+
+       * src/base/ftmac.c (p2c_str): Removed.
+       (file_spec_from_path) [TARGET_API_MAC_CARBON]: Added support for
+       OS X.
+       (is_dfont) [TARGET_API_MAC_CARBON]: Define only for OS X.
+       Handle `nameLen' <= 6 also.
+       (parse_fond): Remove unused variable `name_table'.
+       Use functionality of old p2c_str directly.
+       Add safety checks.
+       (read_lwfn): Initialize `size_p'.
+       Check for size_p == NULL.
+       (new_memory_stream, open_face_from_buffer): Updated to FreeType 2.1.
+       (FT_New_Face_From_LWFN): Remove unused variable `memory'.
+       Remove some dead code.
+       (FT_New_Face_From_SFNT): Remove unused variable `stream'.
+       (FT_New_Face_From_dfont) [TARGET_API_MAC_CARBON]: Define only for
+       OS X.
+       (FT_New_Face_From_FOND): Remove unused variable `error'.
+       (ResourceForkSize): New function.
+       (FT_New_Face): Use it.
+       Handle empty resource forks.
+       Conditionalize some code for OS X.
+       Add code to call normal loader as a fallback.
+
+2002-04-30  Werner Lemberg  <wl@gnu.org>
+
+       `interface' is reserved on the Mac.
+
+       * include/freetype/ftoutln.h, include/freetype/internal/sfnt.h,
+       src/base/ftoutln.c: s/interface/func_interface/.
+       * src/base/ftbbox.c (FT_Outline_Get_BBox):
+       s/interface/bbox_interface/.
+       * src/cff/cffdrivr.c: s/interface/module_interface/.
+       * src/cff/cffload.c, src/cff/cffload.h:
+       s/interface/psnames_interface/.
+       * src/cid/cidriver.c: s/interface/cid_interface/.
+       * src/sfnt/sfdriver.c: s/interface/module_interface/.
+       * src/smooth/ftgrays.c: s/interface/func_interface/.
+       * src/truetype/ttdriver.c: s/interface/tt_interface/.
+       * src/type1/t1driver.c: s/interface/t1_interface/.
+
+       Some more variable renames to avoid troubles on the Mac.
+
+       * src/raster/ftraster.c:
+       s/Unknown|Ascending|Descending|Flat/\1_State/.
+       * src/smooth/ftgrays.c: s/TScan/TCoord/.
+
+       Other changes for the Mac.
+
+       * include/freetype/config/ftconfig.h: Define FT_MACINTOSH for
+       Mac platforms.
+       * src/base/ftobjs.c: s/macintosh/FT_MACINTOSH/.
+
+       * src/raster/ftrend1.c (ft_raster1_render): Make `pitch' always
+       an even number.
+
+2002-04-29  Jouk Jansen  <joukj@hrem.stm.tudelft.nl>
+
+       * descrip.mms (all): Add pfr driver.
+
+2002-04-28  Werner Lemberg  <wl@gnu.org>
+
+       * src/pfr/pfrerror.h: New file.
+       * include/freetype/ftmoderr.h: Add PFR error codes.
+       * src/pfr/pfrgload.c: Include pfrerror.h.
+       Use PCF error codes.
+       (pfr_extra_item_load_stem_snaps): Fix debug message.
+       * src/pfr/pfrgload.c: Include pfrerror.h.
+       Use PCF error codes.
+       (pfr_extra_item_load_bitmap_info, pfr_glyph_load_simple,
+       pfr_glyph_load_compound): Fix debug message.
+       * src/pfr/pfrobjs.c: Include pfrerror.h.
+       Use PCF error codes.
+       (pfr_face_init): Return PFR_Err_Unknown_File_Format.
+       * src/pfr/rules.mk (PFR_DRV_H): Include pfrerror.h.
+
+       * src/pcf/pcfdriver.c (PCF_Face_Init) [!FT_CONFIG_OPTION_USE_CMAPS]:
+       `root' -> `face->root'.
+       * src/sfnt/ttcmap0.c (TT_Build_CMaps) [!FT_CONFIG_OPTION_USE_CMAPS]:
+       Removed.
+       * src/sfnt/ttcmap0.c: Declare TT_Build_CMaps only for
+       FT_CONFIG_OPTION_USE_CMAPS.
+
+2002-04-27  Werner Lemberg  <wl@gnu.org>
+
+       * src/cache/ftccache.c (ftc_cache_lookup),
+       src/cache/ftccmap.c (ftc_cmap_family_init),
+       src/cache/ftcmanag.c (ftc_family_table_alloc),
+       src/cache/ftcsbits.c (FTC_SBit_Cache_Lookup): Use FTC_Err_*.
+       src/cache/ftcimage.c (FTC_Image_Cache_Lookup): Use FTC_Err_*.
+       (FTC_ImageCache_Lookup): Fix handling of invalid arguments.
+
+2002-04-22  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/configure.ac: Set `version_info' to 9:1:3 (FT2
+       version 2.0.9 has 9:0:3).
+       * builds/unix/configure: Regenerated (using autoconf 2.53).
+
+2002-04-19  Werner Lemberg  <wl@gnu.org>
+
+       * src/pfr/pfrload.c (pfr_extra_items_farse): Fix debug message.
+       (pfr_phy_font_load): s/size/Size/ for local variable to avoid
+       compiler warning.
+       * src/pfr/pfrobjs.c (pfr_face_init): Fix debug message.
+       (pfr_slot_load): Remove redundant local variable.
+
+2002-04-19  David Turner  <david@freetype.org>
+
+       Adding a PFR font driver to the FreeType sources.  Note that it
+       doesn't support embedded bitmaps or kerning tables yet.
+
+       src/pfr/*: New files.
+
+       * include/freetype/config/ftmodule.h,
+       include/freetype/internal/fttrace.h, src/Jamefile: Updated.
+
+       * src/type1/t1gload.h (T1_Load_Glyph), src/type1/t1gload.c
+       (T1_Load_Glyph): Fixed incorrect parameter sign-ness in callback
+       function.
+
+       * include/freetype/internal/ftmemory.h (FT_MEM_ZERO, FT_ZERO): New
+       macros.
+
+       * include/freetype/internal/ftstream.h (FT_NEXT_OFF3, FT_NEXT_UOFF3,
+       FT_NEXT_OFF3_LE, FT_NEXT_UOFF3_LE): New macros to parse in-memory
+       24-bit integers.
+
+2002-04-18  David Turner  <david@freetype.org>
+
+       * src/base/ftobjs.c, builds/win32/ftdebug.c,
+       builds/amiga/src/base/ftdebug.c: Version 2.1.0 couldn't be linked
+       against applications in Win32 and Amiga builds due to changes to
+       `src/base/ftdebug.c' that were not properly propagated to
+       `builds/win32' and `builds/amiga'.  This has been fixed.
+
+       * include/freetype/internal/ftobject.h,
+       include/freetype/internal/ftexcept.h, include/freetype/ftsysmem.h,
+       include/freetype/ftsysio.h, src/base/ftsysmem.c, src/base/ftsysio.c:
+       New experimental files.
+
+2002-04-17  David Turner  <david@freetype.org>
+
+
+       * Version 2.1.0 released.
+       =========================
+
+
+2002-04-17  Michael Jansson  <mjan@em2-solutions.com>
+
+       * src/type1/t1gload.c (T1_Compute_Max_Advance): Fixed a small bug
+       that prevented the function to return the correct value.
+
+2002-04-16  Francesco Zappa Nardelli  <Francesco.Zappa.Nardelli@ens.fr>
+
+       * src/pcf/pcfread (pcf_get_accell): Fix parsing of accelerator
+       tables.
+
+2002-04-15  David Turner  <david@freetype.org>
+
+       * docs/FTL.txt: Formatting.
+
+       * include/freetype/config/ftoption.h: Reduce the size of the
+       render pool from 32kByte to 16kByte.
+
+       * src/pcf/pcfread.c (pcf_seek_to_table_type): Remove compiler
+       warning.
+
+       * include/freetype/config/ftoption.h (FT_MAX_EXTENSIONS): Removed.
+
+       * docs/CHANGES: Preparing 2.1.0 release.
+
+2002-04-13  Werner LEMBERG  <wl@gnu.org>
+
+       * src/cff/cffgload.c (CFF_Parse_CharStrings): s/rand/Rand/ to avoid
+       compiler warning.
+
+2002-04-12  David Turner  <david@freetype.org>
+
+       * README.UNX: Updated the Unix-specific quick-compilation guide to
+       warn about the GNU Make requirement at compile time.
+
+       * include/freetype/config/ftstdlib.h,
+       include/freetype/config/ftconfig.h,
+       include/freetype/config/ftheader.h,
+       include/freetype/internal/ftmemory.h,
+       include/freetype/internal/ftobjs.h,
+
+       src/autohint/ahoptim.c,
+
+       src/base/ftdbgmem.c, src/base/ftdebug.c, src/base/ftmac.c,
+       src/base/ftobjs.c, src/base/ftsystem.c,
+
+       src/cache/ftcimage.c, src/cache/ftcsbits.c,
+
+       src/cff/cffdriver.c, src/cff/cffload.c, src/cff/cffobjs.c,
+
+       src/cid/cidload.c, src/cid/cidparse.c, src/cid/cidriver.c,
+
+       src/pcf/pcfdriver.c, src/pcf/pcfread.c,
+
+       src/psaux/t1cmap.c, src/psaux/t1decode.c,
+
+       src/pshinter/pshalgo1.c, src/pshinter/pshalgo2.c,
+       src/pshinter/pshrec.c,
+
+       src/psnames/psmodule.c,
+
+       src/raster/ftraster.c,
+
+       src/sfnt/sfdriver.c, src/sfnt/ttload.c,
+
+       src/smooth/ftgrays.c,
+
+       src/type1/t1afm.c, src/type1/t1driver.c, src/type1/t1gload.c,
+       src/type1/t1load.c, src/type1/t1objs.c, src/type1/t1parse.c,
+
+       builds/unix/ftconfig.in, builds/vms/ftconfig.h,
+
+       builds/amiga/src/base/ftdebug.c:
+
+       Added the new configuration file `ftstdlib.h' used to define
+       aliases for all ISO C library functions used by the engine
+       (e.g. strlen, qsort, setjmp, etc.).
+
+       This eases the porting of FreeType 2 to environments like
+       XFree86 modules/extensions.
+
+       Also removed many #include <string.h>, #include <stdlib.h>, etc.
+       from the engine's sources where they are not needed.
+
+       * src/sfnt/ttpost.c: Use macro name for psnames.h.
+
+2002-04-12  Vincent Caron  <v.caron@zerodeux.net>
+
+       * configure, builds/detect.mk: Updated the build system to print
+       a warning message in case GNU Make isn't used to build the library.
+
+2002-04-11  David Turner  <david@freetype.org>
+
+       * README, docs/CHANGES, Jamfile.in: Updates for the 2.1.0 release.
+
+       * docs/FTL.txt: Updated license text to provide a preferred
+       disclaimer and adjust copyright dates/extents.
+
+       * include/freetype/cache/ftcglyph.h: Removing obsolete (and
+       confusing) comment.
+
+       * Jamfile.in: New file.
+
+2002-04-11  Maxim Shemanarev  <mcseemagg@yahoo.com>
+
+       * src/smooth/ftgrays.c (gray_hline): Minor optimization.
+
+2002-04-02  Werner Lemberg  <wl@gnu.org>
+
+       Fixes from the stable branch:
+
+       * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_OLD_CALCS):
+       Removed.
+       [FT_CONFIG_OPTION_OLD_CALCS]: Removed.
+       * include/freetype/internal/ftcalc.h, src/base/ftcalc.c
+       [FT_CONFIG_OPTION_OLD_CALCS]: Removed.
+
+       * src/base/fttrigon.c (FT_Vector_Length): Change algorithm to match
+       output of FreeType 1.
+
+       * src/pshinter/pshglob.c (psh_globals_scale_widths): Fixed a small
+       bug that created un-even stem widths when hinting Postscript fonts.
+
+       * src/type1/t1driver.c, src/type1/t1parse.c: 16bit fixes.
+
+2002-04-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgload.c: 16bit fixes.
+       (TT_Load_Simple_Glyph): Improve debug messages.
+       (load_truetype_glyph): Remove dead code.
+       * src/truetype/ttinterp.c: 16bit fixes.
+       * src/truetype/ttobjs.c: Ditto.
+
+       * include/freetype/ftsnames.h, include/freetype/internal/sfnt.h,
+       src/cff/cffload.h, src/psaux/psobjs.h, src/truetype/ttinterp.[ch],
+       src/sfnt/ttpost.h: s/index/idx/.
+
+2002-03-31  Yao Zhang  <yaoz@vidar.niaaa.nih.gov>
+
+       * src/truetype/ttobjs.c (TT_Size_Init): Fix typo.
+
+2002-03-31  Werner Lemberg  <wl@gnu.org>
+
+       * src/otlayout/otlcommn.c, src/otlayout/otlcommn.h: s/index/idx/.
+       * src/psaux/t1cmap.c: Ditto.
+       * src/sfnt/ttcmap0.c: Ditto.
+
+       * include/freetype/internal/tttypes.h,
+       include/freetype/internal/sfnt.h (TT_Goto_Table_Func): Renamed to ...
+       (TT_Loader_GotoTableFunc): This.
+       * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Fix debug
+       messages.
+       * src/psnames/psmodule.c (psnames_interface)
+       [!FT_CONFIG_OPTION_ADOBE_GLYPH_LIST]: Fix typo.
+       * src/sfnt/sfdriver.c (get_sfnt_table): 16bit fix.
+       * src/sfnt/ttcmap.c: 16bit fixes (0xFFFF -> 0xFFFFU).
+       * src/sfnt/ttcmap0.c: 16bit fixes.
+       (TT_Build_CMaps): Simplify debug messages.
+       (tt_cmap12_char_next): Fix offset.
+       * src/sfnt/ttload.c (TT_Load_Names, TT_Load_CMap): Fix debug
+       messages.
+       (TT_Load_OS2): 16bit fix.
+
+2002-03-30  David Turner  <david@freetype.org>
+
+       * include/freetype/internal/tttypes.h: Adding comments to some of
+       the TT_FaceRec fields.
+
+       * src/sfnt/ttcmap0.c (TT_Build_CMaps): Removed compiler warnings.
+
+       * src/sfnt/sfobjs.c (tt_name_entry_ascii_from_{utf16,ucs4,other}:
+       New functions.
+       (tt_face_get_name): Use them to properly extract an ascii font name.
+
+2002-03-30  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/t1tables.h (t1_blend_max): Fix typo.
+       * src/base/ftstream.c: Simplify FT_ERROR calls.
+       * src/cff/cffdrivr.c (cff_get_glyph_name): Fix debug message.
+
+       * src/cff/cffobjs.c (CFF_Driver_Init, CFF_Driver_Done)
+       [TT_CONFIG_OPTION_EXTEND_ENGINE]: Removed.
+       * src/cff/sfobjs.c (SFNT_Load_Face)
+       [TT_CONFIG_OPTION_EXTEND_ENGINE]: Ditto.
+       * src/truetype/ttobjs.c (TT_Init_Driver, TT_Done_Driver)
+       [TT_CONFIG_OPTION_EXTEND_ENGINE]: Ditto.
+
+       * src/truetype/ttdriver.c, src/truetype/ttobjs.c,
+       src/truetype/ttobjs.h: Renaming driver functions to the
+       FT_<Subject>_<Action> scheme:
+
+         TT_Init_Driver => TT_Driver_Init
+         TT_Done_Driver => TT_Driver_Done
+         TT_Init_Face   => TT_Face_Init
+         TT_Done_Face   => TT_Face_Done
+         TT_Init_Size   => TT_Size_Init
+         TT_Done_Size   => TT_Size_Done
+         TT_Reset_Size  => TT_Size_Reset
+
+2002-03-29  Werner Lemberg  <wl@gnu.org>
+
+       * builds/vms/ftconfig.h: Rename LOCAL_DEF and LOCAL_FUNC to
+       FT_LOCAL and FT_LOCAL_DEF, respectively, as with other ftconfig.h
+       files.
+       * builds/unix/ftconfig.in: Add argument to FT_LOCAL and
+       FT_LOCAL_DEF.
+       * src/truetype/ttinterp.c: s/FT_Assert/FT_ASSERT/.
+       * builds/unix/configure.ac: Temporarily deactivate creation of
+       ../../Jamfile.
+       * builds/unix/configure: Updated.
+
+2002-03-28  KUSANO Takayuki  <AE5T-KSN@asahi-net.or.jp>
+
+       * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Fix serious typos.
+
+2002-03-28  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/psaux.h (PSAux_ServiceRec): Fix
+       compiler warnings.
+       * include/freetype/internal/t1types.h (T1_FaceRec): Use `const' for
+       some members.
+       * src/base/ftapi.c (FT_New_Memory_Stream): Fix typos.
+       * src/psaux/t1cmap.c (t1_cmap_std_init, t1_cmap_unicode_init): Add
+       cast.
+       (t1_cmap_{standard,expert,custom,unicode}_class_rec): Use
+       `FT_CALLBACK_TABLE_DEF'.
+       * src/psaux/t1cmap.h: Updated.
+       * src/sfnt/ttcmap0.c (TT_Build_CMaps): Use `ft_encoding_none'
+       instead of zero.
+       * src/type1/t1objs.c (T1_Face_Init): Use casts.
+
+2002-03-26  David Turner  <david@freetype.org>
+
+       * src/sfnt/sfdriver.c, src/sfnt/sfobjs.c, src/sfnt/ttcmap0.c:
+       Fixed a small bug in the FT_CMaps support code.
+
+2002-03-25  David Turner  <david@freetype.org>
+
+       * src/truetype/ttinterp.c (Norm): Replaced with...
+       (TT_VecLen): This.
+       (TT_MulFix14, TT_DotFix14): New functions.
+       (Project, Dual_Project, Free_Project, Compute_Point_Displacement,
+       Ins_SHPIX, Ins_MIAP, Ins_MIRP): Use them.
+       [FT_CONFIG_OPTION_OLD_CALCS]: Removed all code.
+
+2002-03-22  David Turner  <david@freetype.org>
+
+       * src/base/ftobjs.c, src/sfnt/ttcmap0.c, src/type1/t1objs.c:
+       Various fixes to make the FT_CMaps support work correctly (more
+       tests are still needed).
+
+       * include/freetype/internal/ftobjs.h, src/sfnt/Jamfile,
+       src/sfnt/rules.mk, src/sfnt/sfnt.c, src/sfnt/sfobjs.c,
+       src/sfnt/ttload.c, src/sfnt/ttcmap0.c, src/sfnt/ttcmap0.h: Updated
+       the SFNT charmap support to use FT_CMaps.
+
+       * include/freetype/fterrdef.h: New file.
+       * include/freetype/fterrors.h: Include it.  It contains all error
+       codes.
+       * include/freetype/config/ftheader.h (FT_ERROR_DEFINITIONS_H): New
+       macro.
+
+       * include/freetype/internal/ftmemory.h, and a lot of other files:
+       Changed the names of memory macros.  Examples:
+
+         MEM_Set   => FT_MEM_SET
+         MEM_Copy  => FT_MEM_COPY
+         MEM_Move  => FT_MEM_MOVE
+
+         ALLOC     => FT_ALLOC
+         FREE      => FT_FREE
+         REALLOC   = >FT_REALLOC
+
+       FT_NEW was introduced to allocate a new object from a _typed_
+       pointer.
+
+       Note that ALLOC_ARRAY and REALLOC_ARRAY have been replaced by
+       FT_NEW_ARRAY and FT_RENEW_ARRAY which take _typed_ pointer
+       arguments.
+
+       This results in _lots_ of sources being changed, but makes the code
+       more generic and less error-prone.
+
+       * include/freetype/internal/ftstream.h, src/base/ftstream.c,
+       src/cff/cffload.c, src/pcf/pcfread.c, src/sfnt/ttcmap.c,
+       src/sfnt/ttcmap0.c, src/sfnt/ttload.c, src/sfnt/ttpost.c,
+       src/sfnt/ttsbit.c, src/truetype/ttgload.c, src/truetype/ttpload.c,
+       src/winfonts/winfnt.c: Changed the definitions of stream macros.
+       Examples:
+
+         NEXT_Byte     => FT_NEXT_BYTE
+         NEXT_Short    => FT_NEXT_SHORT
+         NEXT_UShortLE => FT_NEXT_USHORT_LE
+         READ_Short    => FT_READ_SHORT
+         GET_Long      => FT_GET_LONG
+         etc.
+
+       Also introduced the FT_PEEK_XXXX functions.
+
+       * src/cff/cffobjs.c (CFF_Build_Unicode_Charmap): Removed commented
+       out function.
+       (find_encoding): Removed.
+       (CFF_Face_Init): Remove charmap support.
+
+       * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_USE_CMAPS,
+       TT_CONFIG_CMAP_FORMAT{0,2,4,6,8,10,12}): New macros to fine-tune
+       support of cmaps.
+
+2002-03-21  David Turner  <david@freetype.org>
+
+       * src/base/ftobjs.c, src/pcf/pcfdriver.c, src/pcf/pcfread.c: Updated
+       to new FT_CMap definitions.
+
+       * src/psaux/t1cmap.h, src/psaux/t1cmap.c, src/type1/t1cmap.h,
+       src/type1/t1cmap.c: Updating and moving the Type 1 FT_CMap support
+       from `src/type1' to `src/psaux' since it is going to be shared by
+       the Type 1 and CID font drivers.
+
+       * src/psaux/Jamfile, src/psaux/psaux.c, src/psaux/psauxmod.c,
+       src/psaux/rules.mk, include/freetype/internal/psaux.h: Added support
+       for Type 1 FT_CMaps.
+
+2002-03-20  David Turner  <david@freetype.org>
+
+       * src/base/ftgloadr.c (FT_GlyphLoader_CheckSubGlyphs): Fixed a
+       memory allocation bug that was due to un-careful renaming of the
+       FT_SubGlyph type.
+
+       * src/base/ftdbgmem.c (ft_mem_table_destroy): Fixed a small bug that
+       caused the library to crash with Electric Fence when memory
+       debugging is used.
+
+       * Renaming stream macros.  Examples:
+
+         FILE_Skip    => FT_STREAM_SKIP
+         FILE_Read    => FT_STREAM_READ
+         ACCESS_Frame => FT_FRAME_ENTER
+         FORGET_Frame => FT_FRAME_EXIT
+         etc.
+
+       * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Fixed memory leak.
+
+       * include/freetype/internal/ftobjs.h: Changing the definition of
+       FT_CMap_CharNextFunc slightly.
+
+       * src/cff/*.c: Updating CFF type definitions.
+
+2002-03-14  David Turner  <david@freetype.org>
+
+       * include/freetype/internal/autohint.h, src/autohint/ahmodule.c,
+       src/base/ftapi.c, src/base/ftobjs.c: Updating the type definitions
+       for the auto-hinter module.
+
+         FT_AutoHinter_Interface  => FT_AutoHinter_ServiceRec
+         FT_AutoHinter_Interface* => FT_AutoHinter_Service
+         etc.
+
+         FT_AutoHinter_Get_Global_Func  => FT_AutoHinter_GlobalGetFunc
+         FT_AutoHinter_Done_Global_Func => FT_AutoHinter_GlobalDoneFunc
+         etc.
+
+       * ahloader.h [_STANDALONE_]: Removed all conditional code.
+
+       * include/freetype/internal/cfftypes.h, src/cff/*.c: Updating the
+       type definitions of the CFF font driver.
+
+         CFF_Font  => CFF_FontRec
+         CFF_Font* => CFF_Font
+         etc.
+
+       * include/freetype/internal/fnttypes.h, src/winfonts/*.c: Updating
+       type definitions of the Windows FNT font driver.
+
+       * include/freetype/internal/ftdriver.h,
+       include/freetype/internal/ftobjs.h, src/base/ftapi.c,
+       src/base/ftobjs.c, src/cff/cffdrivr.c, src/cff/cffdrivr.h,
+       src/cid/cidriver.c, src/cid/cidriver.h, src/pcf/pcfdriver.c,
+       src/pcf/pcfdriver.h, src/truetype/ttdriver.c,
+       src/truetype/ttdriver.h, src/type1/t1driver.c, src/type1/t1driver.h,
+       src/winfonts/winfnt.c, src/winfonts/winfnt.h: Updating type
+       definitions for font drivers.
+
+         FTDriver_initFace      => FT_Face_InitFunc
+         FTDriver_initGlyphSlot => FT_Slot_InitFunc
+         etc.
+
+       * src/cid/cidobjs.c (CID_Face_Init): Remove dead code.
+
+       * include/freetype/internal/ftobjs.h, src/base/ftobjs.c: Updated a
+       few face method definitions:
+
+         FT_PSName_Requester     => FT_Face_GetPostscriptNameFunc
+         FT_Glyph_Name_Requester => FT_Face_GetGlyphNameFunc
+         FT_Name_Index_Requester => FT_Face_GetGlyphNameIndexFunc
+
+       * src/base/ftapi.c: New file.  It contains backwards compatibility
+       functions.
+
+       * include/freetype/internal/psaux.h, src/cid/cidload.c,
+       src/cidtoken.h, src/psaux/psobjs.c, src/psaux/psobjs.h,
+       src/psaux/t1decode.c, stc/type1/t1load.c, src/type1/t1tokens.h:
+       Updated common PostScript type definitions.
+       Renamed all enumeration values like to uppercase variants:
+
+         t1_token_any      => T1_TOKEN_TYPE_ANY
+         t1_field_cid_info => T1_FIELD_LOCATION_CID_INFO
+         etc.
+
+       * include/freetype/internal/psglobals.h: Removed.
+       * include/freetype/internal/pshints.h, src/pshinter/pshglob.h:
+       Updated.
+
+       * include/freetype/internal/tttypes.h,
+       include/freetype/internal/sfnt.h, src/base/ftnames.c,
+       src/cff/cffdrivr.c, src/sfnt/*.c, src/truetype/*.c: Updated
+       SFNT/TrueType type definitions.
+
+       * include/freetype/freetype.h, include/freetype/internal/ftgloadr.h:
+       Updating type definitions for the glyph loader.
+
+2002-03-13  Antoine Leca  <antoine@oriolnet.com>
+
+       * include/freetype/config/ftoption.h: Changed the automatic
+       detection of Microsoft C compilers to automatically support 64-bit
+       integers only since revision 9.00 (i.e. >= Visual C++ 2.0).
+
+2002-03-08  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftutil.c (FT_Realloc): Use MEM_Set instead of memset.
+
+2002-03-07  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftdbgmem.c (ft_mem_table_resize, ft_mem_table_new,
+       ft_mem_table_set, ft_mem_debug_alloc, ft_mem_debug_free,
+       ft_mem_debug_realloc, ft_mem_debug_done, FT_Alloc_Debug,
+       FT_Realloc_Debug, FT_Free_Debug): Fix compiler warnings.
+       * src/base/ftcalc.c (FT_MulFix): Ditto.
+       * src/cff/cffdrivr.c (cff_get_name_index): Ditto.
+       * src/cff/cffobjs.c (CFF_Size_Get_Global_Funcs, CFF_Size_Init,
+       CFF_GlyphSlot_Init): Ditto.
+       * src/cid/cidobjs.c (CID_GlyphSlot_Init,
+       CID_Size_Get_Globals_Funcs): Ditto.
+       * src/type1/t1objs.c (T1_Size_Get_Globals_Funcs, T1_GlyphSlot_Init):
+       Ditto.
+       * src/pshinter/pshmod.c (pshinter_interface): Use `static const'.
+       * src/winfonts/winfnt.c (FNT_Get_Next_Char): Remove unused
+       variables.
+
+       * include/freetype/internal/psaux.h (T1_Builder_Funcs): Renamed
+       to...
+       (T1_Builder_FuncsRec): This.
+       (T1_Builder_Funcs): New typedef.
+       (PSAux_Interface): Remove compiler warnings.
+       * src/psaux/psauxmod.c (t1_builder_funcs), src/psaux/psobjs.h
+       (t1_builder_funcs): Updated.
+
+       * src/pshinter/pshglob.h (PSH_Blue_Align): Replaced with ...
+       (PSH_BLUE_ALIGN_{NONE,TOP,BOT}): New defines.
+       (PSH_AlignmentRec): Updated.
+
+       * include/freetype/internal/ftstream.h (GET_Char, GET_Byte): Fix
+       typo.
+       * include/freetype/internal/ftgloadr.h (FT_SubGlyph): Ditto.
+       * src/base/ftstream (FT_Get_Char): Rename to...
+       (FT_Stream_Get_Char): This.
+
+       * src/base/ftnames.c (FT_Get_Sfnt_Name): s/index/idx/ -- `index' is
+       a built-in function in gcc, causing warning messages with gcc 3.0.
+       * src/autohint/ahglyph.c (ah_outline_load): Ditto.
+       * src/autohint/ahglobal.c (ah_hinter_compute_blues): Ditto.
+       * src/cache/ftcmanag.c (ftc_family_table_alloc,
+       ftc_family_table_free, FTC_Manager_Done, FTC_Manager_Register_Cache):
+       Ditto.
+       * src/cff/cffload.c (cff_new_index, cff_done_index,
+       cff_explicit_index, CFF_Access_Element, CFF_Forget_Element,
+       CFF_Get_Name, CFF_Get_String, CFF_Load_SubFont, CFF_Load_Font,
+       CFF_Done_Font): Ditto.
+       * src/psaux/psobjs.c (PS_Table_Add, PS_Parser_LoadField): Ditto.
+       * src/psaux/t1decode.c (T1_Decoder_Parse_Charstrings): Ditto.
+       * src/pshinter/pshrec.c (ps_mask_test_bit, ps_mask_clear_bit,
+       ps_mask_set_bit, ps_dimension_add_t1stem, ps_hints_t1stem3,
+       * src/pshinter/pshalgo1.c (psh1_hint_table_record,
+       psh1_hint_table_record_mask, psh1_hint_table_activate_mask): Ditto.
+       * src/pshinter/pshalgo2.c (psh2_hint_table_record,
+       psh2_hint_table_record_mask, psh2_hint_table_activate_mask): Ditto.
+       * src/sfnt/ttpost.c (Load_Format_20, Load_Format_25,
+       TT_Get_PS_Name): Ditto.
+       * src/truetype/ttgload.c (TT_Get_Metrics, Get_HMetrics,
+       load_truetype_glyph): Ditto.
+       * src/type1/t1load.c (parse_subrs, T1_Open_Face): Ditto.
+       * src/type1/t1afm.c (T1_Get_Kerning): Ditto.
+       * include/freetype/cache/ftcmanag.h (ftc_family_table_free): Ditto.
+
+2002-03-06  David Turner  <david@freetype.org>
+
+       * src/type1/t1objs.c (T1_Face_Init), src/cid/cidobjs.c
+       (CID_Face_Init): Fixed another bug related to the
+       ascender/descender/text height of Postscript fonts.
+
+       * src/pshinter/pshalgo2.c (print_zone): Renamed to ...
+       (psh2_print_zone): This.
+       * src/pshinter/pshalgo1.c (print_zone): Renamed to ...
+       (psh1_print_zone): This.
+
+       * include/freetype/freetype.h, include/freetype/internal/ftobjs.h,
+       src/base/ftobjs.c: Adding the new FT_Library_Version API to return
+       the library's current version in dynamic links.
+       * src/base/ftinit.c (FT_Init_FreeType): Updated.
+
+2002-03-06  Werner Lemberg  <wl@gnu.org>
+
+       * src/pshinter/pshglob.h (PSH_DimensionRec): s/std/stdw/.
+       * src/pshinter/pshglob.c (psh_global_scale_widths,
+       psh_dimension_snap_width, psh_globals_destroy, psh_globals_new):
+       Ditto.
+
+2002-03-05  David Turner  <david@freetype.org>
+
+       * src/type1/t1objs.c (T1_Face_Init), src/cff/cffobjs.c
+       (CFF_Face_Init), src/cid/cidobjs.c (CID_Face_Init): Removing the bug
+       that returned global BBox values in 16.16 fixed format (instead of
+       integer font units).
+
+       * src/cid/cidriver.c (cid_get_postscript_name): Fixed a bug that
+       caused the CID driver to return Postscript font names with a leading
+       slash (`/') as in `/MOEKai-Regular'.
+
+       * src/sfnt/ttload.c (TT_Load_Names), src/sfnt/sfobjs.c (Get_Name),
+       src/sfnt/sfdriver.c (get_sfnt_postscript_name): Fixed the loader so
+       that it accepts broken fonts like `foxjump.ttf', which made FreeType
+       crash when trying to load them.
+
+       Also improved the name table parser to be able to load
+       Windows-encoded entries before Macintosh or Unicode ones, since it
+       seems some fonts don't have reliable values here anyway.
+
+       * include/freetype/internal/psnames.h: Add typedef for
+       `PSNames_Service'.
+
+2002-03-05  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/aclocal.m4, builds/unix/ltmain.sh: Update to libtool
+       1.4.2.
+       Apply a small patch for AIX to make shared libraries work (this
+       patch is already in the CVS version of libtool).
+
+       * builds/unix/config.sub, builds/unix/config.guess: Updated to
+       recent versions.
+
+       * builds/unix/configure.ac: Fix typo
+       (AC_CONFIG_FILE->AC_CONFIG_FILES).
+
+       * builds/unix/configure: Regenerated.
+
+2002-02-28  David Turner  <david@freetype.org>
+
+       * include/freetype/ftconfig.h: Changed `FT_LOCAL xxxx' to
+       `FT_LOCAL( xxxx )' everywhere in the source.  The same goes for
+       `FT_LOCAL_DEF xxxx' which is translated to `FT_LOCAL_DEF( xxxxx )'.
+
+       * include/freetype/freetype.h (FREETYPE_MINOR, FREETYPE_PATCH):
+       Changing version to 2.1.0 to indicate an unstable branch.
+       Added the declarations of FT_Get_First_Char and FT_Get_Next_Char.
+
+       * src/base/ftobjs.c: Implement FT_Get_First_Char and
+       FT_Get_Next_Char.
+
+       * include/freetype/t1tables.h: Renaming structure types.  This
+
+         typedef  T1_Struct_
+         {
+         } T1_Struct;
+
+       becomes
+
+         typedef  PS_StructRec_
+         {
+         } PS_StructRec, *PS_Struct;
+
+         typedef PS_StructRec  T1_Struct;  /* backwards-compatibility */
+
+       Hence, we increase the coherency of the source code by effectively
+       using the `Rec' prefix for structure types.
+
+2002-02-27  David Turner  <david@freetype.org>
+
+       * src/sfnt/ttload.c (TT_Load_Names): Simplifying and securing the
+       names table loader.  Invalid individual name entries are now handled
+       correctly.  This allows the loading of very buggy fonts like
+       `foxjump.ttf' without allocating tons of memory and causing crashes.
+
+       * src/otlayout/otlcommon.h, src/otlayout/otlcommon.c: Adding (still
+       experimental) code for OpenType Layout tables validation and
+       parsing.
+
+       * src/type1/t1cmap.h, src/type1/t1cmap.c: Adding (still
+       experimental) code for Type 1 charmap processing.
+
+       * src/sfnt/ttcmap0.c: New file.  It contains a new, still
+       experimental SFNT charmap processing support.
+
+       * include/freetype/internal/ftobjs.h: Adding validation support as
+       well as internal charmap object definitions (FT_CMap != FT_CharMap).
+
+2002-02-24  David Turner  <david@freetype.org>
+
+       * Renaming stream functions to the FT_<Subject>_<Action> scheme:
+
+         FT_Seek_Stream    => FT_Stream_Seek
+         FT_Skip_Stream    => FT_Stream_Skip
+         FT_Read_Stream    => FT_Stream_Read
+         FT_Read_Stream_At => FT_Stream_Read_At
+         FT_Access_Frame   => FT_Stream_Enter_Frame
+         FT_Forget_Frame   => FT_Stream_Exit_Frame
+         FT_Extract_Frame  => FT_Stream_Extract_Frame
+         FT_Release_Frame  => FT_Stream_Release_Frame
+         FT_Get_XXXX       => FT_Stream_Get_XXXX
+         FT_Read_XXXX      => FT_Stream_Read_XXXX
+
+         FT_New_Stream( filename, stream ) =>
+           FT_Stream_Open( stream, filename )
+
+           (The function doesn't create the FT_Stream structure, it simply
+           initializes it for reading.)
+
+         FT_New_Memory_Stream( library, FT_Byte*  base, size, stream ) =>
+           FT_Stream_Open_Memory( stream, const FT_Byte* base, size )
+
+         FT_Done_Stream  => FT_Stream_Close
+         FT_Stream_IO    => FT_Stream_IOFunc
+         FT_Stream_Close => FT_Stream_CloseFunc
+
+         ft_close_stream => ft_ansi_stream_close (in base/ftsystem.c only)
+         ft_io_stream    => ft_ansi_stream_io    (in base/ftsystem.c only)
+
+       * src/base/ftutil.c: New file.  Contains all memory and list
+       management code (previously in `ftobjs.c' and `ftlist.c',
+       respectively).
+
+       * include/freetype/internal/ftobjs.h: Moving all code related to
+       glyph loaders to ...
+       * include/freetype/internal/ftgloadr.h: This new file.
+       `FT_GlyphLoader' is now a pointer to the structure
+       `FT_GlyphLoaderRec'.
+       (ft_glyph_own_bitmap): Renamed to ...
+       (FT_GLYPH_OWN_BITMAP): This.
+       * src/base/ftobjs.c: Moving all code related to glyph loaders
+       to ...
+       * src/base/ftgloadr.c: This new file.
+
+2002-02-22  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/ftdebug.h (FT_Trace): Remove comma in
+       enum to avoid compiler warnings.
+
+2002-02-21  David Turner  <david@freetype.org>
+
+       Modified the debug sub-system initialization.  Trace levels can now
+       be specified within the `FT2_DEBUG' environment variable.  See the
+       comments within `ftdebug.c' for more details.
+
+       * src/base/ftdebug.c: (FT_SetTraceLevel): Removed.
+       (ft_debug_init): New function.
+       (ft_debug_dummy): Removed.
+       Updated to changes in ftdebug.h
+
+       * include/freetype/internal/ftdebug.h: Always define
+       FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE is defined.
+       (FT_Assert): Renamed to ...
+       (FT_ASSERT): This.
+       Some stuff from ftdebug.h has been moved to ...
+
+       * include/freetype/internal/fttrace.h: New file, to define the trace
+       levels used for debugging.  It is used both to define enums and
+       toggle names for FT2_DEBUG.
+
+       * include/freetype/internal/internal.h: Updated.
+
+       * src/base/ftobjs.c, src/base/ftstream.c: Updated.
+
+       * include/freetype/internal/ftextend.h, src/base/ftextend.c:
+       Removed.  Both files are now completely obsolete.
+       * src/base/Jamfile, src/base/rules.mk: Updated.
+
+       * include/freetype/fterrors.h: Adding `#undef FT_ERR_CAT' and
+       `#undef FT_ERR_XCAT' to avoid warnings with certain compilers (like
+       LCC).
+
+       * src/pshinter/pshalgo2.c (print_zone): Renamed to ...
+       (psh2_print_zone): This to avoid errors during compilation of debug
+       library.
+
+       * src/smooth/ftgrays.c (FT_COMPONENT): Change definition to as
+       `trace_smooth'.
+
+2002-02-20  David Turner  <david@freetype.org>
+
+       * README: Adding `devel@freetype.org' address for bug reports.
+
+2002-02-20  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/install.mk (check): New dummy target.
+       (.PHONY): Add it.
+
+2002-02-19  Werner Lemberg  <wl@gnu.org>
+
+       * builds/freetype.mk (FT_CFLAGS): Use $(INCLUDE_FLAGS) first.
+
+       * src/cache/ftccache.c (ftc_cache_resize): Mark `error' as unused
+       to avoid compiler warning.
+       * src/cff/cffload.c (CFF_Get_String): Ditto.
+       * src/cff/cffobjs.c (CFF_StrCopy): Ditto.
+       * src/psaux/psobjs.c (PS_Table_Done): Ditto.
+       * src/pcf/pcfread.c (pcf_seek_to_table_type): Ditto.
+       * src/sfnt/sfdriver.c (get_sfnt_postscript_name): Ditto.
+       (pcf_get_bitmaps): The same for `sizebitmaps'.
+       * src/psaux/t1decode.c (T1_Decode_Parse_Charstrings): The same for
+       `orig_y'.
+       (t1operator_seac): Comment out more dead code.
+       * src/pshinter/pshalgo2.c (ps2_hints_apply): Add `DEBUG_HINTER'
+       conditional.
+       * src/truetype/ttgload.c (TT_Process_Simple_Glyph,
+       load_truetype_glyph): Add `TT_CONFIG_OPTION_BYTECODE_INTERPRETER'
+       conditional.
+
+2002-02-18  Werner Lemberg  <wl@gnu.org>
+
+       * src/autohint/ahglyph.c (ah_outline_link_segments): Remove unused
+       variables.
+       * src/autohint/ahhint.c (ah_align_serif_edge): Use FT_UNUSED instead
+       of UNUSED.
+       * src/autohint/ahmodule.c (ft_autohinter_reset): Ditto.
+       * src/pshinter/pshrec.c (ps_mask_table_merge): Fix typo in variable
+       swapping code.
+       * src/pshinter/pshglob.h (PSH_Blue_Align): Add PSH_BLUE_ALIGN_NONE.
+       * src/pshinter/pshglob.c (psh_blues_snap_stem): Use it.
+       * src/pshinter/pshalgo1.c (psh1_hint_table_optimize): Ditto.
+       * src/pshinter/pshalgo2.c (psh2_hint_align): Ditto.
+       * include/freetype/internal/ftobjs.h (UNUSED): Removed.
+
+2002-02-10  Roberto Alameda  <ojancano@geekmail.de>
+
+       Add support for ISOLatin1 PS encoding.
+
+       * include/freetype/freetype.h (ft_encoding_latin_1): New tag
+       (`lat1').
+       * include/freetype/internal/t1types.h (T1_Encoding_Type): Add
+       `t1_encoding_isolatin1'.
+       * src/type1/t1driver.c (Get_Char_Index, Get_Next_Char): Handle
+       ft_encoding_latin_1.
+       * src/type1/t1load.c (parse_encoding): Handle `ISOLatin1Encoding'.
+       * src/type1/t1objs.c (T1_Face_Init): Handle `t1_encoding_isolatin1'.
+
+----------------------------------------------------------------------------
+
+Copyright 2002, 2003, 2004, 2005, 2007, 2008 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:
diff --git a/ChangeLog.22 b/ChangeLog.22
new file mode 100644 (file)
index 0000000..4144288
--- /dev/null
@@ -0,0 +1,2837 @@
+2006-05-12  Werner Lemberg  <wl@gnu.org>
+
+
+       * Version 2.2.1 released.
+       =========================
+
+
+       Tag sources with `VER-2-2-1'.
+
+2006-05-12  Werner Lemberg  <wl@gnu.org>
+
+       * src/tools/docmaker/sources.py (re_source_keywords): Add word
+       boundary markers.
+       * src/tools/docmaker/content.py (re_field): Allow `.' in field names
+       (but not at the beginning or end).
+       * src/tools/docmaker/tohtml.py (html_header_1): Use `utf-8' charset.
+       (block_footer): Split into...
+       (block_footer_start, block_footer_middle, block_footer_end): This to
+       add navigation buttons.
+       (HtmlFormatter::block_exit): Updated.
+
+       * include/freetype/*: Many minor documentation improvements (adding
+       links, spelling errors, etc.).
+
+2006-05-11  Werner Lemberg  <wl@gnu.org>
+
+       * README: Minor updates.
+
+       * include/freetype/*: s/scale/scaling value/ where appropriate.
+       Many other minor documentation improvements.
+
+       * src/tools/docmaker/sources.py (re_italic, re_bold): Handle
+       trailing punctuation.
+       * src/tools/docmaker/tohtml.py (HtmlFormatter::make_html_word): Add
+       warning message for undefined cross references.
+       Update handling of re_italic and re_bold.
+
+2006-05-11  Masatake YAMATO  <jet@gyve.org>
+
+       * builds/unix/ftsystem.c (FT_Stream_Open): Check errno only if
+       read system call returns -1.
+       Remove a redundant parenthesis.
+
+2006-05-10  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/ftsystem.c (FT_Stream_Open): Avoid infinite loop if
+       given an empty, un-mmap()able file.  Reported and suggested fix in
+       Savannah bug #16555.
+
+       * builds/freetype.mk (refdoc): Write-protect the `docmaker'
+       directory to suppress generation of .pyc files.  According to the
+       Python docs there isn't a more elegant solution (currently).
+
+       * builds/toplevel.mk (dist): New target which builds .tar.gz,
+       .tar.bz2, and .zip files.  Note that the version number is still
+       hard-coded.
+       (do-dist): Sub-target of `dist'.
+       (CONFIG_GUESS, CONFIG_SUB): New variables.
+       (.PHONY): Updated.
+
+2006-05-09  Rajeev Pahuja  <rpahuja@esri.com>
+
+       * builds/win32/visualc/freetype.sln,
+       builds/win32/visualc/freetype.vcproj: Upgraded to VS.NET 2005 from
+       VS.NET 2003
+       Added files ftbbox.c, fttype1.c, ftwinfnt.c, ftsynth.c.
+
+       * builds/win32/visualc/index.html: Updated.
+
+2006-05-07  Werner Lemberg  <wl@gnu.org>
+
+       Put version information into the configure script.  Reported by Paul
+       Watson <pwatson@redlinepy.com>.
+
+       * builds/unix/configure.ac: Renamed to...
+       * builds/unix/configure.raw: This which now serves (with appropriate
+       modifications) as a template for configure.ac.
+
+       * version.sed: New script.
+
+       * autogen.sh: Generate configure.ac from configure.raw, using
+       FREETYPE_MAJOR, FREETYPE_MINOR, and FREETYPE_PATCH from freetype.h.
+
+2006-05-06  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 1.
+
+       * builds/unix/configure.ac (version_info): Set to 9:10:3.
+
+       * builds/win32/visualc/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj, builds/freetype.mk (refdoc),
+       Jamfile (RefDoc), README: s/220/221/, s/2.2.0/2.2.1/.
+       Minor updates.
+
+       * docs/CHANGES, docs/VERSION.DLL, docs/PROBLEMS, README.CVS:
+       Updated.
+
+       * builds/unix/install-sh: Updated from `texinfo' CVS module at
+       savannah.gnu.org.
+
+       * devel/ftoption.h: Synchronize with
+       include/freetype/config/ftoption.h.
+
+2006-05-04  Werner Lemberg  <wl@gnu.org>
+
+       * src/lzw/ftlzw2.c: Renamed to...
+       * src/lzw/ftlzw.c: This.
+
+       * src/lzw/Jamfile, src/lzw/rules.mk: Updated.
+
+       * builds/mac/FreeType.m68k_cfm.make.txt,
+       builds/mac/FreeType.m68k_far.make.txt,
+       builds/mac/FreeType.ppc_carbon.make.txt,
+       builds/mac/FreeType.ppc_classic.make.txt: Updated.
+
+2006-05-03  David Turner  <david@freetype.org>
+
+       Allow compilation again with C++ compilers.
+
+       * include/freetype/internal/ftmemory.h (FT_ASSIGNP,
+       FT_ASSIGNP_INNER): New macros which do the actual assignment, and
+       which exist in two variants (for C and C++).
+       Update callers accordingly.
+
+2006-05-03  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/config/ftoption.h (FT_STRICT_ALIASING): Removed.
+
+2006-05-02  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/ftmemory.h: s/new/newsz/ (for C++).
+       (FT_ALLOC): Remove redundant redefinition.
+
+       * builds/compiler/gcc-dev.mk (CFLAGS) [g++]: Don't use
+       `-Wstrict-prototypes'.
+
+       * src/base/ftstream.c (FT_Stream_EnterFrame): Add cast.
+
+       * include/freetype/config/ftconfig.h (FT_BASE_DEF) [__cplusplus]:
+       Remove `extern'.
+
+2006-05-02  David Turner  <david@freetype.org>
+
+       Update the memory management functions and macros to safely deal
+       with array size buffer overflows.  This corresponds to attempts to
+       allocate arrays that are too large.  For an example, consider the
+       following code:
+
+         count = read_uint32_from_file(); array = malloc( sizeof ( Item ) *
+         count ); for ( nn = 0; nn < count; nn++ )
+           array[nn] = read_item_from_file();
+
+       If `count' is larger than `FT_UINT_MAX/sizeof(Item)', the
+       multiplication overflows, and the array allocated os smaller than
+       the data read from the file.  In this case, the heap will be
+       trashed, and this can be used as a denial-of-service attack, or make
+       the engine crash later.
+
+       The FT_ARRAY_NEW and FT_ARRAY_RENEW macros now ensure that the new
+       count is no larger than `FT_INT_MAX/item_size', otherwise a new
+       error code `FT_Err_Array_Too_Large' will be returned.
+
+       Note that the memory debugger now works again when FT_DEBUG_MEMORY
+       is defined.  FT_STRICT_ALIASING has disappeared; the corresponding
+       code is now the default.
+
+
+       * include/freetype/config/ftconfig.h (FT_BASE_DEF) [!__cplusplus]:
+       Don't use `extern'.
+
+       * include/freetype/fterrdef.h (FT_Err_Array_Too_Large): New error
+       code.
+
+       * include/freetype/internal/ftmemory.h (FT_DEBUG_INNER)
+       [FT_DEBUG_MEMORY]: New macro.
+       (ft_mem_realloc, ft_mem_qrealloc): Pass new object size count also.
+       (ft_mem_alloc_debug, ft_mem_qalloc_debug, ft_mem_realloc_debug,
+       ft_mem_qrealloc_debug, ft_mem_free_debug): Removed.
+       (FT_MEM_ALLOC, FT_MEM_REALLOC, FT_MEM_QALLOC, FT_MEM_QREALLOC,
+       FT_MEM_FREE): Redefine.
+       (FT_MEM_NEW_ARRAY, FT_MEM_RENEW_ARRAY, FT_MEM_QNEW_ARRAY,
+       FT_MEM_QRENEW_ARRAY): Redefine.
+       (FT_ALLOC_MULT, FT_REALLOC_MULT, FT_MEM_QALLOC_MULT,
+       FT_MEM_QREALLOC_MULT): New macros.  Update callers where
+       appropriate.
+       (FT_MEM_SET_ERROR): Slightly redefine.
+
+
+       * src/base/ftdbgmem.c (_ft_debug_file, _ft_debug_lineno)
+       [FT_DEBUG_MEMORY]: New global variables, replacing...
+       (FT_MemTable_Rec) [FT_DEBUG_MEMORY]: Remove `filename' and
+       `line_no'.  Update all callers.
+       (ft_mem_debug_alloc) [FT_DEBUG_MEMORY]: Avoid possible integer
+       overflow.
+       (ft_mem_alloc_debug, ft_mem_realloc_debug, ft_mem_qalloc_debug,
+       ft_mem_qrealloc_debug, ft_mem_free_debug): Removed.
+
+       * src/base/ftmac.c (read_lwfn): Catch integer overflow.
+       * src/base/ftrfork.c (raccess_guess_darwin_hfsplus): Ditto.
+       * src/base/ftutil.c: Remove special code for FT_STRICT_ALIASING.
+       (ft_mem_alloc, ft_mem_realloc, ft_mem_qrealloc): Rewrite.
+
+
+       * include/freetype/ftstream.h (FT_FRAME_ENTER, FT_FRAME_EXIT,
+       FT_FRAME_EXTRACT, FT_FRAME_RELEASE): Use FT_DEBUG_INNER to report the
+       place where the frames were entered, extracted, exited or released
+       in the memory debugger.
+
+       * src/base/ftstream.c (FT_Stream_ReleaseFrame) [FT_DEBUG_MEMORY]:
+       Call ft_mem_free.
+       (FT_Stream_EnterFrame) [FT_DEBUG_MEMORY]: Use ft_mem_qalloc.
+       (FT_Stream_ExitFrame) [FT_DEBUG_MEMORY]: Use ft_mem_free.
+
+2006-04-30  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftobjs.c (Mac_Read_POST_Resource): Correct pfb_pos
+       initialization, remove extra cast to copy to pfb_lenpos.  This fixes
+       parsing of PFB fonts with MacOS resource fork (bug introduced
+       2003-09-11).  Patch provided by Huib-Jan Imbens <ft@imbens.nl>.
+
+2006-04-29  Werner Lemberg  <wl@gnu.org>
+
+       Further C library abstraction.  Based on a patch from
+       msn2@bidyut.com.
+
+       * include/freetype/config/ftstdlib.h (FT_CHAR_BIT, FT_FILE,
+       ft_fopen, ft_fclose, ft_fseek, ft_ftell, ft_fread, ft_smalloc,
+       ft_scalloc, ft_srealloc, ft_sfree, ft_labs): New wrapper macros for
+       C library functions.  Update all users accordingly (and catch some
+       other places where the C library function was used instead of the
+       wrapper functions).
+
+       * src/base/ftsystem.c: Don't include stdio.h and stdlib.h.
+       * src/gzip/zutil.h [MSDOS && !(__TURBOC__ || __BORLANDC__)]: Don't
+       include malloc.h.
+
+
+       * builds/unix/unix-def.in (datarootdir): Define, for autoconf 2.59c
+       and forthcoming versions.
+
+2006-04-28  Werner Lemberg  <wl@gnu.org>
+
+       * src/lzw/ftlzw.c, src/lzw/zopen.c, src/lzw/zopen.h: Removed,
+       obsolete.
+
+2006-04-27  yi luo  <luoyi.ly@gmail.com>
+
+       * builds/win32/visualc/freetype.vcproj: Updated.
+
+2006-04-26  David Turner  <david@freetype.org>
+
+
+       * Version 2.2 released.
+       =======================
+
+
+       Tag sources with `VER-2-2-0'.
+
+2006-04-26  Werner Lemberg  <wl@gnu.org>
+
+       * src/psaux/psobjs.c (shift_elements): Don't use FT_Long but
+       FT_PtrDiff for `delta'.  Reported by Céline PILLET
+       <Celine.Pillet@Tagginfo.com>.
+
+2006-04-21  David Turner  <david@freetype.org>
+
+       * include/freetype/ftincrem.h: Documentation updates.
+       (FT_Incremental_Interface): New typedef.
+
+       * include/freetype/ftmodapi.h, include/freetype/ftglyph.h:
+       Documentation updates.
+
+       * include/freetype/freetype.h: Documentation update.
+       (FT_HAS_FAST_GLYPHS): Always set to 0.
+
+       * include/freetype/ftstroke.h, src/base/ftstroke.c (FT_Stroker_New):
+       Take an FT_Library argument instead of FT_Memory.
+
+       * src/sfnt/ttcmap.c: Remove compiler warnings (gcc-4.0.2).
+
+2006-04-13  David Turner  <david@freetype.org>
+
+       * src/autofit/afloader.c (af_loader_init, af_loader_load_g): Remove
+       superfluous code in the auto-fitter's loader.
+
+2006-04-05  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * builds/amiga/makefile, builds/amiga/makefile.os4,
+       builds/amiga/smakefile: Added FT2_BUILD_LIBRARY define.
+
+2006-04-03  luoyi  <luoyi.ly@gmail.com>
+
+       * builds/compiler/intelc.mk (TE): New variable.
+       (ANSIFLAGS): Updated.
+
+2006-04-03  Werner Lemberg  <wl@gnu.org>
+
+       * builds/exports.mk (clean_symbols_list, clean_apinames): Removed.
+       (CLEAN): Add $(EXPORTS_LIST) and $(APINAMES_EXE).
+       (.PHONY): Updated.
+
+       * configure.ac: Minor fixes to improve --help output.
+
+
+       * docs/PROBLEMS: New file.
+
+2006-04-01  David Turner  <david@freetype.org>
+
+       * docs/CHANGES: Updated.
+
+       * include/freetype/ftcache.h, include/freetype/config/ftheader.h:
+       Update documentation comments.
+
+2006-04-01  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/install.mk (uninstall): Don't handle `cache'
+       directory which no longer exists.
+
+2006-03-29  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * src/psaux/psconv.c: Changed some variables which are expected to
+       hold negative values from `char' to `FT_Char' to allow building with
+       a compiler where `char' is unsigned by default.
+
+2006-03-27  David Turner  <david@freetype.org>
+
+       * src/sfnt/ttkern.c (tt_face_get_kerning): Fix a serious bug that
+       causes some programs to go into an infinite loop when dealing with
+       fonts that don't have a properly sorted kerning sub-table.
+
+2006-03-26  Werner Lemberg  <wl@gnu.org>
+
+       * src/bdf/bdflib.c (ERRMSG4): New macro.
+       (_bdf_parse_glyphs): Handle invalid BBX values.
+
+       * include/freetype/fterrdef.h (FT_Err_Bbx_Too_Big): New error
+       macro.
+
+2006-03-23  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+
+       * src/tools/docmaker/tohtml.py (html_header_2): Add horizontal
+       padding between table elements.
+       (html_header_1): The `DOCTYPE' comment must be in uppercase.
+       (make_html_para): Convert `...' quotations into real left and
+       right single quotes.
+       Use `para_header' and `para_footer'.
+
+       * src/tools/docmaker/sources.py (re_bold, re_italic): Accept "'"
+       also.
+
+2006-03-23  David Turner <david@freetype.org>
+
+       Add FT_Get_SubGlyph_Info API to retrieve subglyph data.  Note that
+       we do not expose the FT_SubGlyphRec structure.
+
+       * include/freetype/internal/ftgloadr.h (FT_SUBGLYPH_FLAGS_*): Moved
+       to...
+       * include/freetype/freetype.h (FT_SUBGLYPH_FLAGS_*): Here.
+       (FT_Get_SybGlyph_Info): New declaration.
+
+       * src/base/ftobjs.c (FT_Get_SubGlyph_Info): New function.
+
+
+       * src/autofit/afloader.c (af_loader_load_g): Compute lsb_delta and
+       rsb_delta correctly in edge cases.
+
+2006-03-22  Werner Lemberg  <wl@gnu.org>
+
+       * src/cache/ftccache.c, (ftc_node_mru_up, FTC_Cache_Lookup)
+       [!FTC_INLINE]: Compile conditionally.
+       * src/cache/ftccache.h: Updated.
+
+       * src/cache/ftcglyph.c (FTC_GNode_Init, FTC_GNode_UnselectFamily,
+       FTC_GNode_Done, FTC_GNode_Compare, FTC_Family_Init, FTC_GCache_New):
+       s/FT_EXPORT/FT_LOCAL/.
+       (FTC_GCache_Init, FTC_GCache_Done): Commented out.
+       (FTC_GCache_Lookup) [!FTC_INLINE]: Compile conditionally.
+       s/FT_EXPORT/FT_LOCAL/.
+       * src/cache/ftcglyph.h: Updated.
+
+       * src/cache/ftcimage.c (FTC_INode_Free, FTC_INode_New):
+       s/FT_EXPORT/FT_LOCAL/.
+       (FTC_INode_Weight): Commented out.
+       * src/cache/ftcimage.h: Updated.
+
+       * src/cache/ftmanag.c (FTC_Manager_Compress,
+       FTC_Manager_RegisterCache, FTC_Manager_FlushN):
+       s/FT_EXPORT/FT_LOCAL/.
+       * src/cache/ftmanag.h: Updated.
+
+       * src/cache/ftcsbits.c (FTC_SNode_Free, FTC_SNode_New,
+       FTC_SNode_Compare): s/FT_EXPORT/FT_LOCAL/.
+       (FTC_SNode_Weight): Commented out.
+       * src/cache/ftcsbits.h: Updated.
+
+2006-03-22  Werner Lemberg  <wl@gnu.org>
+
+       * src/cache/ftccache.c, src/cache/ftccache.h (FTC_Node_Destroy):
+       Remove, unused.
+
+       * src/cache/ftccmap.h: Remove, unused.
+
+       * src/cache/rules.mk (CACHE_DRV_H): Remove ftccmap.h.
+
+2006-03-21  Zhe Su  <james.su@gmail.com>
+
+       * src/base/ftoutln.c (FT_Outline_Get_Orientation): Improve
+       algorithm.
+
+2006-03-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cfftypes.h (CFF_CharsetRec): Add `max_cid' member.
+
+       * src/cff/cffload.c (cff_charset_load): Set `charset->max_cid'.
+
+       * src/cff/cffgload.c (cff_slot_load): Change type of third parameter
+       to `FT_UInt'.
+       Check range of `glyph_index'.
+       * src/cff/cffgload.h: Updated.
+
+
+       * src/sfnt/ttcmap.c (tt_face_build_cmaps): Handle invalid offset
+       correctly.
+
+
+       * builds/freetype.mk (refdoc), docs/CHANGES, Jamfile (RefDoc),
+       README: s/2.1.10/2.2/.
+
+2006-03-21  David Turner  <david@freetype.org>
+
+       * src/autofit/aflatin.c (af_latin_metrics_scale): Fix small bug
+       that crashes the auto-hinter (introduced by previous patch).
+
+2006-03-20  Werner Lemberg  <wl@gnu.org>
+
+       * builds/freetype.mk (CACHE_DIR, CACHE_H): Remove.
+       (FREETYPE_H): Updated.
+
+       * src/cache/rules.mk (CACHE_H_DIR): Remove.
+       (CACHE_DRV_H): Updated.
+
+2006-03-20  David Turner  <david@freetype.org>
+
+       * include/freetype/cache/ftccache.h,
+       include/freetype/cache/ftccmap.h, include/freetype/cache/ftcglyph.h
+       include/freetype/cache/ftcimage.h include/freetype/cache/ftcmanag.h
+       include/freetype/cache/ftcmru.h include/freetype/cache/ftcsbits.h:
+       Move to...
+
+       * src/cache/ftccache.h, src/cache/ftcglyph.h, src/cache/ftcimage.h,
+       src/cache/ftcsbits.h, src/cache/ftcmanag.h, src/cache/ftccmap.h,
+       src/cache/ftcmru.h: This new location.
+       Update declarations according to the changes in the corresponding
+       source files.
+
+       Note that these files are not used by FreeType clients; all public
+       APIs of the cache module have been already moved to
+       `include/freetype/ftcache.h', and all FT_CACHE_INTERNAL_XXXX_H
+       macros resolve to it.
+
+       Reason for the move is to allow modifications of the internals
+       without interferences with rogue clients.  Note that there are no
+       known clients that access the cache internals at the moment.
+
+       * builds/unix/install.mk (install): Don't install headers from
+       $(CACHE_H).
+       Remove `freetype/cache' from the target directory.
+
+       * include/freetype/config/ftheader.h (FT_CACHE_MANAGER_H,
+       FT_CACHE_INTERNAL_MRU_H, FT_CACHE_INTERNAL_MANAGER_H,
+       FT_CACHE_INTERNAL_CACHE_H, FT_CACHE_INTERNAL_GLYPH_H,
+       FT_CACHE_INTERNAL_IMAGE_H, FT_CACHE_INTERNAL_SBITS_H): Point to
+       FT_CACHE_H.
+
+       * src/cache/ftcbasic.c, src/cache/ftccache.h, src/cache/ftccback.h,
+       src/cache/ftccmap.c, src/cache/ftcglyph.c, src/cache/ftcglyph.h,
+       src/cache/ftcimage.c, src/cache/ftcimage.h, src/cache/ftcmanag.c,
+       src/cache/ftcmanag.h, src/cache/ftcmru.h, src/cache/ftcsbits.c,
+       src/cache/ftcsbits.h: Don't use the FT_CACHE_INTERNAL_XXX_H macros
+       but include the headers directly (which are now in `src/cache').
+
+       * src/cache/ftccache.c:  Don't use the FT_CACHE_INTERNAL_XXX_H
+       macros but include the headers directly.
+       (FTC_Cache_Init, FTC_Cache_Done, FTC_Cache_NewNode,
+       FTC_Cache_Lookup, FTC_Cache_RemoveFaceID): Declare as FT_LOCAL_DEF.
+
+       * src/cache/ftccache.c:  Don't use the FT_CACHE_INTERNAL_XXX_H
+       macros but include the headers directly.
+       (FTC_MruNode_Prepend, FTC_MruNode_Up, FTC_MruNode_Remove,
+       FTC_MruList_Init, FTC_MruList_Reset, FTC_MruList_Done,
+       FTC_MruList_New, FTC_MruList_Remove, FTC_MruList_RemoveSelection):
+       Declare as FT_LOCAL_DEF.
+       (FTC_MruListFind, FTC_MruList_Lookup) [!FTC_INLINE]: Compile
+       conditionally.
+       Declare as FT_LOCAL_DEF.
+
+
+       * builds/win32/visualc/freetype.dsp: Update project file, add
+       missing base source files (ftstroke.c, ftxf86.c, etc.).
+
+
+       * src/autofit/afcjk.c, src/autofit/aflatin.c, src/base/ftobjs.c,
+       src/cff/cffobjs.c, src/cid/cidobjs.c, src/pfr/pfrobjs.c,
+       src/sfnt/sfobjs.c, src/sfnt/ttmtx.c, src/type1/t1afm.c,
+       src/type1/t1objs.c: Remove compiler warnings when building with
+       Visual C++ 6 and /W4.
+
+       * src/autofit/aflatin.c (af_latin_hints_init): Disable horizontal
+       hinting for italic/oblique fonts.
+
+
+
+       * src/truetype/ttpload.c, src/truetype/ttpload.h
+       (tt_face_get_device_metrics): Change second argument to `FT_UInt'.
+
+2006-03-06  David Turner  <david@freetype.org>
+
+       * src/cache/ftcmanag.c (FTC_Manager_Lookup_Size): Prevent crashes in
+       Mozilla/FireFox print preview in Ubuntu Hoary.
+
+2006-02-28  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/base/ftutil.c (ft_mem_qalloc) [FT_STRICT_ALIASING]: Do not
+       return error when size == 0.
+
+2006-02-28  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/base/ftobjs.c (FT_Done_Library): Remove modules in reverse
+       order so that type42 module is removed before truetype module.  This
+       avoids double free in some occasions.
+
+2006-02-28  David Turner  <david@freetype.org>
+
+       * Release candidate VER-2-2-0-RC4.
+       ----------------------------------
+
+       * docs/CHANGES: Documentation updates.
+
+2006-02-28  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * modules.cfg (BASE_EXTENSIONS): Compile in ftgxval.c by default to
+       build ftvalid in ft2demos.  It works as dummy ABI if gxvalid is not
+       built.
+
+2006-02-27  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/cache/ftccache.h
+       [FT_CONFIG_OPTION_OLD_INTERNALS]: Remove declaration of
+       ftc_node_done.
+
+       * src/cache/ftccache.c (ftc_node_destroy)
+       [!FT_CONFIG_OPTION_OLD_INTERNALS]: Mark as FT_LOCAL_DEF.  This
+       should now fix all possible compilation options.
+
+2006-02-27  David Turner  <david@freetype.org>
+
+       * src/base/ftutil.c (ft_mem_alloc, ft_mem_qalloc, ft_mem_realloc,
+       ft_mem_qrealloc): Return an error if a negative size is passed in
+       parameters.
+
+       * src/cache/ftccache.c (ftc_node_destroy): Mark as FT_BASE_DEF since
+       it needs to be exported for rogue clients.
+
+       * src/pshinter/pshglob.c (psh_blues_set_zones_0): Prevent problems
+       with malformed fonts which have an odd number of blue values (these
+       are broken according to the specs).
+
+       * src/cff/cffload.c (cff_subfont_load), src/type1/t1load.c
+       (T1_Open_Face): Modify the loaders to force even-ness of
+       `num_blue_values'.
+
+       (cff_index_access_element): Ignore invalid entries in index files.
+
+2006-02-27  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/base/ftobjs.c (FT_Set_Char_Size): Check the case where width
+       or height is 0.
+
+2006-02-27  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/mac/FreeType.m68k_cfm.make.txt,
+       builds/mac/FreeType.m68k_far.make.txt,
+       builds/mac/FreeType.ppc_carbon.make.txt,
+       builds/mac/FreeType.ppc_classic.make.txt: Update to new header
+       inclusion introduced on 2006-02-16.
+
+2006-02-27  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/base/ftobjs.c (GRID_FIT_METRICS): New macro.
+       (ft_glyphslot_grid_fit_metrics, FT_Load_Glyph) [GRID_FIT_METRICS]:
+       Re-enable glyph metrics grid-fitting.  It is now done in the base
+       layer.
+       (FT_Set_Char_Size, FT_Set_Pixel_Sizes): Make sure the width and
+       height are not too small or too large, just like we were doing in
+       2.1.10.
+
+       * src/autofit/afloader.c (af_loader_load_g): The vertical metrics
+       are not scaled.
+
+2006-02-26  Werner Lemberg  <wl@gnu.org>
+
+       * docs/release: Minor additions and clarifications.
+
+       * docs/CHANGES: Updated to reflect many fixes for backwards
+       compatibility.  Still incomplete.
+
+2006-02-26  David Turner  <david@freetype.org>
+
+       * src/base/ftobjs.c (ft_recompute_scaled_metrics): Re-enable
+       conservative rounding of metrics to avoid breaking clients like
+       Pango (see http://bugzilla.gnome.org/show_bug.cgi?id=327852).
+
+2006-02-25  Werner Lemberg  <wl@gnu.org>
+
+       * devel/ftoption.h: Synchronize with
+       include/freetype/config/ftoption.h.
+
+       * src/cache/ftccache.c (ftc_node_destroy): Use FT_LOCAL_DEF (again).
+
+2006-02-25  David Turner  <david@freetype.org>
+
+       Fix compiler warnings as well as C++ compilation problems.
+       Add missing prototypes.
+
+       * src/autofit/afcjk.c, src/base/ftobjs.c, src/base/ftutil.c,
+       src/bdf/bdfdrivr.c, src/cff/cffcmap.c, src/cff/cffobjs.c,
+       src/psaux/afmparse.c,, src/psaux/t1cmap.c, src/smooth/ftgrays.c
+       src/tools/apinames.c, src/truetype/ttdriver.c: Add various casts,
+       initialize variables, and decorate functions with FT_CALLBACK_DEF,
+       etc., to fix compiler warnings (and C++ compiling errors).
+
+       * src/cache/ftcbasic.c: Fix `-Wmissing-prototypes' warnings with
+       gcc.
+
+       * builds/unix/ftsystem.c: Don't include FT_INTERNAL_OBJECTS_H but
+       FT_INTERNAL_STREAM_H.
+
+       * src/base/ftsystem.c: Include FT_INTERNAL_STREAM_H.
+
+       * include/freetype/config/ftheader.h (FT_PFR_H): New macro.
+
+       * include/freetype/config/ftoption.h (FT_STRICT_ALIASING): Don't
+       define for C++.
+
+       * include/freetype/internal/services/svotval.h: Don't include
+       FT_OPENTYPE_VALIDATE_H but FT_INTERNAL_VALIDATE_H.
+
+       * include/freetype/internal/services/svpfr.h: Include FT_PFR_H.
+
+       * src/gzip/ftgzip.c: Include FT_GZIP_H.
+
+       * src/lzw/ftlzw.c, src/lzw/ftlzw2.c: Include FT_LZW_H.
+
+       * src/sfnt/ttbdf.c (tt_face_load_bdf_props): Rearrange code.
+
+2006-02-24  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/base/ftoutln.c (FT_OUTLINE_GET_CONTOUR, ft_contour_has,
+       ft_contour_enclosed, ft_outline_get_orientation): Commented out.  We
+       have to wait until `FT_GlyphSlot_Own_Bitmap' is stabilized.
+       (FT_Outline_Embolden): Use `FT_Outline_Get_Orientation'.
+
+2006-02-24  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * include/freetype/ftbitmap.h (FT_Bitmap_Embolden): Update
+       documentation.
+
+       * include/freetype/ftsynth.h (FT_GlyphSlot_Own_Bitmap),
+       src/base/ftsynth.c (FT_GlyphSlot_Own_Bitmap): New function to make
+       sure a glyph slot owns its bitmap.  It is also marked experimental
+       and due to change.
+       (FT_GlyphSlot_Embolden): Undo the last change.  It turns out that
+       rendering the outline confuses some applications.
+
+2006-02-24  David Turner  <david@freetype.org>
+
+       * Release candidate VER-2-2-0-RC3.
+       ----------------------------------
+
+       * src/cache/ftcbasic.c: Correct compatibility hack bug.
+
+2006-02-24  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * include/freetype/freetype.h (FT_Size_RequestRec): Change the type
+       of `width' and `height' to `FT_Long'.
+       (enum FT_Size_Request_Type), src/base/ftobjs.c (FT_Request_Metrics):
+       New request type `FT_SIZE_REQUEST_TYPE_SCALES' to specify the scales
+       directly.
+
+2006-02-23  David Turner  <david@freetype.org>
+
+       Two BDF patches from Debian libfreetype6 for 2.1.10.
+
+       * src/bdf/bdflib.c (_bdf_parse_glyphs): Fix a bug with zero-width
+       glyphs.
+       Fix a problem with large encodings.
+
+
+       Fix binary compatibility issues for gnustep-back (GNUstep backend
+       module) which still crashes under Sarge.
+
+       * src/cache/ftccmap.c (FTC_OldCMapType, FTC_OldCMapIdRec,
+       FTC_OldCMapDesc) [FT_CONFIG_OPTION_OLD_INTERNALS]: New data
+       structures and enumerations.
+       (FTC_CMapCache_Lookup) [FT_CONFIG_OPTION_OLD_INTERNALS]: New
+       compatibility code.
+
+       * src/cache/ftcbasic.c: Fix a silly bug that prevented our `hack' to
+       support rogue clients compiled against 2.1.7 to work correctly.
+       This probably explains the GNUstep crashes with the second release
+       candidate.
+
+2006-02-23  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * include/freetype/ftoutln.h (enum FT_Orientation): New value
+       `FT_ORIENTATION_NONE'.
+
+       * src/base/ftoutln.c (FT_OUTLINE_GET_CONTOUR, ft_contour_has,
+       ft_contour_enclosed, ft_outline_get_orientation): Another version of
+       `FT_Outline_Get_Orientation'.  This version differs from the public
+       one in that each part (contour not enclosed in another contour) of the
+       outline is checked for orientation.
+       (FT_Outline_Embolden): Use `ft_outline_get_orientation'.
+
+       * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Render the outline and
+       use bitmap's embolden routine when the outline one failed.
+
+2006-02-22  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * modules.cfg: Compile in ftotval.c and ftxf86.c by default for ABI
+       compatibility.
+
+       * src/sfnt/sfobjs.c (sfnt_done_face): Fix a memory leak.
+
+       * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_bit_aligned,
+       tt_sbit_decoder_load_byte_aligned) [FT_OPTIMIZE_MEMORY]: Fix sbit
+       loading.  (Only tested with bit aligned sbit with x_pos == 0.)
+
+       * src/truetype/ttpload.c (tt_face_load_hdmx,
+       tt_face_get_device_metrics) [FT_OPTIMIZE_MEMORY]: `hdmx' is not
+       actually used.
+
+2006-02-21  David Turner  <david@freetype.org>
+
+       Add a new API named FT_Get_TrueType_Engine_Type to determine whether
+       we have a patented, unpatented, or unimplemented TrueType bytecode
+       interpreter.
+
+       The FT_Get_Module_Flags API was removed consequently.
+
+       * include/freetype/ftmodapi.h (FT_Module_Get_Flags): Removed.
+       Replaced with...
+       (FT_Get_TrueType_Engine_Type): This.
+       (FT_TrueTypeEngineType): New enumeration.
+
+       * include/freetype/internal/ftserv.h (FT_SERVICE_TRUETYPE_ENGINE_H):
+       New macro.
+
+       * src/base/ftobjs.c: Include FT_SERVICE_TRUETYPE_ENGINE_H.
+       (FT_Module_Get_Flags): Removed.  Replaced with...
+       (FT_Get_TrueType_Engine_Type): This.
+
+       * src/truetype/ttdriver.c: Include FT_SERVICE_TRUETYPE_ENGINE_H.
+       (tt_service_truetype_engine): New service structure.
+       (tt_services): Register it.
+
+       * include/freetype/internal/services/svtteng.h: New file.
+
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Fix silly bug that prevented
+       embedded bitmaps from being correctly listed and used.
+
+
+       * src/sfnt/ttmtx.c (tt_face_load_hmtx): Disable memory optimization
+       if FT_CONFIG_OPTION_OLD_INTERNALS is used.  The is necessary because
+       libXfont is directly accessing the HMTX data, unfortunately.
+       Fix some compiler warnings.
+       (tt_face_get_metrics): Ditto.
+
+
+       * src/pfr/pfrsbit.c (pfr_slot_load_bitmap): Fix handling of
+       character advances.
+
+2006-02-20  David Turner  <david@freetype.org>
+
+       Support binary compatibility with the X.Org server's Xfont library.
+       Note that this change unfortunately prevents memory optimizations
+       for the embedded bitmap loader.
+
+       * include/freetype/internal/sfnt.h (SFNT_Interface): Move
+       `set_sbit_strike' and `load_sbit_metrics' fields to the location of
+       version 2.1.8.
+
+       * src/sfnt/sfdriver.c (tt_face_set_sbit_strike_stub): Call
+       FT_Size_Request.
+       (sfnt_interface): Updated.
+
+       * src/sfnt/ttsbit.c [FT_CONFIG_OPTION_OLD_INTERNALS]: Don't load
+       ttsbit0.c.
+       (tt_load_sbit_metrics): Make `sbit_small_metrics_fields' static.
+
+       * src/sfnt/ttsbit.h: Updated.
+
+2006-02-17  David Turner  <david@freetype.org>
+
+       * builds/unix/unix-cc.in (LINK_LIBRARY): Don't filter out exported
+       functions anymore.  This ensures that all FT_BASE internal functions
+       are available for dynamic linking.
+
+       * include/freetype/ftcache.h (FTC_IMAGE_TYPE_COMPARE,
+       FTC_IMAGE_TYPE_HASH), src/cache/ftcbasic.c (FTC_OldFontRec,
+       FTC_OldImageDescRec, FTC_ImageCache_Lookup, FTC_Image_Cache_New,
+       FTC_OldImage_Desc, FTC_OLD_IMAGE_FORMAT, ftc_old_image_xxx,
+       ftc_image_type_from_old_desc, FTC_Image_Cache_Lookup,
+       FTC_SBitCache_Lookup, FTC_SBit_Cache_New, FTC_SBit_Cache_Lookup)
+       [FT_CONFIG_OPTION_OLD_INTERNALS]: Try to revive old functions of the
+       cache sub-system.  We try to recognize old legacy signatures with a
+       gross hack (hope it works).
+
+2006-02-17  Werner Lemberg  <wl@gnu.org>
+
+       * devel/ftoption.h: Synchronize with
+       include/freetype/config/ftoption.h.
+
+2006-02-16  David Turner  <david@freetype.org>
+
+       Massive changes to the internals to respect the internal object
+       layouts and exported functions of FreeType 2.1.7.  Note that the
+       cache sub-system cannot be fully retrofitted, unfortunately.
+
+       * include/freetype/config/ftoption.h
+       (FT_CONFIG_OPTION_OLD_INTERNALS): New macro.
+
+       * include/freetype/ftcache.h, include/freetype/cache/ftccache.h,
+       include/freetype/cache/ftccmap.h,
+       include/freetype/internal/ftcalc.h,
+       include/freetype/internal/ftdriver.h,
+       include/freetype/internal/ftmemory.h,
+       include/freetype/internal/ftobjs.h,
+       include/freetype/internal/psaux.h, include/freetype/internal/sfnt.h,
+       include/freetype/internal/t1types.h,
+       include/freetype/internal/tttypes.h, src/base/ftcalc.c,
+       src/base/ftdbgmem.c, src/base/ftobjs.c, src/base/ftutil.c,
+       src/bdf/bdfdrivr.c, src/cache/ftccache.c, src/cache/ftccback.h,
+       src/cache/ftcmanag.c, src/cff/cffdrivr.c, src/cid/cidriver.c,
+       src/pcf/pcfdrivr.c, src/pfr/pfrdrivr.c, src/psaux/psauxmod.c,
+       src/sfnt/sfdriver.c, src/truetype/ttdriver.c, src/type1/t1driver.c,
+       src/type1/t1objs.c, src/type42/t42drivr.c, src/winfonts/winfnt.c:
+       Use FT_CONFIG_OPTION_OLD_INTERNALS to revive old functions and data
+       structures.
+
+       Move newly added structure elements to the end of the affected
+       structure and add stub fields (if FT_CONFIG_OPTION_OLD_INTERNALS is
+       defined) to assure binary compatibility with older FreeType
+       versions.
+       Use FT_CONFIG_OPTION_OLD_INTERNALS to add function stubs for old
+       functions:
+
+         ft_stub_set_char_sizes
+         ft_stub_set_pixel_sizes
+
+       Rename the following internal functions to provide the old function
+       names as stubs:
+
+         FT_Alloc          -> ft_mem_alloc
+         FT_QAlloc         -> ft_mem_qalloc
+         FT_Realloc        -> ft_mem_realloc
+         FT_QRealloc       -> ft_mem_qrealloc
+         FT_Free           -> ft_mem_free
+         FT_Alloc_Debug    -> ft_mem_alloc_debug
+         FT_QAlloc_Debug   -> ft_mem_qalloc_debug
+         FT_Realloc_Debug  -> ft_mem_realloc_debug
+         FT_QRealloc_Debug -> ft_mem_qrealloc_debug
+         FT_Free_Debug     -> ft_mem_free_debug
+
+2006-02-15  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Remove
+       unused `max_points' and `max_contours'.
+
+       * src/cid/cidobjs.c (cid_face_init), src/type1/t1objs.c
+       (T1_Face_Init), src/type42/t42objs.c (T42_Face_Init): Update.
+
+       * include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused
+       `max_components'.
+
+       * src/truetype/ttinterp.h (TT_ExecContextRec): Remove unused
+       `loadSize' and `loadStack'.
+
+       * src/truetype/ttinterp.c (TT_Done_Context, TT_Load_Context),
+       src/sfnt/ttload.c (tt_face_load_maxp): Update.
+
+       * src/cff/cffobjs.h (cff_size_select), src/sfnt/sfdriver.c
+       (sfnt_interface), src/truetype/ttdriver.c (tt_size_request): Fix
+       compiler errors/warnings when TT_CONFIG_OPTION_EMBEDDED_BITMAPS is not
+       defined.
+
+       * src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics): Fix
+       possible segment faults for the non-FT_OPTIMIZE_MEMORY'ed versions.
+       (finally!)
+
+
+       For most OpenType tables, `tt_face_load_xxxx' simply loads the table
+       and `face->root' is set later in `sfnt_load_face'.  Here, we try to
+       make this work for _all_ tables.  Also improve tracing messages.
+
+       * src/sfnt/ttsbit.c, src/sfnt/ttsbit0.c, src/sfnt/ttload.c,
+       src/sfnt/ttmtx.c: all `tt_face_load_xxxx' should load the table and
+       then exit.  Error handling or setting face->root is done later in
+       `sfnt_load_face'.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Work harder.
+       Mac bitmap-only fonts are not scalable.
+       Check that `face->header.Units_Per_EM' is not zero.
+       (LOAD_, LOADM_): Emit pretty trace messages.
+
+       * src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Read metrics
+       from `eblc'.
+
+       * src/sfnt/ttcmap.c (tt_face_build_cmaps), src/sfnt/ttpost.c
+       (load_format_20, load_format_25, tt_face_get_ps_name): Use
+       face->max_profile.numGlyphs, instead of face->root.num_glyphs.
+
+2006-02-14  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/ftoutln.h (FT_Outline_Embolden): Mention in
+       documentation that negative strength values are possible.
+       Give an example call.
+
+       * include/freetype/freetype.h (FT_GlyphSlotRec): Improve
+       documentation of `outline' field.
+
+       * src/sfnt/sfobjc.s: Inckude FT_INTERNAL_DEBUG_H.
+       * src/sfnt/sfdriver.c: Include ttmtx.h.
+
+       * src/autofit/afcjk.c: Include aftypes.h and aflatin.h.
+
+2006-02-14  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/sfnt/ttmtx.c (tt_face_get_metrics): Typo.
+
+2006-02-14  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/sfnt/ttmtx.c (tt_face_load_hhea, tt_face_load_hmtx): Simply
+       return error if table is missing.
+       Check table length in non-FT_OPTIMIZE_MEMORY'ed `tt_face_load_hmtx'.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Take care of missing metrics
+       tables.  The last change makes Mac bitmap-only font not load and
+       this fixes it.
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Fix compilation
+       error when FT_CONFIG_OPTION_INCREMENTAL is defined.
+
+2006-02-13  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       Clean up the SFNT_Interface.  In this final pass, `load_hmtx' is
+       split from `load_hhea'.
+
+       * include/freetype/internal/sfnt.h, src/sfnt/sfdriver.c,
+       src/sfnt/ttmtx.c, src/sfnt/ttmtx.h: Split `hmtx' from `hhea'.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Update.
+
+2006-02-13  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/sfnt/ttmtx.h, src/sfnt/ttmtx.c: Why are there two copies of
+       code...
+
+2006-02-13  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       Clean up the SFNT_Interface.  In this pass, we want to treat the
+       font directory (offset table and table directory) as a normal table
+       like the others.  This also means that TTCs are no longer recognized
+       there but in `init_face'.
+
+       * include/freetype/internal/sfnt.h (SFNT_Interface),
+       src/sfnt/sfdriver.c: `load_sfnt_header' and `load_directory' are
+       combined and renamed to `load_font_dir'.
+
+       * src/sfnt/ttload.h, src/sfnt/ttload.c:
+       s/sfnt_dir_check/check_table_dir/.
+       `sfnt_init' is moved to sfobjs.c and renamed to `sfnt_open_font'.
+       `tt_face_load_sfnt_header' and `tt_face_load_directory' are combined
+       and renamed to `tt_face_load_font_dir'.
+
+       * src/sfnt/sfobjs.c (sfnt_init_face): Recognize TTC here.
+
+2006-02-13  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       Clean up the SFNT_Interface.  Table loading functions are now named
+       after the tables' tags; `hdmx' is TrueType-specific and thus the
+       code is moved to the truetype module; `get_metrics' is moved here
+       from the truetype module so that the code can be shared with the cff
+       module.
+
+       This pass involves no real changes.  That is, the code is moved
+       verbatim mostly.  The only exception is the return value of
+       `tt_face_get_metrics'.
+
+       * include/freetype/internal/sfnt.h, src/sfnt/rules.mk,
+       src/sfnt/sfdriver.c, src/sfnt/sfnt.c, src/sfnt/sfobjs.c,
+       src/sfnt/ttload.c, src/sfnt/ttload.h, src/sfnt/ttsbit.c,
+       src/sfnt/ttsbit.h, src/sfnt/ttsbit0.c: Clean up the SFNT_Interface.
+
+       * src/sfnt/ttmtx.c, src/sfnt/ttmtx.h: New files.  Metrics-related
+       tables' loading and parsing code is moved to here.
+       Move `tt_face_get_metrics' here from the truetype module.  The
+       return value is changed from `void' to `FT_Error'.
+
+       * include/freetype/internal/fttrace.h: New trace: ttmtx.
+
+       * src/truetype/ttpload.c, src/truetype/ttpload.h: `hdmx' loading and
+       parsing code is moved here.
+       New function `tt_face_load_prep' split from `tt_face_load_fpgm'.
+       `tt_face_load_fpgm' returns `FT_Err_Ok' if `fpgm' doesn't exist.
+
+       * src/cff/cffgload.c, src/cff/cffobjs.c: Update.
+
+       * src/truetype/ttgload.c, src/truetype/ttobjs.c: Update.
+
+2006-02-11  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/autofit/afcjk.c (af_cjk_metrics_init): Fix a stupid bug...
+
+       * src/autofit/aflatin.c (af_latin_metrics_init_widths): Use
+       AF_LatinMetricsRec as the dummy metrics because we cast the metrics
+       to it later in `af_latin_hints_link_segments'.
+
+2006-02-11  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * include/freetype/config/ftoption.h (AF_CONFIG_OPTION_CJK): #define
+       to enable autofit CJK script support.  (#define'd by default.)
+
+       * src/autofit/aflatin.h (AF_LATIN_CONSTANT): New macro.
+
+       * src/autofit/aflatin.c (af_latin_metrics_init_widths): Make sure
+       that `edge_distance_threshold' is always set.
+       (af_latin_hints_link_segments): Potential divide-by-zero bug.
+       Use latin constant in the scoring formula.
+
+       * src/autofit/afcjk.c: Minor updates due to the above three changes.
+
+       * docs/TODO, docs/CHANGES: Updated.
+
+2006-02-09  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       Introduce experimental autofit CJK module based on akito's autohint
+       patch.  You need to #define AF_MOD_CJK in afcjk.c to enable it.
+
+       * src/autofit/afglobal.c, src/autofit/afcjk.h, src/autofit/afcjk.c,
+       src/autofit/rules.mk, src/autofit/autofit.c, src/autofit/aftypes.h:
+       Add CJK module based on akito's autohint patch.
+
+       * src/autofit/afhints.h (AF_SegmentRec): New field `len' for the
+       overlap length of the segments.
+       (AF_SEGMENT_LEN, AF_SEGMENT_DIST): New macros.
+
+       * src/autofit/aflatin.h (af_latin_metrics_init_widths),
+       src/autofit/aflatin.c (af_latin_metrics_init_widths): Made
+       `FT_LOCAL'.
+       Use the character given by the caller.
+       (af_latin_metrics_init_widths, af_latin_hints_link_segments): Scale
+       the thresholds.
+
+       * src/autofit/afloader.c (af_loader_load_g): Respect
+       AF_SCALER_FLAG_NO_ADVANCE.
+
+2006-02-09  Werner Lemberg  <wl@gnu.org>
+
+       * src/cid/cidparse.c (cid_parse_new): Remove shadowing variable.
+
+2006-02-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/cid/cidparse.c (cid_parse_new): Fix for abnormally short or
+       broken CIDFont.  Reported by Taek Kwan(TK) Lee (see ft-devel
+       2005-11-02).
+
+2006-02-08  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/unix/configure.ac: Fix bug for `--with-old-mac-fonts'
+       option on UNIX platform.  It has been broken since 2006-01-11.
+
+2006-02-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/otvalid/module.mk: s/otvalid_module_class/otv_module_class/.
+       * src/gxvalid/module.mk: s/gxvalid_module_class/gxv_module_class/.
+
+       * builds/unix/unixddef.mk: Actually do define PLATFORM (fixing
+       change from 2006-01-31).
+       (TOP_DIR, OBJ_DIR): Update.
+
+       * builds/unix/install.mk (install): Fix path for ftmodule.h.
+
+       * Makefile, *.mk, builds/unix/unix-cc.in, builds/unix-def.in: Use
+       `?=' where appropriate.
+
+       * builds/detect.mk (TOP_DIR), builds/os2/os2-dev.mk (TOP_DIR),
+       builds/win32/w32-dev.mk (TOP_DIR): Removed.  Defined elsewhere.
+
+2006-01-31  Werner Lemberg  <wl@gnu.org>
+
+       Implement new, simplified module selection.  With GNU make it is now
+       sufficient to modify a single file, `modules.cfg', to control the
+       inclusion of modules and base extension files.
+
+       This change also fixes the creation of ftmodule.h; it now depends on
+       `modules.cfg' and thus is rebuilt only if necessary.
+
+       Finally, a version of `ftoption.h' in OBJ_DIR is preferred over the
+       default location.
+
+       * modules.cfg: New file.
+
+       * builds/freetype.mk: Don't include `modules.mk'.
+       Include all `rules.mk' files as specified in `modules.cfg'.
+       (FTOPTION_FLAG, FTOPTION_H): New variables.
+       (FT_CFLAGS): Add macro definition for FT_CONFIG_MODULES_H.
+       Add FTOPTION_FLAG.
+       ($(FT_INIT_OBJ)): Don't use FT_MODULE_LIST.
+       (CONFIG_H): Add FTMODULE_H and FTOPTION_H.
+       (INCLUDES): Add DEVEL_DIR.
+       (INCLUDE_FLAGS, FTSYS_SRC, FTSYS_OBJ, FTDEBUG_SRC, FTDEBUG_OBJ,
+       OBJ_M, OBJ_S): Use `:=', not `='.
+       (remove_ftmodule_h): New phony target to delete `ftmodule.h'.
+       (distclean): Add remove_ftmodule_h.
+
+       * builds/modules.mk: (MODULE_LIST): Removed.
+       (make_module_list, clean_module_list): Replace targets
+       with...
+       (FTMODULE_H_INIT, FTMODULE_H_CREATE, FTMODULE_H_DONE): New
+       variables.  Reason for the change is that it is not possible to have
+       a phony prerequisite which is run only if the target file must be
+       rebuilt (phony prerequisites act like subroutines and are *always*
+       executed).  We only want to rebuild `ftmodule.h' if `module.cfg' is
+       changed.
+       Update all callers.
+       ($FTMODULE_H)): Rule to create `ftmodule.h', depending on
+       `modules.cfg'.
+
+       * builds/toplevel.mk: Rewrite and simplify module handling.
+       (MODULES_CFG, FTMODULE_H): New variables.
+       Include MODULES_CFG.
+       (MODULES): New variable to include all `module.mk' and `rules.mk'
+       files.  We no longer use make's `wildcard' function for this.
+
+       * Makefile (USE_MODULES): Remove.  Update all users.
+       (OBJ_DIR): Define it here.
+
+       * src/*/module.mk: Change
+
+           make_module_list: foo
+           foo: ...
+
+       to
+
+           FTMODULE_H_COMMANDS += FOO
+           define FOO
+           ...
+           endef
+
+       in all files.  `FTMODULE_H_COMMANDS' is used in `FTMODULE_H_CREATE'.
+
+       * src/base/rules.mk (BASE_EXT_SRC): Use BASE_EXTENSIONS.
+
+       * builds/unix/detect.mk (setup): Always execute `configure' script.
+       (have_mk): Rename to...
+       (have_Makefile): This.
+       Don't use `strip' function.
+
+       * builds/unix/unix.mk: Include `install.mk' only if BUILD_PROJECT is
+       defined.
+       (have_mk): Don't use `strip' function.
+       Test for unix-def.mk in OBJ_DIR, not BUILD_DIR (and invert the test
+       accordingly).
+
+       * builds/unix/install.mk (install, uninstall): Handle `ftmodule.h'.
+
+       * builds/os2/os2-dev.mk, builds/unix/unix-dev.mk,
+       builds/win32/w32-bccd.mk, builds/win32/w32-dev.mk: Don't define
+       BUILD_DIR but DEVEL_DIR for development header files.
+
+       * builds/ansi/ansi-def.mk (TOP_DIR, OBJ_DIR),
+       builds/beos/beos-def.mk (TOP_DIR, OBJ_DIR), builds/unix/unix-def.in
+       (TOP_DIR, OBJ_DIR): Removed.  Defined elsewhere.
+
+       * builds/dos/dos-def.mk (OBJ_DIR), builds/os2/os2-def.mk (OBJ_DIR),
+       builds/win32/win32-def.mk (OBJ_DIR): Removed.  Defined elsewhere.
+
+       * builds/unix/unixddef.mk: Don't define BUILD_DIR but DEVEL_DIR for
+       development header files.
+       Don't define PLATFORM.
+
+       * configure: Copy `modules.cfg' to builddir if builddir != srcdir.
+       Update snippet taken from autoconf's m4sh.m4 to current CVS version.
+       Be more verbose.
+
+       * include/freetype/config/ftmodule.h: Add comments -- this file is
+       no longer used if FreeType is built with GNU make.
+
+       * docs/CHANGES, docs/CUSTOMIZE, docs/INSTALL, docs/INSTALL.ANY,
+       docs/INSTALL.GNU, docs/INSTALL.UNX: Document new build mechanism.
+       Other minor updates.
+
+       * modules.txt: Removed.  Contents included in `modules.cfg'.
+
+
+       * include/freetype/internal/ftmemory.h (FT_QAlloc_Debug,
+       FT_Free_Debug) [FT_STRICT_ALIASING]: Fix typos.
+
+       * src/base/ftdbgmem.c (FT_Alloc_Debug, FT_Realloc_Debug,
+       FT_QAlloc_Debug, FT_QRealloc_Debug, FT_Free_Debug)
+       [FT_STRICT_ALIASING]: Implement.
+
+2006-01-31  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/cff/cffobjs.c (cff_face_init), src/cid/cidobjs.c
+       (cid_face_init), src/pfr/pfrobjs.c (pfr_face_init),
+       src/type1/t1objs.c (T1_Face_Init): Set face->height to MAX(1.2 *
+       units_per_EM, ascender - descender).
+
+2006-01-31  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * include/freetype/internal/t1types.h (AFM_FontInfo),
+       src/psaux/afmparse.c, src/tools/test_afm.c: Read `FontBBox',
+       `Ascender', and `Descender' from an AFM.
+
+       * src/type1/t1afm.c (T1_Read_Metrics): Use the metrics from the AFM.
+
+       * include/freetype/freetype.h (FT_FaceRec): Mention that fields may
+       be changed after file attachment.
+
+2006-01-28  Werner Lemberg  <wl@gnu.org>
+
+       * src/*/module.mk (.PHONY): Add.
+
+2006-01-27  Werner Lemberg  <wl@gnu.org>
+
+       * README, docs/FTL.TXT: Fix email address for bug reports.
+       Other minor formatting.
+
+       * devel/ftoption.h: Synchronize with
+       include/freetype/config/ftoption.h.
+
+       * src/autofit/module.mk (add_autofit_module), src/bdf/module.mk
+       (add_bdf_module), src/type42/module.mk (add_type42_driver): Fix
+       whitespace.
+
+       * src/smooth/module.mk (add_smooth_renderer): Add lcd and lcdv
+       renderer classes.
+
+2006-01-27  David Turner  <david@freetype.org>
+
+       * builds/unix/configure.ac: Fix build problem on Cygwin.
+
+       * builds/unix/install.mk (install): Don't install the internal
+       headers, and remove existing ones if found in the target install
+       directory.
+
+       * src/autofit/afwarp.c: Add simple #ifdef to prevent compilation
+       if the warp hinter isn't active (it shouldn't, still experimental).
+
+       * Jamfile, include/freetype/config/ftmodule.h: Remove `gxvalid'
+       and `otvalid' from the list of modules that are linked statically
+       to a given FreeType library.  Functionality has been moved to the
+       `ftvalid' CVS module.
+
+       Note also that current Make-based build system still compiles the
+       modules though.
+
+       * include/freetype/config/ftoption.h (FT_STRICT_ALIASING): New macro
+       which controls the definitions of the memory management functions to
+       avoid warnings with recent versions of GCC.  This macro is only here
+       to be disabled, in case we detect problems with the new scheme.
+
+       NOTE: Disable macro to use the memory debugger -- this will be fixed
+             later!
+
+       * include/freetype/internal/ftmemory.h, src/base/ftutil.c (FT_Alloc,
+       FT_QAlloc, FT_Realloc, FT_QRealloc, FT_Free) [FT_STRICT_ALIASING]:
+       New versions.
+
+
+       * builds/win32/visualc/freetype.dsp: Updating project file to
+       define FT2_BUILD_LIBRARY, and remove gxvalid + otvalid modules from
+       compilation.
+
+
+       * builds/freetype.mk (FT_CFLAGS), Jamfile (DEFINES): Define the
+       macro FT2_BUILD_LIBRARY when compiling the library.
+
+       * include/freetype/config/ftheader.h: Remove inclusions of internal
+       headers except if the macro FT2_BUILD_LIBRARY is defined.
+
+
+       * include/freetype/internal/psaux.h (AFM_KernPair, AFM_TrackKern,
+       AFM_FontInfo): Move structure declarations to...
+       * include/freetype/internal/t1types.h: This file.
+
+
+       * (many files): Fix compiler warnings.
+       Various minor reorganizations.
+
+
+       * src/cff/cffload.c (cff_font_done): Don't free static array
+       `subfonts'.
+
+       * src/otvalid/otvcommn.c (otv_ClassDef_validate),
+       src/otvalid/otvgpos.c (otv_x_sxy): Fix debugging information.
+
+
+       Get rid of writable static variables (i.e., the string table) in
+       afmparse, and fix compilation in FT2_MULTI mode.
+
+       * src/psaux/afmparse.c: Include ft2build.h and FT_FREETYPE_H.
+       (AFM_MAX_ARGUMENTS): Define...
+       * src/psaux/afmparse.h: Here.
+       * src/psaux/Jamfile (_sources): Add afmparse.
+
+       * src/psaux/psconv.c: Include psconv.h.
+
+       * src/type1/t1afm.c: Don't include FT_INTERNAL_TYPE1_TYPES_H but
+       FT_INTERNAL_POSTSCRIPT_AUX_H.
+       * src/type1/t1afm.h: Include FT_INTERNAL_TYPE1_TYPES_H.
+
+2006-01-23  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * include/freetype/freetype.h (FT_Select_Size): Rename the second
+       argument from `idx' to `strike_index'.
+       (FT_Size_Request_Type): Add FT_SIZE_REQUEST_TYPE_MAX to the end of
+       this enum.
+
+       * include/freetype/internal/ftobjs.h (FT_REQUEST_WIDTH,
+       FT_REQUEST_HEIGHT): New macros to get the width and height of a
+       request, in fractional pixels.
+
+       * include/freetype/internal/ftobjs.h (FT_Select_Metrics,
+       FT_Request_Metrics), src/base/ftobjs.c (FT_Select_Metrics,
+       FT_Request_Metrics): New base functions to set the font metrics.  They
+       were part of FT_Select_Size/FT_Request_Size and are made independent
+       functions so that metrics are not set again and again.
+
+       * src/base/ftobjs.c (FT_Select_Size, FT_Request_Size): Metrics are set
+       only when driver's size_select/size_request is NULL.  That is, drivers
+       should set the metrics themselves.
+       (FT_Match_Size): Round before matching.  This was what we did and it
+       does cause some problems without rounding.
+
+       * src/cff/cffobjs.c (cff_size_select), src/truetype/ttdriver.c
+       (tt_size_select): Set the font metrics.
+       s/index/strike_index/.
+       The scaled metrics are always preferred over strikes' metrics, even
+       when some strike is selected.  This is done because the strikes'
+       metrics are not reliable, e.g., the sign of the descender is wrong for
+       some fonts.
+
+       * src/cff/cffobjs.c (cff_size_request), src/truetype/ttdriver.c
+       (tt_size_request): Set the font metrics.
+       Call cff_size_select/tt_size_select when some strike is matched.
+
+       * src/bdf/bdfdrivr.c, src/cff/cffobjs.c, src/cid/cidobjs.c,
+       src/pcf/pcfdrivr.c, src/truetype/ttdriver.c, src/type1/t1objs.c,
+       src/type1/t1objs.h, src/type42/t42objs.c, src/winfonts/winfnt.c:
+       Set the font metrics.
+       s/index/strike_index/.
+
+       * src/tools/test_afm.c, src/psaux/psconv.c: Older versions of these
+       files were committed.  Just a catch-up.
+       (PS_Conv_ToFixed): Remove the `goto'.
+       (PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Speed up a little.
+
+       * src/sfnt/ttsbit.c (tt_face_load_sbit_strikes,
+       tt_face_load_strike_metrics), src/sfnt/ttsbit0.c
+       (tt_face_load_sbit_strikes, tt_face_load_strike_metrics): The
+       advertised metrics in `available_sizes' are different from those
+       actually used.
+
+2006-01-23  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/psaux/psaux.c src/psaux/psauxmod.c src/type1/t1driver.c: Make
+       AFM parser optional, controlled by `T1_CONFIG_OPTION_NO_AFM'.
+
+2006-01-22  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from
+       `texinfo' CVS module at savannah.gnu.org.
+
+2006-01-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/autofit/rules.mk (AUTOF_DRV_SRC): Add afwarp.c.
+
+       * src/autofit/afloader.c (af_loader_load_g): Move AF_USE_WARPER up
+       to avoid compiler warnings.
+
+       * src/autofit/afwarp.c (af_warper_compute_line_best): Remove
+       shadowing variable declarations.
+       Fix warning parameters and replace printf with AF_LOG.
+       (af_warper_compute): Remove unused variable.
+
+2006-01-20  David Turner  <david@freetype.org>
+
+       Adding experimental implementation of `warp hinting' (new hinting
+       algorithm for gray-level and LCD rendering).  It is disabled by
+       default, you need to #define AF_USE_WARPER in aftypes.h.
+
+       * src/autofit/afhints.c (af_glyph_hints_scale_dim) [AF_USE_WARPER]:
+       New function.
+       * src/autofit/afhints.h: Updated.
+
+       * src/autofit/aflatin.c [AF_USE_WARPER]: Include afwarp.h.
+       (af_latin_hints_init) [AF_USE_WARPER]: Reset mode to
+       FT_RENDER_MODE_NORMAL if an LCD mode is selected.
+       (af_latin_hints_apply) [AF_USE_WARPER]: Call af_warper_compute
+       appropriately.
+
+       * src/autofit/afloader.c (af_loader_load_g) [!AF_USER_WARPER]:
+       Isolate code for adjusting metrics.
+
+       * src/autofit/aftypes.h (AF_USE_WARPER): New macro (commented out by
+       default).
+
+       * src/autofit/afwarp.c, src/autofit/afwarp.h: New files.
+
+       * src/autofit/autofit.c [AF_USE_WARPER]: Include afwarp.c.
+
+       * src/autofit/Jamfile (_sources): Add afwarp.
+
+2006-01-19  David Turner  <david@freetype.org>
+
+       * src/sfnt/ttsbit0.c (tt_face_load_strike_metrics): Fix small bug
+       that prevented compilation when FT_OPTIMIZE_MEMORY is defined.
+
+2006-01-19  Brian Weed  <bw@imaginengine.com>
+
+       * builds/win32/visualc/freetype.dsp: Updated.
+
+2006-01-17  Werner Lemberg  <wl@gnu.org>
+
+       Use pscmap service in CFF module.
+
+       * src/cff/cffcmap.c (cff_cmap_uni_pair_compare): Removed.
+       (cff_sid_to_glyph_name): New function.
+       (cff_cmap_unicode_init, cff_cmap_unicode_done,
+       cff_cmap_unicode_char_index, cff_cmap_unicode_char next): Use pscmap
+       service.
+       (cff_cmap_unicode_class_rec): Updated.
+       * src/cff/cffcmap.h (CFF_CMapUnicode, CFF_CMap_UniPair): Removed.
+
+
+       * src/psnames/psmodule.c (ps_unicodes_char_next): Fix `unicode'
+       return value.
+
+
+       * src/psaux/afmparse.c (afm_parser_read_vals): Use double casting
+       to avoid compiler warnings regarding type-punning.
+
+2006-01-16  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/psaux/afmparse.c, src/psaux/afmparse.h: New files which
+       implement an AFM parser.
+
+       * src/psaux/psconv.c, src/psaux/psconv.h: New files to provide
+       conversion functions (e.g., PS real number => FT_Fixed) for the
+       PS_Parser and AFM_Parser.  Some of the functions are taken, with
+       some modifications, from the file psobjs.c.
+
+       * src/psaux/psobjs.c: Use functions from psconv.c.
+
+       * include/freetype/internal/psaux.h, src/psaux/psauxmod.c: Add
+       `AFM_Parser' to the `psaux' service.
+
+       * src/psaux/psaux.c, src/psaux/rules.mk (PSAUX_DRV_SRC): Include
+       those new files.
+
+       * src/tools/test_afm.c: A test program for AFM parser.
+
+       * include/freetype/internal/services/svkern.h: New file providing a
+       `Kerning' service.  It is currently only used to get the track
+       kerning information.
+
+       * include/freetype/internal/ftserv.h (FT_SERVICE_KERNING_H): New
+       macro.
+
+       * src/type1/t1driver.c, src/type1/t1objs.c, src/type1/t1afm.c,
+       src/type1/t1afm.h: Update to use the AFM parser.
+       Provide the `Kerning' service.
+
+       * include/freetype/freetype.h, src/base/ftobjs.c: New API
+       `FT_Get_Track_Kerning'.
+
+2006-01-15  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * include/freetype/internal/ftobjs.h, src/base/ftobjs.c,
+       src/bdf/bdfdrivr.c, src/cff/cffgload.c, src/cid/cidgload.c,
+       src/pcf/pcfdrivr.c, src/type1/t1gload.c, src/winfonts/winfnt.c:
+       s/ft_fake_vertical_metrics/ft_synthesize_vertical_metrics/.
+
+       * docs/CHANGES: Mention that vertical metrics are synthesized for
+       fonts not having this info.
+
+2006-01-15  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * include/freetype/internal/ftobjs.h (ft_fake_vertical_metrics),
+       src/base/ftobjs.c (ft_fake_vertical_metrics): New function to fake
+       vertical metrics.
+
+       * src/cff/cffgload.c, src/cid/cidgload.c, src/pcf/pcfdrivr.c,
+       src/type1/t1gload.c, src/winfonts/winfnt.c: Fake vertical metrics,
+       which are monotone.
+
+       * src/truetype/ttgload.c (compute_glyph_metrics): Some fixes and
+       formattings in vertical metrics faking.  There is still room for
+       improvements (and so does the CFF module).
+
+2006-01-15  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/bdf/bdfdrivr.c (BDF_Glyph_Load), src/pcf/pcfdrivr.c
+       (PCF_Glyph_Load), src/winfonts/winfnt.c (FNT_Load_Glyph): Don't set
+       the linear advance fields as they are only used by the outline
+       glyphs.
+
+       * include/freetype/freetype.h: Documentation updates and
+       clarifications.
+       The meaning of FT_LOAD_FORCE_AUTOHINT is changed so that no real
+       change need be made to the code.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Resolve flag dependencies and
+       decide whether to use the auto-hinter according to documentation.
+       There should to be no real difference.
+       Some checks (e.g., is text height positive?) after the glyph is
+       loaded.
+       (FT_Select_Size, FT_Request_Size): Scales are set to wrong values.
+       Be careful that scales won't be negative.
+
+2006-01-14  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * docs/CHANGES: Mention the size selection change.
+
+       * src/bdf/bdfdrivr.c (BDF_Size_Request, BDF_Size_Select),
+       src/pcf/pcfdrivr.c (PCF_Size_Request, PCF_Size_Select),
+       src/winfonts/winfnt.c (FNT_Size_Request, FNT_Size_Select): Do size
+       matching for requests of type NOMINAL and REAL_DIM.
+
+       * src/winfonts/winfnt.c (FNT_Face_Init): Print trace message when
+       `pixel_height' is used for nominal height.
+
+       * src/base/ftobjs.c (FT_Request_Size): Call `FT_Match_Size' if the
+       face is bitmap only and driver doesn't provide `request_size'.  This
+       is added merely for completion as no driver satisfies the conditions.
+
+2006-01-13  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       Introduce new size selection interface.
+
+       * include/freetype/internal/ftdriver.h (struct FT_Driver_ClassRec):
+       Replace `set_char_sizes' and `set_pixel_sizes' by `request_size' and
+       `select_size'.
+
+       * include/freetype/freetype.h (FT_Select_Size, FT_Size_Request_Type,
+       FT_Size_Request, FT_Request_Size, FT_Select_Size), src/base/ftobjs.c
+       (FT_Select_Size, FT_Request_Size): API additions to export the new
+       size selection interface.
+
+       * src/base/ftobjs.c (FT_Set_Char_Size, FT_Set_Pixel_Sizes): Use
+       `FT_Request_Size'.
+
+       * include/freetype/internal/ftobjs.h (FT_Match_Size),
+       src/base/ftobjs.c (FT_Match_Size): New function to match a size
+       request against `available_sizes'.  Drivers supporting bitmap strikes
+       can use this function to implement `request_size'.
+
+       * src/bdf/bdfdrivr.c, src/cid/cidobjs.c, src/cid/cidobjs.h,
+       src/cid/cidriver.c, src/pcf/pcfdrivr.c, src/type1/t1driver.c,
+       src/type1/t1objs.c, src/type1/t1objs.h, src/type42/t42drivr.c,
+       src/type42/t42objs.c, src/type42/t42objs.h, src/winfonts/winfnt.c:
+       Update to new size selection interface.
+
+       * src/cff/cffdrivr.c, src/cff/cffgload.c, src/cff/cffobjs.c,
+       src/cff/cffobjs.h, src/truetype/ttdriver.c, src/truetype/ttgload.c,
+       src/truetype/ttobjs.c, src/truetype/ttobjs.h: Update to new size
+       selection interface.
+       Make `strike_index' FT_ULong and always defined.
+       Use `load_strike_metrics' provided by SFNT interface.
+
+2006-01-13  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * include/freetype/internal/sfnt.h (SFNT_Interface): New method
+       `load_strike_metrics' used to load the strike's metrics.
+
+       * src/sfnt/sfdriver.c, src/sfnt/ttsbit.c, src/sfnt/ttsbit.h,
+       src/sfnt/ttsbit0.c: New function `tt_face_load_strike_metrics'.
+
+       * src/pfr/pfrobjs.c (pfr_face_init): Set FT_Bitmap_Size correctly.
+
+       * src/winfonts/winfnt.c (FNT_Face_Init): Use `nominal_point_size' for
+       nominal size unless it is obviously incorrect.
+
+       * include/freetype/freetype.h (FT_Bitmap_Size): Update the comments on
+       FNT driver.
+
+2006-01-12  Werner Lemberg  <wl@gnu.org>
+
+       Prepare use of pscmap service within CFF module.
+
+       * include/freetype/internal/services/svpscmap.h: Include
+       FT_INTERNAL_OBJECTS_H.
+       (PS_Unicode_Index_Func): Removed.  Unused.
+       (PS_Macintosh_Name_Func): Renamed to...
+       (PS_Macintosh_NameFunc): This.
+       Update all callers.
+       (PS_Adobe_Std_Strings_Func): Renamed to...
+       (PS_Adobe_Std_StringsFunc): This.
+       Update all callers.
+       (PS_UnicodesRec): This is the former `PS_Unicodes' structure.
+       Add `cmap' member.
+       Update all callers.
+       (PS_Unicodes): This is now a typedef'd pointer to PS_UnicodesRec.
+       Update all callers.
+       (PS_Glyph_NameFunc): New typedef.
+       (PS_Unicodes_InitFunc): Change arguments to expect a function
+       and generic data pointer which returns a glyph name from a given
+       index.
+
+       * src/psnames/psmodule.c (ps_unicodes_init, ps_unicodes_char_index,
+       ps_unicodes_char_next, pscmaps_interface): Updated.
+
+       * include/freetype/internal/t1types.h (T1_FaceRec): Updated.
+
+       * src/psaux/t1cmap.h (T1_CmapStdRec): Updated.
+       (T1_CmapUnicode, T1_CmapUnicodeRec): Removed.
+
+       * src/psaux/t1cmap.c (t1_get_glyph_name): New callback function.
+       (t1_cmap_unicode_init, t1_cmap_unicode_done,
+       t1_cmap_unicode_char_index, t1_cmap_unicode_char_next,
+       t1_cmap_unicode_class_rec): Updated.
+
+       * src/type42/t42types.h (T42_FaceRec): Updated.
+
+2006-01-11  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * include/freetype/ftmac.h: Add declaration of new functions
+       FT_New_Face_From_FSRef and FT_GetFile_From_Mac_ATS_Name that
+       were introduced by the jumbo patch on  2006-01-11.
+
+2006-01-11  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #15056 and use pscmap service in psaux module.
+
+       * include/freetype/internal/services/svpscmap.h (PS_UniMap): Use
+       FT_UInt32 for `glyph_index'.
+       (PS_Unicodes_InitFunc): Use FT_String for `glyph_names'.
+       (PS_Unicodes_CharIndexFunc): Use FT_UInt32 for `unicode'.
+       (PS_Unicodes_CharNextFunc): Make second argument a pointer to
+       FT_UInt32.
+
+       * src/psnames/psmodule.c (VARIANT_BIT, BASE_GLYPH): New macros.
+       (ps_unicode_value): Set VARIANT_BIT in return value if glyph is a
+       variant glyph (this is, it has non-leading `.' in its name).
+       (compare_uni_maps): Sort base glyphs before variant glyphs.
+       (ps_unicodes_init): Use FT_String for `glyph_names' argument.
+       Reallocate only if number of used entries is much smaller.
+       Updated to handle variant glyphs.
+       (ps_unicodes_char_index, ps_unicodes_char_next): Prefer base glyphs
+       over variant glyphs.
+       Simplify code.
+
+       * src/psaux/t1cmap.c (t1_cmap_uni_pair_compare): Removed.
+       (t1_cmap_unicode_init, t1_cmap_unicode_char_index,
+       t1_cmap_unicode_char_next): Use pscmap service.
+       (t1_cmap_unicode_done): Updated.
+
+       * src/psaux/t1cmap.h (T1_CMapUniPair): Removed.
+       (T1_CMapUnicode): Use PS_Unicodes structure.
+
+2006-01-11  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Jumbo patch to fix `deprecated' warning of cross-build for Tiger on
+       Intel, as reported by Sean McBride <sean@rogue-research.com> on
+       2005-08-24.
+
+       * src/base/ftmac.c: Heavy change to build without deprecated Carbon
+       functions on Tiger.
+
+       * builds/unix/configure.ac: Add options and autochecks for Carbon
+       functions availabilities, for MacOS X.
+
+       * builds/mac/ascii2mpw.py: Add converter for character `\305'.
+       * builds/mac/FreeType.m68k_{far|cfm}.make.txt: Add conditional
+       macros to avoid unavailable functions.
+       ftmac.c must be compiled without `-strict ansi', because it disables
+       cpp macro to use ToolBox system call.
+
+       * builds/mac/FreeType.ppc_{classic|carbon}.make.txt: Add conditional
+       macros to avoid unavailable functions.
+
+       * builds/mac/README: Detailed notes on function availabilities.
+
+       * docs/CHANGES: Notes about (possible) incompatibilities.
+
+2006-01-08  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2006-01-08  Huw D M Davies  <h.davies1@physics.ox.ac.uk>
+
+       * include/freetype/ftmodapi.h (FT_Module_Get_Flags): New
+       declaration.
+
+       * src/base/ftobjs.c (FT_Module_Get_Flags): New function.
+
+2006-01-07  Werner Lemberg  <wl@gnu.org>
+
+       * src/pcf/pcfread.c (pcf_get_bitmaps): Remove unused variable
+       `bitmaps'.  Reported by Yu Lei <yulei0@gmail.com>.
+
+       * src/base/ftutil.c (ft_highpow2): s/FT_BASE/FT_BASE_DEF/.
+       Reported by Niels Boldt <nielsboldt@gmail.com>.
+
+2005-12-28  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/sfnt/sfnt/ttbdf.c: Add newline '\n' to the end of file, for
+       MPW compiler.
+
+2005-12-23  David Turner  <david@freetype.org>
+
+       * Jamfile (RefDoc), docs/reference/README: Fix it so that `jam
+       refdoc' works correctly to generate the API reference in
+       `docs/reference'.
+
+       * src/tools/docmaker/tohtml.py (print_html_field,
+       print_html_field_list): Update to output nicer fields lists in the
+       API reference.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): FT_LOAD_TARGET_LIGHT now
+       forces auto-hinting.
+
+       * freetype/freetype.h: Updating the documentation for
+       FT_LOAD_TARGET_XXX and FT_Render_Mode values.
+
+2005-12-23  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftmac.c (FT_New_Face_From_Suitcase): Count scalable faces
+       in supported formats (sfnt, LWFN) only, and ignore bitmap faces in
+       unsupported formats (fbit, NFNT).  The number of available faces are
+       passed via face->num_faces.  If bitmap faces are embedded in sfnt
+       resource, face->num_fixed_size is correctly set.  In public API,
+       FT_New_Face() and FT_New_Face_From_FSSpec() count the faces as
+       FT_GetFile_From_Mac_Name(), which ignores NFNT resources.
+
+       * doc/CHANGES: Mention the changes.
+
+2005-12-17  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/truetype/ttinterp.c (Update_Max): Set current size of buffer
+       correctly (so that memory debug system won't panic).
+
+2005-12-16  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * include/freetype/internal/ftobjs.h (ft_glyphslot_grid_fit_metrics),
+       src/base/ftobjs.c (ft_glyphslot_grid_fit_metrics): Removed.
+
+       * src/base/ftobjs.c (ft_recompute_scaled_metrics): Do not round.
+
+       * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c
+       (cid_slot_load_glyph), src/truetype/ttgload.c (compute_glyph_metrics),
+       src/type1/t1gload.c (T1_Load_Glyph): Do not round glyph metrics.
+
+       * doc/CHANGES: Mention the changes.
+
+2005-12-13  David Turner  <david@freetype.org>
+
+       Change the implementation of the LIGHT hinting mode to completely
+       disable horizontal hinting.  This is an experimental effort to
+       integrate David Chester's latest patch without affecting the other
+       hinting modes as well.
+
+       Note that this doesn't force auto-hinting for all fonts, however.
+
+       * src/autofit/afhints.c (af_glyph_hints_reload): Don't set
+       scaler_fiags here but...
+       (af_glyph_hints_rescale): Here.
+
+       * src/autofit/aflatin.c (af_latin_hints_init): Disable horizontal
+       hinting for `light' hinting mode.
+
+
+       * Jamfile: Small fix to ensure that ftexport.sym is placed into the
+       same location as other generated objects (i.e., within the `objs'
+       directory of the current directory).
+
+
+       Add support for an embedded `BDF ' table within SFNT-based bitmap
+       font files.  This is used to store atoms & properties from the
+       original BDF fonts that were used to generate the font file.
+
+       The feature is controlled by TT_CONFIG_OPTION_BDF within
+       `ftoption.h' and is used to implement FT_Get_BDF_Property for these
+       font files.
+
+       At the moment, this is still experimental, the BDF table format
+       isn't cast into stone yet.
+
+       * include/freetype/config/ftoption.h (TT_CONFIG_OPTION_BDF): New
+       macro.
+
+       * include/freetype/config/ftstdlib.h (ft_memchr): New macro.
+
+       * include/freetype/internal/tttypes.h (TT_BDFRec, TT_BDF)
+       [TT_CONFIG_OPTION_BDF]: New structure.
+       (TT_FaceRec) [TT_CONFIG_OPTION_BDF]: New member `bdf'.
+
+       * include/freetype/ttags.h (TTAG_BDF): New macro.
+
+       * src/sfnt/Jamfile (_sources): Add ttbdf.
+
+       * src/sfnt/rules.mk (SFNT_DRV_SRC): Add ttbdf.c.
+
+       * src/sfnt/sfdriver.c [TT_CONFIG_OPTION_BDF]: Include ttbdf.h and
+       FT_SERVICE_BDF_H.
+       (sfnt_get_charset_it) [TT_CONFIG_OPTION_BDF]: New function.
+       (sfnt_service_bdf) [TT_CONFIG_OPTION_BDF]: New service.
+       (sfnt_services) [TT_CONFIG_OPTION_BDF]: Add sfnt_service_bdf.
+
+       * src/sfnt/sfnt.c [TT_CONFIG_OPTION_BDF]: Include ttbdf.c.
+
+       * src/sfnt/sfobjs.c [TT_CONFIG_OPTION_BDF]: Include ttbdf.h.
+       (sfnt_done_face) [TT_CONFIG_OPTION_BDF]: Call
+       tt_face_free_bdf_props.
+
+       * src/sfnt/ttbdf.h, src/sfnt/ttbdf.c: New files.
+
+2005-12-07  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfobjc.c (sfnt_init_face): Move tag check to...
+       * src/sfnt/ttload.c (sfnt_init): Here, before handling TTCs.
+
+2005-12-06  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/truetype/ttobjs.c (tt_size_init): size->ttmetrics.valid is
+       initialized twice.
+       size->strike_index is not initialized.
+
+2005-12-02  Taek Kwan(TK) Lee  <taeklee@gmail.com>
+
+       * src/type42/t42objs.c (T42_Face_Init): Replace call to
+       FT_New_Memory_Face with call to FT_Open_Face to pass `params'.
+
+2005-11-30  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Document ftdump's `-v' option.
+       Document latest charmap code changes.
+
+       * src/sfnt/ttcmap.c, src/sfnt/ttcmap.h:
+       s/TT_CMAP_FLAG_OVERLAPPED/TT_CMAP_FLAG_OVERLAPPING/.
+
+2005-11-30  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/sfnt/ttcmap.c (tt_cmap4_char_map_binary,
+       tt_cmap12_char_map_binary): Fix compiler warnings.
+
+2005-11-29  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       Major update to distinguish between unsorted and overlapping
+       segments for cmap format 4.  For overlapping but sorted segments,
+       which is previously considered unsorted, we still use binary search.
+
+       * src/sfnt/ttcmap.h (TT_CMapRec_): Replace `unsorted' by `flags'.
+       (TT_CMAP_FLAG_UNSORTED, TT_CMAP_FLAG_OVERLAPPED): New macros.
+
+       * src/sfnt/ttcmap.c (OPT_CMAP4): Removed as it is always defined.
+       (TT_CMap4Rec_): Remove `old_charcode' and `table_length'.
+       (tt_cmap4_reset): Removed.
+       (tt_cmap4_init): Updated accordingly.
+       (tt_cmap4_next): Updated accordingly.
+       Take care of overlapping segments.
+       (tt_cmap4_validate): Make sure the subtable is large enough.
+       Do not check glyph_ids because some fonts set the length wrongly.
+       Also, if all segments have offset 0, glyph_ids is always invalid.
+       It does not cause any problem so far only because the check misses
+       equality.
+       Distinguish between unsorted and overlapping segments.
+       (tt_cmap4_char_map_linear, tt_cmap4_char_map_binary): New functions
+       to do `charcode => glyph index' by linear/binary search.
+       (tt_cmap4_char_index, tt_cmap4_char_next): Use
+       tt_cmap4_char_map_linear and tt_cmap4_char_map_binary.
+       (tt_face_build_cmaps): Treat the return value of validator as flags
+       for cmap.
+
+2005-11-29  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/sfnt/ttcmap.c (TT_CMap12Rec_, tt_cmap12_init, tt_cmap12_next):
+       New structures and functions for fast `next char'.
+       (tt_cmap12_char_map_binary): New function to do `charcode => glyph
+       index' by binary search.
+       (tt_cmap12_char_index, tt_cmap12_char_next): Use
+       tt_cmap12_char_map_binary.
+       (tt_face_build_cmaps): Check table and offset correctly (equality is
+       missing).
+
+2005-11-15  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * builds/amiga/smakefile: Adjusted the compiler options
+       to the current sources, now really builds the gxvalid, gzip
+       and psnames modules.
+
+       * builds/amiga/src/base/ftsystem.c: The assumed Seek() position
+       in the file cache was off by one byte which could cause false
+       errors in font files.
+
+2005-11-24  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/mac/FreeType.m68k_far.make.txt,
+       builds/mac/FreeType.m68k_cfm.make.txt,
+       builds/mac/FreeType.ppc_classic.make.txt,
+       builds/mac/FreeType.ppc_carbon.make.txt:
+       Updated for MPW to build all available modules.
+
+2005-11-21  Håvard Wall  <haavardw@ifi.uio.no>
+
+       * src/bdf/bdfdrivr.c (bdf_interpret_style, BDF_Face_Done): Fix small
+       memory leak.
+
+2005-11-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttload.c (sfnt_init): Add tracing message.
+
+2005-11-21  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_image): Image_offset was
+       added twice to image_start if image_format was 2 or 5.
+
+2005-11-21  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/sfnt/sfobjs.c (sfnt_init_face): Check that format_tag is known
+       before loading the table directory.
+
+       * src/sfnt/ttload.c (tt_face_load_sfnt_header,
+       tt_face_load_directory): Delay sfnt_dir_check from
+       tt_face_load_sfnt_header to tt_face_load_directory.
+
+2005-11-20  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/sfnt/ttload.c (sfnt_dir_check): Clean up and return correct
+       error code.
+       (sfnt_init): New function to fill in face->ttc_header.  A non-TTC font
+       is synthesized into a TTC font with one offset table.
+       (tt_face_load_sfnt_header): Use sfnt_init.
+       Fix an invalid access if the font is TTC and face_index is -1.
+
+2005-11-18  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttload.c (tt_face_load_metrics): Ignore excess number
+       of metrics instead of aborting.  Patch suggested by Derek Noonburg.
+
+       * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c
+       (cid_slot_load_glyph), src/type1/t1gload.c (T1_Load_Glyph): Scale
+       the glyph properly if no hinter is available.
+
+       * docs/CHANGES: Mention scaling bug.
+
+2005-11-18  susuzki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * include/freetype/ftgxval.h, src/base/ftgxval.c
+       (FT_TrueTypeGX_Free, FT_ClassicKern_Free): New functions to free
+       buffers allocated by gxvalid module.
+       * include/freetype/ftotval.h, src/base/ftotval.c
+       (FT_OpenType_Free): New function to free buffer allocated by
+       otvalid module.
+
+2005-11-18  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * builds/unix/ftsystem.c (FT_Stream_Open, FT_New_Memory,
+       FT_Done_Memory), builds/vms/ftsystem.c (FT_Stream_Open, FT_New_Memory,
+       FT_Done_Memory), builds/win32/ftdebug.c (FT_Message, FT_Panic):
+       s/FT_EXPORT/FT_BASE/.
+
+2005-11-17  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * builds/amiga/src/base/ftdebug.c (FT_Trace_Get_Count,
+       FT_Trace_Get_Name, FT_Message, FT_Panic),
+       builds/amiga/src/base/ftsystem.c (FT_New_Memory, FT_Done_Memory,
+       FT_Stream_Open): s/FT_EXPORT/FT_BASE/.
+
+2005-11-17  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * builds/amiga/makefile, builds/amiga/makefile.os4,
+       builds/amiga/smakefile,
+       builds/amiga/include/freetype/config/ftmodule.h: Updated the Amiga
+       build files (added support for the gxvalid module).
+
+2005-11-17  Werner Lemberg  <wl@gnu.org>
+
+       Add vertical metrics support to OpenType CFF outlines.  Based on a
+       patch from Mike Moening <MikeM@RetekSolutions.com>.
+
+       * src/cff/cffgload.c (cff_face_get_vertical_metrics): New function.
+       (cff_slot_load): Use cff_face_get_vertical_metrics.
+
+       * docs/CHANGES: Updated.
+
+2005-11-17  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/base/ftcalc.c (FT_MulTo64): Commented out.
+
+       * include/freetype/internal/ftcalc.h (FT_SqrtFixed),
+       src/base/ftcalc.c (FT_SqrtFixed),
+       include/freetype/internal/ftdebug.h (FT_Trace_Get_Count,
+       FT_Trace_Get_Name, FT_Message, FT_Panic), src/base/ftdebug.c
+       (FT_Trace_Get_Count, FT_Trace_Get_Name, FT_Message, FT_Panic),
+       include/freetype/internal/ftobjs.h (FT_New_Memory, FT_Done_Memory),
+       include/freetype/internal/ftstream.h (FT_Stream_Open),
+       src/base/ftsystem.c (FT_New_Memory, FT_Done_Memory, FT_Stream_Open):
+       s/FT_EXPORT/FT_BASE/.
+
+       * builds/exports.mk: Manually add TT_New_Context to EXPORTS_LIST
+       too.
+
+2005-11-15  David Turner  <david@freetype.org>
+
+       * src/base/fttrigon.c (ft_trig_prenorm): Fix a bug that created
+       invalid computations, resulting in very weird bugs in TrueType
+       bytecode hinted fonts.
+
+       * src/truetype/ttinterp.c (FT_UNUSED_EXEC): Don't perform a
+       structure copy each time.
+
+2005-11-11  Werner Lemberg  <wl@gnu.org>
+
+       * src/cache/ftccache.c (FTC_Cache_Clear), src/cache/ftcmanag.c
+       (FTC_Manager_Check): Remove FT_EXPORT_DEF tag.
+
+       * src/base/ftcalc.c (FT_Add64): Remove FT_EXPORT_DEF tag.
+       (FT_Div64by32, FT_Sqrt32): Commented out.  Unused.
+
+       * include/freetype/internal/ftcalc.h (SQRT_32): Removed.  Unused.
+       (FT_Sqrt32): Commented out.  Unused.
+
+       * include/freetype/cache/ftccache.h:
+       s/ftc_node_destroy/FTC_Node_Destroy/.
+
+       * src/cache/ftccback.h (ftc_node_destroy): New declaration.
+
+       * src/cache/ftccache.c (ftc_node_destroy): Use FT_LOCAL_DEF tag.
+       (FTC_Node_Destroy): New exported wrapper function for
+       ftc_node_destroy.
+
+       * src/cache/ftcmanag.c: Include ftccback.c.
+
+2005-11-10  Werner Lemberg  <wl@gnu.org>
+
+       * src/autofit/afangles.c, src/autofit/aftypes.h (af_angle_diff):
+       Comment out.  Unused.
+
+       * builds/exports.mk ($(EXPORTS_LIST)): Add TT_RunIns.
+
+2005-11-10  Christian Biesinger  <cbiesinger@web.de>
+
+       * builds/beos/beos.mk: Call beos-def.mk before anything else to
+       define the separator.
+
+       * builds/unix/unix-cc.in (LINK_LIBRARY): Add `-no-undefined' flag.
+
+2005-11-07  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1afm.c (T1_Read_PFM): Zero offset means `no kerning
+       table available'.  From Sergey Tolstov <stolstov@esri.com>.
+
+2005-11-03  Ville Syrjälä  <syrjala@sci.fi>
+
+       * src/base/ftobjs.c (FT_Open_Face): Avoid possible memory leak.
+
+2005-11-02  Werner Lemberg  <wl@gnu.org>
+
+       Make compiling instructions in docs/CUSTOMIZE work again.
+
+       * builds/unix/unix-cc.in (CPPFLAGS): New variable.
+       (CFLAGS): Don't include @CPPFLAGS@.
+       * builds/freetype.mk (FT_CFLAGS): Add CPPFLAGS.
+
+2005-10-28  David Turner  <david@freetype.org>
+
+       Update build system to support the generation of a list of exported
+       symbols or Windows .DEF files by parsing the public headers with the
+       `apinames' tool located in src/tools/apinames.c.
+
+       Only tested on Unix at the moment.  On Windows, the .DEF file is
+       generated but isn't used yet to generate a DLL.
+
+       * builds/exports.mk: New file.
+
+       * builds/freetype.mk: Include exports.mk.
+       (dll): New target.
+       (clean_project_dos): Fix rule.
+
+       * builds/compiler/visualc.mk (TE), builds/dos/dos-def.mk (E),
+       builds/os2/os2-def.mk (E), builds/win32/win32-def.mk (E): New
+       variables for controlling executable extensions.
+
+       * builds/unix/unix-cc.in (EXPORTS_LIST, CCexe),
+       builds/win32/w32-bcc.mk, builds/win32/w32-gcc.mk,
+       builds/win32/w32-icc.mk, builds/win32/w32-icc.mk,
+       builds/win32/w32-mingw32.mk, builds/win32/w32-vcc,
+       builds/win32/w32-wat.mk (EXPORTS_LIST, EXPORT_OPTIONS,
+       APINAMES_OPTIONS): New targets for controlling the `apinames' tool.
+
+       * Jamfile (GenExportSymbols): Updated.
+
+
+       * src/pfr/pfrtypes.h, src/pfr/pfrload.c, src/pfr/pfrobjs.c
+       [!FT_OPTIMIZE_MEMORY]: Fold memory optimization code into
+       FT_OPTIMIZE_MEMORY chunks for better maintainability and simplicity.
+
+
+       * src/base/fttrigon.c (ft_trig_prenorm), src/base/ftcalc.c
+       (FT_MulFix): Performance optimizations.
+
+
+       * include/freetype/internal/ftgloadr.h (FT_GLYPHLOADER_CHECK_P,
+       FT_GLYPHLOADER_CHECK_C, FT_GLYPHLOADER_CHECK_POINTS): New macros for
+       checking points and contours.  Update callers to use
+       FT_GLYPHLOADER_CHECK_POINTS instead of FT_GlyphLoader_CheckPoints
+       at profile-detected hot-spots.
+
+       * src/base/ftgloadr.c (FT_GlyphLoader_CheckPoints): Set `adjust'
+       to 0 to not call `AdjustPoints' every time.
+
+
+       * src/autofit/aftypes.h (AF_ANGLE_DIFF): New macro to inline
+       FT_Angle_Diff.
+
+       * src/autofit/afhints.c (af_direction_compute): Re-implement.
+       (af_glyph_hints_compute_inflections, af_glyph_hints_reload): Use
+       AF_ANGLE_DIFF to speed up the detection of inflexions.
+
+
+       * src/tools/apinames.c: Include <string.h>.
+       (OutputFormat): New enumeration.
+       (names_dump): Add two parameters to control output format and DLL
+       name.
+       (names_dump_windef): Removed.  Code folded into `names_dump'.
+       (read_header_file): Use isalnum, not isalpha.  Otherwise function
+       names with digits aren't read correctly.
+       (usage): Updated.
+       (main): New option `-o' to control output file name.
+       New option `-d' to indicate DLL file name.
+       Extend `-w' flag to handle Borland and Watcom compilers and linkers.
+
+2005-10-28  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/mac/ftlib.prj, builds/mac/freetype.mak: Removed.
+       ftlib.prj is unmaintained and incompatible with current tree.
+       freetype.mak is unrecoverably broken.
+
+       * builds/mac/ftlib.prj.xml: Added.
+       Generated by Metrowerks CodeWarrior 9.0.
+
+       * builds/mac/FreeType.m68k_far.make.txt,
+       builds/mac/FreeType.m68k_cfm.make.txt,
+       builds/mac/FreeType.ppc_classic.make.txt,
+       builds/mac/FreeType.ppc_carbon.make.txt: Added.
+       Skeleton files of MPW makefiles.
+
+       * builds/mac/ascii2mpw.py: Added.
+       Python script to make MPW makefile from skeleton.
+
+       * builds/mac/README: Updated.
+       Almost rewritten to use new files.
+
+2005-10-28  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftmac.c: Fix invalid casts from NULL to integer typed
+       variables.  Advised by David Turner, Masatake YAMATO, Sean McBride,
+       and George Williams.
+
+2005-10-27  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/ftsysmem.h, include/freetype/ftsysio.h: Removed.
+       Obsolete.
+
+2005-10-25  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfdriver.c (sfnt_interface): Move out
+       `tt_face_get_kerning' from a #ifdef clause.  Reported by Tony J.
+       Ibbs <tibs@sj.co.uk>.
+
+2005-10-23  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftdbgmem.c (ft_mem_debug_realloc): Make it compile with
+       C++.
+
+2005-10-21  David Turner  <david@freetype.org>
+
+       * src/base/ftdbgmem.c (ft_mem_table_set, ft_mem_debug_realloc):
+       Another realloc memory counting bug fix.
+
+       * src/tools/Jamfile: Add missing file.
+
+       * src/lzw/Jamfile: Fix incorrect source file reference.
+
+2005-10-20  David Turner  <david@freetype.org>
+
+       * src/base/ftdbgmem.c (ft_mem_table_set, ft_mem_table_remove,
+       ft_mem_debug_alloc, ft_mem_debug_free, ft_mem_debug_realloc): Fixes
+       to better account for memory reallocations.
+
+       * src/lzw/ftlzw2.c, src/lzw/ftzopen.h, src/lzw/ftzopen.c,
+       src/lzw/rules.mk: First version of LZW loader re-implementation.
+       Apparently, this saves about 330 KB of heap memory when loading
+       timR24.pcf.Z.
+
+2005-10-20  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * include/freetype/ftbitmap.h (FT_Bitmap_Copy, FT_Bitmap_Embolden),
+       src/base/ftbdf.c (FT_Get_BDF_Property), src/cache/ftcmru.c
+       (FTC_MruList_Reset, FTC_MruList_Done, FTC_MruList_Lookup): Fix
+       FT_EXPORT/FT_EXPORT_DEF tagging.
+
+2005-10-19  Chia-I Wu  <b90201047@ntu.edu.tw>
+
+       * src/truetype/ttgload.c (TT_Load_Glyph): Allow size->ttmetrics to
+       be invalid when FT_LOAD_NO_SCALE is set.
+
+2005-10-17  David Turner  <david@freetype.org>
+
+       * src/base/ftobjs.c (FT_Open_Face): Don't call FT_New_GlyphSlot and
+       FT_New_Size if we are opening a face with face_index < 0 (which is
+       only used for testing the format).
+
+       * src/gxvalid/gxvmort0.c (gxv_mort_subtable_type0_entry_validate):
+       Remove compiler warning.
+
+2005-10-16  David Turner  <david@freetype.org>
+
+       * src/tools/apinames.c: Add new tool to extract public API function
+       names from header files.
+
+2005-10-05  Werner Lemberg  <wl@gnu.org>
+
+       Add FT_FACE_FLAG_HINTER to indicate that a specific font driver has
+       a hinting engine of its own.
+
+       * include/freetype/freetype.h (FT_FACE_FLAG_HINTER): New macro.
+
+       * src/cff/cffobjs.c (cff_face_init), src/cid/cidobjs.c
+       (cid_face_init), src/truetype/ttobjs.c (tt_face_init)
+       [TT_CONFIG_OPTION_BYTECODE_INTERPRETER], src/type1/t1objs.c
+       (T1_Face_Init), src/type42/t42objs.c (T42_Face_Init)
+       [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Update face flags.
+
+       * docs/CHANGES: Document it.
+
+2005-09-27  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/freetype2.m4: Add license exception so that the file
+       can be used in any other autoconf script.
+
+2005-09-26  David Turner  <david@freetype.org>
+
+       * src/autofit/aflatin.c (af_latin_compute_stem_width): Fix bad
+       computation of the `vertical' flag, causing ugly things in LCD mode
+       and others.
+
+2005-09-23  David Turner  <david@freetype.org>
+
+       * src/autofit/aflatin.c (af_latin_hints_init): Fix a bug that
+       prevented internal hint mode bitflags from being computed correctly.
+
+       * src/base/Jamfile: Adding src/base/ftgxval.c.
+
+       * src/gxvalid/gxvbsln.c, src/gxvalid/gxvcommn.c,
+       src/gxvalid/gxvfeat.c, src/gxvalid/gxvjust.c, src/gxvalid/gxvkern.c,
+       src/gxvalid/gxvlcar.c, src/gxvalid/gxvmort.c,
+       src/gxvalid/gxvmort0.c, src/gxvalid/gxvmort1.c,
+       src/gxvalid/gxvmort2.c, src/gxvalid/gxvmort4.c,
+       src/gxvalid/gxvmort5.c, src/gxvalid/gxvmorx.c,
+       src/gxvalid/gxvmorx0.c, src/gxvalid/gxvmorx1.c,
+       src/gxvalid/gxvmorx2.c, src/gxvalid/gxvmorx5.c,
+       src/gxvalid/gxvopbd.c, src/gxvalid/gxvprop.c,
+       src/truetype/ttgload.c: Remove _many_ compiler warnings when
+       compiling with Visual C++ at maximum level (/W4).
+
+       * src/autofit/afangles.c (af_angle_atan): Replaced CORDIC-based
+       implementation with one using lookup tables.  This simple thing
+       speeds up glyph loading by 18%, according to ftbench!
+
+       * src/sfnt/sfdriver.c (sfnt_get_interface): Don't check for
+       `get_sfnt' and `load_sfnt' module interfaces.
+
+2005-09-22  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Mention SING Glyphlet support.
+
+2005-09-22  David Turner  <david@freetype.org>
+
+       * src/base/Jamfile: Disable compilation of ftgxval module
+       temporarily.
+
+2005-09-19  David Somers  <dsomers@omz13.com>
+
+       * src/sfnt/ttload.c (sfnt_dir_check): Modified to allow a
+       font to have no `head' table if tables `SING' and `META' are
+       present; this is to support `SING Glyphlet'.
+
+       `SING Glyphlet' is an extension to OpenType developed by Adobe
+       primarily to facilitate adding supplemental glyphs to an OpenType
+       font (with emphasis on, but not necessarily limited to, gaiji to a
+       CJK font).  A SING Glyphlet Font is an OpenType font that contains
+       the outline(s), either in a `glyf' or `CFF' table, for a glyph;
+       `cmap', `BASE', and `GSUB' tables are present with the same format
+       and functionaliy as a regular OpenType font; there are no `name',
+       `head', `OS/2', and `post' tables; there are two new tables, `SING'
+       which contains details about the glyphlet, and `META' which contains
+       metadata.
+
+       Further information on the SING Glyphlet format can be found at:
+
+         http://www.adobe.com/products/indesign/sing_gaiji.html
+
+       * include/freetype/ttags.h (TTAG_SING, TTAG_META): New macros for
+       the OpenType tables `SING' and `META'.  These two tables are used in
+       SING Glyphlet Format fonts.
+
+2005-09-09  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Reactivate code to set
+       FT_FACE_FLAG_KERNING which has been commented out erroneously.
+
+       * docs/CHANGES: Document it.
+
+2005-09-05  Werner Lemberg  <wl@gnu.org>
+
+       Fixes for `make multi' and using C++ compiler.
+
+       * src/gxvalid/gxvcommn.c (gxv_set_length_by_ushort_offset,
+       gxv_set_length_by_ulong_offset, gxv_array_getlimits_byte,
+       gxv_array_getlimits_ushort): Declare with FT_LOCAL_DEF.
+       (gxv_compare_ranges): Make it static.
+       (gxv_LookupTable_fmt0_validate, gxv_LookupTable_fmt2_validate,
+       gxv_LookupTable_fmt4_validate, gxv_LookupTable_fmt6_validate,
+       gxv_LookupTable_fmt8_validate, gxv_LookupTable_validate): Improve
+       trace messages.
+       (gxv_StateArray_validate, gxv_XStateArray_validate): s/class/clazz/.
+       (GXV_STATETABLE_HEADER_SIZE, GXV_STATEHEADER_SIZE,
+       GXV_XSTATETABLE_HEADER_SIZE, GXV_XSTATEHEADER_SIZE): Move to
+       gxvcommn.h.
+
+       * src/gxvalid/gxvcommn.h: Add prototypes for
+       gxv_StateTable_subtable_setup, gxv_XStateTable_subtable_setup,
+       gxv_XStateTable_validate, gxv_array_getlimits_byte,
+       gxv_array_getlimits_ushort, gxv_set_length_by_ushort_offset,
+       gxv_set_length_by_ulong_offset, gxv_odtect_add_range,
+       gxv_odtect_validate.
+       (GXV_STATETABLE_HEADER_SIZE, GXV_STATEHEADER_SIZE,
+       GXV_XSTATETABLE_HEADER_SIZE, GXV_XSTATEHEADER_SIZE): Moved from
+       gxvcommn.c.
+
+       * src/gxvalid/gxvbsln.c (gxv_bsln_LookupValue_validate,
+       gxv_bsln_parts_fmt1_validate): Improve trace messages.
+
+       * src/gxvalid/gxvfeat.c: Split off predefined registry stuff to...
+       * src/gxvalid/gxvfeat.h: New file.
+
+       * src/gxvalid/gxvjust.c (gxv_just_wdc_entry_validate): Improve trace
+       message.
+
+       * src/gxvalid/gxvkern.c (GXV_kern_Dialect): Add KERN_DIALECT_UNKNOWN.
+       (gxv_kern_subtable_fmt1_valueTable_load,
+       gxv_kern_subtable_fmt1_subtable_setup,
+       gxv_kern_subtable_fmt1_entry_validate): Fix C++ compiler errors.
+       (gxv_kern_coverage_validate): Use KERN_DIALECT_UNKWOWN.
+       Improve trace message.
+       (gxv_kern_validate_generic): Fix C++ compiler error.
+       Improve trace message.
+       (gxv_kern_validate_classic): Fix C++ compiler error.
+
+       * src/gxvalid/gxvmort0.c (gxv_mort_subtable_type0_validate): Declare
+       with FT_LOCAL_DEF.
+
+       * src/gxvalid/gxvmort1.c
+       (gxv_mort_subtable_type1_substitutionTable_load,
+       gxv_mort_subtable_type1_subtable_setup): Fix C++ compiler errors.
+       (gxv_mort_subtable_type1_substTable_validate): Improve trace
+       message.
+       (gxv_mort_subtable_type1_validate): Declare with FT_LOCAL_DEF.
+
+       * src/gxvalid/gxvmort2.c (gxv_mort_subtable_type2_opttable_load,
+       gxv_mort_subtable_type2_subtable_setup,
+       gxv_mort_subtable_type2_ligActionOffset_validate,
+       gxv_mort_subtable_type2_ligatureTable_validate): Fix C++ compiler
+       errors.
+       (gxv_mort_subtable_type2_validate): Declare with FT_LOCAL_DEF.
+
+       * src/gxvalid/gxvmort4.c (gxv_mort_subtable_type4_validate): Declare
+       with FT_LOCAL_DEF.
+
+       * src/gxvalid/gxvmort5.c (gxv_mort_subtable_type5_subtable_setup,
+       gxv_mort_subtable_type5_InsertList_validate): Fix C++ compiler
+       errors.
+       (gxv_mort_subtable_type5_validate): Declare with FT_LOCAL_DEF.
+
+       * src/gxvalid/gxvmort.c: Include gxvfeat.h.
+       (gxv_mort_featurearray_validate, gxv_mort_coverage_validate):
+       Declare with FT_LOCAL_DEF.
+       (gxv_mort_subtables_validate, gxv_mort_validate): Improve trace
+       messages.
+
+       * src/gxvalid/gxvmort.h (gxv_mort_feature_validate): Remove.
+
+       * src/gxvalid/gxvmorx0.c (gxv_morx_subtable_type0_validate): Declare
+       with FT_LOCAL_DEF.
+
+       * src/gxvalid/gxvmorx1.c
+       (gxv_morx_subtable_type1_substitutionTable_load,
+       gxv_morx_subtable_type1_subtable_setup,
+       gxv_morx_subtable_type1_entry_validate,
+       gxv_morx_subtable_type1_substitutionTable_validate): Fix C++
+       compiler errors.
+       (gxv_morx_subtable_type1_validate): Declare with FT_LOCAL_DEF.
+
+       * src/gxvalid/gxvmorx2.c (gxv_morx_subtable_type2_opttable_load,
+       gxv_morx_subtable_type2_subtable_setup,
+       gxv_morx_subtable_type2_ligActionIndex_validate,
+       gxv_morx_subtable_type2_ligatureTable_validate): Fix C++ compiler
+       errors.
+       (gxv_morx_subtable_type2_validate): Declare with FT_LOCAL_DEF.
+       Fix typo.
+
+       * src/gxvalid/gxvmorx4.c (gxv_morx_subtable_type4_validate): Declare
+       with FT_LOCAL_DEF.
+
+       * src/gxvalid/gxvmorx5.c (gxv_morx_subtable_type5_insertionGlyph_load,
+       gxv_morx_subtable_type5_subtable_setup): Fix C++ compiler error.
+       (gxv_morx_subtable_type5_validate): Declare with FT_LOCAL_DEF.
+
+       * src/gxvalid/gxvmorx.c (gxv_morx_subtables_validate,
+       gxv_morx_validate): Improve trace message.
+
+       * src/gxvalid/gxvopbd.c (gxv_opbd_LookupFmt4_transit): Fix compiler
+       warnings.
+       (gxv_opbd_validate): Improve trace message.
+
+       * src/gxvalid/gxvprop.c: Decorate constants with `U' and `L' where
+       appropriate.
+       (gxv_prop_zero_advance_validate, gxv_prop_validate): Improve trace
+       message.
+
+       * src/gxvalid/gxvtrak.c (gxv_trak_trackTable_validate): Remove unused
+       parameter.  Update all callers.
+       (gxv_trak_validate): Improve trace message.
+
+       * rules.mk (GXV_DRV_H): Add gxvfeat.h.
+
+2005-09-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/gxvalid/gxvbsln.c (GXV_BSLN_VALUE_EMPTY): Add `U'.
+
+       * src/gxvalid/gxmort1.c (GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE),
+       src/gxvalid/gxmort2.c (GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE): Fix
+       typo.
+
+       * src/gxvalid/gxvmorx0.c, src/gxvalid/gxvmorx1.c,
+       src/gxvalid/gxvmorx2.c, src/gxvalid/gxvmorx4.c,
+       src/gxvalid/gxvmorx5.c, src/gxvalid/gxvmort.c: Improve trace
+       messages.
+       Decorate constants with `U' and `L' where appropriate.
+       Fix compiler warnings.
+
+2005-08-31  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Fix typo.
+
+       * src/gxvalid/gxvbsln.c (gxv_bsln_validate): Fix trace message.
+
+       * src/gxvalid/gxvcommn.c (gxv_odtect_add_range): Use `const'.
+
+       * src/gxvalid/gxvfeat.c, src/gxvalid/gxvjust.c,
+       src/gxvalid/gxvkern.c, src/gxvalid/gxvlcar.c, src/gxvalid/gxvmod.c,
+       src/gxvalid/gxvmort0.c, src/gxvalid/gxvmort1.c,
+       src/gxvalid/gxvmort2.c, src/gxvalid/gxvmort4.c,
+       src/gxvalid/gxvmort5.c, src/gxvalid/gxvmort.c: Improve trace
+       messages.
+       Decorate constants with `U' and `L' where appropriate.
+       Fix compiler warnings.
+
+2005-08-30  Werner Lemberg  <wl@gnu.org>
+
+       * src/gxvalid/README: Revised.
+       * src/gxvalid/gxvbsln.c: Fix compiler warnings.
+       * src/gxvalid/gxvcommn.c: Fix compiler warnings.
+       (gxv_XEntryTable_validate, gxv_compare_ranges): Remove unused
+       parameter.  Update all callers.
+       Improve trace messages.
+       Some formatting.
+
+2005-08-29  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/freetype.h, include/freetype/ftchapters.h: Add
+       a preliminary section with some explanations about user allocation.
+
+       * src/tools/docmaker/tohtml.py (HtmlFormatter.section_enter):
+       Don't abort if there are no data types, functions, etc., in a
+       section.
+       Print synopsis only if we have a data type, function, etc.
+
+       * docs/INSTALL.ANY, docs/INSTALL, docs/INSTALL.UNX, docs/CUSTOMIZE,
+       docs/INSTALL.GNU, docs/TRUETYPE, docs/DEBUG, docs/UPGRADE.UNX,
+       docs/VERSION.DLL, docs/formats.txt: Revised, formatted.
+
+2005-08-28  George Williams  <gww@silcom.com>
+
+       * src/truetype/ttgload.c [TT_MAX_COMPOSITE_RECURSE]: Removed.
+       (load_truetype_glyph): Limit recursion depth by `maxComponentDepth'.
+
+2005-08-25  J. Ali Harlow  <ali@avrc.city.ac.uk>
+
+       * builds/unix/freetype2.in (CFlags): Add missing directory.
+
+2005-08-24  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Mention gxvalid module.
+
+2005-08-23  Werner Lemberg  <wl@gnu.org>
+
+       * src/autofit/aflatin.c (af_latin_metrics_scale): Initialize
+       render mode properly.  Reported by chris@dokein.co.uk.
+
+2005-08-23  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Add gxvalid module to validate TrueType GX/AAT tables.
+
+       Modifications on existing files:
+
+       * Jamfile: Register gxvalid module.
+       * src/base/Jamfile: Register ftgxval.c.
+       * src/base/rule.mk: Register ftgxval.c.
+       * docs/INSTALL.ANY: Register gxvalid/gxvalid.c.
+
+       * include/freetype/config/ftheader.h (FT_GX_VALIDATE_H): New macro
+       to include gxvalid header file.
+       * include/freetype/config/ftmodule.h: Register gxv_module_class.
+
+       * include/freetype/ftchapters.h: Add comment about gx_validation.
+       * include/freetype/ftotval.h: Change keyword FT_VALIDATE_XXX
+       to FT_VALIDATE_OTXXX to co-exist with gxvalid.
+       * include/freetype/tttags.h: Add tags for TrueType GX/AAT tables.
+
+       * include/freetype/internal/ftserv.h (FT_SERVICE_GX_VALIDATE_H): New
+       macro for gxvalid service.
+       * include/freetype/internal/fttrace.h: Add trace facilities for
+       gxvalid.
+
+       New files on existing directories:
+
+       * include/freetype/internal/services/svgxval.h: Registration of
+       validation service for TrueType GX/AAT and classic kern table.
+       * include/freetype/ftgxval.h: Public API definition to use gxvalid.
+       * src/base/ftgxval.c: Public API of gxvalid.
+
+       New files under src/gxvalid/:
+
+       * src/gxvalid/Jamfile src/gxvalid/README src/gxvalid/module.mk
+       src/gxvalid/rules.mk src/gxvalid/gxvalid.c src/gxvalid/gxvalid.h
+       src/gxvalid/gxvbsln.c src/gxvalid/gxvcommn.c src/gxvalid/gxvcommn.h
+       src/gxvalid/gxverror.h src/gxvalid/gxvfeat.c src/gxvalid/gxvfgen.c
+       src/gxvalid/gxvjust.c src/gxvalid/gxvkern.c src/gxvalid/gxvlcar.c
+       src/gxvalid/gxvmod.c src/gxvalid/gxvmod.h src/gxvalid/gxvmort.c
+       src/gxvalid/gxvmort.h src/gxvalid/gxvmort0.c src/gxvalid/gxvmort1.c
+       src/gxvalid/gxvmort2.c src/gxvalid/gxvmort4.c src/gxvalid/gxvmort5.c
+       src/gxvalid/gxvmorx.c src/gxvalid/gxvmorx.h src/gxvalid/gxvmorx0.c
+       src/gxvalid/gxvmorx1.c src/gxvalid/gxvmorx2.c src/gxvalid/gxvmorx4.c
+       src/gxvalid/gxvmorx5.c src/gxvalid/gxvopbd.c src/gxvalid/gxvprop.c
+       src/gxvalid/gxvtrak.c: New files, gxvalid body.
+
+2005-08-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgload.c (TT_Load_Glyph): Only translate outline
+       to (0,0) if bit 1 of the `head' table isn't set.  This improves
+       rendering of buggy fonts.
+
+2005-08-20  Chia I Wu  <b90201047@ntu.edu.tw>
+
+       * src/truetype/ttdriver.c (Load_Glyph): Don't check the validity of
+       ttmetrics here.  TrueType fonts with only sbits always have
+       ttmetrics.valid set to false.
+
+       * src/truetype/ttgload.c (TT_Load_Glyph): Check that ttmetrics is
+       valid before loading outline glyph.
+
+       * src/cache/ftcimage.c (FTC_INode_New): Fix a memory leak.
+
+2005-08-20  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttload.c (tt_face_load_metrics_header): Ignore missing
+       `hhea' table for SFNT Mac fonts.  Change based on a patch by
+       mpsuzuki@hiroshima-u.ac.jp.
+
+2005-08-20  Masatake YAMATO  <jet@gyve.org>
+
+       * src/otvalid/otvmod.c (otv_validate): Use ft_validator_run instead
+       of ft_setjmp.
+
+2005-08-19  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Fix compiler
+       warnings.
+
+2005-08-16  Chia I Wu  <b90201047@ntu.edu.tw>
+
+       * src/truetype/ttinterp.c, src/truetype/ttinterp.h: Update copyright
+       messages.
+
+2005-08-16  Chia I Wu  <b90201047@ntu.edu.tw>
+
+       * src/truetype/ttinterp.c, src/truetype/ttinterp.h: Remove original
+       TT_Done_Context and rename TT_Destroy_Context to TT_Done_Context
+       with slight changes.
+       Update all callers.
+       (TT_New_Context): Now takes TT_Driver argument directly.
+       Update all callers.
+
+       * src/truetype/ttobjs.h (tt_slot_init): New function.
+       * src/truetype/ttobjs.c (tt_driver_init): Initialize execution
+       context here.
+       (tt_slot_init): New function to create extra points for the internal
+       glyph loader.  We then use it directly, instead of face's glyph
+       loader, when loading glyph.
+
+       * src/truetype/ttdriver.c (tt_driver_class): Use tt_slot_init for
+       glyph slot initialization.
+       (Load_Glyph): Load flag dependencies are handled here.  Return error
+       if size is NULL.
+
+       * src/truetype/ttgload.c: Heavy cleanup and refactoring.
+       (org_to_cur): Removed.
+       (TT_Load_Simple_Glyph): Call FT_GlyphLoader_CheckPoints.
+       (TT_Hint_Glyph): New function to hint a zone, prepared by caller.
+       (TT_Process_Simple_Glyph): s/load/loader/.
+       Use loader->pp values instead of recalculation.
+       Use TT_Hint_Glyph.
+       No need to save/restore loader->stream before and after
+       TT_Vary_Get_Glyph_Deltas now.
+       (TT_LOADER_SET_PP): New macro to calculate and set the four phantom
+       points.
+       (load_truetype_glyph): Never set exec->glyphSize to 0.  This closes
+       Savannah bug #13107.
+       Forget glyph frame before calling TT_Process_Simple_Glyph.
+       Use TT_LOADER_SET_PP.
+       Scale all four phantom points.
+       Split off some functionality to ...
+       (TT_Process_Composite_Component, TT_Process_Composite_Glyph): These
+       new functions.
+       (TT_Load_Glyph): Set various fields of `glyph' here, not in
+       load_truetype_glyph and compute_glyph_metrics.
+       Split off some functionality to ...
+       (load_sbit_image, tt_loader_init): These new functions.
+       (compute_glyph_metrics): Call FT_Outline_Get_CBox.
+
+2005-08-08  Werner Lemberg  <wl@gnu.org>
+
+       * docs/INSTALL.ANY: Updated.
+
+2005-08-05  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffgload.c (cff_builder_close_contour),
+       src/psaux/psobjs.c (t1_builder_close_contour): Protect against
+       zero `outline' pointer.
+
+       * src/base/ftgloadr.c (FT_GlyphLoader_Add): Protect against zero
+       `loader' address.
+
+2005-08-03  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfdriver.c (sfnt_interface) [FT_OPTIMIZE_MEMORY]:
+       Reactivate pointers to tt_find_sbit_image and tt_load_sbit_metrics
+       to make X work again.
+
+2005-08-02  Werner Lemberg  <wl@gnu.org>
+
+       * src/otvalid/otvcommn.h: Remove dead code.
+
+2005-07-31  Chia I Wu  <b90201047@ntu.edu.tw>
+
+       * src/truetype/ttobjs.h (tt_size_run_fpgm, tt_size_run_prep): New
+       functions.
+
+       * src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep): New
+       functions.
+       (tt_size_init): Add 4, instead of 2, (phantom) points to twilight
+       zone.
+       Move code that runs fpgm to tt_size_run_fpgm.
+       (Reset_Outline_Size): Move code that runs prep to tt_size_run_prep.
+       (tt_glyphzone_new): Allocate right size of arrays.
+       Set max_points and max_contours properly.
+
+2005-07-26  Chia I Wu  <b90201047@ntu.edu.tw>
+
+       * src/truetype/ttdriver.c (Set_Char_Sizes): Avoid unnecessary
+       computations and clean up.
+
+       * src/truetype/ttobjs.h (struct TT_SizeRec_): Comment on the
+       internal copy of metrics.
+
+2005-07-12  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/ftoutln.h (FT_Outline_Embolden): Fix prototype.
+       Reported by Xerxes.
+
+2005-07-04  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/ftmemory.h (FT_REALLOC_ARRAY): Fix typo.
+       Reported by Brett Hutley.
+
+2005-06-30  David Turner  <david@freetype.org>
+
+       * src/sfnt/ftbitmap.c, src/truetype/ttgload.c, src/sfnt/ttcmap.c:
+       Removing compiler warnings (Visual C++ /W4).
+
+
+       Implement a work-around for broken C preprocessor in Visual C++ (it
+       has been confirmed by the MS developers that it is indeed a bug
+       which won't be fixed in the very near future).
+
+       * Jamfile (FT2_COMPONENTS): Include otvalid (again).
+
+       * src/otvalid/otvcommn.h (OTV_NAME, OTV_FUNC): New macros.
+       (OTV_NEST1, OTV_NEST2, OTV_NEST3): Use OTV_NAME and OTV_FUNC to
+       avoid argument expansion by argument prescan.
+       Append `Func' to all affected macros and change them to take just a
+       single argument.  Example: `AttachList' is renamed to
+       `AttachListFunc'.
+
+       * src/otvalid/otvgdef.c, src/otvalid/otvgpos.c,
+       src/otvalid/otvgsub.c, src/otvjstf.c: Append `Func' to macros
+       affected by the changes to OTV_NESTx and modify them to take just a
+       single argument.
+
+2005-06-20  Chia I Wu  <b90201047@ntu.edu.tw>
+
+       * include/freetype/internal/ftobjs.h, src/base/ftobjs.c: New function
+       ft_glyphslot_grid_fit_metrics.
+
+       * src/truetype/ttgload.c (compute_glyph_metrics): Use
+       ft_glyphslot_grid_fit_metrics.
+
+       * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c
+       (cid_slot_load_glyph), src/type1/t1gload.c (T1_Load_Glyph): Use
+       ft_glyphslot_grid_fit_metrics.
+       FT_Outline_Get_CBox is called twice.
+
+       * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Modify metrics to more
+       reasonable values when emboldening outline glyphs.  The theoretic
+       ones are unrealistic.
+
+2005-06-16  Chia I Wu  <b90201047@ntu.edu.tw>
+
+       * src/base/ftoutln.c (FT_Outline_Embolden): Strength should be
+       halved.
+
+       * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Change the default
+       strength.
+       Don't increase slot->advance.y.
+
+2005-06-16  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/freetype.h (FREETYPE_MINOR): Set to 2.
+       (FREETYPE_PATCH): Set to 0.
+
+       * builds/unix/configure.ac (version_info): Set to 9:9:3.
+       Currently, we are still binary compatible.
+
+       * builds/win32/visualc/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj: s/219/2110/, s/2.1.9/2.1.10/.
+
+       * builds/freetype.mk (refdoc), README, Jamfile (RefDoc):
+       s/2.1.9/2.1.10/.
+
+       * docs/CHANGES, docs/VERSION.DLL: Updated.
+
+       * ChangeLog: Split off older entries into...
+       * ChangeLog.20, ChangeLog.21: These new files.
+
+2005-06-15  Kirill Smelkov  <kirr@mns.spb.ru>
+
+       The next release will be 2.2.0, so don't worry about source code
+       backwards compatibility.
+
+       * include/freetype/ftimage.h (FT_Outline_MoveToFunc,
+       FT_Outline_LineToFunc, FT_Outline_ConicToFunc,
+       FT_Outline_CubicToFunc, FT_SpanFunc, FT_Raster_RenderFunc),
+       include/freetype/ftrender.h (FT_Glyph_TransformFunc,
+       FT_Renderer_RenderFunc, FT_Renderer_TransformFunc): Decorate
+       parameters with `const' where appropriate.
+
+2005-06-15  Chia I Wu  <b90201047@ntu.edu.tw>
+
+       * src/sfnt/ttsbit.c (tt_face_load_sbit_image): Compute vertBearingY
+       to make glyphs centered vertically.
+
+       * src/truetype/ttgload.c (compute_glyph_metrics): Compute
+       vertBearingY to make glyphs centered vertically.
+       Fix some bugs in vertical metrics:
+
+         . loader->pp3.y and loader->pp4.y are in 26.6 format, not in font
+           units.
+         . As we use the glyph's cbox to calculate the top bearing now
+           there is no need to adjust `top'.
+
+2005-06-15  Werner Lemberg  <wl@gnu.org>
+
+       * src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE): Use FT_UShort to be
+       in sync with OTV_OPTIONAL_OFFSET.  Reported by YAMATO Masatake.
+
+2005-06-13  Werner Lemberg  <wl@gnu.org>
+
+       * docs/release: Update.
+
+----------------------------------------------------------------------------
+
+Copyright 2005, 2006, 2007, 2008 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:
diff --git a/ChangeLog.23 b/ChangeLog.23
new file mode 100644 (file)
index 0000000..bc46c84
--- /dev/null
@@ -0,0 +1,7948 @@
+2010-02-13  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.3.12 released.
+       ==========================
+
+
+       Tag sources with `VER-2-3-12'.
+
+       * docs/CHANGES: Updated.
+
+       * docs/VERSION.DLL: Update documentation and bump version number to
+       2.3.12.
+
+       * README, Jamfile (RefDoc),
+       builds/win32/vc2005/freetype.vcproj, builds/win32/vc2005/index.html,
+       builds/win32/vc2008/freetype.vcproj, builds/win32/vc2008/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj,
+       builds/win32/visualc/index.html, builds/win32/visualce/freetype.dsp,
+       builds/win32/visualce/freetype.vcproj,
+       builds/win32/visualce/index.html,
+       builds/wince/vc2005-ce/freetype.vcproj,
+       builds/wince/vc2005-ce/index.html,
+       builds/wince/vc2008-ce/freetype.vcproj,
+       builds/wince/vc2008-ce/index.html: s/2.3.11/2.3.12/, s/2311/2312/.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 12.
+
+       * builds/unix/configure.raw (version_info): Set to 10:0:4.
+
+2010-02-12  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Improve autotool version checking to work with beta releases.
+
+       * autogen.sh (check_tool_version): Improve the extraction of version
+       number from "tool --version" output.  Some beta releases of
+       autotools have extra strings before version number.
+
+2010-02-12  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Fix overallocating bug in FT_Outline_New_Internal().
+
+       * src/base/ftoutln.c (FT_Outline_New_Internal): The length of
+       FT_Outline->points[] should be numPoints, not 2 * numPoints.
+       Found by Paul Messmer, see
+       http://lists.gnu.org/archive/html/freetype-devel/2010-02/msg00003.html
+
+2010-02-10  Ken Sharp  <ken.sharp@artifex.com>
+
+       Really fix Savannah bug #28678 (part 2).
+
+       Since we consider `sbw' for the horizontal direction only, we still have
+       to synthesize vertical metrics if the user wants to use the vertical
+       writing direction.
+
+       * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c
+       (cid_slot_load_glyph), src/type1/t1gload.c (T1_Load_Glyph):
+       Synthesize vertical metrics (only) if FT_LOAD_VERTICAL_LAYOUT is
+       set.
+
+2010-02-10  Ken Sharp  <ken.sharp@artifex.com>
+
+       Really fix Savannah bug #28678 (part 1).
+
+       After long discussion, we now consider the character width vector
+       (wx,wy) returned by the `sbw' Type 1 operator as being part of *one*
+       direction only.  For example, if you are using the horizontal
+       writing direction, you get the horizontal and vertical components of
+       the advance width for this direction.  Note that OpenType and CFF fonts
+       don't have such a vertical component; instead, the GPOS table can be
+       used to generate two-dimensional advance widths (but this isn't
+       handled by FreeType).
+
+       * include/freetype/ftincrem.h (FT_Incremental_MetricsRec): Add
+       `advance_v' field to hold the vertical component of the advance
+       value.
+
+       * src/truetype/ttgload.c (tt_get_metrics), src/cff/cffgload.c
+       (cff_slot_load), src/type1/t1gload.c
+       (T1_Parse_Glyph_And_Get_Char_String), src/cid/cidgload.c
+       (cid_load_glyph): Use it.
+
+2010-02-08  Werner Lemberg  <wl@gnu.org>
+
+       * devel/ftoption.h [FT_CONFIG_OPTION_PIC]: Define.
+
+2010-02-04  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Prevent NULL pointer dereference passed to FT_Module_Requester.
+
+       * src/sfnt/sfdriver.c (sfnt_get_interface): Don't use `module'.
+       * src/psnames/psmodule.c (psnames_get_interface): Ditto.
+
+       * src/cff/cffdrivr.c (cff_get_interface): Check NULL `driver'.
+       * src/truetype/ttdriver.c (tt_get_interface): Ditto.
+
+2010-01-29  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Fix memory leaks in previous patch.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Don't overwrite the strings
+       allocated for face->root.family_name and style_name.
+
+2010-01-29  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       New parameters for FT_Open_Face() to ignore preferred family names.
+
+       Preferred family names should be used for legacy systems that
+       can hold only a few faces (<= 4) for a family name. Suggested by
+       Andreas Heinrich.
+       http://lists.gnu.org/archive/html/freetype/2010-01/msg00001.html
+
+       * include/freetype/ftsnames.h (FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY,
+       FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY): Define.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Check the arguments and
+       ignore preferred family and subfamily names if requested.
+
+2010-01-27  Ken Sharp  <ken.sharp@artifex.com>
+
+       Fix Savannah bug #28678.
+
+       * src/cff/cffgload.c (cff_slot_load), src/cid/cidgload.c
+       (cid_load_glyph): Handle vertical metrics correctly.
+
+       * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Handle
+       vertical metrics correctly.
+       (T1_Load_Glyph): Don't synthesize vertical metrics.
+
+2010-01-14  Werner Lemberg  <wl@gnu.org>
+
+       Make FT_Set_Transform work if no renderer is available.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Apply `standard' transformation
+       if no renderer is compiled into the library.
+
+2010-01-14  Werner Lemberg  <wl@gnu.org>
+
+       Fix compilation warning.
+
+       * src/base/ftbase.h: s/LOCAL_DEF/LOCAL/.
+       * src/base/ftobjc.s: Include ftbase.h conditionally.
+
+2010-01-11  Kwang Yul Seo  <skyul@company100.net>
+
+       Provide inline assembly code for RVCT compiler.
+       This is Savannah patch #7059.
+
+       * include/freetype/config/ftconfig.h (FT_MULFIX_ASSEMBLER,
+       FT_MulFix_arm) [__CC_ARM || __ARM_CC]: Define.
+
+2010-01-08  Ken Sharp  <ken.sharp@artifex.com>
+
+       Fix Savannah bug #28521.
+
+       Issue #28226 involved a work-around for a font which used the
+       `setcurrentpoint' operator in an invalid way; this operator is only
+       supposed to be used with the result of OtherSubrs, and the font used
+       it directly.  The supplied patch removed the block of code which
+       checked this usage entirely.
+
+       This turns out to be a Bad Thing.  If `setcurrentpoint' is being
+       used correctly it should reset the flex flag in the decoder.  If we
+       don't do this then the flag never gets reset and we omit any further
+       contours from the glyph (at least until we close the path or
+       similar).
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings)
+       <op_setcurrentpoint>: Handle `flex_state' correctly.
+
+2010-01-05  Werner Lemberg  <wl@gnu.org>
+
+       Apply reports from clang static analyzer.
+
+       * src/lzw/ftlzw.c (ft_lzw_file_init), src/base/ftstroke.c
+       (FT_Stroker_ParseOutline), src/base/ftsynth.c
+       (FT_GlyphSlot_Embolden): Remove dead code.
+
+       * src/base/ftpatent.c (_tt_check_patents_in_table): Initialize
+       `offset_i' and `length_i'.
+
+2010-01-05  Ralph Giles  <giles@ghostscript.com>
+
+       Enable the incremental font interface by default.
+
+       Ghostscript requires the incremental font interface for handling
+       some Postscript documents.  It is moving to using FreeType as its
+       primary renderer; supporting this in the default build makes it
+       Ghostscript to be linked against the system FreeType when one is
+       available.
+
+       * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_INCREMENTAL):
+       Uncomment.
+
+2010-01-05  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #28395.
+
+       * src/truetype/ttdriver.c (Load_Glyph), src/type1/t1gload.c
+       (T1_Loada_Glyph): Don't check `num_glyphs' if incremental interface
+       is used.
+
+2010-01-05  Ken Sharp  <ken.sharp@artifex.com>
+
+       Make Type 1 `seac' operator work with incremental interface.
+       This fixes Savannah bug #28480.
+
+       * src/psaux/t1decode.c (t1operator_seac): Don't check `glyph_names'
+       if incremental interface is used.
+
+2010-01-04  Ken Sharp  <ken.sharp@artifex.com>
+
+       Make incremental interface work with TrueType fonts.
+       This fixes Savannah bug #28478.
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Don't check
+       `glyf_offset' if incremental interface is used.
+
+2009-12-31  Lars Abrahamsson  <wonko@opera.com>
+
+       Make compilation with FT_CONFIG_OPTION_PIC work again.
+
+       * src/base/ftglyph.c (FT_Glyph_To_Bitmap) [FT_CONFIG_OPTION_PIC]:
+       Declare `library' for FT_BITMAP_GLYPH_CLASS_GET.
+
+       * src/base/ftinit.c (ft_destroy_default_module_classes,
+       ft_create_default_module_classes): Use proper casts (needed for C++
+       compilation).
+
+       * src/sfnt/ttcmap.c (tt_cmap13_class_rec): Use FT_DEFINE_TT_CMAP.
+
+2009-12-22  Marc Kleine-Budde  <mkl@pengutronix.de>
+
+       Make freetype-config aware of $SYSROOT.
+       This is Savannah patch #7040.
+
+       * builds/unix/freetype-config.in: Decorate with ${SYSROOT} where
+       appropriate.
+
+2009-12-20  Werner Lemberg  <wl@gnu.org>
+
+       Fix compiler warning.
+       Reported by Sean.
+
+       * src/base/ftdbgmem.c [!FT_DEBUG_MEMORY]: ANSI C doesn't like empty
+       source files; however, some compilers warn about an unused variable
+       declaration.  This is now replaced with a typedef.
+
+2009-12-18  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #28320.
+
+       There exist corrupt, subsetted fonts (embedded in PDF files) which
+       contain a private dict that ends with an unterminated floating point
+       number (no operator following).  We now ignore this error (as
+       acrobat does).
+
+       * src/cff/cffparse.c (cff_parser_run): Don't emit a syntax error for
+       unterminated floating point numbers.
+
+2009-12-16  Werner Lemberg  <wl@gnu.org>
+
+       Really fix compiler warnings.
+       Reported by Sean.
+
+       * src/truetype/ttgxvar.c (GX_PT_POINTS_ARE_WORDS,
+       GX_PT_POINT_RUN_COUNT_MASK): Convert enum values to macros.
+
+2009-12-16  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Improve configure.raw to copy some options from CFLAGS to LDFLAGS.
+       The linker of Mac OS X 10.6 is sensitive to the architecture.  If
+       the architectures are specified explicitly for the C compiler, the
+       linker requires the architecture specifications too.
+
+       * builds/unix/configure.raw: Replace `-isysroot' option parser by
+       more generic argument parser.
+
+2009-12-15  Werner Lemberg  <wl@gnu.org>
+
+       Fix compiler warnings.
+       Reported by Sean.
+
+       * src/truetype/ttgxvar.c (ft_var_readpackeddeltas): Fix counter data
+       type.
+
+2009-12-14  Ken Sharp  <ken.sharp@artifex.com>
+
+       Ignore invalid `setcurrentpoint' operations in Type 1 fonts.
+       This fixes Savannah bug #28226.
+
+       At least two wild PostScript files of unknown provenance contain
+       Type 1 fonts, apparently converted from TrueType fonts in earlier
+       PDF versions of the files, which use the `setcurrentpoint' operator
+       inappropriately.
+
+       FreeType currently throws an error in this case, but Ghostscript and
+       Adobe Distiller both accept the fonts and ignore the problem.  This
+       commit #ifdefs out the check so PostScript interpreters using
+       FreeType can render these files.
+
+       The specification says `setcurrentpoint' should only be used to set
+       the point after a `Subr' call, but these fonts use it to set the
+       initial point to (0,0).  Unnecessarily so, as they correctly use an
+       `hsbw' operation which implicitly sets the initial point.
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings)
+       <op_setcurrentpoint>: Comment out code.
+
+2009-12-14  Bram Tassyns  <bramt@enfocus.be>
+
+       Fix parsing of /CIDFontVersion.
+       This fixes Savannah bug #28287.
+
+       * src/cid/cidtoken.h: `cid_version' in CID_FaceInfoRec (in
+       t1tables.h) is of type FT_Fixed.
+
+2009-12-14  Werner Lemberg  <wl@gnu.org>
+
+       Trace glyph index in CID module.
+       Suggested in Savannah patch #7023.
+
+       * src/cid/cidgload.c (cid_load_glyph): Add tracing message.
+
+2009-12-03  Werner Lemberg  <wl@gnu.org>
+
+       Fix compiler warnings.
+
+       * src/truetype/ttgload.c (tt_get_metrics): Put `Exit' label into the
+       proper preprocessor conditional.
+       * src/pfr/pfrobjs.c (pfr_slot_load): Pacify gcc.
+
+2009-11-25  John Tytgat  <John.Tytgat@esko.com>
+
+       Better handling of start of `eexec' section.
+       This fixes Savannah bug #28090.
+
+       * src/type1/t1parse.c (T1_Get_Private_Dict): Skip all whitespace
+       characters before start of `eexec' section.
+
+2009-11-20  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #27742.
+
+       * src/base/ftstroke.c (ft_stroker_outside): Avoid silent division by
+       zero, using a threshold for `theta'.
+
+2009-11-20  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #28036.
+
+       * src/type1/t1afm.c (t1_get_index): Fix comparison.
+
+2009-11-16  Werner Lemberg  <wl@gnu.org>
+
+       Fix compiler warnings.
+       Reported by Kevin Blenkinsopp <arqon@promode.org>.
+
+       * src/sfnt/ttload.c (check_table_dir): Use proper data type.
+
+2009-11-15  Werner Lemberg  <wl@gnu.org>
+
+       Really fix FreeDesktop bug #21197.
+       This also fixes Savannah bug #28021.
+
+       * src/autofit/aflatin.c (af_latin_metrics_check_digits),
+       src/autofit/aflatin2.c (af_latin2_metrics_check_digits): Fix loop.
+
+2009-11-15  Werner Lemberg  <wl@gnu.org>
+
+       Add tracing messages for advance values.
+
+       * src/base/ftobjs.c (FT_Load_Glyph), src/truetype/ttgload.c
+       (TT_Get_HMetrics, TT_Get_VMetrics): Do it.
+
+2009-11-08  Werner Lemberg  <wl@gnu.org>
+
+       Fix compiler warning.
+       Reported by Jeremy Manson <jeremy.manson@gmail.com>.
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Initialize `error'.
+
+2009-11-04  Werner Lemberg  <wl@gnu.org>
+
+       Remove compiler warning.
+       Reported by Sean McBride <sean@rogue-research.com>.
+
+       * src/tools/apinames.c (read_header_file)<STATE_TYPE>: Use a cast to
+       `int', as specified in the printf(3) man page.
+
+2009-11-04  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #27921.
+
+       * src/cff/cffobjs.c (cff_face_init), src/cid/cidobjs.c
+       (cid_face_init), src/type1/t1afm.c (T1_Read_Metrics),
+       src/type1/t1objs.c (T1_Face_Init): Don't use unsigned constant
+       values for rounding if the argument can be negative.
+
+2009-11-03  Bram Tassyns  <bramt@enfocus.be>
+
+       Add basic support for Type1 charstrings in CFF.
+       This fixes Savannah bug #27922.
+
+       * src/cff/cffgload.c (CFF_Operator, cff_argument_counts): Handle
+       `seac', `sbw', and `setcurrentpoint' opcodes.
+       (cff_compute_bias): Add parameter to indicate the charstring type.
+       Update all callers.
+       (cff_operator_seac): Add parameter for side bearing.
+       (cff_decoder_parse_charstrings): Updated for more Type1 support.
+
+2009-11-03  Werner Lemberg  <wl@gnu.org>
+
+       Return correct `linearHoriAdvance' value for embedded TT bitmaps too.
+       Reported by Jeremy Manson <jeremy.manson@gmail.com>.
+
+       src/truetype/ttgload.c (load_truetype_glyph): Add parameter to
+       quickly load the glyph header only.
+       Update all callers.
+       (tt_loader_init): Add parameter to quickly load the `glyf' table
+       only.
+       Update all callers.
+       (TT_Load_Glyph): Compute linear advance values for embedded bitmap
+       glyphs too.
+
+2009-11-03  Werner Lemberg  <wl@gnu.org>
+
+       Improve code readability.
+
+       * src/ttgload.c (load_truetype_glyph): Move metrics calculation
+       to...
+       (tt_get_metrics): This new function.
+
+2009-10-26  Bram Tassyns  <bramt@enfocus.be>
+
+       Fix Savannah bug #27811.
+
+       * src/truetype/ttxgvar.c (ft_var_readpackeddeltas): Fix
+       signed/unsigned mismatch.
+
+2009-10-19  Ning Dong  <flintning@163.com>
+
+       Fix handling of `get' and `put' CFF instructions.
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings) <cff_op_get,
+       cff_op_put>: Appendix B of Adobe Technote #5177 limits the number of
+       elements for the `get' and `put' operators to 32.
+       * src/cff/cffgload.h (CFF_MAX_TRANS_ELEMENTS): Define.
+       (CFF_Decoder): Use it for `buildchar' and remove `len_buildchar'.
+
+2009-10-18  Werner Lemberg  <wl@gnu.org>
+
+       Fix handling of `dup' CFF instruction.
+       Problem and solution reported by Ning Dong <flintning@163.com>.
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings) <cff_op_dup>:
+       Increase `args' by 2, not 1.
+
+2009-10-10  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.3.11 released.
+       ==========================
+
+
+       Tag sources with `VER-2-3-11'.
+
+       * docs/VERSION.DLL: Update documentation and bump version number to
+       2.3.11.
+
+       * README, Jamfile (RefDoc), builds/win32/visualc/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj,
+       builds/win32/visualce/index.html,
+       builds/win32/visualce/freetype.dsp,
+       builds/win32/visualce/freetype.vcproj: s/2.3.10/2.3.11/, s/2310/2311/.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 11.
+
+       * builds/unix/configure.raw (version_info): Set to 9:22:3.
+
+2009-10-10  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES, docs/release: Updated.
+
+2009-10-10  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/pcf/pcfread.c (pcf_get_properties): Fix a bug in the nprops
+       truncation.  Reported by Martin von Gagern and Peter Volkov.
+       https://bugs.gentoo.org/288357 and https://bugs.gentoo.org/288256
+
+2009-10-06  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.3.10 released.
+       ==========================
+
+
+       Tag sources with `VER-2-3-10'.
+
+       * builds/toplevel.mk (major, minor, patch): Fix regexp to allow more
+       than a single digit.
+       (dist): We now use git.
+
+       * docs/VERSION.DLL: Update documentation and bump version number to
+       2.3.10.
+
+       * README, Jamfile (RefDoc), builds/win32/visualc/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj,
+       builds/win32/visualce/index.html,
+       builds/win32/visualce/freetype.dsp,
+       builds/win32/visualce/freetype.vcproj: s/2.3.9/2.3.10/, s/239/2310/.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 10.
+
+       * builds/unix/configure.raw (version_info): Set to 9:21:3.
+
+2009-10-06  Werner Lemberg  <wl@gnu.org>
+
+       Fix `make multi'.
+
+       * src/cache/ftccache.c, src/cache/ftcsbits.c (FT_COMPONENT): Define.
+
+       * src/sfnt/sfdriver.c: Include FT_INTERNAL_DEBUG_H.
+
+2009-09-27  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cache] Fix Savannah bug #27441, clean up Redhat bugzilla #513582.
+       Tricky casts in FTC_{CACHE,GCACHE,MRULIST}_LOOKUP_CMP() are removed.
+       Now these functions should be called with FTC_Node or FTC_MruNode
+       variable, and the caller should cast them to appropriate pointers to
+       concrete data.  These tricky casts can GCC-4.4 optimizer (-O2)
+       confused and the crashing binaries are generated.
+
+       * src/cache/ftcmru.h (FTC_MRULIST_LOOKUP_CMP): Drop tricky cast.
+       Now the 4th argument `node' of this function should be typed as
+       FTC_MruNode.
+
+       * src/cache/ftcglyph.h (FTC_GCACHE_LOOKUP_CMP): For inline
+       implementation, new temporal variable FTC_MruNode `_mrunode' to take
+       the pointer from FTC_MRULIST_LOOKUP_CMP().  For non-inline
+       implementation, tricky cast is dropped.
+
+       * src/cache/ftcmanag.c (FTC_SIZE_NODE): New macro casting
+       to FTC_SizeNode.
+       (FTC_Manager_LookupSize): Replace FTC_SizeNode `node' by FTC_MruNode
+       `mrunode', and FTC_SIZE_NODE() is inserted.
+       (FTC_FACE_NODE): New macro casting to FTC_FaceNode.
+       (FTC_Manager_LookupFace) Replace FTC_FaceNode `node' by FTC_MruNode
+       `mrunode', and FTC_FACE_NODE() is inserted.
+
+       * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): Change the type of
+       `node' from FTC_INode to FTC_Node.  Extra casting macro FTC_NODE()
+       is dropped.
+       (FTC_ImageCache_LookupScaler): Ditto.
+       (FTC_SBitCache_Lookup): Change the type of `node' from FTC_SNode to
+       FTC_Node.  Extra casting macro FTC_NODE() is dropped.  FTC_SNODE()
+       is inserted.
+       (FTC_SBitCache_LookupScaler): Ditto.
+
+       * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Change the type of
+       `node' from FTC_CMapNode to FTC_Node.  Extra casting macro
+       FTC_NODE() is dropped, FTC_CMAP_NODE() is inserted.
+
+2009-09-25  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cache, psaux, type1] Fix for multi build.
+       In multi build, some cpp functions are left as unresolved symbols.
+
+       * src/cache/ftcbasic.c: Include FT_INTERNAL_DEBUG_H for FT_TRACE1().
+
+       * src/psaux/t1decode.c: Include FT_INTERNAL_CALC_H for
+       FIXED_TO_INT().
+       * src/type1/t1gload.c: Ditto.
+       * src/type1/t1objs.c: Ditto.
+
+2009-09-25  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [autofit] Fix for multi build.
+
+       * src/autofit/afmodule.h: Include FT_INTERNAL_OBJECTS_H to use
+       FT_DECLARE_MODULE() macro in multi build.
+
+       * src/autofit/aflatin.c: Include <ft2build.h> to handle
+       FT_ADVANCES_H correctly in multi build.
+
+2009-09-24  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cache] Check the face filled by FTC_Manager_LookupFace().
+
+       * src/cache/ftcbasic.c (ftc_basic_family_get_count): Return
+       immediately if FTC_Manager_LookupFace() fills face by NULL.  Such
+       case can occur when the code is optimized by GCC-4.2.x.
+
+2009-09-23  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2009-09-12  Werner Lemberg  <wl@gnu.org>
+
+       [raster] Fix 5-levels grayscale output.
+       This was broken since version 2.3.0.
+
+       * src/raster/ftraster.c (count_table): Use pre-2.3.0 values (which
+       were then computed dynamically).
+       (Vertical_Gray_Sweep_Step): Updated.
+
+       (ft_black_render): Initialize `worker->gray_lines' (problem found by
+       valgrind).
+
+       (FT_RASTER_OPTION_ANTI_ALIASING, DEBUG_RASTER): Dont' #undef, just
+       comment out.
+
+2009-09-12  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Improve configure.raw for cross build.
+
+       * builds/unix/configure.raw: Remove temporal files created by the
+       suffix checking for CC_BUILD.  Set XX_ANSIFLAGS and XX_CFLAGS when
+       cross compiler is GCC.  AC_PROG_CC checks whether the cross compiler
+       is GCC, its result is stored in GCC.
+
+2009-09-12  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [BDF] Modify hash API to take size_t value instead of void *.
+
+       The hash API in BDF driver is designed to be generic, it takes
+       void * typed data.  But BDF driver always gives an unsigned long
+       integer (the index to a property).  To reduce non-essential
+       casts from unsigned long to void* and from void* to unsigned
+       long, the hash API is changed to take size_t integer.
+       The issue of incompatible cast between unsigned long and void*
+       on LLP64 platform is reported by NightStrike from MinGW-Win64
+       project.  See
+       http://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html
+
+       * src/bdf/bdf.h: The type of hashnode->data is changed from
+       void* to size_t.
+
+       * src/bdf/bdflib.c (hash_insert): Get size_t data, instead of
+       void* data.
+       (bdf_create_property): Get the name length of new property by
+       size_t variable, with a cut-off at FT_ULONG_MAX.
+       (_bdf_set_default_spacing): Get the name length of the face by
+       size_t variable, with a cut-off at 256.
+       (bdf_get_property): Get the property id by size_t variable to
+       reduce the casts between 32-bit prop ID & hashnode->data during
+       simple copying.
+       (_bdf_add_property): Ditto.
+       (_bdf_parse_start): Calculate the index to the property array
+       by size_t variable.
+       (bdf_get_font_property): Drop a cast to unsigned long.
+
+2009-09-10  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [Win64] Improve the computation of random seed from stack address.
+
+       On LLP64 platform, the conversion from pointer to FT_Fixed need
+       to drop higher 32-bit.  Explict casts are required. Reported by
+       NightStrike from MinGW-w64 project.  See
+       http://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html
+
+       * src/cff/cffgload.c: Convert the pointers to FT_Fixed explicitly.
+
+       * src/psaux/t1decode.c: Ditto.
+
+
+2009-09-03  Werner Lemberg  <wl@gnu.org>
+
+       [raster] Improvements for stand-alone mode.
+
+       * src/raster/rules.mk: Don't handle ftmisc.h.  It is needed for
+       stand-alone mode only.
+
+       * src/raster/ftmisc.h (FT_MemoryRec , FT_Alloc_Func, FT_Free_Func,
+       FT_Realloc_Func): Copy declarations from ftsystem.h.
+
+2009-09-02  Bram Tassyns  <bramt@enfocus.be>
+
+       Improve vertical metrics calculation (Savannah bug #27364).
+
+       The calculation of `vertBearingX' is not defined in the OTF font
+       spec so FreeType does a `best effort' attempt.  However, this value
+       is defined in the PDF and PostScript specs, and that algorithm is
+       better than the one FreeType currently uses:
+
+         FreeType: Use the middle of the bounding box as the X coordinate
+                   of the vertical origin.
+
+         Adobe PDF spec: Use the middle of the horizontal advance vector as
+                         the X coordinate of the vertical origin.
+
+       FreeType's algorithm goes wrong if you have a really small glyph
+       (like the full-width, circle-like dot at the end of the sentence, as
+       used in CJK scripts) with large bearings.  With the FreeType
+       algorithm this dot gets centered on the baseline; with the PDF
+       algorithm it gets the correct location (in the top right).  Note
+       that this is a serious issue, it's like printing the dot at the end
+       of a Roman sentence at the center of the textline instead of on the
+       baseline like it should. So i believe the PDF spec's algorithm
+       should be used in FreeType as well.
+
+       The `vertBearingY' value for such small glyphs is also very strange
+       if no `vmtx' information is present, since the height of the bbox is
+       not representable for the height of the glyph visually (the
+       whitespace up to the baseline is part of the glyph).  The fix also
+       includes some code for a better estimate of `vertBearingY'.
+
+       * src/base/ftobjs.c (ft_synthesize_vertical_metrics): `vertBearingX'
+       is now calculated as described by the Adobe PDF Spec.  Estimate for
+       `vertBearingY' now works better for small glyphs completely above or
+       below the baseline into account.
+
+       * src/cff/cffgload.c (cff_slot_load): `vertBearingX' is now
+       calculated as described by the Adobe PDF Spec.  Vertical metrics
+       information was always ignored when FT_CONFIG_OPTION_OLD_INTERNALS
+       was not defined.
+
+       * src/truetype/ttgload.c (compute_glyph_metrics): `vertBearingX' is
+       now calculated as described by the Adobe PDF Spec.
+
+2009-09-01  John Tytgat  <John.Tytgat@esko.com>
+
+       Fix custom cmap for empty Type 1 font (Savannah bug #27294).
+
+       * include/freetype/internal/t1types.h (T1_EncodingRecRec_): Update
+       comment to reflect revised code_last meaning.
+       * src/type1/t1load.c (T1_Open_Face), src/type42/t42objs.c
+       (T42_Open_Face): Assign max_char as highest character code + 1 and
+       use this for T1_EncodingRecRec_::code_last.
+       * src/psaux/t1cmap.c (t1_cmap_custom_init): Follow revised
+       T1_EncodingRecRec_::code_last meaning.
+
+2009-08-25  Werner Lemberg  <wl@gnu.org>
+
+       Fix rendering of horizontally compressed CFFs.
+       Bug reported by Ivan Nincic <inincic@pdftron.com>.
+
+       * src/cff/cffgload.c (cff_slot_load): Thinko: Check `xx' element of
+       `font_matrix' also.
+
+       * docs/CHANGES: Updated.
+
+2009-08-03  suyu0925@gmail.com
+
+       Don't call `ft_fseek' every time when executing `ft_fread'.
+
+       * src/base/ftstream.c (FT_Stream_Seek), src/base/ftsystem.c
+       (ft_ansi_stream_io): Implement it.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       sfnt: Cast a charcode to 32-bit in cmap format 14 parser.
+       
+       * src/sfnt/ttcmap.c (tt_cmap14_char_var_index,
+       tt_cmap14_char_var_isdefault, tt_cmap14_char_variants,
+       tt_cmap14_variant_chars): Correct mismatches from
+       FT_CMap_CharVarIndexFunc prototype, FT_ULong arguments
+       are replaced by FT_UInt32 arguments.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       sfnt: Cast a charcode to 32-bit in cmap format 12 parser.
+
+       * src/sfnt/ttcmap.c (tt_cmap12_char_next):
+       Insert explicit cast from FT_UFast to FT_UInt32
+       for return value.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       psaux: Fix a few casts to FT_Int32 value.
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings):
+       Fix a few casts setting `value' from FT_Long to FT_Int32,
+       because `value' is typed as FT_Int32 since 2009-06-22.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       sfnt: Fix a data type mismatching with its source.
+
+       * src/sfnt/ttcmap.c (tt_cmap13_char_next): Fix the
+       type of `gindex' from FT_ULong to FT_UInt because
+       it is set by FT_UInt tt_cmap13_char_map_binary() or
+       TT_CMap13->cur_gindex.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       sfnt: Extend a few local variables to load 32-bit values.
+
+       * src/sfnt/ttkern.c (tt_face_load_kern): Extend `count'
+       and `kern' to load 32-bit values.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       pfr: Extend `num_aux' to take 32-bit value.
+
+       * src/pfr/pfrload.c (pfr_phy_font_load): Extend
+       `num_aux' to load 32-bit value.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       pcf: Truncate FT_ULong `nprops' to fit to int PCF_Face->nprops.
+
+       * src/pcf/pcfread.c (pcf_get_properties): Load `nprops'
+       as FT_ULong value from PCF file, but truncate it as
+       int to fit PCF_Face->nprops.  The number of truncated
+       properties is shown in the trace message.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       gxvalid: Extend a few local variables to reduce the casts.
+
+       * src/gxvalid/gxvmorx.c (gxv_morx_subtables_validate):
+       Extend `type' and `rest' to take FT_ULong values.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       gxvalid: Extend `settingTable' to take 32-bit offset.
+
+       * src/gxvalid/gxvfeat.c (gxv_feat_name_validate):
+       Extend `settingTable' to take 32-bit offset.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       autofit: Cast FT_Long glyph_count to compare with FT_UInt GID.
+
+       * src/autofit/afglobal.c (af_face_globals_is_digit,
+       af_face_globals_compute_script_coverage): Cast FT_Long
+       globals->glyph_count to FT_ULong, to compare with FT_UInt
+       gindex.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       smooth: Exclude 16-bit system in invalid pitch/height check.
+
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic):
+       pitch and height are typed as FT_UInt but checked to fit
+       16-bit range, to avoid the overflows.  On 16-bit system,
+       this checking inserts a conditional that never occurs.
+
+2009-07-03  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       cff: Type large constants > 0x7FFF as long for 16-bit systems.
+
+       * src/cff/cffload.c (cff_charset_load): Type large
+       constants > 0x7FFF as long, because normal constants
+       are typed signed integer that is less than 0x8000 on
+       16-bit systems.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       base: Remove an unused variable.
+
+       * src/base/ftglyph.c (FT_Glyph_To_Bitmap): Remove an
+       unused variable `library'.  glyph->library is used.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       cache: Check higher bits in flags for non ILP32 systems.
+
+       4 public functions ought to take FT_ULong flags, but take
+       FT_UInt flags. To keep binary compatibility, we drop higher
+       bits on non ILP32 platforms,
+               ILP64 systems: No drop occurs.
+               LP64 systems: Higher bits are not used.
+               16-bit systems: Drop can occur.
+       See
+       http://lists.gnu.org/archive/html/freetype-devel/2008-12/msg00065.html
+       These functions will be refined to take FT_ULong flags in
+       next bump with incompatible API change.
+
+       * src/cache/ftcbasic.c (FTC_ImageCache_Lookup):
+       Check `flags' in `type', the 2nd argument.
+       (FTC_SBitCache_Lookup): Ditto.
+       (FTC_ImageCache_LookupScaler): Check `load_flags',
+       the 3rd argument.
+       (FTC_SBitCache_LookupScaler): Ditto.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       sfnt: Ignore invalid GIDs in glyph name lookup.
+
+       * include/freetype/internal/fttrace.h:
+       New trace module for sfdriver.c is added.
+
+       * src/sfnt/sfdriver.c (sfnt_get_name_index):
+       Restrict glyph name lookup to FT_UInt GID.
+       Genuine TrueType can hold 16-bit glyphs.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       pcf: Fix a comparison between FT_Long and FT_ULong.
+
+       * src/pcf/pcfread.c (pcf_get_bitmaps): Return an error
+       if PCF_Face->nemetrics is negative.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       gxvalid: Guarantee `nFeatureFlags' size up to 32-bit.
+
+       * src/gxvalid/gxvmort.c (gxv_mort_featurearray_validate):
+       Extend the 3rd argument `nFeatureFlags' to FT_ULong.
+       * src/gxvalid/gxvmort.h: Ditto.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       sfnt: Insert explicit cast for LP64 system.
+
+       * src/sfnt/ttkern.c (tt_face_load_kern): Insert
+       cast from unsigned long to FT_UInt32.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       gxvalid: Guarantee `just' table size upto 32-bit.
+
+       * src/gxvalid/gxvjust.c (gxv_just_validate):
+       The type of `offset' is changed from FT_UInt to
+       FT_Offset, for 16-bit platforms.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       gxvalid: Guarantee `trak' table size upto 32-bit.
+
+       * src/gxvalid/gxvtrak.c (gxv_trak_validate):
+       The type of `offset' is changed from FT_UInt to
+       FT_Offset, for 16-bit platforms.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       type1: Fix a data type mismatching with its source.
+
+       * include/freetype/internal/t1types.h: The type of
+       T1_Face->buildchar is matched with T1_Decorder->top.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       pfr: Fix a data type mismatching with its source.
+
+       * src/pfr/pfrtypes.h: The type of PFR_KernItem->offset
+       is extended from FT_UInt32 to FT_Offset, because it is
+       calculated with the pointer difference, in
+       pfr_extra_item_load_kerning_pairs().
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       pfr: Fix a data type mismatching with its source.
+
+       * src/pfr/pfrtypes.h: The type of PFR_PhysFont->chars_offset
+       is extended from FT_UInt32 to FT_Offset, because it is
+       calculated with the pointer difference in pfr_phy_font_load().
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       pfr: Fix a data type mismatching with its source.
+
+       * src/pfr/pfrtypes.h: The type of PFR_PhyFont->bct_offset
+       is extended from FT_UInt32 to FT_Long, because it is
+       loaded by FT_STREAM_POS() in pfr_phy_font_load().
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       smooth: Improve the format in debug message.
+
+       * src/smooth/ftgrays.c (gray_dump_cells): Improve the
+       format specifications to dump variables.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       sfnt: Fix a data type mismatching with its source.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): The type of
+       local `flags' is matched with FT_Face->face_flags.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       psaux: Fix a data type mismatching with its source.
+
+       * include/freetype/internal/psaux.h: The type of
+       T1_DecorderRec.buildchar is matched with
+       T1_DecorderRec.top.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       truetype: Extend TrueType GX packed deltas to FT_Offset.
+
+       * src/truetype/ttgxvar.c (ft_var_readpackeddeltas):
+       The type of 2nd argument `delta_cnt' is changed from
+       FT_Int to FT_Offset, because its source can be cvt
+       table size calculated from stream position.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       truetype: Extend mmvar_len to hold size_t values.
+
+       * src/truetype/ttgxvar.h: The type of
+       GX_BlendRec.mmvar_len is changed from FT_Int to
+       FT_Offset, because TT_Get_MM_Var() calculates it
+       by sizeof() results.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       truetype: Check invalid function number in IDEF instruction.
+
+       * src/truetype/ttinterp.c (Ins_IDEF): Check
+       if the operand fits to 8-bit opcode limitation.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       truetype: Check invalid function number in FDEF instruction.
+
+       * src/truetype/ttinterp.c (Ins_FDEF): Check
+       if the operand fits 16-bit function number.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       truetype: Truncate the deltas of composite glyph at 16-bit values.
+
+       * src/truetype/ttgload.c (load_truetype_glyph):
+       Insert cast from FT_Long (deltas[i].{x,y}) to
+       FT_Int16 in the summation of deltas[] for composite
+       glyphs.  Because deltas[i] is typed as FT_Pos,
+       its component x, y are typed as FT_Long, but
+       their sources are always FT_Int16 when they are
+       loaded by ft_var_readpackeddeltas().  However,
+       the limitation about the summed deltas is unclear.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       truetype: Truncate the instructions upto 16-bit per a glyph.
+
+       * src/truetype/ttgload.c (TT_Hint_Glyph): Truncate
+       the instructions upto 16-bit length per a glyph.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       truetype: Cast the numerical operands to 32-bit for LP64 systems.
+
+       * src/truetype/ttinterp.c (Ins_SPHIX, INS_MIAP,
+       Ins_MIRP): Insert cast from long (args[], the
+       operands passed to TrueType operator) to FT_Int32
+       (the argument of TT_MulFix14()).
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       truetype: Cast the project vector to 32-bit for LP64 system.
+
+       * src/truetype/ttinterp.c (Project, DualProject):
+       Insert casts from FT_Pos (the arguments `dx', `dy')
+       to FT_UInt32 (the argument to TT_DotFix14()).
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       truetype: Cast the scaling params to 32-bit for LP64 system.
+
+       * src/truetype/ttgload.c (TT_Process_Composite_Component):
+       Insert casts from long (return value of FT_MulFix()) to
+       FT_Int32 (the argument to FT_SqrtFixed()).
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       sfnt: Cast a character code to FT_UInt32 for LP64 system.
+
+       * src/sfnt/ttcmap.c (tt_cmap14_char_map_nondef_binary,
+       tt_cmap14_variants, tt_cmap14_char_variants,
+       tt_cmap14_def_char_count, tt_cmap14_get_def_chars,
+       tt_cmap14_get_nondef_chars, tt_cmap14_variant_chars)
+       Insert casts when FT_UInt32 variable is loaded by
+       TT_NEXT_{UINT24|ULONG}.  Because most of them are
+       compared with FT_UInt32 values in public API, replacing
+       FT_UFast is not recommended.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       sfnt: Cast a character code to FT_UInt32 for LP64 system.
+
+       * src/sfnt/ttcmap.c (tt_cmap4_init, tt_cmap4_next):
+       Insert the casts from unsigned long constant to
+       FT_UInt32.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       sfnt: Extend TT_BDF->strings_size to FT_ULong for huge BDF.
+
+       * include/freetype/internal/tttypes.h: The type
+       of TT_BDF->string_size is extended from FT_UInt32
+       to FT_ULong, because BDF specification does not
+       restrict the length of string.
+       * src/sfnt/ttbdf.c: The scratch variable `strings'
+       to load TT_BDF->string_size is matched with
+       TT_BDF->string_size.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       psaux: Handle the string length by FT_Offset variables.
+
+       * src/psaux/afmparse.c (afm_parser_next_key,
+       afm_tokenize, afm_parse_track_kern,
+       afm_parse_kern_pairs, afm_parse_kern_data,
+       afm_parser_skip_section, afm_parser_parse):
+       The length of key is handled by FT_Offset,
+       instead of FT_UInt.  Although the length of
+       PostScript strings or name object is 16-bit,
+       AFM_STREAM_KEY_LEN() calculates the length
+       from the pointer difference.
+
+       * src/psaux/afmparse.h (afm_parser_next_key):
+       Ditto.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       pcf: Fix some data types mismatching with their sources.
+
+       * src/pcf/pcfread.c (pcf_get_bitmaps): The types
+       of `nbitmaps', `i', `sizebitmaps' are matched with
+       the type of area FT_Bitmap.pitch * FT_Bitmap.rows.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       pcf: Handle the string length by size_t variables.
+
+       * src/pcf/pcfread.c (pcf_interpret_style): The types
+       of nn, len, lengths[4] are changed to size_t, because
+       they are loaded by (or compared with) ft_strlen().
+
+       * src/pcf/pcfutil.c (BitOrderInvert, TwoByteSwap,
+       FourByteSwap): The type of the 2nd argument `nbytes'
+       is changed to size_t, for similarity with ANSI C
+       string functions.
+
+       * src/pcf/pcfdrivr.c (PCF_Glyph_Load): The type of
+       `bytes' is changed to FT_Offset, because it is passed
+       to FT_ALLOC(), via ft_glyphslot_alloc_bitmap().  At
+       least, using unsigned type is better.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       pcf: Fix some data types mismatching with their sources.
+
+       * src/pcf/pcfread.c (pcf_seek_to_table_type,
+       pcf_has_table_type): The type of 3rd argument
+       `ntables' is matched with PCF_Toc->count.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       otvalid: Truncate the glyph index to 16-bit.
+
+       * src/otvalid/otvalid.c (otv_validate): Checks
+       face->num_glyphs does not exceed 16-bit limit,
+       pass FT_UInt num_glyphs to backend functions
+       otv_{GPOS|GSUB|GDEF|JSTF|MATH}_validate().
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       cache: Insert explict casts for LP64 systems.
+
+       * src/cache/ftcbasic.c (FTC_ImageCache_Lookup,
+       FTC_SBitCache_Lookup): The type of FTC_ImageType->width
+       is FT_Int, so the cast to unsigned larger type FT_ULong
+       is introduced for the comparisons with 0x10000L for
+       LP64 platform.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       cache: Fix some data types mismatching with their sources.
+
+       * src/cache/ftccache.h: The type of return value
+       by FTC_Node_WeightFunc function is changed to
+       FT_Offset.  The type of FTC_CacheClass->cache_size
+       is changed to FT_Offset, too.
+
+       * src/cache/ftccback.h (ft_inode_weight,
+       ftc_snode_weight): Ditto.
+
+       * src/cache/ftccmap.c (ftc_cmap_node_weight): Ditto.
+
+       * src/cache/ftcimage.c (ftc_inode_weight,
+       FTC_INode_Weight): Ditto.
+
+       * src/cache/ftcsbits.c (ftc_snode_weight,
+       FTC_SNode_Weight): Ditto.
+
+       * src/cache/ftcmru.h: The type of
+       FTC_MruListClass->node_size is changed to FT_Offset,
+       because it is passed to FT_ALLOC() to specify the
+       size of buffer.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       XXX_cmap_encoding_char_next() return FT_UInt32 values.
+
+       * include/freetype/internal/services/svpscmap.h:
+       The size of the charcode value returned by
+       the function typed PS_Unicodes_CharNextFunc is
+       matched with its input charcode value.
+
+       * src/cff/cffmap.c (cff_cmap_encoding_char_next,
+       cff_cmap_unicode_char_next): Ditto.
+
+       * src/pfr/pfrmap.c (pfr_cmap_encoding_char_next):
+       Ditto.
+
+       * src/psaux/t1cmap.c (t1_cmap_std_char_next,
+       t1_cmap_custom_char_next, t1_cmap_unicode_char_next):
+       Ditto.
+
+       * src/psnames/psmodule.c (ps_unicodes_char_next):
+       Ditto.
+
+       * src/winfonts/winfnt.c (fnt_cmap_char_next):
+       Ditto.
+
+       * src/sfnt/ttcmap.c (tt_cmap0_char_next,
+       tt_cmap2_char_next, tt_cmap4_char_next,
+       tt_cmap6_char_next, tt_cmap10_char_next,
+       tt_cmap12_char_next, tt_cmap13_char_next): Ditto.
+       (tt_cmap14_char_variants): Handle base unicode
+       codepoint by FT_UInt32 variable to avoid overflow
+       on 16-bit platforms.
+       (tt_cmap14_ensure): The type of `num_results' is
+       extend to FT_UInt32, to cover unsigned 32-bit
+       `numVarSelectorRecords' in cmap14 table header.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       truetype: Extend TT_Face->num_locations for broken TTFs.
+
+       * include/freetype/internal/tttypes.h:
+       TT_Face->num_locations are extended from FT_UInt
+       to FT_ULong, to stand with broken huge loca table.
+       Some people insists there are broken TTF including
+       the glyphs over 16-bit limitation, in PRC market.
+       * src/truetype/ttpload.c (tt_face_load_loca):
+       Remove unrequired 16-bit truncation for FT_UInt
+       TT_Face->num_locations.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       smooth: Fix some data types mismatching with their sources.
+
+       * src/smooth/ftgrays.c: The type of `TCoord' is
+       matched to `TPos', because they are mixed in
+       gray_set_cell().  The type of TCell->x is extended
+       to `TPos', because gray_find_cell() sets it by
+       TWorker.ex.  The type of TCell->cover is extended
+       to `TCoord', because gray_render_scanline() adds
+       TCoord value to it.  The type of TWork.cover is matched
+       with TCell->cover.  The types of
+       TWork.{max_cells,num_cells} are changed to FT_PtrDist,
+       because they are calculated from the memory addresses.
+       The type of TWork.ycount is changed to TPos, because
+       it is calculated from TPos variables.
+       (gray_find_cell): The type of `x' is matched with
+       its initial value ras.ex.
+       (gray_render_scanline): The types of `mod', `lift'
+       and `rem' are changed to TCoord, because their values
+       are set with explicit casts to TCoord.  When ras.area
+       is updated by the differential values including
+       `delta', they are explicitly cast to TArea, because
+       the type of `delta' is not TArea but TCoord.
+       (gray_render_line): The type of `mod' is extended
+       from int to TCoord, because (TCoord)dy is added to mod.
+       (gray_hline): The argument `acount' is extended to
+       TCoord, to match with the parameters in the callers.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       cff: Fix some data types mismatching with their sources.
+
+       * src/cff/cffobjs.c (cff_face_init): The type of
+       `scaling' is matched with the scaling parameter
+       in FT_Matrix_Multiply_Scaled() and
+       FT_Vector_Transform_Scaled().
+
+       * src/cff/cffparse.c (cff_parse_real): The type of
+       `power_ten', `scaling', `exponent_add',
+       `integer_length', `fraction_length',
+       `new_fraction_length' and `shift' are matched with
+       the type of `exponent' to avoid unexpected truncation.
+       (cff_parse_fixed_scaled): The type of `scaling' is
+       matched with the `scaling' argument to
+       cff_parse_real().
+       (cff_parse_fixed_dynamic): Ditto.
+       (cff_parse_font_matrix): The type of `scaling' is
+       matched with the `scaling' argument to
+       cff_parse_dynamic().
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       autofit: Fix some data types mismatching with their sources.
+
+       * src/autofit/afglobal.c: Correct the type of
+       AF_FaceGlobalsRec.glyph_count to match with
+       FT_Face->num_glyphs.
+       (af_face_globals_compute_script_coverage):
+       Insert explicit cast to compare
+       FT_Long AF_FaceGlobalsRec.glyph_count versus
+       FT_UInt gindex.  The type of `nn' is changed
+       to scan glyph index upto AF_FaceGlobalsRec.glyph_count.
+       (af_face_globals_get_metrics): The type of `script_max'
+       is changed to cover size_t value.  Insert explicit cast
+       to compare FT_Long AF_FaceGlobalsRec.glyph_count versus
+       FT_UInt gindex.
+
+       * src/autofit/afhints.c (af_axis_hints_new_segment):
+       Insert explicit cast to calculate `big_max' from
+       integer and size_t values.
+       (af_axis_hints_new_edge): Ditto.
+
+       * src/autofit/aflatin.c (af_latin_metrics_init_blues):
+       The type of `best_y' is matched to FT_Vector.y.
+       (af_latin_compute_stem_width): The type of `delta' is
+       matched to `dist' and `org_dist'.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       autofit: Count the size of the memory object by ptrdiff_t.
+
+       * src/autofit/afcjk.c (af_cjk_hint_edges): The
+       number of edges `n_edges' should be counted by
+       FT_PtrDist variable instead of FT_Int.
+
+       * src/autofit/aflatin.c (af_latin_hint_edges):
+       Ditto.
+
+       * src/autofit/aftypes.h: In AF_ScriptClassRec,
+       the size of metric `script_metrics_size' should
+       be counted by FT_Offset variable instead of FT_UInt.
+
+       * src/autofit/afhints.c
+       (af_glyph_hints_align_strong_points): The cursors
+       for the edges `min', `max', `mid' in the memory
+       buffer should be typed FT_PtrDist.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       autofit: Fix for unused variable `first'.
+
+       * src/autofit/afhints.c (af_glyph_hints_reload): Insert
+       FT_UNUSED() to hide the unused variable warning.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Improve bitmap size or pixel variables for 16-bit systems.
+
+       * include/freetype/config/ftstdlib.h: Introduce
+       FT_INT_MIN, to use in signed integer overflow in
+       16-bit and 64-bit platforms.
+       
+       * include/freetype/internal/fttrace.h: Add a tracer
+       to ftsynth.c.
+       
+       * src/base/ftbitmap.c (FT_Bitmap_Embolden): Check
+       invalid strength causing integer overflow on 16-bit
+       platform.
+       
+       * src/base/ftcalc.c (ft_corner_orientation): Change
+       the internal calculation from FT_Int to FT_Long, to
+       avoid an overflow on 16-bit platforms.  The caller of
+       this function should use only the sign of result,
+       so the cast to FT_Int is acceptable.
+       
+       * src/base/ftsynth.c: Introduce a tracer for synth module.
+       (FT_GlyphSlot_Embolden): Check invalid strength causing
+       integer overflow on 16-bit platform.
+       
+       * src/bdf/bdfdrivr.c (BDF_Face_Init): The glyph index
+       in FT2 API is typed as FT_UInt, although BDF driver
+       can handle unsigned long glyph index internally.  To
+       avoid integer overflow on 16-bit platform, too large
+       glyph index should be excluded.
+       (BDF_Glyph_Load): The glyph pitch in FT2 is typed as
+       FT_UInt, although BDF driver can handle unsigned long
+       glyph pitch internally.  To avoid integer overflow on
+       16-bit platform, too large glyph pitch should not be
+       returned.
+       
+       * src/pfr/pfrsbit.c (pfr_slot_load_bitmap): The glyph
+       pitch in FT2 is typed as FT_UInt, although PFR font
+       format can include huge bitmap glyph with 24-bit pitch
+       (however, a glyph spends 16.7 pixel, it's not realistic).
+       To avoid integer overflow on 16-bit platform, huge
+       bitmap glyph should be excluded.
+       
+       * src/smooth/ftgrays.c (gray_hline): As FT_Span.x is
+       truncated to fit its type (16-bit short), FT_Span.y
+       should be truncated to fit its type (FT_Int).
+       
+       * src/cff/cffdrivr.c (cff_get_ros): CFF specification
+       defines the supplement in ROS as a real number.
+       Truncate it to fit public FT2 API.
+       
+       * src/cff/cffparse.c (cff_parse_cid_ros): Warn the
+       supplement if it is truncated or rounded in cff_get_ros().
+       
+       * src/cff/cfftypes.h: Change the type of internal variable
+       `supplement' from FT_Long to FT_ULong to fit the signedness
+       to the type in public API.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       psaux: Prevent invalid arguments to afm_parser_read_vals().
+
+       * src/psaux/afmparse.c (afm_parser_read_vals): Change
+       the type of `n' to prevent negative number how many
+       arguments should be parsed.
+
+       * src/psaux/afmparse.h (afm_parser_read_vals): Ditto.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       base: Prevent some overflows on LP64 systems.
+
+       * src/base/ftadvance.c (FT_Get_Advances): Cast the
+       unsigned long constant FT_LOAD_ADVANCE_ONLY to FT_UInt32
+       for LP64 platforms.
+
+       * src/base/ftcalc.c (FT_Sqrt32): All internal variables
+       are changed to FT_UInt32 from FT_ULong.
+       (FT_MulDiv): Insert casts to FT_Int32 for LP64 platforms.
+       This function is designed for 32-bit integer, although
+       their arguments and return value are FT_Long.
+
+       * src/base/ftobjs.c (FT_Get_Char_Index): Check `charcode'
+       is within unsigned 32-bit integer for LP64 platforms.
+       (FT_Face_GetCharVariantIndex): Check `charcode' and
+       `variantSelector' are within 32-bit integer for LP64
+       platforms.
+       (FT_Face_GetCharsOfVariant): Check `variantSelector' is
+       within unsigned 32-bit integer for LP64 platforms.
+
+       * src/base/fttrigon.c (ft_trig_downscale): The FT_Fixed
+       variable `val' and unsigned long constant FT_TRIG_SCALE
+       are cast to FT_UInt32, when calculates FT_UInt32.
+       (FT_Vector_Rotate): The long constant 1L is cast to
+       FT_Int32 to calculate FT_Int32 `half'.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       cff: Cast the long variables to 32-bit for LP64 systems.
+
+       * src/cff/cffdrivr.c (cff_get_advances): Insert
+       explicit cast to modify a 32-bit flag by unsigned
+       long constant.
+
+       * src/cff/cffobjs.c (cff_face_init): Ditto.
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings):
+       Replace the casts to FT_Long by the casts to FT_Int32
+       for LP64 platforms.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       pcf: Improve PCF_PropertyRec.value names on LP64 platforms.
+
+       * src/pcf/pcf.h: In PCF_PropertyRec.value, the member
+       `integer' is replaced by `l', `cardinal' is replaced
+       by `ul', to fix the difference between the name and
+       the types on LP64 platforms.
+
+       * src/pcf/pcfdrivr.c (pcf_get_bdf_property): Reflect
+       PCF_PropertyRec.value change, with appropriate casts
+       to FT_Int32/FT_UInt32.  Their destinations
+       BDF_PropertyRec.{integer|cardinal} are public and
+       explicitly defined as FT_Int32/FT_UInt32.
+
+       * src/pcf/pcfread.c (pcf_get_properties, pcf_load_font):
+       Reflect PCF_PropertyRec.value change.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       pcf: Fix some data types mismatching with their sources.
+
+       * src/pcf/pcfdrivr.c (pcf_cmap_char_index): The type of
+       `code' is matched to PCF_Encoding->enc.
+       (pcf_cmap_char_next): The type of `charcode' is matched
+       to PCF_Encoding->enc.  When *acharcode is set by charcode,
+       an overflow is checked and cast to unsigned 32-bit
+       integer.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       bdf: Improve bdf_property_t.value names for LP64 platforms.
+
+       * src/bdf/bdf.h: In bdf_property_t.value, the member
+       `int32' is replaced by `l', `card32' is replaced by
+       `ul', to fix the difference between the name and the
+       types on LP64 platforms.
+
+       * src/bdf/bdfdrivr.c (BDF_Face_Init): Reflect
+       bdf_property_t.value change.
+       (bdf_get_bdf_property): Reflect bdf_property_t.value
+       change, with appropriate casts to FT_Int32/FT_UInt32.
+       Their destinations BDF_PropertyRec.{integer|cardinal}
+       are public and explicitly defined as FT_Int32/FT_UInt32.
+
+       * src/bdf/bdflib.c (_bdf_add_property): Reflect
+       bdf_property_t.value change.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       bdf: Fix some data types mismatching with their sources.
+
+       * src/bdf/bdrdrivr.c (bdf_cmap_char_index): The type
+       of `code' is matched with BDF_encoding_el->enc.
+       (bdf_cmap_char_next): The type of `charcode' is
+       matched with BDF_encoding_el->enc.  When *acharcode
+       is set by charcode, an overflow is checked and
+       cast to unsigned 32-bit integer.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       autofit: Improve Unicode range definitions.
+
+       * src/autofit/aftypes.h (AF_UNIRANGE_REC): New macro
+       to declare a range by two unsigned 32-bit integer,
+       to avoid 64-bit range definition on LP64 platforms.
+
+       * src/autofit/aflatin.c (af_latin_uniranges): Ditto.
+
+       * src/autofit/aflatin2.c (af_latin2_uniranges): Ditto.
+
+       * src/autofit/afindic.c (af_indic_uniranges): Ditto.
+
+       * src/autofit/afcjk.c (af_cjk_uniranges): Declare
+       the ranges by AF_UNIRANGE_REC.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       smooth: Fix a data type mismatching with its source.
+
+       * src/smooth/ftgrays.c (gray_sweep): The type of
+       `area' is matched with the 3rd argument `area'
+       of gray_hline().
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       smooth: Fix a data type mismatching with its source.
+
+       * src/smooth/ftgrays.c (gray_render_line): The type
+       of `area' is matched with TWorker.area.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       cache: Disable the legacy compatibility if 16-bit system.
+
+       * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): Exclude
+       the legacy behaviour from 16-bit platform, because the
+       current hack cannot detect the caller uses this function
+       via legacy convension.
+       (FTC_SBitCache_Lookup): Ditto.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       cache: Check 32-bit glyph index on 16-bit systems.
+
+       * src/cache/ftcbasic.c (ftc_basic_family_get_count):
+       Check overflow caused by the face including large
+       number of glyphs > 64k.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       cache: Fix some data types mismatching with their sources.
+
+       * src/cache/ftccache.c (ftc_cache_resize): The types of
+       `p', `mask', `count' are matched with FTC_Cache->{p,mask}.
+       (FTC_Cache_Clear): The type of `old_index' is matched to
+       FTC_Cache->{p,mask}.
+
+       * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP): The type
+       of `_idx' is matched with FTC_Cache->{p,mask}.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       cache: Fix some data types mismatching with their sources.
+
+       * src/cache/ftcsbits.c (ftc_snode_load): The types
+       of `xadvance' and `yadvance' are matched with
+       FT_GlyphSlot->advance.{x|y}.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       cache: Cast NULL to a required function type explicitly.
+
+       * src/cache/ftcmanag.c (FTC_Manager_RemoveFaceID):
+       Insert explicit cast from NULL to function type.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       fttypes.h: Cast FT_MAKE_TAG output to FT_Tag exlicitly.
+
+       * include/freetype/fttypes.h (FT_MAKE_TAG):
+       Cast the result to FT_Tag.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       psnames: Handle Unicode codepoints by FT_UInt32 variables.
+
+       * src/psnames/psmodule.c (BASE_GLYPH): Cast the result
+       to unsigned 32-bit integer for LP64 platform.
+       (ps_unicode_value): Return the value by unsigned 32-bit
+       integer instead of unsigned long.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       psaux: Use size_t variable to pass the buffer size.
+
+       * src/psaux/psaux.h (to_bytes): The type of `max_bytes'
+       (the argument to pass the buffer size) is changed to
+       size_t, to match with ANSI C string functions.
+
+       * src/psaux/psconv.h (PS_Conv_StringDecode,
+       PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Ditto.
+
+       * src/psaux/psconv.c (PS_Conv_StringDecode,
+       PS_Conv_ASCIIHexDecode, PS_Conv_EexecDecode): Ditto.
+
+       * src/psaux/psobjs.h (ps_parser_to_bytes): Ditto.
+
+       * src/psaux/psobjs.c (ps_parser_to_bytes): Ditto.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       type1: Use size_t variable to pass the string length.
+
+       * psaux.h: The type of `len' (the argument to pass
+       the buffer size to the function in AFM_ParserRec)
+       is changed to size_t, to match with ANSI C string
+       functions.
+
+       * t1afm.c (t1_get_index): Ditto.
+
+       * test_afm.c (dummy_get_index): Ditto.
+
+       * afmparse.c (afm_parser_read_vals): To call
+       AFM_ParserRec.get_index, the length of token
+       `len' is cast to size_t.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       cid: Fix some data types mismatching with their sources.
+
+       * src/cid/cidparse.c (cid_parser_new): The types of
+       `read_len' and `stream_len' are matched to
+       FT_Stream->size.  Unrequired cast is removed.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       cff: Fix for unused variable `rest'.
+
+       * src/cff/cffparse.c (cff_parse_real): Insert
+       FT_UNUSED() to hide the unused variable warning.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       cff: Fix some data types mismatching with their sources.
+
+       * src/cff/cffgload.c (cff_slot_load): The types of      
+       `top_upm' and `sub_upm' are matched with
+       CFF_FontRecDict->units_per_em.
+
+       * src/cff/cffobjs.c (cff_size_select): Ditto.
+       (cff_size_request): Ditto.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       bdf: Fix some data types mismatching with their sources.
+
+       * bdflib.c (_bdf_list_ensure): The type of `num_items'
+       is matched with _bdf_list_t.used.  Also the types of
+       `oldsize', `newsize', `bigsize' are matched too.
+       (_bdf_readstream): `cursor' is used as an offset to
+       the pointer, it should be typed as FT_Offset.  Also
+       the types of `bytes', `start', `end', `avail' are matched.
+
+       * bdfdrivr.c: The type of BDF_CMap->num_encodings is
+       matched with FT_CMap->clazz->size.
+       (bdf_cmap_char_index): The types of `min', `max', `mid'
+       are matched with BDF_CMap->num_encodings.  The type of
+       `result' is matched with encoding->glyph.
+       (bdf_cmap_char_next): Ditto, the type of `code' is
+       matched with BDF_encoding_el.enc.
+       (bdf_interpret_style): The type of `lengths' is changed
+       to size_t, to take the value by ft_strlen().  Also the
+       types of `len', `nn', `mm' are matched.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       sfnt: Count the size of the memory object by ptrdiff_t.
+
+       * src/sfnt/ttbdf.c (tt_face_find_bdf_prop): The type of
+       `peroperty_len' is changed from FT_UInt to FT_Offset,
+       to match with size_t, which is appropriate type for the
+       object in the memory buffer.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       lzw: Count the size of the memory object by ptrdiff_t.
+
+       * src/lzw/ftzopen.h: The types of FT_LzwState->{buf_total,
+       stack_size} are changed from FT_UInt to FT_Offset, to match
+       with size_t, which is appropriate type for the object in
+       the memory buffer.
+
+       * src/lzw/ftzopen.c (ft_lzwstate_stack_grow): The types of
+       `old_size' and `new_size' are changed from FT_UInt to
+       FT_Offset, to match with size_t, which is appropriate type
+       for the object in the memory buffer.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       otvalid: Count the table size on memory by ptrdiff_t.
+
+       * src/otvalid/otvgpos.c (otv_ValueRecord_validate):
+       Change the type of table size from FT_UInt to
+       FT_PtrDist because it is calculated by the memory
+       addresses.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       otvalid: Prevent an overflow by GPOS/GSUB 32b-bit offset.
+
+       * src/otvalid/otvgpos.c (otv_ExtensionPos_validate):
+       Extend ExtensionOffset from FT_UInt to FT_ULong, to
+       cover 32-bit offset on 16-bit platform.
+
+       * src/otvalid/otvgsub.c (otv_ExtensionSubst_validate):
+       Ditto.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       ftobjs.c: Prevent an overflow in glyph index handling.
+
+       * src/base/ftobjs.c (FT_Face_GetCharsOfVariant):
+       Improve the cast in comparison to avoid the truncation.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Improve the variable types in raccess_make_file_name().
+
+       * src/base/ftrfork.c (raccess_make_file_name):
+       Change the type of cursor variable `tmp' to const char*,
+       to prevent the unexpected modification of original pathname.
+       (raccess_make_file_name): Change the type of new_length
+       to size_t.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       ftpatent.c: Fix for unused variable `error'.
+
+       * src/base/ftpatent.c (_tt_check_patents_in_range):
+       Fix warning for unused variable `error'.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       type1: Check invalid string longer than PostScript limit.
+
+       * src/type1/t1afm.c (t1_get_index): Check invalid string
+       which exceeds the limit of PostScript string/name objects.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       gzip: Use FT2 zcalloc() & zfree() in ftgzip.c by default.
+
+       * src/gzip/ftgzip.c (zcalloc, zcfree): Disable all
+       zcalloc() & zfree() by zlib in zutil.c, those in
+       ftgzip.c by FT2 are enabled by default.  To use
+       zlib zcalloc() & zfree(), define USE_ZLIB_ZCALLOC.
+       See discussion:
+       http://lists.gnu.org/archive/html/freetype-devel/2009-02/msg00000.html
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       gzip: Distinguish PureC from TurboC on MSDOS.
+
+       * src/gzip/zutil.c (zcalloc, zcfree): Enable only for
+       MSDOS platform.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       gxvalid: Insert PureC pragma to allow unevaluated variables.
+
+       * builds/atari/ATARI.H: Insert PureC pragma not to
+       warn against set-but-unevaluated variable in gxvalid
+       module.
+
+2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       gxvalid: Pass the union by the pointer instead of the value.
+
+       * src/gxvalid/gxvcommn.h:
+         - Declare new type `GXV_LookupValueCPtr'.
+         - Update the type of the 2nd argument to pass GXV_LookupValueDesc
+           data to the function prototyped as GXV_Lookup_Value_Validate_Func,
+           from GXV_LookupValueDesc to GXV_LookupValueCPtr.
+         - Likewise for the function prototyped as
+           GXV_Lookup_Fmt4_Transit_Func.
+
+         - Declare new type `GXV_StateTable_GlyphOffsetCPtr'.
+         - Update the type of the 3rd argument to pass
+           GXV_StateTable_GlyphOffsetDesc data to the function prototyped
+           as GXV_StateTable_Entry_Validate_Func, from
+           GXV_StateTable_GlyphOffsetDesc to GXV_StateTable_GlyphOffsetCPtr.
+
+         - Declare new type `GXV_XStateTable_GlyphOffsetCPtr'.
+         - Update the type of the 3rd argument to pass
+           GXV_XStateTable_GlyphOffsetDesc data to the function prototyped
+           as GXV_XStateTable_Entry_Validate_Func,
+           from GXV_XStateTable_GlyphOffsetDesc
+           to GXV_XStateTable_GlyphOffsetCPtr.
+
+       * src/gxvalid/gxvcommn.c (gxv_LookupTable_fmt0_validate,
+       gxv_XClassTable_lookupval_validate,
+       gxv_XClassTable_lookupfmt4_transit):
+       Update from GXV_LookupValueDesc to GXV_LookupValueCPtr.
+       
+       * src/gxvalid/gxvbsln.c (gxv_bsln_LookupValue_validate,
+       gxv_bsln_LookupFmt4_transit): Ditto.
+       
+       * src/gxvalid/gxvjust.c
+       (gxv_just_pcTable_LookupValue_entry_validate,
+       gxv_just_classTable_entry_validate,
+       gxv_just_wdcTable_LookupValue_validate): Ditto.
+       
+       * src/gxvalid/gxvkern.c
+       (gxv_kern_subtable_fmt1_entry_validate): Ditto.
+       
+       * src/gxvalid/gxvlcar.c (gxv_lcar_LookupValue_validate,
+       gxv_lcar_LookupFmt4_transit): Ditto.
+       
+       * src/gxvalid/gxvopbd.c (gxv_opbd_LookupValue_validate,
+       gxv_opbd_LookupFmt4_transit): Ditto.
+       
+       * src/gxvalid/gxvprop.c (gxv_prop_LookupValue_validate,
+       gxv_prop_LookupFmt4_transit): Ditto.
+       
+       * src/gxvalid/gxvmort4.c
+       (gxv_mort_subtable_type4_lookupval_validate): Ditto.
+       
+       * src/gxvalid/gxvmort0.c
+       (gxv_mort_subtable_type0_entry_validate): Update
+       from GXV_StateTable_GlyphOffsetDesc
+       to GXV_StateTable_GlyphOffsetCPtr.
+       
+       * src/gxvalid/gxvmort1.c
+       (gxv_mort_subtable_type1_entry_validate): Ditto.
+       
+       * src/gxvalid/gxvmort2.c
+       (gxv_mort_subtable_type2_entry_validate): Ditto.
+       
+       * src/gxvalid/gxvmort5.c
+       (gxv_mort_subtable_type5_entry_validate): Ditto.
+       
+       * src/gxvalid/gxvmorx2.c
+       (gxv_morx_subtable_type2_entry_validate): Ditto.
+       
+       * src/gxvalid/gxvmorx5.c
+       (gxv_morx_subtable_type5_entry_validate): Ditto.
+       
+       * src/gxvalid/gxvmorx1.c
+       (gxv_morx_subtable_type1_entry_validate): Ditto.
+       (gxv_morx_subtable_type1_LookupValue_validate,
+       gxv_morx_subtable_type1_LookupFmt4_transit):
+       Update from GXV_LookupValueDesc to GXV_LookupValueCPtr.
+       
+       * src/gxvalid/gxvmorx0.c
+       (gxv_morx_subtable_type0_entry_validate): Update
+       from GXV_XStateTable_GlyphOffsetDesc
+       to GXV_XStateTable_GlyphOffsetCPtr.
+
+2009-07-29  Fabrice Bellet  <fabrice@bellet.info>
+
+       Fix Redhat bugzilla #513582 and Savannah bug #26849.
+
+       * src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP) <FTC_INLINE>: Fix
+       aliasing bug.
+
+2009-07-19  Werner Lemberg  <wl@gnu.org>
+
+       Document recent library changes.
+
+       * docs/CHANGES: Do it.
+
+2009-07-17  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #23786.
+
+       * src/truetype/ttobjs.c (tt_size_init_bytecode): Don't reset x_ppem
+       and y_ppem.  Otherwise the `*_CVT_Stretched' functions in ttinterp.c
+       get never called.
+       An anonymous guy suggested this change on Savannah, and it seems to
+       be the right solution.
+
+2009-07-15  Werner Lemberg  <wl@gnu.org>
+
+       * docs/release: Updated.
+
+2009-07-15  Werner Lemberg  <wl@gnu.org>
+
+       README.CVS -> README.git
+
+       * README.CVS: Renamed to...
+       * README.git: This.
+       Updated.
+
+2009-07-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Borland C++ compiler patch proposed by Mirco Babin.
+       http://lists.gnu.org/archive/html/freetype/2009-07/msg00016.html.
+
+       * builds/exports.mk: Delete unused flags, CCexe_{CFLAGS,LDFLAGS}.
+       Fix APINAMES_C and APINAMES_EXE pathnames to reflect the platform
+       specific pathname syntax.
+       * builds/compiler/bcc.mk: Remove unused flag, CCexe_LDFLAGS.
+       Define TE = `-e' separately (bcc32 cannot specify the pathname of
+       binary executable by T = `-o').
+       Extend the large page size in linking freetype.lib.
+       Add extra CLEAN target to delete bcc specific temporary files.
+       * builds/compiler/bcc-dev.mk: Ditto.
+
+2009-07-14  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #27026.
+
+       * builds/win32/vc2005/freetype.sln: Use correct version number.
+
+2009-07-12  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Add a script to check the undefined and unused trace macros.
+
+       * src/tools/chktrcmp.py: A script to check trace_XXXX macros
+       that are used in C source but undefined in fttrace.h, or
+       defined in fttrace.h but unused in C sources.  See
+       http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html.
+       * docs/DEBUG: Mention on chktrcmp.py.
+       * docs/release: Ditto.
+
+2009-07-09  Werner Lemberg  <wl@gnu.org>
+
+       [ftraster] Make it compile again with -D_STANDALONE_.
+
+       * src/raster/ftraster.c [_STANDALONE_]: Define
+       FT_CONFIG_STANDARD_LIBRARY_H.
+       Include `string.h'.
+       Don't include `rastpic.h'.
+       Define FT_DEFINE_RASTER_FUNCS.
+
+2009-07-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       smooth: Check glyph size by width/height, instead of pitch/height.
+       Suggested by der Mouse <mouse@Rodents-Montreal.ORG>.
+
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic): Improve
+       the check for too large glyph.  Replace the pair of `pitch' and
+       `height' by the pair of `width' and `height'.  `pitch' cannot
+       be greater than `height'.  The required is checking the product
+       `pitch' * `height' <= FT_ULONG_MAX, but we use cheap checks for
+       the realistic case only.
+
+2009-07-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Register 2 missing trace components, t1afm and ttbdf.
+
+       * include/freetype/internal/fttrace.h: Add FT_TRACE_DEF( t1afm )
+       and FT_TRACE_DEF( ttbdf ).  See
+       http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html
+
+2009-07-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Register a trace component for ftgloadr.c.
+
+       * include/freetype/internal/fttrace.h: Add FT_TRACE_DEF( gloader ).
+       The macro `trace_gloader' was already used in the initial version
+       on 2002-02-24.
+
+2009-07-08  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Prevent the overflows by a glyph with too many points or contours.
+       The bug is reported by Boris Letocha <b.letocha@gmc.net>.  See
+       http://lists.gnu.org/archive/html/freetype-devel/2009-06/msg00031.html
+       http://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00002.html  
+
+       * include/freetype/ftimage.h (FT_OUTLINE_CONTOURS_MAX,
+       FT_OUTLINE_POINTS_MAX): New macros to declare the maximum
+       values of FT_Outline.{n_contours,n_points}.
+       * src/base/ftgloadr.c (FT_GlyphLoader_CheckPoints): Check the
+       total numbers of points and contours cause no overflows in
+       FT_Outline.{n_contours,n_points}.
+
+       * include/freetype/internal/ftgloadr.h (FT_GLYPHLOADER_CHECK_P,
+       FT_GLYPHLOADER_CHECK_C): Compare the numbers of points and
+       contours as unsigned long number, instead of signed int, to
+       prevent the overflows on 16-bit systems.
+
+2009-07-05  Bram Tassyns  <bramt@enfocus.be>
+
+       Improve compatibility to Acroread.
+       This fixes Savannah bug #26944.
+
+       * src/cff/cffload.c (cff_charset_compute_cids): For multiple GID to
+       single CID mappings, make the lowest value win.
+
+2009-06-28  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       ftpatent: Fix a bug by wrong usage of service->table_info().
+       http://lists.gnu.org/archive/html/freetype-devel/2008-12/msg00039.html
+
+       * include/freetype/internal/services/svsfnt.h: Extend
+       FT_SFNT_TableInfoFunc() to take new argument to obtain the offset
+       to the specified table.
+       * src/sfnt/sfdriver.c (sfnt_table_info): Extend to return the
+       table-offset to the caller function.
+       * src/base/ftpatent.c (_tt_check_patents_in_table): Use new
+       service->table_info().
+       * src/base/ftobjs.c (FT_Sfnt_Table_Info): Synchronize to new
+       service->table_info().
+
+2009-06-28  Werner Lemberg  <wl@gnu.org>
+
+       [psaux, cff] Protect against nested `seac' calls.
+
+       * include/freetype/internal/psaux.h (T1_Decoder), src/cff/cffgload.h
+       (CFF_Decoder): Add `seac' boolean variable.
+
+       * src/cff/cffgload.c (cff_operator_seac), src/psaux/t1decode.c
+       (t1operator_seac): Use it.
+
+2009-06-28  Werner Lemberg  <wl@gnu.org>
+
+       Thinko.
+
+       * src/psaux/t1decode.c (t1operator_seac)
+       [FT_CONFIG_OPTION_INCREMENTAL]: Test for existence of incremental
+       interface.
+
+2009-06-28  Werner Lemberg  <wl@gnu.org>
+
+       * devel/ftoption.h [FT_CONFIG_OPTION_INCREMENTAL]: Define.
+
+2009-06-27  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Add tools to preprocess the source files for AtariST PureC.
+
+       * builds/atari/deflinejoiner.awk: New file to filter C source files
+       for broken C preprocessor of PureC compiler.
+
+       * builds/atari/gen-purec-patch.sh: New file to generate a patch set
+       for PureC, by using deflinejoiner.awk.
+
+2009-06-27  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Keep existing modules.cfg in the building tree.
+
+       * configure: If `configure' is executed outside of the source tree,
+       an existing `modules.cfg' file in the build directory should be
+       kept, not overwritten by the version in the source tree.
+
+2009-06-27  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Filter --srcdir= option before invoking builds/unix/configure.
+
+       * configure: If builds/unix/configure is invoked with --srcdir
+       option, the option should take `builds/unix' directory instead of
+       the top source directory.  Thus the configure script in the top
+       directory should modify the --srcdir= option if
+       `builds/unix/configure' is invoked.
+
+2009-06-27  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Improve configure.raw for cross-building on exe-suffixed systems.
+
+       * builds/unix/configure.raw: Fix a bug in sed script to extract
+       native suffix for binary executables, patch by Peter Breitenlohner.
+       http://lists.gnu.org/archive/html/freetype-devel/2009-04/msg00036.html
+
+2009-06-26  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Remove TT_SubGlyphRec.
+
+       * src/truetype/ttobjs.h (TT_SubGlyphRec): Removed, unused.
+
+2009-06-26  Werner Lemberg  <wl@gnu.org>
+
+       * */*: For warning messages, replace FT_ERROR with FT_TRACE0.
+
+       FT_ERROR is now used only if a function produces a non-zero `error'
+       value.
+
+       Formatting, improving and harmonizing debug strings.
+
+2009-06-25  Werner Lemberg  <wl@gnu.org>
+
+       Provide version information better.
+
+       * src/base/ftinit.c (FT_Init_FreeType): Don't set version here
+       but...
+       * src/base/ftobjs.c (FT_New_Library): Here.
+
+2009-06-22  Werner Lemberg  <wl@gnu.org>
+
+       Use 16.16 format while parsing Type 1 charstrings.
+       This fixes Savannah bug #26867.
+
+       Previously, only integers have been used which can lead to serious
+       rounding errors.
+
+       However, fractional values are only used internally; after the
+       charstrings (of either Type 1 or 2) have been processed, the
+       resulting coordinates get rounded to integers currently -- before
+       applying scaling.  This should be fixed; at the same time a new load
+       flag should be introduced, to be used in combination with
+       FT_LOAD_NO_SCALE, which indicates that font units are returned in
+       16.16 format.  Similarly, the incremental interface should be
+       extended to allow fractional values for metrics.
+
+       * include/freetype/internal/psaux.h (T1_BuilderRec): Remove `shift'
+       field.
+       * include/freetype/internal/pshints.h (T1_Hints_SetStemFunc,
+       T1_Hints_SetStem3Func): Use FT_Fixed for coordinates.
+
+       * src/psaux/psobjs.c: Include FT_INTERNAL_CALC_H.
+       (t1_build_add_point): Always convert fixed to integer.
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings):
+       Use 16.16 format everywhere (except for large integers followed by a
+       `div').
+       [CAN_HANDLE_NON_INTEGRAL_T1_OPERANDS]: Remove #ifdef and activate
+       code uncoditionally.
+       Add support for random numbers and update remaining code
+       accordingly; this should work now.
+       (t1_operator_seac): Updated.
+       * src/psaux/pshrec.c: Include FT_INTERNAL_CALC_H.
+       (ps_hints_t1stem3, t1_hints_stem): Updated.
+
+       * src/cid/cidgload.c: Include FT_INTERNAL_CALC_H.
+       (cid_load_glyph) [FT_CONFIG_OPTION_INCREMENTAL],
+       (cid_face_compute_max_advance, cid_slot_load_glyph): Updated.
+
+       * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String)
+       [FT_CONFIG_OPTION_INCREMENTAL], (T1_Get_Advances, T1_Load_Glyph):
+       Updated.
+       * src/type1/t1load.c: Include FT_INTERNAL_CALC_H.
+       * src/type1/t1objs.c (T1_Face_Init): Updated.
+
+2009-06-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/pshinter/pshrec.c: Use PSH_Err_Ok.
+
+2009-06-21  Werner Lemberg  <wl@gnu.org>
+
+       Code beautification.
+
+       * src/type1/t1load.c (FT_INT_TO_FIXED): Removed.
+       Replace everywhere with INT_TO_FIXED.
+       (FT_FIXED_TO_INT): Move to ...
+       * include/freetype/internal/ftcalc.h (FIXED_TO_INT): Here.
+       Update all users.
+
+2009-06-20  Werner Lemberg  <wl@gnu.org>
+
+       Remove unused variables.
+
+       * include/freetype/internal/psaux.h (T1_BuilderRec),
+       src/cff/cffgload.h (CFF_Builder): Remove `last'.
+       Update all users.
+
+2009-06-20  Werner Lemberg  <wl@gnu.org>
+
+       [psaux] Check large integers while parsing charstrings.
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Large
+       integers must be followed by a `div' operator.
+
+2009-06-20  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Revert last change.
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings): Do it.
+       Next time, don't confuse Type 2 charstring opcodes with TOP DICT
+       values...
+
+2009-06-20  Werner Lemberg  <wl@gnu.org>
+
+       * src/autofit/aflatin.c (af_latin_metrics_check_digits): Fix
+       compiler warning.
+
+2009-06-20  Werner Lemberg  <wl@gnu.org>
+
+       * builds/compiler/gcc.mk (CFLAGS): Use -O3, not -O6.
+
+2009-06-19  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Fix handling of reserved byte 0xFF.
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings): Abort if byte
+       0xFF is encountered.
+
+2009-06-19  Werner Lemberg  <wl@gnu.org>
+
+       Improve debug messages for Type1 charstrings.
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Emit newlines
+       after instructions.
+       Prettify output.
+
+2009-06-19  Werner Lemberg  <wl@gnu.org>
+
+       More ftgray fixes for FT_STATIC_RASTER.
+       Problems reported by suyu@cooee.cn.
+
+       * src/smooth/ftgrays.c (gray_move_to, gray_raster_render): Use
+       RAS_VAR.
+
+2009-06-18  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2009-06-18  Werner Lemberg  <wl@gnu.org>
+
+       Fix B/W rasterization of subglyphs with different drop-out modes.
+
+       Normally, the SCANMODE instruction (if present) to set the drop-out
+       mode in a TrueType font is located in the `prep' table only and thus
+       valid for all glyphs.  However, there are fonts like `pala.ttf'
+       which additionally contain this instruction in the hinting code of
+       some glyphs (but not all).  As a result it can happen that a
+       composite glyph needs multiple drop-out modes for its subglyphs
+       since the rendering state gets reset for each subglyph.
+
+       FreeType collects the hinted outlines from all subglyphs, then it
+       sends the data to the rasterizer.  It also sends the drop-out mode
+       -- after hinting has been applied -- and here is the error: It sends
+       the drop-out mode of the last subglyph only; drop-out modes of all
+       other subglyphs are lost.
+
+       This patch fixes the problem; it adds a second, alternative
+       mechanism to pass the drop-out mode: For each contour, the
+       rasterizer now checks the first `tags' array element.  If bit 2 is
+       set, bits 5-7 contain the contour's drop-out mode, overriding the
+       global drop-out mode.
+
+       * include/freetype/ftimage.h (FT_CURVE_TAG_HAS_SCANMODE): New macro.
+
+       * src/truetype/ttgload.c (TT_Hint_Glyph): Store drop-out mode in
+       `tags[0]'.
+
+       * src/raster/ftraster.c (Flow_Up, Overshoot_Top, Overshoot_Bottom):
+       Use bits 3-5 instead of 0-2.
+       (New_Profile): Set the drop-out mode in the profile's `flags' field.
+       (Decompose_Curve): Check `tags[0]' and set `dropOutControl' if
+       necessary.
+       (Vertical_Sweep_Drop, Horizontal_Sweep_Drop,
+       Horizontal_Gray_Sweep_Drop, Draw_Sweep): Use the profile's drop-out
+       mode.
+
+2009-06-16  Werner Lemberg  <wl@gnu.org>
+
+       Improve scan conversion rules 4 and 6.
+
+       Two new constraints are introduced to better identify a `stub' -- a
+       concept which is only vaguely described in the OpenType
+       specification.  The old code was too rigorous and suppressed more
+       pixel than it should.
+
+         . The intersection of the two profiles with the scanline is less
+           than a half pixel.  Code related to this was already present in
+           the sources but has been commented out.
+
+         . The endpoint of the original contour forming a profile has a
+           distance (`overshoot') less than half a pixel to the scanline.
+
+       Note that the two additional conditions fix almost all differences
+       to the Windows rasterizer, but some problematic cases remain.
+
+       * src/raster/ftraster.c (Overshoot_Top, Overshoot_Bottom): New
+       macros for the `flags' field in the `TProfile' structure.
+       (IS_BOTTOM_OVERSHOOT, IS_TOP_OVERSHOOT): New macros.
+       (New_Profile, End_Profile): Pass overshoot flag as an argument and
+       set it accordingly.
+       Update callers.
+       (Vertical_Sweep_Drop, Horizontal_Sweep_Drop): Implement the two new
+       constraints.
+
+2009-06-11  Werner Lemberg  <wl@gnu.org>
+
+       Increase precision for B/W rasterizer.
+
+       * src/raster/ftraster.c (Set_High_Precision): Add two more bits to
+       the precision.  This corrects rendering of some small glyphs, for
+       example, glyph `xi' in verdana.ttf at 13 ppem.  Testing with ftbench
+       on my GNU/Linux box I don't see a performance degradation.
+
+2009-06-08  Michael Zucchi  <notzed@gmail.com>
+
+       Handle FT_STROKER_LINECAP_BUTT.
+       This fixes Savannah bug #26757.
+
+       * src/base/ftstroke.c (ft_stroker_cap): Implement it.
+
+2009-06-07  Harald Fernengel  <harry@kdevelop.org>
+
+       Fix some potential out-of-memory crashes.
+
+       * src/base/ftobjs.c (ft_glyphslot_done): Check `slot->internal'.
+       * src/base/ftstream.c (FT_Stream_ReleaseFrame): Check `stream'.
+       * src/truetype/ttinterp.c (TT_New_Context): Avoid double-free of
+       `exec' in case of failure.
+
+2009-06-07  Werner Lemberg  <wl@gnu.org>
+
+       Simplify math.
+       Suggested by Alexei Podtelezhnikov <apodtele@gmail.com>.
+
+       * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop,
+       Horizontal_Gray_Sweep_Drop): Do it.
+
+2009-06-04  Werner Lemberg  <wl@gnu.org>
+
+       Preparation for fixing scan conversion rules 4 and 6.
+
+       * src/raster/ftraster.c (TFlow): Replace enumeration with...
+       (Flow_Up): This macro.
+       (TProfile): Replace `flow' member with `flags' bit field.
+       Update all affected code.
+
+2009-05-29  James Cloos  <cloos@jhcloos.com>
+
+       Enable autohinting for glyphs rotated by multiples of 90°.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Alter check for permitted
+       matrices to allow rotations by multiples of 90°, not only unrotated,
+       possibly slanted matrices.
+
+2009-05-28  Werner Lemberg  <wl@gnu.org>
+
+       Remove compiler warning.
+       Reported by Krzysztof Kowalczyk <kkowalczyk@gmail.com>.
+
+       * src/autofit/aflatin2.c (af_latin2_hint_edges): Move declaration of
+       `n_edges' into `#if' block.
+
+2009-05-28  Werner Lemberg  <wl@gnu.org>
+
+       Make compilation work with FT_CONFIG_OPTION_USE_ZLIB not defined.
+       Reported by Krzysztof Kowalczyk <kkowalczyk@gmail.com>.
+
+       * src/pcf/pcfdrivr.c (PCF_Face_Init) [!FT_CONFIG_OPTION_USE_ZLIB]:
+       Make it work.
+       Simplify #ifdef logic.
+
+2009-05-22  Werner Lemberg  <wl@gnu.org>
+
+       Improve b/w rasterizer.
+       Problem reported by Krzysztof Kotlenga <pocek@users.sf.net>.
+
+       * src/raster/raster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop,
+       Horizontal_Gray_Sweep_Drop): For smart drop-out mode, if
+       intersections are equally distant relative to next pixel center,
+       select the left pixel, not the right one.
+
+2009-05-19  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #26600.
+
+       * src/type42/t42parse.c (t42_load_keyword): Handle
+       T1_FIELD_LOCATION_FONT_EXTRA.
+
+2009-04-30  Werner Lemberg  <wl@gnu.org>
+
+       Document recent changes to ftview.
+
+       * docs/CHANGES: Do it.
+
+2009-04-27  Werner Lemberg  <wl@gnu.org>
+
+       autohinter: Don't change digit widths if all widths are the same.
+       This fixes FreeDesktop bug #21197.
+
+       * src/autofit/afglobal.c (AF_DIGIT): New macro.
+       (af_face_globals_compute_script_coverage): Mark ASCII digits in
+       `glyph_scripts' array.
+       (af_face_globals_get_metrics): Updated.
+       (af_face_globals_is_digit): New function.
+       * src/autofit/afglobal.h: Updated.
+       (AF_ScriptMetricsRec): Add `digits_have_same_width' flag.
+
+       * src/autofit/aflatin.c: Include FT_ADVANCES_H.
+       (af_latin_metrics_check_digits): New function.
+       (af_latin_metrics_init): Use it.
+       * src/autofit/aflatin.h: Updated.
+       * src/autofit/afcjk.c (af_cjk_metrics_init): Updated.
+
+       * src/autofit/aflatin2.c: Similar changes as with aflatin.c.
+
+       * src/autofit/afloader.c (af_loader_load_g): Test digit width.
+
+       * docs/CHANGES: Document it.
+
+2009-04-26  Werner Lemberg  <wl@gnu.org>
+
+       Make ftgrays compile with _STANDALONE_ and FT_STATIC_RASTER again.
+       Problems reported by suyu@cooee.cn.
+
+       * src/smooth/ftgrays.c (FT_DEFINE_OUTLINE_FUNCS,
+       FT_DEFINE_RASTER_FUNCS) [_STANDALONE_]: Define.
+       [!_STANDALONE_]: Include ftspic.h only here.
+       (ras): Define/declare after definition of `TWorker'.
+       Use `RAS_VAR_' where necessary.
+
+2009-04-21  Karl Berry  <karl@gnu.org>
+
+       Fix AC_CHECK_FT2.
+
+       * builds/unix/freetype2.m4: Only check PATH for freetype-config if
+       we did not already find it from a prefix option.
+
+2009-04-05  Oran Agra  <oran@monfort.co.il>
+
+       Add #error to modules and files that do not support PIC yet.
+
+       When FT_CONFIG_OPTION_PIC is defined the following files will
+       create #error:
+       * src/bdf/bdfdrivr.h
+       * src/cache/ftcmanag.c
+       * src/cid/cidriver.h
+       * src/gxvalid/gxvmod.h
+       * src/gzip/ftgzip.c
+       * src/lzw/ftlzw.c
+       * src/otvalid/otvmod.h
+       * src/pcf/pcfdrivr.h
+       * src/pfr/pfrdrivr.h
+       * src/psaux/psauxmod.h
+       * src/type1/t1driver.h
+       * src/type42/t42drivr.h
+       * src/winfonts/winfnt.h
+
+2009-04-05  Oran Agra  <oran@monfort.co.il>
+
+       Position Independent Code (PIC) support in autofit module.
+
+       * include/freetype/internal/autohint.h add macros to init
+       instances of FT_AutoHinter_ServiceRec.
+
+       * src/autofit/afmodule.h declare autofit_module_class
+       using macros from ftmodapi.h,
+       when FT_CONFIG_OPTION_PIC is defined create and destroy
+       functions will be declared.
+       * src/autofit/afmodule.c when FT_CONFIG_OPTION_PIC is defined
+       af_autofitter_service and autofit_module_class structs
+       will have functions to init or create and destroy them
+       instead of being allocated in the global scope.
+       And macros will be used from afpic.h in order to access them.
+
+       * src/autofit/aftypes.h add macros to init and declare
+       instances of AF_ScriptClassRec.
+
+       * src/autofit/afcjk.h declare af_cjk_script_class
+       using macros from aftypes.h,
+       when FT_CONFIG_OPTION_PIC is defined init function will be declared.
+       * src/autofit/afcjk.c when FT_CONFIG_OPTION_PIC is defined
+       af_cjk_script_class struct will have function to init it instead of
+       being allocated in the global scope.
+
+       * src/autofit/afdummy.h declare af_dummy_script_class
+       using macros from aftypes.h,
+       when FT_CONFIG_OPTION_PIC is defined init function will be declared.
+       * src/autofit/afdummy.c when FT_CONFIG_OPTION_PIC is defined
+       af_dummy_script_class struct will have function to init it instead of
+       being allocated in the global scope.
+
+       * src/autofit/afindic.h declare af_indic_script_class
+       using macros from aftypes.h,
+       when FT_CONFIG_OPTION_PIC is defined init function will be declared.
+       * src/autofit/afindic.c when FT_CONFIG_OPTION_PIC is defined
+       af_indic_script_class struct will have function to init it instead of
+       being allocated in the global scope.
+
+       * src/autofit/aflatin.h declare af_latin_script_class
+       using macros from aftypes.h,
+       when FT_CONFIG_OPTION_PIC is defined init function will be declared.
+       * src/autofit/aflatin.c when FT_CONFIG_OPTION_PIC is defined
+       af_latin_script_class struct will have function to init it instead of
+       being allocated in the global scope.
+       Change af_latin_blue_chars to be PIC-compatible by being a two
+       dimentional array rather than array of pointers.
+
+
+       * src/autofit/aflatin2.h declare af_latin2_script_class
+       using macros from aftypes.h,
+       when FT_CONFIG_OPTION_PIC is defined init function will be declared.
+       * src/autofit/aflatin2.c when FT_CONFIG_OPTION_PIC is defined
+       af_latin2_script_class struct will have function to init it instead of
+       being allocated in the global scope.
+       Change af_latin2_blue_chars to be PIC-compatible by being a two
+       dimentional array rather than array of pointers.
+
+       * src/autofit/afglobal.c when FT_CONFIG_OPTION_PIC is defined
+       af_script_classes array initialization was moved to afpic.c and
+       is later refered using macros defeined in afpic.h.
+
+       New Files:
+       * src/autofit/afpic.h declare struct to hold PIC globals for autofit
+       module and macros to access them.
+       * src/autofit/afpic.c implement functions to allocate, destroy and
+       initialize PIC globals for autofit module.
+
+       * src/autofit/autofit.c add new file to build: afpic.c.
+       * src/autofit/jamfile add new files to FT2_MULTI build: afpic.c.
+
+2009-04-05  Oran Agra  <oran@monfort.co.il>
+
+       Position Independent Code (PIC) support in pshinter module.
+
+       * include/freetype/internal/pshints.h add macros to init
+       instances of PSHinter_Interface.
+
+       * src/pshinter/pshmod.h declare pshinter_module_class
+       using macros from ftmodapi.h,
+       when FT_CONFIG_OPTION_PIC is defined create and destroy
+       functions will be declared.
+       * src/pshinter/pshmod.c when FT_CONFIG_OPTION_PIC is defined
+       pshinter_interface and pshinter_module_class structs
+       will have functions to init or create and destroy them
+       instead of being allocated in the global scope.
+       And macros will be used from pshpic.h in order to access them.
+
+       New Files:
+       * src/pshinter/pshpic.h declare struct to hold PIC globals for pshinter
+       module and macros to access them.
+       * src/pshinter/pshpic.c implement functions to allocate, destroy and
+       initialize PIC globals for pshinter module.
+
+       * src/pshinter/pshinter.c add new file to build: pshpic.c.
+       * src/pshinter/jamfile add new files to FT2_MULTI build: pshpic.c.
+
+2009-04-05  Oran Agra  <oran@monfort.co.il>
+
+       Position Independent Code (PIC) support in psnames module.
+
+       * include/freetype/internal/services/svpscmap.h add macros to init
+       instances of FT_Service_PsCMapsRec.
+
+       * src/psnames/psmodule.h declare psnames_module_class
+       using macros from ftmodapi.h,
+       when FT_CONFIG_OPTION_PIC is defined create and destroy
+       functions will be declared.
+       * src/psnames/psmodule.c when FT_CONFIG_OPTION_PIC is defined
+       pscmaps_interface and pscmaps_services structs
+       and psnames_module_class array
+       will have functions to init or create and destroy them
+       instead of being allocated in the global scope.
+       And macros will be used from pspic.h in order to access them.
+
+       New Files:
+       * src/psnames/pspic.h declare struct to hold PIC globals for psnames
+       module and macros to access them.
+       * src/psnames/pspic.c implement functions to allocate, destroy and
+       initialize PIC globals for psnames module.
+
+       * src/psnames/psnames.c add new file to build: pspic.c.
+       * src/psnames/jamfile add new files to FT2_MULTI build: pspic.c.
+
+2009-04-05  Oran Agra  <oran@monfort.co.il>
+
+       Position Independent Code (PIC) support in raster renderer.
+
+       * src/raster/ftrend1.h declare ft_raster1_renderer_class
+       and ft_raster5_renderer_class
+       using macros from ftrender.h,
+       when FT_CONFIG_OPTION_PIC is defined create and destroy
+       functions will be declared.
+       * src/smooth/ftrend1.c when FT_CONFIG_OPTION_PIC is defined
+       ft_raster1_renderer_class and ft_raster5_renderer_class structs
+       will have functions to init or create and destroy them
+       instead of being allocated in the global scope.
+       Macros will be used from rastpic.h in order to access
+       ft_standard_raster from the pic_container (allocated in ftraster.c).
+       In ft_raster1_render when PIC is enabled, the last letter of
+       module_name is used to verfy the renderer class rather than the
+       class pointer.
+
+       * src/raster/ftraster.c when FT_CONFIG_OPTION_PIC is defined
+       ft_standard_raster struct will have function to init it
+       instead of being allocated in the global scope.
+
+       New Files:
+       * src/raster/rastpic.h declare struct to hold PIC globals for raster
+       renderer and macros to access them.
+       * src/raster/rastpic.c implement functions to allocate, destroy and
+       initialize PIC globals for raster renderer.
+
+       * src/raster/raster.c add new file to build: rastpic.c.
+       * src/raster/jamfile add new files to FT2_MULTI build: rastpic.c.
+
+2009-04-05  Oran Agra  <oran@monfort.co.il>
+
+       Position Independent Code (PIC) support in smooth renderer.
+
+       * src/smooth/ftsmooth.h declare ft_smooth_renderer_class,
+       ft_smooth_lcd_renderer_class and ft_smooth_lcd_v_renderer_class
+       using macros from ftrender.h,
+       when FT_CONFIG_OPTION_PIC is defined create and destroy
+       functions will be declared.
+       * src/smooth/ftsmooth.c when FT_CONFIG_OPTION_PIC is defined
+       the following structs:
+       ft_smooth_renderer_class, ft_smooth_lcd_renderer_class
+       and ft_smooth_lcd_v_renderer_class
+       will have functions to init or create and destroy them
+       instead of being allocated in the global scope.
+       And macros will be used from ftspic.h in order to access
+       ft_grays_raster from the pic_container (allocated in ftgrays.c).
+
+       * src/smooth/ftgrays.h include FT_CONFIG_CONFIG_H
+       * src/smooth/ftgrays.c when FT_CONFIG_OPTION_PIC is NOT defined
+       func_interface was moved from gray_convert_glyph_inner function
+       to the global scope.
+       When FT_CONFIG_OPTION_PIC is defined
+       func_interface and ft_grays_raster structs
+       will have functions to init them
+       instead of being allocated in the global scope.
+       And func_interface will be allocated on the stack of
+       gray_convert_glyph_inner.
+
+       New Files:
+       * src/smooth/ftspic.h declare struct to hold PIC globals for smooth
+       renderer and macros to access them.
+       * src/smooth/ftspic.c implement functions to allocate, destroy and
+       initialize PIC globals for smooth renderer.
+
+       * src/smooth/smooth.c add new file to build: ftspic.c.
+       * src/smooth/jamfile add new files to FT2_MULTI build: ftspic.c.
+
+2009-04-05  Oran Agra  <oran@monfort.co.il>
+
+       Position Independent Code (PIC) support in cff driver.
+
+       * include/freetype/internal/services/svcid.h add macros to init
+       instances of FT_Service_CIDRec.
+       * include/freetype/internal/services/svpsinfo.h add macros to init
+       instances of FT_Service_PsInfoRec.
+
+       * src/cff/cffcmap.h declare cff_cmap_encoding_class_rec
+       and cff_cmap_unicode_class_rec using macros from
+       ftobjs.h, when FT_CONFIG_OPTION_PIC is defined create and destroy
+       functions will be declared.
+       * src/cff/cffcmap.c when FT_CONFIG_OPTION_PIC is defined
+       the following structs:
+       cff_cmap_encoding_class_rec and cff_cmap_unicode_class_rec
+       will have functions to init or create and destroy them
+       instead of being allocated in the global scope.
+
+       * src/cff/cffdrivr.h declare cff_driver_class using macros from
+       ftdriver.h, when FT_CONFIG_OPTION_PIC is defined create and destroy
+       functions will be declared.
+       * src/cff/cffdrivr.c when FT_CONFIG_OPTION_PIC is defined
+       the following structs:
+       cff_service_glyph_dict, cff_service_ps_info, cff_service_ps_name
+       cff_service_get_cmap_info, cff_service_cid_info, cff_driver_class,
+       and cff_services array
+       will have functions to init or create and destroy them
+       instead of being allocated in the global scope.
+       And macros will be used from cffpic.h in order to access them
+       from the pic_container.
+       Use macros from cffpic.h in order to access the
+       structs allocated in cffcmap.c
+
+       * src/cff/cffobjs.c Use macros from cffpic.h in order to access the
+       structs allocated in cffcmap.c
+
+       * src/cff/parser.c when FT_CONFIG_OPTION_PIC is defined
+       implement functions to create and destroy cff_field_handlers array
+       instead of being allocated in the global scope.
+       And macros will be used from cffpic.h in order to access it
+       from the pic_container.
+
+       New Files:
+       * src/cff/cffpic.h declare struct to hold PIC globals for cff
+       driver and macros to access them.
+       * src/cff/cffpic.c implement functions to allocate, destroy and
+       initialize PIC globals for cff driver.
+
+       * src/cff/cff.c add new file to build: cffpic.c.
+       * src/cff/jamfile add new files to FT2_MULTI build: cffpic.c.
+
+2009-04-05  Oran Agra  <oran@monfort.co.il>
+
+       Position Independent Code (PIC) support in sfnt driver.
+
+       * include/freetype/internal/services/svbdf.h add macros to init
+       instances of FT_Service_BDFRec.
+       * include/freetype/internal/services/svgldict.h add macros to init
+       instances of FT_Service_GlyphDictRec.
+       * include/freetype/internal/services/svpostnm.h add macros to init
+       instances of FT_Service_PsFontNameRec.
+       * include/freetype/internal/services/svsfnt.h add macros to init
+       instances of FT_Service_SFNT_TableRec.
+       * include/freetype/internal/services/svttcmap.h add macros to init
+       instances of FT_Service_TTCMapsRec.
+       * include/freetype/internal/sfnt.h add macros to init
+       instances of SFNT_Interface.
+
+       * src/sfnt/sfdriver.h declare sfnt_module_class using macros from
+       ftmodapi.h, when FT_CONFIG_OPTION_PIC is defined create and destroy
+       functions will be declared.
+       * src/sfnt/sfdriver.c when FT_CONFIG_OPTION_PIC is defined
+       the following structs:
+       sfnt_service_sfnt_table, sfnt_service_glyph_dict, sfnt_service_ps_name
+       tt_service_get_cmap_info, sfnt_service_bdf, sfnt_interface,
+       sfnt_module_class, and sfnt_services array
+       will have functions to init or create and destroy them
+       instead of being allocated in the global scope.
+       And macros will be used from sfntpic.h in order to access them
+       from the pic_container.
+
+       * src/sfnt/ttcmap.h add macros to init
+       instances of TT_CMap_ClassRec.
+       * src/sfnt/ttcmap.c when FT_CONFIG_OPTION_PIC is defined
+       the following structs:
+       tt_cmap0_class_rec, tt_cmap2_class_rec, tt_cmap4_class_rec
+       tt_cmap6_class_rec, tt_cmap8_class_rec, tt_cmap10_class_rec,
+       tt_cmap12_class_rec, tt_cmap14_class_rec and tt_cmap_classes array
+       will have functions to init or create and destroy them
+       instead of being allocated in the global scope.
+       And macros will be used from sfntpic.h in order to access them
+       from the pic_container.
+       The content of tt_cmap_classes is now described in the
+       new file 'ttcmapc.h'.
+
+       New Files:
+       * src/sfnt/sfntpic.h declare struct to hold PIC globals for sfnt
+       driver and macros to access them.
+       * src/sfnt/sfntpic.c implement functions to allocate, destroy and
+       initialize PIC globals for sfnt driver.
+       * src/sfnt/ttcmapc.h describing the content of
+       tt_cmap_classes allocated in ttcmap.c
+
+       * src/sfnt/sfnt.c add new file to build: sfntpic.c.
+       * src/sfnt/jamfile add new files to FT2_MULTI build: sfntpic.c.
+
+2009-04-05  Oran Agra  <oran@monfort.co.il>
+
+       Position Independent Code (PIC) support in truetype driver.
+
+       * include/freetype/internal/services/svmm.h add macros to init
+       instances of FT_Service_MultiMastersRec.
+       * include/freetype/internal/services/svttglyf.h add macros to init
+       instances of FT_Service_TTGlyfRec.
+
+       * src/truetype/ttdriver.h declare tt_driver_class using macros from
+       ftdriver.h, when FT_CONFIG_OPTION_PIC is defined create and destroy
+       functions will be declared.
+       * src/truetype/ttdriver.c when FT_CONFIG_OPTION_PIC is defined
+       the following structs:
+       tt_service_gx_multi_masters, tt_service_truetype_glyf, tt_driver_class
+       and tt_services array,
+       will have functions to init or create and destroy them
+       instead of being allocated in the global scope.
+       And macros will be used from ttpic.h in order to access them
+       from the pic_container.
+       * src/truetype/ttobjs.c change trick_names array to be
+       PIC-compatible by being a two dimentional array rather than array
+       of pointers.
+
+       New Files:
+       * src/truetype/ttpic.h declare struct to hold PIC globals for truetype
+       driver and macros to access them.
+       * src/truetype/ttpic.c implement functions to allocate, destroy and
+       initialize PIC globals for truetype driver.
+
+       * src/truetype/truetype.c add new file to build: ttpic.c.
+       * src/truetype/jamfile add new files to FT2_MULTI build: ttpic.c.
+
+2009-04-05  Oran Agra  <oran@monfort.co.il>
+
+       Position Independent Code (PIC) support and infrastructure in base.
+
+       * include/freetype/config/ftoption.h add FT_CONFIG_OPTION_PIC
+       * include/freetype/internal/ftobjs.h Add pic_container member to
+       FT_LibraryRec.
+       Add macros to declare and init instances of FT_CMap_ClassRec.
+       Add macros to init instances of FT_Outline_Funcs and FT_Raster_Funcs.
+       Add macros to declare, allocate and initialize modules
+       (FT_Module_Class).
+       Add macros to declare, allocate and initialize renderers
+       (FT_Renderer_Class).
+       Add macro to init instances of FT_Glyph_Class.
+       Add macros to declare, allocate and initialize drivers
+       (FT_Driver_ClassRec).
+       * include/freetype/internal/ftpic.h new file to declare the
+       FT_PIC_Container struct and the functions to allocate and detroy it.
+       * include/freetype/internal/ftserv.h add macros to allocate and
+       destory arrays of FT_ServiceDescRec.
+       * include/freetype/internal/internal.h define macro to include
+       ftpic.h.
+
+       New Files:
+       * src/base/ftpic.c implement functions to allocate and destory the
+       global pic_container.
+       * src/base/basepic.h declare struct to hold PIC globals for base and
+       macros to access them.
+       * src/base/basepic.c implement functions to allocate, destroy and
+       initialize PIC globals for base.
+
+       * src/base/ftinit.c when FT_CONFIG_OPTION_PIC is defined implement
+       functions that allocate and destroy ft_default_modules according to
+       FT_CONFIG_MODULES_H in the pic_container instead of the global scope
+       and use macro from basepic.h to access it.
+       * src/base/ftobjs.c add calls to the functions that allocate and
+       destroy the global pic_container when the library is created and
+       destroyed.
+
+       * src/base/jamfile add new files to FT2_MULTI build:
+       ftpic.c and basepic.c.
+       * src/base/ftbase.c add new files to build:
+       ftpic.c and basepic.c.
+
+       * src/base/ftglyph.c when FT_CONFIG_OPTION_PIC is defined
+       ft_bitmap_glyph_class and ft_outline_glyph_class will be allocated
+       in the pic_container instead of the global scope and use macros from
+       basepic.h to access them.
+       * src/base/ftbbox.c allocate bbox_interface stract on the stack
+       instead of the global scope when FT_CONFIG_OPTION_PIC is defined.
+       * src/base/ftstroke.c access ft_outline_glyph_class allocated in
+       ftglyph.c via macros from basepic.h
+
+2009-04-05  Oran Agra  <oran@monfort.co.il>
+
+       Preparing changes in cff parser later needed for PIC version.
+
+       * src/cff/cffload.c, src/cff/cffload.h, src/cff/cffobjs.c,
+       src/cff/cffparse.c, src/cff/cffparse.h: Add library pointer to
+       'CFF_ParserRec' set by `cff_parser_init'.
+       Route library pointer from 'cff_face_init' to 'cff_subfont_load'
+       for `cff_parser_init'.
+
+       * src/cff/cffparse.c (CFF_Field_Handler): Move it to...
+       * src/cff/cffparse.h: This file, to be used by other C files.
+
+2009-04-05  Oran Agra  <oran@monfort.co.il>
+
+       Minor change in ftstroke.c.
+
+       * src/base/ftstroke.c (FT_StrokerRec): Replace `memory' member with
+       `library' needed for PIC version.
+       Update all callers.
+
+2009-04-04  Werner Lemberg  <wl@gnu.org>
+
+       ftnames.c -> ftsnames.c
+
+       * src/base/ftnames.c: Rename to...
+       * src/base/ftsnames.c: This.
+       * src/base/Jamfile, src/base/rules.mk, src/base/ftbase.c: Updated.
+
+2009-04-04  Werner Lemberg  <wl@gnu.org>
+
+       Add support for cmap type 13.
+
+       * devel/ftoption.h, include/freetype/config/ftoption.h
+       (TT_CONFIG_CMAP_FORMAT_13): New macro.
+
+       * src/sfnt/ttcmap.c (TT_CMap13Rec, tt_cmap13_init,
+       tt_cmap13_validate, tt_cmap13_char_index, tt_cmap13_char_next,
+       tt_cmap13_get_info, tt_cmap13_char_map_def_binary,
+       tt_cmap14_class_rec): New functions and structures for cmap 13
+       support.
+       (tt_cmap_classes): Register tt_cmap13_class_rec.
+
+       * docs/CHANGES: Mention cmap 13 support.
+
+2009-04-01  Werner Lemberg  <wl@gnu.org>
+
+       Ignore empty contours in CFF glyphs.
+
+       Problem reported by Albert Astals Cid <aacid@kde.org>.
+
+       * src/cff/cffgload.c (cff_builder_close_contour): Synchronize with
+       t1_builder_close_contour.
+
+2009-03-21  Werner Lemberg  <wl@gnu.org>
+
+       Another redundant header inclusion.
+
+       * src/truetype/ttgxvar.c: Fix Ghostscript Coverity issue #4041.
+
+2009-03-21  Werner Lemberg  <wl@gnu.org>
+
+       Remove redundant header inclusions.
+
+       This covers many Ghostscript Coverity issues.
+
+       * src/*: Do it.
+
+2009-03-21  Werner Lemberg  <wl@gnu.org>
+
+       Fix Ghostscript Coverity issue #3904.
+
+       * src/truetype/ttgxvar.c (ft_var_readpackedpoints): Protect against
+       invalid values of `runcnt'.
+
+2009-03-20  Werner Lemberg  <wl@gnu.org>
+
+       Fix `make multi' run.
+
+       * src/smooth/ftsmooth.h: Include FT_INTERNAL_DEBUG_H.
+
+2009-03-20  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #25923.
+
+       * src/cache/ftccmap.c (FTC_CMAP_HASH): Fix typo.
+
+2009-03-20  Werner Lemberg  <wl@gnu.org>
+
+       Protect against too large glyphs.
+
+       Problem reported by Tavis Ormandy <taviso@google.com>.
+
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic): Don't allow
+       `pitch' or `height' to be larger than 0xFFFF.
+
+2009-03-20  Werner Lemberg  <wl@gnu.org>
+           Tavis Ormandy  <taviso@google.com>
+
+       Fix validation for various cmap table formats.
+
+       * src/sfnt/ttcmap.c (tt_cmap8_validate, tt_cmap10_validate,
+       tt_cmap12_validate): Check `length' correctly.
+       (tt_cmap_14_validate): Check `length' and `numMappings' correctly.
+
+2009-03-20  Werner Lemberg  <wl@gnu.org>
+
+       Protect against malformed compressed data.
+
+       * src/lzw/ftzopen.c (ft_lzwstate_io): Test whether `state->prefix' is
+       zero.
+
+2009-03-20  Werner Lemberg  <wl@gnu.org>
+
+       Protect against invalid SID values in CFFs.
+
+       Problem reported by Tavis Ormandy <taviso@google.com>.
+
+       * src/cff/cffload.c (cff_charset_load): Reject SID values larger
+       than 64999.
+
+2009-03-19  Vincent Richomme  <richom.v@free.fr>
+
+       Update WinCE Visual C project files.
+
+       * builds/wince/vc2005-ce/freetype.vcproj,
+       builds/wince/vc2008-ce/freetype.vcproj: Add missing base extension
+       files.
+
+2009-03-19  Werner Lemberg  <wl@gnu.org>
+
+       Remove unused Win32 code.
+
+       * builds/wince/ftdebug.c: Remove code guarded with `!_WIN32_WCE'.
+       Since Win32 is handled separately this is no longer needed.
+
+2009-03-19  Vincent Richomme  <richom.v@free.fr>
+
+       Make `gzip' module compile on WinCE.
+
+       * src/gzip/zconf.h [_WIN32_WCE]: Define NO_ERRNO_H.
+
+2009-03-19  Werner Lemberg  <wl@gnu.org>
+
+       Remove unused WinCE code.
+
+       * builds/win32/ftdebug.c: Remove code guarded with `_WIN32_WCE'.
+       Since WinCE is handled separately this is no longer needed.
+
+2009-03-16  Werner Lemberg  <wl@gnu.org>
+
+       docmaker: Don't ignore single-line code blocks.
+
+       * src/tools/docmaker/content.py (DocBlock::_init__): Fix change from
+       2009-01-31.
+
+2009-03-15  Steve Langasek  <steve.langasek@canonical.com>
+
+       Use __asm__ for declaring assembly instead of asm.
+
+       * builds/unix/ftconfig.in (FT_MulFix_arm): Use __asm__ instead of
+       asm on arm, fixing a build failure on armel with -pedantic.
+
+2009-03-14  Werner Lemberg  <wl@gnu.org>
+
+       Fix valgrind warning.
+
+       * src/sfnt/ttsbit0.c (tt_sbit_decoder_load_bit_aligned): Don't read
+       past the end of the frame.
+
+2009-03-12  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.3.9 released.
+       =========================
+
+
+       Tag sources with `VER-2-3-9'.
+
+2009-03-12  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/freetype2.in: Move @FT2_EXTRA_LIBS@ to `Libs.private'.
+
+2009-03-12  Werner Lemberg  <wl@gnu.org>
+
+       Fix some FreeType Coverity issues as reported for Ghostscript.
+
+       * src/base/ftobjs.c (FT_New_Face, FT_New_Memory_Face): Initialize
+       `args.stream' (#3874, #3875).
+       (open_face_PS_from_sfnt_stream): Improve error management (#3786).
+       * src/base/ftmm.c (ft_face_get_mm_service): Fix check of `aservice'
+       (#3870).
+       * src/base/ftstroke.c (ft_stroke_border_get_counts): Remove dead
+       code (#3790).
+       * src/base/ftrfork.c (raccess_guess_apple_generic): Check error
+       value of `FT_Stream_Skip' (#3784).
+
+       * src/type1/t1gload.c (T1_Load_Glyph): Check `size' before accessing
+       it (#3872)
+
+       * src/pcf/pcfdrivr.c (PCF_Glyph_Load): Check `face' before accessing
+       it (#3871).
+       * src/pcf/pcfread.c (pcf_get_metrics): Handle return value of
+       `pcf_get_metric' (#3789, #3782).
+       (pcf_get_properties): Use FT_STREAM_SKIP (#3783).
+
+       * src/cache/ftcmanag.c (FTC_Manager_RegisterCache): Fix check of
+       `acache' (#3797)
+
+       * src/cff/cffdrivr.c (cff_ps_get_font_info): Fix check of `cff'
+       (#3796).
+       * src/cff/cffgload.c (cff_decoder_prepare): Check `size' (#3795).
+       * src/cff/cffload.c (cff_index_get_pointers): Add comment (#3794).
+
+       * src/bdf/bdflib.c (_bdf_add_property): Check `fp->value.atom'
+       (#3793).
+       (_bdf_parse_start): Add comment (#3792).
+
+       * src/raster/ftraster.c (Finalize_Profile_Table): Check
+       `ras.fProfile' (#3791).
+
+       * src/sfnt/ttsbit.c (Load_SBit_Image): Use FT_STREAM_SKIP (#3785).
+
+       * src/gzip/ftgzip.c (ft_gzip_get_uncompressed_size): Properly ignore
+       seek error (#3781).
+
+2009-03-11  Michael Toftdal  <toftdal@gmail.com>
+
+       Extend CID service functions to handle CID-keyed CFFs as CID fonts.
+
+       * include/freetype/ftcid.h (FT_Get_CID_Is_Internally_CID_keyed,
+       FT_Get_CID_From_Glyph_Index): New functions.
+
+       * include/freetype/internal/services/svcid.h
+       (FT_CID_GetIsInternallyCIDKeyedFunc,
+       FT_CID_GetCIDFromGlyphIndexFunc): New function typedefs.
+       (CID Service): Use them.
+
+       * src/base/ftcid.c: Include FT_CID_H.
+       (FT_Get_CID_Is_Internally_CID_keyed, FT_Get_CID_From_Glyph_Index):
+       New functions.
+
+       * src/cff/cffdrivr.c (cff_get_is_cid, cff_get_cid_from_glyph_index):
+       New functions.
+       (cff_service_cid_info): Add them.
+       * src/cff/cffload.c (cff_font_load): Don't free `font->charset.sids'
+       -- it is needed for access as a CID-keyed font.  It gets deleted
+       later on.
+
+       * src/cid/cidriver.c (cid_get_is_cid, cid_get_cid_from_glyph_index):
+       New functions.
+       (cid_service_cid_info): Add them.
+
+       * docs/CHANGES: Updated.
+
+2009-03-11  Bram Tassyns  <bramt@enfocus.be>
+
+       Fix Savannah bug #25597.
+
+       * src/cff/cffparse.c (cff_parse_real): Don't allow fraction_length
+       to become larger than 9.
+
+2009-03-11  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #25814.
+
+       * builds/unix/freetype2.in: As suggested in the bug report, move
+       @LIBZ@ to `Libs.private'.
+
+2009-03-11  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #25781.
+       We now simply check for a valid `offset', no longer handling `delta
+       = 1' specially.
+
+       * src/sfnt/ttcmap.c (tt_cmap4_validate): Don't check `delta' for
+       last segment.
+       (tt_cmap4_set_range, tt_cmap4_char_map_linear,
+       tt_cmap4_char_map_binary): Check offset.
+
+2009-03-11  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/Jamfile: Fix handling of ftadvanc.c.
+       Reported by Oran Agra <oran@monfort.co.il>.
+
+2009-03-10  Vincent Richomme  <richom.v@free.fr>
+
+       Restructure Win32 and Wince compiler support.
+
+       * src/builds/win32: Remove files for WinCE.
+       Move VC 2005 support to a separate directory.
+       Add directory for VC 2008 support.
+
+       * src/builds/wince: New directory hierarchy for WinCE compilers
+       (VC 2005 and VC 2008).
+
+2009-03-09  Werner Lemberg  <wl@gnu.org>
+
+       More preparations for 2.3.9 release.
+
+       * docs/CHANGES: Updated.
+
+       * Jamfile, README: s/2.3.8/2.3.9/, s/238/239/.
+
+2009-03-09  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/rules.mk (SFNT_DRV_H): Add ttsbit0.c.
+
+2009-03-09  Alexey Kryukov  <anagnost@yandex.ru>
+
+       Fix handling of EBDT formats 8 and 9 (part 2).
+
+       This patch fixes the following problems in ttsbit0.c:
+
+       . Bitmaps for compound glyphs were never allocated.
+
+       . `SBitDecoder' refused to load metrics if some other metrics have
+         already been loaded.  This condition certainly makes no sense for
+         recursive calls, so I've just disabled it.  Another possibility
+         would be resetting `decoder->metrics_loaded' to false before
+         loading each composite component.  However, we must restore the
+         original metrics after finishing the recursion; otherwise we can
+         get a misaligned glyph.
+
+       . `tt_sbit_decoder_load_bit_aligned' incorrectly handled `x_pos',
+         causing some glyph components to be shifted too far to the right
+         (especially noticeable for small sizes).
+
+       Note that support for grayscale bitmaps (not necessarily compound) is
+       completely broken in ttsbit0.c.
+
+       * src/sfnt/tt_sbit_decoder_load_metrics: Always load metrics.
+       (tt_sbit_decoder_load_bit_aligned): Handle `x_pos' correctly in case
+       of `h == height'.
+       (tt_sbit_decoder_load_compound): Reset metrics after loading
+       components.
+       Allocate bitmap.
+
+2009-03-09  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/configure.raw (version_info): Set to 9:20:3.
+
+2009-03-03  David Turner  <david@freetype.org>
+
+       Protect SFNT kerning table parser against malformed tables.
+
+       This closes Savannah BUG #25750.
+
+       * src/sfnt/ttkern.c (tt_face_load_kern, tt_face_get_kerning): Fix a
+       bug where a malformed table would be successfully loaded but later
+       crash the engine during parsing.
+
+2009-03-03  David Turner  <david@freetype.org>
+
+       Update documentation and bump version number to 2.3.9.
+
+       * include/freetype/freetype.h: Bump patch version to 9.
+       * docs/CHANGES: Document the ABI break in 2.3.8.
+       * docs/VERSION.DLL: Update version numbers table for 2.3.9.
+
+2009-03-03  David Turner  <david@freetype.org>
+
+       Remove ABI-breaking field in public PS_InfoFontRec definition.
+
+       Instead, we define a new internal PS_FontExtraRec structure to
+       hold the additional field, then place it in various internal
+       positions of the corresponding FT_Face derived objects.
+
+       * include/freetype/t1tables.h (PS_FontInfoRec): Remove the
+       `fs_type' field from the public structure.
+       * include/freetype/internal/psaux.h (T1_FieldLocation): New
+       enumeration `T1_FIELD_LOCATION_FONT_EXTRA'.
+       * include/freetype/internal/t1types.h (PS_FontExtraRec): New
+       structure.
+       (T1_FontRec, CID_FaceRec): Add it.
+
+       * src/cid/cidload.c (cid_load_keyword): Handle
+       T1_FIELD_LOCATION_FONT_EXTRA.
+       * src/cid/cidtoken.h, src/type1/t1tokens.h, src/type42/t42parse.c:
+       Adjust FT_STRUCTURE and T1CODE properly to handle `FSType'.
+       * src/type1/t1load.c (t1_load_keyword): Handle
+       T1_FIELD_LOCATION_FONT_EXTRA.
+
+       * include/freetype/internal/services/svpsinfo.h (PsInfo service):
+       Add `PS_GetFontExtraFunc' function typedef.
+
+       * src/base/ftfstype.c: Include FT_INTERNAL_SERVICE_H and
+       FT_SERVICE_POSTSCRIPT_INFO_H.
+       (FT_Get_FSType_Flags): Use POSTSCRIPT_INFO service.
+
+       * src/cff/cffdrivr.c (cff_service_ps_info): Updated.
+       * src/cid/cidriver.c (cid_ps_get_font_extra): New function.
+       (cid_service_ps_info): Updated.
+       * src/type1/t1driver.c (t1_ps_get_font_extra): New function.
+       (t1_service_ps_info): Updated.
+       * src/type42/t42drivr.c (t42_ps_get_font_extra): New function.
+       (t42_service_ps_info): Updated.
+
+2009-03-02  Alexey Kryukov  <anagnost@yandex.ru>
+
+       Fix handling of EBDT formats 8 and 9.
+
+       The main cycle in `blit_sbit' makes too many iterations: it actually
+       needs the count of lines in the source bitmap rather than in the
+       target image.
+
+       * src/sfnt/ttsbit.c (blit_sbit) [FT_CONFIG_OPTION_OLD_INTERNALS]:
+       Add parameter `source_height' and use it for main loop.
+       (Load_SBit_Single) [FT_CONFIG_OPTION_OLD_INTERNALS]: Updated.
+
+2009-02-23  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #25669.
+
+       * src/base/ftadvanc.h (FT_Get_Advances): Fix serious typo.
+
+       * src/base/ftobjs.c (FT_Select_Metrics, FT_Request_Metrics): Fix
+       scaling factor for non-scalable fonts.
+
+       * src/cff/cffdrivr.c (cff_get_advances): Use correct advance width
+       value to prevent incorrect scaling.
+
+       * docs/CHANGES: Document it.
+
+2009-02-15  Matt Godbolt  <matt@godbolt.org>
+
+       Fix Savannah bug #25588.
+
+       * builds/unix/ftconfig.in (FT_MulFix_arm): Use correct syntax for
+       `orr' instruction.
+
+2009-02-11  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttobjs.c (tt_check_trickyness): Add `DFKaiShu'.
+       Reported by David Bevan <dbevan@emtex.com>.
+
+2009-02-09  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #25495.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Test for bitmap strikes before
+       setting metrics and bbox values.  This ensures that the check for a
+       font with neither a `glyf' table nor bitmap strikes can be performed
+       early enough to set metrics and bbox values too.
+
+2009-02-04  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #25480.
+
+       * builds/unix/freetype-config.in: For --ftversion, don't use $prefix
+       but $includedir.
+
+2009-01-31  Werner Lemberg  <wl@gnu.org>
+
+       Minor docmaker improvements.
+
+       * src/tools/docmaker/content.py (DocBlock::__init__): Ignore empty
+       code blocks.
+
+2009-01-25  Werner Lemberg  <wl@gnu.org>
+
+       Fix SCANCTRL handling in TTFs.
+       Problem reported by Alexey Kryukov <anagnost@yandex.ru>.
+
+       * src/truetype/ttinterp.c (Ins_SCANCTRL): Fix threshold handling.
+
+2009-01-23  Werner Lemberg  <wl@gnu.org>
+
+       Move FT_Get_FSType_Flags to a separate file.
+       Problem reported by Mickey Gabel <mickey@monfort.co.il>.
+
+       * src/base/ftobjs.c (FT_Get_FSType_Flags): Move to...
+       * src/base/ftfstype.c: This new file.
+
+       * modules.cfg (BASE_EXTENSION): Add ftfstype.c.
+
+       * docs/INSTALL.ANY: Updated.
+
+       * builds/mac/*.txt, builds/amiga/*makefile*,
+       builds/win32/{visualc,visualce}/freetype.*, builds/symbian/*:
+       Updated.
+
+2009-01-22  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/unix/ftsystem.c (FT_Stream_Open): Fix 2 error
+       messages ending without "\n".
+
+2009-01-22  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Fix Savannah bug #25347.
+
+       * src/base/ftobjs.c (open_face_PS_from_sfnt_stream): Rewind
+       the stream to the original position passed to this function,
+       when ft_lookup_PS_in_sfnt_stream() failed.
+       (Mac_Read_sfnt_Resource): Rewind the stream to the head of
+       sfnt resource body, when open_face_PS_from_sfnt_stream()
+       failed.
+
+2009-01-19  Michael Lotz  <mmlr@mlotz.ch>
+
+       Fix Savannah bug #25355.
+
+       * include/freetype/config/ftconfig.h (FT_MulFix_i386): Make
+       assembler code work with gcc 2.95.3 (as used by the Haiku project).
+       Add `cc' register to the clobber list.
+
+2009-01-18  Werner Lemberg  <wl@gnu.org>
+
+       Protect FT_Get_Next_Char.
+
+       * src/sfnt/ttcmap.c (tt_cmap4_set_range): Apply fix similar to
+       change from 2008-07-22.
+
+       Patch from Ronen Ghoshal <rghoshal@emtex.com>.
+
+2009-01-18  Werner Lemberg  <wl@gnu.org>
+
+       Implement FT_Get_Name_Index for SFNT driver.
+
+       * src/sfnt/sfdriver.c (sfnt_get_name_index): New function.
+       (sfnt_service_glyph_dict): Use it.
+
+       Problem reported by Truc Truong <tructv@necsv.com>.
+
+2009-01-18  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/ftstroke.h (FT_Outline_GetInsideBorder): Fix
+       documentation.  Problem reported by Truc Truong <tructv@necsv.com>.
+
+       * docs/CHANGES: Updated.
+
+2009-01-14  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.3.8 released.
+       =========================
+
+
+       Tag sources with `VER-2-3-8'.
+
+       * docs/VERSION.DLL: Update documentation and bump version number to
+       2.3.8.
+
+       * README, Jamfile (RefDoc), builds/win32/visualc/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj,
+       builds/win32/visualce/index.html,
+       builds/win32/visualce/freetype.dsp,
+       builds/win32/visualce/freetype.vcproj: s/2.3.7/2.3.8/, s/237/238/.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 8.
+
+       * builds/unix/configure.raw (version_info): Set to 9:19:3.
+
+       * docs/release: Updated.
+
+2009-01-14  Werner Lemberg  <wl@gnu.org>
+
+       * builds/toplevel.mk (dist): Compress better.
+
+2009-01-13  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftobjs.c (FT_Get_FSType_Flags): Cast for compilation
+       with C++.
+
+2009-01-13  Werner Lemberg  <wl@gnu.org>
+
+       Don't use stdlib.h and friends directly.
+       Reported by Mickey Gabel <mickey@monfort.co.il>.
+
+       * src/base/ftdbgmem.c: s/<stdlib.h>/FT_CONFIG_STANDARD_LIBRARY_H/.
+
+       * src/gzip/ftgzip.c, src/lzw/ftlzw.c, src/raster/ftmisc.h:
+       s/<string.h>/FT_CONFIG_STANDARD_LIBRARY_H/.
+
+       * src/autofit/aftypes.h, src/autofit/afhints.c,
+       src/pshinter/pshalgo.c: s/<stdio.h>/FT_CONFIG_STANDARD_LIBRARY_H/
+
+       * src/lzw/ftlzw.c, src/base/ftdbgmem.c: Don't include stdio.h.
+
+2009-01-12  Werner Lemberg  <wl@gnu.org>
+
+       Avoid compiler warnings.
+
+       * */*: s/do ; while ( 0 )/do { } while ( 0 )/.
+       Reported by Sean McBride <sean@rogue-research.com>.
+
+2009-01-12  Werner Lemberg  <wl@gnu.org>
+
+       Fix stdlib dependencies.
+
+       Problem reported by Mickey Gabel <mickey@monfort.co.il>.
+
+       * include/freetype/config/ftstdlib.h (ft_exit): Removed.  Unused.
+
+       * src/autofit/afhints.c, src/base/ftlcdfil.c, src/smooth/ftsmooth.c:
+       s/memcpy/ft_memcpy/.
+       * src/psaux/t1decode.c: s/memset/ft_memset/, s/memcpy/ft_memcpy/.
+
+2009-01-11  Werner Lemberg  <wl@gnu.org>
+
+       * docs/formats.txt: Add link to PCF specification.
+
+       * include/freetype/ftbdf.h (FT_Get_BDF_Property): Improve
+       documentation.
+
+2009-01-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftadvanc.c (_ft_face_scale_advances, FT_Get_Advance,
+       FT_Get_Advances): Change the type of load_flags from FT_UInt32 to
+       FT_Int32, to match with the flags for FT_Load_Glyph().
+       * src/cff/cffdrivr.c (cff_get_advances): Ditto.
+       * src/truetype/ttdriver.c (tt_get_advances): Ditto.
+       * include/freetype/ftadvanc.h (FT_Get_Advance, FT_Get_Advances):
+       Ditto.
+       * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc):
+       Ditto.
+
+2009-01-09  Daniel Zimmermann  <netzimme@aol.com>
+
+       * src/gxvalid/gxvmort.c (gxv_mort_feature_validate): Fix wrong
+       length check.  From Savannah patch #6682.
+
+2009-01-09  Werner Lemberg  <wl@gnu.org>
+
+       Fix problem with T1_FIELD_{NUM,FIXED}_TABLE2.
+
+       * src/psaux/psobjs.c (ps_parser_load_field_table): Don't handle
+       `count_offset' if it is zero (i.e., unused).  Otherwise, the first
+       element of the structure which holds the data is erroneously
+       modified.  Problem reported by Chi Nguyen <chint@necsv.com>.
+
+2009-01-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftadvanc.c (_ft_face_scale_advances, FT_Get_Advance,
+       FT_Get_Advances): Extend the type of load_flags from FT_UInt to
+       FT_UInt32, to pass 32-bit flags on 16bit platforms.
+       * src/cff/cffdrivr.c (cff_get_advances): Ditto.
+       * src/truetype/ttdriver.c (tt_get_advances): Ditto.
+       * include/freetype/ftadvanc.h (FT_Get_Advance, FT_Get_Advances):
+       Ditto.
+       * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc):
+       Ditto.
+
+2009-01-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftobjs.c (FT_Done_Library): Issue an error message when
+       FT_Done_Face() cannot free all faces. If the list of the opened
+       faces includes broken face which FT_Done_Face() cannot free,
+       FT_Done_Library() retries FT_Done_Face() and it can fall into
+       an endless loop. See the discussion:
+       http://lists.gnu.org/archive/html/freetype-devel/2008-09/msg00047.html
+       http://lists.gnu.org/archive/html/freetype-devel/2008-10/msg00000.html
+
+2009-01-07  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Document new key `a' in ftdiff.
+
+2009-01-06  Werner Lemberg  <wl@gnu.org>
+
+       * autogen.sh: Don't use GNUisms while calling sed.  Problem reported
+       by Sean McBride.
+
+2009-01-06  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftbitmap.c (FT_Bitmap_Convert): Handle FT_PIXEL_MODE_LCD
+       and FT_PIXEL_MODE_LCD_V.  Problem reported by Chi Nguyen
+       <chint@necsv.com>.
+
+2009-01-06  Diego Pettenò  <flameeyes@gmail.com>
+
+       * builds/unix/configure.raw: Don't call AC_CANONICAL_BUILD and
+       AC_CANONICAL_TARGET and use $host_os only.  A nice explanation for
+       this change can be found at
+       http://blog.flameeyes.eu/s/canonical-target.
+
+       From Savannah patch #6712.
+
+2009-01-06  Sean McBride  <sean@rogue-research.com>
+
+       * src/base/ftdbgmem.c (_debug_mem_dummy): Make it static.
+
+       * src/base/ftmac.c: Remove some #undefs.
+
+2008-12-26  Werner Lemberg  <wl@gnu.org>
+
+       Set `face_index' field in FT_Face for all font formats.
+
+       * cff/cffobjs.c (cff_face_init), winfonts/winfnt.c (FNT_Face_Init),
+       sfnt/sfobjs.c (sfnt_init_face): Do it.
+
+       * docs/CHANGES: Document it.
+
+2008-12-22  Steve Grubb
+
+       * builds/unix/ftsystem.c (FT_Stream_Open): Reject zero-length files.
+       Patch from Savannah bug #25151.
+
+2008-12-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/pfr/pfrdrivr.c, src/winfonts/winfnt.c, src/cache/ftcmanag.c,
+       src/smooth/ftgrays.c, src/base/ftobjc.s, src/sfobjs.c:
+       s/_Err_Bad_Argument/_Err_Invalid_Argument/.  The former is for
+       errors in the bytecode interpreter only.
+
+2008-12-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftpfr.c (FT_Get_PFR_Metrics): Protect against NULL
+       arguments.
+       Fix return value for non-PFR fonts.  Both problems reported by Chi
+       Nguyen <chint@necsv.com>.
+
+2008-12-21  anonymous
+
+       FT_USE_MODULE declares things as:
+
+         extern const FT_Module_Class
+
+       (or similar for C++).  However, the actual types of the variables
+       being declared are often different, e.g., FT_Driver_ClassRec or
+       FT_Renderer_Class.  (Some are, indeed, FT_Module_Class.)
+
+       This works with most C compilers (since those structs begin with an
+       FT_Module_Class struct), but technically it's undefined behavior.
+
+       To quote the ISO/IEC 9899:TC2 final committee draft, section 6.2.7
+       paragraph 2:
+
+         All declarations that refer to the same object or function shall
+         have compatible type; otherwise, the behavior is undefined.
+
+       (And they are not compatible types.)
+
+       Most C compilers don't reject (or even detect!) code which has this
+       issue, but the GCC LTO development branch compiler does.  (It
+       outputs the types of the objects while generating .o files, along
+       with a bunch of other information, then compares them when doing the
+       final link-time code generation pass.)
+
+       Patch from Savannah bug #25133.
+
+       * src/base/ftinit.c (FT_USE_MODULE): Include variable type.
+
+       * builds/amiga/include/freetype/config/ftmodule.h,
+       include/freetype/config/ftmodule.h, */module.mk: Updated to declare
+       pass correct types to FT_USE_MODULE.
+
+2008-12-21  Hongbo Ni  <hongbo@njstar.com>
+
+       * src/autofit/aflatin.c (af_latin_hint_edges),
+       src/autofit/aflatin2.c (af_latin2_hint_edges), src/autofit/afcjk.c
+       (af_cjk_hint_edges): Protect against division by zero.  This fixes
+       Savannah bug #25124.
+
+2008-12-18  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2008-12-18  Bevan, David  <dbevan@emtex.com>
+
+       Provide API for accessing embedding and subsetting restriction
+       information.
+
+       * include/freetype.h (FT_FSTYPE_INSTALLABLE_EMBEDDING,
+       FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING,
+       FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING, FT_FSTYPE_EDITABLE_EMBEDDING,
+       FT_FSTYPE_NO_SUBSETTING, FT_FSTYPE_BITMAP_EMBEDDING_ONLY): New
+       macros.
+       (FT_Get_FSType_Flags): New function declaration.
+
+       * src/base/ftobjs.c (FT_Get_FSType_Flags): New function.
+
+       * src/cid/cidtoken.h, src/type1/t1tokens.h, src/type42/t42parse.c
+       (t42_keywords): Handle `FSType'.
+
+       * include/freetype/t1tables.h (PS_FontInfoRec): Add `fs_type' field.
+
+2008-12-17  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Don't use internal
+       macros so that copying the source code into an application works
+       out of the box.
+
+2008-12-17  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/ftsynth.h, src/base/ftsynth.c: Move
+       FT_GlyphSlot_Own_Bitmap to...
+       * include/freetype/ftbitmap.h, src/base/ftbitmap.c: These files.
+
+       * docs/CHANGES: Document it.
+
+2008-12-10  Werner Lemberg  <wl@gnu.org>
+
+       Generalize the concept of `tricky' fonts by introducing
+       FT_FACE_FLAG_TRICKY to indicate that the font format's hinting
+       engine is necessary for correct rendering.
+
+       At the same time, slightly modify the behaviour of tricky fonts:
+       FT_LOAD_NO_HINTING is now ignored.  To really force raw loading
+       of tricky fonts (without hinting), both FT_LOAD_NO_HINTING and
+       FT_LOAD_NO_AUTOHINT must be used.
+
+       Finally, tricky TrueType fonts always use the bytecode interpreter
+       even if the patented code is used.
+
+       * include/freetype/freetype.h (FT_FACE_FLAG_TRICKY, FT_IS_TRICKY):
+       New macros.
+
+       * src/truetype/ttdriver.c (Load_Glyph): Handle new load flags
+       semantics as described above.
+
+       * src/truetype/ttobjs.c (tt_check_trickyness): New function, using
+       code of ...
+       (tt_face_init): This function, now simplified and updated to new
+       semantics.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Don't use autohinter for tricky
+       fonts.
+
+       * docs/CHANGES: Document it.
+
+2008-12-09  Werner Lemberg  <wl@gnu.org>
+
+       Really fix Savannah bug #25010: An SFNT font with neither outlines
+       nor bitmaps can be considered as containing space `glyphs' only.
+
+       * src/truetype/ttpload.c (tt_face_load_loca): Handle the case where
+       a `glyf' table is missing.
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Abort if we have no
+       `glyf' table but a non-zero `loca' entry.
+       (tt_loader_init): Handle missing `glyf' table.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Undo change 2008-12-05.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): A font with neither outlines
+       nor bitmaps is scalable.
+
+2008-12-05  Werner Lemberg  <wl@nu.org>
+
+       * src/autofit/aflatin.c (af_latin_uniranges): Add more ranges.  This
+       fixes Savannah bug #21190 which also provides a basic patch.
+
+2008-12-05  Werner Lemberg  <wl@nu.org>
+
+       * include/freetype/freetype.h (FT_LOAD_ADVANCE_ONLY): Use value
+       0x100 instead of 0x10000; the latter value is already occupied by
+       FT_LOAD_TARGET_LIGHT.  Bug reported by James Cloos.
+
+
+       Handle SFNT with neither outlines nor bitmaps.  This fixes Savannah
+       bug #25010.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Reject fonts with neither
+       outlines nor bitmaps.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Don't return an error if there
+       is no table with glyphs.
+
+
+       * src/sfnt/ttload.c (tt_face_lookup_table): Improve debugging
+       message.
+
+2008-12-01  Werner Lemberg  <wl@gnu.org>
+
+       GDEF tables need `glyph_count' too for validation.  Problem reported
+       by Chi Nguyen <chint@necsv.com>.
+
+       * src/otvalid/otvgdef.c (otv_GDEF_validate), src/otvalid/otvalid.h
+       (otv_GDEF_validate), src/otvalid/otvmod.c (otv_validate): Pass
+       `glyph_count'.
+
+2008-11-29  Werner Lemberg  <wl@gnu.org>
+
+       * src/autofit/afcjk.c, src/base/ftoutln.c, src/base/ftrfork.c,
+       src/bdf/bdfdrivr.c, src/gxvalid/gxvmorx.c, src/otvalid/otvmath.c,
+       src/pcf/pcfdrivr.c, src/psnames/pstables.h, src/smooth/ftgrays.c,
+       src/tools/glnames.py, src/truetype/ttinterp.c, src/type1/t1load.c,
+       src/type42/t42objs.c, src/winfonts/winfnt.c: Fix compiler warnings
+       (Atari PureC).
+
+2008-11-29  James Cloos  <cloos@jhcloos.com>
+
+       * src/type/t1load.c (mm_axis_unmap): Revert previous patch and fix
+       it correctly by using FT_INT_TO_FIXED (FreeType expects 16.16 values
+       in the /BlendDesignMap space).
+
+2008-11-29  James Cloos  <cloos@jhcloos.com>
+
+       * src/type1/t1load.c (mm_axis_unmap): `blend_points' is FT_Fixed*,
+       whereas `design_points' is FT_Long*.  Therefore, return blend rather
+       than design points.
+
+2008-11-27  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffparse.c (cff_parse_real): Handle more than nine
+       significant digits correctly.  This fixes Savannah bug #24953.
+
+2008-11-25  Daniel Zimmermann  <netzimme@aol.com>
+
+       * src/base/ftstream.c (FT_Stream_ReadFields): Don't access stream
+       before the NULL check.  From Savannah patch #6681.
+
+2008-11-24  Werner Lemberg  <wl@gnu.org>
+
+       Fixes from the gnuwin32 port.
+
+       * src/base/ftlcdfil.c: s/EXPORT/EXPORT_DEF/.
+
+       * src/base/ftotval.c: Include FT_OPENTYPE_VALIDATE_H.
+
+       * src/psaux/psobjs.c (ps_table_add): Check `length'.
+
+2008-11-15  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttinterp.c (tt_default_graphics_state): The default
+       value for `scan_type' is zero, as confirmed by Greg Hitchcock from
+       Microsoft.  Problem reported by Michal Nowakowski
+       <miszka@limes.com.pl>.
+
+2008-11-12  Tor Andersson  <tor.andersson@gmail.com>
+
+       * src/cff/cffdrivr.c (cff_get_cmap_info): Initialize `format' field.
+       This fixes Savannah bug #24819.
+
+2008-11-08  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Remove #if 0/#endif guards
+       since OpenType version 1.5 has been released.
+
+       * include/ttnameid.h (TT_NAME_ID_WWS_FAMILY,
+       TT_NAME_ID_WWS_SUBFAMILY): New macros for OpenType 1.5.
+       (TT_URC_COPTIC, TT_URC_VAI, TT_URC_NKO, TT_URC_BALINESE,
+       TT_URC_PHAGSPA, TT_URC_NON_PLANE_0, TT_URC_PHOENICIAN,
+       TT_URC_TAI_LE, TT_URC_NEW_TAI_LUE, TT_URC_BUGINESE,
+       TT_URC_GLAGOLITIC, TT_URC_YIJING, TT_URC_SYLOTI_NAGRI,
+       TT_URC_LINEAR_B, TT_URC_ANCIENT_GREEK_NUMBERS, TT_URC_UGARITIC,
+       TT_URC_OLD_PERSIAN, TT_URC_SHAVIAN, TT_URC_OSMANYA,
+       TT_URC_CYPRIOT_SYLLABARY, TT_URC_KHAROSHTHI, TT_URC_TAI_XUAN_JING,
+       TT_URC_CUNEIFORM, TT_URC_COUNTING_ROD_NUMERALS, TT_URC_SUNDANESE,
+       TT_URC_LEPCHA, TT_URC_OL_CHIKI, TT_URC_SAURASHTRA, TT_URC_KAYAH_LI,
+       TT_URC_REJANG, TT_URC_CHAM, TT_URC_ANCIENT_SYMBOLS,
+       TT_URC_PHAISTOS_DISC, TT_URC_OLD_ANATOLIAN, TT_URC_GAME_TILES): New
+       macros for OpenType 1.5.
+
+2008-11-08  Wenlin Institute  <wenlin@wenlin.com>
+
+       * src/base/ftobjs.c (ft_glyphslot_free_bitmap): Protect against
+       slot->internal == NULL.  Reported by Graham Asher.
+
+2008-11-08  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfobjs.c (tt_face_get_name): Modified to return an error
+       code so that memory allocation problems can be distinguished from
+       missing table entries.  Reported by Graham Asher.
+       (GET_NAME): New macro.
+       (sfnt_load_face): Use it.
+
+2008-11-05  Werner Lemberg  <wl@gnu.org>
+
+       * devel/ftoption.h, include/freetype/config/ftoption.h
+       [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Undefine
+       TT_CONFIG_OPTION_UNPATENTED_HINTING.  This fixes the return value of
+       `FT_Get_TrueType_Engine_Type' (and makes it work as documented).
+       Reported in bug #441638 of bugzilla.novell.com.
+
+       * docs/CHANGES: Document it.
+
+2008-11-03  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (parse_subrs): Use an endless loop.  There are
+       fonts (like HELVI.PFB version 003.001, used on OS/2) which define
+       some `subrs' elements more than once.  Problem reported by Peter
+       Weilbacher <mozilla@weilbacher.org>.
+
+2008-10-15  Graham Asher  <graham.asher@btinternet.com>
+
+       * src/sfnt/ttpost.c (tt_post_default_names): Add `const'.
+
+2008-10-15  David Turner  <david@freetype.org>
+
+       * src/truetype/ttgxvar.c (TT_Set_MM_Blend): Disambiguate for
+       meddlesome compilers' warning against `for ( ...; ...; ...) ;'.
+
+2008-10-14  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffobjs.c (cff_face_init): Remove compiler warning.
+       Suggested by Bram Tassyns in Savannah patch #6651.
+
+2008-10-12  Graham Asher  <graham.asher@btinternet.com>
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Fix computation of
+       `underline_position'.
+
+2008-10-12  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2008-10-09  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Fix Savannah bug #24468.
+
+       According to include/freetype/internal/ftobjs.h, the appropriate
+       type to interchange single character codepoint is FT_UInt32. It
+       should be distinguished from FT_UInt which can be 16bit integer.
+
+       * src/sfnt/ttcmap.c (tt_cmap4_char_map_linear): Change the type
+       of the second argument `pcharcode' from FT_UInt* to FT_UInt32*.
+       (tt_cmap4_char_map_binary): Ditto.
+       (tt_cmap14_get_nondef_chars): Change the type of return value
+       from FT_UInt* to FT_UInt32*.
+
+2008-10-08  John Tytgat  <John.Tytgat@esko.com>
+
+       Fix Savannah bug #24485.
+
+       * src/type1/t1load.c (parse_charstrings): Assure that we always have
+       a .notdef glyph.
+
+2008-10-05  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftmac.c: Include FT_TRUETYPE_TAGS_H for multi build.
+       * builds/mac/ftmac.c: Ditto.
+
+2008-10-05  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * include/freetype/tttags.h (TTAG_TYP1, TTAG_typ1): Fix definitions.
+       * src/base/ftobjs.c: Include FT_TRUETYPE_TAGS_H.
+
+2008-10-05  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/sfnt/sfobjs.c (sfnt_open_font): Allow `typ1' version tag in
+       the beginning of sfnt container.
+       * src/sfnt/ttload.c (check_table_dir): Return
+       `SFNT_Err_Table_Missing' when sfnt table directory structure is
+       correct but essential tables for TrueType fonts (`head', `bhed' or
+       `SING') are missing.  Other errors are returned by
+       SFNT_Err_Unknown_File_Format.
+
+       * src/base/ftobjs.c (FT_Open_Face): When TrueType driver returns
+       `FT_Err_Table_Missing', try `open_face_PS_from_sfnt_stream'.  It is
+       enabled only when old mac font support is configured.
+
+2008-10-04  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * include/freetype/tttags.h (TTAG_CID, TTAG_FOND, TTAG_LWFN,
+       TTAG_POST, TTAG_sfnt, TTAG_TYP1, TTAG_typ1): New tags to simplify
+       the repeated calculations of these values in ftobjs.c and ftmac.c.
+       * src/base/ftobjs.c: Replace all FT_MAKE_TAG by new tags.
+       * src/base/ftmac.c: Ditto.
+       * builds/mac/ftmac.c: Ditto.
+
+2008-10-04  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftobjs.c (ft_lookup_PS_in_sfnt_stream): Remove wrong
+       initialization of *is_sfnt_cid.
+
+2008-10-04  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftobjs.c (open_face_PS_from_sfnt_stream): Remove compiler
+       warnings.
+
+2008-10-04  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftobjs.c (ft_lookup_PS_in_sfnt): Replaced by...
+       (ft_lookup_PS_in_sfnt_stream): This.
+       (open_face_PS_from_sfnt_stream): New function.  It checks whether
+       the stream is sfnt-wrapped Type1 PS font or sfnt-wrapped CID-keyed
+       font, then try to open a face for given face_index.
+       (Mac_Read_sfnt_Resource): Replace the combination of
+       `ft_lookup_PS_in_sfnt' and `open_face_from_buffer' by
+       `open_face_PS_from_sfnt_stream'.
+       * src/base/ftmac.c (FT_New_Face_From_SFNT): Ditto.
+       * builds/mac/ftmac.c (FT_New_Face_From_SFNT): Ditto.
+       * src/base/ftbase.h: Remove `ft_lookup_PS_in_sfnt' and add
+       `open_face_PS_from_sfnt_stream'.
+
+2008-10-03  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftobjs.c (ft_lookup_PS_in_sfnt): Set *is_sfnt_cid to
+       FALSE if neither `CID ' nor `TYP1' is found in the sfnt container.
+
+2008-10-03  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * include/freetype/config/ftconfig.h: Define FT_MACINTOSH when SC or
+       MrC compiler of MPW is used.  These compilers do not define the
+       macro __APPLE__ by themselves.
+       * builds/unix/ftconfig.in: Ditto.
+       * builds/vms/ftconfig.h: Ditto.
+       * src/base/ftbase.c: Use FT_MACINTOSH instead of __APPLE__, to
+       include ftmac.c if FreeType 2 is built by MPW.
+       * src/base/ftobjs.c: Use FT_MACINTOSH instead of __APPLE__, to
+       enable shared functions for ftmac.c if FreeType 2 is built by MPW.
+
+       * builds/mac/ftmac.c: Include ftbase.h.
+       (memory_stream_close): Removed.
+       (new_memory_stream): Ditto.
+       (open_face_from_buffer): Removed.  Use the implementation in
+       ftobjs.c.
+       (ft_lookup_PS_in_sfnt): Ditto.
+
+       * builds/mac/FreeType.m68k_far.make.txt: Build ftmac.c as an
+       included part of ftbase.c, to share the functions in ftobjs.c.  The
+       rule compiling ftmac.c separately is removed and the rule copying
+       ftbase.c from src/base/ftbase.c to builds/mac/ftbase.c is added.
+       * builds/mac/FreeType.m68k_cfm.make.txt: Ditto.
+       * builds/mac/FreeType.ppc_classic.make.txt: Ditto.
+       * builds/mac/FreeType.ppc_carbon.make.txt: Ditto.
+
+2008-10-02  Bram Tassyns  <bramt@enfocus.be>
+
+       * src/cff/cffgload.c (cff_slot_load): Map CID 0 to GID 0.  This
+       fixes Savannah bug #24430.
+
+2008-10-02  Werner Lemberg  <wl@gnu.org>
+
+       * builds/freetype.mk (BASE_H): Rename to...
+       (INTERNAL_H): This.
+       (FREETYPE_H): Updated.
+       * src/base/rules.mk: (BASE_OBJ_S, OBJ_DIR/%.$O): Add BASE_H.
+       * src/bdf/rules.mk (BDF_DRV_H): Add bdferror.h.
+       * src/cache/rules.mk (CACHE_DRV_H): Add ftccache.h and ftcsbits.h.
+       * src/pcf/rules.mk (PCF_DRV_H): Add pcfread.h.
+       * src/raster/rules.mk (RASTER_DRV_H): Add ftmisc.h.
+       * src/type42/rules.mk (T42_DRV_H): Add t42types.h.
+
+2008-10-02  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftbase.h: New file to declare the private utility
+       functions shared by the sources of base modules.  Currently,
+       `ft_lookup_PS_in_sfnt' and `open_face_from_buffer' are declared to
+       share between ftobjs.c and ftmac.c.
+
+       * src/base/rule.mk: Add ftbase.h.
+
+       * src/base/ftobjs.c: Include ftbase.h.
+       (memory_stream_close): Build on any platform when old MacOS font
+       support is enabled.
+       (new_memory_stream): Ditto.
+       (open_face_from_buffer): Build on any platform when old MacOS font
+       support is enabled.  The counting of the face in a font file is
+       slightly different between Carbon-dependent parser and Carbon-free
+       parser.  They are merged with the platform-specific conditional.
+       (ft_lookup_PS_in_sfnt): Ditto.
+
+       * src/base/ftmac.c: Include ftbase.h.
+       (memory_stream_close): Removed.
+       (new_memory_stream): Ditto.
+       (open_face_from_buffer): Removed.  Use the implementation in
+       ftobjs.c.
+       (ft_lookup_PS_in_sfnt): Ditto.
+
+2008-10-02  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): `psnames_error' is only needed
+       if TT_CONFIG_OPTION_POSTSCRIPT_NAMES is defined.
+
+2008-10-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttobjs.c (tt_face_done), src/cff/cffobjs.c
+       (cff_face_done), src/pfr/pfrobjs.c (pfr_face_done),
+       src/pcf/pcfdrivr.c (PCF_Face_Done), src/cid/cidobjs.c
+       (cid_face_done), src/bdf/bdfdrivr. (BDF_Face_Done),
+       src/sfnt/sfobjs.c (sfnt_face_done): Protect against face == 0.
+       Reported by Graham Asher.
+
+2008-09-30  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/rules.mk: Add conditional source to BASE_SRC, for `make
+       multi' on Mac OS X.  If the macro $(ftmac_c) is defined,
+       $(BASE_DIR)/$(ftmac_c) is added to BASE_SRC.  In a normal build, the
+       lack of ftmac.c in BASE_SRC is not serious because ftbase.c includes
+       ftmac.c.
+       * builds/unix/unix-def.in: Add a macro definition of $(ftmac_c).
+       * builds/unix/configure.raw: Add procedure to set up appropriate
+       value of $(ftmac_c) with the consideration of the availability of
+       Carbon framework.
+
+2008-09-30  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/Jamfile: Add target for multi build by jam on Mac OS X.
+       * src/base/ftobjs.c (FT_New_Face): Fix the condition to include this
+       function for MPW building.  It is synchronized the condition to
+       include ftmac.c source into ftbase.c.
+
+2008-09-22  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffgload.c (CFF_Operator, cff_argument_counts,
+       cff_decoder_parse_charstrings): Handle (invalid)
+       `callothersubr' and `pop' instructions.
+
+2008-09-22  John Tytgat  <John.Tytgat@esko.com>
+
+       Fix Savannah bug #24307.
+
+       * include/freetype/internal/t1types.h (CID_FaceRec),
+       src/type42/t42types.h (T42_FaceRec): Comment out `afm_data'.
+
+2008-09-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/smooth/ftgrays.c (gray_raster_render): Don't dereference
+       `target_map' if FT_RASTER_FLAG_DIRECT is set.  Problem reported by
+       Stephan T. Lavavej <stl@nuwen.net>.
+
+2008-09-21  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/otvalid/Jamfile: Add missing target `otvmath' for multi build
+       by jam.
+       * src/sfnt/Jamfile: Add missing target `ttmtx' for multi build by
+       jam.
+
+2008-09-20  Werner Lemberg  <wl@gnu.org>
+
+       * src/smooth/ftgrays.c (gray_find_cell): Fix threshold.  The values
+       passed to this function are already `normalized'.  Problem reported
+       by Stephan T. Lavavej <stl@nuwen.net>.
+
+       * docs/CHANGES: Document it.
+
+2008-09-20  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftoutln.c: Include FT_INTERNAL_DEBUG_H.
+       (FT_Outline_Decompose): Decorate with tracing messages.
+
+       * src/smooth/ftgrays.c [DEBUG_GRAYS]: Replace with
+       FT_DEBUG_LEVEL_TRACE.
+       [_STANDALONE_ && FT_DEBUG_LEVEL_TRACE]: Include stdio.h and
+       stdarg.h.
+
+       (FT_TRACE) [_STANDALONE_]: Remove.
+       (FT_Message) [_STANDALONE_ && FT_DEBUG_LEVEL_TRACE]: New function.
+       (FT_TRACE5, FT_TRACE7) [_STANDALONE_]: New macros.
+       (FT_ERROR) [_STANDALONE_]: Updated.
+
+       (gray_hline) [FT_DEBUG_LEVEL_TRACE]: Fix condition.
+       Use FT_TRACE7.
+       (gray_dump_cells): Make it `static void'.
+       (gray_convert_glyph): Use FT_TRACE7.
+
+       (FT_Outline_Decompose) [_STANDALONE_]: Synchronize with version in
+       ftoutln.c.
+
+       * src/base/ftadvanc.c (FT_Get_Advance, FT_Get_Advances): Use
+       FT_ERROR_BASE.
+
+       * docs/formats.txt: Updated.
+
+2008-09-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftmac.c: Import sfnt-wrapped Type1 and sfnt-wrapped
+       CID-keyed font support.
+       * builds/mac/ftmac.c: Ditto.
+
+2008-09-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftobjs.c (Mac_Read_sfnt_Resource): Fix double free bug in
+       sfnt-wrapped Type1 and sfnt-wrapped CID-keyed font support code.
+       `open_face_from_buffer' frees the passed buffer if it cannot open a
+       face from the buffer, so the caller must not free it.
+
+2008-09-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftobjs.c (Mac_Read_sfnt_Resource): Add initial support
+       for sfnt-wrapped Type1 and sfnt-wrapped CID-keyed font.
+       (ft_lookup_PS_in_sfnt): New function to look up `TYP1' or `CID '
+       table in sfnt table directory.  It is used before loading TrueType
+       font driver.
+
+       * docs/CHANGES: Add note about the current status of sfnt-wrapped
+       Type1 and sfnt-wrapped CID-keyed font support.
+
+2008-09-18  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftsystem.c (FT_Done_Memory): Use ft_sfree directly for
+       orthogonality (ft_free and ft_sfree could belong to different memory
+       pools).  This fixes Savannah bug #24297.
+
+2008-09-18  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/cff/cffobjs.c (cff_face_init): Use TTAG_OTTO defined
+       in ttags.h instead of numerical value 0x4F54544FL.
+
+2008-09-16  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffgload.h, src/cff/cffgload.c
+       (cff_decoder_set_width_only): Eliminate function call.
+
+2008-09-15  George Williams  <gww@silcom.com>
+
+       Fix Savannah bug #24179, reported by Bram Tassyns.
+
+       * src/type1/t1load.c (mm_axis_unmap, T1_Get_MM_Var): Fix computation
+       of default values.
+
+2008-09-15  Werner Lemberg  <wl@gnu.org>
+
+       * src/tools/glnames.py (main): Surround `ft_get_adobe_glyph_index'
+       and `ft_adobe_glyph_list' with FT_CONFIG_OPTION_ADOBE_GLYPH_LIST to
+       prevent unconditional definition.  This fixes Savannah bug #24241.
+
+       * src/psnames/pstables.h: Regenerated.
+
+2008-09-13  Werner Lemberg  <wl@gnu.org>
+
+       * autogen.sh, builds/unix/configure.raw,
+       include/freetype/config/ftconfig.h, builds/unix/ftconfig.in: Minor
+       beautifying.
+
+       * include/freetype/ftadvanc.h, include/freetype/ftgasp.h,
+       include/freetype/ftlcdfil.h: Protect against FreeType 1.
+       Some other minor fixes.
+
+       * devel/ftoption.h: Synchronize with
+       include/freetype/config/ftoption.h.
+
+2008-09-11  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftbase.c: Include ftadvanc.c.
+
+2008-09-11  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/unix/ftconfig.in: Duplicate the cpp computation of
+       FT_SIZEOF_{INT|LONG} from include/freetype/config/ftconfig.h.
+       (FT_USE_AUTOCONF_SIZEOF_TYPES): New macro.  If defined, the cpp
+       computation is disabled and the statically configured sizes are
+       used.  This fixes Savannah bug #21250.
+
+       * builds/unix/configure.raw: Add the checks to compare the cpp
+       computation results of the bit length of int and long versus the
+       sizes detected by running `configure'.  If the results are
+       different, FT_USE_AUTOCONF_SIZEOF_TYPES is defined to prioritize the
+       results.
+       New option --{enable|disable}-biarch-config is added to define or
+       undefine FT_USE_AUTOCONF_SIZEOF_TYPES manually.
+
+2008-09-05  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/unix/configure.raw: Clear FT2_EXTRA_LIBS when Carbon or
+       ApplicationService framework is missing.  Although this value is not
+       used in building of FreeType2, it is written in `freetype2.pc' and
+       `freetype-config'.
+
+2008-09-01  david turner  <david@freetype.org>
+
+       * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Accept a negative cmap
+       index to mean `use default cached FT_Face's charmap'.  This fixes
+       Savannah bug #22625.
+       * include/freetype/ftcache.h: Document it.
+
+
+       Make FT_MulFix an inlined function.  This is done to speed up
+       FreeType a little (on x86 3% when loading+hinting, 10% when
+       rendering, ARM savings are more important though).  Disable this by
+       undefining FT_CONFIG_OPTION_INLINE_MULFIX.
+
+       Use of assembler code can now be controlled with
+       FT_CONFIG_OPTION_NO_ASSEMBLER.
+
+       * include/freetype/config/ftconfig.h, builds/unix/ftconfig.in
+       [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MulFix_arm): New assembler
+       implementation.
+       [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MulFix_i386): Assembler
+       implementation taken from `ftcalc.c'.
+       [!FT_CONFIG_OPTION_NO_ASSEMBLER] (FT_MULFIX_ASSEMBLER): New macro
+       which is defined to the platform-specific assembler implementation
+       of FT_MulFix.
+       [FT_CONFIG_OPTION_INLINE_MULFIX && FT_MULFIX_ASSEMBLER]
+       (FT_MULFIX_INLINED): New macro.
+
+       * include/freetype/config/ftoption.h (FT_CONFIG_OPTION_NO_ASSEMBLER,
+       FT_CONFIG_OPTION_INLINE_MULFIX): New macros.
+
+       * include/freetype/freetype.h: Updated to handle FT_MULFIX_INLINED.
+
+       * src/base/ftcalc.c: Updated to use FT_MULFIX_ASSEMBLER and
+       FT_MULFIX_INLINED.
+
+
+       Add a new header named FT_ADVANCES_H declaring some new APIs to
+       extract the advances of one or more glyphs without necessarily
+       loading their outlines.  Also provide `fast loaders' for the
+       TrueType, Type1, and CFF font drivers (more to come later).
+
+       * src/base/ftadvanc.c, include/freetype/ftadvanc.h: New files.
+
+       * include/freetype/config/ftheader.h (FT_ADVANCES_H): New macro.
+       * include/freetype/freetype.h (FT_LOAD_ADVANCE_ONLY): New macro.
+
+       * include/freetype/internal/ftdriver.h (FT_Face_GetAdvancesFunc):
+       `flags' and `advances' are now of type `FT_UInt' and `FT_Fixed',
+       respectively.
+
+       * src/base/Jamfile (_sources), src/base/rules.mk (BASE_SRC): Add
+       ftadvanc.c.
+
+       * src/cff/cffdrivr.c (cff_get_advances): New function.
+       (cff_driver_class): Register it.
+
+       * src/cff/cffgload.c (cff_decoder_set_width_only): New function.
+       (cff_decoder_parse_charstrings): Handle `width_only'.
+       (cff_slot_load): Handle FT_LOAD_ADVANCE_ONLY.
+
+       * src/cff/cffgload.h (cff_decoder): New element `width_only'.
+       (cff_decoder_set_width_only): New declaration.
+
+       * src/truetype/ttdriver.c (tt_get_advances): New function.
+       (tt_driver_class): Register it.
+
+       * src/truetype/ttgload.c (Get_HMetrics, Get_VMetrics): Renamed to...
+       (TT_Get_HMetrics, TT_Get_VMetrics): This.
+       Update callers.
+       * src/truetype/ttgload.h: Declare them.
+
+       * src/type1/t1gload.h, src/type1/t1gload.c (T1_Get_Advances): New
+       function.
+       * src/type1/t1driver.c (t1_driver_class): Register T1_Get_Advances.
+
+
+       Add checks for minimum version of the `autotools' stuff.
+
+       * autogen.sh: Implement it.
+       (get_major_version, get_minor_version, get_patch_version,
+       compare_to_minimum_version, check_tool_version): New auxiliary
+       functions.
+
+       * README.CVS: Document it.
+
+2008-08-29  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/sfnt/sfobjs.c (sfnt_open_font): Use TTAG_OTTO defined in
+       ttags.h instead of FT_MAKE_TAG( 'O', 'T', 'T', 'O' ).
+
+2008-08-28  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (parse_encoding): Protect against infinite
+       loop.  This fixes Savannah bug #24150 (where a patch has been posted
+       too).
+
+2008-08-23  Werner Lemberg  <wl@gnu.org>
+
+       * src/type/t1afm.c (compare_kern_pairs), src/pxaux/afmparse.c
+       (afm_compare_kern_pairs): Fix comparison.  This fixes Savannah bug
+       #24119.
+
+2008-08-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftobjs.c (FT_Stream_New): Initialize *astream always,
+       even if passed library or arguments are invalid.  This fixes a bug
+       that an uninitialized stream is freed when an invalid library handle
+       is passed.  Originally proposed by Mike Fabian, 2008/08/18 on
+       freetype-devel.
+       (FT_Open_Face): Ditto (stream).
+       (load_face_in_embedded_rfork): Ditto (stream2).
+
+2008-08-18  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftmac.c: Add a fallback to guess the availability of the
+       `ResourceIndex' type.  It is used when built without configure
+       (e.g., a build with Jam).
+       * builds/mac/ftmac.c: Ditto.
+       * builds/unix/configure.raw: Set HAVE_TYPE_RESOURCE_INDEX to 1 or 0
+       explicitly, even if `ResourceIndex' is unavailable.
+
+2008-08-18  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/unix/configure.raw: In checking of Mac OS X features,
+       all-in-one header file `Carbon.h' is replaced by the minimum
+       header file `CoreServices.h', similar to current src/base/ftmac.c.
+
+2008-08-18  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/sfnt/ttcmap.c (tt_cmap2_validate): Skip the validation of
+       sub-header when its code_count is 0.  Many Japanese Dynalab fonts
+       include such an empty sub-header (code_count == 0, first_code == 0
+       delta == 0, but offset != 0) as the second sub-header in SJIS cmap.
+
+2008-08-04  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1tokens.h: Handle `ForceBold' keyword.  This fixes
+       Savannah bug #23995.
+
+       * src/cid/cidload.c (parse_expansion_factor): New callback function.
+       (cid_field_records): Use it for `ExpansionFactor'.
+       * src/cod/cidtoken.h: Handle `ForceBold' keyword.
+       Don't handle `ExpansionFactor'.
+
+2008-08-04  Bram Tassyns  <bramt@enfocus.be>
+
+       * src/cff/cffparse.c (cff_parse_fixed_scaled): Fix thinko which
+       resulted in incorrect scaling.  This fixes Savannah bug #23973.
+
+2008-08-04  Werner Lemberg  <wl@gnu.org>
+
+       Be more tolerant w.r.t. invalid entries in SFNT table directory.
+
+       * src/sfnt/ttload.c (check_table_dir): Ignore invalid entries and
+       adjust table count.
+       Add more trace messages.
+       (tt_face_load_font_dir): Updated.
+
+2008-07-30  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings): No longer
+       assume that the first argument on the stack is the bottom-most
+       element.  Two reasons:
+
+         o According to people from Adobe it is missing in the Type 2
+           specification that pushing of additional, superfluous arguments
+           on the stack is prohibited.
+
+         o Acroread in general handles fonts differently, namely by popping
+           the number of arguments needed for a particular operand (as a PS
+           interpreter would do).  In case of buggy fonts this causes a
+           different interpretation which of the elements on the stack are
+           superfluous and which not.
+
+       Since there are CFF subfonts (embedded in PDFs) which rely on
+       Acroread's behaviour, FreeType now does the same.
+
+2008-07-27  Werner Lemberg  <wl@gnu.org>
+
+       Add extra mappings for `Tcommaaccent' and `tcommaaccent'.  This
+       fixes Savannah bug #23940.
+
+       * src/psnames/psmodule.c (WGL_EXTRA_LIST_SIZE): Rename to...
+       (EXTRA_GLYPH_LIST_SIZE): This.
+       Increase by 2.
+       (ft_wgl_extra_unicodes): Rename to...
+       (ft_extra_glyph_unicodes): This.
+       Add two code values.
+       (ft_wgl_extra_glyph_names): Rename to...
+       (ft_extra_glyph_names): This.
+       Add two glyphs.
+       (ft_wgl_extra_glyph_name_offsets): Rename to...
+       (ft_extra_glyph_name_offsets): This.
+       Add two offsets.
+
+       (ps_check_wgl_name, ps_check_wgl_unicode): Rename to...
+       (ps_check_extra_glyph_name, ps_check_extra_glyph_unicode): This.
+       Updated.
+       (ps_unicodes_init): Updated.
+
+2008-07-26  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffgload.c (cff_decoder_prepare,
+       cff_decoder_parse_charstrings): Improve debug output.
+
+2008-07-22  Martin McBride  <mmcbride@emtex.com>
+
+       * src/sfnt/ttcmap.c (tt_cmap4_validate, tt_cmap4_char_map_linear,
+       tt_cmap4_char_map_binary): Handle fonts which treat the last segment
+       specially.  According to the specification, such fonts would be
+       invalid but acroread accepts them.
+
+2008-07-16  Jon Foster  <Jon.Foster@cabot.co.uk>
+
+       * src/pfr/pfrdrivr.c (pfr_get_advance): Fix off-by-one error.
+
+       * src/base/ftcalc.c (FT_MulFix): Fix portability issue.
+
+       * src/sfnt/ttpost.c (MAC_NAME) [!FT_CONFIG_OPTION_POSTSCRIPT_NAMES]:
+       Fix compiler warning.
+
+2008-07-16  Werner Lemberg  <wl@gnu.org>
+
+       Handle CID-keyed fonts wrapped in an SFNT (with cmaps) correctly.
+
+       * src/cff/cffload.c (cff_font_load): Pass `pure_cff'.
+       Invert sids table only if `pure_cff' is set.
+       * src/cff/cffload.h: Udpated.
+
+       * src/cff/cffobjs.c (cff_face_init): Updated.
+       Set FT_FACE_FLAG_CID_KEYED only if pure_cff is set.
+
+       * docs/CHANGES: Updated.
+
+2008-07-09  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttpload.c (tt_face_load_loca): Handle buggy fonts
+       where num_locations < num_glyphs.  Problem reported by Ding Li.
+
+2008-07-05  Werner Lemberg  <wl@gnu.org>
+
+       Since FreeType uses `$(value ...)', we now need GNU make 3.80 or
+       newer.  This fixes Savannah bug #23648.
+
+       * configure: zsh doesn't like ${1+"$@"}.
+       Update needed GNU make version.
+       * builds/toplevel.mk: Check for `$(eval ...)'.
+       * docs/INSTALL.GNU, docs/INSTALL.CROSS, docs/INSTALL.UNIX: Document
+       it.
+
+2008-07-04  Werner Lemberg  <wl@gnu.org>
+
+       * src/raster/ftraster.c (Draw_Sweep): If span is smaller than one
+       pixel, only check for dropouts if neither start nor end point lies
+       on a pixel center.  This fixes Savannah bug #23762.
+
+2008-06-29  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.3.7 released.
+       =========================
+
+
+       Tag sources with `VER-2-3-7'.
+
+       * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump
+       version number to 2.3.7.
+
+       * README, Jamfile (RefDoc), builds/win32/visualc/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj,
+       builds/win32/visualce/index.html,
+       builds/win32/visualce/freetype.dsp,
+       builds/win32/visualce/freetype.vcproj: s/2.3.6/2.3.7/, s/236/237/.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 7.
+
+       * builds/unix/configure.raw (version_info): Set to 9:18:3.
+
+       * docs/release: Updated.
+
+2008-06-28  Werner Lemberg  <wl@gnu.org>
+
+       * src/ftglyph.c (FT_Matrix_Multiply, FT_Matrix_Invert): Move to...
+       * src/ftcalc.c: Here.  This fixes Savannah bug #23729.
+
+2008-06-27  Werner Lemberg  <wl@gnu.org>
+
+       * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop,
+       Horizontal_Gray_Sweep_Drop): Test for intersections which
+       degenerate to a single point can be ignored; this has been confirmed
+       by Greg Hitchcock from Microsoft.  (This was commented out code.)
+
+2008-06-26  Werner Lemberg  <wl@gnu.org>
+
+       Improve navigation in API reference.
+
+       * src/tools/docmaker/tohtml.py (html_header_3): Renamed to...
+       (html_header_6): This.
+       (html_header_3, html_header_3i, html_header_4, html_header_5,
+       html_header_5t): New strings.
+       (toc_footer_start, toc_footer_end): New strings.
+       (HtmlFormatter::html_header): Updated.
+       (HtmlFormatter::html_index_header, HtmlFormatter::html_toc_header):
+       New strings.
+       (HtmlFormatter::index_enter): Use `html_index_header'.
+       (HtmlFormatter::index_exit): Print `html_footer'.
+       (HtmlFormatter::toc_enter): Use `html_toc_header'.
+       (HtmlFormatter::toc_exit): Print proper footer.
+
+       Convert ~ to non-breakable space.
+
+       * src/tools/docmaker/tohtml.py (make_html_para): Implement it.
+       Update header files accordingly.
+
+2008-06-24  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/unix/configure.raw: Check type `ResourceIndex' explicitly
+       and define HAVE_TYPE_RESOURCE_INDEX if it is defined.  Mac OS X 10.5
+       bundles 10.4u SDK with MAC_OS_X_VERSION_10_5 macro but without
+       ResourceIndex type definition.  The macro does not inform the type
+       availability.
+       * src/base/ftmac.c: More parentheses are inserted to clarify the
+       conditionals to disable legacy APIs in `10.5 and later' cases.  If
+       HAVE_TYPE_RESOURCE_INDEX is not defined, ResourceIndex is defined.
+
+2008-06-24  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttinterp.c (Ins_SCANTYPE): Don't check rendering
+       mode.
+
+       * src/raster/ftraster.c (Render_Glyph, Render_Gray_Glyph,
+       Draw_Sweep): No-dropout mode is value 2, not value 0.
+       (Draw_Sweep): Really skip dropout handling for no-dropout mode.
+
+2008-06-24  Werner Lemberg  <wl@gnu.org>
+
+       * src/psaux/psobjs.c (t1_builder_close_contour): Don't add contour
+       if it consists of one point only.  Based on a patch from Savannah
+       bug #23683 (from John Tytgat).
+
+2008-06-22  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgload.c (TT_Load_Glyph): Protect bytecode stuff
+       with IS_HINTED.
+
+       * docs/CHANGES: Updated.
+
+2008-06-22  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/unix/configure.raw: If CFLAGS has `-isysroot XXX' option
+       but LDFLAGS does not, import it to LDFLAGS.  The option is used to
+       specify non-default SDK on Mac OS X (e.g., universal binary SDK for
+       Mac OS X 10.4 on PowerPC platform).  Although Apple TechNote 2137
+       recommends to add the option only to CFLAGS, LDFLAGS should include
+       it because libfreetype.la is built with -no-undefined.  This fixes a
+       bug reported by Ryan Schmidt in MacPorts,
+       http://trac.macports.org/ticket/15331.
+
+2008-06-21  Werner Lemberg  <wl@gnu.org>
+
+       Enable access to the various dropout rules of the B&W rasterizer.
+       Pass dropout rules from the TT bytecode interpreter to the
+       rasterizer.
+
+       * include/freetype/ftimage.h (FT_OUTLINE_SMART_DROPOUTS,
+       FT_OUTLINE_EXCLUDE_STUBS): New flags for FT_Outline.
+
+       * src/raster/ftraster.c (Vertical_Sweep_Drop, Horizontal_Sweep_Drop,
+       Horizontal_Gray_Sweep_Drop): Use same mode numbers as given in the
+       OpenType specification.
+       Fix mode 4 computation.
+       (Render_Glyph, Render_Gray_Glyph): Handle new outline flags.
+
+       * src/truetype/ttgload.c (TT_Load_Glyph) Convert scan conversion
+       mode to FT_OUTLINE_XXX flags.
+
+       * src/truetype/ttinterp.c (Ins_SCANCTRL): Enable ppem check.
+
+2008-06-19  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffobjs.c (cff_face_init): Compute final
+       `dict->units_per_em' value before assigning it to
+       `cffface->units_per_EM'.  Otherwise, CFFs without subfonts are
+       scaled incorrectly if the font matrix is non-standard.  This fixes
+       Savannah bug #23630.
+
+       * docs/CHANGES: Updated.
+
+2008-06-19  Werner Lemberg  <wl@gnu.org>
+
+       * src/type/t1objs.c (T1_Face_Init): Slightly improve algorithm fix
+       from 2008-06-19.
+
+2008-06-18  Werner Lemberg  <wl@gnu.org>
+
+       * src/type/t1objs.c (T1_Face_Init): Fix change from 2008-03-21.
+       Reported by Peter Weilbacher <mozilla@weilbacher.org>.
+
+       * docs/CHANGES: Updated.
+
+2008-06-15  George Williams  <gww@silcom.com>
+
+       * src/otvalid/otvgpos.c (otv_MarkBasePos_validate): Set
+       `valid->extra2' to 1.  This is undocumented in the OpenType 1.5
+       specification.
+
+2008-06-15  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftcalc.c (FT_MulFix) <asm>: Protect registers correctly
+       from clobbering.  Patch from Savannah bug report #23556.
+
+       * docs/CHANGES: Document it.
+
+2008-06-10  Werner Lemberg  <wl@gnu.org>
+
+       * autogen.sh: Add option `--install' to libtoolize.
+
+2008-06-10  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.3.6 released.
+       =========================
+
+
+       Tag sources with `VER-2-3-6'.
+
+       * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump
+       version number to 2.3.6.
+
+       * README, Jamfile (RefDoc), builds/win32/visualc/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj,
+       builds/win32/visualce/index.html,
+       builds/win32/visualce/freetype.dsp,
+       builds/win32/visualce/freetype.vcproj: s/2.3.5/2.3.6/, s/235/236/.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 6.
+
+       * builds/unix/configure.raw (version_info): Set to 9:17:3.
+
+
+       * include/freetype/internal/psaux.h (T1_BuilderRec): Remove `scale_x'
+       and `scale_y'.
+       * src/cff/cffgload.h (CFF_Builder): Remove `scale_x' and `scale_y'.
+
+
+       * src/cff/cffparse.c: Include FT_INTERNAL_DEBUG_H.
+       * src/cff/cffobjs.h: Include FT_INTERNAL_POSTSCRIPT_HINTS_H.
+
+2008-06-10  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftobjs.c (open_face): Check `clazz->init_face' and
+       `clazz->done_face'.
+
+2008-06-09  VaDiM  <s_sliva@rambler.ru>
+
+       Support debugging on WinCE.  From Savannah patch #6536; this fixes
+       bug #23497.
+
+       * builds/win32/ftdebug.c (OutputDebugStringEx): New function/macro
+       as a replacement for OutputDebugStringA (which WinCE doesn't have).
+       Update all callers.
+       (ft_debug_init) [_WIN32_CE]: WinCE apparently doesn't have
+       environment variables.
+
+2008-06-09  Werner Lemberg  <wl@gnu.org>
+
+       * README.CVS: Updated.
+
+       * builds/unix/configure.raw, builds/unix/freetype-config.in: Updated
+       for newer versions of autoconf and friends.
+
+2008-06-08  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1parse.h (T1_ParserRec): Make `base_len' and
+       `private_len' unsigned.
+
+       * src/type1/t1parse.c (read_pfb_tag): Make `asize' unsigned and read
+       it as such.
+       (T1_New_Parser, T1_Get_Private_Dict): Make `size' unsigned.
+
+
+       * src/base/ftstream.c (FT_Stream_Skip): Reject negative values.
+
+
+       * src/type1/t1load.c (parse_blend_design_positions): Check `n_axis'
+       for sane value.
+       Fix typo.
+
+
+       * src/psaux/psobjs.c (ps_table_add): Check `idx' correctly.
+
+
+       * src/truetype/ttinterp (Ins_SHC): Use BOUNDS() to check
+       `last_point'.
+
+
+       * src/sfnt/ttload.c (tt_face_load_max_profile): Limit
+       `maxTwilightPoints'.
+
+2008-06-06  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttinterp.c (Ins_IP): Handle case `org_dist == 0'
+       correctly.  This fixes glyphs `t' and `h' of Arial Narrow at 12ppem.
+
+2008-06-03  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/ftcache.h (FTC_FaceID): Change type back to
+       FT_Pointer.  Reported by Ian Britten <britten@caris.com>.
+
+2008-06-02  Werner Lemberg  <wl@gnu.org>
+
+       Emit header info for defined FreeType objects in reference.
+
+       * src/tools/docmaker/content.py (re_header_macro): New regexp.
+       (ContentProcessor::__init__): Initialize new dictionary `headers'.
+       (DocBlock::__init__): Collect macro header definitions.
+
+       * src/tools/docmaker/tohtml.py (header_location_header,
+       header_location_footer): New strings.
+       (HtmlFormatter::__init__): Pass `headers' dictionary.
+       (HtmlFormatter::print_html_field): Don't emit paragraph tags.
+       (HtmlFormatter::print_html_field_list): Emit empty paragraph.
+       (HtmlFormatter::block_enter): Emit header info.
+
+2008-06-01  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/config/ftheader.h (FT_UNPATENTED_HINTING_H,
+       FT_INCREMENTAL_H): Added.
+
+2008-05-28  Werner Lemberg  <wl@gnu.org>
+
+       * src/tools/docmaker/sources.py (SourceBlock::__init__): While
+       looking for markup tags, return immediately as soon a single one is
+       found.
+
+2008-05-28  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttinterp.c (Ins_MD): The MD instruction also uses
+       original, unscaled input values.  Confirmed by Greg Hitchcock from
+       Microsoft.
+
+2008-05-27  Werner Lemberg  <wl@gnu.org>
+
+       * src/tools/docmaker/tohtml.py (block_footer_start,
+       block_footer_middle): Beautify output.
+
+2008-05-25  Werner Lemberg  <wl@gnu.org>
+
+       * src/raster/ftraster.c (fc_black_render): Return 0 when we are
+       trying to render into a zero-width/height bitmap, not an error code.
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Move initialization
+       of the graphics state for subglyphs to...
+       (TT_Hint_Glyph): This function.
+       Hinting instructions for a composite glyph apparently refer to the
+       just hinted subglyphs, not the unhinted, unscaled outline.  This
+       seems to fix Savannah bugs #20973 and (at least partially) #23310.
+
+2008-05-20  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftmac.c (FT_New_Face_From_Suitcase): Check if valid
+       `aface' is returned by FT_New_Face_From_FOND().  The patch was
+       proposed by an anonymous reporter of Savannah bug #23204.
+
+2008-05-18  Werner Lemberg  <wl@gnu.org>
+
+       * src/pshinter/pshalgo.c (ps_hints_apply): Reset scale values after
+       correction for pixel boundary.  Without this patch, the effect can
+       be cumulative under certain circumstances, making glyphs taller and
+       taller after each call.  This fixes Savannah bug #19976.
+
+2008-05-18  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftdebug.c (FT_Message, FT_Panic): Send output to stderr.
+       This fixes Savannah bug #23280.
+
+       * docs/CHANGES: Updated.
+
+2008-05-18  David Turner  <david@freetype.org>
+
+       * src/psnames/psmodule.c (ft_wgl_extra_unicodes,
+       ft_wgl_extra_glyph_names, ft_wgl_extra_glyph_name_offsets,
+       ps_check_wgl_name, ps_check_wgl_unicode): Use `static' to make
+       declarations non-global.
+
+       * src/type1/t1load.c: Add missing comment.
+
+2008-05-17  Sam Hocevar  <samh>
+
+       * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Handle zero-contour
+       glyphs correctly.  Patch from Savannah bug #23277.
+
+2008-05-16  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2008-05-16  Sergey Tolstov  <stolstov@esri.com>
+
+       Improve support for WGL4 encoded fonts.
+
+       * src/psnames/psmodule.c (WGL_EXTRA_LIST_SIZE): New macro.
+       (ft_wgl_extra_unicodes, ft_wgl_extra_glyph_names,
+       ft_wgl_extra_glyph_name_offsets): New arrays.
+       (ps_check_wgl_name, ps_check_wgl_unicode): New functions.
+       (ps_unicodes_init): Use them to add additional Unicode mappings.
+
+2008-05-15  Werner Lemberg  <wl@gnu.org>
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings)
+       <op_closepath>: `closepath' without a path is a no-op, not an error
+       (cf. the PS reference manual).
+
+       Reported by Martin McBride.
+
+2008-05-15  Werner Lemberg  <wl@gnu.org>
+
+       * builds/toplevel.mk (CONFIG_GUESS, CONFIG_SUB): Updated.
+
+2008-05-15  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (parse_subrs): Accept fonts with a subrs array
+       which contains a single but empty entry.  This is technically
+       invalid (since it must end with `return'), but...
+
+       Reported by Martin McBride.
+
+2008-05-14  Werner Lemberg  <wl@gnu.org>
+
+       Finish fix of scaling bug of CID-keyed CFF subfonts.
+
+       * include/freetype/internal/ftcalc.h, src/base/ftcalc.c
+       (FT_Matrix_Multiply_Scaled, FT_Vector_Transform_Scaled): New
+       functions.
+
+       * src/cff/cffobjs.h (CFF_Internal): New struct.  It is used to
+       provide global hinting data for both the top-font and all subfonts
+       (with proper scaling).
+
+       * src/cff/cffobjs.c (cff_make_private_dict): New function, using
+       code from `cff_size_init'.
+       (cff_size_init, cff_size_done, cff_size_select, cff_size_request):
+       Use CFF_Internal and handle subfonts.
+       (cff_face_init): Handle top-dict and subfont matrices correctly;
+       apply some heuristic in case of unlikely matrix concatenation
+       results.  This has been discussed with people from Adobe (thanks
+       goes mainly to David Lemon) who confirm that the CFF specs are fuzzy
+       and not correct.
+
+       * src/cff/cffgload.h (cff_decoder_prepare): Add `size' argument.
+
+       * src/cff/cffgload.c (cff_builder_init): Updated.
+       (cff_decoder_prepare): Handle hints globals for subfonts.
+       Update all callers.
+       (cff_slot_load): Handling scaling of subfonts properly.
+
+       * src/cff/cffparse.c (cff_parse_fixed_dynamic): New function.
+       (cff_parse_font_matrix): Use it.
+
+       * src/cff/cfftypes.h (CFF_FontDictRec): Make `units_per_em'
+       FT_ULong.
+
+       * docs/CHANGES: Document it.
+
+2008-05-13  Werner Lemberg  <wl@gnu.org>
+
+       * src/winfonts/winfnt.c (fnt_face_get_dll_font, FNT_Face_Init):
+       Handle case `face_index < 0'.
+       * docs/CHANGES: Document it.
+
+2008-05-04  Werner Lemberg  <wl@gnu.org>
+
+       First steps to fix the scaling bug of CID-keyed CFF subfonts,
+       reported by Ding Li on 2008/03/28 on freetype-devel.
+
+       * src/base/cff/cffparse.c (power_tens): New array.
+       (cff_parse_real): Rewritten to introduce a fourth parameter which
+       returns the `scaling' of the real number so that we have no
+       precision loss.  This is not used yet.
+       Update all callers.
+       (cff_parse_fixed_thousand): Replace with...
+       (cff_parse_fixed_scaled): This function.  Update all callers.
+
+2008-05-03  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Call the auto-hinter without
+       transformation since it recursively calls FT_Load_Glyph.  This fixes
+       Savannah bug #23143.
+
+2008-04-26  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/psaux.h (T1_BuilderRec): Mark `scale_x'
+       and `scale_y' as obsolete since they aren't used.
+       * src/psaux/psobjs.c (t1_builder_init): Updated.
+
+       * src/cff/cffgload.h (CFF_Builder): Mark `scale_x' and `scale_y' as
+       obsolete since they aren't used.
+       * src/cff/cffgload.c (cff_builder_init): Updated.
+
+2008-04-14  Werner Lemberg  <wl@gnu.org>
+
+       * src/pcf/pcfdrivr.c (PCF_Face_Init): Protect call to
+       `FT_Stream_OpenLZW' with `FT_CONFIG_OPTION_USE_LZ'.  From Savannah
+       bug #22909.
+
+2008-04-13  Werner Lemberg  <wl@gnu.org>
+
+       * src/psaux/psconv.c (PS_Conv_ToFixed): Increase precision if
+       integer part is zero.
+
+2008-04-01  Werner Lemberg  <wl@gnu.org>
+
+       Fix compilation with g++ 4.1 (with both `single' and `multi'
+       targets).
+
+       * src/base/ftobjs.c (FT_Open_Face): Don't define a variable in block
+       which is crossed by a `goto'.
+
+       * src/otvalid/otvalid.h (otv_MATH_validate): Add prototype.
+
+2008-03-31  Werner Lemberg  <wl@gnu.org>
+
+       Fix support for subsetted CID-keyed CFFs.
+
+       * include/freetype/freetype.h (FT_FACE_FLAG_CID_KEYED,
+       FT_IS_CID_KEYED): New macros.
+
+       * src/cff/cffobjs.c (cff_face_init): Set number of glyphs to the
+       maximum CID value in CID-keyed CFFs.
+       Handle FT_FACE_FLAG_CID_KEYED flag.
+
+       * docs/CHANGES: Document it.
+
+
+       Fix CFF font matrix calculation and improve precision.
+
+       * src/cff/cffparse.c (cff_parse_real): Increase precision if integer
+       part is zero.
+       (cff_parse_font_matrix): Simplify computation of `units_per_em';
+       this prevents overflow also.
+
+
+       Support FT_Get_CID_Registry_Ordering_Supplement for PS CID fonts.
+
+       * src/cid/cidriver.c: Include FT_SERVICE_CID_H.
+       (cid_get_ros): New function.
+       (cid_service_cid_info): New service structure.
+       (cid_services): Register it.
+
+2008-03-23  Werner Lemberg  <wl@gnu.org>
+
+       Adjustments for Visual C++ 8.0, as reported by Rainer Deyke.
+
+       * builds/compiler/visualc.mk (CFLAGS): Remove /W5.
+       (ANSIFLAGS): Add _CRT_SECURE_NO_DEPRECATE.
+
+2008-03-21  Laurence Darby  <ldarby>
+
+       * src/type1/t1objs.c (T1_Face_Init): Use `/Weight'.  Patch from
+       Savannah bug #22675.
+
+2008-03-13  Derek Clegg  <dclegg@apple.com>
+
+       * src/truetype/ttgxvar.c (TT_Get_MM_Var): Fix named style loop.
+       Patch from Savannah bug #22541.
+
+2008-03-03  Masatoshi Kimura  <VYV03354@nifty.ne.jp>
+
+       * src/sfnt/ttcmap.c (tt_cmap14_char_map_nondef_binary,
+       tt_cmap14_find_variant): Return correct value.
+       (tt_cmap14_variant_chars): Fix check for `di'.
+
+2008-02-29  Wermer Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2008-02-29  Wolf
+
+       Add build support for symbian platform.  From Savannah bug #22440.
+
+       * builds/symbian/*: New files.
+
+2008-02-21  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftmac.c (parse_fond): Fix a bug of PostScript font name
+       synthesis.  For any face of a specified FOND, always the name for
+       the first face was used.  Except of a FOND that refers multiple
+       Type1 font files, wrong synthesized font names are not used at all,
+       so this is an invisible bug.  A few limit checks are added too.
+
+       * builds/mac/ftmac.c: Ditto.
+
+2008-02-21  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/unix/configure.raw: Split compiler option to link Carbon
+       frameworks to one option for CoreServices framework and another
+       option for ApplicationServices framework.  The split options can be
+       managed by GNU libtool to avoid unrequired duplication when FreeType
+       is linked with other applications.  Suggested by Daniel Macks,
+       Savannah bug #22366.
+
+2008-02-18  Victor Stinner  <victor.stinner@haypocalc.com>
+
+       * src/truetype/ttinterp.c (Ins_IUP): Check number of points.  Fix
+       from Savannah bug #22356.
+
+2008-02-17  Jonathan Blow  <jon@number-none.com>
+
+       * src/autofit/afloader.c (af_loader_load_g, af_loader_load_glyph):
+       Check for valid callback pointers.
+
+2008-02-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftmac.c (FT_New_Face_From_SFNT): Check the sfnt resource
+       handle by its value instead of ResError(), fix provided by Deron
+       Kazmaier.  According to the Resource Manager Reference,
+       GetResource(), Get1Resource(), GetNamedResource(),
+       Get1NamedResource() and RGetResource() set noErr but return NULL
+       handle when they can not find the requested resource.  These
+       functions never return undefined values, so it is sufficient to
+       check if the handle is not NULL.
+
+       * builds/mac/ftmac.c (FT_New_Face_From_SFNT): Ditto.
+
+2008-02-14  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftbase.c: <ftmac.c> is replaced by "ftmac.c" as other
+       inclusion styles.  Now it always includes src/base/ftmac.c;
+       builds/mac/ftmac.c is never included in any configuration.
+
+       * builds/unix/configure.raw: Print warning if configure is executed
+       with options to specify Carbon functionalities explicitly.
+
+       * docs/INSTALL.MAC: Note that legacy builds/mac/ftmac.c is not
+       included automatically and manual replacement is required.
+
+2008-02-11  Werner Lemberg  <wl@gnu.org>
+
+       * builds/modules.mk (CLOSE_MODULE, REMOVE_MODULE), builds/detect.mk
+       (dos_setup), builds/freetype.mk (clean_project_dos,
+       distclean_project_dos): Don't use \ but $(SEP).  Reported by Duncan
+       Murdoch.
+
+2008-01-18  Sylvain Pasche  <sylvain.pasche@gmail.com>
+
+       * src/base/ftlcdfil.c (_ft_lcd_filter_legacy): Updated comment to
+       mention intra-pixel algorithm.
+
+       * include/freetype/freetype.h (FT_Render_Mode): Mention that
+       FT_Library_SetLcdFilter can be used to reduce fringes.
+
+2008-01-16  Werner Lemberg  <wl@gnu.org>
+
+       * src/raster/ftraster.c (ft_black_render): Check `outline' before
+       using it.  Reported by Allan Yang.
+
+2008-01-12  Werner Lemberg  <wl@gnu.org>
+
+       * src/raster/ftraster.c (FT_CONFIG_OPTION_5_GRAY_LEVELS): Remove.
+
+2008-01-12  Allan Yang, Jian Hua - SH  <Allan.Yang@fmc.fujitsu.com>
+
+       * src/raster/ftraster.c (ft_black_init)
+       [FT_RASTER_OPTION_ANTI_ALIASING]: Fix compilation.
+
+2008-01-10  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Handle the case
+       where the number of contours in a simple glyph is zero (and which
+       does contain an entry in the `glyf' table).  This fixes Savannah bug
+       #21990.
+
+2008-01-04  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Formatting suggested by Sean McBride.
+
+       * builds/mac/ftmac.c: Formatting (tab expanded).
+       * src/autofit/afindic.c: Ditto.
+       * src/base/ftcid.c: Ditto.
+       * src/base/ftmac.c: Ditto.
+
+2007-12-30  Werner Lemberg  <wl@gnu.org>
+
+       * src/smooth/ftgrays.c (gray_raster_render): Check `outline'
+       correctly.
+
+2007-12-21  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Improvement of POSIX resource-fork accessor to load unsorted
+       references in a resource.  In HelveLTMM (resource-fork PostScript
+       Type1 font bundled with Mac OS X since 10.3.x), the appearance order
+       of PFB chunks is not sorted; sorting the chunks by reference IDs is
+       required.
+
+       * include/freetype/internal/ftrfork.h (FT_RFork_Ref): New structure
+       type to store a pair of reference ID and offset to the chunk.
+
+       * src/base/ftrfork.c (ft_raccess_sort_ref_by_id): New function to
+       sort FT_RFork_Ref by their reference IDs.
+
+       (FT_Raccess_Get_DataOffsets): Returns an array of offsets that is
+       sorted by reference ID.
+
+2007-12-14  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffparse.c (cff_parse_real): Don't apply `power_ten'
+       division too early; otherwise the most significant digit(s) of the
+       final result are lost as the value is truncated to an integer.  This
+       fixes Savannah bug #21794 (where the patch has been posted too).
+
+2007-12-06  Fix  <4d876b82@gmail.com>
+
+       Pass options from one configure script to another as-is (not
+       expanded).  This is needed for options like
+       --includedir='${prefix}/include'.
+
+       * builds/unix/detect.mk, configure: Prevent argument expansion in
+       call to the (real) `configure' script.
+
+2007-12-06  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Fix compilation if
+       TT_USE_BYTECODE_INTERPRETER isn't defined.
+
+2007-12-06  Werner Lemberg  <wl@gnu.org>
+
+       There exist CFFs which contain opcodes for the Type 1 operators
+       `hsbw' and `closepath' which are both invalid in Type 2 charstrings.
+       However, it doesn't harm to support them.
+
+       * src/cff/cffgload.c (CFF_Operator): Add `cff_op_hsbw' and
+       `cff_op_closepath.'
+       (cff_argument_counts): Ditto.
+
+       (cff_decoder_parse_charstrings): Handle Type 1 opcodes 9 (closepath)
+       and 13 (hsbw) which are invalid in Type 2 charstrings.
+
+2007-12-06  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftrfork.c (raccess_guess_darwin_newvfs): New function to
+       support new pathname syntax `..namedfork/rsrc' to access a resource
+       fork on Mac OS X.  The legacy syntax `/rsrc' does not work on
+       case-sensitive HFS+.
+       (raccess_guess_darwin_hfsplus): Fix a bug in the calculation of
+       buffer size to store a pathname.
+       * include/freetype/internal/ftrfork.h: Increment the number of
+       resource fork guessing rule.
+
+2007-12-06  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/unix/configure.raw: Improve the compile tests to search
+       Carbon functions.
+       * builds/mac/ftmac.c: Import fixes for Carbon incompatibilities
+       proposed by Sean McBride from src/base/ftmac.c (see 2007-11-16).
+
+2007-12-06  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       The documents and comments for Mac OS X are improved by Sean
+       McBride.
+
+       * src/base/ftmac.c: Fix a comment.
+       * include/freetype/ftmac.h: Ditto.
+       * docs/INSTALL.MAC: Improve English and add comment on lowest
+       system version specified by MACOSX_DEPLOYMENT_TARGET.
+
+2007-12-04  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffload.c (cff_subfont_load): Don't use logical OR to
+       concatenate error codes.
+       * src/sfnt/ttsbit.c (Load_SBit_Range): Ditto.
+
+2007-12-04  Graham Asher  <graham.asher@btinternet.com>
+
+       * src/truetype/ttobjs.c (tt_face_init): Don't use logical OR to
+       concatenate error codes.
+
+2007-12-04  Sean McBride  <sean@rogue-research.com>
+
+       * src/pfr/pfrgload.c (pfr_glyph_load_compound): Remove compiler
+       warning.
+
+2007-11-20  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Fix MacOS legacy font support by Masatake Yamato on Mac OS X.  It is
+       not working since 2.3.5.  In FT_Open_New(), if FT_New_Stream()
+       cannot mmap() the specified file and cannot seek to head of the
+       specified file, it returns NULL stream and FT_Open_New() returns the
+       error immediately.  On MacOS, most legacy MacOS fonts fall into such
+       a scenario because their data forks are zero-sized and cannot be
+       sought.  To proceed to guessing of resource fork fonts, the
+       functions for legacy MacOS font must properly handle the NULL stream
+       returned by FT_New_Stream().
+
+       * src/base/ftobjs.c (IsMacBinary): Return error
+       FT_Err_Invalid_Stream_Operation immediately when NULL stream is
+       passed.
+       (FT_Open_Face): Even when FT_New_Stream() returns an error, proceed
+       to fallback.  Originally, legacy MacOS font is tested in the cases
+       of FT_Err_Invalid_Stream_Operation (occurs when data fork is empty)
+       or FT_Err_Unknown_File_Format (occurs when AppleSingle header or
+       .dfont header is combined).  Now the case of
+       FT_Err_Cannot_Open_Stream is included.
+
+       * src/base/ftrfork.c (FT_Raccess_Guess): When passed stream is NULL,
+       skip FT_Stream_Seek(), which seeks to the head of stream, and
+       proceed to unit testing of raccess_guess_XXX().  FT_Stream_Seek()
+       for a NULL stream causes a Bus error on Mac OS X.
+       (raccess_guess_apple_double): Return FT_Err_Cannot_Open_Stream
+       immediately if passed stream is NULL.
+       (raccess_guess_apple_single): Ditto.
+
+2007-11-16  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Fix for Carbon incompatibilities since Mac OS X 10.5,
+       proposed by Sean McBride.
+
+       * doc/INSTALL.MAC: Comment on MACOSX_DEPLOYMENT_TARGET.
+
+       * include/freetype/ftmac.h: Deprecate FT_New_Face_From_FOND and
+       FT_GetFilePath_From_Mac_ATS_Name.  Since Mac OS X 10.5, calling
+       Carbon functions from a forked process is classified as unsafe
+       by Apple.  All Carbon-dependent functions should be deprecated.
+
+       * src/base/ftmac.c: Use essential header files
+       <CoreServices/CoreServices.h> and
+       <ApplicationServices/ApplicationServices.h> instead of
+       all-in-one header file <Carbon/Carbon.h>.
+
+       Include <sys/syslimits.h> and replace HFS_MAXPATHLEN by Apple
+       genuine macro PATH_MAX.
+
+       Add fallback macro for kATSOptionFlagsUnRestrictedScope which
+       is not found in Mac OS X 10.0.
+
+       Multi-character constants ('POST', 'sfnt' etc) are replaced by
+       64bit constants calculated by FT_MAKE_TAG() macro.
+
+       For the index in the segment of resource fork, new portable
+       type ResourceIndex is introduced for better compatibility.
+       This type is since Mac OS X 10.5, so it is defined as short
+       when built on older platforms.
+
+       (FT_ATSFontGetFileReference): If build target is only the systems
+       10.5 and newer, it calls Apple genuine ATSFontGetFileReference().
+
+       (FT_GetFile_From_Mac_ATS_Name): Return an error if system is 10.5
+       and newer or 64bit platform, because legacy type FSSpec type is
+       removed completely.
+
+       (FT_New_Face_From_FSSpec): Ditto.
+
+2007-11-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfobjs.c (sfnt_done_face): Check `sfnt' everywhere.  This
+       fixes Savannah bug #21485.
+
+2007-10-29  Daniel Svoboda  <dasvo@planeta@cz>
+
+       * src/winfonts/winfnt.c (FNT_Face_Init): Check first that the driver
+       can handle the font at all, then check `face_index'.  Otherwise, the
+       driver might return the wrong error code.  This fixes Savannah bug
+       #21468.
+
+2007-10-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Support bit 9 and prepare
+       support for bit 8 of the `fsSelection' field in the `OS/2' table.
+       MS is already using this; hopefully, this becomes part of OpenType
+       1.5.
+       Prepare also support for `name' IDs 21 (WWS_FAMILY) and 22
+       (WWS_SUBFAMILY).
+
+2007-10-20  Werner Lemberg  <wl@gnu.org>
+
+       * src/tools/docmaker/tohtml.py (html_header_2): Fix typo.
+       Add `td.left' element to CSS.
+       (toc_section_enter): Use it.
+
+2007-10-18  David Turner  <david@freetype.org>
+
+       * include/freetype/freetype.h, src/base/ftobjs.c: Rename API
+       functions related to cmap type 14 support to the
+       `FT_Object_ActionName' scheme:
+
+         FT_Get_Char_Variant_index     -> FT_Face_GetCharVariantIndex
+         FT_Get_Char_Variant_IsDefault -> FT_Face_GetCharVariantIsDefault
+         FT_Get_Variant_Selectors      -> FT_Face_GetVariantSelectors
+         FT_Get_Variants_Of_Char       -> FT_Face_GetVariantsOfChar
+         FT_Get_Chars_Of_Variant       -> FT_Face_GetCharsOfVariant
+
+       Update documentation accordingly.
+
+       * src/sfnt/ttcmap.c: Stronger cmap 14 validation.
+       Make the code a little more consistent with FreeType coding
+       conventions and modify the cmap14 functions that returned a newly
+       allocated array to use a persistent vector from the TT_CMap14 object
+       instead.
+
+       (TT_CMap14Rec): Provide array and auxiliary data for result.
+       (tt_cmap14_done, tt_cmap14_ensure): New functions.
+
+       (tt_cmap14_init, tt_cmap14_validate, tt_cmap14_char_map_def_binary,
+       tt_cmap14_char_map_nondef_binary, tt_cmap14_find_variant,
+       tt_cmap14_char_var_index, tt_cmap14_variants,
+       tt_cmap14_char_variants, tt_cmap14_def_char_count,
+       tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars,
+       tt_cmap14_variant_chars, tt_cmap14_class_rec): Updated and improved.
+
+2007-10-15  George Williams  <gww@silcom.com>
+
+       Add support for cmap type 14.
+
+       * devel/ftoption.h, include/freetype/config/ftoption.h
+       (TT_CONFIG_CMAP_FORMAT_14): New macro.
+
+       * include/freetype/internal/ftobjs.h (FT_CMap_CharVarIndexFunc,
+       FT_CMap_CharVarIsDefaultFunc, FT_CMap_VariantListFunc,
+       FT_CMap_CharVariantListFunc, FT_CMap_VariantCharListFunc): New
+       support function prototypes.
+       (FT_CMap_ClassRec): Add them.
+       Update all users.
+
+       * include/freetype/ttnameid.h (TT_APPLE_ID_VARIANT_SELECTOR): New
+       macro.
+
+       * include/freetype/freetype.h (FT_Get_Char_Variant_Index,
+       FT_Get_Char_Variant_IsDefault, FT_Get_Variant_Selectors,
+       FT_Get_Variants_Of_Char, FT_Get_Chars_Of_Variant): New API
+       functions.
+
+       * src/base/ftobjs.c (find_variant_selector_charmap): New auxiliary
+       function.
+       (FT_Set_Charmap): Disallow cmaps of type 14.
+       (FT_Get_Char_Variant_Index, FT_Get_Char_Variant_IsDefault,
+       FT_Get_Variant_Selectors, FT_Get_Variants_Of_Char,
+       FT_Get_Chars_Of_Variant): New API functions.
+
+       * src/sfnt/ttcmap.c (TT_PEEK_UINT24, TT_NEXT_UINT24): New macros.
+
+       (TT_CMap14Rec, tt_cmap14_init, tt_cmap14_validate,
+       tt_cmap14_char_index, tt_cmap14_char_next, tt_cmap14_get_info,
+       tt_cmap14_char_map_def_binary, tt_cmap14_char_map_nondef_binary,
+       tt_cmap14_find_variant, tt_cmap14_char_var_index,
+       tt_cmap14_char_var_isdefault, tt_cmap14_variants,
+       tt_cmap14_char_variants, tt_cmap14_def_char_count,
+       tt_cmap14_get_def_chars, tt_cmap14_get_nondef_chars,
+       tt_cmap14_variant_chars, tt_cmap14_class_rec): New functions and
+       structures for cmap 14 support.
+       (tt_cmap_classes): Register tt_cmap14_class_rec.
+       (tt_face_build_cmaps): One more error message.
+
+       * docs/CHANGES: Mention cmap 14 support.
+
+2007-10-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftobjs.c (find_unicode_charmap): If search for a UCS-4
+       charmap fails, do the loop again while searching a UCS-2 charmap.
+       This favours MS charmaps over Apple ones.
+
+2007-08-29  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftmac.c: Introduction of abstract `short' data types,
+       ResFileRefNum and ResID.  These types were introduced for Copland,
+       then backported to MPW.  The variables exchanged with FileManager
+       QuickDraw frameworks are redefined by these data types.  Patch was
+       proposed by Sean McBride.
+       * builds/mac/ftmac.c: Ditto.
+
+2007-08-18  Werner Lemberg  <wl@gnu.org>
+
+       * src/otvalid/otvcmmn.c (otv_x_y_ux_sy): Skip context glyphs.  Found
+       by Imran Yousaf.  Fixes Savannah bug #20773.
+
+       (otv_Lookup_validate): Correct handling of LookupType.  Found by
+       Imran Yousaf.  Fixes Savannah bug #20782.
+
+2007-08-17  George Williams  <gww@silcom.com>
+
+       * src/otvalid/otvgsub.c (otv_SingleSubst_validate): Fix handling of
+       SingleSubstFormat1.
+
+2007-08-11  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/unix/configure.raw: Fix a bug which sets CC_BUILD by
+       ${build-gcc} (unchecked) instead of by ${build}-gcc (checked).
+       Found by Ryan Hill.
+
+2007-08-11  George Williams  <gww@silcom.com>
+
+       * src/otvalid/otvcommn.c, src/otvalid/otvcommn.h
+       (otv_Coverage_validate): Add fourth argument to pass an expected
+       count value.  Update all users.
+       Check glyph IDs.
+       (otv_ClassDef_validate): Check `StartGlyph'.
+
+       * src/otvalid/otvgsub.c (otv_SingleSubst_validate): More glyph ID
+       checks.
+
+       * src/otvalid/otvmath.c (otv_MathConstants_validate): There are only
+       56 constants.
+       (otv_GlyphAssembly_validate, otv_MathGlyphConstruction_validate):
+       Check glyph IDs.
+
+2007-08-08  Werner Lemberg  <wl@gnu.org>
+
+       * src/otvalid/otvbase.c, src/otvalid/otvcommn.c,
+       src/otvalid/otvgdef.c, src/otvalid/otvgpos.c, src/otvalid/otvgsub.c,
+       src/otvalid/otvjstf.c: s/FT_INVALID_DATA/FT_INVALID_FORMAT/ where
+       appropriate.  Reported by George.
+
+       * include/freetype/internal/fttrace.h: Define `trace_otvmath'.
+
+       * src/otvalid/rules.mk (OTV_DRV_SRC): Add otvmath.c.
+
+       * docs/CHANGES: Updated.
+
+2007-08-08  George Williams  <gww@silcom.com>
+
+       Add `MATH' validating support to otvalid module.
+
+       * include/freetype/tttags.h (TTAG_MATH): New macro.
+       * include/freetype/ftotval.h (FT_VALIDATE_MATH): New macro.
+       (FT_VALIDATE_OT): Updated.
+
+       * src/otvalid/otmath.c: New file.
+
+       * src/otvalid/otvalid.c: Include otvmath.c.
+       * src/otvalid/otvmod.c (otv_validate): Handle `MATH' table.
+
+2007-08-04  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/configure.raw: Add call to AC_LIBTOOL_WIN32_DLL.
+       Fixes Savannah bug #20686.
+
+2007-08-03  Werner Lemberg  <wl@gnu.org>
+
+       * src/psnames/psmodule.c: Fix usage of
+       FT_CONFIG_OPTION_POSTSCRIPT_NAMES macro.  Reported by Graham Asher.
+
+2007-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftmac.c (open_face_from_buffer): The argument
+       `driver_name' is typed as `const char*' to match with the
+       callers in FT_New_Face_From_LWFN and FT_New_Face_From_SFNT.
+       This is same with open_face_from_buffer in src/base/ftobjs.c.
+       Found and fixed by Sean McBride.
+
+2007-07-28  Werner Lemberg  <wl@gnu.org>
+
+       * src/raster/ftraster.c (count_table): Make it conditional.
+       * src/base/ftobjs.c (FT_New_Library): Check FT_RENDER_POOL_SIZE with
+       a preprocessor statement.
+
+2007-07-27  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftoutln.c (FT_Outline_Translate): Check `outline' before
+       first usage.  From Savannah patch #6115.
+
+2007-07-16  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2007-07-16  Derek Clegg  <dclegg@apple.com>
+
+       Add new service for getting the ROS from a CID font.
+
+       * include/freetype/config/ftheader.h (FT_CID_H): New macro.
+       * include/freetype/ftcid.h: New file.
+
+       * include/freetype/internal/ftserv.h (FT_SERVIVE_CID_H): New macro.
+       * include/freetype/internal/services/svcid.h: New file.
+
+       * src/base/ftcid.c: New file.
+
+       * src/cff/cffdrivr.c: Include FT_SERVICE_CID_H.
+       (cff_get_ros): New function.
+       (cff_service_cid_info): New service structure.
+       (cff_services): Register it.
+
+       * src/cff/cffload.c (cff_font_done): Free registry and ordering.
+
+       * src/cff/cfftypes.h (CFF_FontRec): Add `registry' and `ordering'.
+
+       * modules.cfg (BASE_EXTENSIONS): Add ftcid.c.
+
+2007-07-11  Derek Clegg  <dclegg@apple.com>
+
+       Add support for postscript name service to CFF driver.
+
+       * src/cff/cffdrivr.c: Include FT_SERVICE_POSTSCRIPT_NAME_H.
+       (cff_get_ps_name): New function.
+       (cff_service_ps_name): New service structure.
+       (cff_services): Register it.
+
+2007-07-07  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftglyph.c (FT_Glyph_Copy): Fix initialization of
+       `target'.  Reported by Sean McBride.
+
+2007-07-06  Werner Lemberg  <wl@gnu.org>
+
+       * src/pfr/pfrcmap.c: Include pfrerror.h.
+
+       * src/autofit/afindic.c: Add some external declarations to pacify
+       `make multi' compilation.
+
+       * src/cid/cidgload.c (cid_load_glyph): Pacify compiler.
+
+       * src/cff/cffdrivr.c (cff_ps_get_font_info), src/cff/cffobjs.c
+       (cff_strcpy), include/freetype/internal/ftmemory.h (FT_MEM_STRDUP),
+       src/autofit/aflatin.c (af_latin_hints_compute_edges),
+       src/autofit/afcjk.c (af_cjk_hints_compute_edges), src/sfnt/ttmtx.c
+       (tt_face_get_metrics), src/base/ftobjs.c (open_face)
+       [FT_CONFIG_OPTION_INCREMENTAL]: Fix compilation with C++ compiler.
+
+       * docs/release: Mention test compilation targets.
+
+2007-07-04  Werner Lemberg  <wl@gnu.org>
+
+       * docs/PROBLEMS: Mention that some PS based fonts can't be
+       handled correctly by FreeType.
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Always allow a
+       recursion depth of 1.  This was the maximum value in TrueType 1.0,
+       and some older fonts don't set this field correctly.
+
+       * src/gxvalid/gxvmort1.c
+       (gxv_mort_subtable_type1_substTable_validate): Fix tracing message.
+
+2007-07-03  Werner Lemberg  <wl@gnu.org>
+
+       * src/autofit/aflatin.c (af_latin_metrics_init_blues): Initialize
+       `round' to pacify compiler.
+
+2007-07-02  Werner Lemberg  <wl@gnu.org>
+
+
+       * Version 2.3.5 released.
+       =========================
+
+
+       Tag sources with `VER-2-3-5'.
+
+       * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump
+       version number to 2.3.5.
+
+       * README, Jamfile (RefDoc), builds/win32/visualc/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj,
+       builds/win32/visualce/index.html,
+       builds/win32/visualce/freetype.dsp,
+       builds/win32/visualce/freetype.vcproj: s/2.3.4/2.3.5/, s/234/235/.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 5.
+
+       * builds/unix/configure.raw (version_info): Set to 9:16:3.
+
+2007-07-01  David Turner  <david@freetype.org>
+
+       * include/freetype/freetype.h, src/base/ftpatent.c
+       (FT_Face_SetUnpatentedHinting): New function to dynamically change
+       the setting after a face is created.
+
+       * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Fix a small bug
+       that created distortions in the bytecode interpreter results.
+
+2007-06-30  David Turner  <david@freetype.org>
+
+       * src/truetype/ttinterp.c (Ins_IUP): Add missing variable
+       initialization.
+
+       * src/autofit/aflatin.c (af_latin_metric_init_blues): Get rid of an
+       infinite loop in the case of degenerate fonts.
+
+2007-06-26  Rahul Bhalerao  <b.rahul.pm@gmail.com>
+
+       Add autofit module for Indic scripts.  This currently just reuses
+       the CJK-specific functions.
+
+       * include/freetype/config/ftoption.h (AF_CONFIG_OPTION_INDIC): New
+       macro.
+       * devel/ftoption.h: Synchronize with
+       include/freetype/config/ftoption.h.
+
+       * src/autofit/afindic.c, src/autofit/afindic.h: New files.
+
+       * src/autofit/afglobal.c, src/autofit/aftypes.h,
+       src/autofit/autofit.c: Updated.
+
+       * src/autofit/Jamfile (_sources), * src/autofit/rules.mk
+       (AUTOF_DRV_SRC): Updated.
+
+2007-06-23  David Turner  <david@freetype.org>
+
+       * src/truetype/ttgload.c (TT_Load_Simple): Fix change from
+       2007-06-16 that prevented the TrueType module from loading most
+       glyphs.
+
+2007-06-20  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffgload.c (cff_slot_load): Fix logic of 2007-05-28
+       change.
+
+2007-06-19  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (parse_encoding): Handle one more error.
+
+2007-06-19  Dmitry Timoshkov  <dmitry@codeweavers.com>
+
+       * src/winfonts/winfnt.c (fnt_face_get_dll_font): Return error
+       FNT_Err_Invalid_File_Format if file format was recognized but
+       the file doesn't contain any FNT(NE) or RT_FONT(PE) resources.
+       Add verbose debug logs to make it easier to debug failing load
+       attempts.
+       (FNT_Face_Init): A single FNT font can't contain more than 1 face,
+       so return an error if requested face index is > 0.
+       Do not do further attempt to load fonts if a previous attempt has
+       failed but returned error FNT_Err_Invalid_File_Format, i.e., the
+       file format has been recognized but no fonts found in the file.
+
+2007-07-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftmac.c: Apply patches proposed by Sean McBride.
+       (FT_GetFile_From_Mac_Name): Insert FT_UNUSED macros to fix
+       the compiler warnings against unused arguments.
+       (FT_ATSFontGetFileReference): Ditto.
+       (FT_GetFile_From_Mac_ATS_Name): Ditto.
+       (FT_New_Face_From_FSSpec): Ditto.
+       (lookup_lwfn_by_fond): Fix wrong comment.
+       Replace `const StringPtr' by more appropriate type
+       `ConstStr255Param'.
+       FSRefMakePathPath always returns UTF8 POSIX pathname in
+       Mach-O, thus HFS pathname support is dropped.
+       (count_faces): Remove HLock and HUnlock which is not
+       required on Mac OS X anymore.
+       (FT_New_Face_From_SFNT): Ditto.
+       (FT_New_Face_From_FOND): Ditto.
+       * builds/mac/ftmac.c: Synchronize to src/base/ftmac.c,
+       except of HFS pathname support and HLock/HUnlock.
+       They are required on classic CFM environment.
+
+2007-06-18  Werner Lemberg  <wl@gnu.org>
+
+       * src/psaux/psobjs.c (ps_parser_skip_PS_token): Remove incorrect
+       assertion.
+       (ps_parser_to_bytes): Fix error message.
+
+       * src/type42/t42objs.c (T42_Open_Face): Handle one more error.
+       * src/type42/t42parse.c (t42_parse_sfnts): s/alloc/allocated/.
+       Don't allow mixed binary and hex strings.
+       Handle string_size == 0 and string_buf == 0.
+       (t42_parse_encoding): Handle one more error.
+
+2007-06-18  Werner Lemberg  <wl@gnu.org>
+
+       * src/psaux/psobjs.c (ps_tofixedarray, ps_tocoordarray): Fix exit
+       logic.
+       (ps_parser_load_field) <T1_FIELD_TYPE_BBOX>: Skip delimiters
+       correctly.
+       (ps_parser_load_field_table): Use `fields->array_max' instead of
+       T1_MAX_TABLE_ELEMENTS to limit the number of arguments.
+
+       * src/cff/cffgload.c (cff_decoder_prepare): Fix change from
+       2007-06-06.
+
+2007-06-17  Werner Lemberg  <wl@gnu.org>
+
+       * src/tools/ftrandom.c (font_size): New global variable.
+       (TestFace): Use it.
+       (main): Handle new option `--size' to set `font_size'.
+       (Usage): Updated.
+
+       * src/winfonts/winfnt.c (fnt_face_get_dll_font): Exit in case of
+       invalid font.
+       (FNT_Load_Glyph): Protect against invalid bitmap width.
+
+2007-06-16  David Turner  <david@freetype.org>
+
+       * src/smooth/ftgrays.c (gray_find_cell, gray_set_cell, gray_hline):
+       Prevent integer overflows when rendering very large outlines.
+
+       * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check the
+       well-formedness of the contours array when loading a glyph.
+
+       * src/truetype/ttinterp.c (TT_Load_Context): Initialize `zp0', `zp1',
+       and `zp2'.
+       (Ins_IP): Check argument ranges to reject bogus operations properly.
+       (IUP_WorkerRec): Add `max_points' member.
+       (_iup_worker_interpolate): Check argument ranges.
+       (Ins_IUP): Ignore empty outlines.
+
+2007-06-16  Dmitry Timoshkov  <dmitry@codeweavers.com>
+
+       * src/winfonts/winfnt.h: Add necessary structures for PE resource
+       parsing.
+       (WinPE32_HeaderRec): New structure.
+       (WinPE32_SectionRec): New structure.
+       (WinPE_RsrcDirRec): New structure.
+       (WinPE_RsrcDirEntryRec): New structure.
+       (WinPE_RsrcDataEntryRec): New structure.
+       (FNT_FontRec): Remove unused `size_shift' field.
+
+       * src/winfonts/winfnt.c (fnt_face_get_dll_font): Add support for
+       loading bitmap .fon files in PE format.
+
+2007-06-15  Dmitry Timoshkov  <dmitry@codeweavers.com>
+
+       * builds/win32/ftdebug.c: Unify debug level handling with other
+       platforms.
+
+2007-06-14  Dmitry Timoshkov  <dmitry@codeweavers.com>
+
+       * builds/win32/ftdebug.c (FT_Message): Send debug output to the
+       console as well as to the debugger.
+
+2007-06-14  Werner Lemberg  <wl@gnu.org>
+
+       * src/autofit/aflatin.c (af_latin_uniranges): Expand structure to
+       cover all ranges which could possibly be handled by the aflatin
+       module (since the default fallback for unknown ranges is now the
+       afcjk module).  It might be necessary to fine-tune this further by
+       splitting off modules for Greek, Cyrillic, or other blocks.
+
+2007-06-11  David Turner  <david@freetype.org>
+
+       * src/autofit/aflatin.c (af_latin_hints_link_segments): Fix
+       incorrect segment linking computation.  This was the root cause of
+       Savannah bug #19565.
+
+
+       * src/autofit/* [FT_OPTION_AUTOFIT2]: Some very experimental changes
+       to improve the Latin auto-hinter.  Note that the new code is
+       disabled by default since it is not stabilized yet.
+
+       * src/autofit/aflatin2.c, src/autofit/aflatin2.h: New files
+       (disabled currently).
+
+       * src/autofit/afhints.c: Remove dead code.
+       (af_axis_hints_new_edge): Add argument to handle segment directions.
+       (af_edge_flags_to_string): New function.
+       (af_glyph_hints_dump_segments, af_glyph_hints_dump_edges): Handle
+       option flags.
+       (af_glyph_hints_reload): Add argument to handle inflections.
+       Simplify.
+       (af_direction_compute): Fine tuning.
+       (af_glyph_hints_align_edge_points): Fix logic.
+       (af_glyph_hints_align_strong_points): Do linear search for small
+       edge counts.
+       (af_glyph_hints_align_weak_points): Skip any touched neighbors.
+       (af_iup_shift): Handle zero `delta'.
+
+       * src/autofit/afhints.h: Updated.
+       (AF_SORT_SEGMENTS): New macro (disabled).
+       (AF_AxisHintsRec) [AF_SORT_SEGMENTS]: New member `mid_segments'.
+
+       * src/autofit/afglobal.c (af_face_globals_get_metrics): Add
+       argument to pass option flags for handling scripts.
+       * src/autofit/afglobal.h: Updated.
+
+       * src/autofit/afcjk.c: Updated.
+       * src/autofit/aflatin.c: Updated.
+       (af_latin_metrics_scale_dim): Don't reduce scale by 2%.
+
+       (af_latin_hints_compute_segments) [AF_HINT_METRICS]: Remove dead code.
+       (af_latin_hints_compute_edges) [AF_HINT_METRICS]: Remove dead code.
+       Don't set `edge->dir'
+       (af_latin_hint_edges): Add more logging.
+
+       * src/autofit/afloader.c: Updated.
+
+2007-06-11  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Document FT_Face_CheckTrueTypePatents.
+
+2007-06-10  David Turner  <david@freetype.org>
+
+       * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Slight speed-up to
+       the TrueType glyph loader.
+
+       * include/freetype/config/ftoption.h: Clarify documentation
+       regarding unpatented hinting.
+
+
+       Add new `FT_Face_CheckTrueTypePatents' API.
+
+       * include/freetype/freetype.h (FT_Face_CheckTrueTypePatents): New
+       declaration.
+
+       * include/freetype/internal/services/svttglyf.h,
+       src/base/ftpatent.c: New files.
+
+       * include/freetype/internal/ftserv.h (FT_SERVICE_TRUETYPE_GLYF_H):
+       New macro.
+
+       * src/truetype/ttdriver.c: Include FT_SERVICE_TRUETYPE_GLYF_H and
+       `ttpload.h'.
+       (tt_service_truetype_glyf): New service structure.
+       (tt_services): Register it.
+
+       * modules.cfg (BASE_EXTENSIONS), src/base/Jamfile (_sources): Add
+       `ftpatent.c'.
+
+2007-06-08  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Undo change from 2007-04-28.
+       Fonts without a cmap must be handled correctly by FreeType (anything
+       else would be a bug).
+
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings)
+       [FT_DEBUG_LEVEL_TRACE]: Improve tracing message.
+
+2007-06-07  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttsbit0.c (tt_sbit_decoder_init,
+       tt_sbit_decoder_load_image): Protect against integer overflows.
+
+
+       * src/pfr/pfrgload.c (pfr_glyph_load_simple): More bounding checks
+       for `x_control' and `y_control'.
+
+2007-06-06  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftoutln.c (FT_Outline_Decompose): Check `last'.
+
+
+       * src/pfr/pfrcmap.c (pfr_cmap_init): Convert assertion into normal
+       FreeType error.
+
+
+       * src/winfonts/winfnt.c (fnt_face_get_dll_font): Do a rough check of
+       `font_count'.
+
+
+       * src/type1/t1load.c (parse_font_matrix): Check `temp_scale'.
+
+
+       * src/cff/cffgload.c (cff_decoder_prepare): Change return type to
+       `FT_Error'.
+       Check `fd_index'.
+       (cff_slot_load): Updated.
+       * src/cff/cffgload.h: Updated.
+
+2007-06-05  Werner Lemberg  <wl@gnu.org>
+
+       * src/pfr/pfrgload.c (pfr_glyph_done): Comment out unused code.
+       (pfr_glyph_load_simple): Convert assertion into normal FreeType
+       error.
+       Check `idx'.
+       (pfr_glyph_load_compound, pfr_glyph_curve_to, pfr_glyph_line_to):
+       Convert assertion into normal FreeType error.
+
+       * src/pfr/pfrtypes.h (PFR_GlyphRec): Comment out unused code.
+
+
+       * src/winfonts/winfnt.c (FNT_Face_Init): Check `family_size'.
+
+
+       * src/psaux/psobjs.c (ps_tocoordarray, ps_tofixedarray): Return -1
+       in case of parsing error.
+       (ps_parser_load_field): Updated.
+
+       * src/type1/t1load.c (parse_font_matrix): Updated.
+
+2007-06-04  Werner Lemberg  <wl@gnu.org>
+
+       * src/cid/cidgload.c (cid_load_glyph): Check `fd_select'.
+
+       * src/tools/ftrandom/Makefile: Depend on `libfreetype.a'.
+
+2007-06-03  Werner Lemberg  <wl@gnu.org>
+
+       * src/tools/ftrandom/*: Add the `ftrandom' test program written by
+       George Williams (with some modifications).
+
+2007-06-03  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftobjs.c (destroy_charmaps), src/type1/t1objs.c
+       (T1_Face_Done), src/winfonts/winfnt.c (FNT_Face_Done): Check for
+       face == NULL.  Suggested by Graham Asher.
+
+2007-06-03  Ismail Dönmez  <ismail@pardus.org.tr>
+
+       * src/base/ftobjs.c (FT_Request_Metrics): Fix compiler warning.
+
+2007-06-02  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/fterrdef.h (FT_Err_Corrupted_Font_Header,
+       FT_Err_Corrupted_Font_Glyphs): New error codes for BDF files.
+
+       * src/bdf/bdflib.c (bdf_load_font): Use them.
+
+       * src/bdf/bdflib.c (_bdf_parse_start): Check `FONT' better.
+
+2007-06-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftobjs.c (FT_Request_Metrics), src/cache/ftccmap.c
+       (FTC_CMapCache_Lookup): Remove unused code.
+
+2007-06-01  Sean McBride  <sean@rogue-research.com>
+
+       * src/truetype/ttinterp.c (Null_Vector, NULL_Vector): Removed,
+       unused.
+
+2007-06-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/cid/cidparse.c (cid_parser_new): Don't continue second search
+       pass for `StartData' if an error has occurred.
+       Exit properly if no `StartData' has been seen at all.
+
+       * builds/unix/ftsystem.c (FT_Stream_Open): Don't use ULONG_MAX but
+       LONG_MAX to avoid compiler warning.  Suggested by Sean McBride.
+
+2007-05-30  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (parse_subrs, parse_charstrings): Protect
+       against too small binary data strings.
+
+       * src/bdf/bdflib.c (_bdf_parse_glyphs): Check `STARTCHAR' better.
+
+2007-05-28  David Turner  <david@freetype.org>
+
+       * src/cff/cffgload.c (cff_slot_load): Do not apply the identity
+       transformation.  This significantly reduces the loading time of CFF
+       glyphs.
+
+       * docs/CHANGES: Updated.
+
+       * src/autofit/afglobal.c (AF_SCRIPT_LIST_DEFAULT): Change default
+       hinting script to CJK, since it works well with more scripts than
+       latin.  Thanks to Rahul Bhalerao <b.rahul.pm@gmail.com> for pointing
+       this out!
+
+2007-05-25  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Updated.
+
+2007-05-24  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttobjs.h (tt_size_ready_bytecode): Move declaration
+       into TT_USE_BYTECODE_INTERPRETER preprocessor block.
+
+2007-05-24  Graham Asher  <graham.asher@btinternet.com>
+
+       * src/truetype/ttobjs.c (tt_size_ready_bytecode)
+       [!TT_USE_BYTECODE_INTERPRETER]: Removed.  Unused.
+
+2007-05-22  David Turner  <david@freetype.org>
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Fix last change to
+       avoid crashes in case the bytecode interpreter is not used.
+
+
+       Avoid heap blowup with very large .Z font files.  This fixes
+       Savannah bug #19910.
+
+       * src/lzw/ftzopen.h (FT_LzwStateRec): Remove `in_cursor',
+       `in_limit', `pad', `pad_bits', and `in_buff' members.
+       Add `buf_tab', `buf_offset', `buf_size', `buf_clear', and
+       `buf_total' members.
+
+       * src/lzw/ftzopen.c (ft_lzwstate_get_code): Rewritten.  It now takes
+       only one argument.
+       (ft_lzwstate_refill, ft_lzwstate_reset, ft_lzwstate_io): Updated.
+
+2007-05-20  Ismail Dönmez  <ismail@pardus.org.tr>
+
+       * src/pshinter/pshrec.c (ps_mask_table_set_bits): Add `const'.
+       (ps_dimension_set_mask_bits): Remove `const'.
+
+2007-05-19  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttmtx.c (tt_face_get_metrics)
+       [!FT_CONFIG_OPTION_OLD_INTERNALS]: Another type-punning fix.
+
+2007-05-19  Derek Clegg  <dclegg@apple.com>
+
+       Savannah patch #5929.
+
+       * include/freetype/tttables.h, src/base/ftobjcs.c
+       (FT_Get_CMap_Format): New function.
+
+       * include/freetype/internal/services/svttcmap.c (TT_CMapInfo): Add
+       `format' member.
+       * src/sfnt/ttcmap.c (tt_cmap{0,2,4,6,8,10,12}_get_info): Set
+       cmap_info->format.
+
+2007-05-19  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Save graphics state
+       before handling subglyphs so that it can be reinitialized each time.
+       This fixes Savannah bug #19859.
+
+2007-05-16  Werner Lemberg  <wl@gnu.org>
+
+       * src/cache/ftccache.c (ftc_node_mru_link, ftc_node_mru_unlink),
+       src/cache/ftccache.h (FTC_CACHE_LOOKUP_CMP), src/cache/ftcglyph.h
+       (FTC_GCACHE_LOOKUP_CMP), src/pshinter/pshmod.c (ps_hinter_init),
+       src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_load_hhea,
+       tt_face_get_metrics): Fix type-punning issues.
+
+2007-05-15  David Turner  <david@freetype.org>
+
+       * include/freetype/config/ftstdlib.h,
+       include/freetype/internal/ftobjs.h: As suggested by Graham Asher,
+       ensure that ft_isalnum, ft_isdigit, etc., use hard-coded values
+       instead on relying on the locale-dependent functions provided by
+       <ctypes.h>.
+
+2007-05-15  Graham Asher  <graham.asher@btinternet.com>
+
+       * src/autofit/afcjk.c (af_cjk_hints_compute_edges): Remove unused
+       variable.
+       * src/autofit/afloader.c (af_loader_load_g): Ditto.
+
+       * src/base/ftobjs.c (ft_validator_error): Use `ft_jmp_buf'.
+       (open_face_from_buffer): Initialize `stream'.
+       (FT_Request_Metrics): Remove unused variable.
+       Remove redundant `break' statements.
+       (FT_Get_Track_Kerning): Remove unused variable.
+
+       * src/psaux/afmparse.c (afm_parse_track_kern, afm_parse_kern_pairs,
+       afm_parse_kern_data): Remove redundant
+       `break' statements.
+       (afm_parser_parse): Ditto.
+       Don't use uninitialized variables.
+
+       * src/psnames/psmodule.c (VARIANT_BIT): Define as unsigned long.
+       Use `|' operator instead of `^' to set it.
+       Update all users.
+
+       * src/sfnt/ttcmap.c (tt_face_build_cmaps): Use `ft_jmp_buf'.
+       * src/sfnt/ttkern.c (tt_face_load_kern): Remove unused variable.
+
+       * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Remove redundant
+       comparison.
+       (TT_Process_Simple_Glyph): Use FT_UInt for `n_points' and `i'.
+       (TT_Load_Glyph): Remove unused variable.
+
+2007-05-13  Derek Clegg  <dclegg@apple.com>
+
+       * src/base/ftobjs.c (FT_New_Library): Only allocate rendering pool
+       if FT_RENDER_POOL_SIZE is > 0.  From Savannah patch #5928.
+
+2007-05-11  David Turner  <david@freetype.org>
+
+       * src/cache/ftbasic.c, include/freetype/ftcache.h
+       (FTC_ImageCache_LookupScaler, FTC_SBit_Cache_LookupScaler): Two new
+       functions that allow us to look up glyphs using an FTC_Scaler object
+       to specify the size, making it possible to use fractional pixel
+       sizes.
+
+       * src/truetype/ttobjs.c (tt_size_ready_bytecode): Set
+       `size->cvt_ready'.  Reported by Boris Letocha.
+
+2007-05-09  Graham Asher  <graham.asher@btinternet.com>
+
+       * src/truetype/ttinterp.c (Ins_IP), src/autofit/aflatin.c
+       (af_latin_metrics_scale_dim): Fix compiler warnings.
+
+2007-05-06  Werner Lemberg  <wl@gnu.org>
+
+       * builds/win32/visualce/freetype.sln: Removed, as requested by
+       Vincent.
+
+2007-05-04  Vincent RICHOMME  <richom.v@free.fr>
+
+       * builds/win32/visualce/*: Add Visual C++ project files for Pocket
+       PC targets.
+
+       * docs/CHANGES: Document them.
+
+2007-05-04  <harry@kdevelop.org>
+
+       * builds/unix/ftsystem.c (FT_Stream_Open): Handle return value 0 of
+       mmap (which might happen on some RTOS).  From Savannah patch #5909.
+
+2007-05-03  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftobjs.c (FT_Set_Char_Size): Simplify code.
+       * include/freetype/freetype.h (FT_Set_Char_Size): Update
+       documentation.
+
+2007-04-28  Victor Stinner  <victor.stinner@inl.fr>
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Check error code after loading
+       `cmap'.
+
+2007-04-27  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check for negative
+       number of points in contours.  Problem reported by Victor Stinner
+       <victor.stinner@haypocalc.com>.
+       (TT_Process_Simple_Glyph): Synchronize variable types.
+
+2007-04-26  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftglyph.c (FT_Glyph_Copy): Always set second argument to
+       zero in case of error.  This fixes Savannah bug #19689.
+
+2007-04-25  Boris Letocha  <b.letocha@cz.gmc.net>
+
+       * src/truetype/ttobjs.c: Fix a typo that created a speed regression
+       in the TrueType bytecode loader.
+
+2007-04-10  Martin Horak  <horakm@centrum.cz>
+
+       * src/sfnt/sfobjs.c (sfnt_load_face) [FT_CONFIG_OPTION_INCREMENTAL]:
+       Ignore `hhea' table.  This fixes Savannah bug #19261.
+
+2007-04-09  Werner Lemberg  <wl@gnu.org>
+
+
+       * Version 2.3.4 released.
+       =========================
+
+
+       Tag sources with `VER-2-3-4'.
+
+       * docs/CHANGES, docs/VERSION.DLL: Update documentation and bump
+       version number to 2.3.4.
+
+       * README, Jamfile (RefDoc), builds/win32/visualc/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj: s/2.3.3/2.3.4/, s/233/234/.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 4.
+
+       * builds/unix/configure.raw (version_info): Set to 9:15:3.
+
+2007-04-09  Martin Horak  <horakm@centrum.cz>
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Save and restore
+       memory stream to avoid a crash with the incremental memory
+       interface (Savannah bug #19260).
+
+2007-04-06  David Turner  <david@freetype.org>
+
+       * src/base/ftbimap.c (ft_bitmap_assure_buffer): Fix buffer-overwrite bug
+       (Savannah bug #19536).
+
+2007-04-04  Werner Lemberg  <wl@gnu.org>
+
+
+       * Version 2.3.3 released.
+       =========================
+
+
+       Tag sources with `VER-2-3-3'.
+
+       * docs/CHANGES: Mention CVE-2007-1351.
+
+2007-04-03  David Turner  <david@freetype.org>
+
+       * src/base/ftobjs.c (FT_Set_Char_Size): As suggested by James Cloos,
+       if one of the resolution values is 0, treat it as if it were the
+       same as the other value.
+
+2007-04-02  David Turner  <david@freetype.org>
+
+       Add special code to detect `extra-light' fonts and do not snap their
+       stem widths too much to avoid bizarre hinting effects.
+
+       * src/autofit/aflatin.h (AF_LatinAxisRec): Add `standard_width' and
+       `extra_light' members.
+
+       * src/autofit/aflatin.c (af_latin_metrics_init_widths): Initialize
+       them.
+       (af_latin_metrics_scale_dim): Set `extra_light'.
+       (af_latin_compute_stem_width): Use `extra_light'.
+
+2007-03-28  David Turner  <david@freetype.org>
+
+       * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Fix zero-ing of the
+       padding.
+
+2007-03-28  Werner Lemberg  <wl@gnu.org>
+
+       * src/bdf/bdflib.c (setsbit, sbitset): Handle values >= 128
+       gracefully.
+       (_bdf_set_default_spacing): Increase `name' buffer size to 256 and
+       issue an error for longer names.  This fixes CVE-2007-1351.
+       (_bdf_parse_glyphs): Limit allowed number of glyphs in font to the
+       number of code points in Unicode.
+
+       * builds/win32/visualc/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj, README: s/2.3.2/2.3.3/,
+       s/232/233/.
+
+       * docs/CHANGES: Mention ftdiff.
+
+2007-03-26  David Turner  <david@freetype.org>
+
+       * src/truetype/ttinterp.c [FIX_BYTECODE]: Remove it and
+       corresponding code.
+       (Ins_MD): Last regression fix.
+
+       * src/autofit/aflatin.c (af_latin_metrics_init_blues): Fix blues
+       computations in order to ignore single-point contours.  These are
+       never rasterized and correspond in certain fonts to mark-attach
+       points that are very far from the glyph's real outline, ruining the
+       computation.
+
+       * src/autofit/afloader.c (af_loader_load_g): In the case of
+       monospaced fonts, always set `rsb_delta' and `lsb_delta' to 0.
+       Otherwise code that uses them will most certainly ruin the fixed
+       advance property.
+
+       * docs/CHANGES, docs/VERSION.DLL, README, Jamfile (RefDoc): Update
+       documentation and bump version number to 2.3.3.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 3.
+
+       * builds/unix/configure.raw (version_info): Set to 9:14:3.
+
+2007-03-26  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/unix/ftconfig.in: Disable Carbon framework dependency on
+       64bit ABI on Mac OS X 10.4.x (ppc & i386).  Found by Sean McBride.
+       * builds/vms/ftconfig.h: Ditto.
+       * include/freetype/config/ftconfig.h: Ditto.
+
+2007-03-22  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/unix/ftsystem.c (FT_Stream_Open): Temporary fix to prevent
+       32bit unsigned long overflow by 64bit filesize on LP64 platform, as
+       proposed by Sean McBride:
+       http://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html
+
+2007-03-22  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/unix/ftconfig.in: Suppress SGI compiler's warning against
+       setjmp, proposed by Sean McBride:
+       http://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html
+
+2007-03-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/unix/configure.raw: Dequote `OS_INLINE' in comment of
+       conftest.c, to avoid unexpected shell evaluation.  Possibly it is a
+       bug or undocumented behaviour of autoconf.
+
+2007-03-18  David Turner   <david@freetype.org>
+
+       * src/truetype/ttinterp.c (Ins_MDRP): Another bytecode regression
+       fix; testing still needed.
+
+       * src/truetype/ttinterp.c (Ins_MD): Another bytecode regression fix.
+
+2007-03-17  David Turner   <david@freetype.org>
+
+       * src/truetype/ttinterp.c (Ins_IP): Fix wrong handling of the
+       (undocumented) twilight zone special case.
+
+2007-03-09  Werner Lemberg  <wl@gnu.org>
+
+
+       * Version 2.3.2 released.
+       =========================
+
+
+       Tag sources with `VER-2-3-2'.
+
+       * builds/win32/visualc/index.html,
+       builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj, README: s/2.3.1/2.3.2/,
+       s/231/232/.
+
+2007-03-08  David Turner  <david@freetype.org>
+
+       * docs/CHANGES, docs/VERSION.DLL: Updated for upcoming release.
+
+       * builds/unix/configure.raw (version_info): Set to 9:13:3.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 2.
+
+       * README, Jamfile (RefDoc): s/2.3.1/2.3.2/.
+
+       * src/base/ftutil.c (ft_mem_strcpyn): Fix a bug that prevented the
+       function to work properly, over-writing user-provided buffers in
+       some cases.  Reported by James Cloos <cloos@jhcloos.com>.
+
+
+2007-03-05  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/config/ftstdlib.h (ft_strstr): New wrapper
+       macro for `strstr'.
+
+       * src/truetype/ttobjs.c (tt_face_init): Use ft_strstr for scanning
+       `trick_names', as suggested by Ivan Nincic.
+
+2007-03-05  David Turner  <david@freetype.org>
+
+       * src/base/ftinit.c (FT_Init_FreeType): Fix a small memory leak in
+       case FT_Init_FreeType fails for some reason.  Problem reported by
+       Maximilian Schwerin <maximilian.schwerin@buelowssiege.de>.
+
+       * src/truetype/ttobs.c (tt_size_init_bytecode): Clear the `x_ppem'
+       and `y_ppem' fields of the `TT_Size.metrics' structure, not those of
+       `TT_Size.root.metrics'.  Problem reported by Daniel Glöckner
+       <daniel-gl@gmx.net>.
+
+       * src/type1/t1afm.c (T1_Read_PFM): Read kerning values as 16-bit
+       signed values, not unsigned ones.  Problem reported by Johannes
+       Walther <joh_walt@yahoo.de>.
+
+2007-02-21  David Turner  <david@freetype.org>
+
+       * src/pshinter/pshalgo.c (psh_hint_align): Fix a bug in the hinting
+       of small and ghost stems in the Postscript interpreter.
+
+2007-02-20  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftmac.c (FT_GetFileRef_From_Mac_ATS_Name): Fix memory
+       leak, patch by "Jjgod Jiang" <gzjjgod@gmail.com>.
+       * builds/mac/ftmac.c (FT_GetFileRef_From_Mac_ATS_Name): Ditto.
+
+2007-02-16  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttinterp.c (Ins_MD): Remove unused variable.
+       * src/autofit/aflatin.c (af_latin_hints_link_segments): Ditto.
+
+2007-02-14  David Turner  <david@freetype.org>
+
+       It seems that the following changes fix most of the known
+       interpreter problems with my fonts, but more testing is needed,
+       though.
+
+       * src/truetype/ttinterp.c (FIX_BYTECODE): Activate.
+       (TT_MulFix14): Rewrite.
+       (Ins_MD, Ins_MDRP, Ins_IP) [FIX_BYTECODE]: Improved and updated.
+       (Ins_MIRP): Ditto.
+
+2007-02-12  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttinterp.c (Project_x, Project_y): Remove compiler
+       warnings.
+
+       * src/pcf/pcfread.c (pcf_interpret_style), src/bdf/bdfdrivr.c
+       (bdf_interpret_style): Ditto.
+
+2007-02-12  David Turner  <david@freetype.org>
+
+       Simplify projection and dual-projection code interface.
+
+       * src/truetype/ttinterp.h (TT_Project_Func): Use `FT_Pos', not
+       FT_Vector' as argument type.
+       * src/truetype/ttinterp.c (CUR_Func_project, CUR_Func_dualproj):
+       Updated.
+       (CUR_fast_project, CUR_fast_dualproj): New macros.
+       (Project, Dual_Project, Project_x, Project_y): Updated.
+       (Ins_GC, Ins_SCFS, Ins_MDAP, Ins_MIAP, Ins_IP): Use new `fast'
+       macros.
+
+
+       * src/autofit/afloader.c (af_loader_load_g): Improve spacing
+       adjustments for the non-light auto-hinted modes.  Gets rid of
+       `inter-letter spacing is too wide' problems.
+
+       * src/autofit/aflatin.c (af_latin_hints_link_segments,
+       af_latin_hints_compute_edges): Slight optimization of the segment
+       linker and better handling of serif segments to get rid of broken
+       `9' in Arial at 9pt (96dpi).
+
+
+       Introduce new string functions and the corresponding macros to get
+       rid of various uses of strcpy and other `evil' functions, as well as
+       to simplify a few things.
+
+       * include/freetype/internal/ftmemory.h (ft_mem_strdup, ft_mem_dup,
+       ft_mem_strcpyn): New declarations.
+       (FT_MEM_STRDUP, FT_STRDUP, FT_MEM_DUP, FT_DUP, FT_STRCPYN): New
+       macros.
+       * src/base/ftutil.c (ft_mem_dup, ft_mem_strdup, ft_mem_strcpyn): New
+       functions.
+
+       * src/bfd/bfddrivr.c (bdf_interpret_style, BDF_Face_Init),
+       src/bdf/bdflib.c (_bdf_add_property), src/pcf/pcfread.c
+       (pcf_get_properties, pcf_interpret_style, pcf_load_font),
+       src/cff/cffdrivr.c (cff_get_glyph_name), src/cff/cffload.c
+       (cff_index_get_sid_string), src/cff/cffobjs.c (cff_strcpy),
+       src/sfnt/sfdriver.c (sfnt_get_glyph_name), src/type1/t1driver.c
+       (t1_get_glyph_name), src/type42/t42drivr.c (t42_get_glyph_name,
+       t42_get_name_index): Use new functions and simplify code.
+
+       * builds/mac/ftmac.c (FT_FSPathMakeSpec): Don't use FT_MIN.
+
+2007-02-11  Werner Lemberg  <wl@gnu.org>
+
+       * src/autofit/afloader.c (af_loader_load_g): Don't change width for
+       non-spacing glyphs.
+
+2007-02-07  Tom Parker  <palfrey@tevp.net>
+
+       * src/cff/cffdrivr.c (cff_get_name_index): Protect against NULL
+       pointer.
+
+2007-02-05  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * include/freetype/ftmac.h (FT_DEPRECATED_ATTRIBUTE):
+       Introduce __attribute((deprecated))__ to warn functions
+       which use non-ANSI data types in its interfaces.
+       (FT_GetFile_From_Mac_Name): Deprecated, using FSSpec.
+       (FT_GetFile_From_Mac_ATS_Name): Deprecated, using FSSpec.
+       (FT_New_Face_From_FSSpec): Deprecated, using FSSpec.
+       (FT_New_Face_From_FSRef): Deprecated, using FSRef.
+
+       * src/base/ftmac.c: Predefine FT_DEPRECATED_ATTRIBUTE as void
+       to avoid warning in building FreeType.
+       * builds/mac/ftmac.c: Ditto.
+
+2007-02-05  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftbase.c: Fix to use builds/mac/ftmac.c, if configured
+       `--with-fsspec' etc.  Replace #include "ftmac.c" with
+       #include <ftmac.c>.
+
+2007-02-05  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * include/freetype/ftmac.h (FT_GetFilePath_From_Mac_ATS_Name):
+       Introduced as replacement of FT_GetFile_From_Mac_ATS_Name.
+       * src/base/ftmac.c (FT_GetFilePath_From_Mac_ATS_Name): Ditto.
+       (FT_GetFile_From_Mac_ATS_Name): Rewritten as wrapper of
+       FT_GetFilePath_From_Mac_ATS_Name.
+       * builds/mac/ftmac.c: Ditto.
+
+2007-02-05  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * include/freetype/ftmac.h: Fixed wrong comment: FSSpec of
+       FT_GetFile_From_Mac_Name, FT_GetFile_From_Mac_ATS_Name are
+       for passing to FT_New_Face_From_FSSpec.
+
+2007-02-05  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/unix/configure.raw: Check whether Mac OS X system headers
+       can be built under ANSI C mode.
+
+       * src/base/ftmac.c (OS_INLINE): Redefine OS_INLINE by a version
+       compatible to ANSI C in case system headers are ANSI C incompatible.
+       * builds/mac/ftmac.c (OS_INLINE): Ditto.
+
+2007-02-01  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/ttnameid.h (TT_MS_LANGID_DZONGHKA_BHUTAN):
+       Explain why applications shouldn't use it.  Found by Alexei.
+
+2007-02-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       * builds/unix/freetype2.m4 (AC_CHECK_FT2): Fix spelling of warning
+       message.
+
+       * src/gxvalid/gxvmort1.c
+       (gxv_mort_subtable_type1_substTable_validate): Fix debugging
+       message.
+
+2007-01-31  Werner Lemberg  <wl@gnu.org>
+
+
+       * Version 2.3.1 released.
+       =========================
+
+
+       Tag sources with `VER-2-3-1-FINAL'.
+
+       * builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj: s/230/231/.
+       * builds/win32/visualc/index.html: s/221/231/.
+
+       * vms_make.com: Add `ftgasp'.
+
+2007-01-30  David Turner  <david@freetype.org>
+
+       Tag sources with VER-2-3-1 to prepare release.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 1.
+
+       * docs/VERSION.DLL, docs/release, README, Jamfile (RefDoc):
+       s/2.3.0/2.3.1/.
+
+       * builds/unix/configure.raw (version_info): Set to 9:12:3.
+
+
+       * src/autofit/aftypes.h (AF_USE_WARPER), src/autofit/afloader.c
+       (af_loader_load_g): Disable the warper (i.e., the light hinting
+       improvements) to make a 2.3.1 bugfix release before introducing a
+       new feature.  This should give us more time to tune and improve the
+       warper for the next release.
+
+       * docs/CHANGES: Update accordingly.
+
+2007-01-25  David Turner  <david@freetype.org>
+
+       For light auto-hinting, improve glyph advance widths and resurrect
+       normal/full hinting to its normal quality.
+
+       * src/autofit/afhints.h (AF_GlyphHintsRec): New members `xmin_delta'
+       and `xmax_delta'.
+       * src/autofit/afhints.c (af_glyph_hints_reload): Reset `xmin_delta'
+       and `xmax_delta'.
+
+       * src/autofit/afloader.c (af_loader_load_g) <AF_USE_WARPER>: Replace
+       preprocessor conditional with if-clause, handling both light and
+       normal mode.
+
+       * src/autofit/afwarp.c (AF_WarpScore): Fine-tune again.
+       (af_warper_compute): Handle `xmin_delta' and `xmax_delta'.
+
+2007-01-25  Werner Lemberg  <wl@gnu.org>
+
+       * docs/release: Updated -- Savannah uses a new uploading scheme.
+
+2007-01-25  David Turner  <david@freetype.org>
+
+       * src/cff/cffload.c (cff_index_get_pointers): Improve previous fix.
+
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings)
+       <cff_op_callsubr, cff_op_callgsubr>: Fix sanity check for empty
+       functions.
+
+       * docs/CHANGES: Document light auto-hinting improvement.
+
+2007-01-25  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffload.c (cff_index_get_pointers): Handle last entry
+       correctly in a sanity check.  Since this function is only used to
+       load local and global functions, any charstring that called the last
+       local/global function would fail otherwise.  This fixes Savannah bug
+       #18867.
+
+       * docs/CHANGES: Document it.
+
+2007-01-23  David Turner  <david@freetype.org>
+
+       * src/truetype/ttobjs.c (tt_size_ready_bytecode): Fix typo that
+       prevented compilation when disabling both the unpatented and the
+       bytecode interpreter in the TrueType font driver.
+
+
+       Fix and enable the warper to improve `light' hinting mode.  This is
+       not necessarily a final version, but it seems to work well.
+
+       * src/autofit/aflatin.c (af_latin_hints_init) [AF_USE_WARPER]:
+       Disable code.
+       (af_latin_hints_apply) [AF_USE_WARPER]: Handle FT_RENDER_MODE_LIGHT.
+       * src/autofit/aftypes.h: Activate AF_USE_WARPER.
+
+       * src/autofit/afwarp.c (AF_WarpScore): Tune table.
+       (af_warper_compute_line_best): Fix array size of `scores'.
+       (af_warper_compute): Better handling of border cases.
+       * src/autofit/afwarp.h (AF_WarperRec): Remove unused members `X1'
+       and `X2'.
+
+2007-01-21  Werner Lemberg  <wl@gnu.org>
+
+       * ChangeLog: Split off older entries into...
+       * ChangeLog.22: This new file.
+
+2007-01-21  Werner Lemberg  <wl@gnu.org>
+
+       * docs/CHANGES: Document SHZ fix.
+
+2007-01-21  George Williams  <gww@silcom.com>
+
+       * src/truetype/ttinterp.c (Ins_SHZ): SHZ doesn't move phantom
+       points.
+
+2007-01-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttmtx.c (tt_face_get_metrics)
+       [!FT_CONFIG_OPTION_OLD_INTERNALS]: Fix limit check.
+
+2007-01-17  Werner Lemberg  <wl@gnu.org>
+
+
+       * Version 2.3.0 released.
+       =========================
+
+
+       Tag sources with `VER-2-3-0-FINAL'.
+
+2007-01-17  Werner Lemberg  <wl@gnu.org>
+
+       * docs/release: Updated.
+
+2007-01-16  David Turner  <david@freetype.org>
+
+       * src/autofit/aflatin.c (af_latin_hints_compute_segments),
+       src/cff/cffdriver.c (cff_ps_get_font_info), src/truetype/ttobjs.c
+       (tt_face_init), src/truetype/ttinterp.c (Ins_SHC): Fix compiler
+       warnings.
+
+2007-01-15  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       * builds/amiga/makefile, builds/amiga/makefile.os4,
+       builds/amiga/smakefile: Add `ftgasp.c' and `ftlcdfil.c'.
+
+       * builds/amiga/include/freetype/config/ftconfig.h: Synchronize.
+
+2007-01-14  Detlef Würkner  <TetiSoft@apg.lahn.de>
+
+       Fix various compiler warnings.
+
+       * src/truetype/ttdriver.c (tt_size_select), src/cff/cffobjs.h,
+       src/cff/cffobjs.c (cff_size_request), src/type42/t42objs.h:
+       s/index/strike_index/.
+       * src/base/ftobjs.c (FT_Match_Size): s/index/size_index/.
+
+       * src/gxvalid/gxvmorx5.c
+       (gxv_morx_subtable_type5_InsertList_validate): s/index/table_index/.
+
+       * src/truetype/ttinterp.c (Compute_Point_Displacement),
+       src/pcf/pcfread.c (pcf_seek_to_table_type): Avoid possibly
+       uninitialized variables.
+
+2007-01-13  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * docs/CHANGES, docs/INSTALL.MAC: Improvements.
+
+2007-01-13  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1afm.c (T1_Read_Metrics): MS Windows allows PFM
+       versions up to 0x3FF without complaining.
+
+2007-01-13  Derek Clegg  <dclegg@apple.com>
+
+       Add FT_Get_PS_Font_Info interface to CFF driver.
+
+       * src/cff/cfftypes.h: Include FT_TYPE1_TABLES_H.
+       (CFF_FontRec): Add `font_info' field.
+
+       * src/cff/cffload.c: Include FT_TYPE1_TABLES_H.
+       (cff_font_done): Free font->font_info if necessary.
+
+       * src/cff/cffdrvr.c (cff_ps_get_font_info): New function.
+       (cff_service_ps_info): Register cff_ps_get_font_info.
+
+2007-01-13  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftoutln.c (FT_Outline_Get_Orientation): Fix compilation
+       with C++ compiler.
+
+       * src/autofit/afhints.c (af_glyph_hints_dump_segments,
+       af_glyph_hints_dump_edges): Ditto.
+
+       * src/base/rules.mk (BASE_SRC): Remove ftgasp.c (it's already in
+       `modules.cfg').
+
+       * src/sfnt/ttsbit0.h: Remove.
+
+       * src/sfnt/rules.mk (SFNT_DRV_SRC): Don't include ttsbit0.c.
+
+2007-01-12  David Turner  <david@freetype.org>
+
+       * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Fix memory stomping
+       bug in the bitmap emboldener if the pitch of the source bitmap is
+       much larger than its width.
+
+       * src/truetype/ttinterp.c (Update_Max): Fix aliasing-related
+       compilation warning.
+
+2007-01-12  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/install-sh, builds/unix/mkinstalldirs: Updated from
+       `automake' CVS module from sources.redhat.com.
+
+2007-01-11  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (is_space): Removed.
+       (parse_encoding, parse_charstrings): Use IS_PS_DELIM.
+       (parse_charstrings): Use IS_PS_TOKEN.
+
+
+       * autogen.sh: Avoid bash specific syntax.
+
+2007-01-11  David Turner  <david@freetype.org>
+
+       * docs/CHANGES: Small update.
+
+       * builds/unix/configure.raw (version_info): Set to 9:11:3.
+
+       * src/base/ftobjs.c (IsMacResource): Fix a small bug that caused a
+       crash with some Mac OS X .dfont files.  Submitted by Masatake
+       Yamato.
+
+       * autogen.sh: Small fix to get it working on Mac OS X properly:
+       The issue is that GNU libtool is called `glibtool' on this platform,
+       and we must call `glibtoolize', since `libtoolize' doesn't exist.
+
+2007-01-10  David Turner  <david@freetype.org>
+
+       * all-sources: Tag all sources with VER-2-3-0-RC1 and
+       VER-2-3-0.
+
+       * Jamfile (RefDoc), README, builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj, docs/VERSION.DLL: Update
+       version number to 2.3.0.
+
+       * include/freetype/freetype.h (FREETYPE_MINOR): Set to 3.
+       (FREETYPE_PATCH): Set to 0.
+
+       * include/freetype/ftchapters.h, include/freetype/ftgasp.h,
+       include/freetype/ftlcdfil.h: Update reference documentation with
+       GASP support and LCD filtering sections.
+
+       * src/pshinter/pshalgo.c (psh_glyph_compute_inflections): Fix a typo
+       which created an endless loop with some malformed font files.
+
+2007-01-10  Derek Clegg  <dclegg@apple.com>
+
+       * src/type1/t1load.c (T1_Get_MM_Var): Always return fixed point
+       values.
+
+2007-01-08  David Turner  <david@freetype.org>
+
+       * docs/CHANGES: Updated.
+
+       * include/freetype/ftgasp.h, src/base/ftgasp.c: New files which add
+       a new API `FT_Get_Gasp' to return entries of the `gasp' table
+       corresponding to a given character pixel size.
+
+       * src/sfnt/ttload.c (tt_face_load_gasp): Add version check for the
+       `gasp' table, in order to avoid potential problems with later
+       versions.
+
+       * include/freetype/config/ftheader.h (FT_GASP_H): New macro for
+       <freetype/ftgasp.h>.
+
+       * src/base/rules.mk (BASE_SRC), src/base/Jamfile (_sources),
+       modules.cfg (BASE_EXTENSIONS), builds/win32/visualc/freetype.dsp,
+       builds/win32/visualc/freetype.vcproj: Add src/base/ftgasp.c to the
+       default build.
+
+2007-01-07  Werner Lemberg  <wl@gnu.org>
+
+       * src/cid/cidparse.c (cid_parser_new): Improve error message for
+       Type 11 fonts.
+       Scan for `/sfnts' token.
+
+2007-01-07  Werner Lemberg  <wl@gnu.org>
+
+       * src/cid/cidparse.c (cid_parser_new): Reject Type 11 fonts.
+
+2007-01-06  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffload.c (cff_index_init): Remove unused variable.
+       (cff_index_read_offset): s/perror/errorp/ to avoid global shadowing.
+
+2007-01-04  David Turner  <david@freetype.org>
+
+       * src/pfr/pfrobjs.c (pfr_face_init): Detect non-scalable fonts
+       correctly.  This fixes Savannah bug #17876.
+
+
+       Do not allocate interpreter-specific tables in memory if we are not
+       going to load glyphs with the bytecode interpreter anyway.
+
+       * src/truetype/ttgload.c (tt_loader_init): Load execution context
+       only if glyph is hinted.
+       Updated.
+       * src/truetype/ttobjs.h (TT_SizeRec): Add members `bytecode_ready'
+       and `cvs_ready'.
+       Add `tt_size_ready_bytecode' declaration.
+       * src/truetype/ttobjs.c (tt_size_done_bytecode,
+       tt_size_init_bytecode, tt_size_ready_bytecode): New functions.
+       (tt_size_init): Move most code into `tt_size_init_bytecode'.
+       (tt_size_done): Move most code into `tt_size_done_bytecode'.
+       (tt_size_reset): Move some code to `tt_size_ready_bytecode'.
+
+
+       Don't extract the metrics table from the SFNT font file.  Instead,
+       reparse it on each glyph load.  The runtime difference is not
+       noticeable, and it can save a lot of heap memory when memory-mapped
+       files are not used.
+
+       * include/freetype/internal/tttypes.h (TT_FaceRec): Add members
+       `horz_metrics_offset' and `vert_metrics_ofset'.
+       * src/sfnt/ttmtx.c (tt_face_load_hmtx, tt_face_get_metrics):
+       Updated.
+
+
+       * src/sfnt/ttcmap.c (tt_cmap4_validate): Slight optimization.
+
+
+       Do not load the CFF index offsets into memory, since this wastes a
+       *lot* of heap memory with large Asian CFF fonts.  There is no
+       significant performance loss.
+
+       * src/cff/cffload.h: Add `cff_charset_cid_to_gindex' declaration.
+       * src/cff/cfftypes.h (CFF_IndexRec): Add fields `start' and
+       `data_size'.
+       (CFF_CharsetRec): Add field `num_glyphs'.
+
+       * src/cff/cffload.c (cff_index_read_offset, cff_index_load_offsets,
+       cff_charset_cid_to_gindex): New functions.
+       (cff_new_index): Renamed to...
+       (cff_index_init): This.  Update all callers.
+       Updated -- some code has been moved to `cff_index_load_offsets'.
+       (cff_done_index): Renamed to...
+       (cff_index_done): This.  Update all callers.
+       (cff_index_get_pointers, cff_index_access_element): Updated to use
+       stream offsets.
+       (cff_charset_compute_cids): Set `num_glyphs' field.
+       (cff_encoding_load): Updated.
+
+       * src/cff/cffgload.c (cff_slot_load): Updated.
+
+2007-01-04  David Turner  <david@freetype.org>
+
+       * docs/INSTALL.UNIX: Simplify some parts, add reference to
+       autogen.sh and pointer to README.CVS.
+
+       * README.CVS: Add common problem description and solution
+       when running autogen.sh.
+
+       * docs/INSTALL: Add reference to MacOS X.
+
+       * docs/MAKEPP, docs/INSTALL.MAC: New documentation files.
+
+       * docs/TODO: Remove obsolete items.
+
+       * src/raster/ftraster.c: (TRaster_Instance): Replace it with...
+       (TWorker): This.
+       Remove `count_table' and `memory'.
+       Make `grays' a pointer.
+       (TRaster): New structure.
+       (count_table): New static array.
+       (RAS_ARGS, RAS_ARG, RAS_VARS, RAS_VAR, FT_UNUSED_RASTER, cur_ras,
+       Vertical_Gray_Sweep_Step, ft_black_new, ft_black_done,
+       ft_black_set_mode, ft_black_render): Updated.
+       (ft_black_init): Don't initialize `count_table'.
+       (ft_black_reset): Use the render pool.  This saves about 6KB of
+       heap space for each FT_Library instance.
+
+       * src/smooth/ftgrays.c (TRaster): Replaced with...
+       (TWorker): This.
+       Remove `memory'.
+       (TRaster): New structure.
+
+       (RAS_ARG_, RAS_ARG, RAS_VAR_, RAS_VAR, ras, gray_render_line,
+       gray_move_to, gray_line_to, gray_conic_to, gray_cubic_to,
+       gray_render_span, gray_raster_render): Updated.
+       (gray_raster_reset): Use the render pool.  This saves about 6KB of
+       heap space for each FT_Library instance.
+
+       * src/sfnt/sfobjs.c, src/sfnt/ttkern.c, src/sfnt/ttkern.h,
+       src/sfnt/ttmtx.c, src/sfnt/ttsbit.c, src/sfnt/ttsbit.h,
+       src/truetype/ttpload.c, include/freetype/config/ftoption.h: Remove
+       FT_OPTIMIZE_MEMORY macro (and code for !FT_OPTIMIZE_MEMORY) since
+       the optimization is no longer experimental.
+
+       * src/pshinter/pshalgo.c (psh_glyph_interpolate_normal_points):
+       Remove a typo that results in no hinting and a memory leak with some
+       large Asian CFF fonts.
+
+       * src/base/ftobjs.c (FT_Done_Library): Remove a subtle memory leak
+       which happens when FT_Done_Library is called with still opened
+       CFF_Faces in it.  We need to close all faces before destroying the
+       modules, or else some bad things (memory leaks) may happen.
+
+2007-01-02  Werner Lemberg  <wl@gnu.org>
+
+       * src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt0_pairs_validate):
+       Remove compiler warning.
+
+2007-01-02  David Turner  <david@freetype.org>
+
+       * src/sfnt/sfobjs.c: Add documentation comment.
+
+2006-12-31  Masatake YAMATO  <jet@gyve.org>
+
+       * src/gxvalid/gxvkern.c (gxv_kern_subtable_fmt0_pairs_validate): New
+       function.
+       Check uniqueness of the gid pairs.
+       (gxv_kern_subtable_fmt0_validate): Move some code to
+       `gxv_kern_subtable_fmt0_pairs_validate'.
+
+2006-12-22  David Turner  <david@freetype.org>
+
+       * src/autofit/aflatin.c, src/truetype/ttgload.c: Remove compiler
+       warnings.
+
+       * builds/win32/visualc/freetype.vcproj: Add _CRT_SECURE_NO_DEPRECATE
+       to avoid deprecation warnings with Visual C++ 8.
+
+2006-12-16  Anders Kaseorg  <anders@kaseorg.com>
+
+       * src/base/ftlcdfil.c (FT_Library_SetLcdFilter)
+       [FT_FORCE_LIGHT_LCD_FILTER]: Fix typo.
+
+2006-12-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * include/freetype/internal/services/svotval.h: Add `volatile' to
+       sync with the modification by Jens Claudius on 2006-08-22; cf.
+         http://cvs.savannah.gnu.org/viewcvs/freetype/freetype2/src/otvalid/otvmod.c?r1=1.4&r2=1.5
+
+2006-12-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftmac.c: Specialized for Mac OS X only.
+       * builds/unix/ftconfig.in: Fixed for ppc64 missing Carbon framework.
+       * builds/unix/configure.raw: Ditto.  When explicit switches for
+       FSSpec/FSRef/QuickDraw/ATS availability are given to configure,
+       builds/mac/ftmac.c is used instead of default src/base/ftmac.c.
+
+2006-12-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/mac/ftmac.c: Copied src/base/ftmac.c for legacy system.
+       * builds/mac/FreeType.m68k_cfm.make.txt: Fix to use builds/mac/ftmac.c
+       instead of src/base/ftmac.c
+       * builds/mac/FreeType.ppc_carbon.make.txt: Ditto.
+       * builds/mac/FreeType.ppc_classic.make.txt: Ditto.
+       * builds/mac/FreeType.m68k_far.make.txt: Ditto, and exclude gxvalid.c
+       that cannot be built at present.
+
+2006-12-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftobjs.c: Improvement of resource fork handler for
+       POSIX, cf.
+         http://lists.gnu.org/archive/html/freetype-devel/2006-10/msg00025.html
+       (Mac_Read_sfnt_Resource): Count only `sfnt' resource of suitcase font
+       format or .dfont, to simulate the face index number counted by ftmac.c.
+       (IsMacResource): Return the number of scalable faces correctly.
+
+2006-12-10  Werner Lemberg  <wl@gnu.org>
+
+       * builds/toplevel.mk (version): Protect against `distclean' target.
+
+2006-12-09  Werner Lemberg  <wl@gnu.org>
+
+       * builds/*/*def.mk, builds/*/detect.mk (CAT): Define to either `cat'
+       or `type'.
+
+       * builds/freetype.mk (version): Extracted from freetype.h, using
+       GNU make's built-in string functions.
+       (refdoc): Use $(version) instead of static version number.
+
+2006-12-08  Werner Lemberg  <wl@gnu.org>
+
+       * builds/toplevel.mk (dist): Extract version number from freetype.h.
+
+2006-12-08  Vladimir Volovich  <vvv@vsu.ru>
+
+       * src/tools/apinames.c (State): Remove final comma in structure --
+       xlc v5 under AIX 4.3 doesn't like this.
+
+2006-12-07  David Turner  <david@freetype.org>
+
+       * src/autofit/afloader.c (af_loader_load_g): Small adjustment
+       to the spacing of auto-fitted glyphs.  This only impacts rare
+       cases (e.g., Arial Bold at rather small character sizes).
+
+2006-12-03  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/rules.mk (SFNT_DRV_SRC): Add ttsbit0.c.
+
+2006-12-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfobjs.c (tt_face_get_name): All Unicode strings are
+       encoded in UTF-16BE.  Patch from Rajeev Pahuja <rpahuja@esri.com>.
+       (tt_name_entry_ascii_from_ucs4): Removed.
+
+
+       * include/freetype/ftxf86.h: Fix and extend comment so that it
+       appears in the documentation.
+
+       * include/freetype/ftchapters.h: Add `font_format' section.
+
+
+       * src/tools/docmaker/tohtml.py (HtmlFormatter::index_exit): Add link
+       to TOC in index page.
+
+2006-11-28  David Turner  <david@freetype.org>
+
+       * src/smooth/ftgrays.c (gray_raster_render): Return 0 when we are
+       trying to render into a zero-width/height bitmap, not an error code.
+
+       * src/truetype/ttobjs.c (tt_face_init): Fix typo in previous patch.
+
+       * src/smooth/ftgrays.c: Remove hard-coded error values; use FreeType
+       ones instead.
+
+       * src/autofit/afhints.c (af_glyph_hints_dump_segments): Remove unused
+       variable.
+
+2006-11-26  Pierre Hanser  <hanser@club-internet.fr>
+
+       * src/truetype/ttobjs.c (tt_face_init): Protect against NULL pointer.
+
+2006-11-25  David Turner  <david@freetype.org>
+
+       * src/autofit/afhints.c (af_glyph_hints_dump_points,
+       af_glyph_hints_dump_segments, af_glyph_hints_dumpedges) [!AF_DEBUG]:
+       Add stubs to link the `ftgrid' test program when debugging is
+       disabled in the auto-hinter.
+
+2006-11-23  David Turner  <david@freetype.org>
+
+       * src/autofit/afhints.c, src/autofit/afhints.h, src/autofit/aflatin.c,
+       src/autofit/aftypes.h: Miscellaneous auto-hinter improvements.
+
+       * src/autofit/afhints.c (af_glyph_hints_dump_segments) [AF_DEBUG]:
+       Emit more sensible information.
+
+       * src/autofit/afhints.h (AF_SegmentRec): Add `height' member.
+
+       * src/autofit/aflatin.c (af_latin_metrics_scale_dim): Improve
+       rounding of blue values.
+       (af_latin_hints_compute_segments): Hint segment heights.
+       (af_latin_hints_link_segments): Reduce `len_score' value.
+       (af_latin_hints_compute_edges): Increase `segment_length_threshold'
+       value and use `height' member for comparisons.
+       (af_latin_hint_edges): Extend logging message.
+       Improve handling of remaining edges.
+
+2006-11-22  Werner Lemberg  <wl@gnu.org>
+
+       Fix Savannah bug #15553.
+
+       * src/truetype/ttgload.c (tt_loader_init): Re-execute the CVT
+       program after a change from mono to grayscaling (and vice versa).
+       Use correct constant for comparison to get `exec->grayscale'.
+
+2006-11-18  Werner Lemberg  <wl@gnu.org>
+
+       Because FT_Load_Glyph expects CID values for CID-keyed fonts, the
+       test for a valid glyph index must be deferred to the font drivers.
+       This patch fixes Savannah bug #18301.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Don't check `glyph_index'.
+       * src/bdf/bdfdrivr.c (BDF_Glyph_Load), src/cff/cffgload.c
+       (cff_slot_load), src/cid/cidgload.c (cid_slot_load_glyph),
+       src/pcf/pcfdrivr.c (PCF_Glyph_Load), src/pfr/pfrobjs.c
+       (pfr_slot_load), src/truetype/ttdriver.c (Load_Glyph),
+       src/type1/t1gload.c (T1_Load_Glyph), src/winfonts/winfnt.c
+       (FNT_Load_Glyph): Check validity of `glyph_index'.
+
+2006-11-13  David Turner  <david@freetype.org>
+
+       * src/truetype/ttinterp.c (FIX_BYTECODE): Undefine.  The interpreter
+       `enhancements' are still too buggy for general use.
+
+       * src/base/ftlcdfil.c: Add support for FT_FORCE_LIGHT_LCD_FILTER and
+       FT_FORCE_LEGACY_LCD_FILTER at compile time.  Define these macros
+       when building the library to change the default LCD filter to be
+       used.  This is only useful for experimentation.
+
+       * include/freetype/ftlcdfil.h: Update documentation.
+
+2006-11-10  David Turner  <david@freetype.org>
+
+       * src/smooth/ftsmooth.c: API change for the LCD
+       filter.  The FT_LcdFilter value is an enumeration describing which
+       filter to apply, with new values FT_LCD_FILTER_LIGHT and
+       FT_LCD_FILTER_LEGACY (the latter implements the LibXft original
+       algorithm which produces strong color fringes for everything
+       except very-well hinted text).
+
+       * include/freetype/ftlcdfil.h (FT_Library_SetLcdFilter): Change
+       second parameter to an enum type.
+
+       * src/base/ftlcdfil.c (USE_LEGACY): Define.
+       (_ft_lcd_filter): Rename to...
+       (_ft_lcd_filter_fir): This.
+       Update parameters.
+       (_ft_lcd_filter_legacy) [USE_LEGACY]: New filter function.
+       (FT_Library_Set_LcdFilter): Update parameters.
+       Handle new filter modes.
+
+       * include/internal/ftobjs.h: Include FT_LCD_FILTER_H.
+       (FT_Bitmap_LcdFilterFunc): Change third argument to `FT_Library'.
+       (FT_LibraryRec) [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Add filtering
+       callback and update other fields.
+
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic)
+       [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Update.
+       Other minor improvements.
+
+       * src/autofit/aflatin.c: Various tiny improvements that drastically
+       improve the handling of serif fonts and of LCD/LCD_V hinting modes.
+       (af_latin_hints_compute_edges): Fix typo.
+       (af_latin_compute_stem_width): Take better care of diagonal stems.
+
+2006-11-09  David Turner  <david@freetype.org>
+
+       * src/pshinter/pshalgo.c (psh_glyph_compute_inflections): Fix
+       typo which created a variable-used-before-initialized bug.
+
+2006-11-07  Zhe Su  <james.su@gmail.com>
+
+       * src/base/ftsynth.c (FT_GlyphSlot_Embolden): Handle vertical layout
+       also.
+
+2006-11-03  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftcalc.c: Don't use `long long' but `FT_Int64'.
+
+2006-11-02  David Turner  <david@freetype.org>
+
+       Add a few tweaks to better handle serif fonts.
+       Add more debugging messages.
+
+       * src/autofit/aflatin.c (af_latin_hints_compute_edges): Ignore
+       segments that are less than 1.5 pixels high.  This gets rid of
+       *many* corner cases with serifs.
+       (af_latin_align_linked_edge): Add logging message.
+       (af_latin_hint_edges): Use AF_HINTS_DO_BLUES.
+       Add logging messages.
+       Handle AF_EDGE_FLAG flag specially.
+
+       * src/autofit/afmodule.c [AF_DEBUG]: Add _af_debug,
+       _af_debug_disable_blue_hints, and _af_debug_hints variables.
+
+       * src/autofit/aftypes.h (AF_LOG) [AF_DEBUG]: Use _af_debug.
+       Update external declarations.
+       (af_corner_orientation, af_corner_is_flat): Replaced by...
+
+       * include/freetype/internal/ftcalc.h (ft_corner_orientation,
+       ft_corner_is_flat): These declarations.
+
+       * src/autofit/afangles.c (af_corner_orientation, af_corner_is_flat):
+       Comment out.  Replaced by...
+
+       * src/base/ftcalc.h (ft_corner_orientation, ft_corner_is_flat):
+       These functions.  Update all callers.
+       (FT_Add64) [!FT_LONG64]: Simplify.
+
+       * src/autofit/afhints.c: Include FT_INTERNAL_CALC_H.
+       (af_direction_compute): Add a missing FT_ABS call.  This bug caused
+       production of garbage by missing lots of segments.
+
+       * src/autofit/afhints.h (AF_HINTS_DO_BLUES): New macro.
+
+       * src/autofit/afloader.c (af_loader_init, af_loader_done)
+       [AF_DEBUG]: Set _af_debug_hints.
+
+
+       * src/pshinter/pshalgo.c: Include FT_INTERNAL_CALC_H.
+       (psh_corner_is_flat, psh_corner_orientation): Use ft_corner_is_flat
+       and ft_corner_orientation.
+
+
+       * src/gzip/inftrees.c (huft_build): Remove compiler warning.
+
+2006-10-24  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffload.c (cff_encoding_load): Remove unused variable.
+
+       * src/base/ftobjs.c (FT_Select_Charmap): Disallow FT_ENCODING_NONE
+       as argument.
+
+2006-10-23  Zhe Su  <zsu@novell.com>
+
+       * src/base/ftoutln.c (FT_Outline_Get_Orientation): Re-implement to
+       better deal with broken Asian fonts with strange glyphs, having
+       self-intersections and other peculiarities.  The used algorithm is
+       based on the nonzero winding rule.
+
+2006-10-23  David Turner  <david@freetype.org>
+
+       Speed up the CFF font loader.  With some large CFF fonts,
+       FT_Open_Face is now more than three times faster.
+
+       * src/cff/cffload.c (cff_get_offset): Removed.
+       (cff_new_index): Inline functionality of `cff_get_offset'.
+       (cff_charset_compute_cids, cff_charset_free_cids): New functions.
+       (cff_charset_done): Call `cff_charset_free_cids'.
+       (cff_charset_load): Call `cff_charset_compute_cids'.
+       (cff_encoding_load) <Populate>: Ditto, to replace inefficient loop.
+
+       * src/sfnt/ttmtx.c (tt_face_load_hmtx): Replace calls to FT_GET_XXX
+       with FT_NEXT_XXX.
+
+
+       Speed up the Postscript hinter, with more than 100% speed increase
+       on my machine.
+
+       * src/pshinter/pshalgo.c (psh_corner_is_flat,
+       psh_corner_orientation): New functions.
+       (psh_glyph_compute_inflections): Merge loops for efficiency.
+       Use `psh_corner_orientation'.
+       (psh_glyph_init): Use `psh_corner_is_flat'.
+       (psh_hint_table_find_strong_point): Renamed to...
+       (psh_hint_table_find_strong_points): This.
+       Rewrite, adding argument to handle all points at once.
+       Update all callers.
+       (PSH_MAX_STRONG_INTERNAL): New macro.
+       (psh_glyph_interpolate_normal_points): Rewrite for efficiency.
+
+2006-10-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftmac.c (FT_New_Face_From_FOND): Initialize variable
+       `error' with FT_Err_Ok.
+
+2006-10-14  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * docs/INSTALL.CROSS: New document file for cross-building.
+
+       * builds/unix/configure.raw: Preliminary cross-building support.
+       Find native C compiler and pass it by CC_BUILD, and
+       find suffix for native executable and pass it by EXEEXT_BUILD.
+       Also suffix for target executable is passed by EXEEXT.
+
+       * builds/unix/unix-cc.in (CCraw_build, E_BUILD): New variables to
+       build `apinames' which runs on building system.  They are set by
+       CC_BUILD and EXEEXT_BUILD.
+
+       * builds/exports.mk (APINAMES_EXE): Change the extension for
+       apinames from the suffix for target (E) to that for building host
+       (E_BUILD).
+
+2006-10-12  Werner Lemberg  <wl@gnu.org>
+
+       * docs/INSTALL.UNX, docs/UPGRADE.UNX: Renamed to...
+       * docs/INSTALL.UNIX, docs/UPGRADE.UNIX: This.  Update all documents
+       which reference those files.
+
+2006-10-12  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * builds/unix/configure.raw (FT2_EXTRA_LIBS): New variable.  It is
+       embedded in freetype2.pc and freetype-config.  Use it to record
+       Carbon dependency of MacOSX.
+
+       * builds/unix/freetype2.in: Embed FT2_EXTRA_LIBS.
+
+       * builds/unix/freetype-config.in: Ditto.
+
+2006-10-11  Werner Lemberg  <wl@gnu.org>
+
+       * devel/ftoption.h (FT_CONFIG_OPTION_SUBPIXEL_RENDERING): Define for
+       development.
+
+2006-10-03  Jens Claudius  <jens.claudius@yahoo.com>
+
+       * include/freetype/config/ftstdlib.h: Cast away volatileness from
+       argument to ft_setjmp.
+
+       * include/freetype/internal/ftvalid.h: Add comment that
+       ft_validator_run must not be used.
+
+2006-10-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftbase.c: Undo change from 2006-09-30.
+
+       * src/base/rules.mk (BASE_SRC): Remove `ftlcdfil.c'.
+
+2006-09-30  David Turner  <david@freetype.org>
+
+       * include/freetype/internal/ftobjs.h (FT_Face_InternalRec):
+       s/unpatented_hinting/ignore_unpatented_hinter/.
+       Update all callers.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Refine the algorithm whether
+       auto-hinting shall be used or not.
+
+       * src/truetype/ttobjs.c (tt_face_init): Ditto.
+
+2006-09-30  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/rules.mk (BASE_SRC): Remove `ftapi.c' (which is no longer
+       in use).
+
+       * src/base/ftbase.c: Include `ftlcdfil.c'.
+
+2006-09-29  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttcmap.c (tt_cmap4_char_map_binary): Fix algorithm for
+       overlapping segments.  Bug reported by Stefan Koch.
+
+2006-09-28  David Turner  <david@freetype.org>
+
+       Fix a bug in the automatic unpatented hinting support which prevents
+       normal bytecode hinting to work properly.
+
+       * include/freetype/internal/ftobjs.h (FT_Face_InternalRec):
+       s/force_autohint/unpatented_hinting/.  Update all callers.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Updated code.
+
+       * src/autofit/aftypes.h (AF_DEBUG): Undefine to get rid of traces.
+
+2006-09-27  David Turner  <david@freetype.org>
+
+       * include/freetype/freetype.h (FT_FREETYPE_PATCH): Set to 2.
+
+
+       Add a new API to support color filtering of subpixel glyph bitmaps.
+       In a default build, the function `FT_Library_SetLcdFilter' returns
+       `FT_Err_Unimplemented_Feature'; you need to #define
+       FT_CONFIG_OPTION_SUBPIXEL_RENDERING in ftoption.h to compile the
+       real implementation.
+
+       * include/freetype/ftlcdfil.h, src/base/ftlcdfil.c: New files.
+
+       * include/freetype/internal/ftobjs.h (FT_Bitmap_LcdFilterFunc): New
+       typedef.
+       (FT_LibraryRec) [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: New members
+       `lcd_filter_weights' and `lcd_filter'.
+
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic): Remove arguments
+       `hmul' and `vmul'.
+
+       Handle subpixel rendering.
+       Simplify function.
+       (ft_smooth_render_lcd): Use `FT_RENDER_MODE_LCD'.
+       (ft_smooth_render_lcd_v): Use `FT_RENDER_MODE_LCD_V'.
+
+       * include/freetype/config/ftheader.h (FT_LCD_FILTER_H): New macro,
+       pointing to <freetype/ftlcdfil.h>.
+
+       * src/base/Jamfile (_sources), src/base/rules.mk (BASE_SRC),
+       vms_make.com: Add `ftlcdfil.c' to the list of compiled source files.
+
+       * modules.cfg (BASE_EXTENSIONS): Add ftlcdfil.c.
+
+2006-09-26  David Bustin
+
+       * src/pfr/pfrobjs.c (pfr_face_get_kerning): Skip adjustment bytes
+       correctly.  Reported as Savannah bug #17843.
+
+2006-09-26  David Turner  <david@freetype.org>
+
+       * src/autofit/afhints.h (AF_HINTS_DO_HORIZONTAL,
+       AF_HINTS_DO_VERTICAL, AF_HINTS_DO_ADVANCE): New macros to disable
+       horizontal and vertical hinting for the purpose of debugging the
+       auto-fitter.
+
+       * src/autofit/afmodule.c (_af_debug_disable_horz_hints,
+       _af_debug_disable_vert_hints) [AF_DEBUG]: New global variables.
+
+       * src/autofit/aftypes.h [AF_DEBUG]: Declare above variables.
+
+       * include/freetype/config/ftoption.h, devel/ftoption.h
+       (FT_CONFIG_OPTION_SUBPIXEL_RENDERING): New macro to control whether
+       we want to compile LCD-optimized rendering code (à la ClearType) or
+       not.  The macro *must* be disabled in default builds of the library
+       for patent reasons.
+
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic): Disable
+       LCD-specific rendering when FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+       isn't defined at compile time.  This only changes the content of the
+       rendered glyph to match the one of normal gray-level rendering,
+       hence clients should not need to be modified.
+
+       * docs/CHANGES: Updated.
+
+2006-09-18  Garrick Meeker  <garrick@digitalanarchy.com>
+
+       * src/base/ftmac.c (FT_New_Face_From_FOND): Fall back to SFNT if
+       LWFN fails and both are available.
+
+2006-09-11  David Turner  <david@freetype.org>
+
+       * src/sfnt/sfobjs.c (tt_face_get_name): Support some fonts which
+       report their English names through an Apple Roman
+       (platform,encoding) pair, with language_id != English.
+
+       If the font uses another name entry with language_id == English, it
+       will be selected correctly, though.
+
+       * src/truetype/ttobjs.c (tt_face_init): Add unpatented hinting
+       selection for `mingli.ttf'.
+
+2006-09-05  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttpload.c (tt_face_load_hdmx): Handle `record_size'
+       values which have the upper two bytes set to 0xFF instead of 0x00
+       (as it happens in at least two CJKV fonts, `HAN NOM A.ttf' and
+       `HAN NOM B.ttf').
+
+       * src/smooth/ftgrays.c [GRAYS_USE_GAMMA]: Really remove all code.
+
+2006-09-05  David Turner  <david@freetype.org>
+
+       Minor source cleanups and optimizations.
+
+       * src/smooth/ftgrays.c (GRAYS_COMPACT): Removed.
+       (TRaster): Remove `count_ex' and `count_ey'.
+       (gray_find_cell): Remove 2nd and 3rd argument.
+       (gray_alloc_cell): Merged with `gray_find_cell'.
+       (gray_record_cell): Simplify.
+       (gray_set_cell): Rewrite.
+       (gray_start_cell): Apply offsets to `ras.ex' and `ras.ey'.
+       (gray_render_span): Don't use FT_MEM_SET for small values.
+       (gray_dump_cells) [DEBUG_GRAYS]: New function.
+       (gray_sweep): Avoid buffer overwrites when to drawing the end of a
+       bitmap scanline.
+       (gray_convert_glyph): Fix speed-up.
+
+2006-09-04  David Turner  <david@freetype.org>
+
+       * src/smooth/ftgrays.c (gray_convert_glyphs): Make it work with
+       64bit processors.
+
+2006-09-03  Werner Lemberg  <wl@gnu.org>
+
+       * devel/ftoption.h: Synchronize with
+       include/freetype/config/ftoption.h.
+
+       * src/smooth/ftgrays.c (gray_record_cell): Remove shadowing
+       variable declaration.
+       (gray_convert_glyph): Fix compiler warnings.
+
+2006-09-01  David Turner  <david@freetype.org>
+
+       * src/truetype/ttobjs.c (tt_face_init): Update the TrueType loader
+       to recognize a few fonts that require the automatic unpatented
+       loader.
+
+       * src/smooth/ftgrays.c: Optmize the performance of the anti-aliased
+       rasterizer.  The speed improvement is between 15% and 25%, depending
+       on the font data.
+
+       (GRAYS_USE_GAMMA, GRAYS_COMPACT): Removed, and all associated code.
+       (TCell): Redefine.
+       (TRaster): New members `buffer', `buffer_size', `ycells', `ycount'.
+       (gray_init_cells): Updated.
+       (gray_find_cell, gray_alloc_cell): New functions.
+       (gray_record_cell): Rewritten to use `gray_find_cell' and
+       `gray_alloc_cell'.
+       (PACK, LESS_THAN, SWAP_CELLS, DEBUG_SORT, QUICK_SORT, SHELL_SORT,
+       QSORT_THRESHOLD):
+       Removed.
+       (gray_shell_sort, gray_quick_sort, gray_check_sort,
+       gray_dump_cells): Removed.
+       (gray_sweep): Rewritten.
+       (gray_convert_glyph): Rewrite code which used one of the sorting
+       functions.
+       (gray_raster_render): Updated.
+
+2006-08-29  Dr. Werner Fink  <werner@suse.de>
+
+       * configure: Make it possible to handle configure options which
+       have strings containing spaces.
+
+2006-08-27  David Turner  <david@freetype.org>
+
+       * include/freetype/config/ftoption.h (TT_USE_BYTECODE_INTERPRETER):
+       New macro, defined if either TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+       or TT_CONFIG_OPTION_UNPATENTED_HINTING is defined.
+
+       * include/freetype/internal/ftcalc.h, src/base/ftcalc.c,
+       src/truetype/truetype.c, src/truetype/ttdriver.c,
+       src/truetype/ttgload.c, src/truetype/ttgload.h,
+       src/truetype/ttinterp.c, src/truetype/ttobjs.c,
+       src/truetype/ttobjs.h, src/truetype/ttpload.c, src/type42/t42drivr.c:
+       s/TT_CONFIG_OPTION_BYTECODE_INTERPRETER/TT_USE_BYTECODE_INTERPRETER/.
+
+       * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): New
+       member `force_autohint'.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Use `force_autohint'.
+
+       * src/truetype/ttobjs.c (tt_face_init): Prepare code for testing
+       against a list of font names which need the bytecode interpreter.
+
+2006-08-27  Jens Claudius  <jens.claudius@yahoo.com>
+
+       Fix miscellaneous compiler warnings.
+
+       * include/freetype/internal/ftobjs.h: Close comment with `*/' to
+       avoid `/* in comment' compiler warning.
+
+       * src/base/ftdbgmem.c (ft_mem_table_get_source): Turn cast
+       `(FT_UInt32)(void*)' into `(FT_UInt32)(FT_PtrDist)(void*)' since on
+       64-bit platforms void* is larger than FT_UInt32.
+
+       * src/base/ftobjs.c (t_validator_error): Cast away
+       volatileness of argument to ft_longjmp.  Spotted by Werner
+       `Putzfrau' Lemberg.
+
+       * src/bdf/bdflib.c (bdf_load_font): Initialize local
+       variable `lineno'.
+
+       * src/gxvalid/gxvmod.c (classic_kern_validate): Mark local variable
+       `error' as volatile.
+
+2006-08-27  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/ftconfig.in: Synchronize with main ftconfig.h.
+       Reported by Jens.
+
+2006-08-22  Jens Claudius  <jens.claudius@yahoo.com>
+
+       Fix for previous commit, which caused many compiler warnings/errors
+       about addresses of volatile objects passed as function arguments as
+       non-volatile pointers.
+
+       * include/freetype/internal/ftvalid.h: Make FT_Validator typedef a
+       pointer to a volatile object.
+
+       * src/gxvalid/gxvmod.c (gxv_load_table): Make function argument
+       `table' a pointer to a volatile object.
+
+       * src/otvalid/otvmod.c (otv_load_table): Make function argument
+       `table' a pointer to a volatile object.
+
+2006-08-18  Jens Claudius  <jens.claudius@yahoo.com>
+
+       * src/gxvalid/gxvmod.c (GXV_TABLE_DECL): Mark local variable `_sfnt'
+       as volatile since it must keep its value across a call to ft_setjmp.
+       (gxv_validate): Same for local variables `memory' and `valid'.
+       (classic_kern_validate): Same for local variables `memory',
+       `ckern', and `valid'.
+
+       * src/otvalid/otvmod.c (otv_validate): Same for function parameter
+       `face' and local variables `base', `gdef', `gpos', `gsub', `jstf',
+       and 'valid'.
+
+       * src/sfnt/ttcmap.c (tt_face_build_cmaps): Same for local variable
+       `cmap'.
+
+2006-08-16  David Turner  <david@freetype.org>
+
+       * src/cid/cidgload.c (cid_slot_load_glyph): Remove compiler
+       warnings.
+
+       * src/base/ftobjs.c (ft_validator_run): Disable function; it is
+       buggy by design.  Always return -1.
+
+
+       Improvements to native TrueType hinting.  This is a first try,
+       controlled by the FIX_BYTECODE macro in src/truetype/ttinterp.c.
+
+       * include/freetype/internal/ftgloadr.h (FT_GlyphLoadRec): Add member
+       `extra_points2'.
+
+       * include/freetype/internal/tttypes.h (TT_GlyphZoneRec): Add member
+       `orus'.
+
+       * src/base/ftgloadr.c (FT_GlyphLoader_Reset,
+       FT_GlyphLoader_Adjust_Points, FT_GlyphLoader_CreateExtra,
+       FT_GlyphLoader_CheckPoints, FT_GlyphLoader_CopyPoints): Updated to
+       handle `extra_points2'.
+
+       * src/truetype/ttgload.c (tt_prepare_zone): Handle `orus'.
+       Remove compiler warning.
+       (cur_to_arg): Remove macro.
+       (TT_Hint_Glyph): Updated.
+       (TT_Process_Simple_Glyph): Handle `orus'.
+
+       * src/truetype/ttinterp.c (FIX_BYTECODE): New macro.
+       (Ins_MD, Ins_MDRP, Ins_IP) [FIX_BYTECODE]: Handle `orus'.
+       (LOC_Ins_IUP): Renamed to...
+       (IUP_WorkerRec): This.
+       Add `orus' member.
+       (Shift): Renamed to...
+       (_iup_worker_shift): This.
+       Updated.
+       (Interp): Renamed to...
+       (_iup_worker_interpolate): This.
+       Updated to handle `orus'.
+       (Ins_IUP): Updated.
+
+       * src/truetype/ttobjs.c (tt_glyphzone_done, tt_glyphzone_new):
+       Handle `orus'.
+
+2006-08-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * modules.cfg (BASE_EXTENSIONS): Compile in ftgxval.c by default to
+       build ftvalid in ft2demos.  This has been inadvertedly changed
+       2006-08-13.
+
+2006-08-15  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       `ft_validator_run' wrapping `setjmp' can cause a crash, as found by
+       Jens:
+       http://lists.gnu.org/archive/html/freetype-devel/2006-08/msg00004.htm.
+
+       * src/otvalid/otvmod.c: Replace `ft_validator_run' by `ft_setjmp'.
+       It reverts the change introduced on 2005-08-20.
+
+       * src/gxvalid/gxvmod.c: Ditto.
+
+2006-08-13  Jens Claudius  <jens.claudius@yahoo.com>
+
+       * finclude/freetype/internal/psaux.h: (T1_TokenType): Add
+       T1_TOKEN_TYPE_KEY.
+       (T1_FieldRec): Add `dict'.
+       (T1_FIELD_DICT_FONTDICT, T1_FIELD_DICT_PRIVATE): New macros.
+       (T1_NEW_XXX, T1_FIELD_XXX): Update to take the dictionary where a PS
+       keyword is expected as an additional argument.
+
+       * src/cid/cidload.c: (cid_field_records): Adjust invocations of
+       T1_FIELD_XXX.
+
+       * src/cid/cidtoken.h: Adjust invocations of T1_FIELD_XXX.
+
+       * src/psaux/psobjs.c: Add macro FT_COMPONENT for tracing.
+       (ps_parser_to_token): Report a PostScript key as T1_TOKEN_TYPE_KEY,
+       not T1_TOKEN_TYPE_ANY.
+       (ps_parser_load_field): Make sure a token that should be a string or
+       name is really a string or name.
+       Avoid memory leak if a keyword has been already encountered and its
+       value is overwritten.
+       * src/type1/t1load.c: (t1_keywords): Adjust invocations of
+       T1_FIELD_XXX.
+       (parse_dict): Ignore keywords that occur in the wrong dictionary
+       (e.g., in `Private' instead of `FontDict').
+
+       * src/type1/t1tokens.h: Adjust invocations of T1_FIELD_XXX.
+
+       * src/type42/t42parse.c: (t42_keywords): Adjust invocations of
+       T1_FIELD_XXX.
+
+2006-07-18  Jens Claudius  <jens.claudius@yahoo.com>
+
+       Move creation of field `buildchar' of T1_DecoderRec out of
+       `t1_decoder_init' and let the caller of `t1_decoder_init' take care
+       of it.
+
+       Call the finisher for T1_Decoder in `cid_face_compute_max_advance'
+       and `T1_Compute_Max_Advance'.
+
+       * include/freetype/internal/psaux.h (T1_DecoderRec): Remove field
+       `face', add `len_buildchar'.
+
+       * include/freetype/internal/t1types.h (T1_FaceRec): Add field
+       `buildchar'.
+
+       * src/cid/cidgload.c (cid_face_compute_max_advance): Call finisher
+       for T1_Decoder.
+       (cid_slot_load_glyph): Do not ignore failure when initializing the
+       T1_Decoder.
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Updated.
+       (t1_decoder_init): Remove initialization of fields `buildchar' and
+       `len_buildchar'.
+       (t1_decoder_done): Remove deallocation of field `buildchar'.
+
+       * freetype/src/type1/t1gload.c (T1_Compute_Max_Advance): Initialize
+       T1_Decoder's `buildchar' and `len_buildchar'; call finisher for
+       T1_Decoder.
+       (T1_Load_Glyph): Initialize T1_Decoder's `buildchar' and
+       `len_buildchar'; make sure to call finisher for T1_Decoder even in
+       case of error.
+
+       * src/type1/t1load.c (T1_Open_Face): Allocate new field `buildchar'
+       of T1_FaceRec.
+
+       * src/type1/t1objs.c (T1_Face_Done): Free new field `buildchar' of
+       T1_FaceRec.
+
+2006-07-14  Jens Claudius  <jens.claudius@yahoo.com>
+
+       * include/freetype/internal/psaux.h: New macros IS_PS_NEWLINE,
+       IS_PS_SPACE, IS_PS_SPECIAL, IS_PS_DELIM, IS_PS_DIGIT, IS_PS_XDIGIT,
+       and IS_PS_BASE85 (from src/psaux/psconv.h).
+       (T1_FieldLocation): Add T1_FIELD_LOCATION_LOADER,
+       T1_FIELD_LOCATION_FACE, and T1_FIELD_LOCATION_BLEND.
+       (T1_DecoderRec): New fields `buildchar' and `face'.
+       (IS_PS_TOKEN): New macro.
+
+       * include/freetype/internal/t1types.h (T1_FaceRec): New fields
+       `ndv_idx', `cdv_idx', and `len_buildchar'.
+
+       * include/freetype/t1tables.h (PS_BlendRec): New fields
+       `default_design_vector' and `num_default_design_vector'.
+
+       * src/psaux/psconv.h: Move macros IS_PS_NEWLINE, IS_PS_SPACE,
+       IS_PS_SPECIAL, IS_PS_DELIM, IS_PS_DIGIT, IS_PS_XDIGIT, and
+       IS_PS_BASE85 to include/freetype/internal/psaux.h.
+
+       * src/psaux/psobjs.c (ps_parser_to_token_array): Allow `token'
+       argument to be NULL if we want only to count the number of tokens.
+       (ps_tocoordarray): Allow `coords' argument to be NULL if we just
+       want to skip the array.
+       (ps_tofixedarray): Allow `values' argument to be NULL if we just
+       want to skip the array.
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Add support
+       for (partially commented out) othersubrs 19-25, 27, and 28.
+       (t1_decoder_init): Initialize new fields `face' and `buildchar'.
+       (t1_decoder_done): Release new field `buildchar'.
+
+       * src/type1/t1load.c (parse_buildchar, parse_private): New
+       functions.
+       (t1_keywords): Register them.
+       (t1_allocate_blend): Updated.
+       (t1_load_keyword): Handle field types T1_FIELD_LOCATION_LOADER,
+       T1_FIELD_LOCATION_FACE and T1_FIELD_LOCATION_BLEND.
+       (parse_dict): Remove `keyword_flags' argument.
+       Use new macro IS_PS_TOKEN.
+       Changed function so that later PostScript definitions override
+       earlier ones.
+       (t1_init_loader): Initialize new field `keywords_encountered'.
+       (T1_Open_Face): Initialize new fields `ndv_idx', `cdv_idx', and
+       `len_buildchar'.
+       Remove `keywords_flags'.
+
+       * src/type1/t1load.h (T1_LoaderRect): New field
+       `keywords_encountered'.
+       (T1_PRIVATE, T1_FONTDIR_AFTER_PRIVATE): New macros.
+
+       * src/type1/t1tokens.h [!T1_CONFIG_OPTION_NO_MM_SUPPORT]: New
+       entries for parsing /NDV, /CDV, and /DesignVector.
+
+2006-07-07  Werner Lemberg  <wl@gnu.org>
+
+       Add many checks to protect against malformed PCF files.
+
+       * src/pcf/pcfdrivr.c (PCF_Face_Done): Protect against NULL pointers.
+       (PCF_Face_Init): Add calls to PCF_Face_Done in case of errors.
+
+       * src/pcf/pcfread.c (pcf_read_TOC): Protect against malformed table
+       data and check that tables don't overlap (using a simple
+       bubblesort).
+       (PCF_METRIC_SIZE, PCF_COMPRESSED_METRIC_SIZE, PCF_PROPERTY_SIZE):
+       New macros which give the size of data structures in the data
+       stream.
+       (pcf_get_properties): Use rough estimates to get array size limits.
+       Assign `face->nprops' and `face->properties' earlier so that a call
+       to PCF_Face_Done can do the clean-up in case of error.
+       Protect against invalid string offsets.
+       (pcf_get_metrics): Clean up code.
+       Adjust tracing message levels.
+       Use rough estimate to get array size limit.
+       (pcf_get_bitmaps): Clean up code.
+       Adjust tracing message levels.
+       Use rough estimates to get offset limits.
+       (pcf_get_encodings): Adjust tracing message level.
+       (pcf_get_accel): Clean up code.
+
+2006-06-26  Werner Lemberg  <wl@gnu.org>
+
+       * src/bdf/bdfdrivr.c (BDF_Face_Init): Handle fonts correctly which
+       don't have a POINT_SIZE property.  This fixes Savannah bug #16914.
+
+2006-06-26  Jens Claudius  <jens.claudius@yahoo.com>
+
+       * src/psaux/t1decode.c (T1_Operator, t1_args_count): Add opcode 15.
+       (t1_decoder_parse_charstrings): Operator with
+       opcode 15 pops its two arguments.
+       Handle the case where the pops of an othersubr may be part of a
+       subroutine.
+       Handle unknown othersubrs gracefully: count their operands and let
+       the following pop operators push the operands as the results onto
+       the Type1 stack.
+       Improve handling of setcurrentpoint opcode.
+
+2006-06-25  Jens Claudius  <jens.claudius@yahoo.com>
+
+       The Type 1 parser now skips over top-level procedures as required
+       for a `Simplified Parser'.  This makes the parser more robust as it
+       doesn't poke around in PostScript code.  Additionally, it makes the
+       FontDirectory hackery in src/type1/t1load.c unnecessary.
+
+       * src/psaux/psobjs.c (IS_OCTAL_DIGIT): New macro.
+       (skip_literal_string): Add FT_Error as return value.
+       Handle escapes better.
+       (skip_string): Add FT_Error as return value.
+       Don't set `parser->error' but return error code directly.
+       (skip_procedure): New function.
+       (ps_parser_skip_PS_token): Handle procedures.
+       Update code.
+       (ps_parser_to_token): Update code.
+       (ps_parser_load_field_table): Handle bbox entries also.
+
+       * src/type1/t1load.c (parse_dict): Remove FontDirectory hackery.
+       Add commented-out code for synthetic fonts.
+
+2006-06-24  Eugeniy Meshcheryakov  <eugen@univ.kiev.ua>
+
+       Fix two hinting bugs as reported in
+       http://lists.gnu.org/archive/html/freetype-devel/2006-06/msg00057.html.
+
+       * include/freetype/internal/tttypes.h (TT_GlyphZoneRec): Add
+       `first_point' member.
+
+       * src/truetype/ttgload.c (tt_prepare_zone): Initialize
+       `first_point'.
+       (TT_Process_Composite_Glyph): Always untouch points.
+
+       * src/truetype/ttinterp.c (Ins_SHC): Fix computation of
+       `first_point' and `last_point' in case of composite glyphs.
+       (Ins_IUP): Fix computation of `end_point'.
+
+2006-06-22  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Insert EndianS16_BtoN and EndianS32_BtoN as workaround for Intel
+       Mac.  The original patch was written by David Sachitano and Lawrence
+       Coopet, and modified by Sean McBride for MPW compatibility.  Only
+       required data are converted; unused data are left in big endian.
+
+       * src/base/ftmac.c: Include <Endian.h> for byteorder macros for non
+       Mac OS X platforms.
+       (OS_INLINE): Undefine before definition.
+       (count_faces_sfnt): Insert EndianS16_BtoN to parse the header of
+       FontAssociation table in FOND resource.
+       (count_faces_scalable): Insert EndianS16_BtoN to parse the header
+       and fontSize at each entry of FontAssociation table in FOND
+       resource.
+       (parse_fond): Insert EndianS16_BtoN and EndianS32_BtoN to parse
+       ffStylOff of FamilyRecord header of FOND resource, the header,
+       fontSize, fontID at each entry of FontAssociation table, and
+       StyleMapping table.
+       (count_faces): Call `HUnlock' after all FOND utilization.
+
+2006-06-08  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Public API of TrueTypeGX, OpenType, and classic kern table validator
+       should return `FT_Err_Unimplemented_Feature' if validation service
+       is unavailable (disabled in `modules.cfg').  It is originally
+       suggested by David Turner, cf.
+       http://lists.gnu.org/archive/html/freetype-devel/2005-11/msg00078.html
+
+       * src/base/ftgxval.c (FT_TrueTypeGX_Validate): Return
+       FT_Err_Unimplemented_Feature if TrueTypeGX validation service is
+       unavailable.
+       (FT_ClassicKern_Validate): Return FT_Err_Unimplemented_Feature if
+       classic kern table validation service is unavailable.
+
+       * src/base/ftotval.c (FT_OpenType_Validate): Return
+       FT_Err_Unimplemented_Feature if OpenType validation service is
+       unavailable.
+
+2006-06-08  Werner Lemberg  <wl@gnu.org>
+
+       * src/bdf/bdflib.c (bdf_load_font): Fix memory leaks in case of
+       errors.
+
+2006-06-07  David Turner  <david@freetype.org>
+
+       * src/type1/t1afm.c (KERN_INDEX): Make it more robust.
+       (T1_Read_Metrics): Fix memory leak which happened when the metrics
+       file doesn't have kerning pairs.  This fixes Savannah bug #16768.
+
+2006-06-06  David Turner  <david@freetype.org>
+
+       Fix memory leak described in Savannah bug #16759.
+
+       We change `ps_unicodes_init' so that it also takes a
+       `free_glyph_name' callback to release the glyph names returned by
+       `get_glyph_name'
+
+       * include/freetype/internal/services/svpscmap.h (PS_Glyph_NameFunc):
+       Renamed to ...
+       (PS_GetGlyphNameFunc): This.
+       (PS_FreeGlyphNameFunc): New typedef.
+       (PS_Unicodes_InitFunc): Add variable for PS_FreeGlyphNameFunc.
+
+       * src/cff/cffcmap.c (cff_sid_to_glyph_name): Use `TT_Face' for first
+       argument.
+       (cff_sid_free_glyph_name): New function.
+       (cff_cmap_unicode_init): Updated.
+
+       * src/psaux/t1cmap.c (t1_cmap_unicode_init): Updated.
+
+       * src/psnames/psmodule.c (ps_unicodes_init): Add variable for
+       PS_FreeGlyphNameFunc and use it.
+
+
+2006-06-04  David Turner  <david@freetype.org>
+
+       * src/base/ftutil.c (ft_mem_qrealloc): Fix the function to accept
+       `item_size == 0' as well -- though this sounds weird, it can
+       theoretically happen.  This fixes Savannah bug #16669.
+
+       * src/pfr/pfrobjs.c (pfr_face_init): Fix the computation
+       of `face->num_glyphs' which missed the last glyph, due to
+       the offset-by-1 computation, since the PFR format doesn't
+       guarantee that glyph index 0 corresponds to the `missing
+       glyph.  This fixes Savannah bug #16668.
+
+2006-05-25  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/unix-cc.in (LINK_LIBRARY): Don't comment out
+       `-no-undefined'.  Reported by Christian Biesinger.
+
+2006-05-19  Brian Weed  <bw@imaginengine.com>
+
+       * builds/win32/visualc/freetype.dsp: Release libraries no longer
+       have debug information, and debug libraries use `C7 compatible'
+       debug info.
+
+2006-05-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       Apply patch by Derek Clegg to fix two memory leaks in the MacOS
+       resource fork handler.  This fixes Savannah bug #16631.
+
+       * src/base/ftobjs.c (load_face_in_embedded_rfork): Replace
+       `FT_Stream_Close' by `FT_Stream_Free' to fix memory leak.
+
+       * src/base/ftrfrk.c (raccess_guess_linux_double_from_file_name):
+       Replace `FT_Stream_Close' by `FT_Stream_Free' to fix memory leak.
+
+2006-05-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * build/unix/configure.raw: Add a fallback to disable Carbon
+       dependency, if configured with no options on Mac OS X.
+
+2006-05-19  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       * src/base/ftmac.c (open_face_from_buffer): Deallocate stream when
+       its content cannot be parsed as supported font.  This fixes
+       the second part of Savannah bug #16590.
+
+2006-05-18  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgload.c (TT_Load_Composite_Glyph)
+       [FT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Make it compilable again.
+
+2006-05-17  David Turner  <david@freetype.org>
+
+       This is a major patch used to drastically improve the performance of
+       loading glyphs.  This both speeds up loading the glyph vectors
+       themselves and the auto-fitter module.
+
+       We now use inline assembler code with GCC to implement `FT_MulFix',
+       which is probably the most important function related to the
+       engine's performance.
+
+       The resulting speed-up is about 25%.
+
+
+       * include/freetype/internal/tttypes.h (TT_LoaderRec): Add fields
+       `cursor' and `limit'.
+
+       * src/autofit/afangles.c (af_corner_is_flat, af_corner_orientation):
+       New functions.
+       (AF_ATAN_BITS, af_arctan, af_angle_atan): Comment out.
+       [TEST]: Remove.
+
+       * src/autofit/afcjk.c (AF_Script_UniRangeRec): Comment out test
+       code.
+
+       * src/autofit/afhints.c (af_axis_hints_new_segment): Don't call
+       `FT_ZERO'
+       (af_direction_compute, af_glyph_hints_compute_inflections): Rewritten.
+       (af_glyph_hints_reload: Rewrite recognition of weak points.
+
+       * src/autofit/aflatin.c (af_latin_hints_compute_segments): Move
+       constant values out of the loops.
+
+       * src/autofit/aftypes.h: Updated.
+
+       * src/base/ftcalc.c (FT_MulFix): Use inline assembler code.
+
+       * src/base/ftoutln.c (FT_Outline_Get_Orientation): Use vector
+       product to get orientation.
+
+       * src/gzip/ftgzip.c (ft_get_uncompressed_size): New function.
+       (FT_Stream_OpenGzip): Use it to handle small files directly in
+       memory.
+
+       * src/psaux/psconv.c (PS_Conv_ASCIIHexDecode, PS_ConvEexecDecode):
+       Improve performance.
+
+       * src/truetype/ttgload.c (TT_Access_Glyph_Frame): Set `cursor' and
+       `limit'.
+
+       (TT_Load_Glyph_Header, TT_Load_Simple_Glyph,
+       TT_Load_Composite_Glyph): Updated.  Add threshold to protect against
+       exceedingly large values of number of contours.  Speed up by
+       reducing the number of loops.
+
+       * src/type1/t1gload.c (T1_Load_Glyph): Don't apply unit matrix.
+
+
+       * src/cache/ftccmap.c (FTC_CMapCache_Lookup): Change the threshold
+       used to detect rogue clients from 4 to 16.  This is to prevent some
+       segmentation faults with fonts like `KozMinProVI-Regular.otf' which
+       comes from the Japanese Adobe Reader Asian Font pack.
+
+2007-05-17  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffload.c (cff_font_done): Deallocate subfont array.  This
+       fixes the first part of Savannah bug #16590.
+
+2006-05-16  Werner Lemberg  <wl@gnu.org>
+
+       * docs/PROBLEMS: Updated icl issues.
+
+----------------------------------------------------------------------------
+
+Copyright 2006, 2007, 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.
+
+
+Local Variables:
+version-control: never
+coding: utf-8
+End:
diff --git a/Jamfile b/Jamfile
new file mode 100644 (file)
index 0000000..313bda6
--- /dev/null
+++ b/Jamfile
@@ -0,0 +1,204 @@
+# FreeType 2 top Jamfile.
+#
+# Copyright 2001-2011 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.
+
+
+# The HDRMACRO is already defined in FTJam and is used to add
+# the content of certain macros to the list of included header
+# files.
+#
+# We can compile FreeType 2 with classic Jam however thanks to
+# the following code
+#
+if ! $(JAM_TOOLSET)
+{
+  rule HDRMACRO
+  {
+    # nothing
+  }
+}
+
+
+# We need to invoke a SubDir rule if the FT2 source directory top is not the
+# current directory.  This allows us to build FreeType 2 as part of a larger
+# project easily.
+#
+if $(FT2_TOP) != $(DOT)
+{
+  SubDir  FT2_TOP ;
+}
+
+
+# The following macros define the include directory, the source directory,
+# and the final library name (without library extensions).  They can be
+# replaced by other definitions when the library is compiled as part of
+# a larger project.
+#
+
+# Name of FreeType include directory during compilation.
+# This is relative to FT2_TOP.
+#
+FT2_INCLUDE_DIR ?= include ;
+
+# Name of FreeType source directory during compilation.
+# This is relative to FT2_TOP.
+#
+FT2_SRC_DIR ?= src ;
+
+# Name of final library, without extension.
+#
+FT2_LIB ?= $(LIBPREFIX)freetype ;
+
+
+# Define FT2_BUILD_INCLUDE to point to your build-specific directory.
+# This is prepended to FT2_INCLUDE_DIR.  It can be used to specify
+# the location of a custom <ft2build.h> which will point to custom
+# versions of `ftmodule.h' and `ftoption.h', for example.
+#
+FT2_BUILD_INCLUDE ?= ;
+
+# The list of modules to compile on any given build of the library.
+# By default, this will contain _all_ modules defined in FT2_SRC_DIR.
+#
+# IMPORTANT: You'll need to change the content of `ftmodule.h' as well
+#            if you modify this list or provide your own.
+#
+FT2_COMPONENTS ?= autofit    # auto-fitter
+                  base       # base component (public APIs)
+                  bdf        # BDF font driver
+                  cache      # cache sub-system
+                  cff        # CFF/CEF font driver
+                  cid        # PostScript CID-keyed font driver
+                  pcf        # PCF font driver
+                  bzip2      # support for bzip2-compressed PCF font
+                  gzip       # support for gzip-compressed PCF font
+                  lzw        # support for LZW-compressed PCF font
+                  pfr        # PFR/TrueDoc font driver
+                  psaux      # common PostScript routines module
+                  pshinter   # PostScript hinter module
+                  psnames    # PostScript names handling
+                  raster     # monochrome rasterizer
+                  smooth     # anti-aliased rasterizer
+                  sfnt       # SFNT-based format support routines
+                  truetype   # TrueType font driver
+                  type1      # PostScript Type 1 font driver
+                  type42     # PostScript Type 42 (embedded TrueType) driver
+                  winfonts   # Windows FON/FNT font driver
+                  ;
+
+
+# Don't touch.
+#
+FT2_INCLUDE  = $(FT2_BUILD_INCLUDE)
+               [ FT2_SubDir $(FT2_INCLUDE_DIR) ] ;
+
+FT2_SRC      = [ FT2_SubDir $(FT2_SRC_DIR) ] ;
+
+# Location of API Reference Documentation
+#
+if $(DOC_DIR)
+{
+  DOC_DIR = $(DOCDIR:T) ;
+}
+else
+{
+  DOC_DIR = docs/reference ;
+}
+
+
+# Only used by FreeType developers.
+#
+if $(DEBUG_HINTER)
+{
+  CCFLAGS += -DDEBUG_HINTER ;
+}
+
+
+# We need `freetype2/include' in the current include path in order to
+# compile any part of FreeType 2.
+#: updating documentation for upcoming release
+
+HDRS += $(FT2_INCLUDE) ;
+
+
+# We need to #define FT2_BUILD_LIBRARY so that our sources find the
+# internal headers
+#
+DEFINES += FT2_BUILD_LIBRARY ;
+
+# Uncomment the following line if you want to build individual source files
+# for each FreeType 2 module.  This is only useful during development, and
+# is better defined as an environment variable anyway!
+#
+# FT2_MULTI = true ;
+
+
+# The file <freetype/config/ftheader.h> is used to define macros that are
+# later used in #include statements.  It needs to be parsed in order to
+# record these definitions.
+#
+HDRMACRO  [ FT2_SubDir  include freetype config ftheader.h ] ;
+HDRMACRO  [ FT2_SubDir  include freetype internal internal.h ] ;
+
+
+# Now include the Jamfile in `freetype2/src', used to drive the compilation
+# of each FreeType 2 component and/or module.
+#
+SubInclude  FT2_TOP $(FT2_SRC_DIR) ;
+
+# Handle the generation of the `ftexport.sym' file which contain the list
+# of exported symbols.  This can be used on Unix by libtool.
+#
+SubInclude FT2_TOP $(FT2_SRC_DIR) tools ;
+
+rule GenExportSymbols
+{
+  local  apinames = apinames$(SUFEXE) ;
+  local  headers  = [ Glob $(2) : *.h ] ;
+
+  LOCATE on $(1) = $(ALL_LOCATE_TARGET) ;
+
+  APINAMES on $(1) = apinames$(SUFEXE) ;
+
+  Depends            $(1) : $(apinames) $(headers) ;
+  GenExportSymbols1  $(1) : $(headers) ;
+  Clean              clean : $(1) ;
+}
+
+actions GenExportSymbols1 bind APINAMES
+{
+  $(APINAMES) $(2) > $(1)
+}
+
+GenExportSymbols  ftexport.sym : include/freetype include/freetype/cache ;
+
+# Test files (hinter debugging).  Only used by FreeType developers.
+#
+if $(DEBUG_HINTER)
+{
+  SubInclude FT2_TOP tests ;
+}
+
+rule RefDoc
+{
+  Depends  $1 : all ;
+  NotFile  $1 ;
+  Always   $1 ;
+}
+
+actions RefDoc
+{
+  python $(FT2_SRC)/tools/docmaker/docmaker.py --prefix=ft2 --title=FreeType-2.4.9 --output=$(DOC_DIR) $(FT2_INCLUDE)/freetype/*.h $(FT2_INCLUDE)/freetype/config/*.h
+}
+
+RefDoc  refdoc ;
+
+
+# end of top Jamfile
diff --git a/Jamrules b/Jamrules
new file mode 100644 (file)
index 0000000..d8d1c7e
--- /dev/null
+++ b/Jamrules
@@ -0,0 +1,71 @@
+# FreeType 2 JamRules.
+#
+# Copyright 2001, 2002, 2003 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.
+
+
+# This file contains the Jam rules needed to build the FreeType 2 library.
+# It is shared by all Jamfiles and is included only once in the build
+# process.
+#
+
+
+# Call SubDirHdrs on a list of directories.
+#
+rule AddSubDirHdrs
+{
+  local x ;
+
+  for x in $(<)
+  {
+    SubDirHdrs $(x) ;
+  }
+}
+
+
+# Determine prefix of library file.  We must use "libxxxxx" on Unix systems,
+# while all other simply use the real name.
+#
+if $(UNIX)
+{
+  LIBPREFIX ?= lib ;
+}
+else
+{
+  LIBPREFIX ?= "" ;
+}
+
+# FT2_TOP contains the location of the FreeType source directory.  You can
+# set it to a specific value if you want to compile the library as part of a
+# larger project.
+#
+FT2_TOP ?= $(DOT) ;
+
+# Define a new rule used to declare a sub directory of the Nirvana source
+# tree.
+#
+rule FT2_SubDir
+{
+  if $(FT2_TOP) = $(DOT)
+  {
+    return [ FDirName  $(<) ] ;
+  }
+  else
+  {
+    return [ FDirName  $(FT2_TOP) $(<) ] ;
+  }
+}
+
+# We also set ALL_LOCATE_TARGET in order to place all object and library
+# files in "objs".
+#
+ALL_LOCATE_TARGET ?= [ FT2_SubDir  objs ] ;
+
+
+# end of Jamrules
diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..c1fa16c
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,34 @@
+#
+# FreeType 2 build system -- top-level Makefile
+#
+
+
+# Copyright 1996-2000, 2002, 2006 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.
+
+
+# Project names
+#
+PROJECT       := freetype
+PROJECT_TITLE := FreeType
+
+# The variable TOP_DIR holds the path to the topmost directory in the project
+# engine source hierarchy.  If it is not defined, default it to `.'.
+#
+TOP_DIR ?= .
+
+# The variable OBJ_DIR gives the location where object files and the
+# FreeType library are built.
+#
+OBJ_DIR ?= $(TOP_DIR)/objs
+
+
+include $(TOP_DIR)/builds/toplevel.mk
+
+# EOF
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..84b1c44
--- /dev/null
+++ b/README
@@ -0,0 +1,57 @@
+  FreeType 2.4.9
+  ==============
+
+  Please   read   the  docs/CHANGES   file,   it  contains   IMPORTANT
+  INFORMATION.
+
+  Read the files `docs/INSTALL' for installation instructions.
+
+  See the  file `docs/LICENSE.TXT'  for the available licenses.   Note
+  that we use ranges (`2008-2010') for copyright years also instead of
+  listing individual years (`2008, 2009, 2010').
+
+  The FreeType 2 API reference is located in `docs/reference'; use the
+  file   `ft2-doc.html'   as   the   top  entry   point.    Additional
+  documentation is available as a separate package from our sites.  Go
+  to
+
+    http://download.savannah.gnu.org/releases/freetype/
+
+  and download one of the following files.
+
+    freetype-doc-2.4.9.tar.bz2
+    freetype-doc-2.4.9.tar.gz
+    ftdoc249.zip
+
+
+  Bugs
+  ====
+
+  Please report bugs  by e-mail to `freetype-devel@nongnu.org'.  Don't
+  forget to  send a  detailed explanation of  the problem --  there is
+  nothing  worse than  receiving a  terse message  that only  says `it
+  doesn't work'.
+
+  Alternatively, you may submit a bug report at
+
+    https://savannah.nongnu.org/bugs/?group=freetype
+
+
+  Enjoy!
+
+
+    The FreeType Team
+
+----------------------------------------------------------------------
+
+Copyright 2006-2011 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 README ---
diff --git a/README.git b/README.git
new file mode 100644 (file)
index 0000000..47cb242
--- /dev/null
@@ -0,0 +1,46 @@
+The git  archive doesn't  contain pre-built configuration  scripts for
+UNIXish platforms.  To generate them say
+
+  sh autogen.sh
+
+which in turn depends on the following packages:
+
+  automake (1.10.1)
+  libtool (2.2.4)
+  autoconf (2.62)
+
+The versions given  in parentheses are known to  work.  Newer versions
+should work too, of course.   Note that autogen.sh also sets up proper
+file permissions for the `configure' and auxiliary scripts.
+
+The autogen.sh script  now checks the version of  above three packages
+whether they match the numbers  above.  Otherwise it will complain and
+suggest either upgrading or using  an environment variable to point to
+a more recent version of the required tool(s).
+
+Note that  `aclocal' is provided  by the `automake' package  on Linux,
+and that `libtoolize' is called `glibtoolize' on Darwin (OS X).
+
+
+For static builds which  don't use platform specific optimizations, no
+configure script is necessary at all; saying
+
+  make setup ansi
+  make
+
+should work on all platforms which have GNU make (or makepp).
+
+
+----------------------------------------------------------------------
+
+Copyright 2005, 2006, 2007, 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 README.git ---
diff --git a/TC/_export_env.sh b/TC/_export_env.sh
new file mode 100755 (executable)
index 0000000..06b6671
--- /dev/null
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+. ./config
+export TET_INSTALL_PATH=$TET_INSTALL_HOST_PATH # tetware root path
+export TET_TARGET_PATH=$TET_INSTALL_PATH/tetware-target # tetware target path
+export PATH=$TET_TARGET_PATH/bin:$PATH
+export LD_LIBRARY_PATH=$TET_TARGET_PATH/lib/tet3:$LD_LIBRARY_PATH
+export TET_ROOT=$TET_TARGET_PATH
+export FT2_TC_ROOT_PATH=/mnt/nfs/DTS/freetype/ft2demos
diff --git a/TC/_export_target_env.sh b/TC/_export_target_env.sh
new file mode 100755 (executable)
index 0000000..5ddaa53
--- /dev/null
@@ -0,0 +1,7 @@
+#!/bin/sh
+. ./config
+export TET_INSTALL_PATH=$TET_INSTALL_TARGET_PATH # path to path
+export TET_TARGET_PATH=$TET_INSTALL_PATH/tetware-target
+export PATH=$TET_TARGET_PATH/bin:$PATH
+export LD_LIBRARY_PATH=$TET_TARGET_PATH/lib/tet3:$LD_LIBRARY_PATH
+export TET_ROOT=$TET_TARGET_PATH
diff --git a/TC/build.sh b/TC/build.sh
new file mode 100755 (executable)
index 0000000..72aad6c
--- /dev/null
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+. ./_export_env.sh                              # setting environment variables
+
+export TET_SUITE_ROOT=`pwd`
+FILE_NAME_EXTENSION=`date +%s`
+
+RESULT_DIR=results
+HTML_RESULT=$RESULT_DIR/build-tar-result-$FILE_NAME_EXTENSION.html
+JOURNAL_RESULT=$RESULT_DIR/build-tar-result-$FILE_NAME_EXTENSION.journal
+
+mkdir -p $RESULT_DIR
+
+tcc -c -p ./
+tcc -b -j $JOURNAL_RESULT -p ./
+grw -c 7 -f chtml -o $HTML_RESULT $JOURNAL_RESULT
diff --git a/TC/clean.sh b/TC/clean.sh
new file mode 100755 (executable)
index 0000000..29743e0
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+. ./_export_env.sh                              # setting environment variables
+
+export TET_SUITE_ROOT=`pwd`
+RESULT_DIR=results
+
+tcc -c -p ./                                # executing tcc, with clean option (-c)
+rm -r $RESULT_DIR
+rm -r tet_tmp_dir
+rm testcase/tet_captured
diff --git a/TC/config b/TC/config
new file mode 100755 (executable)
index 0000000..e8c668e
--- /dev/null
+++ b/TC/config
@@ -0,0 +1,2 @@
+TET_INSTALL_HOST_PATH=/view/DTS/TETware
+TET_INSTALL_TARGET_PATH=/mnt/nfs/DTS/TETware
diff --git a/TC/execute.sh b/TC/execute.sh
new file mode 100755 (executable)
index 0000000..a4f6095
--- /dev/null
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+. ./_export_target_env.sh                    # setting environment variables
+
+export TET_SUITE_ROOT=`pwd`
+FILE_NAME_EXTENSION=`date +%s`
+
+RESULT_DIR=results
+HTML_RESULT=$RESULT_DIR/exec-tar-result-$FILE_NAME_EXTENSION.html
+JOURNAL_RESULT=$RESULT_DIR/exec-tar-result-$FILE_NAME_EXTENSION.journal
+
+mkdir -p $RESULT_DIR
+
+tcc -e -j $JOURNAL_RESULT -p ./
+grw -c 3 -f chtml -o $HTML_RESULT $JOURNAL_RESULT
diff --git a/TC/testcase/Makefile b/TC/testcase/Makefile
new file mode 100755 (executable)
index 0000000..7ed8eb3
--- /dev/null
@@ -0,0 +1,24 @@
+CC ?= gcc
+
+C_FILES = $(shell ls *.c)
+
+PKGS = freetype2 capi-base-common dlog gthread-2.0
+
+LDFLAGS = `pkg-config --libs $(PKGS)`
+LDFLAGS += $(TET_ROOT)/lib/tet3/tcm_s.o
+LDFLAGS += -L$(TET_ROOT)/lib/tet3 -ltcm_s
+LDFLAGS += -L$(TET_ROOT)/lib/tet3 -lapi_s
+
+CFLAGS = -I. `pkg-config --cflags $(PKGS)`
+CFLAGS += -I$(TET_ROOT)/inc/tet3
+CFLAGS += -Wall
+
+TCS := $(shell ls -1 *.c | cut -d. -f1)
+
+all: $(TCS)
+
+%: %.c
+       $(CC) -o $@ $< $(CFLAGS) $(LDFLAGS)
+
+clean:
+       rm -f $(TCS)
diff --git a/TC/testcase/tslist b/TC/testcase/tslist
new file mode 100755 (executable)
index 0000000..7f1d607
--- /dev/null
@@ -0,0 +1,9 @@
+/testcase/utc_ft_bench
+/testcase/utc_ft_diff
+/testcase/utc_ft_dump
+/testcase/utc_ft_gamma
+/testcase/utc_ft_grid
+/testcase/utc_ft_lint
+/testcase/utc_ft_multi
+/testcase/utc_ft_string
+/testcase/utc_ft_view
diff --git a/TC/testcase/utc_ft_bench.c b/TC/testcase/utc_ft_bench.c
new file mode 100755 (executable)
index 0000000..557375a
--- /dev/null
@@ -0,0 +1,36 @@
+#include <tet_api.h>
+
+static void startup(void);
+static void cleanup(void);
+
+void (*tet_startup)(void) = startup;
+void (*tet_cleanup)(void) = cleanup;
+
+static void utc_ft_bench(void);
+
+struct tet_testlist tet_testlist[] = {
+       { utc_ft_bench, 1 },
+       { NULL, 0 },
+};
+
+static void startup(void)
+{
+       /* start of TC */
+}
+
+static void cleanup(void)
+{
+       /* end of TC */
+}
+
+static void utc_ft_bench(void)
+{
+       char buf[128];
+       int ret;
+       sprintf(buf, "cd %s && ./ftbench /usr/share/fonts/HelveticaNeueRegular.ttf ", getenv("FT2_TC_ROOT_PATH"));
+       ret = system(buf);
+       if(WEXITSTATUS(ret) == 0)
+               dts_pass("utc_ft_bench");
+       else
+               dts_fail("utc_ft_bench");
+}
diff --git a/TC/testcase/utc_ft_diff.c b/TC/testcase/utc_ft_diff.c
new file mode 100755 (executable)
index 0000000..9599fc7
--- /dev/null
@@ -0,0 +1,36 @@
+#include <tet_api.h>
+
+static void startup(void);
+static void cleanup(void);
+
+void (*tet_startup)(void) = startup;
+void (*tet_cleanup)(void) = cleanup;
+
+static void utc_ft_diff(void);
+
+struct tet_testlist tet_testlist[] = {
+       { utc_ft_diff, 1 },
+       { NULL, 0 },
+};
+
+static void startup(void)
+{
+       /* start of TC */
+}
+
+static void cleanup(void)
+{
+       /* end of TC */
+}
+
+static void utc_ft_diff(void)
+{
+       char buf[128];
+       int ret;
+       sprintf(buf, "cd %s && ./ftdiff /usr/share/fonts/HelveticaNeueRegular.ttf ", getenv("FT2_TC_ROOT_PATH"));
+       ret = system(buf);
+       if(WEXITSTATUS(ret) == 0)
+               dts_pass("utc_ft_diff");
+       else
+               dts_fail("utc_ft_diff");
+}
diff --git a/TC/testcase/utc_ft_dump.c b/TC/testcase/utc_ft_dump.c
new file mode 100755 (executable)
index 0000000..a0b6a2c
--- /dev/null
@@ -0,0 +1,36 @@
+#include <tet_api.h>
+
+static void startup(void);
+static void cleanup(void);
+
+void (*tet_startup)(void) = startup;
+void (*tet_cleanup)(void) = cleanup;
+
+static void utc_ft_dump(void);
+
+struct tet_testlist tet_testlist[] = {
+       { utc_ft_dump, 1 },
+       { NULL, 0 },
+};
+
+static void startup(void)
+{
+       /* start of TC */
+}
+
+static void cleanup(void)
+{
+       /* end of TC */
+}
+
+static void utc_ft_dump(void)
+{
+       char buf[128];
+       int ret;
+       sprintf(buf, "cd %s && ./ftdump /usr/share/fonts/HelveticaNeueRegular.ttf ", getenv("FT2_TC_ROOT_PATH"));
+       ret = system(buf);
+       if(WEXITSTATUS(ret) == 0)
+               dts_pass("utc_ft_dump");
+       else
+               dts_fail("utc_ft_dump");
+}
diff --git a/TC/testcase/utc_ft_gamma.c b/TC/testcase/utc_ft_gamma.c
new file mode 100755 (executable)
index 0000000..6e42a43
--- /dev/null
@@ -0,0 +1,36 @@
+#include <tet_api.h>
+
+static void startup(void);
+static void cleanup(void);
+
+void (*tet_startup)(void) = startup;
+void (*tet_cleanup)(void) = cleanup;
+
+static void utc_ft_gamma(void);
+
+struct tet_testlist tet_testlist[] = {
+       { utc_ft_gamma, 1 },
+       { NULL, 0 },
+};
+
+static void startup(void)
+{
+       /* start of TC */
+}
+
+static void cleanup(void)
+{
+       /* end of TC */
+}
+
+static void utc_ft_gamma(void)
+{
+       char buf[128];
+       int ret;
+       sprintf(buf, "cd %s && ./ftgamma", getenv("FT2_TC_ROOT_PATH"));
+       ret = system(buf);
+       if(WEXITSTATUS(ret) == 0)
+               dts_pass("utc_ft_gamma");
+       else
+               dts_fail("utc_ft_gamma");
+}
diff --git a/TC/testcase/utc_ft_grid.c b/TC/testcase/utc_ft_grid.c
new file mode 100755 (executable)
index 0000000..bf40ec8
--- /dev/null
@@ -0,0 +1,36 @@
+#include <tet_api.h>
+
+static void startup(void);
+static void cleanup(void);
+
+void (*tet_startup)(void) = startup;
+void (*tet_cleanup)(void) = cleanup;
+
+static void utc_ft_grid(void);
+
+struct tet_testlist tet_testlist[] = {
+       { utc_ft_grid, 1 },
+       { NULL, 0 },
+};
+
+static void startup(void)
+{
+       /* start of TC */
+}
+
+static void cleanup(void)
+{
+       /* end of TC */
+}
+
+static void utc_ft_grid(void)
+{
+       char buf[128];
+       int ret;
+       sprintf(buf, "cd %s && ./ftgrid 10pt /usr/share/fonts/HelveticaNeueRegular.ttf ", getenv("FT2_TC_ROOT_PATH"));
+       ret = system(buf);
+       if(WEXITSTATUS(ret) == 0)
+               dts_pass("utc_ft_grid");
+       else
+               dts_fail("utc_ft_grid");
+}
diff --git a/TC/testcase/utc_ft_lint.c b/TC/testcase/utc_ft_lint.c
new file mode 100755 (executable)
index 0000000..3ce186f
--- /dev/null
@@ -0,0 +1,36 @@
+#include <tet_api.h>
+
+static void startup(void);
+static void cleanup(void);
+
+void (*tet_startup)(void) = startup;
+void (*tet_cleanup)(void) = cleanup;
+
+static void utc_ft_lint(void);
+
+struct tet_testlist tet_testlist[] = {
+       { utc_ft_lint, 1 },
+       { NULL, 0 },
+};
+
+static void startup(void)
+{
+       /* start of TC */
+}
+
+static void cleanup(void)
+{
+       /* end of TC */
+}
+
+static void utc_ft_lint(void)
+{
+       char buf[128];
+       int ret;
+       sprintf(buf, "cd %s && ./ftlint 10ppem /usr/share/fonts/HelveticaNeueRegular.ttf ", getenv("FT2_TC_ROOT_PATH"));
+       ret = system(buf);
+       if(WEXITSTATUS(ret) == 0)
+               dts_pass("utc_ft_lint");
+       else
+               dts_fail("utc_ft_lint");
+}
diff --git a/TC/testcase/utc_ft_multi.c b/TC/testcase/utc_ft_multi.c
new file mode 100755 (executable)
index 0000000..e005ceb
--- /dev/null
@@ -0,0 +1,36 @@
+#include <tet_api.h>
+
+static void startup(void);
+static void cleanup(void);
+
+void (*tet_startup)(void) = startup;
+void (*tet_cleanup)(void) = cleanup;
+
+static void utc_ft_multi(void);
+
+struct tet_testlist tet_testlist[] = {
+       { utc_ft_multi, 1 },
+       { NULL, 0 },
+};
+
+static void startup(void)
+{
+       /* start of TC */
+}
+
+static void cleanup(void)
+{
+       /* end of TC */
+}
+
+static void utc_ft_multi(void)
+{
+       char buf[128];
+       int ret;
+       sprintf(buf, "cd %s && ./ftmulti 10ppem /usr/share/fonts/HelveticaNeueRegular.ttf ", getenv("FT2_TC_ROOT_PATH"));
+       ret = system(buf);
+       if(WEXITSTATUS(ret) == 0)
+               dts_pass("utc_ft_multi");
+       else
+               dts_fail("utc_ft_multi");
+}
diff --git a/TC/testcase/utc_ft_string.c b/TC/testcase/utc_ft_string.c
new file mode 100755 (executable)
index 0000000..de17b48
--- /dev/null
@@ -0,0 +1,36 @@
+#include <tet_api.h>
+
+static void startup(void);
+static void cleanup(void);
+
+void (*tet_startup)(void) = startup;
+void (*tet_cleanup)(void) = cleanup;
+
+static void utc_ft_string(void);
+
+struct tet_testlist tet_testlist[] = {
+       { utc_ft_string, 1 },
+       { NULL, 0 },
+};
+
+static void startup(void)
+{
+       /* start of TC */
+}
+
+static void cleanup(void)
+{
+       /* end of TC */
+}
+
+static void utc_ft_string(void)
+{
+       char buf[128];
+       int ret;
+       sprintf(buf, "cd %s && ./ftstring 10pt /usr/share/fonts/HelveticaNeueRegular.ttf ", getenv("FT2_TC_ROOT_PATH"));
+       ret = system(buf);
+       if(WEXITSTATUS(ret) == 0)
+               dts_pass("utc_ft_string");
+       else
+               dts_fail("utc_ft_string");
+}
diff --git a/TC/testcase/utc_ft_view.c b/TC/testcase/utc_ft_view.c
new file mode 100755 (executable)
index 0000000..33f3c5f
--- /dev/null
@@ -0,0 +1,36 @@
+#include <tet_api.h>
+
+static void startup(void);
+static void cleanup(void);
+
+void (*tet_startup)(void) = startup;
+void (*tet_cleanup)(void) = cleanup;
+
+static void utc_ft_view(void);
+
+struct tet_testlist tet_testlist[] = {
+       { utc_ft_view, 1 },
+       { NULL, 0 },
+};
+
+static void startup(void)
+{
+       /* start of TC */
+}
+
+static void cleanup(void)
+{
+       /* end of TC */
+}
+
+static void utc_ft_view(void)
+{
+       char buf[128];
+       int ret;
+       sprintf(buf, "cd %s && ./ftview 10pt /usr/share/fonts/HelveticaNeueRegular.ttf ", getenv("FT2_TC_ROOT_PATH"));
+       ret = system(buf);
+       if(WEXITSTATUS(ret) == 0)
+               dts_pass("utc_ft_view");
+       else
+               dts_fail("utc_ft_view");
+}
diff --git a/TC/tet_scen b/TC/tet_scen
new file mode 100755 (executable)
index 0000000..03f029a
--- /dev/null
@@ -0,0 +1,7 @@
+all
+       ^TEST
+##### Scenarios for TEST #####
+
+# Test scenario
+TEST
+       :include:/testcase/tslist
diff --git a/TC/tetbuild.cfg b/TC/tetbuild.cfg
new file mode 100755 (executable)
index 0000000..f7eda55
--- /dev/null
@@ -0,0 +1,5 @@
+TET_OUTPUT_CAPTURE=True # capture option for build operation checking
+TET_BUILD_TOOL=make # build with using make command
+TET_BUILD_FILE=-f Makefile # execution file (Makefile) for build
+TET_API_COMPLIANT=True # use TET API in Test Case ?
+TET_PASS_TC_NAME=True # report passed TC name in Journal file?
diff --git a/TC/tetclean.cfg b/TC/tetclean.cfg
new file mode 100755 (executable)
index 0000000..02d7030
--- /dev/null
@@ -0,0 +1,5 @@
+TET_OUTPUT_CAPTURE=True # capture option
+TET_CLEAN_TOOL= make clean # clean tool
+TET_CLEAN_FILE= Makefile # file for clean
+TET_API_COMPLIANT=True # TET API useage 
+TET_PASS_TC_NAME=True # showing name , passed TC
diff --git a/TC/tetexec.cfg b/TC/tetexec.cfg
new file mode 100755 (executable)
index 0000000..ef3e452
--- /dev/null
@@ -0,0 +1,5 @@
+TET_OUTPUT_CAPTURE=True # capturing execution or not
+TET_EXEC_TOOL=  # ex) exec : execution tool set up/ Optional
+TET_EXEC_FILE=   # ex) exectool : execution file/ Optional
+TET_API_COMPLIANT=True # Test case or Tool usesTET API?
+TET_PASS_TC_NAME=True # showing Passed TC name ?
diff --git a/autogen.sh b/autogen.sh
new file mode 100644 (file)
index 0000000..9f2fb6a
--- /dev/null
@@ -0,0 +1,166 @@
+#!/bin/sh
+
+# Copyright 2005, 2006, 2007, 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.
+
+run ()
+{
+  echo "running \`$*'"
+  eval $*
+
+  if test $? != 0 ; then
+    echo "error while running \`$*'"
+    exit 1
+  fi
+}
+
+get_major_version ()
+{
+  echo $1 | sed -e 's/\([0-9][0-9]*\)\..*/\1/g'
+}
+
+get_minor_version ()
+{
+  echo $1 | sed -e 's/[0-9][0-9]*\.\([0-9][0-9]*\).*/\1/g'
+}
+
+get_patch_version ()
+{
+  # tricky: some version numbers don't include a patch
+  # separated with a point, but something like 1.4-p6
+  patch=`echo $1 | sed -e 's/[0-9][0-9]*\.[0-9][0-9]*\.\([0-9][0-9]*\).*/\1/g'`
+  if test "$patch" = "$1"; then
+    patch=`echo $1 | sed -e 's/[0-9][0-9]*\.[0-9][0-9]*\-p\([0-9][0-9]*\).*/\1/g'`
+    # if there isn't any patch number, default to 0
+    if test "$patch" = "$1"; then
+      patch=0
+    fi
+  fi
+  echo $patch
+}
+
+# $1: version to check
+# $2: minimum version
+
+compare_to_minimum_version ()
+{
+  MAJOR1=`get_major_version $1`
+  MAJOR2=`get_major_version $2`
+  if test $MAJOR1 -lt $MAJOR2; then
+    echo 0
+    return
+  else 
+    if test $MAJOR1 -gt $MAJOR2; then
+      echo 1
+      return
+    fi
+  fi
+
+  MINOR1=`get_minor_version $1`
+  MINOR2=`get_minor_version $2`
+  if test $MINOR1 -lt $MINOR2; then
+    echo 0
+    return
+  else 
+    if test $MINOR1 -gt $MINOR2; then
+      echo 1
+      return
+    fi
+  fi
+
+  PATCH1=`get_patch_version $1`
+  PATCH2=`get_patch_version $2`
+  if test $PATCH1 -lt $PATCH2; then
+    echo 0
+  else
+    echo 1
+  fi
+}
+
+# check the version of a given tool against a minimum version number
+#
+# $1: tool path
+# $2: tool usual name (e.g. `aclocal')
+# $3: tool variable  (e.g. `ACLOCAL')
+# $4: minimum version to check against
+# $5: option field index used to extract the tool version from the
+#     output of --version
+
+check_tool_version ()
+{
+  field=$5
+  # assume the output of "[TOOL] --version" is "toolname (GNU toolname foo bar) version"
+  if test "$field"x = x; then
+    field=3  # default to 3 for all GNU autotools, after filtering enclosed string
+  fi
+  version=`$1 --version | head -1 | sed 's/([^)]*)/()/g' | cut -d ' ' -f $field`
+  version_check=`compare_to_minimum_version $version $4`
+  if test "$version_check"x = 0x; then
+    echo "ERROR: Your version of the \`$2' tool is too old."
+    echo "       Minimum version $4 is required (yours is version $version)."
+    echo "       Please upgrade or use the $3 variable to point to a more recent one."
+    echo ""
+    exit 1
+  fi
+}
+
+if test ! -f ./builds/unix/configure.raw; then
+  echo "You must be in the same directory as \`autogen.sh'."
+  echo "Bootstrapping doesn't work if srcdir != builddir."
+  exit 1
+fi
+
+# On MacOS X, the GNU libtool is named `glibtool'.
+HOSTOS=`uname`
+if test "$LIBTOOLIZE"x != x; then
+  :
+elif test "$HOSTOS"x = Darwinx; then
+  LIBTOOLIZE=glibtoolize
+else
+  LIBTOOLIZE=libtoolize
+fi
+
+if test "$ACLOCAL"x = x; then
+  ACLOCAL=aclocal
+fi
+
+if test "$AUTOCONF"x = x; then
+  AUTOCONF=autoconf
+fi
+
+check_tool_version $ACLOCAL    aclocal    ACLOCAL    1.10.1
+check_tool_version $LIBTOOLIZE libtoolize LIBTOOLIZE 2.2.4
+check_tool_version $AUTOCONF   autoconf   AUTOCONF   2.62
+
+# This sets freetype_major, freetype_minor, and freetype_patch.
+eval `sed -nf version.sed include/freetype/freetype.h`
+
+# We set freetype-patch to an empty value if it is zero.
+if test "$freetype_patch" = ".0"; then
+  freetype_patch=
+fi
+
+cd builds/unix
+
+echo "generating \`configure.ac'"
+sed -e "s;@VERSION@;$freetype_major$freetype_minor$freetype_patch;" \
+  < configure.raw > configure.ac
+
+run aclocal -I . --force
+run $LIBTOOLIZE --force --copy --install
+run autoconf --force
+
+chmod +x mkinstalldirs
+chmod +x install-sh
+
+cd ../..
+
+chmod +x ./configure
+
+# EOF
diff --git a/builds/amiga/README b/builds/amiga/README
new file mode 100644 (file)
index 0000000..2b8f8e8
--- /dev/null
@@ -0,0 +1,110 @@
+
+README for the builds/amiga subdirectory.
+
+Copyright 2005 by
+Werner Lemberg and Detlef Würkner.
+
+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.
+
+
+The makefile.os4 is for the AmigaOS4 SDK.  To use it, type
+"make -f makefile.os4", it produces a link library libft2_ppc.a.
+
+The makefile is for ppc-morphos-gcc-2.95.3-bin.tgz (gcc 2.95.3 hosted on
+68k-Amiga producing MorphOS-PPC-binaries from http://www.morphos.de).
+To use it, type "make assign", then "make"; it produces a link library
+libft2_ppc.a.
+
+The smakefile is a makefile for Amiga SAS/C 6.58 (no longer available,
+latest sold version was 6.50, updates can be found in Aminet).  It is
+based on the version found in the sourcecode of ttf.library 0.83b for
+FreeType 1.3.1 from Richard Griffith (ragriffi@sprynet.com,
+http://ragriffi.home.sprynet.com).
+
+You will also need the latest include files and amiga.lib from the
+Amiga web site (http://www.amiga.com/3.9/download/NDK3.9.lha) for
+AmigaOS 3.9; the generated code should work under AmigaOS 2.04 and up.
+
+To use it, call "smake assign" and then "smake" from the builds/amiga
+directory.  The results are:
+
+- A link library "ft2_680x0.lib" (where x depends on the setting of
+  the CPU entry in the smakefile) containing all FreeType2 parts
+  except of the init code, debugging code, and the system interface
+  code.
+
+- ftsystem.o, an object module containing the standard version of the
+  system interface code which uses fopen() fclose() fread() fseek()
+  ftell() malloc() realloc() and free() from lib:sc.lib (not pure).
+
+- ftsystempure.o, an object module containing the pure version of the
+  system interface code which uses Open() Close() Read() Seek()
+  ExamineFH() AsmAllocPooled() AsmFreePooled() etc.  This version can
+  be used in both normal programs and in Amiga run-time shared system
+  librarys (can be linked with lib:libinit.o, no copying of DATA and
+  BSS hunks for each OpenLibrary() necessary).  Source code is in
+  src/base/ftsystem.c.
+
+- ftdebug.o, an object module containing the standard version of the
+  debugging code which uses vprintf() and exit() (not pure).
+  Debugging can be turned on in FT:include/freetype/config/ftoption.h
+  and with FT_SetTraceLevel().
+
+- ftdebugpure.o, an object module containing the pure version of the
+  debugging code which uses KVPrintf() from lib:debug.lib and no
+  exit().  For debugging of Amiga run-time shared system libraries.
+  Source code is in src/base/ftdebug.c.
+
+- NO ftinit.o.  Because linking with a link library should result in
+  linking only the needed object modules in it, but standard
+  ftsystem.o would force ALL FreeType2 modules to be linked to your
+  program, I decided to use a different scheme: You must #include
+  FT:src/base/ftinit.c in your sourcecode and specify with #define
+  statements which modules you need.  See
+  include/freetype/config/ftmodule.h.
+
+
+To use in your own programs:
+
+- Insert the #define and #include statements from top of
+  include/freetype/config/ftmodule.h in your source code and uncomment
+  the #define statements for the FreeType2 modules you need.
+
+- You can use either PARAMETERS=REGISTER or PARAMETERS=STACK for
+  calling the FreeType2 functions, because the link library and the
+  object files are compiled with PARAMETERS=BOTH.
+
+- "smake assign" (assign "FT:" to the FreeType2 main directory).
+
+- Compile your program.
+
+- Link with either ftsystem.o or ftsystempure.o, if debugging enabled
+  with either ftdebug.o or (ftdebugpure.o and lib:debug.lib), and with
+  ft2_680x0.lib as link library.
+
+
+To adapt to other compilers:
+
+- The standard ANSI C maximum length of 31 significant characters in
+  identifiers is not enough for FreeType2.  Check if your compiler has
+  a minimum length of 40 significant characters or can be switched to
+  it.  "idlen=40" is the option for SAS/C.  Setting #define
+  HAVE_LIMIT_ON_IDENTS in an include file may also work (not tested).
+
+- Make sure that the include directory in builds/amiga is searched
+  before the normal FreeType2 include directory, so you are able to
+  replace problematic include files with your own version (same may be
+  useful for the src directory).
+
+- An example of how to replace/workaround a problematic include file
+  is include/config/ftconfig.h; it changes a #define that would
+  prevent SAS/C from generating XDEF's where it should do that and
+  then includes the standard FreeType2 include file.
+
+Local Variables:
+coding: latin-1
+End:
diff --git a/builds/amiga/include/freetype/config/ftconfig.h b/builds/amiga/include/freetype/config/ftconfig.h
new file mode 100644 (file)
index 0000000..c2c2ac8
--- /dev/null
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftconfig.h                                                             */
+/*                                                                         */
+/*    Amiga-specific configuration file (specification only).              */
+/*                                                                         */
+/*  Copyright 2005, 2006, 2007 by                                          */
+/*  Werner Lemberg and Detlef Würkner.                                     */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/*
+ * This is an example how to override the default FreeType2 header files
+ * with Amiga-specific changes. When the compiler searches this directory
+ * before the default directory, we can do some modifications.
+ *
+ * Here we must change FT_EXPORT_DEF so that SAS/C does
+ * generate the needed XDEFs.
+ */
+
+#if 0
+#define FT_EXPORT_DEF( x )  extern  x
+#endif
+
+#undef FT_EXPORT_DEF
+#define FT_EXPORT_DEF( x )  x
+
+/* Now include the original file */
+#ifndef __MORPHOS__
+#ifdef __SASC
+#include "FT:include/freetype/config/ftconfig.h"
+#else
+#include "/FT/include/freetype/config/ftconfig.h"
+#endif
+#else
+/* We must define that, it seems that
+ * lib/gcc-lib/ppc-morphos/2.95.3/include/syslimits.h is missing in
+ * ppc-morphos-gcc-2.95.3-bin.tgz (gcc for 68k producing MorphOS PPC elf
+ * binaries from http://www.morphos.de)
+ */
+#define _LIBC_LIMITS_H_
+#include "/FT/include/freetype/config/ftconfig.h"
+#endif
+
+/*
+Local Variables:
+coding: latin-1
+End:
+*/
diff --git a/builds/amiga/include/freetype/config/ftmodule.h b/builds/amiga/include/freetype/config/ftmodule.h
new file mode 100644 (file)
index 0000000..5873bab
--- /dev/null
@@ -0,0 +1,160 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmodule.h                                                             */
+/*                                                                         */
+/*    Amiga-specific FreeType module selection.                            */
+/*                                                                         */
+/*  Copyright 2005 by                                                      */
+/*  Werner Lemberg and Detlef Würkner.                                     */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/*
+ * To avoid that all your programs include all FreeType modules,
+ * you copy the following piece of source code into your own
+ * source file and specify which modules you really need in your
+ * application by uncommenting the appropriate lines.
+ */
+/*
+//#define FT_USE_AUTOFIT // autofitter
+//#define FT_USE_RASTER  // monochrome rasterizer
+//#define FT_USE_SMOOTH  // anti-aliasing rasterizer
+//#define FT_USE_TT      // truetype font driver
+//#define FT_USE_T1      // type1 font driver
+//#define FT_USE_T42     // type42 font driver
+//#define FT_USE_T1CID   // cid-keyed type1 font driver  // no cmap support
+//#define FT_USE_CFF     // opentype font driver
+//#define FT_USE_BDF     // bdf bitmap font driver
+//#define FT_USE_PCF     // pcf bitmap font driver
+//#define FT_USE_PFR     // pfr font driver
+//#define FT_USE_WINFNT  // windows .fnt|.fon bitmap font driver
+//#define FT_USE_OTV     // opentype validator
+//#define FT_USE_GXV     // truetype gx validator
+#include "FT:src/base/ftinit.c"
+*/
+
+/* Make sure that the needed support modules are built in.
+ * Dependencies can be found by searching for FT_Get_Module.
+ */
+
+#ifdef FT_USE_T42
+#define FT_USE_TT
+#endif
+
+#ifdef FT_USE_TT
+#define FT_USE_SFNT
+#endif
+
+#ifdef FT_USE_CFF
+#define FT_USE_SFNT
+#define FT_USE_PSHINT
+#define FT_USE_PSNAMES
+#endif
+
+#ifdef FT_USE_T1
+#define FT_USE_PSAUX
+#define FT_USE_PSHINT
+#define FT_USE_PSNAMES
+#endif
+
+#ifdef FT_USE_T1CID
+#define FT_USE_PSAUX
+#define FT_USE_PSHINT
+#define FT_USE_PSNAMES
+#endif
+
+#ifdef FT_USE_PSAUX
+#define FT_USE_PSNAMES
+#endif
+
+#ifdef FT_USE_SFNT
+#define FT_USE_PSNAMES
+#endif
+
+/* Now include the modules */
+
+#ifdef FT_USE_AUTOFIT
+FT_USE_MODULE( FT_Module_Class, autofit_module_class )
+#endif
+
+#ifdef FT_USE_TT
+FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class )
+#endif
+
+#ifdef FT_USE_T1
+FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class )
+#endif
+
+#ifdef FT_USE_CFF
+FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class )
+#endif
+
+#ifdef FT_USE_T1CID
+FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class )
+#endif
+
+#ifdef FT_USE_PFR
+FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class )
+#endif
+
+#ifdef FT_USE_T42
+FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class )
+#endif
+
+#ifdef FT_USE_WINFNT
+FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class )
+#endif
+
+#ifdef FT_USE_PCF
+FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class )
+#endif
+
+#ifdef FT_USE_PSAUX
+FT_USE_MODULE( FT_Module_Class, psaux_module_class )
+#endif
+
+#ifdef FT_USE_PSNAMES
+FT_USE_MODULE( FT_Module_Class, psnames_module_class )
+#endif
+
+#ifdef FT_USE_PSHINT
+FT_USE_MODULE( FT_Module_Class, pshinter_module_class )
+#endif
+
+#ifdef FT_USE_RASTER
+FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class )
+#endif
+
+#ifdef FT_USE_SFNT
+FT_USE_MODULE( FT_Module_Class, sfnt_module_class )
+#endif
+
+#ifdef FT_USE_SMOOTH
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class )
+#endif
+
+#ifdef FT_USE_OTV
+FT_USE_MODULE( FT_Module_Class, otv_module_class )
+#endif
+
+#ifdef FT_USE_BDF
+FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class )
+#endif
+
+#ifdef FT_USE_GXV
+FT_USE_MODULE( FT_Module_Class, gxv_module_class )
+#endif
+
+/*
+Local Variables:
+coding: latin-1
+End:
+*/
diff --git a/builds/amiga/makefile b/builds/amiga/makefile
new file mode 100644 (file)
index 0000000..379883d
--- /dev/null
@@ -0,0 +1,299 @@
+#
+# Makefile for FreeType2 link library using ppc-morphos-gcc-2.95.3-bin.tgz
+# (gcc 2.95.3 hosted on 68k-Amiga producing MorphOS-PPC-binaries from
+# http://www.morphos.de)
+#
+
+
+# Copyright 2005, 2006, 2007, 2009 by
+# Werner Lemberg and Detlef Würkner.
+#
+# 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.
+
+
+#
+# to build from the builds/amiga directory call
+#
+#  make assign
+#  make
+#
+# Your programs source code should start with this
+# (uncomment the parts you do not need to keep the program small):
+# ---8<---
+#define FT_USE_AUTOFIT // autofitter
+#define FT_USE_RASTER  // monochrome rasterizer
+#define FT_USE_SMOOTH  // anti-aliasing rasterizer
+#define FT_USE_TT      // truetype font driver
+#define FT_USE_T1      // type1 font driver
+#define FT_USE_T42     // type42 font driver
+#define FT_USE_T1CID   // cid-keyed type1 font driver
+#define FT_USE_CFF     // opentype font driver
+#define FT_USE_BDF     // bdf bitmap font driver
+#define FT_USE_PCF     // pcf bitmap font driver
+#define FT_USE_PFR     // pfr font driver
+#define FT_USE_WINFNT  // windows .fnt|.fon bitmap font driver
+#define FT_USE_OTV     // opentype validator
+#define FT_USE_GXV     // truetype gx validator
+#include "FT:src/base/ftinit.c"
+# ---8<---
+#
+# link your programs with libft2_ppc.a and either ftsystem.ppc.o or ftsystempure.ppc.o
+# (and either ftdebug.ppc.o or ftdebugpure.ppc.o if you enabled FT_DEBUG_LEVEL_ERROR or
+# FT_DEBUG_LEVEL_TRACE in include/freetype/config/ftoption.h).
+
+all:   libft2_ppc.a ftsystem.ppc.o ftsystempure.ppc.o
+
+assign:
+       assign FT: //
+
+FTSRC = /FT/src
+
+CC =     ppc-morphos-gcc
+AR =     ppc-morphos-ar rc
+RANLIB = ppc-morphos-ranlib
+LD =     ppc-morphos-ld
+CFLAGS = -DFT2_BUILD_LIBRARY -O2 -I/emu/emulinclude/includegcc -I/emu/include -Iinclude -I$(FTSRC) -I/FT/include
+
+#
+# FreeType2 library base
+#
+ftbase.ppc.o: $(FTSRC)/base/ftbase.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftinit.ppc.o: $(FTSRC)/base/ftinit.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftsystem.ppc.o: $(FTSRC)/base/ftsystem.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+# pure version for use in run-time library etc
+ftsystempure.ppc.o: src/base/ftsystem.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftdebug.ppc.o: $(FTSRC)/base/ftdebug.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+# pure version for use in run-time library etc
+ftdebugpure.ppc.o: src/base/ftdebug.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library base extensions
+#
+ftbbox.ppc.o: $(FTSRC)/base/ftbbox.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftbdf.ppc.o: $(FTSRC)/base/ftbdf.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftbitmap.ppc.o: $(FTSRC)/base/ftbitmap.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftcid.ppc.o: $(FTSRC)/base/ftcid.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftfstype.ppc.o: $(FTSRC)/base/ftfstype.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftgasp.ppc.o: $(FTSRC)/base/ftgasp.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftglyph.ppc.o: $(FTSRC)/base/ftglyph.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftgxval.ppc.o: $(FTSRC)/base/ftgxval.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftlcdfil.ppc.o: $(FTSRC)/base/ftlcdfil.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftmm.ppc.o: $(FTSRC)/base/ftmm.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftotval.ppc.o: $(FTSRC)/base/ftotval.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftpatent.ppc.o: $(FTSRC)/base/ftpatent.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftpfr.ppc.o: $(FTSRC)/base/ftpfr.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftstroke.ppc.o: $(FTSRC)/base/ftstroke.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftsynth.ppc.o: $(FTSRC)/base/ftsynth.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+fttype1.ppc.o: $(FTSRC)/base/fttype1.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftwinfnt.ppc.o: $(FTSRC)/base/ftwinfnt.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+ftxf86.ppc.o: $(FTSRC)/base/ftxf86.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library autofitting module
+#
+autofit.ppc.o: $(FTSRC)/autofit/autofit.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library postscript hinting module
+#
+pshinter.ppc.o: $(FTSRC)/pshinter/pshinter.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library PS support module
+#
+psaux.ppc.o: $(FTSRC)/psaux/psaux.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library PS glyph names module
+#
+psnames.ppc.o: $(FTSRC)/psnames/psnames.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library monochrome raster module
+#
+raster.ppc.o: $(FTSRC)/raster/raster.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library anti-aliasing raster module
+#
+smooth.ppc.o: $(FTSRC)/smooth/smooth.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library 'sfnt' module
+#
+sfnt.ppc.o: $(FTSRC)/sfnt/sfnt.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library glyph and image caching system
+#
+ftcache.ppc.o: $(FTSRC)/cache/ftcache.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library OpenType font driver
+#
+cff.ppc.o: $(FTSRC)/cff/cff.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library TrueType font driver
+#
+truetype.ppc.o: $(FTSRC)/truetype/truetype.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library Type1 font driver
+#
+type1.ppc.o: $(FTSRC)/type1/type1.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library Type42 font driver
+#
+type42.ppc.o: $(FTSRC)/type42/type42.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library CID-keyed Type1 font driver
+#
+type1cid.ppc.o: $(FTSRC)/cid/type1cid.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library BDF bitmap font driver
+#
+bdf.ppc.o: $(FTSRC)/bdf/bdf.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library PCF bitmap font driver
+#
+pcf.ppc.o: $(FTSRC)/pcf/pcf.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library gzip support for compressed PCF bitmap fonts
+#
+gzip.ppc.o: $(FTSRC)/gzip/ftgzip.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+# FreeType2 library bzip2 support for compressed PCF bitmap fonts
+#
+bzip2.ppc.o: $(FTSRC)/bzip2/ftbzip2.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library compress support for compressed PCF bitmap fonts
+#
+lzw.ppc.o: $(FTSRC)/lzw/ftlzw.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library PFR font driver
+#
+pfr.ppc.o: $(FTSRC)/pfr/pfr.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library Windows FNT/FON bitmap font driver
+#
+winfnt.ppc.o: $(FTSRC)/winfonts/winfnt.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library TrueTypeGX Validator
+#
+gxvalid.ppc.o: $(FTSRC)/gxvalid/gxvalid.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+#
+# FreeType2 library OpenType validator
+#
+otvalid.ppc.o: $(FTSRC)/otvalid/otvalid.c
+       $(CC) -c $(CFLAGS) -o $@ $<
+
+BASEPPC = ftbase.ppc.o ftbbox.ppc.o ftbdf.ppc.o ftbitmap.ppc.o ftcid.ppc.o   \
+         ftfstype.ppc.o ftgasp.ppc.o ftglyph.ppc.o ftgxval.ppc.o            \
+         ftlcdfil.ppc.o ftmm.ppc.o ftotval.ppc.o ftpatent.ppc.o ftpfr.ppc.o \
+         ftstroke.ppc.o ftsynth.ppc.o fttype1.ppc.o ftwinfnt.ppc.o          \
+         ftxf86.ppc.o
+
+DEBUGPPC = ftdebug.ppc.o ftdebugpure.ppc.o
+
+AFITPPC = autofit.ppc.o
+
+GXVPPC = gxvalid.ppc.o
+
+OTVPPC = otvalid.ppc.o
+
+PSPPC = psaux.ppc.o psnames.ppc.o pshinter.ppc.o
+
+RASTERPPC = raster.ppc.o smooth.ppc.o
+
+FONTDPPC = cff.ppc.o type1.ppc.o type42.ppc.o type1cid.ppc.o truetype.ppc.o\
+          bdf.ppc.o pcf.ppc.o pfr.ppc.o winfnt.ppc.o
+
+libft2_ppc.a:    $(BASEPPC) $(AFITPPC) $(GXVPPC) $(OTVPPC) $(PSPPC) $(RASTERPPC) sfnt.ppc.o ftcache.ppc.o $(FONTDPPC) gzip.ppc.o bzip2.ppc.o lzw.ppc.o
+       $(AR) $@ $(BASEPPC) $(AFITPPC) $(GXVPPC) $(OTVPPC) $(PSPPC) $(RASTERPPC) sfnt.ppc.o ftcache.ppc.o $(FONTDPPC) gzip.ppc.o bzip2.ppc.o lzw.ppc.o
+       -@ ($(RANLIB) $@ || true) >/dev/null 2>&1
+
+#Local Variables:
+#coding: latin-1
+#End:
diff --git a/builds/amiga/makefile.os4 b/builds/amiga/makefile.os4
new file mode 100644 (file)
index 0000000..13758bc
--- /dev/null
@@ -0,0 +1,303 @@
+#
+# Makefile for FreeType2 link library using gcc 4.0.3 from the
+# AmigaOS4 SDK
+#
+
+
+# Copyright 2005, 2006, 2007, 2009 by
+# Werner Lemberg and Detlef Würkner.
+#
+# 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.
+
+
+# to build from the builds/amiga directory call
+#
+#  make -f makefile.os4
+#
+# Your programs source code should start with this
+# (uncomment the parts you do not need to keep the program small):
+# ---8<---
+#define FT_USE_AUTOFIT // autofitter
+#define FT_USE_RASTER  // monochrome rasterizer
+#define FT_USE_SMOOTH  // anti-aliasing rasterizer
+#define FT_USE_TT      // truetype font driver
+#define FT_USE_T1      // type1 font driver
+#define FT_USE_T42     // type42 font driver
+#define FT_USE_T1CID   // cid-keyed type1 font driver
+#define FT_USE_CFF     // opentype font driver
+#define FT_USE_BDF     // bdf bitmap font driver
+#define FT_USE_PCF     // pcf bitmap font driver
+#define FT_USE_PFR     // pfr font driver
+#define FT_USE_WINFNT  // windows .fnt|.fon bitmap font driver
+#define FT_USE_OTV     // opentype validator
+#define FT_USE_GXV     // truetype gx validator
+#include "FT:src/base/ftinit.c"
+# ---8<---
+#
+# link your programs with libft2_ppc.a and either ftsystem.ppc.o or ftsystempure.ppc.o
+# (and either ftdebug.ppc.o or ftdebugpure.ppc.o if you enabled FT_DEBUG_LEVEL_ERROR or
+# FT_DEBUG_LEVEL_TRACE in include/freetype/config/ftoption.h).
+
+all:   assign libft2_ppc.a ftsystem.ppc.o ftsystempure.ppc.o
+
+assign:
+       assign FT: //
+
+CC =     ppc-amigaos-gcc
+AR =     ppc-amigaos-ar
+RANLIB = ppc-amigaos-ranlib
+
+DIRFLAGS  = -Iinclude -I/FT/src -I/FT/include -I/SDK/include
+
+WARNINGS = -Wall -W -Wundef -Wpointer-arith -Wbad-function-cast \
+          -Waggregate-return -Wwrite-strings -Wshadow
+
+OPTIONS  = -DFT2_BUILD_LIBRARY -DNDEBUG -fno-builtin
+OPTIMIZE = -O2 -fomit-frame-pointer -fstrength-reduce -finline-functions
+
+CFLAGS   = -mcrt=clib2 $(DIRFLAGS) $(WARNINGS) $(FT2FLAGS) $(OPTIONS) $(OPTIMIZE)
+
+#
+# FreeType2 library base
+#
+ftbase.ppc.o: FT:src/base/ftbase.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbase.c
+
+ftinit.ppc.o: FT:src/base/ftinit.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftinit.c
+
+ftsystem.ppc.o: FT:src/base/ftsystem.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftsystem.c
+
+# pure version for use in run-time library etc
+ftsystempure.ppc.o: src/base/ftsystem.c
+       $(CC) -c $(CFLAGS) -o $@ src/base/ftsystem.c
+
+#
+# FreeType2 library base extensions
+#
+ftbbox.ppc.o: FT:src/base/ftbbox.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbbox.c
+
+ftbdf.ppc.o: FT:src/base/ftbdf.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbdf.c
+
+ftbitmap.ppc.o: FT:src/base/ftbitmap.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftbitmap.c
+
+ftcid.ppc.o: FT:src/base/ftcid.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftcid.c
+
+ftdebug.ppc.o: FT:src/base/ftdebug.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftdebug.c
+
+# pure version for use in run-time library etc
+ftdebugpure.ppc.o: src/base/ftdebug.c
+       $(CC) -c $(CFLAGS) -o $@ src/base/ftdebug.c
+
+ftfstype.ppc.o: FT:src/base/ftfstype.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftfstype.c
+
+ftgasp.ppc.o: FT:src/base/ftgasp.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftgasp.c
+
+ftglyph.ppc.o: FT:src/base/ftglyph.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftglyph.c
+
+ftgxval.ppc.o: FT:src/base/ftgxval.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftgxval.c
+
+ftlcdfil.ppc.o: FT:src/base/ftlcdfil.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftlcdfil.c
+
+ftmm.ppc.o: FT:src/base/ftmm.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftmm.c
+
+ftotval.ppc.o: FT:src/base/ftotval.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftotval.c
+
+ftpatent.ppc.o: FT:src/base/ftpatent.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftpatent.c
+
+ftpfr.ppc.o: FT:src/base/ftpfr.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftpfr.c
+
+ftstroke.ppc.o: FT:src/base/ftstroke.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftstroke.c
+
+ftsynth.ppc.o: FT:src/base/ftsynth.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftsynth.c
+
+fttype1.ppc.o: FT:src/base/fttype1.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/fttype1.c
+
+ftwinfnt.ppc.o: FT:src/base/ftwinfnt.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftwinfnt.c
+
+ftxf86.ppc.o: FT:src/base/ftxf86.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/base/ftxf86.c
+
+#
+# FreeType2 library autofitting module
+#
+autofit.ppc.o: FT:src/autofit/autofit.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/autofit/autofit.c
+
+#
+# FreeType2 library postscript hinting module
+#
+pshinter.ppc.o: FT:src/pshinter/pshinter.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/pshinter/pshinter.c
+
+#
+# FreeType2 library PS support module
+#
+psaux.ppc.o: FT:src/psaux/psaux.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/psaux/psaux.c
+
+#
+# FreeType2 library PS glyph names module
+#
+psnames.ppc.o: FT:src/psnames/psnames.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/psnames/psnames.c
+
+#
+# FreeType2 library monochrome raster module
+#
+raster.ppc.o: FT:src/raster/raster.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/raster/raster.c
+
+#
+# FreeType2 library anti-aliasing raster module
+#
+smooth.ppc.o: FT:src/smooth/smooth.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/smooth/smooth.c
+
+#
+# FreeType2 library 'sfnt' module
+#
+sfnt.ppc.o: FT:src/sfnt/sfnt.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/sfnt/sfnt.c
+
+#
+# FreeType2 library glyph and image caching system
+#
+ftcache.ppc.o: FT:src/cache/ftcache.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/cache/ftcache.c
+
+#
+# FreeType2 library OpenType font driver
+#
+cff.ppc.o: FT:src/cff/cff.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/cff/cff.c
+
+#
+# FreeType2 library TrueType font driver
+#
+truetype.ppc.o: FT:src/truetype/truetype.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/truetype/truetype.c
+
+#
+# FreeType2 library Type1 font driver
+#
+type1.ppc.o: FT:src/type1/type1.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/type1/type1.c
+
+#
+# FreeType2 library Type42 font driver
+#
+type42.ppc.o: FT:src/type42/type42.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/type42/type42.c
+
+#
+# FreeType2 library CID-keyed Type1 font driver
+#
+type1cid.ppc.o: FT:src/cid/type1cid.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/cid/type1cid.c
+
+#
+# FreeType2 library BDF bitmap font driver
+#
+bdf.ppc.o: FT:src/bdf/bdf.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/bdf/bdf.c
+
+#
+# FreeType2 library PCF bitmap font driver
+#
+pcf.ppc.o: FT:src/pcf/pcf.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/pcf/pcf.c
+
+#
+# FreeType2 library gzip support for compressed PCF bitmap fonts
+#
+gzip.ppc.o: FT:src/gzip/ftgzip.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/gzip/ftgzip.c
+
+#
+# FreeType2 library bzip2 support for compressed PCF bitmap fonts
+#
+bzip2.ppc.o: FT:src/bzip2/ftbzip2.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/bzip2/ftbzip2.c
+
+#
+# FreeType2 library compress support for compressed PCF bitmap fonts
+#
+lzw.ppc.o: FT:src/lzw/ftlzw.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/lzw/ftlzw.c
+
+#
+# FreeType2 library PFR font driver
+#
+pfr.ppc.o: FT:src/pfr/pfr.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/pfr/pfr.c
+
+#
+# FreeType2 library Windows FNT/FON bitmap font driver
+#
+winfnt.ppc.o: FT:src/winfonts/winfnt.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/winfonts/winfnt.c
+
+#
+# FreeType2 library TrueTypeGX Validator
+#
+gxvalid.ppc.o: FT:src/gxvalid/gxvalid.c
+       $(CC) -c $(CFLAGS) -Wno-aggregate-return -o $@ /FT/src/gxvalid/gxvalid.c
+
+#
+# FreeType2 library OpenType validator
+#
+otvalid.ppc.o: FT:src/otvalid/otvalid.c
+       $(CC) -c $(CFLAGS) -o $@ /FT/src/otvalid/otvalid.c
+
+BASE = ftbase.ppc.o ftbbox.ppc.o ftbdf.ppc.o ftbitmap.ppc.o ftcid.ppc.o   \
+       ftfstype.ppc.o ftgasp.ppc.o ftglyph.ppc.o ftgxval.ppc.o            \
+       ftlcdfil.ppc.o ftmm.ppc.o ftotval.ppc.o ftpatent.ppc.o ftpfr.ppc.o \
+       ftstroke.ppc.o ftsynth.ppc.o fttype1.ppc.o ftwinfnt.ppc.o          \
+       ftxf86.ppc.o
+
+DEBUG = ftdebug.ppc.o ftdebugpure.ppc.o
+
+AFIT = autofit.ppc.o
+
+GXV = gxvalid.ppc.o
+
+OTV = otvalid.ppc.o
+
+PS = psaux.ppc.o psnames.ppc.o pshinter.ppc.o
+
+RASTER = raster.ppc.o smooth.ppc.o
+
+FONTD = cff.ppc.o type1.ppc.o type42.ppc.o type1cid.ppc.o truetype.ppc.o\
+       bdf.ppc.o pcf.ppc.o pfr.ppc.o winfnt.ppc.o
+
+libft2_ppc.a:      $(BASE) $(AFIT) $(GXV) $(OTV) $(PS) $(RASTER) sfnt.ppc.o ftcache.ppc.o $(FONTD) gzip.ppc.o lzw.ppc.o
+       $(AR) r $@ $(BASE) $(AFIT) $(GXV) $(OTV) $(PS) $(RASTER) sfnt.ppc.o ftcache.ppc.o $(FONTD) gzip.ppc.o lzw.ppc.o
+       $(RANLIB) $@
+
+#Local Variables:
+#coding: latin-1
+#End:
diff --git a/builds/amiga/smakefile b/builds/amiga/smakefile
new file mode 100644 (file)
index 0000000..097aec9
--- /dev/null
@@ -0,0 +1,303 @@
+#
+# Makefile for FreeType2 link library using Amiga SAS/C 6.58
+#
+
+
+# Copyright 2005,2006, 2007, 2009 by
+# Werner Lemberg and Detlef Würkner.
+#
+# 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.
+
+
+# to build from the builds/amiga directory call
+#
+#  smake assign
+#  smake
+#
+# Your programs source code should start with this
+# (uncomment the parts you do not need to keep the program small):
+# ---8<---
+#define FT_USE_AUTOFIT // autofitter
+#define FT_USE_RASTER  // monochrome rasterizer
+#define FT_USE_SMOOTH  // anti-aliasing rasterizer
+#define FT_USE_TT      // truetype font driver
+#define FT_USE_T1      // type1 font driver
+#define FT_USE_T42     // type42 font driver
+#define FT_USE_T1CID   // cid-keyed type1 font driver
+#define FT_USE_CFF     // opentype font driver
+#define FT_USE_BDF     // bdf bitmap font driver
+#define FT_USE_PCF     // pcf bitmap font driver
+#define FT_USE_PFR     // pfr font driver
+#define FT_USE_WINFNT  // windows .fnt|.fon bitmap font driver
+#define FT_USE_OTV     // opentype validator
+#define FT_USE_GXV     // truetype gx validator
+#include "FT:src/base/ftinit.c"
+# ---8<---
+#
+# link your programs with ft2_680x0.lib and either ftsystem.o or ftsystempure.o
+# (and either ftdebug.o or ftdebugpure.o if you enabled FT_DEBUG_LEVEL_ERROR or
+# FT_DEBUG_LEVEL_TRACE in include/freetype/config/ftoption.h).
+
+OBJBASE = ftbase.o ftbbox.o ftbdf.o ftbitmap.o ftcid.o ftfstype.o ftgasp.o   \
+         ftglyph.o ftgxval.o ftlcdfil.o ftmm.o ftotval.o ftpatent.o ftpfr.o \
+         ftstroke.o ftsynth.o fttype1.o ftwinfnt.o ftxf86.o
+
+OBJSYSTEM = ftsystem.o ftsystempure.o
+
+OBJDEBUG = ftdebug.o ftdebugpure.o
+
+OBJAFIT = autofit.o
+
+OBJGXV = gxvalid.o
+
+OBJOTV = otvalid.o
+
+OBJPS = psaux.o psnames.o pshinter.o
+
+OBJRASTER = raster.o smooth.o
+
+OBJSFNT = sfnt.o
+
+OBJCACHE = ftcache.o
+
+OBJFONTD = cff.o type1.o type42.o type1cid.o\
+          truetype.o winfnt.o bdf.o pcf.o pfr.o
+
+CORE = FT:src/
+
+CPU       = 68000
+#CPU      = 68020
+#CPU      = 68030
+#CPU      = 68040
+#CPU      = 68060
+
+OPTIMIZER = optinlocal
+
+SCFLAGS = optimize opttime optsched strmerge data=faronly idlen=50 cpu=$(CPU)\
+         idir=include/ idir=$(CORE) idir=FT:include/ nostackcheck nochkabort\
+         noicons ignore=79,85,110,306 parameters=both define=FT2_BUILD_LIBRARY
+
+LIB  = ft2_$(CPU).lib
+
+# sample linker options
+OPTS = link lib=$(LIB),lib:sc.lib,lib:amiga.lib,lib:debug.lib\
+       smallcode smalldata noicons utillib
+
+# sample program entry
+#myprog: myprog.c ftsystem.o $(LIB)
+#      sc $< programname=$@ ftsystem.o $(SCFLAGS) $(OPTS)
+
+all:   $(LIB) $(OBJSYSTEM) $(OBJDEBUG)
+
+assign:
+       assign FT: //
+
+# uses separate object modules in lib to make for easier debugging
+# also, can make smaller programs if entire engine is not used
+ft2_$(CPU).lib:  $(OBJBASE) $(OBJAFIT) $(OBJOTV) $(OBJPS) $(OBJRASTER) $(OBJSFNT) $(OBJCACHE) $(OBJFONTD) lzw.o gzip.o bzip2.o
+       oml $@ r $(OBJBASE) $(OBJAFIT) $(OBJOTV) $(OBJPS) $(OBJRASTER) $(OBJSFNT) $(OBJCACHE) $(OBJFONTD) lzw.o gzip.o bzip2.o
+
+clean:
+       -delete \#?.o
+
+realclean: clean
+       -delete ft2$(CPU).lib
+
+#
+# freetype library base
+#
+ftbase.o: $(CORE)base/ftbase.c
+       sc $(SCFLAGS) objname=$@ $<
+ftinit.o: $(CORE)base/ftinit.c
+       sc $(SCFLAGS) objname=$@ $<
+ftsystem.o: $(CORE)base/ftsystem.c
+       sc $(SCFLAGS) objname=$@ $<
+ftsystempure.o: src/base/ftsystem.c    ## pure version for use in run-time library etc
+       sc $(SCFLAGS) objname=$@ $<
+ftdebug.o: $(CORE)base/ftdebug.c
+       sc $(SCFLAGS) objname=$@ $<
+ftdebugpure.o: src/base/ftdebug.c      ## pure version for use in run-time library etc
+       sc $(SCFLAGS) objname=$@ $<
+#
+# freetype library base extensions
+#
+ftbbox.o: $(CORE)base/ftbbox.c
+       sc $(SCFLAGS) objname=$@ $<
+ftbdf.o: $(CORE)base/ftbdf.c
+       sc $(SCFLAGS) objname=$@ $<
+ftbitmap.o: $(CORE)base/ftbitmap.c
+       sc $(SCFLAGS) objname=$@ $<
+ftcid.o: $(CORE)base/ftcid.c
+       sc $(SCFLAGS) objname=$@ $<
+ftfstype.o: $(CORE)base/ftfstype.c
+       sc $(SCFLAGS) objname=$@ $<
+ftgasp.o: $(CORE)base/ftgasp.c
+       sc $(SCFLAGS) objname=$@ $<
+ftglyph.o: $(CORE)base/ftglyph.c
+       sc $(SCFLAGS) objname=$@ $<
+ftgxval.o: $(CORE)base/ftgxval.c
+       sc $(SCFLAGS) objname=$@ $<
+ftlcdfil.o: $(CORE)base/ftlcdfil.c
+       sc $(SCFLAGS) objname=$@ $<
+ftmm.o: $(CORE)base/ftmm.c
+       sc $(SCFLAGS) objname=$@ $<
+ftotval.o: $(CORE)base/ftotval.c
+       sc $(SCFLAGS) objname=$@ $<
+ftpatent.o: $(CORE)base/ftpatent.c
+       sc $(SCFLAGS) objname=$@ $<
+ftpfr.o: $(CORE)base/ftpfr.c
+       sc $(SCFLAGS) objname=$@ $<
+ftstroke.o: $(CORE)base/ftstroke.c
+       sc $(SCFLAGS) objname=$@ $<
+ftsynth.o: $(CORE)base/ftsynth.c
+       sc $(SCFLAGS) objname=$@ $<
+fttype1.o: $(CORE)base/fttype1.c
+       sc $(SCFLAGS) objname=$@ $<
+ftwinfnt.o: $(CORE)base/ftwinfnt.c
+       sc $(SCFLAGS) objname=$@ $<
+ftxf86.o: $(CORE)base/ftxf86.c
+       sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library autofitter module
+#
+autofit.o: $(CORE)autofit/autofit.c
+       sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library PS hinting module
+#
+pshinter.o: $(CORE)pshinter/pshinter.c
+       sc $(SCFLAGS) objname=$@ $<
+#
+# freetype library PS support module
+#
+psaux.o: $(CORE)psaux/psaux.c
+       sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library PS glyph names module
+#
+psnames.o: $(CORE)psnames/psnames.c
+       sc $(SCFLAGS) code=far objname=$@ $<
+
+#
+# freetype library monochrome raster module
+#
+raster.o: $(CORE)raster/raster.c
+       sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library anti-aliasing raster module
+#
+smooth.o: $(CORE)smooth/smooth.c
+       sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library 'sfnt' module
+#
+sfnt.o: $(CORE)sfnt/sfnt.c
+       sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library glyph and image caching system (still experimental)
+#
+ftcache.o: $(CORE)cache/ftcache.c
+       sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library OpenType font driver
+#
+cff.o: $(CORE)cff/cff.c
+       sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library TrueType font driver
+#
+truetype.o: $(CORE)truetype/truetype.c
+       sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library Type1 font driver
+#
+type1.o: $(CORE)type1/type1.c
+       sc $(SCFLAGS) objname=$@ $<
+
+#
+# FreeType2 library Type42 font driver
+#
+type42.o: $(CORE)type42/type42.c
+       sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library CID-keyed Type1 font driver
+#
+type1cid.o: $(CORE)cid/type1cid.c
+       sc $(SCFLAGS) objname=$@ $<
+#
+# freetype library CID-keyed Type1 font driver extensions
+#
+#cidafm.o: $(CORE)cid/cidafm.c
+#      sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library BDF bitmap font driver
+#
+bdf.o: $(CORE)bdf/bdf.c
+       sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library PCF bitmap font driver
+#
+pcf.o: $(CORE)pcf/pcf.c
+       sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library gzip support for compressed PCF bitmap fonts
+#
+gzip.o: $(CORE)gzip/ftgzip.c
+       sc $(SCFLAGS) define FAR objname=$@ $<
+
+#
+# freetype library bzip2 support for compressed PCF bitmap fonts
+#
+bzip2.o: $(CORE)bzip2/ftbzip2.c
+       sc $(SCFLAGS) define FAR objname=$@ $<
+
+#
+# freetype library compress support for compressed PCF bitmap fonts
+#
+lzw.o: $(CORE)lzw/ftlzw.c
+       sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library PFR font driver
+#
+pfr.o: $(CORE)pfr/pfr.c
+       sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library Windows FNT/FON bitmap font driver
+#
+winfnt.o: $(CORE)winfonts/winfnt.c
+       sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library TrueTypeGX validator
+#
+gxvalid.o: $(CORE)gxvalid/gxvalid.c
+       sc $(SCFLAGS) objname=$@ $<
+
+#
+# freetype library OpenType validator
+#
+otvalid.o: $(CORE)otvalid/otvalid.c
+       sc $(SCFLAGS) objname=$@ $<
+
+#Local Variables:
+#coding: latin-1
+#End:
diff --git a/builds/amiga/src/base/ftdebug.c b/builds/amiga/src/base/ftdebug.c
new file mode 100644 (file)
index 0000000..5284e69
--- /dev/null
@@ -0,0 +1,279 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftdebug.c                                                              */
+/*                                                                         */
+/*    Debugging and logging component (body).                              */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2004, 2005 by                               */
+/*  David Turner, Robert Wilhelm, Werner Lemberg and Detlef Würkner.       */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This component contains various macros and functions used to ease the */
+  /* debugging of the FreeType engine.  Its main purpose is in assertion   */
+  /* checking, tracing, and error detection.                               */
+  /*                                                                       */
+  /* There are now three debugging modes:                                  */
+  /*                                                                       */
+  /* - trace mode                                                          */
+  /*                                                                       */
+  /*   Error and trace messages are sent to the log file (which can be the */
+  /*   standard error output).                                             */
+  /*                                                                       */
+  /* - error mode                                                          */
+  /*                                                                       */
+  /*   Only error messages are generated.                                  */
+  /*                                                                       */
+  /* - release mode:                                                       */
+  /*                                                                       */
+  /*   No error message is sent or generated.  The code is free from any   */
+  /*   debugging parts.                                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+/*
+ * Based on the default ftdebug.c,
+ * replaced vprintf() with KVPrintF(),
+ * commented out exit(),
+ * replaced getenv() with GetVar().
+ */
+
+#include <exec/types.h>
+#include <utility/tagitem.h>
+#include <dos/exall.h>
+#include <dos/var.h>
+#define __NOLIBBASE__
+#define __NOLOBALIFACE__
+#define __USE_INLINE__
+#include <proto/dos.h>
+#include <clib/debug_protos.h>
+
+#ifndef __amigaos4__
+extern struct Library *DOSBase;
+#else
+extern struct DOSIFace *IDOS;
+#endif
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_INTERNAL_DEBUG_H
+
+
+#if defined( FT_DEBUG_LEVEL_ERROR )
+
+  /* documentation is in ftdebug.h */
+
+  FT_BASE_DEF( void )
+  FT_Message( const char*  fmt, ... )
+  {
+    va_list  ap;
+
+
+    va_start( ap, fmt );
+/*  vprintf( fmt, ap ); */
+    KVPrintF( fmt, ap );
+    va_end( ap );
+  }
+
+
+  /* documentation is in ftdebug.h */
+
+  FT_BASE_DEF( void )
+  FT_Panic( const char*  fmt, ... )
+  {
+    va_list  ap;
+
+
+    va_start( ap, fmt );
+/*  vprintf( fmt, ap ); */
+    KVPrintF( fmt, ap );
+    va_end( ap );
+
+/*  exit( EXIT_FAILURE ); */
+  }
+
+#endif /* FT_DEBUG_LEVEL_ERROR */
+
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+  /* array of trace levels, initialized to 0 */
+  int  ft_trace_levels[trace_count];
+
+
+  /* define array of trace toggle names */
+#define FT_TRACE_DEF( x )  #x ,
+
+  static const char*  ft_trace_toggles[trace_count + 1] =
+  {
+#include FT_INTERNAL_TRACE_H
+    NULL
+  };
+
+#undef FT_TRACE_DEF
+
+
+  /* documentation is in ftdebug.h */
+
+  FT_BASE_DEF( FT_Int )
+  FT_Trace_Get_Count( void )
+  {
+    return trace_count;
+  }
+
+
+  /* documentation is in ftdebug.h */
+
+  FT_BASE_DEF( const char * )
+  FT_Trace_Get_Name( FT_Int  idx )
+  {
+    int  max = FT_Trace_Get_Count();
+
+
+    if ( idx < max )
+      return ft_trace_toggles[idx];
+    else
+      return NULL;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Initialize the tracing sub-system.  This is done by retrieving the    */
+  /* value of the `FT2_DEBUG' environment variable.  It must be a list of  */
+  /* toggles, separated by spaces, `;', or `,'.  Example:                  */
+  /*                                                                       */
+  /*    export FT2_DEBUG="any:3 memory:7 stream:5"                         */
+  /*                                                                       */
+  /* This requests that all levels be set to 3, except the trace level for */
+  /* the memory and stream components which are set to 7 and 5,            */
+  /* respectively.                                                         */
+  /*                                                                       */
+  /* See the file <include/freetype/internal/fttrace.h> for details of the */
+  /* available toggle names.                                               */
+  /*                                                                       */
+  /* The level must be between 0 and 7; 0 means quiet (except for serious  */
+  /* runtime errors), and 7 means _very_ verbose.                          */
+  /*                                                                       */
+  FT_BASE_DEF( void )
+  ft_debug_init( void )
+  {
+/*  const char*  ft2_debug = getenv( "FT2_DEBUG" ); */
+    char         buf[256];
+    const char*  ft2_debug = &buf[0];
+
+
+/*  if ( ft2_debug ) */
+    if ( GetVar( "FT2_DEBUG", (STRPTR)ft2_debug, 256, LV_VAR ) > 0 )
+    {
+      const char*  p = ft2_debug;
+      const char*  q;
+
+
+      for ( ; *p; p++ )
+      {
+        /* skip leading whitespace and separators */
+        if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' )
+          continue;
+
+        /* read toggle name, followed by ':' */
+        q = p;
+        while ( *p && *p != ':' )
+          p++;
+
+        if ( *p == ':' && p > q )
+        {
+          FT_Int  n, i, len = (FT_Int)( p - q );
+          FT_Int  level = -1, found = -1;
+
+
+          for ( n = 0; n < trace_count; n++ )
+          {
+            const char*  toggle = ft_trace_toggles[n];
+
+
+            for ( i = 0; i < len; i++ )
+            {
+              if ( toggle[i] != q[i] )
+                break;
+            }
+
+            if ( i == len && toggle[i] == 0 )
+            {
+              found = n;
+              break;
+            }
+          }
+
+          /* read level */
+          p++;
+          if ( *p )
+          {
+            level = *p++ - '0';
+            if ( level < 0 || level > 7 )
+              level = -1;
+          }
+
+          if ( found >= 0 && level >= 0 )
+          {
+            if ( found == trace_any )
+            {
+              /* special case for `any' */
+              for ( n = 0; n < trace_count; n++ )
+                ft_trace_levels[n] = level;
+            }
+            else
+              ft_trace_levels[found] = level;
+          }
+        }
+      }
+    }
+  }
+
+
+#else  /* !FT_DEBUG_LEVEL_TRACE */
+
+
+  FT_BASE_DEF( void )
+  ft_debug_init( void )
+  {
+    /* nothing */
+  }
+
+
+  FT_BASE_DEF( FT_Int )
+  FT_Trace_Get_Count( void )
+  {
+    return 0;
+  }
+
+
+  FT_BASE_DEF( const char * )
+  FT_Trace_Get_Name( FT_Int  idx )
+  {
+    FT_UNUSED( idx );
+
+    return NULL;
+  }
+
+
+#endif /* !FT_DEBUG_LEVEL_TRACE */
+
+/*
+Local Variables:
+coding: latin-1
+End:
+*/
+/* END */
diff --git a/builds/amiga/src/base/ftsystem.c b/builds/amiga/src/base/ftsystem.c
new file mode 100644 (file)
index 0000000..6f9eac1
--- /dev/null
@@ -0,0 +1,530 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsystem.c                                                             */
+/*                                                                         */
+/*    Amiga-specific FreeType low-level system interface (body).           */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2005, 2006, 2007, 2010 by                   */
+/*  David Turner, Robert Wilhelm, Werner Lemberg and Detlef Würkner.       */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file contains the Amiga interface used by FreeType to access     */
+  /* low-level, i.e. memory management, i/o access as well as thread       */
+  /* synchronisation.                                                      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Maintained by Detlef Würkner <TetiSoft@apg.lahn.de>                   */
+  /*                                                                       */
+  /* Based on the original ftsystem.c,                                     */
+  /* modified to avoid fopen(), fclose(), fread(), fseek(), ftell(),       */
+  /* malloc(), realloc(), and free().                                      */
+  /*                                                                       */
+  /* Those C library functions are often not thread-safe or cant be        */
+  /* used in a shared Amiga library. If that's not a problem for you,       */
+  /* you can of course use the default ftsystem.c with C library calls     */
+  /* instead.                                                              */
+  /*                                                                       */
+  /* This implementation needs exec V39+ because it uses AllocPooled() etc */
+  /*                                                                       */
+  /*************************************************************************/
+
+#define __NOLIBBASE__
+#define __NOGLOBALIFACE__
+#define __USE_INLINE__
+#include <proto/exec.h>
+#include <dos/stdio.h>
+#include <proto/dos.h>
+#ifdef __amigaos4__
+extern struct ExecIFace *IExec;
+extern struct DOSIFace  *IDOS;
+#else
+extern struct Library   *SysBase;
+extern struct Library   *DOSBase;
+#endif
+
+#define IOBUF_SIZE 512
+
+/* structure that helps us to avoid
+ * useless calls of Seek() and Read()
+ */
+struct SysFile
+{
+  BPTR  file;
+  ULONG iobuf_start;
+  ULONG iobuf_end;
+  UBYTE iobuf[IOBUF_SIZE];
+};
+
+#ifndef __amigaos4__
+/* C implementation of AllocVecPooled (see autodoc exec/AllocPooled) */
+APTR
+Alloc_VecPooled( APTR   poolHeader,
+                 ULONG  memSize )
+{
+  ULONG  newSize = memSize + sizeof ( ULONG );
+  ULONG  *mem = AllocPooled( poolHeader, newSize );
+
+  if ( !mem )
+    return NULL;
+  *mem = newSize;
+  return mem + 1;
+}
+
+/* C implementation of FreeVecPooled (see autodoc exec/AllocPooled) */
+void
+Free_VecPooled( APTR  poolHeader,
+                APTR  memory )
+{
+  ULONG  *realmem = (ULONG *)memory - 1;
+
+  FreePooled( poolHeader, realmem, *realmem );
+}
+#endif
+
+#include <ft2build.h>
+#include FT_CONFIG_CONFIG_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_SYSTEM_H
+#include FT_ERRORS_H
+#include FT_TYPES_H
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                       MEMORY MANAGEMENT INTERFACE                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* It is not necessary to do any error checking for the                  */
+  /* allocation-related functions.  This is done by the higher level       */
+  /* routines like ft_mem_alloc() or ft_mem_realloc().                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_alloc                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The memory allocation function.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory :: A pointer to the memory object.                          */
+  /*                                                                       */
+  /*    size   :: The requested size in bytes.                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The address of newly allocated block.                              */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void* )
+  ft_alloc( FT_Memory  memory,
+            long       size )
+  {
+#ifdef __amigaos4__
+    return AllocVecPooled( memory->user, size );
+#else
+    return Alloc_VecPooled( memory->user, size );
+#endif
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_realloc                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The memory reallocation function.                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory   :: A pointer to the memory object.                        */
+  /*                                                                       */
+  /*    cur_size :: The current size of the allocated memory block.        */
+  /*                                                                       */
+  /*    new_size :: The newly requested size in bytes.                     */
+  /*                                                                       */
+  /*    block    :: The current address of the block in memory.            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The address of the reallocated memory block.                       */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void* )
+  ft_realloc( FT_Memory  memory,
+              long       cur_size,
+              long       new_size,
+              void*      block )
+  {
+    void* new_block;
+
+#ifdef __amigaos4__
+    new_block = AllocVecPooled ( memory->user, new_size );
+#else
+    new_block = Alloc_VecPooled ( memory->user, new_size );
+#endif
+    if ( new_block != NULL )
+    {
+      CopyMem ( block, new_block,
+                ( new_size > cur_size ) ? cur_size : new_size );
+#ifdef __amigaos4__
+      FreeVecPooled ( memory->user, block );
+#else
+      Free_VecPooled ( memory->user, block );
+#endif
+    }
+    return new_block;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_free                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The memory release function.                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory  :: A pointer to the memory object.                         */
+  /*                                                                       */
+  /*    block   :: The address of block in memory to be freed.             */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void )
+  ft_free( FT_Memory  memory,
+           void*      block )
+  {
+#ifdef __amigaos4__
+    FreeVecPooled( memory->user, block );
+#else
+    Free_VecPooled( memory->user, block );
+#endif
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                     RESOURCE MANAGEMENT INTERFACE                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_io
+
+  /* We use the macro STREAM_FILE for convenience to extract the       */
+  /* system-specific stream handle from a given FreeType stream object */
+#define STREAM_FILE( stream )  ( (struct SysFile *)stream->descriptor.pointer )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_amiga_stream_close                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The function to close a stream.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: A pointer to the stream object.                          */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void )
+  ft_amiga_stream_close( FT_Stream  stream )
+  {
+    struct SysFile* sysfile;
+
+    sysfile = STREAM_FILE( stream );
+    Close ( sysfile->file );
+    FreeMem ( sysfile, sizeof ( struct SysFile ));
+
+    stream->descriptor.pointer = NULL;
+    stream->size               = 0;
+    stream->base               = 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_amiga_stream_io                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The function to open a stream.                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: A pointer to the stream object.                          */
+  /*                                                                       */
+  /*    offset :: The position in the data stream to start reading.        */
+  /*                                                                       */
+  /*    buffer :: The address of buffer to store the read data.            */
+  /*                                                                       */
+  /*    count  :: The number of bytes to read from the stream.             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The number of bytes actually read.                                 */
+  /*                                                                       */
+  FT_CALLBACK_DEF( unsigned long )
+  ft_amiga_stream_io( FT_Stream       stream,
+                      unsigned long   offset,
+                      unsigned char*  buffer,
+                      unsigned long   count )
+  {
+    struct SysFile* sysfile;
+    unsigned long   read_bytes;
+
+    if ( count != 0 )
+    {
+      sysfile = STREAM_FILE( stream );
+
+      /* handle the seek */
+      if ( (offset < sysfile->iobuf_start) || (offset + count > sysfile->iobuf_end) )
+      {
+        /* requested offset implies we need a buffer refill */
+        if ( !sysfile->iobuf_end || offset != sysfile->iobuf_end )
+        {
+          /* a physical seek is necessary */
+          Seek( sysfile->file, offset, OFFSET_BEGINNING );
+        }
+        sysfile->iobuf_start = offset;
+        sysfile->iobuf_end = 0; /* trigger a buffer refill */
+      }
+
+      /* handle the read */
+      if ( offset + count <= sysfile->iobuf_end )
+      {
+        /* we have buffer and requested bytes are all inside our buffer */
+        CopyMem( &sysfile->iobuf[offset - sysfile->iobuf_start], buffer, count );
+        read_bytes = count;
+      }
+      else
+      {
+        /* (re)fill buffer */
+        if ( count <= IOBUF_SIZE )
+        {
+          /* requested bytes is a subset of the buffer */
+          read_bytes = Read( sysfile->file, sysfile->iobuf, IOBUF_SIZE );
+          if ( read_bytes == -1UL )
+          {
+            /* error */
+            read_bytes = 0;
+          }
+          else
+          {
+            sysfile->iobuf_end = offset + read_bytes;
+            CopyMem( sysfile->iobuf, buffer, count );
+            if ( read_bytes > count )
+            {
+              read_bytes = count;
+            }
+          }
+        }
+        else
+        {
+          /* we actually need more than our buffer can hold, so we decide
+          ** to do a single big read, and then copy the last IOBUF_SIZE
+          ** bytes of that to our internal buffer for later use */
+          read_bytes = Read( sysfile->file, buffer, count );
+          if ( read_bytes == -1UL )
+          {
+            /* error */
+            read_bytes = 0;
+          }
+          else
+          {
+            ULONG bufsize;
+
+            bufsize = ( read_bytes > IOBUF_SIZE ) ? IOBUF_SIZE : read_bytes;
+            sysfile->iobuf_end = offset + read_bytes;
+            sysfile->iobuf_start = sysfile->iobuf_end - bufsize;
+            CopyMem( &buffer[read_bytes - bufsize] , sysfile->iobuf, bufsize );
+          }
+        }
+      }
+    }
+    else
+    {
+      read_bytes = 0;
+    }
+
+    return read_bytes;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_Open( FT_Stream    stream,
+                  const char*  filepathname )
+  {
+    struct FileInfoBlock*  fib;
+    struct SysFile*        sysfile;
+
+
+    if ( !stream )
+      return FT_Err_Invalid_Stream_Handle;
+
+#ifdef __amigaos4__
+    sysfile = AllocMem ( sizeof (struct SysFile ), MEMF_SHARED );
+#else
+    sysfile = AllocMem ( sizeof (struct SysFile ), MEMF_PUBLIC );
+#endif
+    if ( !sysfile )
+    {
+      FT_ERROR(( "FT_Stream_Open:" ));
+      FT_ERROR(( " could not open `%s'\n", filepathname ));
+
+      return FT_Err_Cannot_Open_Resource;
+    }
+    sysfile->file = Open( (STRPTR)filepathname, MODE_OLDFILE );
+    if ( !sysfile->file )
+    {
+      FreeMem ( sysfile, sizeof ( struct SysFile ));
+      FT_ERROR(( "FT_Stream_Open:" ));
+      FT_ERROR(( " could not open `%s'\n", filepathname ));
+
+      return FT_Err_Cannot_Open_Resource;
+    }
+
+    fib = AllocDosObject( DOS_FIB, NULL );
+    if ( !fib )
+    {
+      Close ( sysfile->file );
+      FreeMem ( sysfile, sizeof ( struct SysFile ));
+      FT_ERROR(( "FT_Stream_Open:" ));
+      FT_ERROR(( " could not open `%s'\n", filepathname ));
+
+      return FT_Err_Cannot_Open_Resource;
+    }
+    if ( !( ExamineFH( sysfile->file, fib ) ) )
+    {
+      FreeDosObject( DOS_FIB, fib );
+      Close ( sysfile->file );
+      FreeMem ( sysfile, sizeof ( struct SysFile ));
+      FT_ERROR(( "FT_Stream_Open:" ));
+      FT_ERROR(( " could not open `%s'\n", filepathname ));
+
+      return FT_Err_Cannot_Open_Resource;
+    }
+    stream->size = fib->fib_Size;
+    FreeDosObject( DOS_FIB, fib );
+
+    stream->descriptor.pointer = (void *)sysfile;
+    stream->pathname.pointer   = (char*)filepathname;
+    sysfile->iobuf_start       = 0;
+    sysfile->iobuf_end         = 0;
+    stream->pos                = 0;
+
+    stream->read  = ft_amiga_stream_io;
+    stream->close = ft_amiga_stream_close;
+
+    if ( !stream->size )
+    {
+      ft_amiga_stream_close( stream );
+      FT_ERROR(( "FT_Stream_Open:" ));
+      FT_ERROR(( " opened `%s' but zero-sized\n", filepathname ));
+      return FT_Err_Cannot_Open_Stream;;
+    }
+
+    FT_TRACE1(( "FT_Stream_Open:" ));
+    FT_TRACE1(( " opened `%s' (%ld bytes) successfully\n",
+                filepathname, stream->size ));
+
+    return FT_Err_Ok;
+  }
+
+
+#ifdef FT_DEBUG_MEMORY
+
+  extern FT_Int
+  ft_mem_debug_init( FT_Memory  memory );
+
+  extern void
+  ft_mem_debug_done( FT_Memory  memory );
+
+#endif
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( FT_Memory )
+  FT_New_Memory( void )
+  {
+    FT_Memory  memory;
+
+
+#ifdef __amigaos4__
+    memory = (FT_Memory)AllocVec( sizeof ( *memory ), MEMF_SHARED );
+#else
+    memory = (FT_Memory)AllocVec( sizeof ( *memory ), MEMF_PUBLIC );
+#endif
+    if ( memory )
+    {
+#ifdef __amigaos4__
+      memory->user = CreatePool( MEMF_SHARED, 16384, 16384 );
+#else
+      memory->user = CreatePool( MEMF_PUBLIC, 16384, 16384 );
+#endif
+      if ( memory->user == NULL )
+      {
+        FreeVec( memory );
+        memory = NULL;
+      }
+      else
+      {
+        memory->alloc   = ft_alloc;
+        memory->realloc = ft_realloc;
+        memory->free    = ft_free;
+#ifdef FT_DEBUG_MEMORY
+        ft_mem_debug_init( memory );
+#endif
+      }
+    }
+
+    return memory;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( void )
+  FT_Done_Memory( FT_Memory  memory )
+  {
+#ifdef FT_DEBUG_MEMORY
+    ft_mem_debug_done( memory );
+#endif
+
+    DeletePool( memory->user );
+    FreeVec( memory );
+  }
+
+/*
+Local Variables:
+coding: latin-1
+End:
+*/
+/* END */
diff --git a/builds/ansi/ansi-def.mk b/builds/ansi/ansi-def.mk
new file mode 100644 (file)
index 0000000..2c58572
--- /dev/null
@@ -0,0 +1,74 @@
+#
+# FreeType 2 configuration rules for a `normal' ANSI system
+#
+
+
+# Copyright 1996-2000, 2003, 2006 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.
+
+
+DELETE    := rm -f
+CAT       := cat
+SEP       := /
+BUILD_DIR := $(TOP_DIR)/builds/ansi
+PLATFORM  := ansi
+
+
+# The directory where all library files are placed.
+#
+# By default, this is the same as $(OBJ_DIR); however, this can be changed
+# to suit particular needs.
+#
+LIB_DIR := $(OBJ_DIR)
+
+
+# The name of the final library file.  Note that the DOS-specific Makefile
+# uses a shorter (8.3) name.
+#
+LIBRARY := lib$(PROJECT)
+
+
+# Path inclusion flag.  Some compilers use a different flag than `-I' to
+# specify an additional include path.  Examples are `/i=' or `-J'.
+#
+I := -I
+
+
+# C flag used to define a macro before the compilation of a given source
+# object.  Usually it is `-D' like in `-DDEBUG'.
+#
+D := -D
+
+
+# The link flag used to specify a given library file on link.  Note that
+# this is only used to compile the demo programs, not the library itself.
+#
+L := -l
+
+
+# Target flag.
+#
+T := -o$(space)
+
+
+# C flags
+#
+#   These should concern: debug output, optimization & warnings.
+#
+#   Use the ANSIFLAGS variable to define the compiler flags used to enfore
+#   ANSI compliance.
+#
+CFLAGS ?= -c
+
+# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
+#
+ANSIFLAGS :=
+
+
+# EOF
diff --git a/builds/ansi/ansi.mk b/builds/ansi/ansi.mk
new file mode 100644 (file)
index 0000000..32b3bac
--- /dev/null
@@ -0,0 +1,21 @@
+#
+# FreeType 2 configuration rules for a `normal' pseudo ANSI compiler/system
+#
+
+
+# Copyright 1996-2000 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.
+
+
+include $(TOP_DIR)/builds/ansi/ansi-def.mk
+include $(TOP_DIR)/builds/compiler/ansi-cc.mk
+include $(TOP_DIR)/builds/link_std.mk
+
+
+# EOF
diff --git a/builds/atari/ATARI.H b/builds/atari/ATARI.H
new file mode 100644 (file)
index 0000000..9f78c92
--- /dev/null
@@ -0,0 +1,20 @@
+#if defined( __GXVALID_H__ )
+#pragma warn -aus /* too many unevaluated variables in gxvalid */
+#endif
+
+#ifndef ATARI_H
+#define ATARI_H
+
+#pragma warn -stu
+
+/* PureC doesn't like 32bit enumerations */
+
+#ifndef FT_IMAGE_TAG
+#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 ) value
+#endif /* FT_IMAGE_TAG */
+
+#ifndef FT_ENC_TAG
+#define FT_ENC_TAG( value, a, b, c, d ) value
+#endif /* FT_ENC_TAG */
+
+#endif /* ATARI_H */
diff --git a/builds/atari/FNames.SIC b/builds/atari/FNames.SIC
new file mode 100644 (file)
index 0000000..f365717
--- /dev/null
@@ -0,0 +1,37 @@
+/* the following changes file names for PureC projects */
+
+if (argc > 0)
+{
+       ordner = argv[0];
+       if (basename(ordner) == "") /* ist Ordner */
+       {
+               ChangeFilenames(ordner);
+       }
+}
+
+proc ChangeFilenames(folder)
+local i,entries,directory,file;
+{
+       entries = filelist(directory,folder);
+       for (i = 0; i < entries; ++i)
+       {
+               file = directory[i,0];
+               if ((directory[i,3]&16) > 0) /* subdirectory */
+               {
+                       ChangeFilenames(folder+file+"\\");
+               }
+               else
+               {
+                       if ((stricmp(suffix(file),".h")==0)|(stricmp(suffix(file),".c")==0))
+                       ChangeFilename(folder,file);
+               }
+       }
+}
+
+proc ChangeFilename(path,datei)
+local newfile,err;
+{
+       newfile=datei;
+       newfile[0]=(newfile[0] | 32) ^ 32;
+       err=files.rename("-q",path+datei,newfile);
+}
diff --git a/builds/atari/FREETYPE.PRJ b/builds/atari/FREETYPE.PRJ
new file mode 100644 (file)
index 0000000..4776a5b
--- /dev/null
@@ -0,0 +1,32 @@
+;FreeType project file
+
+FREETYPE.LIB
+
+.C [-K -P -R -A]
+.L [-J -V]
+.S
+
+=
+
+..\..\src\base\ftsystem.c
+..\..\src\base\ftdebug.c
+
+..\..\src\base\ftinit.c
+..\..\src\base\ftglyph.c
+..\..\src\base\ftmm
+..\..\src\base\ftbbox
+
+..\..\src\base\ftbase.c
+..\..\src\autohint\autohint.c
+;..\..\src\cache\ftcache.c
+..\..\src\cff\cff.c
+..\..\src\cid\type1cid.c
+..\..\src\psaux\psaux.c
+..\..\src\pshinter\pshinter.c
+..\..\src\psnames\psnames.c
+..\..\src\raster\raster.c
+..\..\src\sfnt\sfnt.c
+..\..\src\smooth\smooth.c
+..\..\src\truetype\truetype.c
+..\..\src\type1\type1.c
+..\..\src\type42\type42.c
diff --git a/builds/atari/README.TXT b/builds/atari/README.TXT
new file mode 100644 (file)
index 0000000..04eec63
--- /dev/null
@@ -0,0 +1,51 @@
+Compiling FreeType 2 with PureC compiler
+========================================
+
+[See below for a German version.]
+
+To compile FreeType 2 as a library the following changes must be applied:
+
+- All *.c files must start with an uppercase letter.
+  (In case GEMSCRIPT is available:
+  Simply drag the whole FreeType 2 directory to the file `FNames.SIC'.)
+
+- You have to change the INCLUDE directory in PureC's compiler options
+  to contain both the `INCLUDE' and `freetype2\include' directory.
+  Example:
+
+    INCLUDE;E:\freetype2\include
+
+- The file `freetype2/include/Ft2build.h' must be patched as follows to
+  include ATARI.H:
+
+    #ifndef __FT2_BUILD_GENERIC_H__
+    #define __FT2_BUILD_GENERIC_H__
+
+    #include "ATARI.H"
+
+
+
+Compilieren von FreeType 2 mit PureC
+====================================
+
+Um FreeType 2 als eine Bibliothek (library) zu compilieren, muss folgendes
+ge\84ndert werden:
+
+- Alle *.c-files m\81ssen mit einem GROSSBUCHSTABEN beginnen.
+  (Falls GEMSCRIPT zur Verf\81gung steht:
+  Den kompletten Ordner freetype2 auf die Datei `FNames.SIC' draggen.)
+
+- In den Compiler-Optionen von PureC muss das INCLUDE directory auf INCLUDE
+  und freetype2\include verweisen. Z.B.:
+
+    INCLUDE;E:\freetype2\include
+
+- In der Datei freetype2/include/Ft2build.h muss zu Beginn
+  ein #include "ATARI.H" wie folgt eingef\81gt werden:
+
+    #ifndef __FT2_BUILD_GENERIC_H__
+    #define __FT2_BUILD_GENERIC_H__
+
+    #include "ATARI.H"
+
+--- end of README.TXT ---
diff --git a/builds/atari/deflinejoiner.awk b/builds/atari/deflinejoiner.awk
new file mode 100644 (file)
index 0000000..c872a70
--- /dev/null
@@ -0,0 +1,181 @@
+#!/usr/bin/env awk
+
+
+function shift( array, \
+                junk, elm0, l )
+{
+  elm0 = array[0]
+  for ( l = 0; l < asorti( array, junk ) - 1; l++ )
+    array[l] = array[l+1];
+  delete array[l]
+  return elm0
+}
+
+
+function init_cpp_src_line()
+{
+  logical_line = ""
+  delete break_pos 
+}
+
+
+function shift_valid_bp( array, \
+                         junk, elm )
+{
+  elm = -1
+
+  if ( 0 < asorti( array, junk ) )
+    do {
+      elm = shift( array )
+    } while ( 0 > elm );
+
+  return elm
+}
+
+
+function check_cpp_src_line_break_pos( \
+                                       i, junk )
+{
+  printf( "break_pos:" )
+  for ( i = 0; i < asorti( break_pos, junk ); i++ )
+    printf( " %d", break_pos[i] );
+  printf( "\n" )
+}
+
+
+function check_cpp_src_line()
+{
+  printf( "logical_line[%s]\n", logical_line )
+  check_cpp_src_line_break_pos()
+}
+
+
+function append_line( phys_line, \
+                      filt_line, bp_len )
+{
+  filt_line = phys_line
+  sub( /\\$/, " ", filt_line )
+  logical_line    = logical_line filt_line
+  bp_len = asorti( break_pos, junk )
+  break_pos[bp_len] = length( logical_line ) - 1
+}
+
+
+function print_line( \
+                     c0, c1, i, junk, part_str )
+{
+  c0 = 0
+
+  while( asorti( break_pos, junk ) > 1 )
+  {
+    if ( ( c1 = shift_valid_bp( break_pos ) ) < 1 )
+    {
+      part_str = substr( logical_line, c0 + 1 )
+      printf( "%s\n", part_str )
+      return
+    }
+
+    part_str = substr( logical_line, c0 + 1, c1 - c0 + 1 )
+    gsub( / $/, "\\", part_str )
+    printf( "%s\n", part_str )
+    c0 = c1 + 1
+  }
+
+  part_str = substr( logical_line, c0 + 1 )
+  printf( "%s\n", part_str )
+}
+
+
+function shrink_spaces( pos, \
+                        tail, removed_length, k )
+{
+  tail = substr( logical_line, pos )
+  sub( /^[ \t]+/, " ", tail )
+  removed_length = length( logical_line ) - pos - length( tail ) + 1
+  logical_line = substr( logical_line, 0, pos - 1 ) tail
+
+
+  for ( k = 0; k < asorti( break_pos, junk ); k++ )
+    if ( ( pos + removed_length ) <= break_pos[k] )
+      break_pos[k] = break_pos[k] - removed_length;
+    else if ( pos <= break_pos[k] )
+      break_pos[k] = -1;
+
+  return removed_length
+}
+
+
+function shrink_spaces_to_linebreak( pos, \
+                                     junk, part_str, removed_length, i )
+{
+  for ( i = 0; i < asorti( break_pos, junk ) && break_pos[i] < pos ; i++ )
+    ;
+  if ( break_pos[i] < 1 ) 
+    return;
+
+  part_str = substr( logical_line, pos, break_pos[i] - pos + 1 )
+  sub( /^[ \t]+/, " ", part_str )
+  removed_length = ( break_pos[i] - pos + 1 ) - length( part_str )
+
+  tail = substr( logical_line, pos + removed_length )
+  logical_line = substr( logical_line, 0, pos - 1 ) tail
+
+  for ( ; i < asorti( break_pos, junk ); i++ )
+    break_pos[i] -= removed_length;
+
+  return removed_length
+}
+
+
+function delete_linebreaks_in_2nd_token( \
+                                           tail, paren_depth, junk, i, j, k, l )
+{
+  if ( logical_line ~ /^[ \t]*#[ \t]*define[ \t]+[0-9A-Za-z_]+\(/ )
+  {
+    tail = logical_line
+    sub( /^[ \t]*#[ \t]*define[ \t]+[0-9A-Za-z_]+/, "", tail )
+
+    paren_depth = 0
+    l = 0
+    i = length( logical_line ) - length( tail ) + 1 # seek to the 1st op paren
+    j = i
+    do {
+      if ( substr( logical_line, j, 2 ) ~ /[ \t][ \t]/ )
+        l = shrink_spaces( j );
+      else if ( substr( logical_line, j, 1 ) == "(" )
+        paren_depth += 1;
+      else if ( substr( logical_line, j, 1 ) == ")" )
+        paren_depth -= 1;
+      j += 1
+    } while ( j < length( logical_line ) && paren_depth != 0 )
+
+    for ( k = 0; k < asorti( break_pos, junk ); k++ )
+      if ( i <= break_pos[k] && break_pos[k] < j )
+        break_pos[k] = -1;
+
+    if ( l > 0 )
+      shrink_spaces_to_linebreak( j );
+  }
+}
+
+
+BEGIN{
+  init_cpp_src_line()
+}
+{
+  append_line( $0 )
+  if ( $0 !~ /\\$/ )
+  {
+    delete_linebreaks_in_2nd_token()
+    print_line()
+    init_cpp_src_line()
+  }
+}
+END{
+  if ( 0 < length( logical_line ) )
+  {
+    delete_linebreaks_in_2nd_token()
+    print_line()
+  }
+}
diff --git a/builds/atari/gen-purec-patch.sh b/builds/atari/gen-purec-patch.sh
new file mode 100755 (executable)
index 0000000..1ec050c
--- /dev/null
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+TOP_DIR=.
+OBJ_DIR=.
+
+for x in "$@"
+do
+  case x"$x" in
+  x--srcdir=* | x--topdir=* )
+    TOP_DIR=`echo $x | sed 's/^--[a-z]*dir=//'`
+    ;;
+  x--builddir=* | x--objdir=* )
+    OBJ_DIR=`echo $x | sed 's/^--[a-z]*dir=//'`
+    ;;
+  esac
+done
+
+mkdir -p ${OBJ_DIR}/builds/atari/tmp/orig
+
+( cd ${TOP_DIR} && find . -name '*.[CHch]' -type f | fgrep -v builds/atari/tmp | cpio -o ) | \
+( cd ${OBJ_DIR}/builds/atari/tmp/orig && cpio -idum )
+cp ${TOP_DIR}/builds/atari/deflinejoiner.awk ${OBJ_DIR}/builds/atari/tmp
+
+pushd ${OBJ_DIR}/builds/atari/tmp
+
+  cp -pr orig purec
+  for f in `cd orig && find . -type f`
+  do
+    echo filter $f
+    env LANG=C awk -f deflinejoiner.awk < orig/$f > purec/$f
+  done
+
+  echo '#define FT2_BUILD_LIBRARY'  >  purec/include/ft2build.h
+  echo '#include "ATARI.H"'         >> purec/include/ft2build.h
+  env LANG=C awk -f deflinejoiner.awk < orig/include/ft2build.h >> purec/include/ft2build.h
+
+  env LANG=C diff -ur orig purec > ../purec.diff
+
+popd
+rm -rf ${OBJ_DIR}/builds/atari/tmp
diff --git a/builds/beos/beos-def.mk b/builds/beos/beos-def.mk
new file mode 100644 (file)
index 0000000..4371a30
--- /dev/null
@@ -0,0 +1,76 @@
+#
+# FreeType 2 configuration rules for a BeOS system
+#
+# this is similar to the "ansi-def.mk" file, except for BUILD and PLATFORM
+#
+
+
+# Copyright 1996-2000, 2003, 2006 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.
+
+
+DELETE    := rm -f
+CAT       := cat
+SEP       := /
+BUILD_DIR := $(TOP_DIR)/builds/beos
+PLATFORM  := beos
+
+
+# The directory where all library files are placed.
+#
+# By default, this is the same as $(OBJ_DIR); however, this can be changed
+# to suit particular needs.
+#
+LIB_DIR := $(OBJ_DIR)
+
+
+# The name of the final library file.  Note that the DOS-specific Makefile
+# uses a shorter (8.3) name.
+#
+LIBRARY := lib$(PROJECT)
+
+
+# Path inclusion flag.  Some compilers use a different flag than `-I' to
+# specify an additional include path.  Examples are `/i=' or `-J'.
+#
+I := -I
+
+
+# C flag used to define a macro before the compilation of a given source
+# object.  Usually it is `-D' like in `-DDEBUG'.
+#
+D := -D
+
+
+# The link flag used to specify a given library file on link.  Note that
+# this is only used to compile the demo programs, not the library itself.
+#
+L := -l
+
+
+# Target flag.
+#
+T := -o$(space)
+
+
+# C flags
+#
+#   These should concern: debug output, optimization & warnings.
+#
+#   Use the ANSIFLAGS variable to define the compiler flags used to enfore
+#   ANSI compliance.
+#
+CFLAGS ?= -c
+
+# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
+#
+ANSIFLAGS :=
+
+
+# EOF
diff --git a/builds/beos/beos.mk b/builds/beos/beos.mk
new file mode 100644 (file)
index 0000000..b5c8bda
--- /dev/null
@@ -0,0 +1,19 @@
+#
+# FreeType 2 configuration rules for a BeOS system
+#
+
+# Copyright 1996-2000, 2002, 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.
+
+include $(TOP_DIR)/builds/beos/beos-def.mk
+include $(TOP_DIR)/builds/compiler/ansi-cc.mk
+include $(TOP_DIR)/builds/link_std.mk
+
+
+# EOF
diff --git a/builds/beos/detect.mk b/builds/beos/detect.mk
new file mode 100644 (file)
index 0000000..24a0878
--- /dev/null
@@ -0,0 +1,41 @@
+#
+# FreeType 2 configuration file to detect an BeOS host platform.
+#
+
+
+# Copyright 1996-2000, 2003, 2006 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.
+
+
+.PHONY: setup
+
+
+ifeq ($(PLATFORM),ansi)
+
+  ifdef BE_HOST_CPU
+
+    PLATFORM := beos
+
+  endif # test MACHTYPE beos
+endif
+
+ifeq ($(PLATFORM),beos)
+
+  DELETE      := rm -f
+  CAT         := cat
+  SEP         := /
+  BUILD_DIR   := $(TOP_DIR)/builds/beos
+  CONFIG_FILE := beos.mk
+
+  setup: std_setup
+
+endif   # test PLATFORM beos
+
+
+# EOF
diff --git a/builds/compiler/ansi-cc.mk b/builds/compiler/ansi-cc.mk
new file mode 100644 (file)
index 0000000..3b668e2
--- /dev/null
@@ -0,0 +1,80 @@
+#
+# FreeType 2 generic pseudo ANSI compiler
+#
+
+
+# Copyright 1996-2000, 2003, 2006 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.
+
+
+# Compiler command line name
+#
+CC           := cc
+COMPILER_SEP := $(SEP)
+
+
+# The object file extension (for standard and static libraries).  This can be
+# .o, .tco, .obj, etc., depending on the platform.
+#
+O  := o
+SO := o
+
+# The library file extension (for standard and static libraries).  This can
+# be .a, .lib, etc., depending on the platform.
+#
+A  := a
+SA := a
+
+
+# Path inclusion flag.  Some compilers use a different flag than `-I' to
+# specify an additional include path.  Examples are `/i=' or `-J'.
+#
+I := -I
+
+
+# C flag used to define a macro before the compilation of a given source
+# object.  Usually it is `-D' like in `-DDEBUG'.
+#
+D := -D
+
+
+# The link flag used to specify a given library file on link.  Note that
+# this is only used to compile the demo programs, not the library itself.
+#
+L := -l
+
+
+# Target flag.
+#
+T := -o$(space)
+
+
+# C flags
+#
+#   These should concern: debug output, optimization & warnings.
+#
+#   Use the ANSIFLAGS variable to define the compiler flags used to enfore
+#   ANSI compliance.
+#
+CFLAGS ?= -c
+
+# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
+#
+#  we assume the compiler is already strictly ANSI
+#
+ANSIFLAGS :=
+
+
+# Library linking
+#
+CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY))
+LINK_LIBRARY   = $(AR) -r $@ $(subst /,$(COMPILER_SEP),$(OBJECTS_LIST))
+
+
+# EOF
diff --git a/builds/compiler/bcc-dev.mk b/builds/compiler/bcc-dev.mk
new file mode 100644 (file)
index 0000000..63a46ad
--- /dev/null
@@ -0,0 +1,86 @@
+#
+#  FreeType 2 Borland C++-specific with NO OPTIMIZATIONS + DEBUGGING
+#
+
+
+# Copyright 1996-2000, 2003, 2006 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.
+
+
+# Compiler command line name
+#
+CC           := bcc32
+COMPILER_SEP := $(SEP)
+
+
+# The object file extension (for standard and static libraries).  This can be
+# .o, .tco, .obj, etc., depending on the platform.
+#
+O  := obj
+SO := obj
+
+# The library file extension (for standard and static libraries).  This can
+# be .a, .lib, etc., depending on the platform.
+#
+A  := lib
+SA := lib
+
+
+# Path inclusion flag.  Some compilers use a different flag than `-I' to
+# specify an additional include path.  Examples are `/i=' or `-J'.
+#
+I := -I
+
+
+# C flag used to define a macro before the compilation of a given source
+# object.  Usually it is `-D' like in `-DDEBUG'.
+#
+D := -D
+
+
+# The link flag used to specify a given library file on link.  Note that
+# this is only used to compile the demo programs, not the library itself.
+#
+L :=
+
+
+# Target flag -- no trailing space.
+#
+T  := -o
+TE := -e 
+
+
+# C flags
+#
+#   These should concern: debug output, optimization & warnings.
+#
+#   Use the ANSIFLAGS variable to define the compiler flags used to enfore
+#   ANSI compliance.
+#
+CFLAGS ?= -q -c -y -d -v -Od -w-par -w-ccc -w-rch -w-pro -w-aus
+
+# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
+#
+ANSIFLAGS := -A
+
+
+# Library linking
+#
+CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY))
+LINK_LIBRARY   = tlib /u /P128 $(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST:%=+%))
+
+
+# Borland C++ specific temporary files
+#
+CLEAN += \
+         $(subst /,$(SEP),$(TOP_DIR)/apinames.$(O)) \
+         $(subst /,$(SEP),$(OBJ_DIR)/apinames.tds)
+
+
+# EOF
diff --git a/builds/compiler/bcc.mk b/builds/compiler/bcc.mk
new file mode 100644 (file)
index 0000000..855edad
--- /dev/null
@@ -0,0 +1,86 @@
+#
+# FreeType 2 Borland C++-specific rules
+#
+
+
+# Copyright 1996-2000, 2003, 2006 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.
+
+
+# Compiler command line name
+#
+CC           := bcc32
+COMPILER_SEP := $(SEP)
+
+
+# The object file extension (for standard and static libraries).  This can be
+# .o, .tco, .obj, etc., depending on the platform.
+#
+O  := obj
+SO := obj
+
+# The library file extension (for standard and static libraries).  This can
+# be .a, .lib, etc., depending on the platform.
+#
+A  := lib
+SA := lib
+
+
+# Path inclusion flag.  Some compilers use a different flag than `-I' to
+# specify an additional include path.  Examples are `/i=' or `-J'.
+#
+I := -I
+
+
+# C flag used to define a macro before the compilation of a given source
+# object.  Usually it is `-D' like in `-DDEBUG'.
+#
+D := -D
+
+
+# The link flag used to specify a given library file on link.  Note that
+# this is only used to compile the demo programs, not the library itself.
+#
+L :=
+
+
+# Target flag -- no trailing space.
+#
+T  := -o
+TE := -e
+
+
+# C flags
+#
+#   These should concern: debug output, optimization & warnings.
+#
+#   Use the ANSIFLAGS variable to define the compiler flags used to enfore
+#   ANSI compliance.
+#
+CFLAGS ?= -c -q -y -d -v -Od -w-par -w-ccc -w-rch -w-pro -w-aus
+
+# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
+#
+ANSIFLAGS := -A
+
+
+# Library linking
+#
+CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY))
+LINK_LIBRARY   = tlib /u /P128 $(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST:%=+%))
+
+
+# Borland C++ specific temporary files
+#
+CLEAN += \
+         $(subst /,$(SEP),$(TOP_DIR)/apinames.$(O)) \
+         $(subst /,$(SEP),$(OBJ_DIR)/apinames.tds)
+
+
+# EOF
diff --git a/builds/compiler/emx.mk b/builds/compiler/emx.mk
new file mode 100644 (file)
index 0000000..c237005
--- /dev/null
@@ -0,0 +1,77 @@
+#
+# FreeType 2 emx-specific definitions
+#
+
+
+# Copyright 2003, 2006 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.
+
+
+# Compiler command line name
+#
+CC           := set GCCOPT="-ansi -pedantic"; gcc
+COMPILER_SEP := /
+
+
+# The object file extension (for standard and static libraries).  This can be
+# .o, .tco, .obj, etc., depending on the platform.
+#
+O  := o
+SO := o
+
+# The library file extension (for standard and static libraries).  This can
+# be .a, .lib, etc., depending on the platform.
+#
+A  := a
+SA := a
+
+
+# Path inclusion flag.  Some compilers use a different flag than `-I' to
+# specify an additional include path.  Examples are `/i=' or `-J'.
+#
+I := -I
+
+
+# C flag used to define a macro before the compilation of a given source
+# object.  Usually it is `-D' like in `-DDEBUG'.
+#
+D := -D
+
+
+# The link flag used to specify a given library file on link.  Note that
+# this is only used to compile the demo programs, not the library itself.
+#
+L := -l
+
+
+# Target flag.
+#
+T := -o$(space)
+
+# C flags
+#
+#   These should concern: debug output, optimization & warnings.
+#
+#   Use the ANSIFLAGS variable to define the compiler flags used to enfore
+#   ANSI compliance.
+#
+CFLAGS ?= -c -g -O6 -Wall
+
+# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
+#
+ANSIFLAGS :=
+
+
+# Library linking
+#
+CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY))
+LINK_LIBRARY   = $(foreach m,$(OBJECTS_LIST),$(AR) -r $@ $(m);) echo > nul
+
+
+# EOF
diff --git a/builds/compiler/gcc-dev.mk b/builds/compiler/gcc-dev.mk
new file mode 100644 (file)
index 0000000..c63e126
--- /dev/null
@@ -0,0 +1,95 @@
+#
+# FreeType 2 gcc-specific with NO OPTIMIZATIONS + DEBUGGING
+#
+
+
+# Copyright 1996-2000, 2003, 2004, 2005, 2006 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.
+
+
+# Compiler command line name
+#
+CC           := gcc
+COMPILER_SEP := /
+
+
+# The object file extension (for standard and static libraries).  This can be
+# .o, .tco, .obj, etc., depending on the platform.
+#
+O  := o
+SO := o
+
+# The library file extension (for standard and static libraries).  This can
+# be .a, .lib, etc., depending on the platform.
+#
+A  := a
+SA := a
+
+
+# Path inclusion flag.  Some compilers use a different flag than `-I' to
+# specify an additional include path.  Examples are `/i=' or `-J'.
+#
+I := -I
+
+
+# C flag used to define a macro before the compilation of a given source
+# object.  Usually it is `-D' like in `-DDEBUG'.
+#
+D := -D
+
+
+# The link flag used to specify a given library file on link.  Note that
+# this is only used to compile the demo programs, not the library itself.
+#
+L := -l
+
+
+# Target flag.
+#
+T := -o$(space)
+
+
+# C flags
+#
+#   These should concern: debug output, optimization & warnings.
+#
+#   Use the ANSIFLAGS variable to define the compiler flags used to enfore
+#   ANSI compliance.
+#
+ifndef CFLAGS
+  ifeq ($(findstring g++,$(CC)),)
+    nested_externs    := -Wnested-externs
+    strict_prototypes := -Wstrict-prototypes
+  endif
+
+  CFLAGS := -c -g -O0 \
+            -Wall \
+            -W \
+            -Wundef \
+            -Wshadow \
+            -Wpointer-arith \
+            -Wwrite-strings \
+            -Wredundant-decls \
+            -Wno-long-long \
+            $(nested_externs) \
+            $(strict_prototypes)
+endif
+
+# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
+#
+ANSIFLAGS := -ansi -pedantic
+
+
+# Library linking
+#
+CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY))
+LINK_LIBRARY   = $(AR) -r $@ $(OBJECTS_LIST)
+
+
+# EOF
diff --git a/builds/compiler/gcc.mk b/builds/compiler/gcc.mk
new file mode 100644 (file)
index 0000000..f6b7101
--- /dev/null
@@ -0,0 +1,77 @@
+#
+# FreeType 2 gcc-specific definitions
+#
+
+
+# Copyright 1996-2000, 2003, 2005, 2006, 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.
+
+
+# Compiler command line name
+#
+CC           := gcc
+COMPILER_SEP := /
+
+
+# The object file extension (for standard and static libraries).  This can be
+# .o, .tco, .obj, etc., depending on the platform.
+#
+O  := o
+SO := o
+
+# The library file extension (for standard and static libraries).  This can
+# be .a, .lib, etc., depending on the platform.
+#
+A  := a
+SA := a
+
+
+# Path inclusion flag.  Some compilers use a different flag than `-I' to
+# specify an additional include path.  Examples are `/i=' or `-J'.
+#
+I := -I
+
+
+# C flag used to define a macro before the compilation of a given source
+# object.  Usually it is `-D' like in `-DDEBUG'.
+#
+D := -D
+
+
+# The link flag used to specify a given library file on link.  Note that
+# this is only used to compile the demo programs, not the library itself.
+#
+L := -l
+
+
+# Target flag.
+#
+T := -o$(space)
+
+# C flags
+#
+#   These should concern: debug output, optimization & warnings.
+#
+#   Use the ANSIFLAGS variable to define the compiler flags used to enfore
+#   ANSI compliance.
+#
+CFLAGS ?= -c -g -O3 -Wall
+
+# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
+#
+ANSIFLAGS := -ansi -pedantic
+
+
+# Library linking
+#
+CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY))
+LINK_LIBRARY   = $(AR) -r $@ $(OBJECTS_LIST)
+
+
+# EOF
diff --git a/builds/compiler/intelc.mk b/builds/compiler/intelc.mk
new file mode 100644 (file)
index 0000000..413ce5b
--- /dev/null
@@ -0,0 +1,85 @@
+#
+# FreeType 2 Intel C/C++ definitions (VC++ compatibility mode)
+#
+
+
+# Copyright 1996-2000, 2003, 2006 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.
+
+
+# compiler command line name
+#
+CC           := icl
+COMPILER_SEP := $(SEP)
+
+
+# The object file extension (for standard and static libraries).  This can be
+# .o, .tco, .obj, etc., depending on the platform.
+#
+O  := obj
+SO := obj
+
+
+# The library file extension (for standard and static libraries).  This can
+# be .a, .lib, etc., depending on the platform.
+#
+A  := lib
+SA := lib
+
+
+# Path inclusion flag.  Some compilers use a different flag than `-I' to
+# specify an additional include path.  Examples are `/i=' or `-J'.
+#
+I := /I
+
+
+# C flag used to define a macro before the compilation of a given source
+# object.  Usually it is `-D' like in `-DDEBUG'.
+#
+D := /D
+
+
+# The link flag used to specify a given library file on link.  Note that
+# this is only used to compile the demo programs, not the library itself.
+#
+L := /Fl
+
+
+# Target flag.
+#
+T := /Fo
+TE := /Fe
+
+
+# C flags
+#
+#   These should concern: debug output, optimization & warnings.
+#
+#   Use the ANSIFLAGS variable to define the compiler flags used to enfore
+#   ANSI compliance.
+#
+#   Note that the Intel C/C++ compiler version 4.5 complains about
+#   the use of FT_FIELD_OFFSET with "value must be arithmetic type"!
+#   This really looks like a bug in the compiler because the macro
+#   _does_ compute an arithmetic value, so we disable this warning
+#   with "/Qwd32".
+#
+CFLAGS ?= /nologo /c /Ox /G5 /W3 /Qwd32
+
+# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
+#
+ANSIFLAGS := /Qansi_alias /Za
+
+# Library linking
+#
+#CLEAN_LIBRARY =
+LINK_LIBRARY = lib /nologo /out:$(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST))
+
+
+# EOF
diff --git a/builds/compiler/unix-lcc.mk b/builds/compiler/unix-lcc.mk
new file mode 100644 (file)
index 0000000..d79f508
--- /dev/null
@@ -0,0 +1,83 @@
+#
+# FreeType 2 Unix LCC specific definitions
+#
+
+
+# Copyright 1996-2000, 2003, 2006 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.
+
+
+# Command line name
+#
+CC           := lcc
+COMPILER_SEP := $(SEP)
+
+
+# The object file extension (for standard and static libraries).  This can be
+# .o, .tco, .obj, etc., depending on the platform.
+#
+O  := o
+SO := o
+
+
+# The library file extension (for standard and static libraries).  This can
+# be .a, .lib, etc., depending on the platform.
+#
+A  := a
+SA := a
+
+
+# Path inclusion flag.  Some compilers use a different flag than `-I' to
+# specify an additional include path.  Examples are `/i=' or `-J'.
+#
+I := -I
+
+
+# C flag used to define a macro before the compilation of a given source
+# object.  Usually it is `-D' like in `-DDEBUG'.
+#
+D := -D
+
+
+# The link flag used to specify a given library file on link.  Note that
+# this is only used to compile the demo programs, not the library itself.
+#
+L := -l
+
+
+# Target flag.
+#
+T := -o$(space)
+
+
+# C flags
+#
+#   These should concern: debug output, optimization & warnings.
+#
+#   Use the ANSIFLAGS variable to define the compiler flags used to enfore
+#   ANSI compliance.
+#
+CFLAGS ?= -c -g
+
+# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
+#
+#  LCC is pure ANSI anyway!
+#
+#  the "-A" flag simply increments verbosity about non ANSI code
+#
+ANSIFLAGS := -A
+
+
+# library linking
+#
+CLEAN_LIBRARY ?= $(DELETE) $(PROJECT_LIBRARY)
+LINK_LIBRARY   = $(AR) -r $@ $(OBJECTS_LIST)
+
+
+# EOF
diff --git a/builds/compiler/visualage.mk b/builds/compiler/visualage.mk
new file mode 100644 (file)
index 0000000..c109659
--- /dev/null
@@ -0,0 +1,76 @@
+#
+# FreeType 2 Visual Age C++ specific definitions
+#
+
+
+# Copyright 1996-2000, 2003, 2006 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.
+
+
+# command line compiler name
+#
+CC           := icc
+COMPILER_SEP := $(SEP)
+
+
+# The object file extension (for standard and static libraries).  This can be
+# .o, .tco, .obj, etc., depending on the platform.
+#
+O  := obj
+SO := obj
+
+
+# The library file extension (for standard and static libraries).  This can
+# be .a, .lib, etc., depending on the platform.
+#
+A  := lib
+SA := lib
+
+
+# Path inclusion flag.  Some compilers use a different flag than `-I' to
+# specify an additional include path.  Examples are `/i=' or `-J'.
+#
+I := /I
+
+
+# C flag used to define a macro before the compilation of a given source
+# object.  Usually it is `-D' like in `-DDEBUG'.
+#
+D := /D
+
+
+# The link flag used to specify a given library file on link.  Note that
+# this is only used to compile the demo programs, not the library itself.
+#
+L := /Fl
+
+
+# Target flag.
+#
+T := /Fo
+
+
+# C flags
+#
+#   These should concern: debug output, optimization & warnings.
+#
+CFLAGS ?= /Q- /Gd+ /O2 /G5 /W3 /C
+
+# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
+#
+ANSI_FLAGS := /Sa
+
+
+# Library linking
+#
+#CLEAN_LIBRARY :=
+LINK_LIBRARY = lib /nologo /out:$(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST))
+
+
+# EOF
diff --git a/builds/compiler/visualc.mk b/builds/compiler/visualc.mk
new file mode 100644 (file)
index 0000000..2e19ef8
--- /dev/null
@@ -0,0 +1,82 @@
+#
+# FreeType 2 Visual C++ definitions
+#
+
+
+# Copyright 1996-2000, 2003, 2005, 2006, 2008 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.
+
+
+# compiler command line name
+#
+CC           := cl
+COMPILER_SEP := $(SEP)
+
+
+# The object file extension (for standard and static libraries).  This can be
+# .o, .tco, .obj, etc., depending on the platform.
+#
+O  := obj
+SO := obj
+
+
+# The library file extension (for standard and static libraries).  This can
+# be .a, .lib, etc., depending on the platform.
+#
+A  := lib
+SA := lib
+
+
+# Path inclusion flag.  Some compilers use a different flag than `-I' to
+# specify an additional include path.  Examples are `/i=' or `-J'.
+#
+I := /I
+
+
+# C flag used to define a macro before the compilation of a given source
+# object.  Usually it is `-D' like in `-DDEBUG'.
+#
+D := /D
+
+
+# The link flag used to specify a given library file on link.  Note that
+# this is only used to compile the demo programs, not the library itself.
+#
+L := /Fl
+
+
+# Target flag.
+#
+T := /Fo
+
+# Target executable flag
+#
+TE := /Fe
+
+# C flags
+#
+#   These should concern: debug output, optimization & warnings.
+#
+#   Use the ANSIFLAGS variable to define the compiler flags used to enfore
+#   ANSI compliance.
+#
+CFLAGS ?= /nologo /c /Ox /W3 /WX
+
+# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
+#
+ANSIFLAGS := /Za /D_CRT_SECURE_NO_DEPRECATE
+
+
+# Library linking
+#
+#CLEAN_LIBRARY =
+LINK_LIBRARY  = lib /nologo /out:$(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST))
+
+
+# EOF
diff --git a/builds/compiler/watcom.mk b/builds/compiler/watcom.mk
new file mode 100644 (file)
index 0000000..4db1e7f
--- /dev/null
@@ -0,0 +1,81 @@
+#
+# FreeType 2 Watcom-specific definitions
+#
+
+
+# Copyright 1996-2000, 2003, 2006 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.
+
+
+# Compiler command line name
+#
+CC           := wcc386
+COMPILER_SEP := $(SEP)
+
+
+# The object file extension (for standard and static libraries).  This can be
+# .o, .tco, .obj, etc., depending on the platform.
+#
+O  := obj
+SO := obj
+
+
+# The library file extension (for standard and static libraries).  This can
+# be .a, .lib, etc., depending on the platform.
+#
+A  := lib
+SA := lib
+
+
+# Path inclusion flag.  Some compilers use a different flag than `-I' to
+# specify an additional include path.  Examples are `/i=' or `-J'.
+#
+I := -I=
+
+
+# C flag used to define a macro before the compilation of a given source
+# object.  Usually it is `-D' like in `-DDEBUG'.
+#
+D := -D
+
+
+# The link flag used to specify a given library file on link.  Note that
+# this is only used to compile the demo programs, not the library itself.
+#
+L := -l
+
+
+# Target flag.
+#
+T := -FO=
+
+
+# C flags
+#
+#   These should concern: debug output, optimization & warnings.
+#
+#   Use the ANSIFLAGS variable to define the compiler flags used to enfore
+#   ANSI compliance.
+#
+CFLAGS ?= -zq
+
+# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
+#
+ANSIFLAGS := -za
+
+
+# Library linking
+#
+CLEAN_LIBRARY ?= $(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY))
+LINK_LIBRARY   = $(subst /,$(COMPILER_SEP), \
+                   wlib -q -n $@; \
+                   $(foreach m, $(OBJECTS_LIST), wlib -q $@ +$(m);) \
+                   echo > nul)
+
+# EOF
diff --git a/builds/compiler/win-lcc.mk b/builds/compiler/win-lcc.mk
new file mode 100644 (file)
index 0000000..5d02d82
--- /dev/null
@@ -0,0 +1,81 @@
+#
+# FreeType 2 Win32-LCC specific definitions
+#
+
+
+# Copyright 1996-2000, 2003, 2006 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.
+
+
+# Command line name
+#
+CC           := lcc
+COMPILER_SEP := $(SEP)
+
+
+# The object file extension (for standard and static libraries).  This can be
+# .o, .tco, .obj, etc., depending on the platform.
+#
+O  := obj
+SO := obj
+
+
+# The library file extension (for standard and static libraries).  This can
+# be .a, .lib, etc., depending on the platform.
+#
+A  := lib
+SA := lib
+
+
+# Path inclusion flag.  Some compilers use a different flag than `-I' to
+# specify an additional include path.  Examples are `/i=' or `-J'.
+#
+I := -I
+
+
+# C flag used to define a macro before the compilation of a given source
+# object.  Usually it is `-D' like in `-DDEBUG'.
+#
+D := -D
+
+
+# The link flag used to specify a given library file on link.  Note that
+# this is only used to compile the demo programs, not the library itself.
+#
+L := -Fl
+
+
+# Target flag.
+#
+T := -Fo
+
+
+# C flags
+#
+#   These should concern: debug output, optimization & warnings.
+#
+#   Use the ANSIFLAGS variable to define the compiler flags used to enfore
+#   ANSI compliance.
+#
+CFLAGS ?= -c -g2 -O
+
+# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
+#
+#  LCC is pure ANSI anyway!
+#
+ANSIFLAGS :=
+
+
+# library linking
+#
+#CLEAN_LIBRARY :=
+LINK_LIBRARY = lcclib /out:$(subst /,$(COMPILER_SEP),$@ $(OBJECTS_LIST))
+
+
+# EOF
diff --git a/builds/detect.mk b/builds/detect.mk
new file mode 100644 (file)
index 0000000..987ae51
--- /dev/null
@@ -0,0 +1,154 @@
+#
+# FreeType 2 host platform detection rules
+#
+
+
+# Copyright 1996-2000, 2001, 2002, 2003, 2006, 2008 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.
+
+
+# This sub-Makefile is in charge of detecting the current platform.  It sets
+# the following variables:
+#
+#   BUILD_DIR    The configuration and system-specific directory.  Usually
+#                `freetype/builds/$(PLATFORM)' but can be different for
+#                custom builds of the library.
+#
+# The following variables must be defined in system specific `detect.mk'
+# files:
+#
+#   PLATFORM     The detected platform.  This will default to `ansi' if
+#                auto-detection fails.
+#   CONFIG_FILE  The configuration sub-makefile to use.  This usually depends
+#                on the compiler defined in the `CC' environment variable.
+#   DELETE       The shell command used to remove a given file.
+#   COPY         The shell command used to copy one file.
+#   SEP          The platform-specific directory separator.
+#   COMPILER_SEP The separator used in arguments of the compilation tools.
+#   CC           The compiler to use.
+#
+# You need to set the following variable(s) before calling it:
+#
+#   TOP_DIR      The top-most directory in the FreeType library source
+#                hierarchy.  If not defined, it will default to `.'.
+
+# Set auto-detection default to `ansi' resp. UNIX-like operating systems.
+#
+PLATFORM     := ansi
+DELETE       := $(RM)
+COPY         := cp
+CAT          := cat
+SEP          := /
+
+BUILD_CONFIG := $(TOP_DIR)/builds
+
+# These two assignments must be delayed.
+BUILD_DIR    = $(BUILD_CONFIG)/$(PLATFORM)
+CONFIG_RULES = $(BUILD_DIR)/$(CONFIG_FILE)
+
+# We define the BACKSLASH variable to hold a single back-slash character.
+# This is needed because a line like
+#
+#   SEP := \
+#
+# does not work with GNU Make (the backslash is interpreted as a line
+# continuation).  While a line like
+#
+#   SEP := \\
+#
+# really defines $(SEP) as `\' on Unix, and `\\' on Dos and Windows!
+#
+BACKSLASH := $(strip \ )
+
+# Find all auto-detectable platforms.
+#
+PLATFORMS := $(notdir $(subst /detect.mk,,$(wildcard $(BUILD_CONFIG)/*/detect.mk)))
+.PHONY: $(PLATFORMS) ansi
+
+# Filter out platform specified as setup target.
+#
+PLATFORM := $(firstword $(filter $(MAKECMDGOALS),$(PLATFORMS)))
+
+# If no setup target platform was specified, enable auto-detection/
+# default platform.
+#
+ifeq ($(PLATFORM),)
+  PLATFORM := ansi
+endif
+
+# If the user has explicitly asked for `ansi' on the command line,
+# disable auto-detection.
+#
+ifeq ($(findstring ansi,$(MAKECMDGOALS)),)
+  # Now, include all detection rule files found in the `builds/<system>'
+  # directories.  Note that the calling order of the various `detect.mk'
+  # files isn't predictable.
+  #
+  include $(wildcard $(BUILD_CONFIG)/*/detect.mk)
+endif
+
+# In case no detection rule file was successful, use the default.
+#
+ifndef CONFIG_FILE
+  CONFIG_FILE := ansi.mk
+  setup: std_setup
+  .PHONY: setup
+endif
+
+# The following targets are equivalent, with the exception that they use
+# a slightly different syntax for the `echo' command.
+#
+# std_setup: defined for most (i.e. Unix-like) platforms
+# dos_setup: defined for Dos-ish platforms like Dos, Windows & OS/2
+#
+.PHONY: std_setup dos_setup
+
+std_setup:
+       @echo ""
+       @echo "$(PROJECT_TITLE) build system -- automatic system detection"
+       @echo ""
+       @echo "The following settings are used:"
+       @echo ""
+       @echo "  platform                    $(PLATFORM)"
+       @echo "  compiler                    $(CC)"
+       @echo "  configuration directory     $(BUILD_DIR)"
+       @echo "  configuration rules         $(CONFIG_RULES)"
+       @echo ""
+       @echo "If this does not correspond to your system or settings please remove the file"
+       @echo "\`$(CONFIG_MK)' from this directory then read the INSTALL file for help."
+       @echo ""
+       @echo "Otherwise, simply type \`$(MAKE)' again to build the library,"
+       @echo "or \`$(MAKE) refdoc' to build the API reference (the latter needs python)."
+       @echo ""
+       @$(COPY) $(CONFIG_RULES) $(CONFIG_MK)
+
+
+# Special case for Dos, Windows, OS/2, where echo "" doesn't work correctly!
+#
+dos_setup:
+       @type builds$(SEP)newline
+       @echo $(PROJECT_TITLE) build system -- automatic system detection
+       @type builds$(SEP)newline
+       @echo The following settings are used:
+       @type builds$(SEP)newline
+       @echo   platformÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$(PLATFORM)
+       @echo   compilerÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ$(CC)
+       @echo   configuration directoryÿÿÿÿÿÿ$(subst /,$(SEP),$(BUILD_DIR))
+       @echo   configuration rulesÿÿÿÿÿÿÿÿÿÿ$(subst /,$(SEP),$(CONFIG_RULES))
+       @type builds$(SEP)newline
+       @echo If this does not correspond to your system or settings please remove the file
+       @echo '$(CONFIG_MK)' from this directory then read the INSTALL file for help.
+       @type builds$(SEP)newline
+       @echo Otherwise, simply type 'make' again to build the library.
+       @echo or 'make refdoc' to build the API reference (the latter needs python).
+       @type builds$(SEP)newline
+       @$(COPY) $(subst /,$(SEP),$(CONFIG_RULES) $(CONFIG_MK)) > nul
+
+
+# EOF
diff --git a/builds/dos/detect.mk b/builds/dos/detect.mk
new file mode 100644 (file)
index 0000000..700a122
--- /dev/null
@@ -0,0 +1,142 @@
+#
+# FreeType 2 configuration file to detect a DOS host platform.
+#
+
+
+# Copyright 1996-2000, 2003, 2004, 2006 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.
+
+
+.PHONY: setup
+
+
+ifeq ($(PLATFORM),ansi)
+
+  # Test for DJGPP by checking the DJGPP environment variable, which must be
+  # set in order to use the system (ie. it will always be present when the
+  # `make' utility is run).
+  #
+  # We test for the COMSPEC environment variable, then run the `ver'
+  # command-line program to see if its output contains the word `Dos' or
+  # `DOS'.
+  #
+  # If this is true, we are running a Dos-ish platform (or an emulation).
+  #
+  ifdef DJGPP
+    PLATFORM := dos
+  else
+    ifdef COMSPEC
+      is_dos := $(findstring DOS,$(subst Dos,DOS,$(shell ver)))
+
+      # We try to recognize a Dos session under OS/2.  The `ver' command
+      # returns `Operating System/2 ...' there, so `is_dos' should be empty.
+      #
+      # To recognize a Dos session under OS/2, we check COMSPEC for the
+      # substring `MDOS\COMMAND'
+      #
+      ifeq ($(is_dos),)
+        is_dos := $(findstring MDOS\COMMAND,$(COMSPEC))
+      endif
+
+      # We also try to recognize Dos 7.x without Windows 9X launched.
+      # See builds/win32/detect.mk for explanations about the logic.
+      #
+      ifeq ($(is_dos),)
+        ifdef winbootdir
+#ifneq ($(OS),Windows_NT)
+          # If win32 is available, do not trigger this test.
+          ifndef windir
+            is_dos := $(findstring Windows,$(strip $(shell ver)))
+          endif
+#endif
+        endif
+      endif
+
+    endif # test COMSPEC
+
+    ifneq ($(is_dos),)
+
+      PLATFORM := dos
+
+    endif # test Dos
+  endif # test DJGPP
+endif # test PLATFORM ansi
+
+ifeq ($(PLATFORM),dos)
+
+  # Use DJGPP (i.e. gcc) by default.
+  #
+  CONFIG_FILE := dos-gcc.mk
+  CC          ?= gcc
+
+  # additionally, we provide hooks for various other compilers
+  #
+  ifneq ($(findstring emx,$(MAKECMDGOALS)),)        # EMX gcc
+    CONFIG_FILE := dos-emx.mk
+    CC          := gcc
+    emx: setup
+    .PHONY: emx
+  endif
+
+  ifneq ($(findstring turboc,$(MAKECMDGOALS)),)     # Turbo C
+    CONFIG_FILE := dos-tcc.mk
+    CC          := tcc
+    turboc: setup
+    .PHONY: turboc
+  endif
+
+  ifneq ($(findstring watcom,$(MAKECMDGOALS)),)     # Watcom C/C++
+    CONFIG_FILE := dos-wat.mk
+    CC          := wcc386
+    watcom: setup
+    .PHONY: watcom
+  endif
+
+  ifneq ($(findstring borlandc,$(MAKECMDGOALS)),)   # Borland C/C++ 32-bit
+    CONFIG_FILE := dos-bcc.mk
+    CC          := bcc32
+    borlandc: setup
+    .PHONY: borlandc
+  endif
+
+  ifneq ($(findstring borlandc16,$(MAKECMDGOALS)),) # Borland C/C++ 16-bit
+    CONFIG_FILE := dos-bcc.mk
+    CC          := bcc
+    borlandc16: setup
+    .PHONY: borlandc16
+  endif
+
+  ifneq ($(findstring bash,$(SHELL)),)              # check for bash
+    SEP    := /
+    DELETE := rm
+    COPY   := cp
+    CAT    := cat
+    setup: std_setup
+  else
+    SEP    := $(BACKSLASH)
+    DELETE := del
+    CAT    := type
+
+    # Setting COPY is a bit trickier.  We can be running DJGPP on some
+    # Windows NT derivatives, like XP.  See builds/win32/detect.mk for
+    # explanations why we need hacking here.
+    #
+    ifeq ($(OS),Windows_NT)
+      COPY := cmd.exe /c copy
+    else
+      COPY := copy
+    endif  # test NT
+
+    setup: dos_setup
+  endif
+
+endif     # test PLATFORM dos
+
+
+# EOF
diff --git a/builds/dos/dos-def.mk b/builds/dos/dos-def.mk
new file mode 100644 (file)
index 0000000..950f581
--- /dev/null
@@ -0,0 +1,45 @@
+#
+# FreeType 2 DOS specific definitions
+#
+
+
+# Copyright 1996-2000, 2003, 2005, 2006 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.
+
+
+DELETE    := del
+CAT       := type
+SEP       := $(strip \ )
+BUILD_DIR := $(TOP_DIR)/builds/dos
+PLATFORM  := dos
+
+
+# The executable file extension (for tools), *with* leading dot.
+#
+E := .exe
+
+# The directory where all library files are placed.
+#
+# By default, this is the same as $(OBJ_DIR); however, this can be changed
+# to suit particular needs.
+#
+LIB_DIR := $(OBJ_DIR)
+
+# The name of the final library file.  Note that the DOS-specific Makefile
+# uses a shorter (8.3) name.
+#
+LIBRARY := $(PROJECT)
+
+
+# The NO_OUTPUT macro is used to ignore the output of commands.
+#
+NO_OUTPUT = > nul
+
+
+# EOF
diff --git a/builds/dos/dos-emx.mk b/builds/dos/dos-emx.mk
new file mode 100644 (file)
index 0000000..6ea8f6d
--- /dev/null
@@ -0,0 +1,21 @@
+#
+# FreeType 2 configuration rules for the EMX gcc compiler
+#
+
+
+# Copyright 2003 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.
+
+
+include $(TOP_DIR)/builds/dos/dos-def.mk
+include $(TOP_DIR)/builds/compiler/emx.mk
+include $(TOP_DIR)/builds/link_dos.mk
+
+
+# EOF
diff --git a/builds/dos/dos-gcc.mk b/builds/dos/dos-gcc.mk
new file mode 100644 (file)
index 0000000..e14255c
--- /dev/null
@@ -0,0 +1,21 @@
+#
+# FreeType 2 configuration rules for the DJGPP compiler
+#
+
+
+# Copyright 1996-2000, 2003 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.
+
+
+include $(TOP_DIR)/builds/dos/dos-def.mk
+include $(TOP_DIR)/builds/compiler/gcc.mk
+include $(TOP_DIR)/builds/link_dos.mk
+
+
+# EOF
diff --git a/builds/dos/dos-wat.mk b/builds/dos/dos-wat.mk
new file mode 100644 (file)
index 0000000..c763b16
--- /dev/null
@@ -0,0 +1,20 @@
+#
+# FreeType 2 configuration rules for the Watcom C/C++ compiler
+#
+
+
+# Copyright 2003 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.
+
+include $(TOP_DIR)/builds/dos/dos-def.mk
+include $(TOP_DIR)/builds/compiler/watcom.mk
+include $(TOP_DIR)/builds/link_dos.mk
+
+
+# EOF
diff --git a/builds/exports.mk b/builds/exports.mk
new file mode 100644 (file)
index 0000000..52f2912
--- /dev/null
@@ -0,0 +1,76 @@
+#
+# FreeType 2 exports sub-Makefile
+#
+
+
+# Copyright 2005, 2006 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.
+
+
+# DO NOT INVOKE THIS MAKEFILE DIRECTLY!  IT IS MEANT TO BE INCLUDED BY
+# OTHER MAKEFILES.
+
+
+# This sub-Makefile is used to compute the list of exported symbols whenever
+# the EXPORTS_LIST variable is defined by one of the platform or compiler
+# specific build files.
+#
+# EXPORTS_LIST contains the name of the `list' file, for example a Windows
+# .DEF file.
+#
+ifneq ($(EXPORTS_LIST),)
+
+  # CCexe is the compiler used to compile the `apinames' tool program
+  # on the host machine.  This isn't necessarily the same as the compiler
+  # which can be a cross-compiler for a different architecture, for example.
+  #
+  ifeq ($(CCexe),)
+    CCexe := $(CC)
+  endif
+
+  # TE acts like T, but for executables instead of object files.
+  ifeq ($(TE),)
+    TE := $T
+  endif
+
+  # The list of public headers we're going to parse.
+  PUBLIC_HEADERS := $(wildcard $(PUBLIC_DIR)/*.h)
+
+  # The `apinames' source and executable.  We use $E_BUILD as the host
+  # executable suffix, which *includes* the final dot.
+  #
+  # Note that $(APINAMES_OPTIONS) is empty, except for Windows compilers.
+  #
+  APINAMES_SRC := $(subst /,$(SEP),$(TOP_DIR)/src/tools/apinames.c)
+  APINAMES_EXE := $(subst /,$(SEP),$(OBJ_DIR)/apinames$(E_BUILD))
+
+  $(APINAMES_EXE): $(APINAMES_SRC)
+         $(CCexe) $(TE)$@ $<
+
+  .PHONY: symbols_list
+
+  symbols_list: $(EXPORTS_LIST)
+
+  # We manually add TT_New_Context and TT_RunIns, which are needed by TT
+  # debuggers, to the EXPORTS_LIST.
+  #
+  $(EXPORTS_LIST): $(APINAMES_EXE) $(PUBLIC_HEADERS)
+         $(subst /,$(SEP),$(APINAMES_EXE)) -o$@ $(APINAMES_OPTIONS) $(PUBLIC_HEADERS)
+         @echo TT_New_Context >> $(EXPORTS_LIST)
+         @echo TT_RunIns >> $(EXPORTS_LIST)
+
+  $(PROJECT_LIBRARY): $(EXPORTS_LIST)
+
+  CLEAN += $(EXPORTS_LIST) \
+           $(APINAMES_EXE)
+
+endif
+
+
+# EOF
diff --git a/builds/freetype.mk b/builds/freetype.mk
new file mode 100644 (file)
index 0000000..7a89c8e
--- /dev/null
@@ -0,0 +1,361 @@
+#
+# FreeType 2 library sub-Makefile
+#
+
+
+# Copyright 1996-2000, 2001, 2002, 2003, 2004, 2005, 2006, 2008 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.
+
+
+# DO NOT INVOKE THIS MAKEFILE DIRECTLY!  IT IS MEANT TO BE INCLUDED BY
+# OTHER MAKEFILES.
+
+
+# The following variables (set by other Makefile components, in the
+# environment, or on the command line) are used:
+#
+#   BUILD_DIR      The architecture dependent directory,
+#                  e.g. `$(TOP_DIR)/builds/unix'.  Added to INCLUDES also.
+#
+#   OBJ_DIR        The directory in which object files are created.
+#
+#   LIB_DIR        The directory in which the library is created.
+#
+#   DOC_DIR        The directory in which the API reference is created.
+#
+#   INCLUDES       A list of directories to be included additionally.
+#
+#   DEVEL_DIR      Development directory which is added to the INCLUDES
+#                  variable before the standard include directories.
+#
+#   CFLAGS         Compilation flags.  This overrides the default settings
+#                  in the platform-specific configuration files.
+#
+#   FTSYS_SRC      If set, its value is used as the name of a replacement
+#                  file for `src/base/ftsystem.c'.
+#
+#   FTDEBUG_SRC    If set, its value is used as the name of a replacement
+#                  file for `src/base/ftdebug.c'.  [For a normal build, this
+#                  file does nothing.]
+#
+#   FTMODULE_H     The file which contains the list of module classes for
+#                  the current build.  Usually, this is automatically
+#                  created by `modules.mk'.
+#
+#   BASE_OBJ_S
+#   BASE_OBJ_M     A list of base objects (for single object and multiple
+#                  object builds, respectively).  Set up in
+#                  `src/base/rules.mk'.
+#
+#   BASE_EXT_OBJ   A list of base extension objects.  Set up in
+#                  `src/base/rules.mk'.
+#
+#   DRV_OBJ_S
+#   DRV_OBJ_M      A list of driver objects (for single object and multiple
+#                  object builds, respectively).  Set up cumulatively in
+#                  `src/<driver>/rules.mk'.
+#
+#   CLEAN
+#   DISTCLEAN      The sub-makefiles can append additional stuff to these two
+#                  variables which is to be removed for the `clean' resp.
+#                  `distclean' target.
+#
+#   TOP_DIR, SEP,
+#   COMPILER_SEP,
+#   LIBRARY, CC,
+#   A, I, O, T     Check `config.mk' for details.
+
+
+# The targets `objects' and `library' are defined at the end of this
+# Makefile after all other rules have been included.
+#
+.PHONY: single multi objects library refdoc
+
+# default target -- build single objects and library
+#
+single: objects library
+
+# `multi' target -- build multiple objects and library
+#
+multi: objects library
+
+
+# The FreeType source directory, usually `./src'.
+#
+SRC_DIR := $(TOP_DIR)/src
+
+# The directory where the base layer components are placed, usually
+# `./src/base'.
+#
+BASE_DIR := $(SRC_DIR)/base
+
+# Other derived directories.
+#
+PUBLIC_DIR   := $(TOP_DIR)/include/freetype
+INTERNAL_DIR := $(PUBLIC_DIR)/internal
+SERVICES_DIR := $(INTERNAL_DIR)/services
+CONFIG_DIR   := $(PUBLIC_DIR)/config
+
+# The documentation directory.
+#
+DOC_DIR ?= $(TOP_DIR)/docs/reference
+
+# The final name of the library file.
+#
+PROJECT_LIBRARY := $(LIB_DIR)/$(LIBRARY).$A
+
+
+# include paths
+#
+# IMPORTANT NOTE: The architecture-dependent directory must ALWAYS be placed
+#                 before the standard include list.  Porters are then able to
+#                 put their own version of some of the FreeType components
+#                 in the `freetype/builds/<system>' directory, as these
+#                 files will override the default sources.
+#
+INCLUDES := $(subst /,$(COMPILER_SEP),$(OBJ_DIR) \
+                                      $(DEVEL_DIR) \
+                                      $(BUILD_DIR) \
+                                      $(TOP_DIR)/include)
+
+INCLUDE_FLAGS := $(INCLUDES:%=$I%)
+
+
+# C flags used for the compilation of an object file.  This must include at
+# least the paths for the `base' and `builds/<system>' directories;
+# debug/optimization/warning flags + ansi compliance if needed.
+#
+# $(INCLUDE_FLAGS) should come before $(CFLAGS) to avoid problems with
+# old FreeType versions.
+#
+# Note what we also define the macro FT2_BUILD_LIBRARY when building
+# FreeType.  This is required to let our sources include the internal
+# headers (something forbidden by clients).
+#
+# Finally, we define FT_CONFIG_MODULES_H so that the compiler uses the
+# generated version of `ftmodule.h' in $(OBJ_DIR).  If there is an
+# `ftoption.h' files in $(OBJ_DIR), define FT_CONFIG_OPTIONS_H too.
+#
+ifneq ($(wildcard $(OBJ_DIR)/ftoption.h),)
+  FTOPTION_H    := $(OBJ_DIR)/ftoption.h
+  FTOPTION_FLAG := $DFT_CONFIG_OPTIONS_H="<ftoption.h>"
+endif
+
+FT_CFLAGS  = $(CPPFLAGS) \
+             $(INCLUDE_FLAGS) \
+             $(CFLAGS) \
+             $DFT2_BUILD_LIBRARY \
+             $DFT_CONFIG_MODULES_H="<ftmodule.h>" \
+             $(FTOPTION_FLAG)
+FT_CC      = $(CC) $(FT_CFLAGS)
+FT_COMPILE = $(CC) $(ANSIFLAGS) $(FT_CFLAGS)
+
+
+# Include the `exports' rules file.
+#
+include $(TOP_DIR)/builds/exports.mk
+
+
+# Initialize the list of objects.
+#
+OBJECTS_LIST :=
+
+
+# Define $(PUBLIC_H) as the list of all public header files located in
+# `$(TOP_DIR)/include/freetype'.  $(INTERNAL_H), and $(CONFIG_H) are defined
+# similarly.
+#
+# This is used to simplify the dependency rules -- if one of these files
+# changes, the whole library is recompiled.
+#
+PUBLIC_H   := $(wildcard $(PUBLIC_DIR)/*.h)
+INTERNAL_H := $(wildcard $(INTERNAL_DIR)/*.h) \
+              $(wildcard $(SERVICES_DIR)/*.h)
+CONFIG_H   := $(wildcard $(CONFIG_DIR)/*.h) \
+              $(wildcard $(BUILD_DIR)/freetype/config/*.h) \
+              $(FTMODULE_H) \
+              $(FTOPTION_H)
+DEVEL_H    := $(wildcard $(TOP_DIR)/devel/*.h)
+
+FREETYPE_H := $(PUBLIC_H) $(INTERNAL_H) $(CONFIG_H) $(DEVEL_H)
+
+
+# ftsystem component
+#
+FTSYS_SRC ?= $(BASE_DIR)/ftsystem.c
+
+FTSYS_OBJ := $(OBJ_DIR)/ftsystem.$O
+
+OBJECTS_LIST += $(FTSYS_OBJ)
+
+$(FTSYS_OBJ): $(FTSYS_SRC) $(FREETYPE_H)
+       $(FT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# ftdebug component
+#
+FTDEBUG_SRC ?= $(BASE_DIR)/ftdebug.c
+
+FTDEBUG_OBJ := $(OBJ_DIR)/ftdebug.$O
+
+OBJECTS_LIST += $(FTDEBUG_OBJ)
+
+$(FTDEBUG_OBJ): $(FTDEBUG_SRC) $(FREETYPE_H)
+       $(FT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# Include all rule files from FreeType components.
+#
+include $(SRC_DIR)/base/rules.mk
+include $(patsubst %,$(SRC_DIR)/%/rules.mk,$(MODULES))
+
+
+# ftinit component
+#
+#   The C source `ftinit.c' contains the FreeType initialization routines.
+#   It is able to automatically register one or more drivers when the API
+#   function FT_Init_FreeType() is called.
+#
+#   The set of initial drivers is determined by the driver Makefiles
+#   includes above.  Each driver Makefile updates the FTINIT_xxx lists
+#   which contain additional include paths and macros used to compile the
+#   single `ftinit.c' source.
+#
+FTINIT_SRC := $(BASE_DIR)/ftinit.c
+FTINIT_OBJ := $(OBJ_DIR)/ftinit.$O
+
+OBJECTS_LIST += $(FTINIT_OBJ)
+
+$(FTINIT_OBJ): $(FTINIT_SRC) $(FREETYPE_H)
+       $(FT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# All FreeType library objects.
+#
+OBJ_M := $(BASE_OBJ_M) $(BASE_EXT_OBJ) $(DRV_OBJS_M)
+OBJ_S := $(BASE_OBJ_S) $(BASE_EXT_OBJ) $(DRV_OBJS_S)
+
+
+# The target `multi' on the Make command line indicates that we want to
+# compile each source file independently.
+#
+# Otherwise, each module/driver is compiled in a single object file through
+# source file inclusion (see `src/base/ftbase.c' or
+# `src/truetype/truetype.c' for examples).
+#
+BASE_OBJECTS := $(OBJECTS_LIST)
+
+ifneq ($(findstring multi,$(MAKECMDGOALS)),)
+  OBJECTS_LIST += $(OBJ_M)
+else
+  OBJECTS_LIST += $(OBJ_S)
+endif
+
+objects: $(OBJECTS_LIST)
+
+library: $(PROJECT_LIBRARY)
+
+dll: $(PROJECT_LIBRARY) exported_symbols
+
+.c.$O:
+       $(FT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+ifneq ($(findstring refdoc,$(MAKECMDGOALS)),)
+  # poor man's `sed' emulation with make's built-in string functions
+  work := $(strip $(shell $(CAT) $(PUBLIC_DIR)/freetype.h))
+  work := $(subst |,x,$(work))
+  work := $(subst $(space),|,$(work))
+  work := $(subst \#define|FREETYPE_MAJOR|,$(space),$(work))
+  work := $(word 2,$(work))
+  major := $(subst |,$(space),$(work))
+  major := $(firstword $(major))
+
+  work := $(subst \#define|FREETYPE_MINOR|,$(space),$(work))
+  work := $(word 2,$(work))
+  minor := $(subst |,$(space),$(work))
+  minor := $(firstword $(minor))
+
+  work := $(subst \#define|FREETYPE_PATCH|,$(space),$(work))
+  work := $(word 2,$(work))
+  patch := $(subst |,$(space),$(work))
+  patch := $(firstword $(patch))
+
+  version := $(major).$(minor).$(patch)
+endif
+
+# We write-protect the docmaker directory to suppress generation
+# of .pyc files.
+#
+refdoc:
+       -chmod -w $(SRC_DIR)/tools/docmaker
+       python $(SRC_DIR)/tools/docmaker/docmaker.py \
+               --prefix=ft2                          \
+               --title=FreeType-$(version)           \
+               --output=$(DOC_DIR)                   \
+               $(PUBLIC_DIR)/*.h                     \
+               $(PUBLIC_DIR)/config/*.h              \
+               $(PUBLIC_DIR)/cache/*.h
+       -chmod +w $(SRC_DIR)/tools/docmaker
+
+
+.PHONY: clean_project_std distclean_project_std
+
+# Standard cleaning and distclean rules.  These are not accepted
+# on all systems though.
+#
+clean_project_std:
+       -$(DELETE) $(BASE_OBJECTS) $(OBJ_M) $(OBJ_S) $(CLEAN)
+
+distclean_project_std: clean_project_std
+       -$(DELETE) $(PROJECT_LIBRARY)
+       -$(DELETE) *.orig *~ core *.core $(DISTCLEAN)
+
+
+.PHONY: clean_project_dos distclean_project_dos
+
+# The Dos command shell does not support very long list of arguments, so
+# we are stuck with wildcards.
+#
+# Don't break the command lines with \; this prevents the "del" command from
+# working correctly on Win9x.
+#
+clean_project_dos:
+       -$(DELETE) $(subst /,$(SEP),$(OBJ_DIR)/*.$O $(CLEAN) $(NO_OUTPUT))
+
+distclean_project_dos: clean_project_dos
+       -$(DELETE) $(subst /,$(SEP),$(PROJECT_LIBRARY) $(DISTCLEAN) $(NO_OUTPUT))
+
+
+.PHONY: remove_config_mk remove_ftmodule_h
+
+# Remove configuration file (used for distclean).
+#
+remove_config_mk:
+       -$(DELETE) $(subst /,$(SEP),$(CONFIG_MK) $(NO_OUTPUT))
+
+# Remove module list (used for distclean).
+#
+remove_ftmodule_h:
+       -$(DELETE) $(subst /,$(SEP),$(FTMODULE_H) $(NO_OUTPUT))
+
+
+.PHONY: clean distclean
+
+# The `config.mk' file must define `clean_freetype' and
+# `distclean_freetype'.  Implementations may use to relay these to either
+# the `std' or `dos' versions from above, or simply provide their own
+# implementation.
+#
+clean: clean_project
+distclean: distclean_project remove_config_mk remove_ftmodule_h
+       -$(DELETE) $(subst /,$(SEP),$(DOC_DIR)/*.html $(NO_OUTPUT))
+
+
+# EOF
diff --git a/builds/link_dos.mk b/builds/link_dos.mk
new file mode 100644 (file)
index 0000000..c37ac7e
--- /dev/null
@@ -0,0 +1,42 @@
+#
+#  Link instructions for Dos-like systems (Dos, Win32, OS/2)
+#
+
+
+# Copyright 1996-2000 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.
+
+
+ifdef BUILD_PROJECT
+
+  .PHONY: clean_project distclean_project
+
+  # Now include the main sub-makefile.  It contains all the rules used to
+  # build the library with the previous variables defined.
+  #
+  include $(TOP_DIR)/builds/$(PROJECT).mk
+
+  # The cleanup targets.
+  #
+  clean_project: clean_project_dos
+  distclean_project: distclean_project_dos
+
+  # This final rule is used to link all object files into a single library.
+  # this is compiler-specific
+  #
+  $(PROJECT_LIBRARY): $(OBJECTS_LIST)
+    ifdef CLEAN_LIBRARY
+         -$(CLEAN_LIBRARY) $(NO_OUTPUT)
+    endif
+         $(LINK_LIBRARY)
+
+endif
+
+
+# EOF
diff --git a/builds/link_std.mk b/builds/link_std.mk
new file mode 100644 (file)
index 0000000..0bd2163
--- /dev/null
@@ -0,0 +1,42 @@
+#
+#  Link instructions for standard systems
+#
+
+
+# Copyright 1996-2000 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.
+
+
+ifdef BUILD_PROJECT
+
+  .PHONY: clean_project distclean_project
+
+  # Now include the main sub-makefile.  It contains all the rules used to
+  # build the library with the previous variables defined.
+  #
+  include $(TOP_DIR)/builds/$(PROJECT).mk
+
+  # The cleanup targets.
+  #
+  clean_project: clean_project_std
+  distclean_project: distclean_project_std
+
+  # This final rule is used to link all object files into a single library.
+  # this is compiler-specific
+  #
+  $(PROJECT_LIBRARY): $(OBJECTS_LIST)
+    ifdef CLEAN_LIBRARY
+         -$(CLEAN_LIBRARY) $(NO_OUTPUT)
+    endif
+         $(LINK_LIBRARY)
+
+endif
+
+
+# EOF
diff --git a/builds/mac/FreeType.m68k_cfm.make.txt b/builds/mac/FreeType.m68k_cfm.make.txt
new file mode 100644 (file)
index 0000000..425f9f9
--- /dev/null
@@ -0,0 +1,212 @@
+#   File:       FreeType.m68k_cfm.make
+#   Target:     FreeType.m68k_cfm
+#   Created:    Thursday, October 27, 2005 09:23:25 PM
+
+
+MAKEFILE        = FreeType.m68k_cfm.make
+\xA5MondoBuild\xA5    = {MAKEFILE}  # Make blank to avoid rebuilds when makefile is modified
+
+ObjDir          = :objs:
+Includes        =  \xB6
+                                 -ansi strict \xB6
+                                 -includes unix \xB6
+                                 -i :include: \xB6
+                                 -i :src: \xB6
+                                 -i :include:freetype:config:
+
+Sym-68K         = -sym off
+
+COptions        = \xB6
+                       -d FT_MACINTOSH=1 \xB6
+                       -d HAVE_FSSPEC=1 \xB6
+                       -d HAVE_FSREF=0 \xB6
+                       -d HAVE_QUICKDRAW_TOOLBOX=1 \xB6
+                       -d HAVE_QUICKDRAW_CARBON=0 \xB6
+                       -d HAVE_ATS=0 \xB6
+                       -d FT2_BUILD_LIBRARY \xB6
+                       -d FT_CONFIG_CONFIG_H="<ftconfig.h>" \xB6
+                       -d FT_CONFIG_MODULES_H="<ftmodule.h>" \xB6
+                       {Includes} {Sym-68K} -model cfmseg
+
+
+### Source Files ###
+
+SrcFiles        =  \xB6
+                                 :src:autofit:autofit.c \xB6
+                                 :builds:mac:ftbase.c \xB6
+                                 :src:base:ftbbox.c \xB6
+                                 :src:base:ftbdf.c \xB6
+                                 :src:base:ftbitmap.c \xB6
+                                 :src:base:ftdebug.c \xB6
+                                 :src:base:ftfstype.c \xB6
+                                 :src:base:ftglyph.c \xB6
+                                 :src:base:ftgxval.c \xB6
+                                 :src:base:ftinit.c \xB6
+                                 :src:base:ftmm.c \xB6
+                                 :src:base:ftotval.c \xB6
+                                 :src:base:ftpfr.c \xB6
+                                 :src:base:ftstroke.c \xB6
+                                 :src:base:ftsynth.c \xB6
+                                 :src:base:ftsystem.c \xB6
+                                 :src:base:fttype1.c \xB6
+                                 :src:base:ftwinfnt.c \xB6
+                                 :src:base:ftxf86.c \xB6
+                                 :src:cache:ftcache.c \xB6
+                                 :src:bdf:bdf.c \xB6
+                                 :src:cff:cff.c \xB6
+                                 :src:cid:type1cid.c \xB6
+#                                :src:gxvalid:gxvalid.c \xB6
+                                 :src:gzip:ftgzip.c \xB6
+                                 :src:bzip2:ftbzip2.c \xB6
+                                 :src:lzw:ftlzw.c \xB6
+                                 :src:otvalid:otvalid.c \xB6
+                                 :src:pcf:pcf.c \xB6
+                                 :src:pfr:pfr.c \xB6
+                                 :src:psaux:psaux.c \xB6
+                                 :src:pshinter:pshinter.c \xB6
+                                 :src:psnames:psmodule.c \xB6
+                                 :src:raster:raster.c \xB6
+                                 :src:sfnt:sfnt.c \xB6
+                                 :src:smooth:smooth.c \xB6
+                                 :src:truetype:truetype.c \xB6
+                                 :src:type1:type1.c \xB6
+                                 :src:type42:type42.c \xB6
+                                 :src:winfonts:winfnt.c
+
+
+### Object Files ###
+
+ObjFiles-68K    =  \xB6
+                                 "{ObjDir}autofit.c.o" \xB6
+                                 "{ObjDir}ftbase.c.o" \xB6
+                                 "{ObjDir}ftbbox.c.o" \xB6
+                                 "{ObjDir}ftbdf.c.o" \xB6
+                                 "{ObjDir}ftbitmap.c.o" \xB6
+                                 "{ObjDir}ftdebug.c.o" \xB6
+                                 "{ObjDir}ftfstype.c.o" \xB6
+                                 "{ObjDir}ftglyph.c.o" \xB6
+                                 "{ObjDir}ftgxval.c.o" \xB6
+                                 "{ObjDir}ftinit.c.o" \xB6
+                                 "{ObjDir}ftmm.c.o" \xB6
+                                 "{ObjDir}ftotval.c.o" \xB6
+                                 "{ObjDir}ftpfr.c.o" \xB6
+                                 "{ObjDir}ftstroke.c.o" \xB6
+                                 "{ObjDir}ftsynth.c.o" \xB6
+                                 "{ObjDir}ftsystem.c.o" \xB6
+                                 "{ObjDir}fttype1.c.o" \xB6
+                                 "{ObjDir}ftwinfnt.c.o" \xB6
+                                 "{ObjDir}ftxf86.c.o" \xB6
+                                 "{ObjDir}ftcache.c.o" \xB6
+                                 "{ObjDir}bdf.c.o" \xB6
+                                 "{ObjDir}cff.c.o" \xB6
+                                 "{ObjDir}type1cid.c.o" \xB6
+#                                "{ObjDir}gxvalid.c.o" \xB6
+                                 "{ObjDir}ftgzip.c.o" \xB6
+                                 "{ObjDir}ftbzip2.c.o" \xB6
+                                 "{ObjDir}ftlzw.c.o" \xB6
+                                 "{ObjDir}otvalid.c.o" \xB6
+                                 "{ObjDir}pcf.c.o" \xB6
+                                 "{ObjDir}pfr.c.o" \xB6
+                                 "{ObjDir}psaux.c.o" \xB6
+                                 "{ObjDir}pshinter.c.o" \xB6
+                                 "{ObjDir}psmodule.c.o" \xB6
+                                 "{ObjDir}raster.c.o" \xB6
+                                 "{ObjDir}sfnt.c.o" \xB6
+                                 "{ObjDir}smooth.c.o" \xB6
+                                 "{ObjDir}truetype.c.o" \xB6
+                                 "{ObjDir}type1.c.o" \xB6
+                                 "{ObjDir}type42.c.o" \xB6
+                                 "{ObjDir}winfnt.c.o"
+
+
+### Libraries ###
+
+LibFiles-68K    =
+
+
+### Default Rules ###
+
+.c.o  \xC4  .c  {\xA5MondoBuild\xA5}
+       {C} {depDir}{default}.c -o {targDir}{default}.c.o {COptions}
+
+
+### Build Rules ###
+
+:builds:mac:ftbase.c \xC4\xC4 :src:base:ftbase.c
+       Duplicate :src:base:ftbase.c :builds:mac:ftbase.c
+
+"{ObjDir}ftbase.c.o" \xC4\xC4 :builds:mac:ftbase.c
+       {C} :builds:mac:ftbase.c -o "{ObjDir}ftbase.c.o" \xB6
+               -i :builds:mac: \xB6
+               -i :src:base: \xB6
+               {COptions}
+
+FreeType.m68k_cfm    \xC4\xC4  FreeType.m68k_cfm.o
+
+FreeType.m68k_cfm.o  \xC4\xC4  {ObjFiles-68K} {LibFiles-68K} {\xA5MondoBuild\xA5}
+       Lib \xB6
+               -o {Targ} \xB6
+               {ObjFiles-68K} \xB6
+               {LibFiles-68K} \xB6
+               {Sym-68K} \xB6
+               -mf -d
+
+
+
+### Required Dependencies ###
+
+"{ObjDir}autofit.c.o" \xC4 :src:autofit:autofit.c
+# "{ObjDir}ftbase.c.o" \xC4 :src:base:ftbase.c
+"{ObjDir}ftbbox.c.o" \xC4 :src:base:ftbbox.c
+"{ObjDir}ftbdf.c.o" \xC4 :src:base:ftbdf.c
+"{ObjDir}ftbitmap.c.o" \xC4 :src:base:ftbitmap.c
+"{ObjDir}ftdebug.c.o" \xC4 :src:base:ftdebug.c
+"{ObjDir}ftfstype.c.o" \xC4 :src:base:ftfstype.c
+"{ObjDir}ftglyph.c.o" \xC4 :src:base:ftglyph.c
+"{ObjDir}ftgxval.c.o" \xC4 :src:base:ftgxval.c
+"{ObjDir}ftinit.c.o" \xC4 :src:base:ftinit.c
+"{ObjDir}ftmm.c.o" \xC4 :src:base:ftmm.c
+"{ObjDir}ftotval.c.o" \xC4 :src:base:ftotval.c
+"{ObjDir}ftpfr.c.o" \xC4 :src:base:ftpfr.c
+"{ObjDir}ftstroke.c.o" \xC4 :src:base:ftstroke.c
+"{ObjDir}ftsynth.c.o" \xC4 :src:base:ftsynth.c
+"{ObjDir}ftsystem.c.o" \xC4 :src:base:ftsystem.c
+"{ObjDir}fttype1.c.o" \xC4 :src:base:fttype1.c
+"{ObjDir}ftwinfnt.c.o" \xC4 :src:base:ftwinfnt.c
+"{ObjDir}ftxf86.c.o" \xC4 :src:base:ftxf86.c
+"{ObjDir}ftcache.c.o" \xC4 :src:cache:ftcache.c
+"{ObjDir}bdf.c.o" \xC4 :src:bdf:bdf.c
+"{ObjDir}cff.c.o" \xC4 :src:cff:cff.c
+"{ObjDir}type1cid.c.o" \xC4 :src:cid:type1cid.c
+# "{ObjDir}gxvalid.c.o" \xC4 :src:gxvalid:gxvalid.c
+"{ObjDir}ftgzip.c.o" \xC4 :src:gzip:ftgzip.c
+"{ObjDir}ftbzip2.c.o" \xC4 :src:bzip2:ftbzip2.c
+"{ObjDir}ftlzw.c.o" \xC4 :src:lzw:ftlzw.c
+"{ObjDir}otvalid.c.o" \xC4 :src:otvalid:otvalid.c
+"{ObjDir}pcf.c.o" \xC4 :src:pcf:pcf.c
+"{ObjDir}pfr.c.o" \xC4 :src:pfr:pfr.c
+"{ObjDir}psaux.c.o" \xC4 :src:psaux:psaux.c
+"{ObjDir}pshinter.c.o" \xC4 :src:pshinter:pshinter.c
+"{ObjDir}psmodule.c.o" \xC4 :src:psnames:psmodule.c
+"{ObjDir}raster.c.o" \xC4 :src:raster:raster.c
+"{ObjDir}sfnt.c.o" \xC4 :src:sfnt:sfnt.c
+"{ObjDir}smooth.c.o" \xC4 :src:smooth:smooth.c
+"{ObjDir}truetype.c.o" \xC4 :src:truetype:truetype.c
+"{ObjDir}type1.c.o" \xC4 :src:type1:type1.c
+"{ObjDir}type42.c.o" \xC4 :src:type42:type42.c
+"{ObjDir}winfnt.c.o" \xC4 :src:winfonts:winfnt.c
+
+
+### Optional Dependencies ###
+### Build this target to generate "include file" dependencies. ###
+
+Dependencies  \xC4  $OutOfDate
+       MakeDepend \xB6
+               -append {MAKEFILE} \xB6
+               -ignore "{CIncludes}" \xB6
+               -objdir "{ObjDir}" \xB6
+               -objext .o \xB6
+               {Includes} \xB6
+               {SrcFiles}
+
+
diff --git a/builds/mac/FreeType.m68k_far.make.txt b/builds/mac/FreeType.m68k_far.make.txt
new file mode 100644 (file)
index 0000000..ebf5a1b
--- /dev/null
@@ -0,0 +1,211 @@
+#   File:       FreeType.m68k_far.make
+#   Target:     FreeType.m68k_far
+#   Created:    Tuesday, October 25, 2005 03:34:05 PM
+
+
+MAKEFILE        = FreeType.m68k_far.make
+\xA5MondoBuild\xA5    = {MAKEFILE}  # Make blank to avoid rebuilds when makefile is modified
+
+ObjDir          = :objs:
+Includes        =  \xB6
+                                 -includes unix \xB6
+                                 -i :include: \xB6
+                                 -i :src: \xB6
+                                 -i :include:freetype:config:
+
+Sym-68K         = -sym off
+
+COptions        = \xB6
+                       -d FT_MACINTOSH=1 \xB6
+                       -d HAVE_FSSPEC=1 \xB6
+                       -d HAVE_FSREF=0 \xB6
+                       -d HAVE_QUICKDRAW_TOOLBOX=1 \xB6
+                       -d HAVE_QUICKDRAW_CARBON=0 \xB6
+                       -d HAVE_ATS=0 \xB6
+                       -d FT2_BUILD_LIBRARY \xB6
+                       -d FT_CONFIG_CONFIG_H="<ftconfig.h>" \xB6
+                       -d FT_CONFIG_MODULES_H="<ftmodule.h>" \xB6
+                       {Includes} {Sym-68K} -model far
+
+
+### Source Files ###
+
+SrcFiles        =  \xB6
+                                 :src:autofit:autofit.c \xB6
+                                 :builds:mac:ftbase.c \xB6
+                                 :src:base:ftbbox.c \xB6
+                                 :src:base:ftbdf.c \xB6
+                                 :src:base:ftbitmap.c \xB6
+                                 :src:base:ftdebug.c \xB6
+                                 :src:base:ftfstype.c \xB6
+                                 :src:base:ftglyph.c \xB6
+                                 :src:base:ftgxval.c \xB6
+                                 :src:base:ftinit.c \xB6
+                                 :src:base:ftmm.c \xB6
+                                 :src:base:ftotval.c \xB6
+                                 :src:base:ftpfr.c \xB6
+                                 :src:base:ftstroke.c \xB6
+                                 :src:base:ftsynth.c \xB6
+                                 :src:base:ftsystem.c \xB6
+                                 :src:base:fttype1.c \xB6
+                                 :src:base:ftwinfnt.c \xB6
+                                 :src:base:ftxf86.c \xB6
+                                 :src:cache:ftcache.c \xB6
+                                 :src:bdf:bdf.c \xB6
+                                 :src:cff:cff.c \xB6
+                                 :src:cid:type1cid.c \xB6
+                                 :src:gxvalid:gxvalid.c \xB6
+                                 :src:gzip:ftgzip.c \xB6
+                                 :src:bzip2:ftbzip2.c \xB6
+                                 :src:lzw:ftlzw.c \xB6
+                                 :src:otvalid:otvalid.c \xB6
+                                 :src:pcf:pcf.c \xB6
+                                 :src:pfr:pfr.c \xB6
+                                 :src:psaux:psaux.c \xB6
+                                 :src:pshinter:pshinter.c \xB6
+                                 :src:psnames:psmodule.c \xB6
+                                 :src:raster:raster.c \xB6
+                                 :src:sfnt:sfnt.c \xB6
+                                 :src:smooth:smooth.c \xB6
+                                 :src:truetype:truetype.c \xB6
+                                 :src:type1:type1.c \xB6
+                                 :src:type42:type42.c \xB6
+                                 :src:winfonts:winfnt.c
+
+
+### Object Files ###
+
+ObjFiles-68K    =  \xB6
+                                 "{ObjDir}autofit.c.o" \xB6
+                                 "{ObjDir}ftbase.c.o" \xB6
+                                 "{ObjDir}ftbbox.c.o" \xB6
+                                 "{ObjDir}ftbdf.c.o" \xB6
+                                 "{ObjDir}ftbitmap.c.o" \xB6
+                                 "{ObjDir}ftdebug.c.o" \xB6
+                                 "{ObjDir}ftfstype.c.o" \xB6
+                                 "{ObjDir}ftglyph.c.o" \xB6
+                                 "{ObjDir}ftgxval.c.o" \xB6
+                                 "{ObjDir}ftinit.c.o" \xB6
+                                 "{ObjDir}ftmm.c.o" \xB6
+                                 "{ObjDir}ftotval.c.o" \xB6
+                                 "{ObjDir}ftpfr.c.o" \xB6
+                                 "{ObjDir}ftstroke.c.o" \xB6
+                                 "{ObjDir}ftsynth.c.o" \xB6
+                                 "{ObjDir}ftsystem.c.o" \xB6
+                                 "{ObjDir}fttype1.c.o" \xB6
+                                 "{ObjDir}ftwinfnt.c.o" \xB6
+                                 "{ObjDir}ftxf86.c.o" \xB6
+                                 "{ObjDir}ftcache.c.o" \xB6
+                                 "{ObjDir}bdf.c.o" \xB6
+                                 "{ObjDir}cff.c.o" \xB6
+                                 "{ObjDir}type1cid.c.o" \xB6
+                                 "{ObjDir}gxvalid.c.o" \xB6
+                                 "{ObjDir}ftgzip.c.o" \xB6
+                                 "{ObjDir}ftbzip2.c.o" \xB6
+                                 "{ObjDir}ftlzw.c.o" \xB6
+                                 "{ObjDir}otvalid.c.o" \xB6
+                                 "{ObjDir}pcf.c.o" \xB6
+                                 "{ObjDir}pfr.c.o" \xB6
+                                 "{ObjDir}psaux.c.o" \xB6
+                                 "{ObjDir}pshinter.c.o" \xB6
+                                 "{ObjDir}psmodule.c.o" \xB6
+                                 "{ObjDir}raster.c.o" \xB6
+                                 "{ObjDir}sfnt.c.o" \xB6
+                                 "{ObjDir}smooth.c.o" \xB6
+                                 "{ObjDir}truetype.c.o" \xB6
+                                 "{ObjDir}type1.c.o" \xB6
+                                 "{ObjDir}type42.c.o" \xB6
+                                 "{ObjDir}winfnt.c.o"
+
+
+### Libraries ###
+
+LibFiles-68K    =
+
+
+### Default Rules ###
+
+.c.o  \xC4  .c  {\xA5MondoBuild\xA5}
+       {C} {depDir}{default}.c -o {targDir}{default}.c.o {COptions} \xB6
+       -ansi strict
+
+### Build Rules ###
+
+:builds:mac:ftbase.c \xC4\xC4 :src:base:ftbase.c
+       Duplicate :src:base:ftbase.c :builds:mac:ftbase.c
+
+"{ObjDir}ftbase.c.o" \xC4\xC4 :builds:mac:ftbase.c
+       {C} :builds:mac:ftbase.c -o "{ObjDir}ftbase.c.o" \xB6
+                               -i :builds:mac: \xB6
+                               -i :src:base: \xB6
+                               {COptions}
+
+FreeType.m68k_far    \xC4\xC4  FreeType.m68k_far.o
+
+FreeType.m68k_far.o  \xC4\xC4  {ObjFiles-68K} {LibFiles-68K} {\xA5MondoBuild\xA5}
+       Lib \xB6
+               -o {Targ} \xB6
+               {ObjFiles-68K} \xB6
+               {LibFiles-68K} \xB6
+               {Sym-68K} \xB6
+               -mf -d
+
+
+
+### Required Dependencies ###
+
+"{ObjDir}autofit.c.o" \xC4 :src:autofit:autofit.c
+# "{ObjDir}ftbase.c.o" \xC4 :src:base:ftbase.c
+"{ObjDir}ftbbox.c.o" \xC4 :src:base:ftbbox.c
+"{ObjDir}ftbdf.c.o" \xC4 :src:base:ftbdf.c
+"{ObjDir}ftbitmap.c.o" \xC4 :src:base:ftbitmap.c
+"{ObjDir}ftdebug.c.o" \xC4 :src:base:ftdebug.c
+"{ObjDir}ftfstype.c.o" \xC4 :src:base:ftfstype.c
+"{ObjDir}ftglyph.c.o" \xC4 :src:base:ftglyph.c
+"{ObjDir}ftgxval.c.o" \xC4 :src:base:ftgxval.c
+"{ObjDir}ftinit.c.o" \xC4 :src:base:ftinit.c
+"{ObjDir}ftmm.c.o" \xC4 :src:base:ftmm.c
+"{ObjDir}ftotval.c.o" \xC4 :src:base:ftotval.c
+"{ObjDir}ftpfr.c.o" \xC4 :src:base:ftpfr.c
+"{ObjDir}ftstroke.c.o" \xC4 :src:base:ftstroke.c
+"{ObjDir}ftsynth.c.o" \xC4 :src:base:ftsynth.c
+"{ObjDir}ftsystem.c.o" \xC4 :src:base:ftsystem.c
+"{ObjDir}fttype1.c.o" \xC4 :src:base:fttype1.c
+"{ObjDir}ftwinfnt.c.o" \xC4 :src:base:ftwinfnt.c
+"{ObjDir}ftxf86.c.o" \xC4 :src:base:ftxf86.c
+"{ObjDir}ftcache.c.o" \xC4 :src:cache:ftcache.c
+"{ObjDir}bdf.c.o" \xC4 :src:bdf:bdf.c
+"{ObjDir}cff.c.o" \xC4 :src:cff:cff.c
+"{ObjDir}type1cid.c.o" \xC4 :src:cid:type1cid.c
+"{ObjDir}gxvalid.c.o" \xC4 :src:gxvalid:gxvalid.c
+"{ObjDir}ftgzip.c.o" \xC4 :src:gzip:ftgzip.c
+"{ObjDir}ftbzip2.c.o" \xC4 :src:bzip2:ftbzip2.c
+"{ObjDir}ftlzw.c.o" \xC4 :src:lzw:ftlzw.c
+"{ObjDir}otvalid.c.o" \xC4 :src:otvalid:otvalid.c
+"{ObjDir}pcf.c.o" \xC4 :src:pcf:pcf.c
+"{ObjDir}pfr.c.o" \xC4 :src:pfr:pfr.c
+"{ObjDir}psaux.c.o" \xC4 :src:psaux:psaux.c
+"{ObjDir}pshinter.c.o" \xC4 :src:pshinter:pshinter.c
+"{ObjDir}psmodule.c.o" \xC4 :src:psnames:psmodule.c
+"{ObjDir}raster.c.o" \xC4 :src:raster:raster.c
+"{ObjDir}sfnt.c.o" \xC4 :src:sfnt:sfnt.c
+"{ObjDir}smooth.c.o" \xC4 :src:smooth:smooth.c
+"{ObjDir}truetype.c.o" \xC4 :src:truetype:truetype.c
+"{ObjDir}type1.c.o" \xC4 :src:type1:type1.c
+"{ObjDir}type42.c.o" \xC4 :src:type42:type42.c
+"{ObjDir}winfnt.c.o" \xC4 :src:winfonts:winfnt.c
+
+
+### Optional Dependencies ###
+### Build this target to generate "include file" dependencies. ###
+
+Dependencies  \xC4  $OutOfDate
+       MakeDepend \xB6
+               -append {MAKEFILE} \xB6
+               -ignore "{CIncludes}" \xB6
+               -objdir "{ObjDir}" \xB6
+               -objext .o \xB6
+               {Includes} \xB6
+               {SrcFiles}
+
+
diff --git a/builds/mac/FreeType.ppc_carbon.make.txt b/builds/mac/FreeType.ppc_carbon.make.txt
new file mode 100644 (file)
index 0000000..2926413
--- /dev/null
@@ -0,0 +1,215 @@
+#   File:       FreeType.ppc_carbon.make
+#   Target:     FreeType.ppc_carbon
+#   Created:    Friday, October 28, 2005 03:40:06 PM
+
+
+MAKEFILE        = FreeType.ppc_carbon.make
+\xA5MondoBuild\xA5    = {MAKEFILE}  # Make blank to avoid rebuilds when makefile is modified
+
+ObjDir          = :objs:
+Includes        =  \xB6
+                                 -ansi strict \xB6
+                                 -includes unix \xB6
+                                 -i :include: \xB6
+                                 -i :src: \xB6
+                                 -i :include:freetype:config:
+
+Sym-PPC         = -sym off
+
+PPCCOptions     = \xB6
+                       -d FT_MACINTOSH=1 \xB6
+                       -d HAVE_FSSPEC=1 \xB6
+                        -d HAVE_FSREF=1 \xB6
+                       -d HAVE_QUICKDRAW_TOOLBOX=1 \xB6
+                       -d HAVE_QUICKDRAW_CARBON=1 \xB6
+                        -d HAVE_ATS=0 \xB6
+                       -d FT2_BUILD_LIBRARY \xB6
+                       -d FT_CONFIG_CONFIG_H="<ftconfig.h>" \xB6
+                       -d FT_CONFIG_MODULES_H="<ftmodule.h>" \xB6
+                       {Includes} {Sym-PPC} -d TARGET_API_MAC_CARBON=1
+
+
+### Source Files ###
+
+SrcFiles        =  \xB6
+                                 :src:autofit:autofit.c \xB6
+                                 :builds:mac:ftbase.c \xB6
+                                 :src:base:ftbbox.c \xB6
+                                 :src:base:ftbdf.c \xB6
+                                 :src:base:ftbitmap.c \xB6
+                                 :src:base:ftdebug.c \xB6
+                                 :src:base:ftfstype.c \xB6
+                                 :src:base:ftglyph.c \xB6
+                                 :src:base:ftgxval.c \xB6
+                                 :src:base:ftinit.c \xB6
+                                 :src:base:ftmm.c \xB6
+                                 :src:base:ftotval.c \xB6
+                                 :src:base:ftpfr.c \xB6
+                                 :src:base:ftstroke.c \xB6
+                                 :src:base:ftsynth.c \xB6
+                                 :src:base:ftsystem.c \xB6
+                                 :src:base:fttype1.c \xB6
+                                 :src:base:ftwinfnt.c \xB6
+                                 :src:base:ftxf86.c \xB6
+                                 :src:cache:ftcache.c \xB6
+                                 :src:bdf:bdf.c \xB6
+                                 :src:cff:cff.c \xB6
+                                 :src:cid:type1cid.c \xB6
+                                 :src:gxvalid:gxvalid.c \xB6
+                                 :src:gzip:ftgzip.c \xB6
+                                 :src:bzip2:ftbzip2.c \xB6
+                                 :src:lzw:ftlzw.c \xB6
+                                 :src:otvalid:otvalid.c \xB6
+                                 :src:pcf:pcf.c \xB6
+                                 :src:pfr:pfr.c \xB6
+                                 :src:psaux:psaux.c \xB6
+                                 :src:pshinter:pshinter.c \xB6
+                                 :src:psnames:psmodule.c \xB6
+                                 :src:raster:raster.c \xB6
+                                 :src:sfnt:sfnt.c \xB6
+                                 :src:smooth:smooth.c \xB6
+                                 :src:truetype:truetype.c \xB6
+                                 :src:type1:type1.c \xB6
+                                 :src:type42:type42.c \xB6
+                                 :src:winfonts:winfnt.c
+
+
+### Object Files ###
+
+ObjFiles-PPC    =  \xB6
+                                 "{ObjDir}autofit.c.x" \xB6
+                                 "{ObjDir}ftbase.c.x" \xB6
+                                 "{ObjDir}ftbbox.c.x" \xB6
+                                 "{ObjDir}ftbdf.c.x" \xB6
+                                 "{ObjDir}ftbitmap.c.x" \xB6
+                                 "{ObjDir}ftdebug.c.x" \xB6
+                                 "{ObjDir}ftfstype.c.x" \xB6
+                                 "{ObjDir}ftglyph.c.x" \xB6
+                                 "{ObjDir}ftgxval.c.x" \xB6
+                                 "{ObjDir}ftinit.c.x" \xB6
+                                 "{ObjDir}ftmm.c.x" \xB6
+                                 "{ObjDir}ftotval.c.x" \xB6
+                                 "{ObjDir}ftpfr.c.x" \xB6
+                                 "{ObjDir}ftstroke.c.x" \xB6
+                                 "{ObjDir}ftsynth.c.x" \xB6
+                                 "{ObjDir}ftsystem.c.x" \xB6
+                                 "{ObjDir}fttype1.c.x" \xB6
+                                 "{ObjDir}ftwinfnt.c.x" \xB6
+                                 "{ObjDir}ftxf86.c.x" \xB6
+                                 "{ObjDir}ftcache.c.x" \xB6
+                                 "{ObjDir}bdf.c.x" \xB6
+                                 "{ObjDir}cff.c.x" \xB6
+                                 "{ObjDir}type1cid.c.x" \xB6
+                                 "{ObjDir}gxvalid.c.x" \xB6
+                                 "{ObjDir}ftgzip.c.x" \xB6
+                                 "{ObjDir}ftbzip2.c.x" \xB6
+                                 "{ObjDir}ftlzw.c.x" \xB6
+                                 "{ObjDir}otvalid.c.x" \xB6
+                                 "{ObjDir}pcf.c.x" \xB6
+                                 "{ObjDir}pfr.c.x" \xB6
+                                 "{ObjDir}psaux.c.x" \xB6
+                                 "{ObjDir}pshinter.c.x" \xB6
+                                 "{ObjDir}psmodule.c.x" \xB6
+                                 "{ObjDir}raster.c.x" \xB6
+                                 "{ObjDir}sfnt.c.x" \xB6
+                                 "{ObjDir}smooth.c.x" \xB6
+                                 "{ObjDir}truetype.c.x" \xB6
+                                 "{ObjDir}type1.c.x" \xB6
+                                 "{ObjDir}type42.c.x" \xB6
+                                 "{ObjDir}winfnt.c.x"
+
+
+### Libraries ###
+
+LibFiles-PPC    =
+
+
+### Default Rules ###
+
+.c.x  \xC4  .c  {\xA5MondoBuild\xA5}
+       {PPCC} {depDir}{default}.c -o {targDir}{default}.c.x {PPCCOptions}
+
+
+### Build Rules ###
+
+:builds:mac:ftbase.c \xC4\xC4 :src:base:ftbase.c
+       Duplicate :src:base:ftbase.c :builds:mac:ftbase.c
+
+"{ObjDir}ftbase.c.x"  \xC4\xC4  :builds:mac:ftbase.c
+       {PPCC} :builds:mac:ftbase.c -o {ObjDir}ftbase.c.x \xB6
+               -i :builds:mac: \xB6
+               -i :src:base: \xB6
+               {PPCCOptions}
+
+FreeType.ppc_carbon    \xC4\xC4  FreeType.ppc_carbon.o
+
+FreeType.ppc_carbon.o  \xC4\xC4  {ObjFiles-PPC} {LibFiles-PPC} {\xA5MondoBuild\xA5}
+       PPCLink \xB6
+               -o {Targ} \xB6
+               {ObjFiles-PPC} \xB6
+               {LibFiles-PPC} \xB6
+               {Sym-PPC} \xB6
+               -mf -d \xB6
+               -t 'XCOF' \xB6
+               -c 'MPS ' \xB6
+               -xm l
+
+
+
+### Required Dependencies ###
+
+"{ObjDir}autofit.c.x" \xC4 :src:autofit:autofit.c
+# "{ObjDir}ftbase.c.x" \xC4 :builds:mac:ftbase.c
+"{ObjDir}ftbbox.c.x" \xC4 :src:base:ftbbox.c
+"{ObjDir}ftbdf.c.x" \xC4 :src:base:ftbdf.c
+"{ObjDir}ftbitmap.c.x" \xC4 :src:base:ftbitmap.c
+"{ObjDir}ftdebug.c.x" \xC4 :src:base:ftdebug.c
+"{ObjDir}ftfstype.c.x" \xC4 :src:base:ftfstype.c
+"{ObjDir}ftglyph.c.x" \xC4 :src:base:ftglyph.c
+"{ObjDir}ftgxval.c.x" \xC4 :src:base:ftgxval.c
+"{ObjDir}ftinit.c.x" \xC4 :src:base:ftinit.c
+"{ObjDir}ftmm.c.x" \xC4 :src:base:ftmm.c
+"{ObjDir}ftotval.c.x" \xC4 :src:base:ftotval.c
+"{ObjDir}ftpfr.c.x" \xC4 :src:base:ftpfr.c
+"{ObjDir}ftstroke.c.x" \xC4 :src:base:ftstroke.c
+"{ObjDir}ftsynth.c.x" \xC4 :src:base:ftsynth.c
+"{ObjDir}ftsystem.c.x" \xC4 :src:base:ftsystem.c
+"{ObjDir}fttype1.c.x" \xC4 :src:base:fttype1.c
+"{ObjDir}ftwinfnt.c.x" \xC4 :src:base:ftwinfnt.c
+"{ObjDir}ftxf86.c.x" \xC4 :src:base:ftxf86.c
+"{ObjDir}ftcache.c.x" \xC4 :src:cache:ftcache.c
+"{ObjDir}bdf.c.x" \xC4 :src:bdf:bdf.c
+"{ObjDir}cff.c.x" \xC4 :src:cff:cff.c
+"{ObjDir}type1cid.c.x" \xC4 :src:cid:type1cid.c
+"{ObjDir}gxvalid.c.x" \xC4 :src:gxvalid:gxvalid.c
+"{ObjDir}ftgzip.c.x" \xC4 :src:gzip:ftgzip.c
+"{ObjDir}ftbzip2.c.x" \xC4 :src:bzip2:ftbzip2.c
+"{ObjDir}ftlzw.c.x" \xC4 :src:lzw:ftlzw.c
+"{ObjDir}otvalid.c.x" \xC4 :src:otvalid:otvalid.c
+"{ObjDir}pcf.c.x" \xC4 :src:pcf:pcf.c
+"{ObjDir}pfr.c.x" \xC4 :src:pfr:pfr.c
+"{ObjDir}psaux.c.x" \xC4 :src:psaux:psaux.c
+"{ObjDir}pshinter.c.x" \xC4 :src:pshinter:pshinter.c
+"{ObjDir}psmodule.c.x" \xC4 :src:psnames:psmodule.c
+"{ObjDir}raster.c.x" \xC4 :src:raster:raster.c
+"{ObjDir}sfnt.c.x" \xC4 :src:sfnt:sfnt.c
+"{ObjDir}smooth.c.x" \xC4 :src:smooth:smooth.c
+"{ObjDir}truetype.c.x" \xC4 :src:truetype:truetype.c
+"{ObjDir}type1.c.x" \xC4 :src:type1:type1.c
+"{ObjDir}type42.c.x" \xC4 :src:type42:type42.c
+"{ObjDir}winfnt.c.x" \xC4 :src:winfonts:winfnt.c
+
+
+### Optional Dependencies ###
+### Build this target to generate "include file" dependencies. ###
+
+Dependencies  \xC4  $OutOfDate
+       MakeDepend \xB6
+               -append {MAKEFILE} \xB6
+               -ignore "{CIncludes}" \xB6
+               -objdir "{ObjDir}" \xB6
+               -objext .x \xB6
+               {Includes} \xB6
+               {SrcFiles}
+
+
diff --git a/builds/mac/FreeType.ppc_classic.make.txt b/builds/mac/FreeType.ppc_classic.make.txt
new file mode 100644 (file)
index 0000000..377de9a
--- /dev/null
@@ -0,0 +1,216 @@
+#   File:       FreeType.ppc_classic.make
+#   Target:     FreeType.ppc_classic
+#   Created:    Thursday, October 27, 2005 07:42:43 PM
+
+
+MAKEFILE        = FreeType.ppc_classic.make
+\xA5MondoBuild\xA5    = {MAKEFILE}  # Make blank to avoid rebuilds when makefile is modified
+
+ObjDir          = :objs:
+Includes        =  \xB6
+                                 -ansi strict \xB6
+                                 -includes unix \xB6
+                                 -i :include: \xB6
+                                 -i :src: \xB6
+                                 -i :include:freetype:config:
+
+Sym-PPC         = -sym off
+
+PPCCOptions     = \xB6
+                        -d FT_MACINTOSH=1 \xB6
+                        -d HAVE_FSSPEC=1 \xB6
+                        -d HAVE_FSREF=0 \xB6
+                        -d HAVE_QUICKDRAW_TOOLBOX=1 \xB6
+                        -d HAVE_QUICKDRAW_CARBON=0 \xB6
+                        -d HAVE_ATS=0 \xB6
+                       -d FT2_BUILD_LIBRARY \xB6
+                       -d FT_CONFIG_CONFIG_H="<ftconfig.h>" \xB6
+                       -d FT_CONFIG_MODULES_H="<ftmodule.h>" \xB6
+                       {Includes} {Sym-PPC}
+
+
+### Source Files ###
+
+SrcFiles        =  \xB6
+                                 :src:autofit:autofit.c \xB6
+                                 :builds:mac:ftbase.c \xB6
+                                 :src:base:ftbbox.c \xB6
+                                 :src:base:ftbdf.c \xB6
+                                 :src:base:ftbitmap.c \xB6
+                                 :src:base:ftdebug.c \xB6
+                                 :src:base:ftfstype.c \xB6
+                                 :src:base:ftglyph.c \xB6
+                                 :src:base:ftgxval.c \xB6
+                                 :src:base:ftinit.c \xB6
+                                 :src:base:ftmm.c \xB6
+                                 :src:base:ftotval.c \xB6
+                                 :src:base:ftpfr.c \xB6
+                                 :src:base:ftstroke.c \xB6
+                                 :src:base:ftsynth.c \xB6
+                                 :src:base:ftsystem.c \xB6
+                                 :src:base:fttype1.c \xB6
+                                 :src:base:ftwinfnt.c \xB6
+                                 :src:base:ftxf86.c \xB6
+                                 :src:cache:ftcache.c \xB6
+                                 :src:bdf:bdf.c \xB6
+                                 :src:cff:cff.c \xB6
+                                 :src:cid:type1cid.c \xB6
+                                 :src:gxvalid:gxvalid.c \xB6
+                                 :src:gzip:ftgzip.c \xB6
+                                 :src:bzip2:ftbzip2.c \xB6
+                                 :src:lzw:ftlzw.c \xB6
+                                 :src:otvalid:otvalid.c \xB6
+                                 :src:pcf:pcf.c \xB6
+                                 :src:pfr:pfr.c \xB6
+                                 :src:psaux:psaux.c \xB6
+                                 :src:pshinter:pshinter.c \xB6
+                                 :src:psnames:psmodule.c \xB6
+                                 :src:raster:raster.c \xB6
+                                 :src:sfnt:sfnt.c \xB6
+                                 :src:smooth:smooth.c \xB6
+                                 :src:truetype:truetype.c \xB6
+                                 :src:type1:type1.c \xB6
+                                 :src:type42:type42.c \xB6
+                                 :src:winfonts:winfnt.c
+
+
+### Object Files ###
+
+ObjFiles-PPC    =  \xB6
+                                 "{ObjDir}autofit.c.x" \xB6
+                                 "{ObjDir}ftbase.c.x" \xB6
+                                 "{ObjDir}ftbbox.c.x" \xB6
+                                 "{ObjDir}ftbdf.c.x" \xB6
+                                 "{ObjDir}ftbitmap.c.x" \xB6
+                                 "{ObjDir}ftdebug.c.x" \xB6
+                                 "{ObjDir}ftfstype.c.x" \xB6
+                                 "{ObjDir}ftglyph.c.x" \xB6
+                                 "{ObjDir}ftgxval.c.x" \xB6
+                                 "{ObjDir}ftinit.c.x" \xB6
+                                 "{ObjDir}ftmm.c.x" \xB6
+                                 "{ObjDir}ftotval.c.x" \xB6
+                                 "{ObjDir}ftpfr.c.x" \xB6
+                                 "{ObjDir}ftstroke.c.x" \xB6
+                                 "{ObjDir}ftsynth.c.x" \xB6
+                                 "{ObjDir}ftsystem.c.x" \xB6
+                                 "{ObjDir}fttype1.c.x" \xB6
+                                 "{ObjDir}ftwinfnt.c.x" \xB6
+                                 "{ObjDir}ftxf86.c.x" \xB6
+                                 "{ObjDir}ftcache.c.x" \xB6
+                                 "{ObjDir}bdf.c.x" \xB6
+                                 "{ObjDir}cff.c.x" \xB6
+                                 "{ObjDir}type1cid.c.x" \xB6
+                                 "{ObjDir}gxvalid.c.x" \xB6
+                                 "{ObjDir}ftgzip.c.x" \xB6
+                                 "{ObjDir}ftbzip2.c.x" \xB6
+                                 "{ObjDir}ftlzw.c.x" \xB6
+                                 "{ObjDir}otvalid.c.x" \xB6
+                                 "{ObjDir}pcf.c.x" \xB6
+                                 "{ObjDir}pfr.c.x" \xB6
+                                 "{ObjDir}psaux.c.x" \xB6
+                                 "{ObjDir}pshinter.c.x" \xB6
+                                 "{ObjDir}psmodule.c.x" \xB6
+                                 "{ObjDir}raster.c.x" \xB6
+                                 "{ObjDir}sfnt.c.x" \xB6
+                                 "{ObjDir}smooth.c.x" \xB6
+                                 "{ObjDir}truetype.c.x" \xB6
+                                 "{ObjDir}type1.c.x" \xB6
+                                 "{ObjDir}type42.c.x" \xB6
+                                 "{ObjDir}winfnt.c.x"
+
+
+### Libraries ###
+
+LibFiles-PPC    =
+
+
+### Default Rules ###
+
+.c.x  \xC4  .c  {\xA5MondoBuild\xA5}
+       {PPCC} {depDir}{default}.c -o {targDir}{default}.c.x {PPCCOptions}
+
+
+### Build Rules ###
+
+:builds:mac:ftbase.c \xC4\xC4 :src:base:ftbase.c
+       Duplicate :src:base:ftbase.c :builds:mac:ftbase.c
+
+"{ObjDir}ftbase.c.x"  \xC4\xC4  :builds:mac:ftbase.c
+       {PPCC} :builds:mac:ftbase.c -o "{ObjDir}ftbase.c.x" \xB6
+               -i :builds:mac: \xB6
+               -i :src:base: \xB6
+               {PPCCOptions}
+
+FreeType.ppc_classic    \xC4\xC4  FreeType.ppc_classic.o
+
+FreeType.ppc_classic.o  \xC4\xC4  {ObjFiles-PPC} {LibFiles-PPC} {\xA5MondoBuild\xA5}
+       PPCLink \xB6
+               -o {Targ} \xB6
+               {ObjFiles-PPC} \xB6
+               {LibFiles-PPC} \xB6
+               {Sym-PPC} \xB6
+               -mf -d \xB6
+               -t 'XCOF' \xB6
+               -c 'MPS ' \xB6
+               -xm l
+
+
+
+### Required Dependencies ###
+
+"{ObjDir}autofit.c.x" \xC4 :src:autofit:autofit.c
+# "{ObjDir}ftbase.c.x" \xC4 :builds:mac:ftbase.c
+"{ObjDir}ftbbox.c.x" \xC4 :src:base:ftbbox.c
+"{ObjDir}ftbdf.c.x" \xC4 :src:base:ftbdf.c
+"{ObjDir}ftbitmap.c.x" \xC4 :src:base:ftbitmap.c
+"{ObjDir}ftdebug.c.x" \xC4 :src:base:ftdebug.c
+"{ObjDir}ftfstype.c.x" \xC4 :src:base:ftfstype.c
+"{ObjDir}ftglyph.c.x" \xC4 :src:base:ftglyph.c
+"{ObjDir}ftgxval.c.x" \xC4 :src:base:ftgxval.c
+"{ObjDir}ftinit.c.x" \xC4 :src:base:ftinit.c
+"{ObjDir}ftmm.c.x" \xC4 :src:base:ftmm.c
+"{ObjDir}ftotval.c.x" \xC4 :src:base:ftotval.c
+"{ObjDir}ftpfr.c.x" \xC4 :src:base:ftpfr.c
+"{ObjDir}ftstroke.c.x" \xC4 :src:base:ftstroke.c
+"{ObjDir}ftsynth.c.x" \xC4 :src:base:ftsynth.c
+"{ObjDir}ftsystem.c.x" \xC4 :src:base:ftsystem.c
+"{ObjDir}fttype1.c.x" \xC4 :src:base:fttype1.c
+"{ObjDir}ftwinfnt.c.x" \xC4 :src:base:ftwinfnt.c
+"{ObjDir}ftxf86.c.x" \xC4 :src:base:ftxf86.c
+"{ObjDir}ftcache.c.x" \xC4 :src:cache:ftcache.c
+"{ObjDir}bdf.c.x" \xC4 :src:bdf:bdf.c
+"{ObjDir}cff.c.x" \xC4 :src:cff:cff.c
+"{ObjDir}type1cid.c.x" \xC4 :src:cid:type1cid.c
+"{ObjDir}gxvalid.c.x" \xC4 :src:gxvalid:gxvalid.c
+"{ObjDir}ftgzip.c.x" \xC4 :src:gzip:ftgzip.c
+"{ObjDir}ftbzip2.c.x" \xC4 :src:bzip2:ftbzip2.c
+"{ObjDir}ftlzw.c.x" \xC4 :src:lzw:ftlzw.c
+"{ObjDir}otvalid.c.x" \xC4 :src:otvalid:otvalid.c
+"{ObjDir}pcf.c.x" \xC4 :src:pcf:pcf.c
+"{ObjDir}pfr.c.x" \xC4 :src:pfr:pfr.c
+"{ObjDir}psaux.c.x" \xC4 :src:psaux:psaux.c
+"{ObjDir}pshinter.c.x" \xC4 :src:pshinter:pshinter.c
+"{ObjDir}psmodule.c.x" \xC4 :src:psnames:psmodule.c
+"{ObjDir}raster.c.x" \xC4 :src:raster:raster.c
+"{ObjDir}sfnt.c.x" \xC4 :src:sfnt:sfnt.c
+"{ObjDir}smooth.c.x" \xC4 :src:smooth:smooth.c
+"{ObjDir}truetype.c.x" \xC4 :src:truetype:truetype.c
+"{ObjDir}type1.c.x" \xC4 :src:type1:type1.c
+"{ObjDir}type42.c.x" \xC4 :src:type42:type42.c
+"{ObjDir}winfnt.c.x" \xC4 :src:winfonts:winfnt.c
+
+
+
+### Optional Dependencies ###
+### Build this target to generate "include file" dependencies. ###
+
+Dependencies  \xC4  $OutOfDate
+       MakeDepend \xB6
+               -append {MAKEFILE} \xB6
+               -ignore "{CIncludes}" \xB6
+               -objdir "{ObjDir}" \xB6
+               -objext .x \xB6
+               {Includes} \xB6
+               {SrcFiles}
+
+
diff --git a/builds/mac/README b/builds/mac/README
new file mode 100644 (file)
index 0000000..bd3df8a
--- /dev/null
@@ -0,0 +1,403 @@
+This folder contains
+
+  * Makefile skeltons for Apple MPW (Macintosh's Programmers Workshop)
+
+  * Python script to generate MPW makefile from skelton
+
+  * Metrowerks CodeWarrior 9.0 project file in XML format
+
+------------------------------------------------------------
+
+1. What is this
+---------------
+
+Files in this directory are designed to build FreeType
+running on classic MacOS. To build FreeType running on
+Mac OS X, build as the system is UNIX.
+
+However, Mac OS X is most useful to manipulate files in
+vanilla FreeType to fit classic MacOS.
+
+The information about MacOS specific API is written in
+appendix of this document.
+
+2. Requirement
+--------------
+
+You can use MPW: a free-charged developer environment
+by Apple, or CodeWarrior: a commercial developer
+environment by Metrowerks. GCC for MPW and Symantec
+"Think C" are not tested at present.
+
+
+  2-1. Apple MPW
+  --------------
+
+  Following C compilers are tested:
+
+      m68k target:     Apple SC  8.9.0d3e1
+      ppc  target:     Apple MrC 5.0.0d3c1
+
+  The final MPW-GM (official release on 1999/Dec) is too
+  old and cannot compile FreeType, because bundled C
+  compilers cannot search header files in sub directories.
+  Updating by the final MPW-PR (pre-release on 2001/Feb)
+  is required.
+
+  Required files are downloadable from:
+
+      http://developer.apple.com/tools/mpw-tools/index.html
+
+  Also you can find documents how to update by MPW-PR.
+
+  Python is required to restore MPW makefiles from the
+  skeltons. Python bundled to Mac OS X is enough. For
+  classic MacOS, MacPython is available:
+
+      http://homepages.cwi.nl/~jack/macpython/
+
+  MPW requires all files are typed by resource fork.
+  ResEdit bundled to MPW is enough. In Mac OS X,
+  /Developer/Tools/SetFile of DevTool is useful to
+  manipulate from commandline.
+
+  2-2. Metrowerks CodeWarrior
+  ---------------------------
+
+  XML project file is generated and tested by
+  CodeWarrior 9.0.  Older versions are not tested
+  at all. At present, static library for ppc target
+  is available in the project file.
+
+
+3. How to build
+---------------
+
+  3-1. Apple MPW
+  --------------
+  Detailed building procedure by Apple MPW is
+  described in following.
+
+    3-1-1. Generate MPW makefiles from the skeltons
+    ------------------------------------------------
+
+    Here are 4 skeltons for following targets are
+    included.
+
+    - FreeType.m68k_far.make.txt
+      Ancient 32bit binary executable format for
+      m68k MacOS: System 6, with 32bit addressing
+      mode (far-pointer-model) So-called "Toolbox"
+      API is used.
+
+    - FreeType.m68k_cfm.make.txt
+      CFM binary executable format for m68k MacOS:
+      System 7. So-called "Toolbox" API is used.
+
+    - FreeType.ppc_classic.make.txt
+      CFM binary executable format for ppc MacOS:
+      System 7, MacOS 8, MacOS 9. So-called "Toolbox"
+      API is used.
+
+    - FreeType.ppc_carbon.make.txt
+      CFM binary executable format for ppc MacOS:
+      MacOS 9. Carbon API is used.
+
+    At present, static library is only supported,
+    although targets except of m68k_far are capable
+    to use shared library.
+
+    MPW makefile syntax uses 8bit characters. To keep
+    from violating them during version control, here
+    we store skeltons in pure ASCII format. You must
+    generate MPW makefile by Python script ascii2mpw.py.
+
+    In Mac OS X terminal, you can convert as:
+
+       python builds/mac/ascii2mpw.py \
+               < builds/mac/FreeType.m68k_far.make.txt \
+               > FreeType.m68k_far.make
+
+    The skeltons are designed to use in the top
+    directory where there are builds, include, src etc.
+    You must name the generated MPW makefile by removing
+    ".txt" from source skelton name.
+
+    3-1-2. Add resource forks to related files
+    ------------------------------------------
+
+    MPW's Make and C compilers cannot recognize files
+    without resource fork. You have to add resource
+    fork to the files that MPW uses. In Mac OS X
+    terminal of the system, you can do as:
+
+       find . -name '*.[ch]' -exec \
+               /Developer/Tools/SetFile -a l -c "MPS " -t TEXT \{\} \;
+
+       find . -name '*.make' -exec \
+               /Developer/Tools/SetFile -a l -c "MPS " -t TEXT \{\} \;
+
+
+    3-1-3. Open MPW shell and build
+    -------------------------------
+
+    Open MPW shell and go to the top directory that
+    FreeType sources are extracted (MPW makefile must
+    be located in there), from "Set Directory" in
+    "Directory" menu.
+
+    Choose "Build" from "Build" menu, and type the
+    name of project by removing ".make" from MPW
+    makefile, as: FreeType.m68k_far
+
+    If building is successfully finished, you can find
+    built library in objs/ directory.
+
+
+  3-2. Metrowerks CodeWarrior
+  ---------------------------
+
+  Detailed building procedure by Metrowerks
+  CodeWarrior (CW) 9.0 is described in following.
+
+    3-2-1. Import XML project file
+    ------------------------------
+
+    CW XML project file is not ready for double-
+    click. Start CodeWarrior IDE, and choose
+    "Import project" in "File" menu. Choose XML
+    project file: builds/mac/ftlib.prj.xml.
+    In next, you will be asked where to save CW
+    native project file: you must choose
+    "builds/mac/ftlib.prj". The project file is
+    designed with relative path from there. After
+    CW native project file is generated, it is
+    automatically loaded, small project window
+    titled "ftlib.prj" is displayed.
+
+    3-2-2. Building
+    ---------------
+    Choose "Make" from "Project" menu. If building
+    is successfully finished, you can find built
+    library at objs/FreeTypeLib.
+
+4. TODO
+-------
+
+  4-1. All modules should be included
+  -----------------------------------
+
+  At present, MPW makefiles and CW project file are
+  just updated versions of these by Leonard. Some
+  modules are added after the last maintenance, they
+  are not included.
+
+  4-2. Working test with ftdemos
+  ------------------------------
+
+  At present, MPW makefiles and CW project file can
+  build FreeType for classic MacOS. But their working
+  behaviours are not tested at all. Building ftdemos
+  for classic MacOS and working test is required.
+
+  4-3. Porting Jam onto MPW
+  -------------------------
+
+  FreeType uses Jam (and FT-Jam) for unified cross-
+  platform building tool. At present, Jam is not ported
+  to MPW. To update classic MacOS support easily,
+  building by Jam is expected on MPW.
+
+
+APPENDIX I
+----------
+
+  A-1. Framework dependencies
+  ---------------------------
+
+  src/base/ftmac.c adds two Mac-specific features to
+  FreeType. These features are based on MacOS libraries.
+
+  * accessing resource-fork font
+  The fonts for classic MacOS store their graphical data
+  in resource forks which cannot be accessed via ANSI C
+  functions. FreeType2 provides functions to handle such
+  resource fork fonts, they are based on File Manager
+  framework of MacOS. In addition, HFS and HFS+ file
+  system driver of Linux is supported. Following
+  functions are for this purpose.
+
+    FT_New_Face_From_Resource()
+    FT_New_Face_From_FSSpec()
+    FT_New_Face_From_FSRef()
+
+  * resolving font name to font file
+  The font menu of MacOS application prefers font name
+  written in FOND resource than sfnt resource. FreeType2
+  provides functions to find font file by name in MacOS
+  application, they are based on QuickDraw Font Manager
+  and Apple Type Service framework of MacOS.
+
+    FT_GetFile_From_Mac_Name()
+    FT_GetFile_From_Mac_ATS_Name()
+
+  Working functions for each MacOS are summarized as
+  following.
+
+  upto MacOS 6:
+    not tested (you have to obtain MPW 2.x)
+
+  MacOS 7.x, 8.x, 9.x (without CarbonLib):
+    FT_GetFile_From_Mac_Name()
+    FT_New_Face_From_Resource()
+    FT_New_Face_From_FSSpec()
+
+  MacOS 9.x (with CarbonLib):
+    FT_GetFile_From_Mac_Name()
+    FT_New_Face_From_Resource()
+    FT_New_Face_From_FSSpec()
+    FT_New_Face_From_FSRef()
+
+  Mac OS X upto 10.4.x:
+    FT_GetFile_From_Mac_Name()     deprecated
+    FT_New_Face_From_FSSpec()      deprecated
+    FT_GetFile_From_Mac_ATS_Name() deprecated?
+    FT_New_Face_From_FSRef()
+
+  A-2. Deprecated Functions
+  -------------------------
+
+    A-2-1. FileManager
+    ------------------
+
+    For convenience to write MacOS application, ftmac.c
+    provides functions to specify a file by FSSpec and FSRef,
+    because the file identification pathname had ever been
+    unrecommended method in MacOS programming.
+
+    Toward to MacOS X 10.4 & 5, Carbon functions using FSSpec
+    datatype is noticed as deprecated, and recommended to
+    migrate to FSRef datatype. The big differences of FSRef
+    against FSSpec are explained in Apple TechNotes 2078.
+
+    http://developer.apple.com/technotes/tn2002/tn2078.html
+
+    - filename length: the max length of file
+    name of FSRef is 255 chars (it is limit of HFS+),
+    that of FSSpec is 31 chars (it is limit of HFS).
+
+    - filename encoding: FSSpec is localized by
+    legacy encoding for each language system,
+    FSRef is Unicode enabled.
+
+    A-2-2. FontManager
+    ------------------
+
+    Following functions receive QuickDraw fontname:
+
+      FT_GetFile_From_Mac_Name()
+
+    QuickDraw is deprecated and replaced by Quartz
+    since Mac OS X 10.4. They are still kept for
+    backward compatibility. By undefinition of
+    HAVE_QUICKDRAW in building, you can change these
+    functions to return FT_Err_Unimplemented always.
+
+    Replacement functions are added for migration.
+
+      FT_GetFile_From_Mac_ATS_Name()
+
+    They are usable on Mac OS X only. On older systems,
+    these functions return FT_Err_Unimplemented always.
+
+    The detailed incompatibilities and possibility
+    of FontManager emulation without QuickDraw is
+    explained in
+
+      http://www.gyve.org/~mpsuzuki/ats_benchmark.html
+
+  A-3. Framework Availabilities
+  -----------------------------
+
+  The framework of MacOS are often revised, especially
+  when new format of binary executable is introduced.
+  Following table is the minimum version of frameworks
+  to use functions used in FreeType2. The table is
+  extracted from MPW header files for assembly language.
+
+  *** NOTE ***
+  The conditional definition of available data type
+  in MPW compiler is insufficient. You can compile
+  program using FSRef data type for older systems
+  (MacOS 7, 8) that don't know FSRef data type.
+
+
+                                      +-------------------+-----------------------------+
+           CPU                        |      mc680x0      |           PowerPC           |
+                                      +---------+---------+---------+---------+---------+
+  Binary Executable Format            | Classic | 68K-CFM | CFM     | CFM     | Mach-O  |
+                                      +---------+---------+---------+---------+---------+
+       Framework API                  | Toolbox | Toolbox | Toolbox | Carbon  | Carbon  |
+                                      +---------+---------+---------+---------+---------+
+
+                                      +---------+---------+---------+---------+---------+
+                                      |    ?(*) |Interface|Interface|CarbonLib|Mac OS X |
+                                      |         |Lib      |Lib      |         |         |
+* Files.h                             +---------+---------+---------+---------+---------+
+PBGetFCBInfoSync()                    |    o    | 7.1-    | 7.1-    | 1.0-    |    o    |
+FSMakeFSSpec()                        |    o    | 7.1-    | 7.1-    | 1.0-    |    o    |
+FSGetForkCBInfo()                     |    o    |   (**)  | 9.0-    | 1.0-    |    o    |
+FSpMakeFSRef()                        |    o    |   (**)  | 9.0-    | 1.0-    |    o    |
+FSGetCatalogInfo()                    |    o    |   (**)  | 9.0-    | 1.0-    |   -10.3 |
+FSPathMakeRef()                       |    x    |    x    |    x    | 1.1-    |   -10.3 |
+                                      +---------+---------+---------+---------+---------+
+
+                                      +---------+---------+---------+---------+---------+
+                                      |    ?(*) |Font     |Font     |CarbonLib|Mac OS X |
+                                      |         |Manager  |Manager  |         |         |
+* Fonts.h                             +---------+---------+---------+---------+---------+
+FMCreateFontFamilyIterator()          |    x    |    x    | 9.0-    | 1.0-    |   -10.3 |
+FMDisposeFontFamilyIterator()         |    x    |    x    | 9.0-    | 1.0-    |   -10.3 |
+FMGetNextFontFamily()                 |    x    |    x    | 9.0-    | 1.0-    |   -10.3 |
+FMGetFontFamilyName()                 |    x    |    x    | 9.0-    | 1.0-    |   -10.3 |
+FMCreateFontFamilyInstanceIterator()  |    x    |    x    | 9.0-    | 1.0-    |   -10.3 |
+FMDisposeFontFamilyInstanceIterator() |    x    |    x    | 9.0-    | 1.0-    |   -10.3 |
+FMGetNextFontFamilyInstance()         |    x    |    x    | 9.0-    | 1.0-    |   -10.3 |
+                                      +---------+---------+---------+---------+---------+
+
+                                      +---------+---------+---------+---------+---------+
+                                      |    -    |    -    |    -    |CarbonLib|Mac OS X |
+* ATSFont.h (***)                     +---------+---------+---------+---------+---------+
+ATSFontFindFromName()                 |    x    |    x    |    x    |    x    |    o    |
+ATSFontGetFileSpecification()         |    x    |    x    |    x    |    x    |    o    |
+                                      +---------+---------+---------+---------+---------+
+
+    (*)
+    In the "Classic": the original binary executable
+    format, these framework functions are directly
+    transformed to MacOS system call. Therefore, the
+    exact availability should be checked by running
+    system.
+
+    (**)
+    InterfaceLib is bundled to MacOS and its version
+    is usually equal to MacOS. There's no separate
+    update for InterfaceLib. It is supposed that
+    there's no InterfaceLib 9.x for m68k platforms.
+    In fact, these functions are FSRef dependent.
+
+    (***)
+    ATSUI framework is available on ATSUnicode 8.5 on
+    ppc Toolbox CFM, CarbonLib 1.0 too. But its base:
+    ATS font manager is not published in these versions.
+
+------------------------------------------------------------
+Last update: 2009-Jul-25.
+
+Currently maintained by
+       suzuki toshiya, <mpsuzuki@hiroshima-u.ac.jp>
+Originally prepared by
+       Leonard Rosenthol, <leonardr@lazerware.com>
+       Just van Rossum, <just@letterror.com>
+
+This directory is now actively maintained as part of the FreeType Project.
diff --git a/builds/mac/ascii2mpw.py b/builds/mac/ascii2mpw.py
new file mode 100755 (executable)
index 0000000..ad32b21
--- /dev/null
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+import sys
+import string
+
+if len( sys.argv ) == 1 :
+  for asc_line in sys.stdin.readlines():
+    mpw_line = string.replace(asc_line, "\\xA5", "\245")
+    mpw_line = string.replace(mpw_line, "\\xB6", "\266")
+    mpw_line = string.replace(mpw_line, "\\xC4", "\304")
+    mpw_line = string.replace(mpw_line, "\\xC5", "\305")
+    mpw_line = string.replace(mpw_line, "\\xFF", "\377")
+    mpw_line = string.replace(mpw_line, "\n",   "\r")
+    mpw_line = string.replace(mpw_line, "\\n",   "\n")
+    sys.stdout.write(mpw_line)
+elif sys.argv[1] == "-r" :
+  for mpw_line in sys.stdin.readlines():
+    asc_line = string.replace(mpw_line, "\n",   "\\n")
+    asc_line = string.replace(asc_line, "\r",   "\n")
+    asc_line = string.replace(asc_line, "\245", "\\xA5")
+    asc_line = string.replace(asc_line, "\266", "\\xB6")
+    asc_line = string.replace(asc_line, "\304", "\\xC4")
+    asc_line = string.replace(asc_line, "\305", "\\xC5")
+    asc_line = string.replace(asc_line, "\377", "\\xFF")
+    sys.stdout.write(asc_line)
diff --git a/builds/mac/ftlib.prj.xml b/builds/mac/ftlib.prj.xml
new file mode 100644 (file)
index 0000000..cbbc45e
--- /dev/null
@@ -0,0 +1,1194 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<?codewarrior exportversion="1.0.1" ideversion="5.0" ?>
+
+<!DOCTYPE PROJECT [
+<!ELEMENT PROJECT (TARGETLIST, TARGETORDER, GROUPLIST, DESIGNLIST?)>
+<!ELEMENT TARGETLIST (TARGET+)>
+<!ELEMENT TARGET (NAME, SETTINGLIST, FILELIST?, LINKORDER?, SEGMENTLIST?, OVERLAYGROUPLIST?, SUBTARGETLIST?, SUBPROJECTLIST?, FRAMEWORKLIST?, PACKAGEACTIONSLIST?)>
+<!ELEMENT NAME (#PCDATA)>
+<!ELEMENT USERSOURCETREETYPE (#PCDATA)>
+<!ELEMENT PATH (#PCDATA)>
+<!ELEMENT FILELIST (FILE*)>
+<!ELEMENT FILE (PATHTYPE, PATHROOT?, ACCESSPATH?, PATH, PATHFORMAT?, ROOTFILEREF?, FILEKIND?, FILEFLAGS?)>
+<!ELEMENT PATHTYPE (#PCDATA)>
+<!ELEMENT PATHROOT (#PCDATA)>
+<!ELEMENT ACCESSPATH (#PCDATA)>
+<!ELEMENT PATHFORMAT (#PCDATA)>
+<!ELEMENT ROOTFILEREF (PATHTYPE, PATHROOT?, ACCESSPATH?, PATH, PATHFORMAT?)>
+<!ELEMENT FILEKIND (#PCDATA)>
+<!ELEMENT FILEFLAGS (#PCDATA)>
+<!ELEMENT FILEREF (TARGETNAME?, PATHTYPE, PATHROOT?, ACCESSPATH?, PATH, PATHFORMAT?)>
+<!ELEMENT TARGETNAME (#PCDATA)>
+<!ELEMENT SETTINGLIST ((SETTING|PANELDATA)+)>
+<!ELEMENT SETTING (NAME?, (VALUE|(SETTING+)))>
+<!ELEMENT PANELDATA (NAME, VALUE)>
+<!ELEMENT VALUE (#PCDATA)>
+<!ELEMENT LINKORDER (FILEREF*)>
+<!ELEMENT SEGMENTLIST (SEGMENT+)>
+<!ELEMENT SEGMENT (NAME, ATTRIBUTES?, FILEREF*)>
+<!ELEMENT ATTRIBUTES (#PCDATA)>
+<!ELEMENT OVERLAYGROUPLIST (OVERLAYGROUP+)>
+<!ELEMENT OVERLAYGROUP (NAME, BASEADDRESS, OVERLAY*)>
+<!ELEMENT BASEADDRESS (#PCDATA)>
+<!ELEMENT OVERLAY (NAME, FILEREF*)>
+<!ELEMENT SUBTARGETLIST (SUBTARGET+)>
+<!ELEMENT SUBTARGET (TARGETNAME, ATTRIBUTES?, FILEREF?)>
+<!ELEMENT SUBPROJECTLIST (SUBPROJECT+)>
+<!ELEMENT SUBPROJECT (FILEREF, SUBPROJECTTARGETLIST)>
+<!ELEMENT SUBPROJECTTARGETLIST (SUBPROJECTTARGET*)>
+<!ELEMENT SUBPROJECTTARGET (TARGETNAME, ATTRIBUTES?, FILEREF?)>
+<!ELEMENT FRAMEWORKLIST (FRAMEWORK+)>
+<!ELEMENT FRAMEWORK (FILEREF, LIBRARYFILE?, VERSION?)>
+<!ELEMENT PACKAGEACTIONSLIST (PACKAGEACTION+)>
+<!ELEMENT PACKAGEACTION (#PCDATA)>
+<!ELEMENT LIBRARYFILE (FILEREF)>
+<!ELEMENT VERSION (#PCDATA)>
+<!ELEMENT TARGETORDER (ORDEREDTARGET|ORDEREDDESIGN)*>
+<!ELEMENT ORDEREDTARGET (NAME)>
+<!ELEMENT ORDEREDDESIGN (NAME, ORDEREDTARGET+)>
+<!ELEMENT GROUPLIST (GROUP|FILEREF)*>
+<!ELEMENT GROUP (NAME, (GROUP|FILEREF)*)>
+<!ELEMENT DESIGNLIST (DESIGN+)>
+<!ELEMENT DESIGN (NAME, DESIGNDATA)>
+<!ELEMENT DESIGNDATA (#PCDATA)>
+]>
+
+<PROJECT>
+    <TARGETLIST>
+        <TARGET>
+            <NAME>FreeTypeLib</NAME>
+            <SETTINGLIST>
+
+                <!-- Settings for "Source Trees" panel -->
+                <SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Access Paths" panel -->
+                <SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SourceRelativeIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UserSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:::include:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:::src:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>::</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+                <SETTING><NAME>SystemSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Debugger Runtime" panel -->
+                <SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Target Settings" panel -->
+                <SETTING><NAME>Linker</NAME><VALUE>MacOS PPC Linker</VALUE></SETTING>
+                <SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>PostLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>Targetname</NAME><VALUE>FreeTypeLib</VALUE></SETTING>
+                <SETTING><NAME>OutputDirectory</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>:::objs:</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "File Mappings" panel -->
+                <SETTING><NAME>FileMappings</NAME>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>APPL</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>Appl</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>MMLB</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Lib Import PPC</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>MPLF</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Lib Import PPC</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>MWCD</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>RSRC</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.bh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Balloon Help</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.c</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>MW C/C++ PPC</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.c++</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>MW C/C++ PPC</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>MW C/C++ PPC</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>MW C/C++ PPC</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>MW C/C++ PPC</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.exp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.h</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>MW C/C++ PPC</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.p</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>MW Pascal PPC</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.pas</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>MW Pascal PPC</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.pch</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>MW C/C++ PPC</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.pch++</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>MW C/C++ PPC</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ppu</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>MW Pascal PPC</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.r</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Rez</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>Rez</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.s</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>PPCAsm</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>XCOF</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>XCOFF Import PPC</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>docu</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>rsrc</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>shlb</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>PEF Import PPC</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>stub</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>PEF Import PPC</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.doc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.o</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>XCOFF Import PPC</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ppob</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rsrc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Build Extras" panel -->
+                <SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>BrowserGenerator</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>DebuggerAppPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DebuggerWorkingDir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CodeCompletionPrefixFileName</NAME><VALUE>MacHeaders.c</VALUE></SETTING>
+                <SETTING><NAME>CodeCompletionMacroFileName</NAME><VALUE>MacOS_Carbon_C++_Macros.h</VALUE></SETTING>
+
+                <!-- Settings for "Debugger Target" panel -->
+                <SETTING><NAME>ConsoleEncoding</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>LogSystemMessages</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>AutoTargetDLLs</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>StopAtWatchpoints</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>PauseWhileRunning</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>PauseInterval</NAME><VALUE>5</VALUE></SETTING>
+                <SETTING><NAME>PauseUIFlags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>AltExePath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>StopAtTempBPOnLaunch</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>CacheSymbolics</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>TempBPFunctionName</NAME><VALUE>main</VALUE></SETTING>
+                <SETTING><NAME>TempBPType</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Remote Debug" panel -->
+                <SETTING><NAME>Enabled</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>ConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LaunchRemoteApp</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RemoteAppPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CoreID</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>JTAGClockSpeed</NAME><VALUE>8000</VALUE></SETTING>
+                <SETTING><NAME>IsMultiCore</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UseGlobalOSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>OSDownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>AltDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>AltDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Auto-target" panel -->
+                <SETTING><NAME>OtherExecutables</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Analyzer Connections" panel -->
+                <SETTING><NAME>AnalyzerConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Custom Keywords" panel -->
+                <SETTING><NAME>CustomColor1</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor2</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor3</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor4</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "C/C++ Compiler" panel -->
+                <SETTING><NAME>MWFrontEnd_C_cplusplus</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_checkprotos</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_arm</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_trigraphs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_onlystdkeywords</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_enumsalwaysint</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_ansistrict</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_wchar_type</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_enableexceptions</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_dontreusestrings</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_poolstrings</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_dontinline</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_useRTTI</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_unsignedchars</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_autoinline</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_booltruefalse</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_inlinelevel</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_ecplusplus</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_defer_codegen</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_templateparser</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_c99</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_bottomupinline</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_gcc_extensions</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWFrontEnd_C_instance_manager</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "C/C++ Preprocessor" panel -->
+                <SETTING><NAME>C_CPP_Preprocessor_EmitFile</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>C_CPP_Preprocessor_EmitLine</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>C_CPP_Preprocessor_EmitFullPath</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>C_CPP_Preprocessor_KeepComments</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>C_CPP_Preprocessor_PCHUsesPrefixText</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>C_CPP_Preprocessor_EmitPragmas</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>C_CPP_Preprocessor_KeepWhiteSpace</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>C_CPP_Preprocessor_MultiByteEncoding</NAME><VALUE>encASCII_Unicode</VALUE></SETTING>
+                <SETTING><NAME>C_CPP_Preprocessor_PrefixText</NAME><VALUE>/* settings imported from old "C/C++ Language" panel */
+
+#if !__option(precompile)
+#include "ftoption.h" /* was "Prefix file" */
+#endif
+</VALUE></SETTING>
+
+                <!-- Settings for "C/C++ Warnings" panel -->
+                <SETTING><NAME>MWWarning_C_warn_illpragma</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_emptydecl</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_possunwant</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_unusedvar</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_unusedarg</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_extracomma</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_pedantic</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warningerrors</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_hidevirtual</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_implicitconv</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_notinlined</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_structclass</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_missingreturn</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_no_side_effect</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_resultnotused</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_padding</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_impl_i2f_conv</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_impl_f2i_conv</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_impl_s2u_conv</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_illtokenpasting</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_filenamecaps</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_filenamecapssystem</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_undefmacro</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWWarning_C_warn_ptrintconv</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "MacOS Merge Panel" panel -->
+                <SETTING><NAME>MWMerge_MacOS_projectType</NAME><VALUE>Application</VALUE></SETTING>
+                <SETTING><NAME>MWMerge_MacOS_outputName</NAME><VALUE>Merge Out</VALUE></SETTING>
+                <SETTING><NAME>MWMerge_MacOS_outputCreator</NAME><VALUE>????</VALUE></SETTING>
+                <SETTING><NAME>MWMerge_MacOS_outputType</NAME><VALUE>APPL</VALUE></SETTING>
+                <SETTING><NAME>MWMerge_MacOS_suppressWarning</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWMerge_MacOS_copyFragments</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWMerge_MacOS_copyResources</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWMerge_MacOS_flattenResource</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWMerge_MacOS_flatFileName</NAME><VALUE>a.rsrc</VALUE></SETTING>
+                <SETTING><NAME>MWMerge_MacOS_flatFileOutputPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWMerge_MacOS_skipResources</NAME>
+                    <SETTING><VALUE>DLGX</VALUE></SETTING>
+                    <SETTING><VALUE>ckid</VALUE></SETTING>
+                    <SETTING><VALUE>Proj</VALUE></SETTING>
+                    <SETTING><VALUE>WSPC</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Output Flags" panel -->
+                <SETTING><NAME>FileLocked</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>ResourcesMapIsReadOnly</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>PrinterDriverIsMultiFinderCompatible</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Invisible</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>HasBundle</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>NameLocked</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Stationery</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>HasCustomIcon</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Shared</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>HasBeenInited</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Label</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>Comments</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>HasCustomBadge</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>HasRoutingInfo</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "PPC CodeGen" panel -->
+                <SETTING><NAME>MWCodeGen_PPC_structalignment</NAME><VALUE>PPC_mw</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_tracebacktables</NAME><VALUE>None</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_function_align</NAME><VALUE>4</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_tocdata</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_largetoc</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_profiler</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_vectortocdata</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_poolconst</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_peephole</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_readonlystrings</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_linkerpoolsstrings</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_volatileasm</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_schedule</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_altivec</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_altivec_move_block</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_strictIEEEfp</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_fpcontract</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_genfsel</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_PPC_orderedfpcmp</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "PPC CodeGen Mach-O" panel -->
+                <SETTING><NAME>MWCodeGen_MachO_structalignment</NAME><VALUE>PPC_mw</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_MachO_profiler_enum</NAME><VALUE>Off</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_MachO_processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_MachO_function_align</NAME><VALUE>4</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_MachO_common</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_MachO_boolisint</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_MachO_peephole</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_MachO_readonlystrings</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_MachO_linkerpoolsstrings</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_MachO_volatileasm</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_MachO_schedule</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_MachO_altivec</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_MachO_vecmove</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_MachO_fp_ieee_strict</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_MachO_fpcontract</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_MachO_genfsel</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWCodeGen_MachO_fp_cmps_ordered</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "PPC Disassembler" panel -->
+                <SETTING><NAME>MWDisassembler_PPC_showcode</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWDisassembler_PPC_extended</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWDisassembler_PPC_mix</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWDisassembler_PPC_nohex</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWDisassembler_PPC_showdata</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWDisassembler_PPC_showexceptions</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWDisassembler_PPC_showsym</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWDisassembler_PPC_shownames</NAME><VALUE>1</VALUE></SETTING>
+
+                <!-- Settings for "PPC Global Optimizer" panel -->
+                <SETTING><NAME>GlobalOptimizer_PPC_optimizationlevel</NAME><VALUE>Level0</VALUE></SETTING>
+                <SETTING><NAME>GlobalOptimizer_PPC_optfor</NAME><VALUE>Speed</VALUE></SETTING>
+
+                <!-- Settings for "PPC Linker" panel -->
+                <SETTING><NAME>MWLinker_PPC_linksym</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_PPC_symfullpath</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_PPC_linkmap</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_PPC_nolinkwarnings</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_PPC_dontdeadstripinitcode</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_PPC_permitmultdefs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_PPC_linkmode</NAME><VALUE>Fast</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_PPC_code_folding</NAME><VALUE>None</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_PPC_initname</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWLinker_PPC_mainname</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWLinker_PPC_termname</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "PPC Mac OS X Linker" panel -->
+                <SETTING><NAME>MWLinker_MacOSX_linksym</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_MacOSX_symfullpath</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_MacOSX_nolinkwarnings</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_MacOSX_linkmap</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_MacOSX_dontdeadstripinitcode</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_MacOSX_permitmultdefs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_MacOSX_use_objectivec_semantics</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_MacOSX_strip_debug_symbols</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_MacOSX_split_segs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_MacOSX_report_msl_overloads</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_MacOSX_objects_follow_linkorder</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_MacOSX_linkmode</NAME><VALUE>Normal</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_MacOSX_exports</NAME><VALUE>ReferencedGlobals</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_MacOSX_sortcode</NAME><VALUE>None</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_MacOSX_mainname</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWLinker_MacOSX_initname</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWLinker_MacOSX_code_folding</NAME><VALUE>None</VALUE></SETTING>
+                <SETTING><NAME>MWLinker_MacOSX_stabsgen</NAME><VALUE>None</VALUE></SETTING>
+
+                <!-- Settings for "PPC Mac OS X Project" panel -->
+                <SETTING><NAME>MWProject_MacOSX_type</NAME><VALUE>Executable</VALUE></SETTING>
+                <SETTING><NAME>MWProject_MacOSX_outfile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWProject_MacOSX_filecreator</NAME><VALUE>????</VALUE></SETTING>
+                <SETTING><NAME>MWProject_MacOSX_filetype</NAME><VALUE>MEXE</VALUE></SETTING>
+                <SETTING><NAME>MWProject_MacOSX_vmaddress</NAME><VALUE>4096</VALUE></SETTING>
+                <SETTING><NAME>MWProject_MacOSX_usedefaultvmaddr</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWProject_MacOSX_flatrsrc</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWProject_MacOSX_flatrsrcfilename</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWProject_MacOSX_flatrsrcoutputdir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWProject_MacOSX_installpath</NAME><VALUE>./</VALUE></SETTING>
+                <SETTING><NAME>MWProject_MacOSX_dont_prebind</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWProject_MacOSX_flat_namespace</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWProject_MacOSX_frameworkversion</NAME><VALUE>A</VALUE></SETTING>
+                <SETTING><NAME>MWProject_MacOSX_currentversion</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWProject_MacOSX_flat_oldimpversion</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWProject_MacOSX_AddrMode</NAME><VALUE>1</VALUE></SETTING>
+
+                <!-- Settings for "PPC PEF" panel -->
+                <SETTING><NAME>MWPEF_exports</NAME><VALUE>None</VALUE></SETTING>
+                <SETTING><NAME>MWPEF_libfolder</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWPEF_sortcode</NAME><VALUE>None</VALUE></SETTING>
+                <SETTING><NAME>MWPEF_expandbss</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWPEF_sharedata</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWPEF_olddefversion</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWPEF_oldimpversion</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWPEF_currentversion</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWPEF_fragmentname</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWPEF_collapsereloads</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "PPC Project" panel -->
+                <SETTING><NAME>MWProject_PPC_type</NAME><VALUE>Library</VALUE></SETTING>
+                <SETTING><NAME>MWProject_PPC_outfile</NAME><VALUE>FreeTypeLib</VALUE></SETTING>
+                <SETTING><NAME>MWProject_PPC_filecreator</NAME><VALUE>????</VALUE></SETTING>
+                <SETTING><NAME>MWProject_PPC_filetype</NAME><VALUE>????</VALUE></SETTING>
+                <SETTING><NAME>MWProject_PPC_size</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWProject_PPC_minsize</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWProject_PPC_stacksize</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWProject_PPC_flags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWProject_PPC_symfilename</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWProject_PPC_rsrcname</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWProject_PPC_rsrcheader</NAME><VALUE>Native</VALUE></SETTING>
+                <SETTING><NAME>MWProject_PPC_rsrctype</NAME><VALUE>????</VALUE></SETTING>
+                <SETTING><NAME>MWProject_PPC_rsrcid</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWProject_PPC_rsrcflags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWProject_PPC_rsrcstore</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWProject_PPC_rsrcmerge</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWProject_PPC_flatrsrc</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWProject_PPC_flatrsrcoutputdir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWProject_PPC_flatrsrcfilename</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "PPCAsm Panel" panel -->
+                <SETTING><NAME>MWAssembler_PPC_auxheader</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWAssembler_PPC_symmode</NAME><VALUE>Mac</VALUE></SETTING>
+                <SETTING><NAME>MWAssembler_PPC_dialect</NAME><VALUE>PPC</VALUE></SETTING>
+                <SETTING><NAME>MWAssembler_PPC_prefixfile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWAssembler_PPC_typecheck</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWAssembler_PPC_warnings</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWAssembler_PPC_casesensitive</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Property List" panel -->
+                <SETTING><NAME>PList_OutputType</NAME><VALUE>File</VALUE></SETTING>
+                <SETTING><NAME>PList_OutputEncoding</NAME><VALUE>UTF-8</VALUE></SETTING>
+                <SETTING><NAME>PList_PListVersion</NAME><VALUE>1.0</VALUE></SETTING>
+                <SETTING><NAME>PList_Prefix</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>PList_FileFilename</NAME><VALUE>Info.plist</VALUE></SETTING>
+                <SETTING><NAME>PList_FileDirectory</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>MacOS</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>PList_ResourceType</NAME><VALUE>plst</VALUE></SETTING>
+                <SETTING><NAME>PList_ResourceID</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>PList_ResourceName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Rez Compiler" panel -->
+                <SETTING><NAME>MWRez_Language_maxwidth</NAME><VALUE>80</VALUE></SETTING>
+                <SETTING><NAME>MWRez_Language_script</NAME><VALUE>Roman</VALUE></SETTING>
+                <SETTING><NAME>MWRez_Language_alignment</NAME><VALUE>Align1</VALUE></SETTING>
+                <SETTING><NAME>MWRez_Language_filtermode</NAME><VALUE>FilterSkip</VALUE></SETTING>
+                <SETTING><NAME>MWRez_Language_suppresswarnings</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>MWRez_Language_escapecontrolchars</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>MWRez_Language_prefixname</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRez_Language_filteredtypes</NAME><VALUE>'CODE' 'DATA' 'PICT'</VALUE></SETTING>
+            </SETTINGLIST>
+            <FILELIST>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>ftsystem.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS>Debug</FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>ftbase.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS>Debug</FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>ftinit.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS>Debug</FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>sfnt.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS>Debug</FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>psnames.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS>Debug</FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>ftdebug.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS>Debug</FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>type1cid.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS>Debug</FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>cff.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS>Debug</FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>smooth.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS>Debug</FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>winfnt.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS>Debug</FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>truetype.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS>Debug</FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>ftmac.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS>Debug</FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>psaux.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS></FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>ftcache.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS></FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>ftglyph.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS></FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>type1.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS>Debug</FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>pshinter.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS>Debug</FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>pcf.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS>Debug</FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>ftraster.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS>Debug</FILEFLAGS>
+                </FILE>
+                <FILE>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>ftrend1.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                    <FILEKIND>Text</FILEKIND>
+                    <FILEFLAGS>Debug</FILEFLAGS>
+                </FILE>
+            </FILELIST>
+            <LINKORDER>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>ftsystem.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>ftbase.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>ftinit.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>sfnt.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>psnames.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>ftdebug.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>type1cid.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>cff.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>smooth.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>winfnt.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>truetype.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>ftmac.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>psaux.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>ftcache.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>ftglyph.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>type1.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>pshinter.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>pcf.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>ftraster.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+                <FILEREF>
+                    <PATHTYPE>Name</PATHTYPE>
+                    <PATH>ftrend1.c</PATH>
+                    <PATHFORMAT>MacOS</PATHFORMAT>
+                </FILEREF>
+            </LINKORDER>
+        </TARGET>
+    </TARGETLIST>
+
+    <TARGETORDER>
+        <ORDEREDTARGET><NAME>FreeTypeLib</NAME></ORDEREDTARGET>
+    </TARGETORDER>
+
+    <GROUPLIST>
+        <GROUP><NAME>base</NAME>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>ftbase.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>ftdebug.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>ftglyph.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>ftinit.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>ftsystem.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>ftmac.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+        </GROUP>
+        <GROUP><NAME>ftmodules</NAME>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>cff.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>ftcache.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>psaux.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>psnames.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>sfnt.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>smooth.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>truetype.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>type1cid.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>winfnt.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>type1.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>pshinter.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>pcf.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>ftraster.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+            <FILEREF>
+                <TARGETNAME>FreeTypeLib</TARGETNAME>
+                <PATHTYPE>Name</PATHTYPE>
+                <PATH>ftrend1.c</PATH>
+                <PATHFORMAT>MacOS</PATHFORMAT>
+            </FILEREF>
+        </GROUP>
+    </GROUPLIST>
+
+</PROJECT>
diff --git a/builds/mac/ftmac.c b/builds/mac/ftmac.c
new file mode 100644 (file)
index 0000000..719dd0c
--- /dev/null
@@ -0,0 +1,1534 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmac.c                                                                */
+/*                                                                         */
+/*    Mac FOND support.  Written by just@letterror.com.                    */
+/*  Heavily Fixed by mpsuzuki, George Williams and Sean McBride            */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by       */
+/*  Just van Rossum, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*
+    Notes
+
+    Mac suitcase files can (and often do!) contain multiple fonts.  To
+    support this I use the face_index argument of FT_(Open|New)_Face()
+    functions, and pretend the suitcase file is a collection.
+
+    Warning: fbit and NFNT bitmap resources are not supported yet.  In old
+    sfnt fonts, bitmap glyph data for each size is stored in each `NFNT'
+    resources instead of the `bdat' table in the sfnt resource.  Therefore,
+    face->num_fixed_sizes is set to 0, because bitmap data in `NFNT'
+    resource is unavailable at present.
+
+    The Mac FOND support works roughly like this:
+
+    - Check whether the offered stream points to a Mac suitcase file.  This
+      is done by checking the file type: it has to be 'FFIL' or 'tfil'.  The
+      stream that gets passed to our init_face() routine is a stdio stream,
+      which isn't usable for us, since the FOND resources live in the
+      resource fork.  So we just grab the stream->pathname field.
+
+    - Read the FOND resource into memory, then check whether there is a
+      TrueType font and/or(!) a Type 1 font available.
+
+    - If there is a Type 1 font available (as a separate `LWFN' file), read
+      its data into memory, massage it slightly so it becomes PFB data, wrap
+      it into a memory stream, load the Type 1 driver and delegate the rest
+      of the work to it by calling FT_Open_Face().  (XXX TODO: after this
+      has been done, the kerning data from the FOND resource should be
+      appended to the face: On the Mac there are usually no AFM files
+      available.  However, this is tricky since we need to map Mac char
+      codes to ps glyph names to glyph ID's...)
+
+    - If there is a TrueType font (an `sfnt' resource), read it into memory,
+      wrap it into a memory stream, load the TrueType driver and delegate
+      the rest of the work to it, by calling FT_Open_Face().
+
+    - Some suitcase fonts (notably Onyx) might point the `LWFN' file to
+      itself, even though it doesn't contains `POST' resources.  To handle
+      this special case without opening the file an extra time, we just
+      ignore errors from the `LWFN' and fallback to the `sfnt' if both are
+      available.
+  */
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_TRUETYPE_TAGS_H
+#include FT_INTERNAL_STREAM_H
+#include "ftbase.h"
+
+#if defined( __GNUC__ ) || defined( __IBMC__ )
+  /* This is for Mac OS X.  Without redefinition, OS_INLINE */
+  /* expands to `static inline' which doesn't survive the   */
+  /* -ansi compilation flag of GCC.                         */
+#if !HAVE_ANSI_OS_INLINE
+#undef  OS_INLINE
+#define OS_INLINE   static __inline__
+#endif
+#include <CoreServices/CoreServices.h>
+#include <ApplicationServices/ApplicationServices.h>
+#include <sys/syslimits.h> /* PATH_MAX */
+#else
+#include <Resources.h>
+#include <Fonts.h>
+#include <Endian.h>
+#include <Errors.h>
+#include <Files.h>
+#include <TextUtils.h>
+#endif
+
+#ifndef PATH_MAX
+#define PATH_MAX 1024 /* same with Mac OS X's syslimits.h */
+#endif
+
+#if defined( __MWERKS__ ) && !TARGET_RT_MAC_MACHO
+#include <FSp_fopen.h>
+#endif
+
+#define FT_DEPRECATED_ATTRIBUTE
+
+#include FT_MAC_H
+
+  /* undefine blocking-macros in ftmac.h */
+#undef FT_GetFile_From_Mac_Name
+#undef FT_GetFile_From_Mac_ATS_Name
+#undef FT_New_Face_From_FOND
+#undef FT_New_Face_From_FSSpec
+#undef FT_New_Face_From_FSRef
+
+
+  /* FSSpec functions are deprecated since Mac OS X 10.4 */
+#ifndef HAVE_FSSPEC
+#if TARGET_API_MAC_OS8 || TARGET_API_MAC_CARBON
+#define HAVE_FSSPEC  1
+#else
+#define HAVE_FSSPEC  0
+#endif
+#endif
+
+  /* most FSRef functions were introduced since Mac OS 9 */
+#ifndef HAVE_FSREF
+#if TARGET_API_MAC_OSX
+#define HAVE_FSREF  1
+#else
+#define HAVE_FSREF  0
+#endif
+#endif
+
+  /* QuickDraw is deprecated since Mac OS X 10.4 */
+#ifndef HAVE_QUICKDRAW_CARBON
+#if TARGET_API_MAC_OS8 || TARGET_API_MAC_CARBON
+#define HAVE_QUICKDRAW_CARBON  1
+#else
+#define HAVE_QUICKDRAW_CARBON  0
+#endif
+#endif
+
+  /* AppleTypeService is available since Mac OS X */
+#ifndef HAVE_ATS
+#if TARGET_API_MAC_OSX
+#define HAVE_ATS  1
+#ifndef kATSOptionFlagsUnRestrictedScope /* since Mac OS X 10.1 */
+#define kATSOptionFlagsUnRestrictedScope kATSOptionFlagsDefault
+#endif
+#else
+#define HAVE_ATS  0
+#endif
+#endif
+
+  /* `configure' checks the availability of `ResourceIndex' strictly */
+  /* and sets HAVE_TYPE_RESOURCE_INDEX to 1 or 0 always.  If it is   */
+  /* not set (e.g., a build without `configure'), the availability   */
+  /* is guessed from the SDK version.                                */
+#ifndef HAVE_TYPE_RESOURCE_INDEX
+#if !defined( MAC_OS_X_VERSION_10_5 ) || \
+    ( MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 )
+#define HAVE_TYPE_RESOURCE_INDEX 0
+#else
+#define HAVE_TYPE_RESOURCE_INDEX 1
+#endif
+#endif /* !HAVE_TYPE_RESOURCE_INDEX */
+
+#if ( HAVE_TYPE_RESOURCE_INDEX == 0 )
+typedef short ResourceIndex;
+#endif
+
+  /* Set PREFER_LWFN to 1 if LWFN (Type 1) is preferred over
+     TrueType in case *both* are available (this is not common,
+     but it *is* possible). */
+#ifndef PREFER_LWFN
+#define PREFER_LWFN  1
+#endif
+
+#ifdef FT_MACINTOSH
+
+#if !HAVE_QUICKDRAW_CARBON  /* QuickDraw is deprecated since Mac OS X 10.4 */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_GetFile_From_Mac_Name( const char*  fontName,
+                            FSSpec*      pathSpec,
+                            FT_Long*     face_index )
+  {
+    FT_UNUSED( fontName );
+    FT_UNUSED( pathSpec );
+    FT_UNUSED( face_index );
+
+    return FT_Err_Unimplemented_Feature;
+  }
+
+#else
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_GetFile_From_Mac_Name( const char*  fontName,
+                            FSSpec*      pathSpec,
+                            FT_Long*     face_index )
+  {
+    OptionBits            options = kFMUseGlobalScopeOption;
+
+    FMFontFamilyIterator  famIter;
+    OSStatus              status = FMCreateFontFamilyIterator( NULL, NULL,
+                                                               options,
+                                                               &famIter );
+    FMFont                the_font = 0;
+    FMFontFamily          family   = 0;
+
+
+    *face_index = 0;
+    while ( status == 0 && !the_font )
+    {
+      status = FMGetNextFontFamily( &famIter, &family );
+      if ( status == 0 )
+      {
+        int                           stat2;
+        FMFontFamilyInstanceIterator  instIter;
+        Str255                        famNameStr;
+        char                          famName[256];
+
+
+        /* get the family name */
+        FMGetFontFamilyName( family, famNameStr );
+        CopyPascalStringToC( famNameStr, famName );
+
+        /* iterate through the styles */
+        FMCreateFontFamilyInstanceIterator( family, &instIter );
+
+        *face_index = 0;
+        stat2       = 0;
+
+        while ( stat2 == 0 && !the_font )
+        {
+          FMFontStyle  style;
+          FMFontSize   size;
+          FMFont       font;
+
+
+          stat2 = FMGetNextFontFamilyInstance( &instIter, &font,
+                                               &style, &size );
+          if ( stat2 == 0 && size == 0 )
+          {
+            char  fullName[256];
+
+
+            /* build up a complete face name */
+            ft_strcpy( fullName, famName );
+            if ( style & bold )
+              ft_strcat( fullName, " Bold" );
+            if ( style & italic )
+              ft_strcat( fullName, " Italic" );
+
+            /* compare with the name we are looking for */
+            if ( ft_strcmp( fullName, fontName ) == 0 )
+            {
+              /* found it! */
+              the_font = font;
+            }
+            else
+              ++(*face_index);
+          }
+        }
+
+        FMDisposeFontFamilyInstanceIterator( &instIter );
+      }
+    }
+
+    FMDisposeFontFamilyIterator( &famIter );
+
+    if ( the_font )
+    {
+      FMGetFontContainer( the_font, pathSpec );
+      return FT_Err_Ok;
+    }
+    else
+      return FT_Err_Unknown_File_Format;
+  }
+
+#endif /* HAVE_QUICKDRAW_CARBON */
+
+
+#if HAVE_ATS
+
+  /* Private function.                                         */
+  /* The FSSpec type has been discouraged for a long time,     */
+  /* unfortunately an FSRef replacement API for                */
+  /* ATSFontGetFileSpecification() is only available in        */
+  /* Mac OS X 10.5 and later.                                  */
+  static OSStatus
+  FT_ATSFontGetFileReference( ATSFontRef  ats_font_id,
+                              FSRef*      ats_font_ref )
+  {
+    OSStatus  err;
+
+#if !defined( MAC_OS_X_VERSION_10_5 ) || \
+    MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5
+    FSSpec    spec;
+
+
+    err = ATSFontGetFileSpecification( ats_font_id, &spec );
+    if ( noErr == err )
+      err = FSpMakeFSRef( &spec, ats_font_ref );
+#else
+    err = ATSFontGetFileReference( ats_font_id, ats_font_ref );
+#endif
+
+    return err;
+  }
+
+
+  static FT_Error
+  FT_GetFileRef_From_Mac_ATS_Name( const char*  fontName,
+                                   FSRef*       ats_font_ref,
+                                   FT_Long*     face_index )
+  {
+    CFStringRef  cf_fontName;
+    ATSFontRef   ats_font_id;
+
+
+    *face_index = 0;
+
+    cf_fontName = CFStringCreateWithCString( NULL, fontName,
+                                             kCFStringEncodingMacRoman );
+    ats_font_id = ATSFontFindFromName( cf_fontName,
+                                       kATSOptionFlagsUnRestrictedScope );
+    CFRelease( cf_fontName );
+
+    if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL )
+      return FT_Err_Unknown_File_Format;
+
+    if ( noErr != FT_ATSFontGetFileReference( ats_font_id, ats_font_ref ) )
+      return FT_Err_Unknown_File_Format;
+
+    /* face_index calculation by searching preceding fontIDs */
+    /* with same FSRef                                       */
+    {
+      ATSFontRef  id2 = ats_font_id - 1;
+      FSRef       ref2;
+
+
+      while ( id2 > 0 )
+      {
+        if ( noErr != FT_ATSFontGetFileReference( id2, &ref2 ) )
+          break;
+        if ( noErr != FSCompareFSRefs( ats_font_ref, &ref2 ) )
+          break;
+
+        id2--;
+      }
+      *face_index = ats_font_id - ( id2 + 1 );
+    }
+
+    return FT_Err_Ok;
+  }
+
+#endif
+
+#if !HAVE_ATS
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_GetFilePath_From_Mac_ATS_Name( const char*  fontName,
+                                    UInt8*       path,
+                                    UInt32       maxPathSize,
+                                    FT_Long*     face_index )
+  {
+    FT_UNUSED( fontName );
+    FT_UNUSED( path );
+    FT_UNUSED( maxPathSize );
+    FT_UNUSED( face_index );
+
+    return FT_Err_Unimplemented_Feature;
+  }
+
+#else
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_GetFilePath_From_Mac_ATS_Name( const char*  fontName,
+                                    UInt8*       path,
+                                    UInt32       maxPathSize,
+                                    FT_Long*     face_index )
+  {
+    FSRef     ref;
+    FT_Error  err;
+
+
+    err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index );
+    if ( FT_Err_Ok != err )
+      return err;
+
+    if ( noErr != FSRefMakePath( &ref, path, maxPathSize ) )
+      return FT_Err_Unknown_File_Format;
+
+    return FT_Err_Ok;
+  }
+
+#endif /* HAVE_ATS */
+
+
+#if !HAVE_FSSPEC || !HAVE_ATS
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_GetFile_From_Mac_ATS_Name( const char*  fontName,
+                                FSSpec*      pathSpec,
+                                FT_Long*     face_index )
+  {
+    FT_UNUSED( fontName );
+    FT_UNUSED( pathSpec );
+    FT_UNUSED( face_index );
+
+    return FT_Err_Unimplemented_Feature;
+  }
+
+#else
+
+  /* This function is deprecated because FSSpec is deprecated in Mac OS X. */
+  FT_EXPORT_DEF( FT_Error )
+  FT_GetFile_From_Mac_ATS_Name( const char*  fontName,
+                                FSSpec*      pathSpec,
+                                FT_Long*     face_index )
+  {
+    FSRef     ref;
+    FT_Error  err;
+
+
+    err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index );
+    if ( FT_Err_Ok != err )
+      return err;
+
+    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, NULL, NULL,
+                                    pathSpec, NULL ) )
+      return FT_Err_Unknown_File_Format;
+
+    return FT_Err_Ok;
+  }
+
+#endif
+
+
+#if defined( __MWERKS__ ) && !TARGET_RT_MAC_MACHO
+
+#define STREAM_FILE( stream )  ( (FT_FILE*)stream->descriptor.pointer )
+
+
+  FT_CALLBACK_DEF( void )
+  ft_FSp_stream_close( FT_Stream  stream )
+  {
+    ft_fclose( STREAM_FILE( stream ) );
+
+    stream->descriptor.pointer = NULL;
+    stream->size               = 0;
+    stream->base               = 0;
+  }
+
+
+  FT_CALLBACK_DEF( unsigned long )
+  ft_FSp_stream_io( FT_Stream       stream,
+                    unsigned long   offset,
+                    unsigned char*  buffer,
+                    unsigned long   count )
+  {
+    FT_FILE*  file;
+
+
+    file = STREAM_FILE( stream );
+
+    ft_fseek( file, offset, SEEK_SET );
+
+    return (unsigned long)ft_fread( buffer, 1, count, file );
+  }
+
+#endif  /* __MWERKS__ && !TARGET_RT_MAC_MACHO */
+
+
+#if HAVE_FSSPEC && !HAVE_FSREF
+
+  /* isDirectory is a dummy to synchronize API with FSPathMakeRef() */
+  static OSErr
+  FT_FSPathMakeSpec( const UInt8*  pathname,
+                     FSSpec*       spec_p,
+                     Boolean       isDirectory )
+  {
+    const char  *p, *q;
+    short       vRefNum;
+    long        dirID;
+    Str255      nodeName;
+    OSErr       err;
+    FT_UNUSED( isDirectory );
+
+
+    p = q = (const char *)pathname;
+    dirID   = 0;
+    vRefNum = 0;
+
+    while ( 1 )
+    {
+      int  len = ft_strlen( p );
+
+
+      if ( len > 255 )
+        len = 255;
+
+      q = p + len;
+
+      if ( q == p )
+        return 0;
+
+      if ( 255 < ft_strlen( (char *)pathname ) )
+      {
+        while ( p < q && *q != ':' )
+          q--;
+      }
+
+      if ( p < q )
+        *(char *)nodeName = q - p;
+      else if ( ft_strlen( p ) < 256 )
+        *(char *)nodeName = ft_strlen( p );
+      else
+        return errFSNameTooLong;
+
+      ft_strncpy( (char *)nodeName + 1, (char *)p, *(char *)nodeName );
+      err = FSMakeFSSpec( vRefNum, dirID, nodeName, spec_p );
+      if ( err || '\0' == *q )
+        return err;
+
+      vRefNum = spec_p->vRefNum;
+      dirID   = spec_p->parID;
+
+      p = q;
+    }
+  }
+
+
+  static OSErr
+  FT_FSpMakePath( const FSSpec*  spec_p,
+                  UInt8*         path,
+                  UInt32         maxPathSize )
+  {
+    OSErr   err;
+    FSSpec  spec = *spec_p;
+    short   vRefNum;
+    long    dirID;
+    Str255  parDir_name;
+
+
+    FT_MEM_SET( path, 0, maxPathSize );
+    while ( 1 )
+    {
+      int             child_namelen = ft_strlen( (char *)path );
+      unsigned char   node_namelen  = spec.name[0];
+      unsigned char*  node_name     = spec.name + 1;
+
+
+      if ( node_namelen + child_namelen > maxPathSize )
+        return errFSNameTooLong;
+
+      FT_MEM_MOVE( path + node_namelen + 1, path, child_namelen );
+      FT_MEM_COPY( path, node_name, node_namelen );
+      if ( child_namelen > 0 )
+        path[node_namelen] = ':';
+
+      vRefNum        = spec.vRefNum;
+      dirID          = spec.parID;
+      parDir_name[0] = '\0';
+      err = FSMakeFSSpec( vRefNum, dirID, parDir_name, &spec );
+      if ( noErr != err || dirID == spec.parID )
+        break;
+    }
+    return noErr;
+  }
+
+#endif /* HAVE_FSSPEC && !HAVE_FSREF */
+
+
+  static OSErr
+  FT_FSPathMakeRes( const UInt8*    pathname,
+                    ResFileRefNum*  res )
+  {
+
+#if HAVE_FSREF
+
+    OSErr  err;
+    FSRef  ref;
+
+
+    if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) )
+      return FT_Err_Cannot_Open_Resource;
+
+    /* at present, no support for dfont format */
+    err = FSOpenResourceFile( &ref, 0, NULL, fsRdPerm, res );
+    if ( noErr == err )
+      return err;
+
+    /* fallback to original resource-fork font */
+    *res = FSOpenResFile( &ref, fsRdPerm );
+    err  = ResError();
+
+#else
+
+    OSErr   err;
+    FSSpec  spec;
+
+
+    if ( noErr != FT_FSPathMakeSpec( pathname, &spec, FALSE ) )
+      return FT_Err_Cannot_Open_Resource;
+
+    /* at present, no support for dfont format without FSRef */
+    /* (see above), try original resource-fork font          */
+    *res = FSpOpenResFile( &spec, fsRdPerm );
+    err  = ResError();
+
+#endif /* HAVE_FSREF */
+
+    return err;
+  }
+
+
+  /* Return the file type for given pathname */
+  static OSType
+  get_file_type_from_path( const UInt8*  pathname )
+  {
+
+#if HAVE_FSREF
+
+    FSRef          ref;
+    FSCatalogInfo  info;
+
+
+    if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) )
+      return ( OSType ) 0;
+
+    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoFinderInfo, &info,
+                                    NULL, NULL, NULL ) )
+      return ( OSType ) 0;
+
+    return ((FInfo *)(info.finderInfo))->fdType;
+
+#else
+
+    FSSpec  spec;
+    FInfo   finfo;
+
+
+    if ( noErr != FT_FSPathMakeSpec( pathname, &spec, FALSE ) )
+      return ( OSType ) 0;
+
+    if ( noErr != FSpGetFInfo( &spec, &finfo ) )
+      return ( OSType ) 0;
+
+    return finfo.fdType;
+
+#endif /* HAVE_FSREF */
+
+  }
+
+
+  /* Given a PostScript font name, create the Macintosh LWFN file name. */
+  static void
+  create_lwfn_name( char*   ps_name,
+                    Str255  lwfn_file_name )
+  {
+    int       max = 5, count = 0;
+    FT_Byte*  p = lwfn_file_name;
+    FT_Byte*  q = (FT_Byte*)ps_name;
+
+
+    lwfn_file_name[0] = 0;
+
+    while ( *q )
+    {
+      if ( ft_isupper( *q ) )
+      {
+        if ( count )
+          max = 3;
+        count = 0;
+      }
+      if ( count < max && ( ft_isalnum( *q ) || *q == '_' ) )
+      {
+        *++p = *q;
+        lwfn_file_name[0]++;
+        count++;
+      }
+      q++;
+    }
+  }
+
+
+  static short
+  count_faces_sfnt( char*  fond_data )
+  {
+    /* The count is 1 greater than the value in the FOND.  */
+    /* Isn't that cute? :-)                                */
+
+    return EndianS16_BtoN( *( (short*)( fond_data +
+                                        sizeof ( FamRec ) ) ) ) + 1;
+  }
+
+
+  static short
+  count_faces_scalable( char*  fond_data )
+  {
+    AsscEntry*  assoc;
+    FamRec*     fond;
+    short       i, face, face_all;
+
+
+    fond     = (FamRec*)fond_data;
+    face_all = EndianS16_BtoN( *( (short *)( fond_data +
+                                             sizeof ( FamRec ) ) ) ) + 1;
+    assoc    = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 );
+    face     = 0;
+
+    for ( i = 0; i < face_all; i++ )
+    {
+      if ( 0 == EndianS16_BtoN( assoc[i].fontSize ) )
+        face++;
+    }
+    return face;
+  }
+
+
+  /* Look inside the FOND data, answer whether there should be an SFNT
+     resource, and answer the name of a possible LWFN Type 1 file.
+
+     Thanks to Paul Miller (paulm@profoundeffects.com) for the fix
+     to load a face OTHER than the first one in the FOND!
+  */
+
+  static void
+  parse_fond( char*   fond_data,
+              short*  have_sfnt,
+              ResID*  sfnt_id,
+              Str255  lwfn_file_name,
+              short   face_index )
+  {
+    AsscEntry*  assoc;
+    AsscEntry*  base_assoc;
+    FamRec*     fond;
+
+
+    *sfnt_id          = 0;
+    *have_sfnt        = 0;
+    lwfn_file_name[0] = 0;
+
+    fond       = (FamRec*)fond_data;
+    assoc      = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 );
+    base_assoc = assoc;
+
+    /* the maximum faces in a FOND is 48, size of StyleTable.indexes[] */
+    if ( 47 < face_index )
+      return;
+
+    /* Let's do a little range checking before we get too excited here */
+    if ( face_index < count_faces_sfnt( fond_data ) )
+    {
+      assoc += face_index;        /* add on the face_index! */
+
+      /* if the face at this index is not scalable,
+         fall back to the first one (old behavior) */
+      if ( EndianS16_BtoN( assoc->fontSize ) == 0 )
+      {
+        *have_sfnt = 1;
+        *sfnt_id   = EndianS16_BtoN( assoc->fontID );
+      }
+      else if ( base_assoc->fontSize == 0 )
+      {
+        *have_sfnt = 1;
+        *sfnt_id   = EndianS16_BtoN( base_assoc->fontID );
+      }
+    }
+
+    if ( EndianS32_BtoN( fond->ffStylOff ) )
+    {
+      unsigned char*  p = (unsigned char*)fond_data;
+      StyleTable*     style;
+      unsigned short  string_count;
+      char            ps_name[256];
+      unsigned char*  names[64];
+      int             i;
+
+
+      p += EndianS32_BtoN( fond->ffStylOff );
+      style = (StyleTable*)p;
+      p += sizeof ( StyleTable );
+      string_count = EndianS16_BtoN( *(short*)(p) );
+      p += sizeof ( short );
+
+      for ( i = 0; i < string_count && i < 64; i++ )
+      {
+        names[i] = p;
+        p       += names[i][0];
+        p++;
+      }
+
+      {
+        size_t  ps_name_len = (size_t)names[0][0];
+
+
+        if ( ps_name_len != 0 )
+        {
+          ft_memcpy(ps_name, names[0] + 1, ps_name_len);
+          ps_name[ps_name_len] = 0;
+        }
+        if ( style->indexes[face_index] > 1 &&
+             style->indexes[face_index] <= FT_MIN( string_count, 64 ) )
+        {
+          unsigned char*  suffixes = names[style->indexes[face_index] - 1];
+
+
+          for ( i = 1; i <= suffixes[0]; i++ )
+          {
+            unsigned char*  s;
+            size_t          j = suffixes[i] - 1;
+
+
+            if ( j < string_count && ( s = names[j] ) != NULL )
+            {
+              size_t  s_len = (size_t)s[0];
+
+
+              if ( s_len != 0 && ps_name_len + s_len < sizeof ( ps_name ) )
+              {
+                ft_memcpy( ps_name + ps_name_len, s + 1, s_len );
+                ps_name_len += s_len;
+                ps_name[ps_name_len] = 0;
+              }
+            }
+          }
+        }
+      }
+
+      create_lwfn_name( ps_name, lwfn_file_name );
+    }
+  }
+
+
+  static  FT_Error
+  lookup_lwfn_by_fond( const UInt8*      path_fond,
+                       ConstStr255Param  base_lwfn,
+                       UInt8*            path_lwfn,
+                       int               path_size )
+  {
+
+#if HAVE_FSREF
+
+    FSRef  ref, par_ref;
+    int    dirname_len;
+
+
+    /* Pathname for FSRef can be in various formats: HFS, HFS+, and POSIX. */
+    /* We should not extract parent directory by string manipulation.      */
+
+    if ( noErr != FSPathMakeRef( path_fond, &ref, FALSE ) )
+      return FT_Err_Invalid_Argument;
+
+    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone,
+                                    NULL, NULL, NULL, &par_ref ) )
+      return FT_Err_Invalid_Argument;
+
+    if ( noErr != FSRefMakePath( &par_ref, path_lwfn, path_size ) )
+      return FT_Err_Invalid_Argument;
+
+    if ( ft_strlen( (char *)path_lwfn ) + 1 + base_lwfn[0] > path_size )
+      return FT_Err_Invalid_Argument;
+
+    /* now we have absolute dirname in path_lwfn */
+    if ( path_lwfn[0] == '/' )
+      ft_strcat( (char *)path_lwfn, "/" );
+    else
+      ft_strcat( (char *)path_lwfn, ":" );
+
+    dirname_len = ft_strlen( (char *)path_lwfn );
+    ft_strcat( (char *)path_lwfn, (char *)base_lwfn + 1 );
+    path_lwfn[dirname_len + base_lwfn[0]] = '\0';
+
+    if ( noErr != FSPathMakeRef( path_lwfn, &ref, FALSE ) )
+      return FT_Err_Cannot_Open_Resource;
+
+    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone,
+                                    NULL, NULL, NULL, NULL ) )
+      return FT_Err_Cannot_Open_Resource;
+
+    return FT_Err_Ok;
+
+#else
+
+    int     i;
+    FSSpec  spec;
+
+
+    /* pathname for FSSpec is always HFS format */
+    if ( ft_strlen( (char *)path_fond ) > path_size )
+      return FT_Err_Invalid_Argument;
+
+    ft_strcpy( (char *)path_lwfn, (char *)path_fond );
+
+    i = ft_strlen( (char *)path_lwfn ) - 1;
+    while ( i > 0 && ':' != path_lwfn[i] )
+      i--;
+
+    if ( i + 1 + base_lwfn[0] > path_size )
+      return FT_Err_Invalid_Argument;
+
+    if ( ':' == path_lwfn[i] )
+    {
+      ft_strcpy( (char *)path_lwfn + i + 1, (char *)base_lwfn + 1 );
+      path_lwfn[i + 1 + base_lwfn[0]] = '\0';
+    }
+    else
+    {
+      ft_strcpy( (char *)path_lwfn, (char *)base_lwfn + 1 );
+      path_lwfn[base_lwfn[0]] = '\0';
+    }
+
+    if ( noErr != FT_FSPathMakeSpec( path_lwfn, &spec, FALSE ) )
+      return FT_Err_Cannot_Open_Resource;
+
+    return FT_Err_Ok;
+
+#endif /* HAVE_FSREF */
+
+  }
+
+
+  static short
+  count_faces( Handle        fond,
+               const UInt8*  pathname )
+  {
+    ResID     sfnt_id;
+    short     have_sfnt, have_lwfn;
+    Str255    lwfn_file_name;
+    UInt8     buff[PATH_MAX];
+    FT_Error  err;
+    short     num_faces;
+
+
+    have_sfnt = have_lwfn = 0;
+
+    HLock( fond );
+    parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, 0 );
+
+    if ( lwfn_file_name[0] )
+    {
+      err = lookup_lwfn_by_fond( pathname, lwfn_file_name,
+                                 buff, sizeof ( buff )  );
+      if ( FT_Err_Ok == err )
+        have_lwfn = 1;
+    }
+
+    if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) )
+      num_faces = 1;
+    else
+      num_faces = count_faces_scalable( *fond );
+
+    HUnlock( fond );
+    return num_faces;
+  }
+
+
+  /* Read Type 1 data from the POST resources inside the LWFN file,
+     return a PFB buffer.  This is somewhat convoluted because the FT2
+     PFB parser wants the ASCII header as one chunk, and the LWFN
+     chunks are often not organized that way, so we glue chunks
+     of the same type together. */
+  static FT_Error
+  read_lwfn( FT_Memory      memory,
+             ResFileRefNum  res,
+             FT_Byte**      pfb_data,
+             FT_ULong*      size )
+  {
+    FT_Error       error = FT_Err_Ok;
+    ResID          res_id;
+    unsigned char  *buffer, *p, *size_p = NULL;
+    FT_ULong       total_size = 0;
+    FT_ULong       old_total_size = 0;
+    FT_ULong       post_size, pfb_chunk_size;
+    Handle         post_data;
+    char           code, last_code;
+
+
+    UseResFile( res );
+
+    /* First pass: load all POST resources, and determine the size of */
+    /* the output buffer.                                             */
+    res_id    = 501;
+    last_code = -1;
+
+    for (;;)
+    {
+      post_data = Get1Resource( TTAG_POST, res_id++ );
+      if ( post_data == NULL )
+        break;  /* we are done */
+
+      code = (*post_data)[0];
+
+      if ( code != last_code )
+      {
+        if ( code == 5 )
+          total_size += 2; /* just the end code */
+        else
+          total_size += 6; /* code + 4 bytes chunk length */
+      }
+
+      total_size += GetHandleSize( post_data ) - 2;
+      last_code = code;
+
+      /* detect integer overflows */
+      if ( total_size < old_total_size )
+      {
+        error = FT_Err_Array_Too_Large;
+        goto Error;
+      }
+
+      old_total_size = total_size;
+    }
+
+    if ( FT_ALLOC( buffer, (FT_Long)total_size ) )
+      goto Error;
+
+    /* Second pass: append all POST data to the buffer, add PFB fields. */
+    /* Glue all consecutive chunks of the same type together.           */
+    p              = buffer;
+    res_id         = 501;
+    last_code      = -1;
+    pfb_chunk_size = 0;
+
+    for (;;)
+    {
+      post_data = Get1Resource( TTAG_POST, res_id++ );
+      if ( post_data == NULL )
+        break;  /* we are done */
+
+      post_size = (FT_ULong)GetHandleSize( post_data ) - 2;
+      code = (*post_data)[0];
+
+      if ( code != last_code )
+      {
+        if ( last_code != -1 )
+        {
+          /* we are done adding a chunk, fill in the size field */
+          if ( size_p != NULL )
+          {
+            *size_p++ = (FT_Byte)(   pfb_chunk_size         & 0xFF );
+            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8  ) & 0xFF );
+            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF );
+            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF );
+          }
+          pfb_chunk_size = 0;
+        }
+
+        *p++ = 0x80;
+        if ( code == 5 )
+          *p++ = 0x03;  /* the end */
+        else if ( code == 2 )
+          *p++ = 0x02;  /* binary segment */
+        else
+          *p++ = 0x01;  /* ASCII segment */
+
+        if ( code != 5 )
+        {
+          size_p = p;   /* save for later */
+          p += 4;       /* make space for size field */
+        }
+      }
+
+      ft_memcpy( p, *post_data + 2, post_size );
+      pfb_chunk_size += post_size;
+      p += post_size;
+      last_code = code;
+    }
+
+    *pfb_data = buffer;
+    *size = total_size;
+
+  Error:
+    CloseResFile( res );
+    return error;
+  }
+
+
+  /* Create a new FT_Face from a file spec to an LWFN file. */
+  static FT_Error
+  FT_New_Face_From_LWFN( FT_Library    library,
+                         const UInt8*  pathname,
+                         FT_Long       face_index,
+                         FT_Face*      aface )
+  {
+    FT_Byte*       pfb_data;
+    FT_ULong       pfb_size;
+    FT_Error       error;
+    ResFileRefNum  res;
+
+
+    if ( noErr != FT_FSPathMakeRes( pathname, &res ) )
+      return FT_Err_Cannot_Open_Resource;
+
+    pfb_data = NULL;
+    pfb_size = 0;
+    error = read_lwfn( library->memory, res, &pfb_data, &pfb_size );
+    CloseResFile( res ); /* PFB is already loaded, useless anymore */
+    if ( error )
+      return error;
+
+    return open_face_from_buffer( library,
+                                  pfb_data,
+                                  pfb_size,
+                                  face_index,
+                                  "type1",
+                                  aface );
+  }
+
+
+  /* Create a new FT_Face from an SFNT resource, specified by res ID. */
+  static FT_Error
+  FT_New_Face_From_SFNT( FT_Library  library,
+                         ResID       sfnt_id,
+                         FT_Long     face_index,
+                         FT_Face*    aface )
+  {
+    Handle     sfnt = NULL;
+    FT_Byte*   sfnt_data;
+    size_t     sfnt_size;
+    FT_Error   error  = FT_Err_Ok;
+    FT_Memory  memory = library->memory;
+    int        is_cff, is_sfnt_ps;
+
+
+    sfnt = GetResource( TTAG_sfnt, sfnt_id );
+    if ( sfnt == NULL )
+      return FT_Err_Invalid_Handle;
+
+    sfnt_size = (FT_ULong)GetHandleSize( sfnt );
+    if ( FT_ALLOC( sfnt_data, (FT_Long)sfnt_size ) )
+    {
+      ReleaseResource( sfnt );
+      return error;
+    }
+
+    HLock( sfnt );
+    ft_memcpy( sfnt_data, *sfnt, sfnt_size );
+    HUnlock( sfnt );
+    ReleaseResource( sfnt );
+
+    is_cff     = sfnt_size > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 );
+    is_sfnt_ps = sfnt_size > 4 && !ft_memcmp( sfnt_data, "typ1", 4 );
+
+    if ( is_sfnt_ps )
+    {
+      FT_Stream  stream;
+
+
+      if ( FT_NEW( stream ) )
+        goto Try_OpenType;
+
+      FT_Stream_OpenMemory( stream, sfnt_data, sfnt_size );
+      if ( !open_face_PS_from_sfnt_stream( library,
+                                           stream,
+                                           face_index,
+                                           0, NULL,
+                                           aface ) )
+      {
+        FT_Stream_Close( stream );
+        FT_FREE( stream );
+        FT_FREE( sfnt_data );
+        goto Exit;
+      }
+
+      FT_FREE( stream );
+    }
+  Try_OpenType:
+    error = open_face_from_buffer( library,
+                                   sfnt_data,
+                                   sfnt_size,
+                                   face_index,
+                                   is_cff ? "cff" : "truetype",
+                                   aface );
+  Exit:
+    return error;
+  }
+
+
+  /* Create a new FT_Face from a file spec to a suitcase file. */
+  static FT_Error
+  FT_New_Face_From_Suitcase( FT_Library    library,
+                             const UInt8*  pathname,
+                             FT_Long       face_index,
+                             FT_Face*      aface )
+  {
+    FT_Error       error = FT_Err_Cannot_Open_Resource;
+    ResFileRefNum  res_ref;
+    ResourceIndex  res_index;
+    Handle         fond;
+    short          num_faces_in_res, num_faces_in_fond;
+
+
+    if ( noErr != FT_FSPathMakeRes( pathname, &res_ref ) )
+      return FT_Err_Cannot_Open_Resource;
+
+    UseResFile( res_ref );
+    if ( ResError() )
+      return FT_Err_Cannot_Open_Resource;
+
+    num_faces_in_res = 0;
+    for ( res_index = 1; ; ++res_index )
+    {
+      fond = Get1IndResource( TTAG_FOND, res_index );
+      if ( ResError() )
+        break;
+
+      num_faces_in_fond  = count_faces( fond, pathname );
+      num_faces_in_res  += num_faces_in_fond;
+
+      if ( 0 <= face_index && face_index < num_faces_in_fond && error )
+        error = FT_New_Face_From_FOND( library, fond, face_index, aface );
+
+      face_index -= num_faces_in_fond;
+    }
+
+    CloseResFile( res_ref );
+    if ( FT_Err_Ok == error && NULL != aface )
+      (*aface)->num_faces = num_faces_in_res;
+    return error;
+  }
+
+
+  /* documentation is in ftmac.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Face_From_FOND( FT_Library  library,
+                         Handle      fond,
+                         FT_Long     face_index,
+                         FT_Face*    aface )
+  {
+    short     have_sfnt, have_lwfn = 0;
+    ResID     sfnt_id, fond_id;
+    OSType    fond_type;
+    Str255    fond_name;
+    Str255    lwfn_file_name;
+    UInt8     path_lwfn[PATH_MAX];
+    OSErr     err;
+    FT_Error  error = FT_Err_Ok;
+
+
+    GetResInfo( fond, &fond_id, &fond_type, fond_name );
+    if ( ResError() != noErr || fond_type != TTAG_FOND )
+      return FT_Err_Invalid_File_Format;
+
+    HLock( fond );
+    parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, face_index );
+    HUnlock( fond );
+
+    if ( lwfn_file_name[0] )
+    {
+      ResFileRefNum  res;
+
+
+      res = HomeResFile( fond );
+      if ( noErr != ResError() )
+        goto found_no_lwfn_file;
+
+#if HAVE_FSREF
+
+      {
+        UInt8  path_fond[PATH_MAX];
+        FSRef  ref;
+
+
+        err = FSGetForkCBInfo( res, kFSInvalidVolumeRefNum,
+                               NULL, NULL, NULL, &ref, NULL );
+        if ( noErr != err )
+          goto found_no_lwfn_file;
+
+        err = FSRefMakePath( &ref, path_fond, sizeof ( path_fond ) );
+        if ( noErr != err )
+          goto found_no_lwfn_file;
+
+        error = lookup_lwfn_by_fond( path_fond, lwfn_file_name,
+                                     path_lwfn, sizeof ( path_lwfn ) );
+        if ( FT_Err_Ok == error )
+          have_lwfn = 1;
+      }
+
+#elif HAVE_FSSPEC
+
+      {
+        UInt8     path_fond[PATH_MAX];
+        FCBPBRec  pb;
+        Str255    fond_file_name;
+        FSSpec    spec;
+
+
+        FT_MEM_SET( &spec, 0, sizeof ( FSSpec ) );
+        FT_MEM_SET( &pb,   0, sizeof ( FCBPBRec ) );
+
+        pb.ioNamePtr = fond_file_name;
+        pb.ioVRefNum = 0;
+        pb.ioRefNum  = res;
+        pb.ioFCBIndx = 0;
+
+        err = PBGetFCBInfoSync( &pb );
+        if ( noErr != err )
+          goto found_no_lwfn_file;
+
+        err = FSMakeFSSpec( pb.ioFCBVRefNum, pb.ioFCBParID,
+                            fond_file_name, &spec );
+        if ( noErr != err )
+          goto found_no_lwfn_file;
+
+        err = FT_FSpMakePath( &spec, path_fond, sizeof ( path_fond ) );
+        if ( noErr != err )
+          goto found_no_lwfn_file;
+
+        error = lookup_lwfn_by_fond( path_fond, lwfn_file_name,
+                                     path_lwfn, sizeof ( path_lwfn ) );
+        if ( FT_Err_Ok == error )
+          have_lwfn = 1;
+      }
+
+#endif /* HAVE_FSREF, HAVE_FSSPEC */
+
+    }
+
+    if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) )
+      error = FT_New_Face_From_LWFN( library,
+                                     path_lwfn,
+                                     face_index,
+                                     aface );
+    else
+      error = FT_Err_Unknown_File_Format;
+
+  found_no_lwfn_file:
+    if ( have_sfnt && FT_Err_Ok != error )
+      error = FT_New_Face_From_SFNT( library,
+                                     sfnt_id,
+                                     face_index,
+                                     aface );
+
+    return error;
+  }
+
+
+  /* Common function to load a new FT_Face from a resource file. */
+  static FT_Error
+  FT_New_Face_From_Resource( FT_Library    library,
+                             const UInt8*  pathname,
+                             FT_Long       face_index,
+                             FT_Face*      aface )
+  {
+    OSType    file_type;
+    FT_Error  error;
+
+
+    /* LWFN is a (very) specific file format, check for it explicitly */
+    file_type = get_file_type_from_path( pathname );
+    if ( file_type == TTAG_LWFN )
+      return FT_New_Face_From_LWFN( library, pathname, face_index, aface );
+
+    /* Otherwise the file type doesn't matter (there are more than  */
+    /* `FFIL' and `tfil').  Just try opening it as a font suitcase; */
+    /* if it works, fine.                                           */
+
+    error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface );
+    if ( error == 0 )
+      return error;
+
+    /* let it fall through to normal loader (.ttf, .otf, etc.); */
+    /* we signal this by returning no error and no FT_Face      */
+    *aface = NULL;
+    return 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This is the Mac-specific implementation of FT_New_Face.  In        */
+  /*    addition to the standard FT_New_Face() functionality, it also      */
+  /*    accepts pathnames to Mac suitcase files.  For further              */
+  /*    documentation see the original FT_New_Face() in freetype.h.        */
+  /*                                                                       */
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Face( FT_Library   library,
+               const char*  pathname,
+               FT_Long      face_index,
+               FT_Face*     aface )
+  {
+    FT_Open_Args  args;
+    FT_Error      error;
+
+
+    /* test for valid `library' and `aface' delayed to FT_Open_Face() */
+    if ( !pathname )
+      return FT_Err_Invalid_Argument;
+
+    error  = FT_Err_Ok;
+    *aface = NULL;
+
+    /* try resourcefork based font: LWFN, FFIL */
+    error = FT_New_Face_From_Resource( library, (UInt8 *)pathname,
+                                       face_index, aface );
+    if ( error != 0 || *aface != NULL )
+      return error;
+
+    /* let it fall through to normal loader (.ttf, .otf, etc.) */
+    args.flags    = FT_OPEN_PATHNAME;
+    args.pathname = (char*)pathname;
+    return FT_Open_Face( library, &args, face_index, aface );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face_From_FSRef                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    FT_New_Face_From_FSRef is identical to FT_New_Face except it       */
+  /*    accepts an FSRef instead of a path.                                */
+  /*                                                                       */
+  /* This function is deprecated because Carbon data types (FSRef)         */
+  /* are not cross-platform, and thus not suitable for the freetype API.   */
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Face_From_FSRef( FT_Library    library,
+                          const FSRef*  ref,
+                          FT_Long       face_index,
+                          FT_Face*      aface )
+  {
+
+#if !HAVE_FSREF
+
+    FT_UNUSED( library );
+    FT_UNUSED( ref );
+    FT_UNUSED( face_index );
+    FT_UNUSED( aface );
+
+    return FT_Err_Unimplemented_Feature;
+
+#else
+
+    FT_Error      error;
+    FT_Open_Args  args;
+    OSErr   err;
+    UInt8   pathname[PATH_MAX];
+
+
+    if ( !ref )
+      return FT_Err_Invalid_Argument;
+
+    err = FSRefMakePath( ref, pathname, sizeof ( pathname ) );
+    if ( err )
+      error = FT_Err_Cannot_Open_Resource;
+
+    error = FT_New_Face_From_Resource( library, pathname, face_index, aface );
+    if ( error != 0 || *aface != NULL )
+      return error;
+
+    /* fallback to datafork font */
+    args.flags    = FT_OPEN_PATHNAME;
+    args.pathname = (char*)pathname;
+    return FT_Open_Face( library, &args, face_index, aface );
+
+#endif /* HAVE_FSREF */
+
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face_From_FSSpec                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    FT_New_Face_From_FSSpec is identical to FT_New_Face except it      */
+  /*    accepts an FSSpec instead of a path.                               */
+  /*                                                                       */
+  /* This function is deprecated because Carbon data types (FSSpec)        */
+  /* are not cross-platform, and thus not suitable for the freetype API.   */
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Face_From_FSSpec( FT_Library     library,
+                           const FSSpec*  spec,
+                           FT_Long        face_index,
+                           FT_Face*       aface )
+  {
+
+#if HAVE_FSREF
+
+    FSRef  ref;
+
+
+    if ( !spec || FSpMakeFSRef( spec, &ref ) != noErr )
+      return FT_Err_Invalid_Argument;
+    else
+      return FT_New_Face_From_FSRef( library, &ref, face_index, aface );
+
+#elif HAVE_FSSPEC
+
+    FT_Error      error;
+    FT_Open_Args  args;
+    OSErr         err;
+    UInt8         pathname[PATH_MAX];
+
+
+    if ( !spec )
+      return FT_Err_Invalid_Argument;
+
+    err = FT_FSpMakePath( spec, pathname, sizeof ( pathname ) );
+    if ( err )
+      error = FT_Err_Cannot_Open_Resource;
+
+    error = FT_New_Face_From_Resource( library, pathname, face_index, aface );
+    if ( error != 0 || *aface != NULL )
+      return error;
+
+    /* fallback to datafork font */
+    args.flags    = FT_OPEN_PATHNAME;
+    args.pathname = (char*)pathname;
+    return FT_Open_Face( library, &args, face_index, aface );
+
+#else
+
+    FT_UNUSED( library );
+    FT_UNUSED( spec );
+    FT_UNUSED( face_index );
+    FT_UNUSED( aface );
+
+    return FT_Err_Unimplemented_Feature;
+
+#endif /* HAVE_FSREF, HAVE_FSSPEC */
+
+  }
+
+#endif /* FT_MACINTOSH */
+
+
+/* END */
diff --git a/builds/modules.mk b/builds/modules.mk
new file mode 100644 (file)
index 0000000..c4a882c
--- /dev/null
@@ -0,0 +1,79 @@
+#
+# FreeType 2 modules sub-Makefile
+#
+
+
+# Copyright 1996-2000, 2003, 2006, 2008 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.
+
+
+# DO NOT INVOKE THIS MAKEFILE DIRECTLY!  IT IS MEANT TO BE INCLUDED BY
+# OTHER MAKEFILES.
+
+
+# This file is in charge of handling the generation of the modules list
+# file.
+
+
+# Build the modules list.
+#
+$(FTMODULE_H): $(MODULES_CFG)
+       $(FTMODULE_H_INIT)
+       $(FTMODULE_H_CREATE)
+       $(FTMODULE_H_DONE)
+
+ifneq ($(findstring $(PLATFORM),dos win32 win16 os2),)
+  OPEN_MODULE   := @echo$(space)
+  CLOSE_MODULE  :=  >> $(subst /,$(SEP),$(FTMODULE_H))
+  REMOVE_MODULE := @-$(DELETE) $(subst /,$(SEP),$(FTMODULE_H))
+else
+  OPEN_MODULE   := @echo "
+  CLOSE_MODULE  := " >> $(FTMODULE_H)
+  REMOVE_MODULE := @-$(DELETE) $(FTMODULE_H)
+endif
+
+
+define FTMODULE_H_INIT
+$(REMOVE_MODULE)
+@-echo Generating modules list in $(FTMODULE_H)...
+$(OPEN_MODULE)/* This is a generated file. */$(CLOSE_MODULE)
+endef
+
+# It is no mistake that the final closing parenthesis is on the
+# next line -- it produces proper newlines during the expansion
+# of `foreach'.
+#
+define FTMODULE_H_CREATE
+$(foreach COMMAND,$(FTMODULE_H_COMMANDS),$($(COMMAND))
+)
+endef
+
+define FTMODULE_H_DONE
+$(OPEN_MODULE)/* EOF */$(CLOSE_MODULE)
+@echo done.
+endef
+
+
+# $(OPEN_DRIVER) & $(CLOSE_DRIVER) are used to specify a given font driver
+# in the `module.mk' rules file.
+#
+OPEN_DRIVER  := $(OPEN_MODULE)FT_USE_MODULE(
+CLOSE_DRIVER := )$(CLOSE_MODULE)
+
+ECHO_DRIVER      := @echo "* module:$(space)
+ECHO_DRIVER_DESC := (
+ECHO_DRIVER_DONE := )"
+
+# Each `module.mk' in the `src/*' subdirectories adds a variable with
+# commands to $(FTMODULE_H_COMMANDS).  Note that we can't use SRC_DIR here.
+#
+-include $(patsubst %,$(TOP_DIR)/src/%/module.mk,$(MODULES))
+
+
+# EOF
diff --git a/builds/newline b/builds/newline
new file mode 100644 (file)
index 0000000..8b13789
--- /dev/null
@@ -0,0 +1 @@
+
diff --git a/builds/os2/detect.mk b/builds/os2/detect.mk
new file mode 100644 (file)
index 0000000..47a40a2
--- /dev/null
@@ -0,0 +1,73 @@
+#
+# FreeType 2 configuration file to detect an OS/2 host platform.
+#
+
+
+# Copyright 1996-2000, 2003, 2006 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.
+
+
+.PHONY: setup
+
+
+ifeq ($(PLATFORM),ansi)
+
+  ifdef OS2_SHELL
+
+    PLATFORM := os2
+
+  endif # test OS2_SHELL
+endif
+
+ifeq ($(PLATFORM),os2)
+
+  COPY   := copy
+  DELETE := del
+  CAT    := type
+  SEP    := $(BACKSLASH)
+
+  # gcc-emx by default
+  CONFIG_FILE := os2-gcc.mk
+
+  # additionally, we provide hooks for various other compilers
+  #
+  ifneq ($(findstring visualage,$(MAKECMDGOALS)),)     # Visual Age C++
+    CONFIG_FILE := os2-icc.mk
+    CC          := icc
+    visualage: setup
+    .PHONY: visualage
+  endif
+
+  ifneq ($(findstring watcom,$(MAKECMDGOALS)),)        # Watcom C/C++
+    CONFIG_FILE := os2-wat.mk
+    CC          := wcc386
+    watcom: setup
+    .PHONY: watcom
+  endif
+
+  ifneq ($(findstring borlandc,$(MAKECMDGOALS)),)      # Borland C++ 32-bit
+    CONFIG_FILE := os2-bcc.mk
+    CC          := bcc32
+    borlandc: setup
+    .PHONY: borlandc
+  endif
+
+  ifneq ($(findstring devel,$(MAKECMDGOALS)),)         # development target
+    CONFIG_FILE := os2-dev.mk
+    CC          := gcc
+    devel: setup
+    .PHONY: devel
+  endif
+
+  setup: dos_setup
+
+endif   # test PLATFORM os2
+
+
+# EOF
diff --git a/builds/os2/os2-def.mk b/builds/os2/os2-def.mk
new file mode 100644 (file)
index 0000000..01cda92
--- /dev/null
@@ -0,0 +1,44 @@
+#
+# FreeType 2 OS/2 specific definitions
+#
+
+
+# Copyright 1996-2000, 2003, 2005, 2006 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.
+
+
+DELETE    := del
+CAT       := type
+SEP       := $(strip \ )
+BUILD_DIR := $(TOP_DIR)/builds/os2
+PLATFORM  := os2
+
+# The executable file extension (for tools), *with* leading dot.
+#
+E := .exe
+
+# The directory where all library files are placed.
+#
+# By default, this is the same as $(OBJ_DIR); however, this can be changed
+# to suit particular needs.
+#
+LIB_DIR := $(OBJ_DIR)
+
+# The name of the final library file.  Note that the DOS-specific Makefile
+# uses a shorter (8.3) name.
+#
+LIBRARY := $(PROJECT)
+
+
+# The NO_OUTPUT macro is used to ignore the output of commands.
+#
+NO_OUTPUT = 2> nul
+
+
+# EOF
diff --git a/builds/os2/os2-dev.mk b/builds/os2/os2-dev.mk
new file mode 100644 (file)
index 0000000..83da8de
--- /dev/null
@@ -0,0 +1,30 @@
+#
+# FreeType 2 configuration rules for OS/2 + GCC
+#
+#   Development version without optimizations.
+#
+
+
+# Copyright 1996-2000, 2003, 2006 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.
+
+
+DEVEL_DIR := $(TOP_DIR)/devel
+
+# include OS/2-specific definitions
+include $(TOP_DIR)/builds/os2/os2-def.mk
+
+# include gcc-specific definitions
+include $(TOP_DIR)/builds/compiler/gcc-dev.mk
+
+# include linking instructions
+include $(TOP_DIR)/builds/link_dos.mk
+
+
+# EOF
diff --git a/builds/os2/os2-gcc.mk b/builds/os2/os2-gcc.mk
new file mode 100644 (file)
index 0000000..446073e
--- /dev/null
@@ -0,0 +1,26 @@
+#
+# FreeType 2 configuration rules for the OS/2 + gcc
+#
+
+
+# Copyright 1996-2000 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.
+
+
+# include OS/2-specific definitions
+include $(TOP_DIR)/builds/os2/os2-def.mk
+
+# include gcc-specific definitions
+include $(TOP_DIR)/builds/compiler/gcc.mk
+
+# include linking instructions
+include $(TOP_DIR)/builds/link_dos.mk
+
+
+# EOF
diff --git a/builds/symbian/bld.inf b/builds/symbian/bld.inf
new file mode 100644 (file)
index 0000000..dd5f559
--- /dev/null
@@ -0,0 +1,66 @@
+//
+// FreeType 2 project for the symbian platform
+//
+
+// Copyright 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.
+
+PRJ_PLATFORMS
+DEFAULT
+
+PRJ_MMPFILES
+freetype.mmp
+
+PRJ_EXPORTS
+../../include/ft2build.h
+../../include/freetype/config/ftconfig.h       freetype/config/ftconfig.h
+../../include/freetype/config/ftheader.h       freetype/config/ftheader.h
+../../include/freetype/config/ftmodule.h       freetype/config/ftmodule.h
+../../include/freetype/config/ftoption.h       freetype/config/ftoption.h
+../../include/freetype/config/ftstdlib.h       freetype/config/ftstdlib.h
+../../include/freetype/freetype.h              freetype/freetype.h
+../../include/freetype/ftbbox.h                        freetype/ftbbox.h
+../../include/freetype/ftbdf.h                 freetype/ftbdf.h
+../../include/freetype/ftbitmap.h              freetype/ftbitmap.h
+../../include/freetype/ftcache.h               freetype/ftcache.h
+../../include/freetype/ftcid.h                 freetype/ftcid.h
+../../include/freetype/fterrdef.h              freetype/fterrdef.h
+../../include/freetype/fterrors.h              freetype/fterrors.h
+../../include/freetype/ftgasp.h                        freetype/ftgasp.h
+../../include/freetype/ftglyph.h               freetype/ftglyph.h
+../../include/freetype/ftgxval.h               freetype/ftgxval.h
+../../include/freetype/ftgzip.h                        freetype/ftgzip.h
+../../include/freetype/ftbzip2.h               freetype/ftbzip2.h
+../../include/freetype/ftimage.h               freetype/ftimage.h
+../../include/freetype/ftincrem.h              freetype/ftincrem.h
+../../include/freetype/ftlcdfil.h              freetype/ftlcdfil.h
+../../include/freetype/ftlist.h                        freetype/ftlist.h
+../../include/freetype/ftlzw.h                 freetype/ftlzw.h
+../../include/freetype/ftmac.h                 freetype/ftmac.h
+../../include/freetype/ftmm.h                  freetype/ftmm.h
+../../include/freetype/ftmodapi.h              freetype/ftmodapi.h
+../../include/freetype/ftmoderr.h              freetype/ftmoderr.h
+../../include/freetype/ftotval.h               freetype/ftotval.h
+../../include/freetype/ftoutln.h               freetype/ftoutln.h
+../../include/freetype/ftpfr.h                 freetype/ftpfr.h
+../../include/freetype/ftrender.h              freetype/ftrender.h
+../../include/freetype/ftsizes.h               freetype/ftsizes.h
+../../include/freetype/ftsnames.h              freetype/ftsnames.h
+../../include/freetype/ftstroke.h              freetype/ftstroke.h
+../../include/freetype/ftsynth.h               freetype/ftsynth.h
+../../include/freetype/ftsystem.h              freetype/ftsystem.h
+../../include/freetype/fttrigon.h              freetype/fttrigon.h
+../../include/freetype/fttypes.h               freetype/fttypes.h
+../../include/freetype/ftwinfnt.h              freetype/ftwinfnt.h
+../../include/freetype/ftxf86.h                        freetype/ftxf86.h
+../../include/freetype/t1tables.h              freetype/t1tables.h
+../../include/freetype/ttnameid.h              freetype/ttnameid.h
+../../include/freetype/tttables.h              freetype/tttables.h
+../../include/freetype/tttags.h                        freetype/tttags.h
+../../include/freetype/ttunpat.h               freetype/ttunpat.h
diff --git a/builds/symbian/freetype.mmp b/builds/symbian/freetype.mmp
new file mode 100644 (file)
index 0000000..cb0008c
--- /dev/null
@@ -0,0 +1,147 @@
+//
+// FreeType 2 makefile for the symbian platform
+//
+
+// Copyright 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.
+
+target                         freetype.lib
+targettype             lib
+
+macro NDEBUG
+macro FT2_BUILD_LIBRARY
+
+sourcepath ..\..\src\autofit
+
+source autofit.c
+
+sourcepath ..\..\src\base
+
+source ftbase.c
+source ftbbox.c
+source ftbdf.c
+source ftbitmap.c
+source ftcid.c
+source ftfstype.c
+source ftgasp.c
+source ftglyph.c
+source ftgxval.c
+source ftinit.c
+source ftlcdfil.c
+source ftmm.c
+source ftotval.c
+source ftpatent.c
+source ftpfr.c
+source ftstroke.c
+source ftsynth.c
+source ftsystem.c
+source fttype1.c
+source ftwinfnt.c
+
+sourcepath ..\..\src\bdf
+
+source bdf.c
+
+sourcepath ..\..\src\cache
+
+source ftcache.c
+
+sourcepath ..\..\src\cff
+
+source cff.c
+
+sourcepath ..\..\src\cid
+
+source type1cid.c
+
+sourcepath ..\..\src\gzip
+
+source ftgzip.c
+
+sourcepath ..\..\src\bzip2
+
+source ftbzip2.c
+
+sourcepath ..\..\src\lzw
+
+source ftlzw.c
+
+sourcepath ..\..\src\pcf
+
+source pcf.c
+
+sourcepath ..\..\src\pfr
+
+source pfr.c
+
+sourcepath ..\..\src\psaux
+
+source psaux.c
+
+sourcepath ..\..\src\pshinter
+
+source pshinter.c
+
+sourcepath ..\..\src\psnames
+
+source psmodule.c
+
+sourcepath ..\..\src\raster
+
+source raster.c
+
+sourcepath ..\..\src\sfnt
+
+source sfnt.c
+
+sourcepath ..\..\src\smooth
+
+source smooth.c
+
+sourcepath ..\..\src\truetype
+
+source truetype.c
+
+sourcepath ..\..\src\type1
+
+source type1.c
+
+sourcepath ..\..\src\type42
+
+source type42.c
+
+sourcepath ..\..\src\winfonts
+
+source winfnt.c
+
+
+systeminclude          ..\..\include
+systeminclude          \epoc32\include\stdapis
+userinclude            ..\..\src\autofit
+userinclude            ..\..\src\bdf
+userinclude            ..\..\src\cache
+userinclude            ..\..\src\cff
+userinclude            ..\..\src\cid
+userinclude            ..\..\src\gxvalid
+userinclude            ..\..\src\gzip
+userinclude            ..\..\src\bzip2
+userinclude            ..\..\src\lzw
+userinclude            ..\..\src\otvalid
+userinclude            ..\..\src\pcf
+userinclude            ..\..\src\pfr
+userinclude            ..\..\src\psaux
+userinclude            ..\..\src\pshinter
+userinclude            ..\..\src\psnames
+userinclude            ..\..\src\raster
+userinclude            ..\..\src\sfnt
+userinclude            ..\..\src\smooth
+userinclude            ..\..\src\truetype
+userinclude            ..\..\src\type1
+userinclude            ..\..\src\type42
+userinclude            ..\..\src\winfonts
diff --git a/builds/toplevel.mk b/builds/toplevel.mk
new file mode 100644 (file)
index 0000000..18bcef2
--- /dev/null
@@ -0,0 +1,257 @@
+#
+# FreeType build system -- top-level sub-Makefile
+#
+
+
+# Copyright 1996-2000, 2001, 2003, 2006, 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.
+
+
+# This file is designed for GNU Make, do not use it with another Make tool!
+#
+# It works as follows:
+#
+# - When invoked for the first time, this Makefile includes the rules found
+#   in `PROJECT/builds/detect.mk'.  They are in charge of detecting the
+#   current platform.
+#
+#   A summary of the detection is displayed, and the file `config.mk' is
+#   created in the current directory.
+#
+# - When invoked later, this Makefile includes the rules found in
+#   `config.mk'.  This sub-Makefile defines some system-specific variables
+#   (like compiler, compilation flags, object suffix, etc.), then includes
+#   the rules found in `PROJECT/builds/PROJECT.mk', used to build the
+#   library.
+#
+# See the comments in `builds/detect.mk' and `builds/PROJECT.mk' for more
+# details on host platform detection and library builds.
+
+
+# First of all, check whether we have `$(value ...)'.  We do this by testing
+# for `$(eval ...)' which has been introduced in the same GNU make version.
+
+eval_available :=
+$(eval eval_available := T)
+ifneq ($(eval_available),T)
+  $(error FreeType's build system needs a Make program which supports $$(value))
+endif
+
+
+.PHONY: all dist distclean modules setup
+
+
+# The `space' variable is used to avoid trailing spaces in defining the
+# `T' variable later.
+#
+empty :=
+space := $(empty) $(empty)
+
+
+# The main configuration file, defining the `XXX_MODULES' variables.  We
+# prefer a `modules.cfg' file in OBJ_DIR over TOP_DIR.
+#
+ifndef MODULES_CFG
+  MODULES_CFG := $(TOP_DIR)/modules.cfg
+  ifneq ($(wildcard $(OBJ_DIR)/modules.cfg),)
+    MODULES_CFG := $(OBJ_DIR)/modules.cfg
+  endif
+endif
+
+
+# FTMODULE_H, as its name suggests, indicates where the FreeType module
+# class file resides.
+#
+FTMODULE_H ?= $(OBJ_DIR)/ftmodule.h
+
+
+include $(MODULES_CFG)
+
+
+# The list of modules we are using.
+#
+MODULES := $(FONT_MODULES)    \
+           $(HINTING_MODULES) \
+           $(RASTER_MODULES)  \
+           $(AUX_MODULES)
+
+
+CONFIG_MK ?= config.mk
+
+# If no configuration sub-makefile is present, or if `setup' is the target
+# to be built, run the auto-detection rules to figure out which
+# configuration rules file to use.
+#
+# Note that the configuration file is put in the current directory, which is
+# not necessarily $(TOP_DIR).
+
+# If `config.mk' is not present, set `check_platform'.
+#
+ifeq ($(wildcard $(CONFIG_MK)),)
+  check_platform := 1
+endif
+
+# If `setup' is one of the targets requested, set `check_platform'.
+#
+ifneq ($(findstring setup,$(MAKECMDGOALS)),)
+  check_platform := 1
+endif
+
+# Include the automatic host platform detection rules when we need to
+# check the platform.
+#
+ifdef check_platform
+
+  all modules: setup
+
+  include $(TOP_DIR)/builds/detect.mk
+
+  # This rule makes sense for Unix only to remove files created by a run
+  # of the configure script which hasn't been successful (so that no
+  # `config.mk' has been created).  It uses the built-in $(RM) command of
+  # GNU make.  Similarly, `nul' is created if e.g. `make setup win32' has
+  # been erroneously used.
+  #
+  # Note: This test is duplicated in `builds/unix/detect.mk'.
+  #
+  is_unix := $(strip $(wildcard /sbin/init) \
+                     $(wildcard /usr/sbin/init) \
+                     $(wildcard /dev/null) \
+                     $(wildcard /hurd/auth))
+  ifneq ($(is_unix),)
+
+    distclean:
+         $(RM) builds/unix/config.cache
+         $(RM) builds/unix/config.log
+         $(RM) builds/unix/config.status
+         $(RM) builds/unix/unix-def.mk
+         $(RM) builds/unix/unix-cc.mk
+         $(RM) builds/unix/freetype2.pc
+         $(RM) nul
+
+  endif # test is_unix
+
+  # IMPORTANT:
+  #
+  # `setup' must be defined by the host platform detection rules to create
+  # the `config.mk' file in the current directory.
+
+else
+
+  # A configuration sub-Makefile is present -- simply run it.
+  #
+  all: single
+
+  BUILD_PROJECT := yes
+  include $(CONFIG_MK)
+
+endif # test check_platform
+
+
+# We always need the list of modules in ftmodule.h.
+#
+all setup: $(FTMODULE_H)
+
+
+# The `modules' target unconditionally rebuilds the module list.
+#
+modules:
+       $(FTMODULE_H_INIT)
+       $(FTMODULE_H_CREATE)
+       $(FTMODULE_H_DONE)
+
+include $(TOP_DIR)/builds/modules.mk
+
+
+# This target builds the tarballs.
+#
+# Not to be run by a normal user -- there are no attempts to make it
+# generic.
+
+# we check for `dist', not `distclean'
+ifneq ($(findstring distx,$(MAKECMDGOALS)x),)
+  FT_H := include/freetype/freetype.h
+
+  major := $(shell sed -n 's/.*FREETYPE_MAJOR[^0-9]*\([0-9]\+\)/\1/p' < $(FT_H))
+  minor := $(shell sed -n 's/.*FREETYPE_MINOR[^0-9]*\([0-9]\+\)/\1/p' < $(FT_H))
+  patch := $(shell sed -n 's/.*FREETYPE_PATCH[^0-9]*\([0-9]\+\)/\1/p' < $(FT_H))
+
+  version    := $(major).$(minor).$(patch)
+  winversion := $(major)$(minor)$(patch)
+endif
+
+dist:
+       -rm -rf tmp
+       rm -f freetype-$(version).tar.gz
+       rm -f freetype-$(version).tar.bz2
+       rm -f ft$(winversion).zip
+
+       for d in `find . -wholename '*/.git' -prune \
+                        -o -type f \
+                        -o -print` ; do \
+         mkdir -p tmp/$$d ; \
+       done ;
+
+       currdir=`pwd` ; \
+       for f in `find . -wholename '*/.git' -prune \
+                        -o -name .gitignore \
+                        -o -type d \
+                        -o -print` ; do \
+         ln -s $$currdir/$$f tmp/$$f ; \
+       done
+
+       @# Prevent generation of .pyc files.  Python follows (soft) links if
+       @# the link's directory is write protected, so we have temporarily
+       @# disable write access here too.
+       chmod -w src/tools/docmaker
+
+       cd tmp ; \
+       $(MAKE) devel ; \
+       $(MAKE) do-dist
+
+       chmod +w src/tools/docmaker
+
+       mv tmp freetype-$(version)
+
+       tar cfh - freetype-$(version) \
+       | gzip -9 -c > freetype-$(version).tar.gz
+       tar cfh - freetype-$(version) \
+       | bzip2 -c > freetype-$(version).tar.bz2
+
+       @# Use CR/LF for zip files.
+       zip -lr9 ft$(winversion).zip freetype-$(version)
+
+       rm -fr freetype-$(version)
+
+
+# The locations of the latest `config.guess' and `config.sub' versions (from
+# GNU `config' git repository), relative to the `tmp' directory used during
+# `make dist'.
+#
+CONFIG_GUESS = ~/git/config/config.guess
+CONFIG_SUB   = ~/git/config/config.sub
+
+
+# Don't say `make do-dist'.  Always use `make dist' instead.
+#
+.PHONY: do-dist
+
+do-dist: distclean refdoc
+       @# Without removing the files, `autoconf' and friends follow links.
+       rm -f builds/unix/aclocal.m4
+       rm -f builds/unix/configure.ac
+       rm -f builds/unix/configure
+
+       sh autogen.sh
+       rm -rf builds/unix/autom4te.cache
+
+       cp $(CONFIG_GUESS) builds/unix
+       cp $(CONFIG_SUB) builds/unix
+
+# EOF
diff --git a/builds/unix/.gitignore b/builds/unix/.gitignore
new file mode 100644 (file)
index 0000000..86b8c40
--- /dev/null
@@ -0,0 +1,16 @@
+aclocal.m4
+autom4te.cache
+config.cache
+config.guess
+config.log
+config.status
+config.sub
+configure
+configure.ac
+freetype2.pc
+freetype-config
+ftconfig.h
+libtool
+ltmain.sh
+unix-cc.mk
+unix-def.mk
diff --git a/builds/unix/configure.raw b/builds/unix/configure.raw
new file mode 100644 (file)
index 0000000..111dbab
--- /dev/null
@@ -0,0 +1,707 @@
+# This file is part of the FreeType project.
+#
+# Process this file with autoconf to produce a configure script.
+#
+# Copyright 2001-2012 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.
+
+AC_INIT([FreeType], [@VERSION@], [freetype@nongnu.org], [freetype])
+AC_CONFIG_SRCDIR([ftconfig.in])
+
+
+# Don't forget to update docs/VERSION.DLL!
+
+version_info='14:1:8'
+AC_SUBST([version_info])
+ft_version=`echo $version_info | tr : .`
+AC_SUBST([ft_version])
+
+
+# checks for system type
+
+AC_CANONICAL_HOST
+
+
+# checks for programs
+
+AC_PROG_CC
+AC_PROG_CPP
+AC_SUBST(EXEEXT)
+
+
+# checks for native programs to generate building tool
+
+if test ${cross_compiling} = yes; then
+  AC_CHECK_PROG(CC_BUILD, ${build}-gcc, ${build}-gcc)
+  test -z "${CC_BUILD}" && AC_CHECK_PROG(CC_BUILD, gcc, gcc)
+  test -z "${CC_BUILD}" && AC_CHECK_PROG(CC_BUILD, cc, cc, , , /usr/ucb/cc)
+  test -z "${CC_BUILD}" && AC_MSG_ERROR([cannot find native C compiler])
+
+  AC_MSG_CHECKING([for suffix of native executables])
+  rm -f a.* b.* a_out.exe conftest.*
+  echo > conftest.c "int main() { return 0;}"
+  ${CC_BUILD} conftest.c || AC_MSG_ERROR([native C compiler is not working])
+  rm -f conftest.c
+  if test -x a.out -o -x b.out -o -x conftest; then
+    EXEEXT_BUILD=""
+  elif test -x a_out.exe -o -x conftest.exe; then
+    EXEEXT_BUILD=".exe"
+  elif test -x conftest.*; then
+    EXEEXT_BUILD=`echo conftest.* | sed -n '1s/^.*\././'`
+  fi
+  rm -f a.* b.* a_out.exe conftest.*
+  AC_MSG_RESULT($EXEEXT_BUILD)
+else
+  CC_BUILD=${CC}
+  EXEEXT_BUILD=${EXEEXT}
+fi
+
+AC_SUBST(CC_BUILD)
+AC_SUBST(EXEEXT_BUILD)
+
+
+
+# get compiler flags right
+
+if test "x$GCC" = xyes; then
+  XX_CFLAGS="-Wall"
+  XX_ANSIFLAGS="-pedantic -ansi"
+else
+  case "$host" in
+  *-dec-osf*)
+    CFLAGS=
+    XX_CFLAGS="-std1 -g3"
+    XX_ANSIFLAGS=
+    ;;
+  *)
+    XX_CFLAGS=
+    XX_ANSIFLAGS=
+    ;;
+  esac
+fi
+AC_SUBST([XX_CFLAGS])
+AC_SUBST([XX_ANSIFLAGS])
+
+
+# auxiliary programs
+
+AC_CHECK_PROG([RMF], [rm], [rm -f])
+AC_CHECK_PROG([RMDIR], [rmdir], [rmdir])
+
+
+# Since this file will be finally moved to another directory we make
+# the path of the install script absolute.  This small code snippet has
+# been taken from automake's `ylwrap' script.
+
+AC_PROG_INSTALL
+case "$INSTALL" in
+/*)
+  ;;
+*/*)
+  INSTALL="`pwd`/$INSTALL"
+  ;;
+esac
+
+
+# checks for header files
+
+AC_HEADER_STDC
+AC_CHECK_HEADERS([fcntl.h unistd.h])
+
+
+# checks for typedefs, structures, and compiler characteristics
+
+AC_C_CONST
+AC_CHECK_SIZEOF([int])
+AC_CHECK_SIZEOF([long])
+
+
+# check whether cpp computation of size of int and long in ftconfig.in works
+
+AC_MSG_CHECKING([whether cpp computation of bit length in ftconfig.in works])
+orig_CPPFLAGS="${CPPFLAGS}"
+CPPFLAGS="-I${srcdir} -I. ${CPPFLAGS}"
+ac_clean_files="ft2build.h ftoption.h ftstdlib.h"
+touch ft2build.h ftoption.h ftstdlib.h
+
+cat > conftest.c <<\_ACEOF
+#include <limits.h>
+#define FT_CONFIG_OPTIONS_H "ftoption.h"
+#define FT_CONFIG_STANDARD_LIBRARY_H "ftstdlib.h"
+#define FT_UINT_MAX  UINT_MAX
+#define FT_ULONG_MAX ULONG_MAX
+#include "ftconfig.in"
+_ACEOF
+echo >> conftest.c "#if FT_SIZEOF_INT == "${ac_cv_sizeof_int}
+echo >> conftest.c "ac_cpp_ft_sizeof_int="${ac_cv_sizeof_int}
+echo >> conftest.c "#endif"
+echo >> conftest.c "#if FT_SIZEOF_LONG == "${ac_cv_sizeof_long}
+echo >> conftest.c "ac_cpp_ft_sizeof_long="${ac_cv_sizeof_long}
+echo >> conftest.c "#endif"
+
+${CPP} ${CPPFLAGS} conftest.c | ${GREP} ac_cpp_ft > conftest.sh
+eval `cat conftest.sh`
+${RMF} conftest.c conftest.sh confft2build.h ftoption.h ftstdlib.h
+
+if test x != "x${ac_cpp_ft_sizeof_int}" \
+   -a x != x"${ac_cpp_ft_sizeof_long}"; then
+  unset ft_use_autoconf_sizeof_types
+else
+  ft_use_autoconf_sizeof_types=yes
+fi
+
+AC_ARG_ENABLE(biarch-config,
+[  --enable-biarch-config  install biarch ftconfig.h to support multiple
+                          architectures by single file], [], [])
+
+case :${ft_use_autoconf_sizeof_types}:${enable_biarch_config}: in
+  :yes:yes:)
+    AC_MSG_RESULT([broken but use it])
+    unset ft_use_autoconf_sizeof_types
+    ;;
+  ::no:)
+    AC_MSG_RESULT([works but ignore it])
+    ft_use_autoconf_sizeof_types=yes
+    ;;
+  ::yes: | :::)
+    AC_MSG_RESULT([yes])
+    unset ft_use_autoconf_sizeof_types
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ft_use_autoconf_sizeof_types=yes
+    ;;
+esac
+
+if test x"${ft_use_autoconf_sizeof_types}" = xyes; then
+  AC_DEFINE([FT_USE_AUTOCONF_SIZEOF_TYPES])
+fi
+
+CPPFLAGS="${orig_CPPFLAGS}"
+
+
+# checks for library functions
+
+# Here we check whether we can use our mmap file component.
+
+AC_ARG_ENABLE([mmap],
+  AS_HELP_STRING([--disable-mmap],
+                 [do not check mmap() and do not use]),
+  [enable_mmap="no"],[enable_mmap="yes"])
+if test "x${enable_mmap}" != "xno"; then
+  AC_FUNC_MMAP
+fi
+if test "x${enable_mmap}" = "xno" \
+   -o "$ac_cv_func_mmap_fixed_mapped" != "yes"; then
+  FTSYS_SRC='$(BASE_DIR)/ftsystem.c'
+else
+  FTSYS_SRC='$(BUILD_DIR)/ftsystem.c'
+
+  AC_CHECK_DECLS([munmap],
+    [],
+    [],
+    [
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <sys/mman.h>
+
+    ])
+
+  FT_MUNMAP_PARAM
+fi
+AC_SUBST([FTSYS_SRC])
+
+AC_CHECK_FUNCS([memcpy memmove])
+
+
+# check for system zlib
+
+# don't quote AS_HELP_STRING!
+AC_ARG_WITH([zlib],
+  AS_HELP_STRING([--without-zlib],
+                 [use internal zlib instead of system-wide]))
+if test x$with_zlib != xno && test -z "$LIBZ"; then
+  AC_CHECK_LIB([z], [gzsetparams], [AC_CHECK_HEADER([zlib.h], [LIBZ='-lz'])])
+fi
+if test x$with_zlib != xno && test -n "$LIBZ"; then
+  CFLAGS="$CFLAGS -DFT_CONFIG_OPTION_SYSTEM_ZLIB"
+  LDFLAGS="$LDFLAGS $LIBZ"
+  SYSTEM_ZLIB=yes
+fi
+
+# check for system libbz2
+
+# don't quote AS_HELP_STRING!
+AC_ARG_WITH([bzip2],
+  AS_HELP_STRING([--without-bzip2],
+                 [do not support bzip2 compressed fonts]))
+if test x$with_bzip2 != xno && test -z "$LIBBZ2"; then
+  AC_CHECK_LIB([bz2], [BZ2_bzDecompress], [AC_CHECK_HEADER([bzlib.h], [LIBBZ2='-lbz2'])])
+fi
+if test x$with_bzip2 != xno && test -n "$LIBBZ2"; then
+  CFLAGS="$CFLAGS -DFT_CONFIG_OPTION_USE_BZIP2"
+  LDFLAGS="$LDFLAGS $LIBBZ2"
+fi
+
+# Some options handling SDKs/archs in CFLAGS should be copied
+# to LDFLAGS. Apple TechNote 2137 recommends to include these
+# options in CFLAGS but not in LDFLAGS.
+
+save_config_args=$*
+set dummy ${CFLAGS}
+i=1
+while test $i -le $#
+do
+  c=$1
+
+  case "${c}" in
+  -isysroot|-arch) # options taking 1 argument
+    a=$2
+    AC_MSG_CHECKING([whether CFLAGS and LDFLAGS share ${c} ${a}])
+    if expr " ${LDFLAGS} " : ".* ${c} *${a}.*" > /dev/null
+    then
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no, copy to LDFLAGS])
+      LDFLAGS="${LDFLAGS} ${c} ${a}"
+    fi
+    shift 1
+    ;;
+  -m32|-m64|-march=*|-mcpu=*) # options taking no argument
+    AC_MSG_RESULT([whether CFLAGS and LDFLAGS share ${c}])
+    if expr " ${LDFLAGS} " : ".* ${c} *${a}.*" > /dev/null
+    then
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no, copy to LDFLAGS])
+      LDFLAGS="${LDFLAGS} ${c}"
+    fi
+    ;;
+  # *)
+  #   AC_MSG_RESULT([${c} is not copied to LDFLAGS])
+  #   ;;
+  esac
+
+  shift 1
+done
+set ${save_config_args}
+
+
+# Whether to use Mac OS resource-based fonts.
+
+ftmac_c="" # src/base/ftmac.c should not be included in makefiles by default
+
+# don't quote AS_HELP_STRING!
+AC_ARG_WITH([old-mac-fonts],
+  AS_HELP_STRING([--with-old-mac-fonts],
+                 [allow Mac resource-based fonts to be used]))
+if test x$with_old_mac_fonts = xyes; then
+  orig_LDFLAGS="${LDFLAGS}"
+  AC_MSG_CHECKING([CoreServices & ApplicationServices of Mac OS X])
+  FT2_EXTRA_LIBS="-Wl,-framework,CoreServices -Wl,-framework,ApplicationServices"
+  LDFLAGS="$LDFLAGS $FT2_EXTRA_LIBS"
+  AC_LINK_IFELSE([
+    AC_LANG_PROGRAM([
+
+#if defined(__GNUC__) && defined(__APPLE_CC__)
+# include <CoreServices/CoreServices.h>
+# include <ApplicationServices/ApplicationServices.h>
+#else
+# include <ConditionalMacros.h>
+# include <Files.h>
+#endif
+
+      ],
+      [
+
+        short res = 0;
+
+
+        UseResFile( res );
+
+      ])],
+    [AC_MSG_RESULT([ok])
+     ftmac_c='ftmac.c'
+     AC_MSG_CHECKING([whether OS_INLINE macro is ANSI compatible])
+     orig_CFLAGS="$CFLAGS -DFT_MACINTOSH"
+     CFLAGS="$CFLAGS $XX_CFLAGS $XX_ANSIFLAGS"
+     AC_COMPILE_IFELSE([
+       AC_LANG_PROGRAM([
+
+#if defined(__GNUC__) && defined(__APPLE_CC__)
+# include <CoreServices/CoreServices.h>
+# include <ApplicationServices/ApplicationServices.h>
+#else
+# include <ConditionalMacros.h>
+# include <Files.h>
+#endif
+
+         ],
+         [
+
+           /* OSHostByteOrder() is typed as OS_INLINE */
+           int32_t  os_byte_order = OSHostByteOrder();
+
+
+           if ( OSBigEndian != os_byte_order )
+             return 1;
+
+         ])],
+       [AC_MSG_RESULT([ok])
+        CFLAGS="$orig_CFLAGS"
+        CFLAGS="$CFLAGS -DHAVE_ANSI_OS_INLINE=1"
+       ],
+       [AC_MSG_RESULT([no, ANSI incompatible])
+        CFLAGS="$orig_CFLAGS"
+       ])
+     AC_MSG_CHECKING([type ResourceIndex])
+     orig_CFLAGS="$CFLAGS"
+     CFLAGS="$CFLAGS $XX_CFLAGS $XX_ANSIFLAGS"
+     AC_COMPILE_IFELSE([
+       AC_LANG_PROGRAM([
+
+#if defined(__GNUC__) && defined(__APPLE_CC__)
+# include <CoreServices/CoreServices.h>
+# include <ApplicationServices/ApplicationServices.h>
+#else
+# include <ConditionalMacros.h>
+# include <Files.h>
+# include <Resources.h>
+#endif
+
+         ],
+         [
+
+           ResourceIndex i = 0;
+           return i;
+
+         ])],
+       [AC_MSG_RESULT([ok])
+        CFLAGS="$orig_CFLAGS"
+        CFLAGS="$CFLAGS -DHAVE_TYPE_RESOURCE_INDEX=1"
+       ],
+       [AC_MSG_RESULT([no])
+        CFLAGS="$orig_CFLAGS"
+        CFLAGS="$CFLAGS -DHAVE_TYPE_RESOURCE_INDEX=0"
+       ])],
+    [AC_MSG_RESULT([not found])
+     FT2_EXTRA_LIBS=""
+     LDFLAGS="${orig_LDFLAGS}"
+     CFLAGS="$CFLAGS -DDARWIN_NO_CARBON"])
+else
+  case x$host_os in
+  xdarwin*)
+    dnl AC_MSG_WARN([host system is MacOS but configured to build without Carbon])
+    CFLAGS="$CFLAGS -DDARWIN_NO_CARBON"
+    ;;
+  *)
+    ;;
+  esac
+fi
+
+
+# Whether to use FileManager which is deprecated since Mac OS X 10.4.
+
+AC_ARG_WITH([fsspec],
+  AS_HELP_STRING([--with-fsspec],
+                 [use obsolete FSSpec API of MacOS, if available (default=yes)]))
+if test x$with_fsspec = xno; then
+  CFLAGS="$CFLAGS -DHAVE_FSSPEC=0"
+elif test x$with_old_mac_fonts = xyes -a x$with_fsspec != x; then
+  AC_MSG_CHECKING([FSSpec-based FileManager])
+  AC_LINK_IFELSE([
+    AC_LANG_PROGRAM([
+
+#if defined(__GNUC__) && defined(__APPLE_CC__)
+# include <CoreServices/CoreServices.h>
+# include <ApplicationServices/ApplicationServices.h>
+#else
+# include <ConditionalMacros.h>
+# include <Files.h>
+#endif
+
+      ],
+      [
+
+        FCBPBPtr          paramBlock;
+        short             vRefNum;
+        long              dirID;
+        ConstStr255Param  fileName;
+        FSSpec*           spec;
+
+
+        /* FSSpec functions: deprecated since Mac OS X 10.4 */
+        PBGetFCBInfoSync( paramBlock );
+        FSMakeFSSpec( vRefNum, dirID, fileName, spec );
+
+      ])],
+    [AC_MSG_RESULT([ok])
+     CFLAGS="$CFLAGS -DHAVE_FSSPEC=1"],
+    [AC_MSG_RESULT([not found])
+     CFLAGS="$CFLAGS -DHAVE_FSSPEC=0"])
+fi
+
+
+# Whether to use FileManager in Carbon since MacOS 9.x.
+
+AC_ARG_WITH([fsref],
+  AS_HELP_STRING([--with-fsref],
+                 [use Carbon FSRef API of MacOS, if available (default=yes)]))
+if test x$with_fsref = xno; then
+  AC_MSG_WARN([
+*** WARNING
+    FreeType2 built without FSRef API cannot load
+    data-fork fonts on MacOS, except of XXX.dfont.
+    ])
+  CFLAGS="$CFLAGS -DHAVE_FSREF=0"
+elif test x$with_old_mac_fonts = xyes -a x$with_fsref != x; then
+  AC_MSG_CHECKING([FSRef-based FileManager])
+  AC_LINK_IFELSE([
+    AC_LANG_PROGRAM([
+
+#if defined(__GNUC__) && defined(__APPLE_CC__)
+# include <CoreServices/CoreServices.h>
+# include <ApplicationServices/ApplicationServices.h>
+#else
+# include <ConditionalMacros.h>
+# include <Files.h>
+#endif
+
+      ],
+      [
+
+        short                vRefNum;
+        long                 dirID;
+        ConstStr255Param     fileName;
+
+        Boolean*             isDirectory;
+        UInt8*               path;
+        SInt16               desiredRefNum;
+        SInt16*              iterator;
+        SInt16*              actualRefNum;
+        HFSUniStr255*        outForkName;
+        FSVolumeRefNum       volume;
+        FSCatalogInfoBitmap  whichInfo;
+        FSCatalogInfo*       catalogInfo;
+        FSForkInfo*          forkInfo;
+        FSRef*               ref;
+
+#if HAVE_FSSPEC
+        FSSpec*              spec;
+#endif
+
+        /* FSRef functions: no need to check? */
+        FSGetForkCBInfo( desiredRefNum, volume, iterator,
+                         actualRefNum, forkInfo, ref,
+                         outForkName );
+        FSPathMakeRef( path, ref, isDirectory );
+
+#if HAVE_FSSPEC
+        FSpMakeFSRef ( spec, ref );
+        FSGetCatalogInfo( ref, whichInfo, catalogInfo,
+                          outForkName, spec, ref );
+#endif
+      ])],
+    [AC_MSG_RESULT([ok])
+     CFLAGS="$CFLAGS -DHAVE_FSREF=1"],
+    [AC_MSG_RESULT([not found])
+     CFLAGS="$CFLAGS -DHAVE_FSREF=0"])
+fi
+
+
+# Whether to use QuickDraw API in ToolBox which is deprecated since
+# Mac OS X 10.4.
+
+AC_ARG_WITH([quickdraw-toolbox],
+  AS_HELP_STRING([--with-quickdraw-toolbox],
+                 [use MacOS QuickDraw in ToolBox, if available (default=yes)]))
+if test x$with_quickdraw_toolbox = xno; then
+  CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=0"
+elif test x$with_old_mac_fonts = xyes -a x$with_quickdraw_toolbox != x; then
+  AC_MSG_CHECKING([QuickDraw FontManager functions in ToolBox])
+  AC_LINK_IFELSE([
+    AC_LANG_PROGRAM([
+
+#if defined(__GNUC__) && defined(__APPLE_CC__)
+# include <CoreServices/CoreServices.h>
+# include <ApplicationServices/ApplicationServices.h>
+#else
+# include <ConditionalMacros.h>
+# include <Fonts.h>
+#endif
+
+      ],
+      [
+
+        Str255     familyName;
+        SInt16     familyID   = 0;
+        FMInput*   fmIn       = NULL;
+        FMOutput*  fmOut      = NULL;
+
+
+        GetFontName( familyID, familyName );
+        GetFNum( familyName, &familyID );
+        fmOut = FMSwapFont( fmIn );
+
+      ])],
+    [AC_MSG_RESULT([ok])
+     CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=1"],
+    [AC_MSG_RESULT([not found])
+     CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_TOOLBOX=0"])
+fi
+
+
+# Whether to use QuickDraw API in Carbon which is deprecated since
+# Mac OS X 10.4.
+
+AC_ARG_WITH([quickdraw-carbon],
+  AS_HELP_STRING([--with-quickdraw-carbon],
+                 [use MacOS QuickDraw in Carbon, if available (default=yes)]))
+if test x$with_quickdraw_carbon = xno; then
+  CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=0"
+elif test x$with_old_mac_fonts = xyes -a x$with_quickdraw_carbon != x; then
+  AC_MSG_CHECKING([QuickDraw FontManager functions in Carbon])
+  AC_LINK_IFELSE([
+    AC_LANG_PROGRAM([
+
+#if defined(__GNUC__) && defined(__APPLE_CC__)
+# include <CoreServices/CoreServices.h>
+# include <ApplicationServices/ApplicationServices.h>
+#else
+# include <ConditionalMacros.h>
+# include <Fonts.h>
+#endif
+
+      ],
+      [
+
+        FMFontFamilyIterator          famIter;
+        FMFontFamily                  family;
+        Str255                        famNameStr;
+        FMFontFamilyInstanceIterator  instIter;
+        FMFontStyle                   style;
+        FMFontSize                    size;
+        FMFont                        font;
+        FSSpec*                       pathSpec;
+
+
+        FMCreateFontFamilyIterator( NULL, NULL, kFMUseGlobalScopeOption,
+                                    &famIter );
+        FMGetNextFontFamily( &famIter, &family );
+        FMGetFontFamilyName( family, famNameStr );
+        FMCreateFontFamilyInstanceIterator( family, &instIter );
+        FMGetNextFontFamilyInstance( &instIter, &font, &style, &size );
+        FMDisposeFontFamilyInstanceIterator( &instIter );
+        FMDisposeFontFamilyIterator( &famIter );
+        FMGetFontContainer( font, pathSpec );
+
+      ])],
+    [AC_MSG_RESULT([ok])
+     CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=1"],
+    [AC_MSG_RESULT([not found])
+     CFLAGS="$CFLAGS -DHAVE_QUICKDRAW_CARBON=0"])
+fi
+
+
+# Whether to use AppleTypeService since Mac OS X.
+
+# don't quote AS_HELP_STRING!
+AC_ARG_WITH([ats],
+  AS_HELP_STRING([--with-ats],
+                 [use AppleTypeService, if available (default=yes)]))
+if test x$with_ats = xno; then
+  CFLAGS="$CFLAGS -DHAVE_ATS=0"
+elif test x$with_old_mac_fonts = xyes -a x$with_ats != x; then
+  AC_MSG_CHECKING([AppleTypeService functions])
+  AC_LINK_IFELSE([
+    AC_LANG_PROGRAM([
+
+#if defined(__GNUC__) && defined(__APPLE_CC__)
+# include <CoreServices/CoreServices.h>
+# include <ApplicationServices/ApplicationServices.h>
+#else
+# include <ConditionalMacros.h>
+# include <Files.h>
+#endif
+
+      ],
+      [
+
+        FSSpec*  pathSpec;
+
+
+        ATSFontFindFromName( NULL, kATSOptionFlagsUnRestrictedScope );
+#if HAVE_FSSPEC
+        ATSFontGetFileSpecification( 0, pathSpec );
+#endif
+
+      ])],
+    [AC_MSG_RESULT([ok])
+     CFLAGS="$CFLAGS -DHAVE_ATS=1"],
+    [AC_MSG_RESULT([not found])
+     CFLAGS="$CFLAGS -DHAVE_ATS=0"])
+fi
+
+case "$CFLAGS" in
+  *HAVE_FSSPEC* | *HAVE_FSREF* | *HAVE_QUICKDRAW* | *HAVE_ATS* )
+    AC_MSG_WARN([
+*** WARNING
+    FSSpec/FSRef/QuickDraw/ATS options are explicitly given,
+    thus it is recommended to replace src/base/ftmac.c by builds/mac/ftmac.c.
+    ])
+    CFLAGS="$CFLAGS "'-I$(TOP_DIR)/builds/mac/'
+    ;;
+  *)
+    ;;
+esac
+
+
+AC_SUBST([ftmac_c])
+AC_SUBST([LIBZ])
+AC_SUBST([LIBBZ2])
+AC_SUBST([CFLAGS])
+AC_SUBST([LDFLAGS])
+AC_SUBST([FT2_EXTRA_LIBS])
+AC_SUBST([SYSTEM_ZLIB])
+
+
+LT_INIT(win32-dll)
+
+AC_SUBST([hardcode_libdir_flag_spec])
+AC_SUBST([wl])
+AC_SUBST([build_libtool_libs])
+
+
+# configuration file -- stay in 8.3 limit
+#
+# since #undef doesn't survive in configuration header files we replace
+# `/undef' with `#undef' after creating the output file
+
+AC_CONFIG_HEADERS([ftconfig.h:ftconfig.in],
+  [mv ftconfig.h ftconfig.tmp
+   sed 's|/undef|#undef|' < ftconfig.tmp > ftconfig.h
+   rm ftconfig.tmp])
+
+# create the Unix-specific sub-Makefiles `builds/unix/unix-def.mk'
+# and `builds/unix/unix-cc.mk' that will be used by the build system
+#
+AC_CONFIG_FILES([unix-cc.mk:unix-cc.in
+                 unix-def.mk:unix-def.in
+                 freetype-config
+                 freetype2.pc:freetype2.in])
+
+# re-generate the Jamfile to use libtool now
+#
+# AC_CONFIG_FILES([../../Jamfile:../../Jamfile.in])
+
+AC_OUTPUT
+
+# end of configure.raw
diff --git a/builds/unix/detect.mk b/builds/unix/detect.mk
new file mode 100644 (file)
index 0000000..b2ae4f4
--- /dev/null
@@ -0,0 +1,92 @@
+#
+# FreeType 2 configuration file to detect a UNIX host platform.
+#
+
+
+# Copyright 1996-2000, 2002, 2003, 2004, 2006 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.
+
+.PHONY: setup
+
+ifeq ($(PLATFORM),ansi)
+
+  # Note: this test is duplicated in "builds/toplevel.mk".
+  #
+  is_unix := $(strip $(wildcard /sbin/init) \
+                     $(wildcard /usr/sbin/init) \
+                     $(wildcard /dev/null) \
+                     $(wildcard /hurd/auth))
+  ifneq ($(is_unix),)
+
+    PLATFORM := unix
+
+  endif # test is_unix
+endif # test PLATFORM ansi
+
+ifeq ($(PLATFORM),unix)
+  COPY   := cp
+  DELETE := rm -f
+  CAT    := cat
+
+  # If `devel' is the requested target, we use a special configuration
+  # file named `unix-dev.mk'.  It disables optimization and libtool.
+  #
+  ifneq ($(findstring devel,$(MAKECMDGOALS)),)
+    CONFIG_FILE := unix-dev.mk
+    CC          := gcc
+    devel: setup
+    .PHONY: devel
+  else
+
+    # If `lcc' is the requested target, we use a special configuration
+    # file named `unix-lcc.mk'.  It disables libtool for LCC.
+    #
+    ifneq ($(findstring lcc,$(MAKECMDGOALS)),)
+      CONFIG_FILE := unix-lcc.mk
+      CC          := lcc
+      lcc: setup
+      .PHONY: lcc
+    else
+
+      # If a Unix platform is detected, the configure script is called and
+      # `unix-def.mk' together with `unix-cc.mk' is created.
+      #
+      # Arguments to `configure' should be in the CFG variable.  Example:
+      #
+      #   make CFG="--prefix=/usr --disable-static"
+      #
+      # If you need to set CFLAGS or LDFLAGS, do it here also.
+      #
+      # Feel free to add support for other platform specific compilers in
+      # this directory (e.g. solaris.mk + changes here to detect the
+      # platform).
+      #
+      CONFIG_FILE := unix.mk
+      unix: setup
+      must_configure := 1
+      .PHONY: unix
+    endif
+  endif
+
+  have_Makefile := $(wildcard $(OBJ_DIR)/Makefile)
+
+      setup: std_setup
+  ifdef must_configure
+    ifneq ($(have_Makefile),)
+      # we are building FT2 not in the src tree
+             $(TOP_DIR)/builds/unix/configure $(value CFG)
+    else
+             cd builds/unix; ./configure $(value CFG)
+    endif
+  endif
+
+endif   # test PLATFORM unix
+
+
+# EOF
diff --git a/builds/unix/freetype-config.in b/builds/unix/freetype-config.in
new file mode 100644 (file)
index 0000000..815367b
--- /dev/null
@@ -0,0 +1,160 @@
+#! /bin/sh
+#
+# Copyright 2000, 2001, 2002, 2003, 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.
+
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+exec_prefix_set=no
+includedir=@includedir@
+libdir=@libdir@
+enable_shared=@build_libtool_libs@
+wl=@wl@
+hardcode_libdir_flag_spec='@hardcode_libdir_flag_spec@'
+
+usage()
+{
+  cat <<EOF
+Usage: freetype-config [OPTION]...
+Get FreeType compilation and linking information.
+
+Options:
+  --prefix               display \`--prefix' value used for building the
+                         FreeType library
+  --prefix=PREFIX        override \`--prefix' value with PREFIX
+  --exec-prefix          display \`--exec-prefix' value used for building
+                         the FreeType library
+  --exec-prefix=EPREFIX  override \`--exec-prefix' value with EPREFIX
+  --version              display libtool version of the FreeType library
+  --ftversion            display FreeType version number
+  --libs                 display flags for linking with the FreeType library
+  --libtool              display library name for linking with libtool
+  --cflags               display flags for compiling with the FreeType
+                         library
+EOF
+  exit $1
+}
+
+if test $# -eq 0 ; then
+  usage 1 1>&2
+fi
+
+while test $# -gt 0 ; do
+  case "$1" in
+  -*=*)
+    optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'`
+    ;;
+  *)
+    optarg=
+    ;;
+  esac
+
+  case $1 in
+  --prefix=*)
+    prefix=$optarg
+    local_prefix=yes
+    ;;
+  --prefix)
+    echo_prefix=yes
+    ;;
+  --exec-prefix=*)
+    exec_prefix=$optarg
+    exec_prefix_set=yes
+    local_prefix=yes
+    ;;
+  --exec-prefix)
+    echo_exec_prefix=yes
+    ;;
+  --version)
+    echo @ft_version@
+    exit 0
+    ;;
+  --ftversion)
+    echo_ft_version=yes
+    ;;
+  --cflags)
+    echo_cflags=yes
+    ;;
+  --libs)
+    echo_libs=yes
+    ;;
+  --libtool)
+    echo_libtool=yes
+    ;;
+  *)
+    usage 1 1>&2
+    ;;
+  esac
+  shift
+done
+
+if test "$local_prefix" = "yes" ; then
+  if test "$exec_prefix_set" != "yes" ; then
+    exec_prefix=$prefix
+  fi
+fi
+
+if test "$echo_prefix" = "yes" ; then
+  echo ${SYSROOT}$prefix
+fi
+
+if test "$echo_exec_prefix" = "yes" ; then
+  echo ${SYSROOT}$exec_prefix
+fi
+
+if test "$exec_prefix_set" = "yes" ; then
+  libdir=$exec_prefix/lib
+else
+  if test "$local_prefix" = "yes" ; then
+    includedir=$prefix/include
+    libdir=$prefix/lib
+  fi
+fi
+
+if test "$echo_ft_version" = "yes" ; then
+  major=`grep define ${SYSROOT}$includedir/freetype2/freetype/freetype.h \
+         | grep FREETYPE_MAJOR \
+         | sed 's/.*[  ]\([0-9][0-9]*\).*/\1/'`
+  minor=`grep define ${SYSROOT}$includedir/freetype2/freetype/freetype.h \
+         | grep FREETYPE_MINOR \
+         | sed 's/.*[  ]\([0-9][0-9]*\).*/\1/'`
+  patch=`grep define ${SYSROOT}$includedir/freetype2/freetype/freetype.h \
+         | grep FREETYPE_PATCH \
+         | sed 's/.*[  ]\([0-9][0-9]*\).*/\1/'`
+  echo $major.$minor.$patch
+fi
+
+if test "$echo_cflags" = "yes" ; then
+  cflags="-I${SYSROOT}$includedir/freetype2"
+  if test "${SYSROOT}$includedir" != "/usr/include" ; then
+    echo $cflags -I${SYSROOT}$includedir
+  else
+    echo $cflags
+  fi
+fi
+
+if test "$echo_libs" = "yes" ; then
+  rpath=
+  if test "$enable_shared" = "yes" ; then
+    eval "rpath=\"$hardcode_libdir_flag_spec\""
+  fi
+  libs="-lfreetype @LIBZ@ @LIBBZ2@ @FT2_EXTRA_LIBS@"
+  if test "${SYSROOT}$libdir" != "/usr/lib" && test "${SYSROOT}$libdir" != "/usr/lib64"; then
+    echo -L${SYSROOT}$libdir $libs
+  else
+    echo $libs
+  fi
+fi
+
+if test "$echo_libtool" = "yes" ; then
+  convlib="libfreetype.la"
+  echo ${SYSROOT}$libdir/$convlib
+fi
+
+# EOF
diff --git a/builds/unix/freetype2.in b/builds/unix/freetype2.in
new file mode 100644 (file)
index 0000000..b731800
--- /dev/null
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: FreeType 2
+Description: A free, high-quality, and portable font engine.
+Version: @ft_version@
+Requires:
+Libs: -L${libdir} -lfreetype
+Libs.private: @LIBZ@ @LIBBZ2@ @FT2_EXTRA_LIBS@
+Cflags: -I${includedir}/freetype2 -I${includedir}
diff --git a/builds/unix/freetype2.m4 b/builds/unix/freetype2.m4
new file mode 100644 (file)
index 0000000..3d0ecb3
--- /dev/null
@@ -0,0 +1,194 @@
+# Configure paths for FreeType2
+# Marcelo Magallon 2001-10-26, based on gtk.m4 by Owen Taylor
+#
+# Copyright 2001, 2003, 2007, 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.
+#
+# As a special exception to the FreeType project license, this file may be
+# distributed as part of a program that contains a configuration script
+# generated by Autoconf, under the same distribution terms as the rest of
+# that program.
+#
+# serial 3
+
+# AC_CHECK_FT2([MINIMUM-VERSION [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
+# Test for FreeType 2, and define FT2_CFLAGS and FT2_LIBS.
+# MINIMUM-VERSION is what libtool reports; the default is `7.0.1' (this is
+# FreeType 2.0.4).
+#
+AC_DEFUN([AC_CHECK_FT2],
+  [# Get the cflags and libraries from the freetype-config script
+   #
+   AC_ARG_WITH([ft-prefix],
+     dnl don't quote AS_HELP_STRING!
+     AS_HELP_STRING([--with-ft-prefix=PREFIX],
+                    [Prefix where FreeType is installed (optional)]),
+     [ft_config_prefix="$withval"],
+     [ft_config_prefix=""])
+
+   AC_ARG_WITH([ft-exec-prefix],
+     dnl don't quote AS_HELP_STRING!
+     AS_HELP_STRING([--with-ft-exec-prefix=PREFIX],
+                    [Exec prefix where FreeType is installed (optional)]),
+     [ft_config_exec_prefix="$withval"],
+     [ft_config_exec_prefix=""])
+
+   AC_ARG_ENABLE([freetypetest],
+     dnl don't quote AS_HELP_STRING!
+     AS_HELP_STRING([--disable-freetypetest],
+                    [Do not try to compile and run a test FreeType program]),
+     [],
+     [enable_fttest=yes])
+
+   if test x$ft_config_exec_prefix != x ; then
+     ft_config_args="$ft_config_args --exec-prefix=$ft_config_exec_prefix"
+     if test x${FT2_CONFIG+set} != xset ; then
+       FT2_CONFIG=$ft_config_exec_prefix/bin/freetype-config
+     fi
+   fi
+
+   if test x$ft_config_prefix != x ; then
+     ft_config_args="$ft_config_args --prefix=$ft_config_prefix"
+     if test x${FT2_CONFIG+set} != xset ; then
+       FT2_CONFIG=$ft_config_prefix/bin/freetype-config
+     fi
+   fi
+
+   if test "x$FT2_CONFIG" = x ; then
+     AC_PATH_PROG([FT2_CONFIG], [freetype-config], [no])
+   fi
+
+   min_ft_version=m4_if([$1], [], [7.0.1], [$1])
+   AC_MSG_CHECKING([for FreeType -- version >= $min_ft_version])
+   no_ft=""
+   if test "$FT2_CONFIG" = "no" ; then
+     no_ft=yes
+   else
+     FT2_CFLAGS=`$FT2_CONFIG $ft_config_args --cflags`
+     FT2_LIBS=`$FT2_CONFIG $ft_config_args --libs`
+     ft_config_major_version=`$FT2_CONFIG $ft_config_args --version | \
+       sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+     ft_config_minor_version=`$FT2_CONFIG $ft_config_args --version | \
+       sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+     ft_config_micro_version=`$FT2_CONFIG $ft_config_args --version | \
+       sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+     ft_min_major_version=`echo $min_ft_version | \
+       sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+     ft_min_minor_version=`echo $min_ft_version | \
+       sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+     ft_min_micro_version=`echo $min_ft_version | \
+       sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+     if test x$enable_fttest = xyes ; then
+       ft_config_is_lt=""
+       if test $ft_config_major_version -lt $ft_min_major_version ; then
+         ft_config_is_lt=yes
+       else
+         if test $ft_config_major_version -eq $ft_min_major_version ; then
+           if test $ft_config_minor_version -lt $ft_min_minor_version ; then
+             ft_config_is_lt=yes
+           else
+             if test $ft_config_minor_version -eq $ft_min_minor_version ; then
+               if test $ft_config_micro_version -lt $ft_min_micro_version ; then
+                 ft_config_is_lt=yes
+               fi
+             fi
+           fi
+         fi
+       fi
+       if test x$ft_config_is_lt = xyes ; then
+         no_ft=yes
+       else
+         ac_save_CFLAGS="$CFLAGS"
+         ac_save_LIBS="$LIBS"
+         CFLAGS="$CFLAGS $FT2_CFLAGS"
+         LIBS="$FT2_LIBS $LIBS"
+
+         #
+         # Sanity checks for the results of freetype-config to some extent.
+         #
+         AC_RUN_IFELSE([
+             AC_LANG_SOURCE([[
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main()
+{
+  FT_Library library;
+  FT_Error  error;
+
+  error = FT_Init_FreeType(&library);
+
+  if (error)
+    return 1;
+  else
+  {
+    FT_Done_FreeType(library);
+    return 0;
+  }
+}
+
+             ]])
+           ],
+           [],
+           [no_ft=yes],
+           [echo $ECHO_N "cross compiling; assuming OK... $ECHO_C"])
+
+         CFLAGS="$ac_save_CFLAGS"
+         LIBS="$ac_save_LIBS"
+       fi             # test $ft_config_version -lt $ft_min_version
+     fi               # test x$enable_fttest = xyes
+   fi                 # test "$FT2_CONFIG" = "no"
+
+   if test x$no_ft = x ; then
+     AC_MSG_RESULT([yes])
+     m4_if([$2], [], [:], [$2])
+   else
+     AC_MSG_RESULT([no])
+     if test "$FT2_CONFIG" = "no" ; then
+       AC_MSG_WARN([
+
+  The freetype-config script installed by FreeType 2 could not be found.
+  If FreeType 2 was installed in PREFIX, make sure PREFIX/bin is in
+  your path, or set the FT2_CONFIG environment variable to the
+  full path to freetype-config.
+       ])
+     else
+       if test x$ft_config_is_lt = xyes ; then
+         AC_MSG_WARN([
+
+  Your installed version of the FreeType 2 library is too old.
+  If you have different versions of FreeType 2, make sure that
+  correct values for --with-ft-prefix or --with-ft-exec-prefix
+  are used, or set the FT2_CONFIG environment variable to the
+  full path to freetype-config.
+         ])
+       else
+         AC_MSG_WARN([
+
+  The FreeType test program failed to run.  If your system uses
+  shared libraries and they are installed outside the normal
+  system library path, make sure the variable LD_LIBRARY_PATH
+  (or whatever is appropriate for your system) is correctly set.
+         ])
+       fi
+     fi
+
+     FT2_CFLAGS=""
+     FT2_LIBS=""
+     m4_if([$3], [], [:], [$3])
+   fi
+
+   AC_SUBST([FT2_CFLAGS])
+   AC_SUBST([FT2_LIBS])])
+
+# end of freetype2.m4
diff --git a/builds/unix/ft-munmap.m4 b/builds/unix/ft-munmap.m4
new file mode 100644 (file)
index 0000000..68b3361
--- /dev/null
@@ -0,0 +1,32 @@
+## FreeType specific autoconf tests
+#
+# Copyright 2002, 2003, 2004 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.
+
+# serial 2
+
+AC_DEFUN([FT_MUNMAP_PARAM],
+  [AC_MSG_CHECKING([for munmap's first parameter type])
+   AC_COMPILE_IFELSE([
+       AC_LANG_SOURCE([[
+
+#include <unistd.h>
+#include <sys/mman.h>
+int munmap(void *, size_t);
+
+       ]])
+     ],
+     [AC_MSG_RESULT([void *])
+      AC_DEFINE([MUNMAP_USES_VOIDP],
+        [],
+        [Define to 1 if the first argument of munmap is of type void *])],
+     [AC_MSG_RESULT([char *])])
+  ])
+
+# end of ft-munmap.m4
diff --git a/builds/unix/ft2unix.h b/builds/unix/ft2unix.h
new file mode 100644 (file)
index 0000000..6a3b8d9
--- /dev/null
@@ -0,0 +1,61 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ft2build.h                                                             */
+/*                                                                         */
+/*    Build macros of the FreeType 2 library.                              */
+/*                                                                         */
+/*  Copyright 1996-2001, 2003, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This is a Unix-specific version of <ft2build.h> that should be used   */
+  /* exclusively *after* installation of the library.                      */
+  /*                                                                       */
+  /* It assumes that `/usr/local/include/freetype2' (or whatever is        */
+  /* returned by the `freetype-config --cflags' or `pkg-config --cflags'   */
+  /* command) is in your compilation include path.                         */
+  /*                                                                       */
+  /* We don't need to do anything special in this release.  However, for   */
+  /* a future FreeType 2 release, the following installation changes will  */
+  /* be performed:                                                         */
+  /*                                                                       */
+  /*   - The contents of `freetype-2.x/include/freetype' will be installed */
+  /*     to `/usr/local/include/freetype2' instead of                      */
+  /*     `/usr/local/include/freetype2/freetype'.                          */
+  /*                                                                       */
+  /*   - This file will #include <freetype2/config/ftheader.h>, instead    */
+  /*     of <freetype/config/ftheader.h>.                                  */
+  /*                                                                       */
+  /*   - The contents of `ftheader.h' will be processed with `sed' to      */
+  /*     replace all `<freetype/xxx>' with `<freetype2/xxx>'.              */
+  /*                                                                       */
+  /*   - Adding `/usr/local/include/freetype2' to your compilation include */
+  /*     path will not be necessary anymore.                               */
+  /*                                                                       */
+  /* These changes will be transparent to client applications which use    */
+  /* freetype-config (or pkg-config).  No modifications will be necessary  */
+  /* to compile with the new scheme.                                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FT2_BUILD_UNIX_H__
+#define __FT2_BUILD_UNIX_H__
+
+  /* `<prefix>/include/freetype2' must be in your current inclusion path */
+#include <freetype/config/ftheader.h>
+
+#endif /* __FT2_BUILD_UNIX_H__ */
+
+
+/* END */
diff --git a/builds/unix/ftconfig.in b/builds/unix/ftconfig.in
new file mode 100644 (file)
index 0000000..9531afd
--- /dev/null
@@ -0,0 +1,544 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftconfig.in                                                            */
+/*                                                                         */
+/*    UNIX-specific configuration file (specification only).               */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006-2009, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This header file contains a number of macro definitions that are used */
+  /* by the rest of the engine.  Most of the macros here are automatically */
+  /* determined at compile time, and you should not need to change it to   */
+  /* port FreeType, except to compile the library with a non-ANSI          */
+  /* compiler.                                                             */
+  /*                                                                       */
+  /* Note however that if some specific modifications are needed, we       */
+  /* advise you to place a modified copy in your build directory.          */
+  /*                                                                       */
+  /* The build directory is usually `freetype/builds/<system>', and        */
+  /* contains system-specific files that are always included first when    */
+  /* building the library.                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTCONFIG_H__
+#define __FTCONFIG_H__
+
+#include <ft2build.h>
+#include FT_CONFIG_OPTIONS_H
+#include FT_CONFIG_STANDARD_LIBRARY_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*               PLATFORM-SPECIFIC CONFIGURATION MACROS                  */
+  /*                                                                       */
+  /* These macros can be toggled to suit a specific system.  The current   */
+  /* ones are defaults used to compile FreeType in an ANSI C environment   */
+  /* (16bit compilers are also supported).  Copy this file to your own     */
+  /* `freetype/builds/<system>' directory, and edit it to port the engine. */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#undef HAVE_UNISTD_H
+#undef HAVE_FCNTL_H
+#undef HAVE_STDINT_H
+
+
+  /* There are systems (like the Texas Instruments 'C54x) where a `char' */
+  /* has 16 bits.  ANSI C says that sizeof(char) is always 1.  Since an  */
+  /* `int' has 16 bits also for this system, sizeof(int) gives 1 which   */
+  /* is probably unexpected.                                             */
+  /*                                                                     */
+  /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a      */
+  /* `char' type.                                                        */
+
+#ifndef FT_CHAR_BIT
+#define FT_CHAR_BIT  CHAR_BIT
+#endif
+
+
+#undef FT_USE_AUTOCONF_SIZEOF_TYPES
+#ifdef FT_USE_AUTOCONF_SIZEOF_TYPES
+
+#undef SIZEOF_INT
+#undef SIZEOF_LONG
+#define FT_SIZEOF_INT  SIZEOF_INT
+#define FT_SIZEOF_LONG SIZEOF_LONG
+
+#else /* !FT_USE_AUTOCONF_SIZEOF_TYPES */
+
+  /* Following cpp computation of the bit length of int and long */
+  /* is copied from default include/freetype/config/ftconfig.h.  */
+  /* If any improvement is required for this file, it should be  */
+  /* applied to the original header file for the builders that   */
+  /* does not use configure script.                              */
+
+  /* The size of an `int' type.  */
+#if                                 FT_UINT_MAX == 0xFFFFUL
+#define FT_SIZEOF_INT  (16 / FT_CHAR_BIT)
+#elif                               FT_UINT_MAX == 0xFFFFFFFFUL
+#define FT_SIZEOF_INT  (32 / FT_CHAR_BIT)
+#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL
+#define FT_SIZEOF_INT  (64 / FT_CHAR_BIT)
+#else
+#error "Unsupported size of `int' type!"
+#endif
+
+  /* The size of a `long' type.  A five-byte `long' (as used e.g. on the */
+  /* DM642) is recognized but avoided.                                   */
+#if                                  FT_ULONG_MAX == 0xFFFFFFFFUL
+#define FT_SIZEOF_LONG  (32 / FT_CHAR_BIT)
+#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL
+#define FT_SIZEOF_LONG  (32 / FT_CHAR_BIT)
+#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL
+#define FT_SIZEOF_LONG  (64 / FT_CHAR_BIT)
+#else
+#error "Unsupported size of `long' type!"
+#endif
+
+#endif /* !FT_USE_AUTOCONF_SIZEOF_TYPES */
+
+
+  /* FT_UNUSED is a macro used to indicate that a given parameter is not  */
+  /* used -- this is only used to get rid of unpleasant compiler warnings */
+#ifndef FT_UNUSED
+#define FT_UNUSED( arg )  ( (arg) = (arg) )
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                     AUTOMATIC CONFIGURATION MACROS                    */
+  /*                                                                       */
+  /* These macros are computed from the ones defined above.  Don't touch   */
+  /* their definition, unless you know precisely what you are doing.  No   */
+  /* porter should need to mess with them.                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Mac support                                                           */
+  /*                                                                       */
+  /*   This is the only necessary change, so it is defined here instead    */
+  /*   providing a new configuration file.                                 */
+  /*                                                                       */
+#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) )
+  /* no Carbon frameworks for 64bit 10.4.x */
+  /* AvailabilityMacros.h is available since Mac OS X 10.2,        */
+  /* so guess the system version by maximum errno before inclusion */
+#include <errno.h>
+#ifdef ECANCELED /* defined since 10.2 */
+#include "AvailabilityMacros.h"
+#endif
+#if defined( __LP64__ ) && \
+    ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 )
+/undef FT_MACINTOSH
+#endif
+
+#elif defined( __SC__ ) || defined( __MRC__ )
+  /* Classic MacOS compilers */
+#include "ConditionalMacros.h"
+#if TARGET_OS_MAC
+#define FT_MACINTOSH 1
+#endif
+
+#endif
+
+
+  /* Fix compiler warning with sgi compiler */
+#if defined( __sgi ) && !defined( __GNUC__ )
+#if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 )
+#pragma set woff 3505
+#endif
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* IntN types                                                            */
+  /*                                                                       */
+  /*   Used to guarantee the size of some specific integers.               */
+  /*                                                                       */
+  typedef signed short    FT_Int16;
+  typedef unsigned short  FT_UInt16;
+
+#if FT_SIZEOF_INT == 4
+
+  typedef signed int      FT_Int32;
+  typedef unsigned int    FT_UInt32;
+
+#elif FT_SIZEOF_LONG == 4
+
+  typedef signed long     FT_Int32;
+  typedef unsigned long   FT_UInt32;
+
+#else
+#error "no 32bit type found -- please check your configuration files"
+#endif
+
+
+  /* look up an integer type that is at least 32 bits */
+#if FT_SIZEOF_INT >= 4
+
+  typedef int            FT_Fast;
+  typedef unsigned int   FT_UFast;
+
+#elif FT_SIZEOF_LONG >= 4
+
+  typedef long           FT_Fast;
+  typedef unsigned long  FT_UFast;
+
+#endif
+
+
+  /* determine whether we have a 64-bit int type for platforms without */
+  /* Autoconf                                                          */
+#if FT_SIZEOF_LONG == 8
+
+  /* FT_LONG64 must be defined if a 64-bit type is available */
+#define FT_LONG64
+#define FT_INT64  long
+
+#elif defined( _MSC_VER ) && _MSC_VER >= 900  /* Visual C++ (and Intel C++) */
+
+  /* this compiler provides the __int64 type */
+#define FT_LONG64
+#define FT_INT64  __int64
+
+#elif defined( __BORLANDC__ )  /* Borland C++ */
+
+  /* XXXX: We should probably check the value of __BORLANDC__ in order */
+  /*       to test the compiler version.                               */
+
+  /* this compiler provides the __int64 type */
+#define FT_LONG64
+#define FT_INT64  __int64
+
+#elif defined( __WATCOMC__ )   /* Watcom C++ */
+
+  /* Watcom doesn't provide 64-bit data types */
+
+#elif defined( __MWERKS__ )    /* Metrowerks CodeWarrior */
+
+#define FT_LONG64
+#define FT_INT64  long long int
+
+#elif defined( __GNUC__ )
+
+  /* GCC provides the `long long' type */
+#define FT_LONG64
+#define FT_INT64  long long int
+
+#endif /* FT_SIZEOF_LONG == 8 */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* A 64-bit data type will create compilation problems if you compile    */
+  /* in strict ANSI mode.  To avoid them, we disable its use if __STDC__   */
+  /* is defined.  You can however ignore this rule by defining the         */
+  /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro.                     */
+  /*                                                                       */
+#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 )
+
+#ifdef __STDC__
+
+  /* Undefine the 64-bit macros in strict ANSI compilation mode.  */
+  /* Since `#undef' doesn't survive in configuration header files */
+  /* we use the postprocessing facility of AC_CONFIG_HEADERS to   */
+  /* replace the leading `/' with `#'.                            */
+/undef FT_LONG64
+/undef FT_INT64
+
+#endif /* __STDC__ */
+
+#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */
+
+
+#define FT_BEGIN_STMNT  do {
+#define FT_END_STMNT    } while ( 0 )
+#define FT_DUMMY_STMNT  FT_BEGIN_STMNT FT_END_STMNT
+
+
+#ifndef  FT_CONFIG_OPTION_NO_ASSEMBLER
+  /* Provide assembler fragments for performance-critical functions. */
+  /* These must be defined `static __inline__' with GCC.             */
+
+#if defined( __CC_ARM ) || defined( __ARMCC__ )  /* RVCT */
+#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm
+
+  /* documentation is in freetype.h */
+
+  static __inline FT_Int32
+  FT_MulFix_arm( FT_Int32  a,
+                 FT_Int32  b )
+  {
+    register FT_Int32  t, t2;
+
+
+    __asm
+    {
+      smull t2, t,  b,  a           /* (lo=t2,hi=t) = a*b */
+      mov   a,  t,  asr #31         /* a   = (hi >> 31) */
+      add   a,  a,  #0x8000         /* a  += 0x8000 */
+      adds  t2, t2, a               /* t2 += a */
+      adc   t,  t,  #0              /* t  += carry */
+      mov   a,  t2, lsr #16         /* a   = t2 >> 16 */
+      orr   a,  a,  t,  lsl #16     /* a  |= t << 16 */
+    }
+    return a;
+  }
+
+#endif /* __CC_ARM || __ARMCC__ */
+
+
+#ifdef __GNUC__
+
+#if defined( __arm__ ) && !defined( __thumb__ )    && \
+    !( defined( __CC_ARM ) || defined( __ARMCC__ ) )
+#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm
+
+  /* documentation is in freetype.h */
+
+  static __inline__ FT_Int32
+  FT_MulFix_arm( FT_Int32  a,
+                 FT_Int32  b )
+  {
+    register FT_Int32  t, t2;
+
+
+    __asm__ __volatile__ (
+      "smull  %1, %2, %4, %3\n\t"       /* (lo=%1,hi=%2) = a*b */
+      "mov    %0, %2, asr #31\n\t"      /* %0  = (hi >> 31) */
+      "add    %0, %0, #0x8000\n\t"      /* %0 += 0x8000 */
+      "adds   %1, %1, %0\n\t"           /* %1 += %0 */
+      "adc    %2, %2, #0\n\t"           /* %2 += carry */
+      "mov    %0, %1, lsr #16\n\t"      /* %0  = %1 >> 16 */
+      "orr    %0, %0, %2, lsl #16\n\t"  /* %0 |= %2 << 16 */
+      : "=r"(a), "=&r"(t2), "=&r"(t)
+      : "r"(a), "r"(b) );
+    return a;
+  }
+
+#endif /* __arm__ && !__thumb__ && !( __CC_ARM || __ARMCC__ ) */
+
+#if defined( __i386__ )
+#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386
+
+  /* documentation is in freetype.h */
+
+  static __inline__ FT_Int32
+  FT_MulFix_i386( FT_Int32  a,
+                  FT_Int32  b )
+  {
+    register FT_Int32  result;
+
+
+    __asm__ __volatile__ (
+      "imul  %%edx\n"
+      "movl  %%edx, %%ecx\n"
+      "sarl  $31, %%ecx\n"
+      "addl  $0x8000, %%ecx\n"
+      "addl  %%ecx, %%eax\n"
+      "adcl  $0, %%edx\n"
+      "shrl  $16, %%eax\n"
+      "shll  $16, %%edx\n"
+      "addl  %%edx, %%eax\n"
+      : "=a"(result), "=d"(b)
+      : "a"(a), "d"(b)
+      : "%ecx", "cc" );
+    return result;
+  }
+
+#endif /* i386 */
+
+#endif /* __GNUC__ */
+
+
+#ifdef _MSC_VER /* Visual C++ */
+
+#ifdef _M_IX86
+
+#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386
+
+  /* documentation is in freetype.h */
+
+  static __inline FT_Int32
+  FT_MulFix_i386( FT_Int32  a,
+                  FT_Int32  b )
+  {
+    register FT_Int32  result;
+
+    __asm
+    {
+      mov eax, a
+      mov edx, b
+      imul edx
+      mov ecx, edx
+      sar ecx, 31
+      add ecx, 8000h
+      add eax, ecx
+      adc edx, 0
+      shr eax, 16
+      shl edx, 16
+      add eax, edx
+      mov result, eax
+    }
+    return result;
+  }
+
+#endif /* _M_IX86 */
+
+#endif /* _MSC_VER */
+
+#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+
+#ifdef FT_CONFIG_OPTION_INLINE_MULFIX
+#ifdef FT_MULFIX_ASSEMBLER
+#define FT_MULFIX_INLINED  FT_MULFIX_ASSEMBLER
+#endif
+#endif
+
+
+#ifdef FT_MAKE_OPTION_SINGLE_OBJECT
+
+#define FT_LOCAL( x )      static  x
+#define FT_LOCAL_DEF( x )  static  x
+
+#else
+
+#ifdef __cplusplus
+#define FT_LOCAL( x )      extern "C"  x
+#define FT_LOCAL_DEF( x )  extern "C"  x
+#else
+#define FT_LOCAL( x )      extern  x
+#define FT_LOCAL_DEF( x )  x
+#endif
+
+#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */
+
+
+#ifndef FT_BASE
+
+#ifdef __cplusplus
+#define FT_BASE( x )  extern "C"  x
+#else
+#define FT_BASE( x )  extern  x
+#endif
+
+#endif /* !FT_BASE */
+
+
+#ifndef FT_BASE_DEF
+
+#ifdef __cplusplus
+#define FT_BASE_DEF( x )  x
+#else
+#define FT_BASE_DEF( x )  x
+#endif
+
+#endif /* !FT_BASE_DEF */
+
+
+#ifndef FT_EXPORT
+
+#ifdef __cplusplus
+#define FT_EXPORT( x )  extern "C"  x
+#else
+#define FT_EXPORT( x )  extern  x
+#endif
+
+#endif /* !FT_EXPORT */
+
+
+#ifndef FT_EXPORT_DEF
+
+#ifdef __cplusplus
+#define FT_EXPORT_DEF( x )  extern "C"  x
+#else
+#define FT_EXPORT_DEF( x )  extern  x
+#endif
+
+#endif /* !FT_EXPORT_DEF */
+
+
+#ifndef FT_EXPORT_VAR
+
+#ifdef __cplusplus
+#define FT_EXPORT_VAR( x )  extern "C"  x
+#else
+#define FT_EXPORT_VAR( x )  extern  x
+#endif
+
+#endif /* !FT_EXPORT_VAR */
+
+  /* The following macros are needed to compile the library with a   */
+  /* C++ compiler and with 16bit compilers.                          */
+  /*                                                                 */
+
+  /* This is special.  Within C++, you must specify `extern "C"' for */
+  /* functions which are used via function pointers, and you also    */
+  /* must do that for structures which contain function pointers to  */
+  /* assure C linkage -- it's not possible to have (local) anonymous */
+  /* functions which are accessed by (global) function pointers.     */
+  /*                                                                 */
+  /*                                                                 */
+  /* FT_CALLBACK_DEF is used to _define_ a callback function.        */
+  /*                                                                 */
+  /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */
+  /* contains pointers to callback functions.                        */
+  /*                                                                 */
+  /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable   */
+  /* that contains pointers to callback functions.                   */
+  /*                                                                 */
+  /*                                                                 */
+  /* Some 16bit compilers have to redefine these macros to insert    */
+  /* the infamous `_cdecl' or `__fastcall' declarations.             */
+  /*                                                                 */
+#ifndef FT_CALLBACK_DEF
+#ifdef __cplusplus
+#define FT_CALLBACK_DEF( x )  extern "C"  x
+#else
+#define FT_CALLBACK_DEF( x )  static  x
+#endif
+#endif /* FT_CALLBACK_DEF */
+
+#ifndef FT_CALLBACK_TABLE
+#ifdef __cplusplus
+#define FT_CALLBACK_TABLE      extern "C"
+#define FT_CALLBACK_TABLE_DEF  extern "C"
+#else
+#define FT_CALLBACK_TABLE      extern
+#define FT_CALLBACK_TABLE_DEF  /* nothing */
+#endif
+#endif /* FT_CALLBACK_TABLE */
+
+
+FT_END_HEADER
+
+
+#endif /* __FTCONFIG_H__ */
+
+
+/* END */
diff --git a/builds/unix/ftsystem.c b/builds/unix/ftsystem.c
new file mode 100644 (file)
index 0000000..95f8271
--- /dev/null
@@ -0,0 +1,419 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsystem.c                                                             */
+/*                                                                         */
+/*    Unix-specific FreeType low-level system interface (body).            */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2008 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+  /* we use our special ftconfig.h file, not the standard one */
+#include <ftconfig.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_SYSTEM_H
+#include FT_ERRORS_H
+#include FT_TYPES_H
+#include FT_INTERNAL_STREAM_H
+
+  /* memory-mapping includes and definitions */
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <sys/mman.h>
+#ifndef MAP_FILE
+#define MAP_FILE  0x00
+#endif
+
+#ifdef MUNMAP_USES_VOIDP
+#define MUNMAP_ARG_CAST  void *
+#else
+#define MUNMAP_ARG_CAST  char *
+#endif
+
+#ifdef NEED_MUNMAP_DECL
+
+#ifdef __cplusplus
+  extern "C"
+#else
+  extern
+#endif
+  int
+  munmap( char*  addr,
+          int    len );
+
+#define MUNMAP_ARG_CAST  char *
+
+#endif /* NEED_DECLARATION_MUNMAP */
+
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                       MEMORY MANAGEMENT INTERFACE                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_alloc                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The memory allocation function.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory :: A pointer to the memory object.                          */
+  /*                                                                       */
+  /*    size   :: The requested size in bytes.                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The address of newly allocated block.                              */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void* )
+  ft_alloc( FT_Memory  memory,
+            long       size )
+  {
+    FT_UNUSED( memory );
+
+    return malloc( size );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_realloc                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The memory reallocation function.                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory   :: A pointer to the memory object.                        */
+  /*                                                                       */
+  /*    cur_size :: The current size of the allocated memory block.        */
+  /*                                                                       */
+  /*    new_size :: The newly requested size in bytes.                     */
+  /*                                                                       */
+  /*    block    :: The current address of the block in memory.            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The address of the reallocated memory block.                       */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void* )
+  ft_realloc( FT_Memory  memory,
+              long       cur_size,
+              long       new_size,
+              void*      block )
+  {
+    FT_UNUSED( memory );
+    FT_UNUSED( cur_size );
+
+    return realloc( block, new_size );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_free                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The memory release function.                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory :: A pointer to the memory object.                          */
+  /*                                                                       */
+  /*    block  :: The address of block in memory to be freed.              */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void )
+  ft_free( FT_Memory  memory,
+           void*      block )
+  {
+    FT_UNUSED( memory );
+
+    free( block );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                     RESOURCE MANAGEMENT INTERFACE                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_io
+
+  /* We use the macro STREAM_FILE for convenience to extract the       */
+  /* system-specific stream handle from a given FreeType stream object */
+#define STREAM_FILE( stream )  ( (FILE*)stream->descriptor.pointer )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_close_stream_by_munmap                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The function to close a stream which is opened by mmap.            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: A pointer to the stream object.                          */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void )
+  ft_close_stream_by_munmap( FT_Stream  stream )
+  {
+    munmap( (MUNMAP_ARG_CAST)stream->descriptor.pointer, stream->size );
+
+    stream->descriptor.pointer = NULL;
+    stream->size               = 0;
+    stream->base               = 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_close_stream_by_free                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The function to close a stream which is created by ft_alloc.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: A pointer to the stream object.                          */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void )
+  ft_close_stream_by_free( FT_Stream  stream )
+  {
+    ft_free( NULL, stream->descriptor.pointer );
+
+    stream->descriptor.pointer = NULL;
+    stream->size               = 0;
+    stream->base               = 0;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_Open( FT_Stream    stream,
+                  const char*  filepathname )
+  {
+    int          file;
+    struct stat  stat_buf;
+
+
+    if ( !stream )
+      return FT_Err_Invalid_Stream_Handle;
+
+    /* open the file */
+    file = open( filepathname, O_RDONLY );
+    if ( file < 0 )
+    {
+      FT_ERROR(( "FT_Stream_Open:" ));
+      FT_ERROR(( " could not open `%s'\n", filepathname ));
+      return FT_Err_Cannot_Open_Resource;
+    }
+
+    /* Here we ensure that a "fork" will _not_ duplicate   */
+    /* our opened input streams on Unix.  This is critical */
+    /* since it avoids some (possible) access control      */
+    /* issues and cleans up the kernel file table a bit.   */
+    /*                                                     */
+#ifdef F_SETFD
+#ifdef FD_CLOEXEC
+    (void)fcntl( file, F_SETFD, FD_CLOEXEC );
+#else
+    (void)fcntl( file, F_SETFD, 1 );
+#endif /* FD_CLOEXEC */
+#endif /* F_SETFD */
+
+    if ( fstat( file, &stat_buf ) < 0 )
+    {
+      FT_ERROR(( "FT_Stream_Open:" ));
+      FT_ERROR(( " could not `fstat' file `%s'\n", filepathname ));
+      goto Fail_Map;
+    }
+
+    /* XXX: TODO -- real 64bit platform support                        */
+    /*                                                                 */
+    /* `stream->size' is typedef'd to unsigned long (in                */
+    /* freetype/ftsystem.h); `stat_buf.st_size', however, is usually   */
+    /* typedef'd to off_t (in sys/stat.h).                             */
+    /* On some platforms, the former is 32bit and the latter is 64bit. */
+    /* To avoid overflow caused by fonts in huge files larger than     */
+    /* 2GB, do a test.  Temporary fix proposed by Sean McBride.        */
+    /*                                                                 */
+    if ( stat_buf.st_size > LONG_MAX )
+    {
+      FT_ERROR(( "FT_Stream_Open: file is too big\n" ));
+      goto Fail_Map;
+    }
+    else if ( stat_buf.st_size == 0 )
+    {
+      FT_ERROR(( "FT_Stream_Open: zero-length file\n" ));
+      goto Fail_Map;
+    }
+
+    /* This cast potentially truncates a 64bit to 32bit! */
+    stream->size = (unsigned long)stat_buf.st_size;
+    stream->pos  = 0;
+    stream->base = (unsigned char *)mmap( NULL,
+                                          stream->size,
+                                          PROT_READ,
+                                          MAP_FILE | MAP_PRIVATE,
+                                          file,
+                                          0 );
+
+    /* on some RTOS, mmap might return 0 */
+    if ( (long)stream->base != -1 && stream->base != NULL )
+      stream->close = ft_close_stream_by_munmap;
+    else
+    {
+      ssize_t  total_read_count;
+
+
+      FT_ERROR(( "FT_Stream_Open:" ));
+      FT_ERROR(( " could not `mmap' file `%s'\n", filepathname ));
+
+      stream->base = (unsigned char*)ft_alloc( NULL, stream->size );
+
+      if ( !stream->base )
+      {
+        FT_ERROR(( "FT_Stream_Open:" ));
+        FT_ERROR(( " could not `alloc' memory\n" ));
+        goto Fail_Map;
+      }
+
+      total_read_count = 0;
+      do {
+        ssize_t  read_count;
+
+
+        read_count = read( file,
+                           stream->base + total_read_count,
+                           stream->size - total_read_count );
+
+        if ( read_count <= 0 )
+        {
+          if ( read_count == -1 && errno == EINTR )
+            continue;
+
+          FT_ERROR(( "FT_Stream_Open:" ));
+          FT_ERROR(( " error while `read'ing file `%s'\n", filepathname ));
+          goto Fail_Read;
+        }
+
+        total_read_count += read_count;
+
+      } while ( (unsigned long)total_read_count != stream->size );
+
+      stream->close = ft_close_stream_by_free;
+    }
+
+    close( file );
+
+    stream->descriptor.pointer = stream->base;
+    stream->pathname.pointer   = (char*)filepathname;
+
+    stream->read = 0;
+
+    FT_TRACE1(( "FT_Stream_Open:" ));
+    FT_TRACE1(( " opened `%s' (%d bytes) successfully\n",
+                filepathname, stream->size ));
+
+    return FT_Err_Ok;
+
+  Fail_Read:
+    ft_free( NULL, stream->base );
+
+  Fail_Map:
+    close( file );
+
+    stream->base = NULL;
+    stream->size = 0;
+    stream->pos  = 0;
+
+    return FT_Err_Cannot_Open_Stream;
+  }
+
+
+#ifdef FT_DEBUG_MEMORY
+
+  extern FT_Int
+  ft_mem_debug_init( FT_Memory  memory );
+
+  extern void
+  ft_mem_debug_done( FT_Memory  memory );
+
+#endif
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( FT_Memory )
+  FT_New_Memory( void )
+  {
+    FT_Memory  memory;
+
+
+    memory = (FT_Memory)malloc( sizeof ( *memory ) );
+    if ( memory )
+    {
+      memory->user    = 0;
+      memory->alloc   = ft_alloc;
+      memory->realloc = ft_realloc;
+      memory->free    = ft_free;
+#ifdef FT_DEBUG_MEMORY
+      ft_mem_debug_init( memory );
+#endif
+    }
+
+    return memory;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( void )
+  FT_Done_Memory( FT_Memory  memory )
+  {
+#ifdef FT_DEBUG_MEMORY
+    ft_mem_debug_done( memory );
+#endif
+    memory->free( memory, memory );
+  }
+
+
+/* END */
diff --git a/builds/unix/install-sh b/builds/unix/install-sh
new file mode 100755 (executable)
index 0000000..a9244eb
--- /dev/null
@@ -0,0 +1,527 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2011-01-19.21; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""       $nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+       shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+       case $mode in
+         *' '* | *'    '* | *'
+'*       | *'*'* | *'?'* | *'['*)
+           echo "$0: invalid mode: $mode" >&2
+           exit 1;;
+       esac
+       shift;;
+
+    -o) chowncmd="$chownprog $2"
+       shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+       # Protect names problematic for `test' and other utilities.
+       case $dst_arg in
+         -* | [=\(\)!]) dst_arg=./$dst_arg;;
+       esac
+       shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)        shift
+       break;;
+
+    -*)        echo "$0: invalid option: $1" >&2
+       exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+    # Protect names problematic for `test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+       u_plus_rw=
+      else
+       u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+       u_plus_rw=
+      else
+       u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names problematic for `test' and other utilities.
+  case $src in
+    -* | [=\(\)!]) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+    dst=$dst_arg
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+       echo "$0: $dst_arg: Is a directory" >&2
+       exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+       (dirname "$dst") 2>/dev/null ||
+       expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+            X"$dst" : 'X\(//\)[^/]' \| \
+            X"$dst" : 'X\(//\)$' \| \
+            X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+       echo X"$dst" |
+           sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\/\)[^/].*/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\/\)$/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\).*/{
+                  s//\1/
+                  q
+                }
+                s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+       # Create intermediate dirs using mode 755 as modified by the umask.
+       # This is like FreeBSD 'install' as of 1997-10-28.
+       umask=`umask`
+       case $stripcmd.$umask in
+         # Optimize common cases.
+         *[2367][2367]) mkdir_umask=$umask;;
+         .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+         *[0-7])
+           mkdir_umask=`expr $umask + 22 \
+             - $umask % 100 % 40 + $umask % 20 \
+             - $umask % 10 % 4 + $umask % 2
+           `;;
+         *) mkdir_umask=$umask,go-w;;
+       esac
+
+       # With -d, create the new directory with the user-specified mode.
+       # Otherwise, rely on $mkdir_umask.
+       if test -n "$dir_arg"; then
+         mkdir_mode=-m$mode
+       else
+         mkdir_mode=
+       fi
+
+       posix_mkdir=false
+       case $umask in
+         *[123567][0-7][0-7])
+           # POSIX mkdir -p sets u+wx bits regardless of umask, which
+           # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+           ;;
+         *)
+           tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+           trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+           if (umask $mkdir_umask &&
+               exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+           then
+             if test -z "$dir_arg" || {
+                  # Check for POSIX incompatibilities with -m.
+                  # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                  # other-writeable bit of parent directory when it shouldn't.
+                  # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                  ls_ld_tmpdir=`ls -ld "$tmpdir"`
+                  case $ls_ld_tmpdir in
+                    d????-?r-*) different_mode=700;;
+                    d????-?--*) different_mode=755;;
+                    *) false;;
+                  esac &&
+                  $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+                    ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+                    test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                  }
+                }
+             then posix_mkdir=:
+             fi
+             rmdir "$tmpdir/d" "$tmpdir"
+           else
+             # Remove any dirs left behind by ancient mkdir implementations.
+             rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+           fi
+           trap '' 0;;
+       esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+       umask $mkdir_umask &&
+       $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+       /*) prefix='/';;
+       [-=\(\)!]*) prefix='./';;
+       *)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+       test X"$d" = X && continue
+
+       prefix=$prefix$d
+       if test -d "$prefix"; then
+         prefixes=
+       else
+         if $posix_mkdir; then
+           (umask=$mkdir_umask &&
+            $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+           # Don't fail if two instances are running concurrently.
+           test -d "$prefix" || exit 1
+         else
+           case $prefix in
+             *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+             *) qprefix=$prefix;;
+           esac
+           prefixes="$prefixes '$qprefix'"
+         fi
+       fi
+       prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+       # Don't fail if two instances are running concurrently.
+       (umask $mkdir_umask &&
+        eval "\$doit_exec \$mkdirprog $prefixes") ||
+         test -d "$dstdir" || exit 1
+       obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"    2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+       # Now remove or move aside any old file at destination location.
+       # We try this two ways since rm can't unlink itself on some
+       # systems and the destination file might be busy for other
+       # reasons.  In this case, the final cleanup might fail but the new
+       # file should still install successfully.
+       {
+         test ! -f "$dst" ||
+         $doit $rmcmd -f "$dst" 2>/dev/null ||
+         { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+           { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+         } ||
+         { echo "$0: cannot unlink or rename $dst" >&2
+           (exit 1); exit 1
+         }
+       } &&
+
+       # Now rename the file to the real destination.
+       $doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/builds/unix/install.mk b/builds/unix/install.mk
new file mode 100644 (file)
index 0000000..2e5ef08
--- /dev/null
@@ -0,0 +1,97 @@
+#
+# FreeType 2 installation instructions for Unix systems
+#
+
+
+# Copyright 1996-2000, 2002, 2003, 2006 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.
+
+# If you say
+#
+#   make install DESTDIR=/tmp/somewhere/
+#
+# don't forget the final backslash (this command is mainly for package
+# maintainers).
+
+
+.PHONY: install uninstall check
+
+# Unix installation and deinstallation targets.
+#
+# Note that we no longer install internal headers, and we remove any
+# `internal' subdirectory found in `$(includedir)/freetype2/freetype'.
+#
+install: $(PROJECT_LIBRARY)
+       $(MKINSTALLDIRS) $(DESTDIR)$(libdir)                               \
+                         $(DESTDIR)$(libdir)/pkgconfig                     \
+                         $(DESTDIR)$(includedir)/freetype2/freetype/config \
+                         $(DESTDIR)$(includedir)/freetype2/freetype/cache  \
+                         $(DESTDIR)$(bindir)                               \
+                         $(DESTDIR)$(datadir)/aclocal
+       $(LIBTOOL) --mode=install $(INSTALL)                             \
+                                  $(PROJECT_LIBRARY) $(DESTDIR)$(libdir)
+       -for P in $(PUBLIC_H) ; do                           \
+          $(INSTALL_DATA)                                    \
+            $$P $(DESTDIR)$(includedir)/freetype2/freetype ; \
+        done
+       -for P in $(CONFIG_H) ; do                                  \
+          $(INSTALL_DATA)                                           \
+            $$P $(DESTDIR)$(includedir)/freetype2/freetype/config ; \
+        done
+       -$(DELETE) $(DESTDIR)$(includedir)/freetype2/freetype/cache/*
+       -$(DELDIR) $(DESTDIR)$(includedir)/freetype2/freetype/cache
+       -$(DELETE) $(DESTDIR)$(includedir)/freetype2/freetype/internal/*
+       -$(DELDIR) $(DESTDIR)$(includedir)/freetype2/freetype/internal
+       $(INSTALL_DATA) $(BUILD_DIR)/ft2unix.h \
+          $(DESTDIR)$(includedir)/ft2build.h
+       $(INSTALL_DATA) $(OBJ_BUILD)/ftconfig.h                        \
+          $(DESTDIR)$(includedir)/freetype2/freetype/config/ftconfig.h
+       $(INSTALL_DATA) $(OBJ_DIR)/ftmodule.h                          \
+          $(DESTDIR)$(includedir)/freetype2/freetype/config/ftmodule.h
+       $(INSTALL_SCRIPT) -m 755 $(OBJ_BUILD)/freetype-config \
+          $(DESTDIR)$(bindir)/freetype-config
+       $(INSTALL_SCRIPT) -m 644 $(BUILD_DIR)/freetype2.m4 \
+          $(DESTDIR)$(datadir)/aclocal/freetype2.m4
+       $(INSTALL_SCRIPT) -m 644 $(OBJ_BUILD)/freetype2.pc \
+          $(DESTDIR)$(libdir)/pkgconfig/freetype2.pc
+
+
+uninstall:
+       -$(LIBTOOL) --mode=uninstall $(RM) $(DESTDIR)$(libdir)/$(LIBRARY).$A
+       -$(DELETE) $(DESTDIR)$(includedir)/freetype2/freetype/config/*
+       -$(DELDIR) $(DESTDIR)$(includedir)/freetype2/freetype/config
+       -$(DELETE) $(DESTDIR)$(includedir)/freetype2/freetype/*
+       -$(DELDIR) $(DESTDIR)$(includedir)/freetype2/freetype
+       -$(DELDIR) $(DESTDIR)$(includedir)/freetype2
+       -$(DELETE) $(DESTDIR)$(includedir)/ft2build.h
+       -$(DELETE) $(DESTDIR)$(bindir)/freetype-config
+       -$(DELETE) $(DESTDIR)$(datadir)/aclocal/freetype2.m4
+       -$(DELETE) $(DESTDIR)$(libdir)/pkgconfig/freetype2.pc
+
+
+check:
+       @echo There is no validation suite for this package.
+
+
+.PHONY: clean_project_unix distclean_project_unix
+
+# Unix cleaning and distclean rules.
+#
+clean_project_unix:
+       -$(DELETE) $(BASE_OBJECTS) $(OBJ_M) $(OBJ_S)
+       -$(DELETE) $(patsubst %.$O,%.$(SO),$(BASE_OBJECTS) $(OBJ_M) $(OBJ_S)) \
+                   $(CLEAN)
+
+distclean_project_unix: clean_project_unix
+       -$(DELETE) $(PROJECT_LIBRARY)
+       -$(DELETE) $(OBJ_DIR)/.libs/*
+       -$(DELDIR) $(OBJ_DIR)/.libs
+       -$(DELETE) *.orig *~ core *.core $(DISTCLEAN)
+
+# EOF
diff --git a/builds/unix/mkinstalldirs b/builds/unix/mkinstalldirs
new file mode 100755 (executable)
index 0000000..ef7e16f
--- /dev/null
@@ -0,0 +1,161 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+
+scriptversion=2006-05-11.19
+
+# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain.
+#
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+IFS=" ""       $nl"
+errstatus=0
+dirmode=
+
+usage="\
+Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
+
+Create each directory DIR (with mode MODE, if specified), including all
+leading file name components.
+
+Report bugs to <bug-automake@gnu.org>."
+
+# process command line arguments
+while test $# -gt 0 ; do
+  case $1 in
+    -h | --help | --h*)         # -h for help
+      echo "$usage"
+      exit $?
+      ;;
+    -m)                         # -m PERM arg
+      shift
+      test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
+      dirmode=$1
+      shift
+      ;;
+    --version)
+      echo "$0 $scriptversion"
+      exit $?
+      ;;
+    --)                         # stop option processing
+      shift
+      break
+      ;;
+    -*)                         # unknown option
+      echo "$usage" 1>&2
+      exit 1
+      ;;
+    *)                          # first non-opt arg
+      break
+      ;;
+  esac
+done
+
+for file
+do
+  if test -d "$file"; then
+    shift
+  else
+    break
+  fi
+done
+
+case $# in
+  0) exit 0 ;;
+esac
+
+# Solaris 8's mkdir -p isn't thread-safe.  If you mkdir -p a/b and
+# mkdir -p a/c at the same time, both will detect that a is missing,
+# one will create a, then the other will try to create a and die with
+# a "File exists" error.  This is a problem when calling mkinstalldirs
+# from a parallel make.  We use --version in the probe to restrict
+# ourselves to GNU mkdir, which is thread-safe.
+case $dirmode in
+  '')
+    if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+      echo "mkdir -p -- $*"
+      exec mkdir -p -- "$@"
+    else
+      # On NextStep and OpenStep, the `mkdir' command does not
+      # recognize any option.  It will interpret all options as
+      # directories to create, and then abort because `.' already
+      # exists.
+      test -d ./-p && rmdir ./-p
+      test -d ./--version && rmdir ./--version
+    fi
+    ;;
+  *)
+    if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
+       test ! -d ./--version; then
+      echo "mkdir -m $dirmode -p -- $*"
+      exec mkdir -m "$dirmode" -p -- "$@"
+    else
+      # Clean up after NextStep and OpenStep mkdir.
+      for d in ./-m ./-p ./--version "./$dirmode";
+      do
+        test -d $d && rmdir $d
+      done
+    fi
+    ;;
+esac
+
+for file
+do
+  case $file in
+    /*) pathcomp=/ ;;
+    *)  pathcomp= ;;
+  esac
+  oIFS=$IFS
+  IFS=/
+  set fnord $file
+  shift
+  IFS=$oIFS
+
+  for d
+  do
+    test "x$d" = x && continue
+
+    pathcomp=$pathcomp$d
+    case $pathcomp in
+      -*) pathcomp=./$pathcomp ;;
+    esac
+
+    if test ! -d "$pathcomp"; then
+      echo "mkdir $pathcomp"
+
+      mkdir "$pathcomp" || lasterr=$?
+
+      if test ! -d "$pathcomp"; then
+       errstatus=$lasterr
+      else
+       if test ! -z "$dirmode"; then
+         echo "chmod $dirmode $pathcomp"
+         lasterr=
+         chmod "$dirmode" "$pathcomp" || lasterr=$?
+
+         if test ! -z "$lasterr"; then
+           errstatus=$lasterr
+         fi
+       fi
+      fi
+    fi
+
+    pathcomp=$pathcomp/
+  done
+done
+
+exit $errstatus
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/builds/unix/unix-cc.in b/builds/unix/unix-cc.in
new file mode 100644 (file)
index 0000000..b84bc5d
--- /dev/null
@@ -0,0 +1,114 @@
+#
+# FreeType 2 template for Unix-specific compiler definitions
+#
+
+# Copyright 1996-2000, 2002, 2003, 2005, 2006 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.
+
+
+CC           := @CC@
+COMPILER_SEP := $(SEP)
+FT_LIBTOOL_DIR ?= $(BUILD_DIR)
+
+LIBTOOL := $(FT_LIBTOOL_DIR)/libtool
+
+
+# The object file extension (for standard and static libraries).  This can be
+# .o, .tco, .obj, etc., depending on the platform.
+#
+O  := lo
+SO := o
+
+
+# The executable file extension.  Although most Unix platforms use no
+# extension, we copy the extension detected by autoconf.  Useful for cross
+# building on Unix systems for non-Unix systems.
+#
+E := @EXEEXT@
+
+
+# The library file extension (for standard and static libraries).  This can
+# be .a, .lib, etc., depending on the platform.
+#
+A  := la
+SA := a
+
+
+# The name of the final library file.  Note that the DOS-specific Makefile
+# uses a shorter (8.3) name.
+#
+LIBRARY := lib$(PROJECT)
+
+
+# Path inclusion flag.  Some compilers use a different flag than `-I' to
+# specify an additional include path.  Examples are `/i=' or `-J'.
+#
+I := -I
+
+
+# C flag used to define a macro before the compilation of a given source
+# object.  Usually it is `-D' like in `-DDEBUG'.
+#
+D := -D
+
+
+# The link flag used to specify a given library file on link.  Note that
+# this is only used to compile the demo programs, not the library itself.
+#
+L := -l
+
+
+# Target flag.
+#
+T := -o$(space)
+
+
+# C flags
+#
+#   These should concern: debug output, optimization & warnings.
+#
+#   Use the ANSIFLAGS variable to define the compiler flags used to enfore
+#   ANSI compliance.
+#
+#   We use our own FreeType configuration file.
+#
+CPPFLAGS := @CPPFLAGS@
+CFLAGS   := -c @XX_CFLAGS@ @CFLAGS@ -DFT_CONFIG_CONFIG_H="<ftconfig.h>"
+
+# ANSIFLAGS: Put there the flags used to make your compiler ANSI-compliant.
+#
+ANSIFLAGS := @XX_ANSIFLAGS@
+
+# C compiler to use -- we use libtool!
+#
+#
+CCraw := $(CC)
+CC    := $(LIBTOOL) --mode=compile $(CCraw)
+
+# Linker flags.
+#
+LDFLAGS := @LDFLAGS@
+
+
+# export symbols
+#
+CCraw_build  := @CC_BUILD@     # native CC of building system
+E_BUILD      := @EXEEXT_BUILD@ # extension for exexutable on building system
+EXPORTS_LIST := $(OBJ_DIR)/ftexport.sym
+CCexe        := $(CCraw_build) # used to compile `apinames' only
+
+
+# Library linking
+#
+LINK_LIBRARY = $(LIBTOOL) --mode=link $(CCraw) -o $@ $(OBJECTS_LIST) \
+                          -rpath $(libdir) -version-info $(version_info) \
+                          $(LDFLAGS) -no-undefined \
+                          # -export-symbols $(EXPORTS_LIST)
+
+# EOF
diff --git a/builds/unix/unix-def.in b/builds/unix/unix-def.in
new file mode 100644 (file)
index 0000000..e0a7a3a
--- /dev/null
@@ -0,0 +1,85 @@
+#
+# FreeType 2 configuration rules templates for Unix + configure
+#
+
+
+# Copyright 1996-2000, 2002, 2004, 2006, 2008 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.
+
+
+TOP_DIR := $(shell cd $(TOP_DIR); pwd)
+
+DELETE    := @RMF@
+DELDIR    := @RMDIR@
+CAT       := cat
+SEP       := /
+
+# this is used for `make distclean' and `make install'
+OBJ_BUILD ?= $(BUILD_DIR)
+
+# don't use `:=' here since the path stuff will be included after this file
+#
+FTSYS_SRC = @FTSYS_SRC@
+
+INSTALL         := @INSTALL@
+INSTALL_DATA    := @INSTALL_DATA@
+INSTALL_PROGRAM := @INSTALL_PROGRAM@
+INSTALL_SCRIPT  := @INSTALL_SCRIPT@
+MKINSTALLDIRS   := $(BUILD_DIR)/mkinstalldirs
+
+DISTCLEAN += $(OBJ_BUILD)/config.cache    \
+             $(OBJ_BUILD)/config.log      \
+             $(OBJ_BUILD)/config.status   \
+             $(OBJ_BUILD)/unix-def.mk     \
+             $(OBJ_BUILD)/unix-cc.mk      \
+             $(OBJ_BUILD)/ftconfig.h      \
+             $(OBJ_BUILD)/freetype-config \
+             $(OBJ_BUILD)/freetype2.pc    \
+             $(LIBTOOL)                   \
+             $(OBJ_BUILD)/Makefile
+
+
+# Standard installation variables.
+#
+prefix       := @prefix@
+exec_prefix  := @exec_prefix@
+libdir       := @libdir@
+bindir       := @bindir@
+includedir   := @includedir@
+datarootdir  := @datarootdir@
+datadir      := @datadir@
+
+version_info := @version_info@
+
+
+# The directory where all library files are placed.
+#
+# By default, this is the same as $(OBJ_DIR); however, this can be changed
+# to suit particular needs.
+#
+LIB_DIR := $(OBJ_DIR)
+
+# The BASE_SRC macro lists all source files that should be included in
+# src/base/ftbase.c.  When configure sets up CFLAGS to build ftmac.c,
+# ftmac.c should be added to BASE_SRC.
+ftmac_c := @ftmac_c@
+
+# The SYSTEM_ZLIB macro is defined if the user wishes to link dynamically
+# with its system wide zlib. If SYSTEM_ZLIB is 'yes', the zlib part of the
+# ftgzip module is not compiled in.
+SYSTEM_ZLIB := @SYSTEM_ZLIB@
+
+
+# The NO_OUTPUT macro is appended to command lines in order to ignore
+# the output of some programs.
+#
+NO_OUTPUT := 2> /dev/null
+
+
+# EOF
diff --git a/builds/unix/unix-dev.mk b/builds/unix/unix-dev.mk
new file mode 100644 (file)
index 0000000..76bae38
--- /dev/null
@@ -0,0 +1,26 @@
+#
+# FreeType 2 Configuration rules for Unix + GCC
+#
+#   Development version without optimizations & libtool
+#   and no installation.
+#
+
+
+# Copyright 1996-2000, 2003, 2006 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.
+
+
+DEVEL_DIR := $(TOP_DIR)/devel
+
+include $(TOP_DIR)/builds/unix/unixddef.mk
+include $(TOP_DIR)/builds/compiler/gcc-dev.mk
+include $(TOP_DIR)/builds/link_std.mk
+
+
+# EOF
diff --git a/builds/unix/unix-lcc.mk b/builds/unix/unix-lcc.mk
new file mode 100644 (file)
index 0000000..6038e52
--- /dev/null
@@ -0,0 +1,24 @@
+#
+# FreeType 2 Configuration rules for Unix + LCC
+#
+#   Development version without optimizations & libtool
+#   and no installation.
+#
+
+
+# Copyright 1996-2000 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.
+
+
+include $(TOP_DIR)/builds/unix/unixddef.mk
+include $(TOP_DIR)/builds/compiler/unix-lcc.mk
+include $(TOP_DIR)/builds/link_std.mk
+
+
+# EOF
diff --git a/builds/unix/unix.mk b/builds/unix/unix.mk
new file mode 100644 (file)
index 0000000..7f9d9a3
--- /dev/null
@@ -0,0 +1,62 @@
+#
+# FreeType 2 configuration rules for UNIX platforms
+#
+
+
+# Copyright 1996-2000, 2002, 2004, 2006 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.
+
+# We need these declarations here since unix-def.mk is a generated file.
+BUILD_DIR := $(TOP_DIR)/builds/unix
+PLATFORM  := unix
+
+have_mk := $(wildcard $(OBJ_DIR)/unix-def.mk)
+ifneq ($(have_mk),)
+  # We are building FreeType 2 not in the src tree.
+  include $(OBJ_DIR)/unix-def.mk
+  include $(OBJ_DIR)/unix-cc.mk
+else
+  include $(BUILD_DIR)/unix-def.mk
+  include $(BUILD_DIR)/unix-cc.mk
+endif
+
+ifdef BUILD_PROJECT
+
+  .PHONY: clean_project distclean_project
+
+  # Now include the main sub-makefile.  It contains all the rules used to
+  # build the library with the previous variables defined.
+  #
+  include $(TOP_DIR)/builds/$(PROJECT).mk
+
+
+  # The cleanup targets.
+  #
+  clean_project: clean_project_unix
+  distclean_project: distclean_project_unix
+
+
+  # This final rule is used to link all object files into a single library.
+  # It is part of the system-specific sub-Makefile because not all
+  # librarians accept a simple syntax like
+  #
+  #   librarian library_file {list of object files}
+  #
+    $(PROJECT_LIBRARY): $(OBJECTS_LIST)
+  ifdef CLEAN_LIBRARY
+           -$(CLEAN_LIBRARY) $(NO_OUTPUT)
+  endif
+           $(LINK_LIBRARY)
+
+  include $(TOP_DIR)/builds/unix/install.mk
+
+endif
+
+
+# EOF
diff --git a/builds/unix/unixddef.mk b/builds/unix/unixddef.mk
new file mode 100644 (file)
index 0000000..130d6b0
--- /dev/null
@@ -0,0 +1,45 @@
+#
+# FreeType 2 configuration rules templates for
+# development under Unix with no configure script (gcc only)
+#
+
+
+# Copyright 1996-2000, 2003, 2006 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.
+
+
+TOP_DIR := $(shell cd $(TOP_DIR); pwd)
+OBJ_DIR := $(shell cd $(OBJ_DIR); pwd)
+
+PLATFORM := unix
+
+DELETE := rm -f
+CAT    := cat
+SEP    := /
+
+# we use a special devel ftoption.h
+DEVEL_DIR := $(TOP_DIR)/devel
+
+
+# library file name
+#
+LIBRARY := lib$(PROJECT)
+
+
+# The directory where all library files are placed.
+#
+# By default, this is the same as $(OBJ_DIR); however, this can be changed
+# to suit particular needs.
+#
+LIB_DIR := $(OBJ_DIR)
+
+
+NO_OUTPUT := 2> /dev/null
+
+# EOF
diff --git a/builds/vms/ftconfig.h b/builds/vms/ftconfig.h
new file mode 100644 (file)
index 0000000..62fadac
--- /dev/null
@@ -0,0 +1,344 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftconfig.h                                                             */
+/*                                                                         */
+/*    VMS-specific configuration file (specification only).                */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006-2008, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This header file contains a number of macro definitions that are used */
+  /* by the rest of the engine.  Most of the macros here are automatically */
+  /* determined at compile time, and you should not need to change it to   */
+  /* port FreeType, except to compile the library with a non-ANSI          */
+  /* compiler.                                                             */
+  /*                                                                       */
+  /* Note however that if some specific modifications are needed, we       */
+  /* advise you to place a modified copy in your build directory.          */
+  /*                                                                       */
+  /* The build directory is usually `freetype/builds/<system>', and        */
+  /* contains system-specific files that are always included first when    */
+  /* building the library.                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTCONFIG_H__
+#define __FTCONFIG_H__
+
+
+  /* Include the header file containing all developer build options */
+#include <ft2build.h>
+#include FT_CONFIG_OPTIONS_H
+#include FT_CONFIG_STANDARD_LIBRARY_H
+
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*               PLATFORM-SPECIFIC CONFIGURATION MACROS                  */
+  /*                                                                       */
+  /* These macros can be toggled to suit a specific system.  The current   */
+  /* ones are defaults used to compile FreeType in an ANSI C environment   */
+  /* (16bit compilers are also supported).  Copy this file to your own     */
+  /* `freetype/builds/<system>' directory, and edit it to port the engine. */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#define HAVE_UNISTD_H  1
+#define HAVE_FCNTL_H   1
+
+#define SIZEOF_INT   4
+#define SIZEOF_LONG  4
+
+#define FT_SIZEOF_INT   4
+#define FT_SIZEOF_LONG  4
+
+#define FT_CHAR_BIT  8
+
+
+  /* FT_UNUSED is a macro used to indicate that a given parameter is not  */
+  /* used -- this is only used to get rid of unpleasant compiler warnings */
+#ifndef FT_UNUSED
+#define FT_UNUSED( arg )  ( (arg) = (arg) )
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                     AUTOMATIC CONFIGURATION MACROS                    */
+  /*                                                                       */
+  /* These macros are computed from the ones defined above.  Don't touch   */
+  /* their definition, unless you know precisely what you are doing.  No   */
+  /* porter should need to mess with them.                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Mac support                                                           */
+  /*                                                                       */
+  /*   This is the only necessary change, so it is defined here instead    */
+  /*   providing a new configuration file.                                 */
+  /*                                                                       */
+#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) )
+  /* no Carbon frameworks for 64bit 10.4.x */
+  /* AvailabilityMacros.h is available since Mac OS X 10.2,        */
+  /* so guess the system version by maximum errno before inclusion */
+#include <errno.h>
+#ifdef ECANCELED /* defined since 10.2 */
+#include "AvailabilityMacros.h"
+#endif
+#if defined( __LP64__ ) && \
+    ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 )
+#undef FT_MACINTOSH
+#endif
+
+#elif defined( __SC__ ) || defined( __MRC__ )
+  /* Classic MacOS compilers */
+#include "ConditionalMacros.h"
+#if TARGET_OS_MAC
+#define FT_MACINTOSH 1
+#endif
+
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* IntN types                                                            */
+  /*                                                                       */
+  /*   Used to guarantee the size of some specific integers.               */
+  /*                                                                       */
+  typedef signed short    FT_Int16;
+  typedef unsigned short  FT_UInt16;
+
+#if FT_SIZEOF_INT == 4
+
+  typedef signed int      FT_Int32;
+  typedef unsigned int    FT_UInt32;
+
+#elif FT_SIZEOF_LONG == 4
+
+  typedef signed long     FT_Int32;
+  typedef unsigned long   FT_UInt32;
+
+#else
+#error "no 32bit type found -- please check your configuration files"
+#endif
+
+  /* look up an integer type that is at least 32 bits */
+#if FT_SIZEOF_INT >= 4
+
+  typedef int            FT_Fast;
+  typedef unsigned int   FT_UFast;
+
+#elif FT_SIZEOF_LONG >= 4
+
+  typedef long           FT_Fast;
+  typedef unsigned long  FT_UFast;
+
+#endif
+
+
+  /* determine whether we have a 64-bit int type for platforms without */
+  /* Autoconf                                                          */
+#if FT_SIZEOF_LONG == 8
+
+  /* FT_LONG64 must be defined if a 64-bit type is available */
+#define FT_LONG64
+#define FT_INT64  long
+
+#elif defined( _MSC_VER ) && _MSC_VER >= 900  /* Visual C++ (and Intel C++) */
+
+  /* this compiler provides the __int64 type */
+#define FT_LONG64
+#define FT_INT64  __int64
+
+#elif defined( __BORLANDC__ )  /* Borland C++ */
+
+  /* XXXX: We should probably check the value of __BORLANDC__ in order */
+  /*       to test the compiler version.                               */
+
+  /* this compiler provides the __int64 type */
+#define FT_LONG64
+#define FT_INT64  __int64
+
+#elif defined( __WATCOMC__ )   /* Watcom C++ */
+
+  /* Watcom doesn't provide 64-bit data types */
+
+#elif defined( __MWERKS__ )    /* Metrowerks CodeWarrior */
+
+#define FT_LONG64
+#define FT_INT64  long long int
+
+#elif defined( __GNUC__ )
+
+  /* GCC provides the `long long' type */
+#define FT_LONG64
+#define FT_INT64  long long int
+
+#endif /* FT_SIZEOF_LONG == 8 */
+
+
+#define FT_BEGIN_STMNT  do {
+#define FT_END_STMNT    } while ( 0 )
+#define FT_DUMMY_STMNT  FT_BEGIN_STMNT FT_END_STMNT
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* A 64-bit data type will create compilation problems if you compile    */
+  /* in strict ANSI mode.  To avoid them, we disable their use if          */
+  /* __STDC__ is defined.  You can however ignore this rule by             */
+  /* defining the FT_CONFIG_OPTION_FORCE_INT64 configuration macro.        */
+  /*                                                                       */
+#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 )
+
+#ifdef __STDC__
+
+  /* undefine the 64-bit macros in strict ANSI compilation mode */
+#undef FT_LONG64
+#undef FT_INT64
+
+#endif /* __STDC__ */
+
+#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */
+
+
+#ifdef FT_MAKE_OPTION_SINGLE_OBJECT
+
+#define FT_LOCAL( x )      static  x
+#define FT_LOCAL_DEF( x )  static  x
+
+#else
+
+#ifdef __cplusplus
+#define FT_LOCAL( x )      extern "C"  x
+#define FT_LOCAL_DEF( x )  extern "C"  x
+#else
+#define FT_LOCAL( x )      extern  x
+#define FT_LOCAL_DEF( x )  x
+#endif
+
+#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */
+
+
+#ifndef FT_BASE
+
+#ifdef __cplusplus
+#define FT_BASE( x )  extern "C"  x
+#else
+#define FT_BASE( x )  extern  x
+#endif
+
+#endif /* !FT_BASE */
+
+
+#ifndef FT_BASE_DEF
+
+#ifdef __cplusplus
+#define FT_BASE_DEF( x )  extern "C"  x
+#else
+#define FT_BASE_DEF( x )  extern  x
+#endif
+
+#endif /* !FT_BASE_DEF */
+
+
+#ifndef FT_EXPORT
+
+#ifdef __cplusplus
+#define FT_EXPORT( x )  extern "C"  x
+#else
+#define FT_EXPORT( x )  extern  x
+#endif
+
+#endif /* !FT_EXPORT */
+
+
+#ifndef FT_EXPORT_DEF
+
+#ifdef __cplusplus
+#define FT_EXPORT_DEF( x )  extern "C"  x
+#else
+#define FT_EXPORT_DEF( x )  extern  x
+#endif
+
+#endif /* !FT_EXPORT_DEF */
+
+
+#ifndef FT_EXPORT_VAR
+
+#ifdef __cplusplus
+#define FT_EXPORT_VAR( x )  extern "C"  x
+#else
+#define FT_EXPORT_VAR( x )  extern  x
+#endif
+
+#endif /* !FT_EXPORT_VAR */
+
+  /* The following macros are needed to compile the library with a   */
+  /* C++ compiler and with 16bit compilers.                          */
+  /*                                                                 */
+
+  /* This is special.  Within C++, you must specify `extern "C"' for */
+  /* functions which are used via function pointers, and you also    */
+  /* must do that for structures which contain function pointers to  */
+  /* assure C linkage -- it's not possible to have (local) anonymous */
+  /* functions which are accessed by (global) function pointers.     */
+  /*                                                                 */
+  /*                                                                 */
+  /* FT_CALLBACK_DEF is used to _define_ a callback function.        */
+  /*                                                                 */
+  /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */
+  /* contains pointers to callback functions.                        */
+  /*                                                                 */
+  /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable   */
+  /* that contains pointers to callback functions.                   */
+  /*                                                                 */
+  /*                                                                 */
+  /* Some 16bit compilers have to redefine these macros to insert    */
+  /* the infamous `_cdecl' or `__fastcall' declarations.             */
+  /*                                                                 */
+#ifndef FT_CALLBACK_DEF
+#ifdef __cplusplus
+#define FT_CALLBACK_DEF( x )  extern "C"  x
+#else
+#define FT_CALLBACK_DEF( x )  static  x
+#endif
+#endif /* FT_CALLBACK_DEF */
+
+#ifndef FT_CALLBACK_TABLE
+#ifdef __cplusplus
+#define FT_CALLBACK_TABLE      extern "C"
+#define FT_CALLBACK_TABLE_DEF  extern "C"
+#else
+#define FT_CALLBACK_TABLE      extern
+#define FT_CALLBACK_TABLE_DEF  /* nothing */
+#endif
+#endif /* FT_CALLBACK_TABLE */
+
+
+FT_END_HEADER
+
+
+#endif /* __FTCONFIG_H__ */
+
+
+/* END */
diff --git a/builds/vms/ftsystem.c b/builds/vms/ftsystem.c
new file mode 100644 (file)
index 0000000..fb35967
--- /dev/null
@@ -0,0 +1,328 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsystem.c                                                             */
+/*                                                                         */
+/*    VMS-specific FreeType low-level system interface (body).             */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2005, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+  /* we use our special ftconfig.h file, not the standard one */
+#include <ftconfig.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_SYSTEM_H
+#include FT_ERRORS_H
+#include FT_TYPES_H
+#include FT_INTERNAL_OBJECTS_H
+
+  /* memory-mapping includes and definitions */
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <sys/mman.h>
+#ifndef MAP_FILE
+#define MAP_FILE  0x00
+#endif
+
+#ifdef MUNMAP_USES_VOIDP
+#define MUNMAP_ARG_CAST  void *
+#else
+#define MUNMAP_ARG_CAST  char *
+#endif
+
+#ifdef NEED_MUNMAP_DECL
+
+#ifdef __cplusplus
+  extern "C"
+#else
+  extern
+#endif
+  int
+  munmap( char*  addr,
+          int    len );
+
+#define MUNMAP_ARG_CAST  char *
+
+#endif /* NEED_DECLARATION_MUNMAP */
+
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                       MEMORY MANAGEMENT INTERFACE                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_alloc                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The memory allocation function.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory :: A pointer to the memory object.                          */
+  /*                                                                       */
+  /*    size   :: The requested size in bytes.                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The address of newly allocated block.                              */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void* )
+  ft_alloc( FT_Memory  memory,
+            long       size )
+  {
+    FT_UNUSED( memory );
+
+    return malloc( size );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_realloc                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The memory reallocation function.                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory   :: A pointer to the memory object.                        */
+  /*                                                                       */
+  /*    cur_size :: The current size of the allocated memory block.        */
+  /*                                                                       */
+  /*    new_size :: The newly requested size in bytes.                     */
+  /*                                                                       */
+  /*    block    :: The current address of the block in memory.            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The address of the reallocated memory block.                       */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void* )
+  ft_realloc( FT_Memory  memory,
+              long       cur_size,
+              long       new_size,
+              void*      block )
+  {
+    FT_UNUSED( memory );
+    FT_UNUSED( cur_size );
+
+    return realloc( block, new_size );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_free                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The memory release function.                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory :: A pointer to the memory object.                          */
+  /*                                                                       */
+  /*    block  :: The address of block in memory to be freed.              */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void )
+  ft_free( FT_Memory  memory,
+           void*      block )
+  {
+    FT_UNUSED( memory );
+
+    free( block );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                     RESOURCE MANAGEMENT INTERFACE                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_io
+
+  /* We use the macro STREAM_FILE for convenience to extract the       */
+  /* system-specific stream handle from a given FreeType stream object */
+#define STREAM_FILE( stream )  ( (FILE*)stream->descriptor.pointer )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_close_stream                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The function to close a stream.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: A pointer to the stream object.                          */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void )
+  ft_close_stream( FT_Stream  stream )
+  {
+    munmap( (MUNMAP_ARG_CAST)stream->descriptor.pointer, stream->size );
+
+    stream->descriptor.pointer = NULL;
+    stream->size               = 0;
+    stream->base               = 0;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_Open( FT_Stream    stream,
+                  const char*  filepathname )
+  {
+    int          file;
+    struct stat  stat_buf;
+
+
+    if ( !stream )
+      return FT_Err_Invalid_Stream_Handle;
+
+    /* open the file */
+    file = open( filepathname, O_RDONLY );
+    if ( file < 0 )
+    {
+      FT_ERROR(( "FT_Stream_Open:" ));
+      FT_ERROR(( " could not open `%s'\n", filepathname ));
+      return FT_Err_Cannot_Open_Resource;
+    }
+
+    if ( fstat( file, &stat_buf ) < 0 )
+    {
+      FT_ERROR(( "FT_Stream_Open:" ));
+      FT_ERROR(( " could not `fstat' file `%s'\n", filepathname ));
+      goto Fail_Map;
+    }
+
+    stream->size = stat_buf.st_size;
+    if ( !stream->size )
+    {
+      FT_ERROR(( "FT_Stream_Open:" ));
+      FT_ERROR(( " opened `%s' but zero-sized\n", filepathname ));
+      goto Fail_Map;
+    }
+
+    stream->pos  = 0;
+    stream->base = (unsigned char *)mmap( NULL,
+                                          stream->size,
+                                          PROT_READ,
+                                          MAP_FILE | MAP_PRIVATE,
+                                          file,
+                                          0 );
+
+    if ( (long)stream->base == -1 )
+    {
+      FT_ERROR(( "FT_Stream_Open:" ));
+      FT_ERROR(( " could not `mmap' file `%s'\n", filepathname ));
+      goto Fail_Map;
+    }
+
+    close( file );
+
+    stream->descriptor.pointer = stream->base;
+    stream->pathname.pointer   = (char*)filepathname;
+
+    stream->close = ft_close_stream;
+    stream->read  = 0;
+
+    FT_TRACE1(( "FT_Stream_Open:" ));
+    FT_TRACE1(( " opened `%s' (%d bytes) successfully\n",
+                filepathname, stream->size ));
+
+    return FT_Err_Ok;
+
+  Fail_Map:
+    close( file );
+
+    stream->base = NULL;
+    stream->size = 0;
+    stream->pos  = 0;
+
+    return FT_Err_Cannot_Open_Stream;
+  }
+
+
+#ifdef FT_DEBUG_MEMORY
+
+  extern FT_Int
+  ft_mem_debug_init( FT_Memory  memory );
+
+  extern void
+  ft_mem_debug_done( FT_Memory  memory );
+
+#endif
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( FT_Memory )
+  FT_New_Memory( void )
+  {
+    FT_Memory  memory;
+
+
+    memory = (FT_Memory)malloc( sizeof ( *memory ) );
+    if ( memory )
+    {
+      memory->user    = 0;
+      memory->alloc   = ft_alloc;
+      memory->realloc = ft_realloc;
+      memory->free    = ft_free;
+#ifdef FT_DEBUG_MEMORY
+      ft_mem_debug_init( memory );
+#endif
+    }
+
+    return memory;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( void )
+  FT_Done_Memory( FT_Memory  memory )
+  {
+#ifdef FT_DEBUG_MEMORY
+    ft_mem_debug_done( memory );
+#endif
+    memory->free( memory, memory );
+  }
+
+
+/* END */
diff --git a/builds/win32/detect.mk b/builds/win32/detect.mk
new file mode 100644 (file)
index 0000000..1906539
--- /dev/null
@@ -0,0 +1,183 @@
+#
+# FreeType 2 configuration file to detect a Win32 host platform.
+#
+
+
+# Copyright 1996-2000, 2003, 2004, 2006, 2007 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.
+
+
+.PHONY: setup
+
+
+ifeq ($(PLATFORM),ansi)
+
+  # Detecting Windows NT is easy, as the OS variable must be defined and
+  # contains `Windows_NT'.  This also works with Windows 2000 and XP.
+  #
+  ifeq ($(OS),Windows_NT)
+
+    PLATFORM := win32
+
+  else
+
+    # Detecting Windows 9X
+
+    # We used to run the `ver' command to see if its output contains the
+    # word `Windows'.  If this is true, we are running Windows 95 or later:
+    #
+    #   ifdef COMSPEC
+    #     # First, check if we have the COMSPEC environment variable, which
+    #     # indicates we can use COMMAND.COM's internal commands
+    #     is_windows := $(findstring Windows,$(strip $(shell ver)))
+    #   endif
+    #
+    # Unfortunately, this also detects the case when one is running
+    # DOS 7.x (the MS-DOS version that lies below Windows) without actually
+    # launching the GUI.
+    #
+    # A better test is to check whether there are both the environment
+    # variables `winbootdir' and `windir'.  The first indicates an
+    # underlying DOS 7.x, while the second is set only if win32 is available.
+    #
+    # Note that on Windows NT, such an environment variable will not be seen
+    # from DOS-based tools like DJGPP's make; this is not actually a problem
+    # since NT is detected independently above.  But do not try to be clever!
+    #
+    ifdef winbootdir
+      ifdef windir
+
+        PLATFORM := win32
+
+      endif
+    endif
+
+  endif  # test NT
+
+endif # test PLATFORM ansi
+
+ifeq ($(PLATFORM),win32)
+
+  DELETE := del
+  CAT    := type
+  SEP    := $(BACKSLASH)
+
+  # Setting COPY is a bit trickier.  Plain COPY on NT will not work
+  # correctly, because it will uppercase 8.3 filenames, creating a
+  # `CONFIG.MK' file which isn't found later on by `make'.
+  # Since we do not want that, we need to force execution of CMD.EXE.
+  # Unfortunately, CMD.EXE is not available on Windows 9X.
+  # So we need to hack.
+  #
+  # Kudos to Eli Zaretskii (DJGPP guru) that helped debug it.
+  # Details are available in threads of the freetype mailing list
+  # (2004-11-11), and then in the devel mailing list (2004-11-20 to -23).
+  #
+  ifeq ($(OS),Windows_NT)
+    COPY := cmd.exe /c copy
+  else
+    COPY := copy
+  endif  # test NT
+
+
+  # gcc Makefile by default
+  CONFIG_FILE := w32-gcc.mk
+  ifeq ($(firstword $(CC)),cc)
+    CC        := gcc
+  endif
+
+  ifneq ($(findstring list,$(MAKECMDGOALS)),)  # test for the "list" target
+    dump_target_list:
+           @echo ÿ
+           @echo $(PROJECT_TITLE) build system -- supported compilers
+           @echo ÿ
+           @echo Several command-line compilers are supported on Win32:
+           @echo ÿ
+           @echo ÿÿmake setupÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿgcc (with Mingw)
+           @echo ÿÿmake setup visualcÿÿÿÿÿÿÿÿÿÿÿÿÿMicrosoft Visual C++
+           @echo ÿÿmake setup bcc32ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿBorland C/C++
+           @echo ÿÿmake setup lccÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿWin32-LCC
+           @echo ÿÿmake setup intelcÿÿÿÿÿÿÿÿÿÿÿÿÿÿIntel C/C++
+           @echo ÿ
+
+    setup: dump_target_list
+    .PHONY: dump_target_list list
+  else
+    setup: dos_setup
+  endif
+
+  # additionally, we provide hooks for various other compilers
+  #
+  ifneq ($(findstring visualc,$(MAKECMDGOALS)),)     # Visual C/C++
+    CONFIG_FILE := w32-vcc.mk
+    CC          := cl
+    visualc: setup
+    .PHONY: visualc
+  endif
+
+  ifneq ($(findstring intelc,$(MAKECMDGOALS)),)      # Intel C/C++
+    CONFIG_FILE := w32-intl.mk
+    CC          := cl
+    visualc: setup
+    .PHONY: intelc
+  endif
+
+  ifneq ($(findstring watcom,$(MAKECMDGOALS)),)      # Watcom C/C++
+    CONFIG_FILE := w32-wat.mk
+    CC          := wcc386
+    watcom: setup
+    .PHONY: watcom
+  endif
+
+  ifneq ($(findstring visualage,$(MAKECMDGOALS)),)   # Visual Age C++
+    CONFIG_FILE := w32-icc.mk
+    CC          := icc
+    visualage: setup
+    .PHONY: visualage
+  endif
+
+  ifneq ($(findstring lcc,$(MAKECMDGOALS)),)         # LCC-Win32
+    CONFIG_FILE := w32-lcc.mk
+    CC          := lcc
+    lcc: setup
+    .PHONY: lcc
+  endif
+
+  ifneq ($(findstring mingw32,$(MAKECMDGOALS)),)     # mingw32
+    CONFIG_FILE := w32-mingw32.mk
+    CC          := gcc
+    mingw32: setup
+    .PHONY: mingw32
+  endif
+
+  ifneq ($(findstring bcc32,$(MAKECMDGOALS)),)       # Borland C++
+    CONFIG_FILE := w32-bcc.mk
+    CC          := bcc32
+    bcc32: setup
+    .PHONY: bcc32
+  endif
+
+  ifneq ($(findstring devel-bcc,$(MAKECMDGOALS)),)   # development target
+    CONFIG_FILE := w32-bccd.mk
+    CC          := bcc32
+    devel-bcc: setup
+    .PHONY: devel-bcc
+  endif
+
+  ifneq ($(findstring devel-gcc,$(MAKECMDGOALS)),)   # development target
+    CONFIG_FILE := w32-dev.mk
+    CC          := gcc
+    devel-gcc: setup
+    .PHONY: devel-gcc
+  endif
+
+endif   # test PLATFORM win32
+
+
+# EOF
diff --git a/builds/win32/ftdebug.c b/builds/win32/ftdebug.c
new file mode 100644 (file)
index 0000000..d1ca15a
--- /dev/null
@@ -0,0 +1,214 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftdebug.c                                                              */
+/*                                                                         */
+/*    Debugging and logging component for Win32 (body).                    */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This component contains various macros and functions used to ease the */
+  /* debugging of the FreeType engine.  Its main purpose is in assertion   */
+  /* checking, tracing, and error detection.                               */
+  /*                                                                       */
+  /* There are now three debugging modes:                                  */
+  /*                                                                       */
+  /* - trace mode                                                          */
+  /*                                                                       */
+  /*   Error and trace messages are sent to the log file (which can be the */
+  /*   standard error output).                                             */
+  /*                                                                       */
+  /* - error mode                                                          */
+  /*                                                                       */
+  /*   Only error messages are generated.                                  */
+  /*                                                                       */
+  /* - release mode:                                                       */
+  /*                                                                       */
+  /*   No error message is sent or generated.  The code is free from any   */
+  /*   debugging parts.                                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <windows.h>
+
+
+  FT_BASE_DEF( void )
+  FT_Message( const char*  fmt, ... )
+  {
+    static char  buf[8192];
+    va_list      ap;
+
+
+    va_start( ap, fmt );
+    vprintf( fmt, ap );
+    /* send the string to the debugger as well */
+    vsprintf( buf, fmt, ap );
+    OutputDebugStringA( buf );
+    va_end( ap );
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Panic( const char*  fmt, ... )
+  {
+    static char  buf[8192];
+    va_list      ap;
+
+
+    va_start( ap, fmt );
+    vsprintf( buf, fmt, ap );
+    OutputDebugStringA( buf );
+    va_end( ap );
+
+    exit( EXIT_FAILURE );
+  }
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+
+  /* array of trace levels, initialized to 0 */
+  int  ft_trace_levels[trace_count];
+
+  /* define array of trace toggle names */
+#define FT_TRACE_DEF( x )  #x ,
+
+  static const char*  ft_trace_toggles[trace_count + 1] =
+  {
+#include FT_INTERNAL_TRACE_H
+    NULL
+  };
+
+#undef FT_TRACE_DEF
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Initialize the tracing sub-system.  This is done by retrieving the    */
+  /* value of the "FT2_DEBUG" environment variable.  It must be a list of  */
+  /* toggles, separated by spaces, `;' or `,'.  Example:                   */
+  /*                                                                       */
+  /*    "any:3 memory:6 stream:5"                                          */
+  /*                                                                       */
+  /* This will request that all levels be set to 3, except the trace level */
+  /* for the memory and stream components which are set to 6 and 5,        */
+  /* respectively.                                                         */
+  /*                                                                       */
+  /* See the file <freetype/internal/fttrace.h> for details of the         */
+  /* available toggle names.                                               */
+  /*                                                                       */
+  /* The level must be between 0 and 6; 0 means quiet (except for serious  */
+  /* runtime errors), and 6 means _very_ verbose.                          */
+  /*                                                                       */
+  FT_BASE_DEF( void )
+  ft_debug_init( void )
+  {
+    const char*  ft2_debug = getenv( "FT2_DEBUG" );
+
+
+    if ( ft2_debug )
+    {
+      const char*  p = ft2_debug;
+      const char*  q;
+
+
+      for ( ; *p; p++ )
+      {
+        /* skip leading whitespace and separators */
+        if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' )
+          continue;
+
+        /* read toggle name, followed by ':' */
+        q = p;
+        while ( *p && *p != ':' )
+          p++;
+
+        if ( *p == ':' && p > q )
+        {
+          int  n, i, len = p - q;
+          int  level = -1, found = -1;
+
+
+          for ( n = 0; n < trace_count; n++ )
+          {
+            const char*  toggle = ft_trace_toggles[n];
+
+
+            for ( i = 0; i < len; i++ )
+            {
+              if ( toggle[i] != q[i] )
+                break;
+            }
+
+            if ( i == len && toggle[i] == 0 )
+            {
+              found = n;
+              break;
+            }
+          }
+
+          /* read level */
+          p++;
+          if ( *p )
+          {
+            level = *p++ - '0';
+            if ( level < 0 || level > 7 )
+              level = -1;
+          }
+
+          if ( found >= 0 && level >= 0 )
+          {
+            if ( found == trace_any )
+            {
+              /* special case for "any" */
+              for ( n = 0; n < trace_count; n++ )
+                ft_trace_levels[n] = level;
+            }
+            else
+              ft_trace_levels[found] = level;
+          }
+        }
+      }
+    }
+  }
+
+
+#else  /* !FT_DEBUG_LEVEL_TRACE */
+
+
+  FT_BASE_DEF( void )
+  ft_debug_init( void )
+  {
+    /* nothing */
+  }
+
+
+#endif /* !FT_DEBUG_LEVEL_TRACE */
+
+#endif /* FT_DEBUG_LEVEL_ERROR */
+
+
+/* END */
diff --git a/builds/win32/vc2005/freetype.sln b/builds/win32/vc2005/freetype.sln
new file mode 100644 (file)
index 0000000..ec3345d
--- /dev/null
@@ -0,0 +1,31 @@
+Microsoft Visual Studio Solution File, Format Version 9.00\r
+# Visual Studio 2005\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               LIB Debug Multithreaded|Win32 = LIB Debug Multithreaded|Win32\r
+               LIB Debug Singlethreaded|Win32 = LIB Debug Singlethreaded|Win32\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Release Multithreaded|Win32 = LIB Release Multithreaded|Win32\r
+               LIB Release Singlethreaded|Win32 = LIB Release Singlethreaded|Win32\r
+               LIB Release|Win32 = LIB Release|Win32\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Win32.ActiveCfg = Debug Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Win32.Build.0 = Debug Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Win32.ActiveCfg = Debug Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Win32.Build.0 = Debug Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Win32.ActiveCfg = Debug|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Win32.Build.0 = Debug|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Win32.ActiveCfg = Release Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Win32.Build.0 = Release Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Win32.ActiveCfg = Release Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Win32.Build.0 = Release Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Win32.ActiveCfg = Release|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Win32.Build.0 = Release|Win32\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/builds/win32/vc2005/freetype.vcproj b/builds/win32/vc2005/freetype.vcproj
new file mode 100644 (file)
index 0000000..6f17352
--- /dev/null
@@ -0,0 +1,646 @@
+<?xml version="1.0" encoding="Windows-1252"?>\r
+<VisualStudioProject ProjectType="Visual C++" Version="8.00" Name="freetype" ProjectGUID="{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}" TargetFrameworkVersion="131072">\r
+  <Platforms>\r
+    <Platform Name="Win32" />\r
+  </Platforms>\r
+  <ToolFiles>\r
+  </ToolFiles>\r
+  <Configurations>\r
+    <Configuration Name="Release|Win32" OutputDirectory=".\..\..\..\objs\release" IntermediateDirectory=".\..\..\..\objs\release" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" />\r
+      <Tool Name="VCCLCompilerTool" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY" StringPooling="true" RuntimeLibrary="2" EnableFunctionLevelLinking="true" DisableLanguageExtensions="true" PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release/" ObjectFile=".\..\..\..\objs\release/" ProgramDataBaseFileName=".\..\..\..\objs\release/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype249.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+    </Configuration>\r
+    <Configuration Name="Release Multithreaded|Win32" OutputDirectory=".\..\..\..\objs\release_mt" IntermediateDirectory=".\..\..\..\objs\release_mt" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" />\r
+      <Tool Name="VCCLCompilerTool" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY" StringPooling="true" RuntimeLibrary="0" EnableFunctionLevelLinking="true" DisableLanguageExtensions="true" PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release_mt/" ObjectFile=".\..\..\..\objs\release_mt/" ProgramDataBaseFileName=".\..\..\..\objs\release_mt/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype249MT.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+    </Configuration>\r
+    <Configuration Name="Release Singlethreaded|Win32" OutputDirectory=".\..\..\..\objs\release_st" IntermediateDirectory=".\..\..\..\objs\release_st" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" />\r
+      <Tool Name="VCCLCompilerTool" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY" StringPooling="true" RuntimeLibrary="0" EnableFunctionLevelLinking="true" DisableLanguageExtensions="true" PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release_st/" ObjectFile=".\..\..\..\objs\release_st/" ProgramDataBaseFileName=".\..\..\..\objs\release_st/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype249ST.lib" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+    </Configuration>\r
+    <Configuration Name="Debug|Win32" OutputDirectory=".\..\..\..\objs\debug" IntermediateDirectory=".\..\..\..\objs\debug" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" />\r
+      <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY" BasicRuntimeChecks="3" RuntimeLibrary="3" DisableLanguageExtensions="true" PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug/" ObjectFile=".\..\..\..\objs\debug/" ProgramDataBaseFileName=".\..\..\..\objs\debug/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype249_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+    </Configuration>\r
+    <Configuration Name="Debug Singlethreaded|Win32" OutputDirectory=".\..\..\..\objs\debug_st" IntermediateDirectory=".\..\..\..\objs\debug_st" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" />\r
+      <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY" BasicRuntimeChecks="3" RuntimeLibrary="1" DisableLanguageExtensions="true" PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug_st/" ObjectFile=".\..\..\..\objs\debug_st/" ProgramDataBaseFileName=".\..\..\..\objs\debug_st/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype249ST_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+    </Configuration>\r
+    <Configuration Name="Debug Multithreaded|Win32" OutputDirectory=".\..\..\..\objs\debug_mt" IntermediateDirectory=".\..\..\..\objs\debug_mt" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" />\r
+      <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE" GeneratePreprocessedFile="0" BasicRuntimeChecks="3" RuntimeLibrary="1" DisableLanguageExtensions="true" PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug_mt/" ObjectFile=".\..\..\..\objs\debug_mt/" ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype249MT_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+    </Configuration>\r
+  </Configurations>\r
+  <References>\r
+  </References>\r
+  <Files>\r
+    <Filter Name="Source Files" Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">\r
+      <File RelativePath="..\..\..\src\autofit\autofit.c">\r
+      </File>\r
+      <File RelativePath="..\..\..\src\bdf\bdf.c">\r
+        <FileConfiguration Name="Release|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\..\..\src\cff\cff.c">\r
+        <FileConfiguration Name="Release|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\..\..\src\base\ftbase.c">\r
+        <FileConfiguration Name="Release|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\..\..\src\base\ftbitmap.c">\r
+      </File>\r
+      <File RelativePath="..\..\..\src\cache\ftcache.c">\r
+        <FileConfiguration Name="Release|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\ftdebug.c">\r
+        <FileConfiguration Name="Release|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\..\..\src\base\ftfstype.c">\r
+      </File>\r
+      <File RelativePath="..\..\..\src\base\ftgasp.c">\r
+      </File>\r
+      <File RelativePath="..\..\..\src\base\ftglyph.c">\r
+        <FileConfiguration Name="Release|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\..\..\src\gzip\ftgzip.c">\r
+        <FileConfiguration Name="Release|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\..\..\src\base\ftinit.c">\r
+        <FileConfiguration Name="Release|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\..\..\src\lzw\ftlzw.c">\r
+        <FileConfiguration Name="Release|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\..\..\src\base\ftstroke.c">\r
+      </File>\r
+      <File RelativePath="..\..\..\src\base\ftsystem.c">\r
+        <FileConfiguration Name="Release|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\..\..\src\smooth\smooth.c">\r
+        <FileConfiguration Name="Release|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <Filter Name="FT_MODULES">\r
+        <File RelativePath="..\..\..\src\base\ftbbox.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftmm.c">\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftpfr.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftsynth.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\fttype1.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftwinfnt.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftxf86.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftlcdfil.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftgxval.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftotval.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftpatent.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\pcf\pcf.c">\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\pfr\pfr.c">\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\psaux\psaux.c">\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\pshinter\pshinter.c">\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\psnames\psmodule.c">\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\raster\raster.c">\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\sfnt\sfnt.c">\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\truetype\truetype.c">\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\type1\type1.c">\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\cid\type1cid.c">\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\type42\type42.c">\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\winfonts\winfnt.c">\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+      </Filter>\r
+    </Filter>\r
+    <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl">\r
+      <File RelativePath="..\..\..\include\ft2build.h">\r
+      </File>\r
+      <File RelativePath="..\..\..\include\freetype\config\ftconfig.h">\r
+      </File>\r
+      <File RelativePath="..\..\..\include\freetype\config\ftheader.h">\r
+      </File>\r
+      <File RelativePath="..\..\..\include\freetype\config\ftmodule.h">\r
+      </File>\r
+      <File RelativePath="..\..\..\include\freetype\config\ftoption.h">\r
+      </File>\r
+      <File RelativePath="..\..\..\include\freetype\config\ftstdlib.h">\r
+      </File>\r
+    </Filter>\r
+  </Files>\r
+  <Globals>\r
+  </Globals>\r
+</VisualStudioProject>
\ No newline at end of file
diff --git a/builds/win32/vc2005/index.html b/builds/win32/vc2005/index.html
new file mode 100644 (file)
index 0000000..bc4291c
--- /dev/null
@@ -0,0 +1,37 @@
+<html>
+<header>
+<title>
+  FreeType&nbsp;2 Project Files for VS.NET&nbsp;2005
+</title>
+
+<body>
+<h1>
+  FreeType&nbsp;2 Project Files for VS.NET&nbsp;2005
+</h1>
+
+<p>This directory contains project files for Visual C++, named
+<tt>freetype.vcproj</tt>, and Visual Studio, called <tt>freetype.sln</tt>.  It
+compiles the following libraries from the FreeType 2.4.9 sources:</p>
+
+<ul>
+  <pre>
+    freetype249.lib     - release build; single threaded
+    freetype249_D.lib   - debug build;   single threaded
+    freetype249MT.lib   - release build; multi-threaded
+    freetype249MT_D.lib - debug build;   multi-threaded</pre>
+</ul>
+
+<p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
+archives are already stored this way, so no further action is required.  If
+you use some <tt>.tar.*z</tt> archives, be sure to configure your extracting
+tool to convert the line endings.  For example, with <a
+href="http://www.winzip.com">WinZip</a>, you should activate the <it>TAR
+file smart CR/LF Conversion</it> option.  Alternatively, you may consider
+using the <tt>unix2dos</tt> or <tt>u2d</tt> utilities that are floating
+around, which specifically deal with this particular problem.
+
+<p>Build directories are placed in the top-level <tt>objs</tt>
+directory.</p>
+
+</body>
+</html>
diff --git a/builds/win32/vc2008/freetype.sln b/builds/win32/vc2008/freetype.sln
new file mode 100644 (file)
index 0000000..6c522f9
--- /dev/null
@@ -0,0 +1,31 @@
+Microsoft Visual Studio Solution File, Format Version 10.00\r
+# Visual Studio 2008\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               LIB Debug Multithreaded|Win32 = LIB Debug Multithreaded|Win32\r
+               LIB Debug Singlethreaded|Win32 = LIB Debug Singlethreaded|Win32\r
+               LIB Debug|Win32 = LIB Debug|Win32\r
+               LIB Release Multithreaded|Win32 = LIB Release Multithreaded|Win32\r
+               LIB Release Singlethreaded|Win32 = LIB Release Singlethreaded|Win32\r
+               LIB Release|Win32 = LIB Release|Win32\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Win32.ActiveCfg = Debug Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Win32.Build.0 = Debug Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Win32.ActiveCfg = Debug Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Win32.Build.0 = Debug Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Win32.ActiveCfg = Debug|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Win32.Build.0 = Debug|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Win32.ActiveCfg = Release Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Win32.Build.0 = Release Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Win32.ActiveCfg = Release Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Win32.Build.0 = Release Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Win32.ActiveCfg = Release|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Win32.Build.0 = Release|Win32\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/builds/win32/vc2008/freetype.vcproj b/builds/win32/vc2008/freetype.vcproj
new file mode 100644 (file)
index 0000000..897c5e5
--- /dev/null
@@ -0,0 +1,2180 @@
+<?xml version="1.0" encoding="Windows-1252"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="freetype"\r
+       ProjectGUID="{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}"\r
+       TargetFrameworkVersion="131072"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\release"\r
+                       IntermediateDirectory=".\..\..\..\objs\release"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release/"\r
+                               ObjectFile=".\..\..\..\objs\release/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\win32\vc2008\freetype249.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Multithreaded|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\release_mt"\r
+                       IntermediateDirectory=".\..\..\..\objs\release_mt"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_mt/"\r
+                               ObjectFile=".\..\..\..\objs\release_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\win32\vc2008\freetype249MT.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Singlethreaded|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\release_st"\r
+                       IntermediateDirectory=".\..\..\..\objs\release_st"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_st/"\r
+                               ObjectFile=".\..\..\..\objs\release_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\win32\vc2008\freetype249ST.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\debug"\r
+                       IntermediateDirectory=".\..\..\..\objs\debug"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug/"\r
+                               ObjectFile=".\..\..\..\objs\debug/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\win32\vc2008\freetype249_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Singlethreaded|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\debug_st"\r
+                       IntermediateDirectory=".\..\..\..\objs\debug_st"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_st/"\r
+                               ObjectFile=".\..\..\..\objs\debug_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\win32\vc2008\freetype249ST_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Multithreaded|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\debug_mt"\r
+                       IntermediateDirectory=".\..\..\..\objs\debug_mt"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE"\r
+                               GeneratePreprocessedFile="0"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_mt/"\r
+                               ObjectFile=".\..\..\..\objs\debug_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\win32\vc2008\freetype249MT_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\src\autofit\autofit.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\bdf\bdf.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\cff\cff.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftbase.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftbitmap.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\cache\ftcache.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\ftdebug.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftfstype.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftgasp.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftglyph.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\gzip\ftgzip.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftinit.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\lzw\ftlzw.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftstroke.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftsystem.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\smooth\smooth.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <Filter\r
+                               Name="FT_MODULES"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftbbox.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftmm.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftpfr.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftsynth.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\fttype1.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftwinfnt.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftxf86.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftlcdfil.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftgxval.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftotval.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftpatent.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\pcf\pcf.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\pfr\pfr.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\psaux\psaux.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\pshinter\pshinter.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\psnames\psmodule.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\raster\raster.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\sfnt\sfnt.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\truetype\truetype.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\type1\type1.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\cid\type1cid.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\type42\type42.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\winfonts\winfnt.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\include\ft2build.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftconfig.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftheader.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftmodule.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftoption.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftstdlib.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/builds/win32/vc2008/index.html b/builds/win32/vc2008/index.html
new file mode 100644 (file)
index 0000000..9ad33ea
--- /dev/null
@@ -0,0 +1,37 @@
+<html>
+<header>
+<title>
+  FreeType&nbsp;2 Project Files for VS.NET&nbsp;2008
+</title>
+
+<body>
+<h1>
+  FreeType&nbsp;2 Project Files for VS.NET&nbsp;2008
+</h1>
+
+<p>This directory contains project files for Visual C++, named
+<tt>freetype.vcproj</tt>, and Visual Studio, called <tt>freetype.sln</tt>.  It
+compiles the following libraries from the FreeType 2.4.9 sources:</p>
+
+<ul>
+  <pre>
+    freetype249.lib     - release build; single threaded
+    freetype249_D.lib   - debug build;   single threaded
+    freetype249MT.lib   - release build; multi-threaded
+    freetype249MT_D.lib - debug build;   multi-threaded</pre>
+</ul>
+
+<p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
+archives are already stored this way, so no further action is required.  If
+you use some <tt>.tar.*z</tt> archives, be sure to configure your extracting
+tool to convert the line endings.  For example, with <a
+href="http://www.winzip.com">WinZip</a>, you should activate the <it>TAR
+file smart CR/LF Conversion</it> option.  Alternatively, you may consider
+using the <tt>unix2dos</tt> or <tt>u2d</tt> utilities that are floating
+around, which specifically deal with this particular problem.
+
+<p>Build directories are placed in the top-level <tt>objs</tt>
+directory.</p>
+
+</body>
+</html>
diff --git a/builds/win32/vc2010/freetype.sln b/builds/win32/vc2010/freetype.sln
new file mode 100644 (file)
index 0000000..3439f62
--- /dev/null
@@ -0,0 +1,32 @@
+\r
+Microsoft Visual Studio Solution File, Format Version 11.00\r
+# Visual Studio 2010\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcxproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               Debug Multithreaded|Win32 = Debug Multithreaded|Win32\r
+               Debug Singlethreaded|Win32 = Debug Singlethreaded|Win32\r
+               Debug|Win32 = Debug|Win32\r
+               Release Multithreaded|Win32 = Release Multithreaded|Win32\r
+               Release Singlethreaded|Win32 = Release Singlethreaded|Win32\r
+               Release|Win32 = Release|Win32\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Multithreaded|Win32.ActiveCfg = Debug Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Multithreaded|Win32.Build.0 = Debug Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Singlethreaded|Win32.ActiveCfg = Debug Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Singlethreaded|Win32.Build.0 = Debug Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.Build.0 = Debug|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Multithreaded|Win32.ActiveCfg = Release Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Multithreaded|Win32.Build.0 = Release Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Singlethreaded|Win32.ActiveCfg = Release Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Singlethreaded|Win32.Build.0 = Release Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.ActiveCfg = Release|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.Build.0 = Release|Win32\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/builds/win32/vc2010/freetype.vcxproj b/builds/win32/vc2010/freetype.vcxproj
new file mode 100644 (file)
index 0000000..e88c45f
--- /dev/null
@@ -0,0 +1,832 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup Label="ProjectConfigurations">\r
+    <ProjectConfiguration Include="Debug Multithreaded|Win32">\r
+      <Configuration>Debug Multithreaded</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug Singlethreaded|Win32">\r
+      <Configuration>Debug Singlethreaded</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Debug|Win32">\r
+      <Configuration>Debug</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release Multithreaded|Win32">\r
+      <Configuration>Release Multithreaded</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release Singlethreaded|Win32">\r
+      <Configuration>Release Singlethreaded</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+    <ProjectConfiguration Include="Release|Win32">\r
+      <Configuration>Release</Configuration>\r
+      <Platform>Win32</Platform>\r
+    </ProjectConfiguration>\r
+  </ItemGroup>\r
+  <PropertyGroup Label="Globals">\r
+    <ProjectGuid>{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}</ProjectGuid>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <UseOfMfc>false</UseOfMfc>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <UseOfMfc>false</UseOfMfc>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <UseOfMfc>false</UseOfMfc>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <UseOfMfc>false</UseOfMfc>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <UseOfMfc>false</UseOfMfc>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <UseOfMfc>false</UseOfMfc>\r
+    <CharacterSet>MultiByte</CharacterSet>\r
+  </PropertyGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+  <ImportGroup Label="ExtensionSettings">\r
+  </ImportGroup>\r
+  <PropertyGroup>\r
+    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\..\..\..\objs\win32\vc2010\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\..\..\..\objs\release\</IntDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">.\..\..\..\objs\win32\vc2010\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">.\..\..\..\objs\release_mt\</IntDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">.\..\..\..\objs\win32\vc2010\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">.\..\..\..\objs\release_st\</IntDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\..\..\..\objs\win32\vc2010\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\..\..\..\objs\debug\</IntDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">.\..\..\..\objs\win32\vc2010\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">.\..\..\..\objs\debug_st\</IntDir>\r
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">.\..\..\..\objs\win32\vc2010\</OutDir>\r
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">.\..\..\..\objs\debug_mt\</IntDir>\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'" />\r
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">freetype249_D</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">freetype249MT_D</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">freetype249ST_D</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">freetype249</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">freetype249MT</TargetName>\r
+    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">freetype249ST</TargetName>\r
+  </PropertyGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+    <ClCompile>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <DisableLanguageExtensions>true</DisableLanguageExtensions>\r
+      <WarningLevel>Level4</WarningLevel>\r
+      <DebugInformationFormat>\r
+      </DebugInformationFormat>\r
+      <CompileAs>Default</CompileAs>\r
+      <DisableSpecificWarnings>4001</DisableSpecificWarnings>\r
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
+    </ClCompile>\r
+    <ResourceCompile>\r
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Culture>0x0409</Culture>\r
+    </ResourceCompile>\r
+    <Lib>\r
+      <SuppressStartupBanner>true</SuppressStartupBanner>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">\r
+    <ClCompile>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <DisableLanguageExtensions>true</DisableLanguageExtensions>\r
+      <WarningLevel>Level4</WarningLevel>\r
+      <DebugInformationFormat>\r
+      </DebugInformationFormat>\r
+      <CompileAs>Default</CompileAs>\r
+      <DisableSpecificWarnings>4001</DisableSpecificWarnings>\r
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
+    </ClCompile>\r
+    <ResourceCompile>\r
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Culture>0x0409</Culture>\r
+    </ResourceCompile>\r
+    <Lib>\r
+      <SuppressStartupBanner>true</SuppressStartupBanner>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">\r
+    <ClCompile>\r
+      <Optimization>MaxSpeed</Optimization>\r
+      <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>\r
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <StringPooling>true</StringPooling>\r
+      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
+      <FunctionLevelLinking>true</FunctionLevelLinking>\r
+      <DisableLanguageExtensions>true</DisableLanguageExtensions>\r
+      <WarningLevel>Level4</WarningLevel>\r
+      <DebugInformationFormat>\r
+      </DebugInformationFormat>\r
+      <CompileAs>Default</CompileAs>\r
+      <DisableSpecificWarnings>4001</DisableSpecificWarnings>\r
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
+    </ClCompile>\r
+    <ResourceCompile>\r
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Culture>0x0409</Culture>\r
+    </ResourceCompile>\r
+    <Lib />\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+    <ClCompile>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
+      <DisableLanguageExtensions>true</DisableLanguageExtensions>\r
+      <WarningLevel>Level4</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CompileAs>Default</CompileAs>\r
+      <DisableSpecificWarnings>4001</DisableSpecificWarnings>\r
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
+    </ClCompile>\r
+    <ResourceCompile>\r
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Culture>0x0409</Culture>\r
+    </ResourceCompile>\r
+    <Lib>\r
+      <SuppressStartupBanner>true</SuppressStartupBanner>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">\r
+    <ClCompile>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
+      <DisableLanguageExtensions>true</DisableLanguageExtensions>\r
+      <WarningLevel>Level4</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CompileAs>Default</CompileAs>\r
+      <DisableSpecificWarnings>4001</DisableSpecificWarnings>\r
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
+    </ClCompile>\r
+    <ResourceCompile>\r
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Culture>0x0409</Culture>\r
+    </ResourceCompile>\r
+    <Lib>\r
+      <SuppressStartupBanner>true</SuppressStartupBanner>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">\r
+    <ClCompile>\r
+      <Optimization>Disabled</Optimization>\r
+      <AdditionalIncludeDirectories>..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions>_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessToFile>false</PreprocessToFile>\r
+      <PreprocessSuppressLineNumbers>false</PreprocessSuppressLineNumbers>\r
+      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
+      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
+      <DisableLanguageExtensions>true</DisableLanguageExtensions>\r
+      <WarningLevel>Level4</WarningLevel>\r
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>\r
+      <CompileAs>Default</CompileAs>\r
+      <DisableSpecificWarnings>4001</DisableSpecificWarnings>\r
+      <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
+    </ClCompile>\r
+    <ResourceCompile>\r
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Culture>0x0409</Culture>\r
+    </ResourceCompile>\r
+    <Lib>\r
+      <SuppressStartupBanner>true</SuppressStartupBanner>\r
+    </Lib>\r
+  </ItemDefinitionGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\src\autofit\autofit.c" />\r
+    <ClCompile Include="..\..\..\src\bdf\bdf.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\cff\cff.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftbase.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftbitmap.c" />\r
+    <ClCompile Include="..\..\..\src\cache\ftcache.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\ftdebug.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">false</DisableLanguageExtensions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">false</DisableLanguageExtensions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableLanguageExtensions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">false</DisableLanguageExtensions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">false</DisableLanguageExtensions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</DisableLanguageExtensions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftfstype.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftgasp.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftglyph.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\gzip\ftgzip.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftinit.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\lzw\ftlzw.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftstroke.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftsystem.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\smooth\smooth.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftbbox.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftmm.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftpfr.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftsynth.c" />\r
+    <ClCompile Include="..\..\..\src\base\fttype1.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftwinfnt.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftxf86.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftlcdfil.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftgxval.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftotval.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftpatent.c" />\r
+    <ClCompile Include="..\..\..\src\pcf\pcf.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\pfr\pfr.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\psaux\psaux.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\pshinter\pshinter.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\psnames\psmodule.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\raster\raster.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\sfnt\sfnt.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\truetype\truetype.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\type1\type1.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\cid\type1cid.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\type42\type42.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\winfonts\winfnt.c">\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
+      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
+      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\include\ft2build.h" />\r
+    <ClInclude Include="..\..\..\include\freetype\config\ftconfig.h" />\r
+    <ClInclude Include="..\..\..\include\freetype\config\ftheader.h" />\r
+    <ClInclude Include="..\..\..\include\freetype\config\ftmodule.h" />\r
+    <ClInclude Include="..\..\..\include\freetype\config\ftoption.h" />\r
+    <ClInclude Include="..\..\..\include\freetype\config\ftstdlib.h" />\r
+  </ItemGroup>\r
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+  <ImportGroup Label="ExtensionTargets">\r
+  </ImportGroup>\r
+</Project>\r
diff --git a/builds/win32/vc2010/freetype.vcxproj.filters b/builds/win32/vc2010/freetype.vcxproj.filters
new file mode 100644 (file)
index 0000000..a3a9f19
--- /dev/null
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+  <ItemGroup>\r
+    <Filter Include="Source Files">\r
+      <UniqueIdentifier>{b4c15893-ec11-491d-9507-0ac184f9cc78}</UniqueIdentifier>\r
+      <Extensions>cpp;c;cxx;rc;def;r;odl;idl;hpj;bat</Extensions>\r
+    </Filter>\r
+    <Filter Include="Source Files\FT_MODULES">\r
+      <UniqueIdentifier>{4d3e4eff-3fbc-4b20-b413-2743b23b7109}</UniqueIdentifier>\r
+    </Filter>\r
+    <Filter Include="Header Files">\r
+      <UniqueIdentifier>{e6cf6a0f-0404-4024-8bf8-ff5b29f35657}</UniqueIdentifier>\r
+      <Extensions>h;hpp;hxx;hm;inl</Extensions>\r
+    </Filter>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClCompile Include="..\..\..\src\autofit\autofit.c">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\bdf\bdf.c">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\cff\cff.c">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftbase.c">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftbitmap.c">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\cache\ftcache.c">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\ftdebug.c">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftfstype.c">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftgasp.c">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftglyph.c">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\gzip\ftgzip.c">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftinit.c">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\lzw\ftlzw.c">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftstroke.c">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftsystem.c">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\smooth\smooth.c">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftbbox.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftmm.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftpfr.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftsynth.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\fttype1.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftwinfnt.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftxf86.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftlcdfil.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftgxval.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftotval.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftpatent.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\pcf\pcf.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\pfr\pfr.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\psaux\psaux.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\pshinter\pshinter.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\psnames\psmodule.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\raster\raster.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\sfnt\sfnt.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\truetype\truetype.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\type1\type1.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\cid\type1cid.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\type42\type42.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\winfonts\winfnt.c">\r
+      <Filter>Source Files\FT_MODULES</Filter>\r
+    </ClCompile>\r
+  </ItemGroup>\r
+  <ItemGroup>\r
+    <ClInclude Include="..\..\..\include\ft2build.h">\r
+      <Filter>Header Files</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\include\freetype\config\ftconfig.h">\r
+      <Filter>Header Files</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\include\freetype\config\ftheader.h">\r
+      <Filter>Header Files</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\include\freetype\config\ftmodule.h">\r
+      <Filter>Header Files</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\include\freetype\config\ftoption.h">\r
+      <Filter>Header Files</Filter>\r
+    </ClInclude>\r
+    <ClInclude Include="..\..\..\include\freetype\config\ftstdlib.h">\r
+      <Filter>Header Files</Filter>\r
+    </ClInclude>\r
+  </ItemGroup>\r
+</Project>\r
diff --git a/builds/win32/vc2010/index.html b/builds/win32/vc2010/index.html
new file mode 100644 (file)
index 0000000..1d492fb
--- /dev/null
@@ -0,0 +1,37 @@
+<html>
+<header>
+<title>
+  FreeType&nbsp;2 Project Files for VS.NET&nbsp;2010
+</title>
+
+<body>
+<h1>
+  FreeType&nbsp;2 Project Files for VS.NET&nbsp;2010
+</h1>
+
+<p>This directory contains a project file for Visual C++, named
+<tt>freetype.vcxproj</tt>, and Visual Studio, called <tt>freetype.sln</tt>.  It
+compiles the following libraries from the FreeType 2.4.9 sources:</p>
+
+<ul>
+  <pre>
+    freetype249.lib     - release build; single threaded
+    freetype249_D.lib   - debug build;   single threaded
+    freetype249MT.lib   - release build; multi-threaded
+    freetype249MT_D.lib - debug build;   multi-threaded</pre>
+</ul>
+
+<p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
+archives are already stored this way, so no further action is required.  If
+you use some <tt>.tar.*z</tt> archives, be sure to configure your extracting
+tool to convert the line endings.  For example, with <a
+href="http://www.winzip.com">WinZip</a>, you should activate the <it>TAR
+file smart CR/LF Conversion</it> option.  Alternatively, you may consider
+using the <tt>unix2dos</tt> or <tt>u2d</tt> utilities that are floating
+around, which specifically deal with this particular problem.
+
+<p>Build directories are placed in the top-level <tt>objs</tt>
+directory.</p>
+
+</body>
+</html>
diff --git a/builds/win32/visualc/freetype.dsp b/builds/win32/visualc/freetype.dsp
new file mode 100644 (file)
index 0000000..274a763
--- /dev/null
@@ -0,0 +1,400 @@
+# Microsoft Developer Studio Project File - Name="freetype" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Static Library" 0x0104\r
+\r
+CFG=freetype - Win32 Debug Singlethreaded\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "freetype.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "freetype.mak" CFG="freetype - Win32 Debug Singlethreaded"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "freetype - Win32 Release" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "freetype - Win32 Debug" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "freetype - Win32 Debug Multithreaded" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "freetype - Win32 Release Multithreaded" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "freetype - Win32 Release Singlethreaded" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "freetype - Win32 Debug Singlethreaded" (based on "Win32 (x86) Static Library")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "freetype - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "..\..\..\objs\release"\r
+# PROP Intermediate_Dir "..\..\..\objs\release"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c\r
+# ADD CPP /MD /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c\r
+# SUBTRACT CPP /nologo /Z<none> /YX\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype249.lib"\r
+\r
+!ELSEIF  "$(CFG)" == "freetype - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "..\..\..\objs\debug"\r
+# PROP Intermediate_Dir "..\..\..\objs\debug"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c\r
+# ADD CPP /MDd /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c\r
+# SUBTRACT CPP /nologo /X /YX\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype249_D.lib"\r
+\r
+!ELSEIF  "$(CFG)" == "freetype - Win32 Debug Multithreaded"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "freetype___Win32_Debug_Multithreaded"\r
+# PROP BASE Intermediate_Dir "freetype___Win32_Debug_Multithreaded"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "..\..\..\objs\debug_mt"\r
+# PROP Intermediate_Dir "..\..\..\objs\debug_mt"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /Za /W3 /Gm /GX /ZI /Od /I "..\freetype\include\\" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /GZ /c\r
+# SUBTRACT BASE CPP /X\r
+# ADD CPP /MTd /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c\r
+# SUBTRACT CPP /nologo /X /YX\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo /out:"lib\freetype249_D.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype249MT_D.lib"\r
+\r
+!ELSEIF  "$(CFG)" == "freetype - Win32 Release Multithreaded"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "freetype___Win32_Release_Multithreaded"\r
+# PROP BASE Intermediate_Dir "freetype___Win32_Release_Multithreaded"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "..\..\..\objs\release_mt"\r
+# PROP Intermediate_Dir "..\..\..\objs\release_mt"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /Za /W3 /GX /O2 /I "..\freetype\include\\" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /c\r
+# ADD CPP /MT /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c\r
+# SUBTRACT CPP /nologo /Z<none> /YX\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo /out:"lib\freetype249.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype249MT.lib"\r
+\r
+!ELSEIF  "$(CFG)" == "freetype - Win32 Release Singlethreaded"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "freetype___Win32_Release_Singlethreaded"\r
+# PROP BASE Intermediate_Dir "freetype___Win32_Release_Singlethreaded"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "..\..\..\objs\release_st"\r
+# PROP Intermediate_Dir "..\..\..\objs\release_st"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MD /Za /W4 /GX /Zi /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /FD /c\r
+# SUBTRACT BASE CPP /YX\r
+# ADD CPP /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c\r
+# SUBTRACT CPP /nologo /Z<none> /YX\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype249.lib"\r
+# ADD LIB32 /out:"..\..\..\objs\freetype249ST.lib"\r
+# SUBTRACT LIB32 /nologo\r
+\r
+!ELSEIF  "$(CFG)" == "freetype - Win32 Debug Singlethreaded"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "freetype___Win32_Debug_Singlethreaded"\r
+# PROP BASE Intermediate_Dir "freetype___Win32_Debug_Singlethreaded"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "..\..\..\objs\debug_st"\r
+# PROP Intermediate_Dir "..\..\..\objs\debug_st"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MDd /Za /W4 /Gm /GX /Zi /Od /I "..\..\..\include" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /FD /GZ /c\r
+# SUBTRACT BASE CPP /X /YX\r
+# ADD CPP /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c\r
+# SUBTRACT CPP /nologo /X /YX\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype249_D.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype249ST_D.lib"\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "freetype - Win32 Release"\r
+# Name "freetype - Win32 Debug"\r
+# Name "freetype - Win32 Debug Multithreaded"\r
+# Name "freetype - Win32 Release Multithreaded"\r
+# Name "freetype - Win32 Release Singlethreaded"\r
+# Name "freetype - Win32 Debug Singlethreaded"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\autofit\autofit.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\bdf\bdf.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\cff\cff.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftbase.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftbbox.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftbdf.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftbitmap.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftfstype.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftgasp.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\cache\ftcache.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\ftdebug.c\r
+# ADD CPP /Ze\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftglyph.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftgxval.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\gzip\ftgzip.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftinit.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\lzw\ftlzw.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftmm.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftotval.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftpfr.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftstroke.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftsynth.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftsystem.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\fttype1.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftwinfnt.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftxf86.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\pcf\pcf.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\pfr\pfr.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\psaux\psaux.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\pshinter\pshinter.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\psnames\psmodule.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\raster\raster.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\sfnt\sfnt.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\smooth\smooth.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\truetype\truetype.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\type1\type1.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\cid\type1cid.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\type42\type42.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\winfonts\winfnt.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\include\ft2build.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\include\freetype\config\ftconfig.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\include\freetype\config\ftheader.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\include\freetype\config\ftmodule.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\include\freetype\config\ftoption.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\include\freetype\config\ftstdlib.h\r
+# End Source File\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/builds/win32/visualc/freetype.dsw b/builds/win32/visualc/freetype.dsw
new file mode 100644 (file)
index 0000000..b149e76
--- /dev/null
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00\r
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r
+\r
+###############################################################################\r
+\r
+Project: "freetype"=.\freetype.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Global:\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<3>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
diff --git a/builds/win32/visualc/freetype.sln b/builds/win32/visualc/freetype.sln
new file mode 100644 (file)
index 0000000..1f64be2
--- /dev/null
@@ -0,0 +1,31 @@
+Microsoft Visual Studio Solution File, Format Version 9.00\r
+# Visual Studio 2005\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               Debug Multithreaded|Win32 = Debug Multithreaded|Win32\r
+               Debug Singlethreaded|Win32 = Debug Singlethreaded|Win32\r
+               Debug|Win32 = Debug|Win32\r
+               Release Multithreaded|Win32 = Release Multithreaded|Win32\r
+               Release Singlethreaded|Win32 = Release Singlethreaded|Win32\r
+               Release|Win32 = Release|Win32\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Multithreaded|Win32.ActiveCfg = Debug Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Multithreaded|Win32.Build.0 = Debug Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Singlethreaded|Win32.ActiveCfg = Debug Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug Singlethreaded|Win32.Build.0 = Debug Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.ActiveCfg = Debug|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Debug|Win32.Build.0 = Debug|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Multithreaded|Win32.ActiveCfg = Release Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Multithreaded|Win32.Build.0 = Release Multithreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Singlethreaded|Win32.ActiveCfg = Release Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release Singlethreaded|Win32.Build.0 = Release Singlethreaded|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.ActiveCfg = Release|Win32\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.Release|Win32.Build.0 = Release|Win32\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/builds/win32/visualc/freetype.vcproj b/builds/win32/visualc/freetype.vcproj
new file mode 100644 (file)
index 0000000..f0638da
--- /dev/null
@@ -0,0 +1,2179 @@
+<?xml version="1.0" encoding="Windows-1252"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8.00"\r
+       Name="freetype"\r
+       ProjectGUID="{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\release"\r
+                       IntermediateDirectory=".\..\..\..\objs\release"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release/"\r
+                               ObjectFile=".\..\..\..\objs\release/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Multithreaded|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\release_mt"\r
+                       IntermediateDirectory=".\..\..\..\objs\release_mt"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_mt/"\r
+                               ObjectFile=".\..\..\..\objs\release_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249MT.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Singlethreaded|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\release_st"\r
+                       IntermediateDirectory=".\..\..\..\objs\release_st"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_st/"\r
+                               ObjectFile=".\..\..\..\objs\release_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249ST.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\debug"\r
+                       IntermediateDirectory=".\..\..\..\objs\debug"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_DEBUG;WIN32;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug/"\r
+                               ObjectFile=".\..\..\..\objs\debug/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Singlethreaded|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\debug_st"\r
+                       IntermediateDirectory=".\..\..\..\objs\debug_st"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_DEBUG;WIN32;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_st/"\r
+                               ObjectFile=".\..\..\..\objs\debug_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249ST_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Multithreaded|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\debug_mt"\r
+                       IntermediateDirectory=".\..\..\..\objs\debug_mt"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_DEBUG;WIN32;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE"\r
+                               GeneratePreprocessedFile="0"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_mt/"\r
+                               ObjectFile=".\..\..\..\objs\debug_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249MT_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\src\autofit\autofit.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\bdf\bdf.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\cff\cff.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftbase.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftbitmap.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftfstype.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftgasp.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\cache\ftcache.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\ftdebug.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftglyph.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\gzip\ftgzip.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftinit.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\lzw\ftlzw.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftstroke.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftsystem.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\smooth\smooth.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <Filter\r
+                               Name="FT_MODULES"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftbbox.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftmm.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftpfr.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftsynth.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\fttype1.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftwinfnt.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftxf86.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftlcdfil.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftgxval.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftotval.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftpatent.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\pcf\pcf.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\pfr\pfr.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\psaux\psaux.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\pshinter\pshinter.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\psnames\psmodule.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\raster\raster.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\sfnt\sfnt.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\truetype\truetype.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\type1\type1.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\cid\type1cid.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\type42\type42.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\winfonts\winfnt.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\include\ft2build.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftconfig.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftheader.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftmodule.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftoption.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftstdlib.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/builds/win32/visualc/index.html b/builds/win32/visualc/index.html
new file mode 100644 (file)
index 0000000..a32c95f
--- /dev/null
@@ -0,0 +1,37 @@
+<html>
+<header>
+<title>
+  FreeType&nbsp;2 Project Files for Visual&nbsp;C++ and VS.NET&nbsp;2005
+</title>
+
+<body>
+<h1>
+  FreeType&nbsp;2 Project Files for Visual&nbsp;C++ and VS.NET&nbsp;2005
+</h1>
+
+<p>This directory contains project files for Visual C++, named
+<tt>freetype.dsp</tt>, and Visual Studio, called <tt>freetype.sln</tt>.  It
+compiles the following libraries from the FreeType 2.4.9 sources:</p>
+
+<ul>
+  <pre>
+    freetype249.lib     - release build; single threaded
+    freetype249_D.lib   - debug build;   single threaded
+    freetype249MT.lib   - release build; multi-threaded
+    freetype249MT_D.lib - debug build;   multi-threaded</pre>
+</ul>
+
+<p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
+archives are already stored this way, so no further action is required.  If
+you use some <tt>.tar.*z</tt> archives, be sure to configure your extracting
+tool to convert the line endings.  For example, with <a
+href="http://www.winzip.com">WinZip</a>, you should activate the <it>TAR
+file smart CR/LF Conversion</it> option.  Alternatively, you may consider
+using the <tt>unix2dos</tt> or <tt>u2d</tt> utilities that are floating
+around, which specifically deal with this particular problem.
+
+<p>Build directories are placed in the top-level <tt>objs</tt>
+directory.</p>
+
+</body>
+</html>
diff --git a/builds/win32/visualce/freetype.dsp b/builds/win32/visualce/freetype.dsp
new file mode 100644 (file)
index 0000000..274a763
--- /dev/null
@@ -0,0 +1,400 @@
+# Microsoft Developer Studio Project File - Name="freetype" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Static Library" 0x0104\r
+\r
+CFG=freetype - Win32 Debug Singlethreaded\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "freetype.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "freetype.mak" CFG="freetype - Win32 Debug Singlethreaded"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "freetype - Win32 Release" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "freetype - Win32 Debug" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "freetype - Win32 Debug Multithreaded" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "freetype - Win32 Release Multithreaded" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "freetype - Win32 Release Singlethreaded" (based on "Win32 (x86) Static Library")\r
+!MESSAGE "freetype - Win32 Debug Singlethreaded" (based on "Win32 (x86) Static Library")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+RSC=rc.exe\r
+\r
+!IF  "$(CFG)" == "freetype - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "..\..\..\objs\release"\r
+# PROP Intermediate_Dir "..\..\..\objs\release"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c\r
+# ADD CPP /MD /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c\r
+# SUBTRACT CPP /nologo /Z<none> /YX\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype249.lib"\r
+\r
+!ELSEIF  "$(CFG)" == "freetype - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "..\..\..\objs\debug"\r
+# PROP Intermediate_Dir "..\..\..\objs\debug"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c\r
+# ADD CPP /MDd /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c\r
+# SUBTRACT CPP /nologo /X /YX\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype249_D.lib"\r
+\r
+!ELSEIF  "$(CFG)" == "freetype - Win32 Debug Multithreaded"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "freetype___Win32_Debug_Multithreaded"\r
+# PROP BASE Intermediate_Dir "freetype___Win32_Debug_Multithreaded"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "..\..\..\objs\debug_mt"\r
+# PROP Intermediate_Dir "..\..\..\objs\debug_mt"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /Za /W3 /Gm /GX /ZI /Od /I "..\freetype\include\\" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /GZ /c\r
+# SUBTRACT BASE CPP /X\r
+# ADD CPP /MTd /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c\r
+# SUBTRACT CPP /nologo /X /YX\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo /out:"lib\freetype249_D.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype249MT_D.lib"\r
+\r
+!ELSEIF  "$(CFG)" == "freetype - Win32 Release Multithreaded"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "freetype___Win32_Release_Multithreaded"\r
+# PROP BASE Intermediate_Dir "freetype___Win32_Release_Multithreaded"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "..\..\..\objs\release_mt"\r
+# PROP Intermediate_Dir "..\..\..\objs\release_mt"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /Za /W3 /GX /O2 /I "..\freetype\include\\" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_FLAT_COMPILE" /YX /FD /c\r
+# ADD CPP /MT /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c\r
+# SUBTRACT CPP /nologo /Z<none> /YX\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo /out:"lib\freetype249.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype249MT.lib"\r
+\r
+!ELSEIF  "$(CFG)" == "freetype - Win32 Release Singlethreaded"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "freetype___Win32_Release_Singlethreaded"\r
+# PROP BASE Intermediate_Dir "freetype___Win32_Release_Singlethreaded"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "..\..\..\objs\release_st"\r
+# PROP Intermediate_Dir "..\..\..\objs\release_st"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MD /Za /W4 /GX /Zi /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /FD /c\r
+# SUBTRACT BASE CPP /YX\r
+# ADD CPP /Za /W4 /GX /O2 /I "..\..\..\include" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /c\r
+# SUBTRACT CPP /nologo /Z<none> /YX\r
+# ADD BASE RSC /l 0x409 /d "NDEBUG"\r
+# ADD RSC /l 0x409 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype249.lib"\r
+# ADD LIB32 /out:"..\..\..\objs\freetype249ST.lib"\r
+# SUBTRACT LIB32 /nologo\r
+\r
+!ELSEIF  "$(CFG)" == "freetype - Win32 Debug Singlethreaded"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "freetype___Win32_Debug_Singlethreaded"\r
+# PROP BASE Intermediate_Dir "freetype___Win32_Debug_Singlethreaded"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "..\..\..\objs\debug_st"\r
+# PROP Intermediate_Dir "..\..\..\objs\debug_st"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MDd /Za /W4 /Gm /GX /Zi /Od /I "..\..\..\include" /D "_DEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /FD /GZ /c\r
+# SUBTRACT BASE CPP /X /YX\r
+# ADD CPP /Za /W4 /GX /Z7 /Od /I "..\..\..\include" /D "_DEBUG" /D "FT_DEBUG_LEVEL_ERROR" /D "FT_DEBUG_LEVEL_TRACE" /D "WIN32" /D "_MBCS" /D "_LIB" /D "FT2_BUILD_LIBRARY" /FD /GZ /c\r
+# SUBTRACT CPP /nologo /X /YX\r
+# ADD BASE RSC /l 0x409 /d "_DEBUG"\r
+# ADD RSC /l 0x409 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LIB32=link.exe -lib\r
+# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype249_D.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype249ST_D.lib"\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "freetype - Win32 Release"\r
+# Name "freetype - Win32 Debug"\r
+# Name "freetype - Win32 Debug Multithreaded"\r
+# Name "freetype - Win32 Release Multithreaded"\r
+# Name "freetype - Win32 Release Singlethreaded"\r
+# Name "freetype - Win32 Debug Singlethreaded"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\autofit\autofit.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\bdf\bdf.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\cff\cff.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftbase.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftbbox.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftbdf.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftbitmap.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftfstype.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftgasp.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\cache\ftcache.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\ftdebug.c\r
+# ADD CPP /Ze\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftglyph.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftgxval.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\gzip\ftgzip.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftinit.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\lzw\ftlzw.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftmm.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftotval.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftpfr.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftstroke.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftsynth.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftsystem.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\fttype1.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftwinfnt.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftxf86.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\pcf\pcf.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\pfr\pfr.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\psaux\psaux.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\pshinter\pshinter.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\psnames\psmodule.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\raster\raster.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\sfnt\sfnt.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\smooth\smooth.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\truetype\truetype.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\type1\type1.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\cid\type1cid.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\type42\type42.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\winfonts\winfnt.c\r
+# SUBTRACT CPP /Fr\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\include\ft2build.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\include\freetype\config\ftconfig.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\include\freetype\config\ftheader.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\include\freetype\config\ftmodule.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\include\freetype\config\ftoption.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\include\freetype\config\ftstdlib.h\r
+# End Source File\r
+# End Group\r
+# End Target\r
+# End Project\r
diff --git a/builds/win32/visualce/freetype.dsw b/builds/win32/visualce/freetype.dsw
new file mode 100644 (file)
index 0000000..b149e76
--- /dev/null
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00\r
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r
+\r
+###############################################################################\r
+\r
+Project: "freetype"=.\freetype.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Global:\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<3>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
diff --git a/builds/win32/visualce/freetype.vcproj b/builds/win32/visualce/freetype.vcproj
new file mode 100644 (file)
index 0000000..89a416a
--- /dev/null
@@ -0,0 +1,13885 @@
+<?xml version="1.0" encoding="Windows-1252"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="8,00"\r
+       Name="freetype"\r
+       ProjectGUID="{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Win32"\r
+               />\r
+               <Platform\r
+                       Name="Pocket PC 2003 (ARMV4)"\r
+               />\r
+               <Platform\r
+                       Name="Smartphone 2003 (ARMV4)"\r
+               />\r
+               <Platform\r
+                       Name="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+               />\r
+               <Platform\r
+                       Name="Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+               />\r
+               <Platform\r
+                       Name="Windows Mobile 6 Professional SDK (ARMV4I)"\r
+               />\r
+               <Platform\r
+                       Name="Windows Mobile 6 Standard SDK (ARMV4I)"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Release|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\release"\r
+                       IntermediateDirectory=".\..\..\..\objs\release"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release/"\r
+                               ObjectFile=".\..\..\..\objs\release/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Multithreaded|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\release_mt"\r
+                       IntermediateDirectory=".\..\..\..\objs\release_mt"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_mt/"\r
+                               ObjectFile=".\..\..\..\objs\release_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249MT.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Singlethreaded|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\release_st"\r
+                       IntermediateDirectory=".\..\..\..\objs\release_st"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_st/"\r
+                               ObjectFile=".\..\..\..\objs\release_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249ST.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\debug"\r
+                       IntermediateDirectory=".\..\..\..\objs\debug"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_DEBUG;WIN32;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="3"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug/"\r
+                               ObjectFile=".\..\..\..\objs\debug/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Singlethreaded|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\debug_st"\r
+                       IntermediateDirectory=".\..\..\..\objs\debug_st"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_DEBUG;WIN32;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_st/"\r
+                               ObjectFile=".\..\..\..\objs\debug_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249ST_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Multithreaded|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\debug_mt"\r
+                       IntermediateDirectory=".\..\..\..\objs\debug_mt"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_DEBUG;WIN32;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE"\r
+                               GeneratePreprocessedFile="0"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_mt/"\r
+                               ObjectFile=".\..\..\..\objs\debug_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249MT_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                       OutputDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="false"\r
+                               MinimalRebuild="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release/"\r
+                               ObjectFile=".\..\..\..\objs\release/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                       OutputDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_mt/"\r
+                               ObjectFile=".\..\..\..\objs\release_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249MT.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                       OutputDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="false"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_st/"\r
+                               ObjectFile=".\..\..\..\objs\release_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249ST.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                       OutputDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               RuntimeLibrary="3"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug/"\r
+                               ObjectFile=".\..\..\..\objs\debug/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                       OutputDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_st/"\r
+                               ObjectFile=".\..\..\..\objs\debug_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249ST_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                       OutputDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE"\r
+                               GeneratePreprocessedFile="0"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_mt/"\r
+                               ObjectFile=".\..\..\..\objs\debug_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249MT_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                       OutputDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="false"\r
+                               MinimalRebuild="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release/"\r
+                               ObjectFile=".\..\..\..\objs\release/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                       OutputDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_mt/"\r
+                               ObjectFile=".\..\..\..\objs\release_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249MT.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                       OutputDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="false"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_st/"\r
+                               ObjectFile=".\..\..\..\objs\release_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249ST.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                       OutputDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               RuntimeLibrary="3"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug/"\r
+                               ObjectFile=".\..\..\..\objs\debug/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                       OutputDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_st/"\r
+                               ObjectFile=".\..\..\..\objs\debug_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249ST_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                       OutputDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE"\r
+                               GeneratePreprocessedFile="0"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_mt/"\r
+                               ObjectFile=".\..\..\..\objs\debug_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249MT_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="false"\r
+                               MinimalRebuild="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release/"\r
+                               ObjectFile=".\..\..\..\objs\release/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_mt/"\r
+                               ObjectFile=".\..\..\..\objs\release_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249MT.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="false"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_st/"\r
+                               ObjectFile=".\..\..\..\objs\release_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249ST.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               RuntimeLibrary="3"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug/"\r
+                               ObjectFile=".\..\..\..\objs\debug/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_st/"\r
+                               ObjectFile=".\..\..\..\objs\debug_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249ST_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE"\r
+                               GeneratePreprocessedFile="0"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_mt/"\r
+                               ObjectFile=".\..\..\..\objs\debug_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249MT_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="false"\r
+                               MinimalRebuild="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release/"\r
+                               ObjectFile=".\..\..\..\objs\release/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_mt/"\r
+                               ObjectFile=".\..\..\..\objs\release_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249MT.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="false"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_st/"\r
+                               ObjectFile=".\..\..\..\objs\release_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249ST.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               RuntimeLibrary="3"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug/"\r
+                               ObjectFile=".\..\..\..\objs\debug/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_st/"\r
+                               ObjectFile=".\..\..\..\objs\debug_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249ST_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE"\r
+                               GeneratePreprocessedFile="0"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_mt/"\r
+                               ObjectFile=".\..\..\..\objs\debug_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249MT_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="false"\r
+                               MinimalRebuild="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release/"\r
+                               ObjectFile=".\..\..\..\objs\release/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_mt/"\r
+                               ObjectFile=".\..\..\..\objs\release_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249MT.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="false"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_st/"\r
+                               ObjectFile=".\..\..\..\objs\release_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249ST.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               RuntimeLibrary="3"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug/"\r
+                               ObjectFile=".\..\..\..\objs\debug/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_st/"\r
+                               ObjectFile=".\..\..\..\objs\debug_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249ST_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE"\r
+                               GeneratePreprocessedFile="0"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_mt/"\r
+                               ObjectFile=".\..\..\..\objs\debug_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249MT_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="false"\r
+                               MinimalRebuild="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release/"\r
+                               ObjectFile=".\..\..\..\objs\release/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_mt/"\r
+                               ObjectFile=".\..\..\..\objs\release_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249MT.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="false"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_st/"\r
+                               ObjectFile=".\..\..\..\objs\release_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249ST.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               RuntimeLibrary="3"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug/"\r
+                               ObjectFile=".\..\..\..\objs\debug/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_st/"\r
+                               ObjectFile=".\..\..\..\objs\debug_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249ST_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE"\r
+                               GeneratePreprocessedFile="0"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_mt/"\r
+                               ObjectFile=".\..\..\..\objs\debug_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\freetype249MT_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\src\autofit\autofit.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\bdf\bdf.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\cff\cff.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftbase.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftbitmap.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftfstype.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\cache\ftcache.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\ftdebug.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftgasp.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftglyph.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\gzip\ftgzip.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftinit.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\lzw\ftlzw.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftstroke.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftsystem.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\smooth\smooth.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <Filter\r
+                               Name="FT_MODULES"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftbbox.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftmm.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftpfr.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftsynth.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\fttype1.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftwinfnt.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftxf86.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftlcdfil.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftgxval.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftotval.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftpatent.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\pcf\pcf.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\pfr\pfr.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\psaux\psaux.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\pshinter\pshinter.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\psnames\psmodule.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\raster\raster.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\sfnt\sfnt.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\truetype\truetype.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\type1\type1.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\cid\type1cid.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\type42\type42.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\winfonts\winfnt.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\include\ft2build.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftconfig.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftheader.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftmodule.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftoption.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftstdlib.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/builds/win32/visualce/index.html b/builds/win32/visualce/index.html
new file mode 100644 (file)
index 0000000..eec6d61
--- /dev/null
@@ -0,0 +1,47 @@
+<html>
+<header>
+<title>
+  FreeType&nbsp;2 Project Files for Visual&nbsp;C++ and VS.NET&nbsp;2005
+  (Pocket PC)
+</title>
+
+<body>
+<h1>
+  FreeType&nbsp;2 Project Files for Visual&nbsp;C++ and VS.NET&nbsp;2005
+  (Pocket PC)
+</h1>
+
+<p>This directory contains project files for Visual C++, named
+<tt>freetype.dsp</tt>, and Visual Studio, called <tt>freetype.sln</tt> for
+the following targets:
+
+<ul>
+  <li>PPC/SP 2003 (Pocket PC 2003)</li>
+  <li>PPC/SP WM5 (Windows Mobile 5)</li>
+  <li>PPC/SP WM6 (Windows Mobile 6)</li>
+</ul>
+
+It compiles the following libraries from the FreeType 2.4.9 sources:</p>
+
+<ul>
+  <pre>
+    freetype249.lib     - release build; single threaded
+    freetype249_D.lib   - debug build;   single threaded
+    freetype249MT.lib   - release build; multi-threaded
+    freetype249MT_D.lib - debug build;   multi-threaded</pre>
+</ul>
+
+<p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
+archives are already stored this way, so no further action is required.  If
+you use some <tt>.tar.*z</tt> archives, be sure to configure your extracting
+tool to convert the line endings.  For example, with <a
+href="http://www.winzip.com">WinZip</a>, you should activate the <it>TAR
+file smart CR/LF Conversion</it> option.  Alternatively, you may consider
+using the <tt>unix2dos</tt> or <tt>u2d</tt> utilities that are floating
+around, which specifically deal with this particular problem.
+
+<p>Build directories are placed in the top-level <tt>objs</tt>
+directory.</p>
+
+</body>
+</html>
diff --git a/builds/win32/w32-bcc.mk b/builds/win32/w32-bcc.mk
new file mode 100644 (file)
index 0000000..a9f48fc
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# FreeType 2 Borland C++ on Win32
+#
+
+
+# Copyright 1996-2000, 2003, 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.
+
+# default definitions of the export list
+#
+EXPORTS_LIST      = $(OBJ_DIR)/freetype.def
+EXPORTS_OPTIONS   = /DEF:$(EXPORTS_LIST)
+APINAMES_OPTIONS := -dfreetype.dll -wB
+
+include $(TOP_DIR)/builds/win32/win32-def.mk
+include $(TOP_DIR)/builds/compiler/bcc.mk
+
+# include linking instructions
+include $(TOP_DIR)/builds/link_dos.mk
+
+
+# EOF
diff --git a/builds/win32/w32-bccd.mk b/builds/win32/w32-bccd.mk
new file mode 100644 (file)
index 0000000..51b15d9
--- /dev/null
@@ -0,0 +1,26 @@
+#
+# FreeType 2 Borland C++ on Win32 + debugging
+#
+
+
+# Copyright 1996-2000, 2003, 2006 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.
+
+
+DEVEL_DIR := $(TOP_DIR)/devel
+
+include $(TOP_DIR)/builds/win32/win32-def.mk
+
+include $(TOP_DIR)/builds/compiler/bcc-dev.mk
+
+# include linking instructions
+include $(TOP_DIR)/builds/link_dos.mk
+
+
+# EOF
diff --git a/builds/win32/w32-dev.mk b/builds/win32/w32-dev.mk
new file mode 100644 (file)
index 0000000..00cacb0
--- /dev/null
@@ -0,0 +1,32 @@
+#
+# FreeType 2 configuration rules for Win32 + GCC
+#
+#   Development version without optimizations.
+#
+
+
+# Copyright 1996-2000, 2003, 2006 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.
+
+
+# NOTE: This version requires that GNU Make is invoked from the Windows
+#       Shell (_not_ Cygwin BASH)!
+#
+
+DEVEL_DIR := $(TOP_DIR)/devel
+
+include $(TOP_DIR)/builds/win32/win32-def.mk
+
+include $(TOP_DIR)/builds/compiler/gcc-dev.mk
+
+# include linking instructions
+include $(TOP_DIR)/builds/link_dos.mk
+
+
+# EOF
diff --git a/builds/win32/w32-gcc.mk b/builds/win32/w32-gcc.mk
new file mode 100644 (file)
index 0000000..580afc5
--- /dev/null
@@ -0,0 +1,31 @@
+#
+# FreeType 2 configuration rules for Win32 + GCC
+#
+
+
+# Copyright 1996-2000, 2003, 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.
+
+# default definitions of the export list
+#
+EXPORTS_LIST      = $(OBJ_DIR)/freetype.def
+EXPORTS_OPTIONS   = $(EXPORTS_LIST)
+APINAMES_OPTIONS := -dfreetype.dll -w
+
+# include Win32-specific definitions
+include $(TOP_DIR)/builds/win32/win32-def.mk
+
+# include gcc-specific definitions
+include $(TOP_DIR)/builds/compiler/gcc.mk
+
+# include linking instructions
+include $(TOP_DIR)/builds/link_dos.mk
+
+
+# EOF
diff --git a/builds/win32/w32-icc.mk b/builds/win32/w32-icc.mk
new file mode 100644 (file)
index 0000000..8819a1f
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# FreeType 2 configuration rules for Win32 + IBM Visual Age C++
+#
+
+
+# Copyright 1996-2000, 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.
+
+# default definitions of the export list
+#
+EXPORTS_LIST      = $(OBJ_DIR)/freetype.def
+EXPORTS_OPTIONS   = /DEF:$(EXPORTS_LIST)
+APINAMES_OPTIONS := -dfreetype.dll -w
+
+include $(TOP_DIR)/builds/win32/win32-def.mk
+include $(TOP_DIR)/builds/compiler/visualage.mk
+
+# include linking instructions
+include $(TOP_DIR)/builds/link_dos.mk
+
+
+# EOF
diff --git a/builds/win32/w32-intl.mk b/builds/win32/w32-intl.mk
new file mode 100644 (file)
index 0000000..ae62e1b
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# FreeType 2 configuration rules for Intel C/C++ on Win32
+#
+
+
+# Copyright 1996-2000, 2003, 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.
+
+# default definitions of the export list
+#
+EXPORTS_LIST      = $(OBJ_DIR)/freetype.def
+EXPORTS_OPTIONS   = /DEF:$(EXPORTS_LIST)
+APINAMES_OPTIONS := -dfreetype.dll -w
+
+include $(TOP_DIR)/builds/win32/win32-def.mk
+include $(TOP_DIR)/builds/compiler/intelc.mk
+
+# include linking instructions
+include $(TOP_DIR)/builds/link_dos.mk
+
+
+# EOF
diff --git a/builds/win32/w32-lcc.mk b/builds/win32/w32-lcc.mk
new file mode 100644 (file)
index 0000000..a147c4c
--- /dev/null
@@ -0,0 +1,24 @@
+#
+# FreeType 2 configuration rules for Win32 + LCC
+#
+
+
+# Copyright 1996-2000 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.
+
+
+SEP := /
+include $(TOP_DIR)/builds/win32/win32-def.mk
+include $(TOP_DIR)/builds/compiler/win-lcc.mk
+
+# include linking instructions
+include $(TOP_DIR)/builds/link_dos.mk
+
+# EOF
+
diff --git a/builds/win32/w32-mingw32.mk b/builds/win32/w32-mingw32.mk
new file mode 100644 (file)
index 0000000..04e9e21
--- /dev/null
@@ -0,0 +1,33 @@
+#
+# FreeType 2 configuration rules for mingw32
+#
+
+
+# Copyright 1996-2000, 2003, 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.
+
+# default definitions of the export list
+#
+EXPORTS_LIST      = $(OBJ_DIR)/freetype.def
+EXPORTS_OPTIONS   = $(EXPORTS_LIST)
+APINAMES_OPTIONS := -dfreetype.dll -w
+
+# include Win32-specific definitions
+include $(TOP_DIR)/builds/win32/win32-def.mk
+
+LIBRARY := lib$(PROJECT)
+
+# include gcc-specific definitions
+include $(TOP_DIR)/builds/compiler/gcc.mk
+
+# include linking instructions
+include $(TOP_DIR)/builds/link_dos.mk
+
+
+# EOF
diff --git a/builds/win32/w32-vcc.mk b/builds/win32/w32-vcc.mk
new file mode 100644 (file)
index 0000000..7fb8794
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# FreeType 2 Visual C++ on Win32
+#
+
+
+# Copyright 1996-2000, 2003, 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.
+
+# definitions of the export list
+#
+EXPORTS_LIST      = $(OBJ_DIR)/freetype.def
+EXPORTS_OPTIONS   = /DEF:$(EXPORTS_LIST)
+APINAMES_OPTIONS := -dfreetype.dll -w
+
+include $(TOP_DIR)/builds/win32/win32-def.mk
+include $(TOP_DIR)/builds/compiler/visualc.mk
+
+# include linking instructions
+include $(TOP_DIR)/builds/link_dos.mk
+
+
+# EOF
diff --git a/builds/win32/w32-wat.mk b/builds/win32/w32-wat.mk
new file mode 100644 (file)
index 0000000..820b817
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# FreeType 2 configuration rules for Watcom C/C++
+#
+
+
+# Copyright 1996-2000, 2003, 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.
+
+# redefine export symbol definitions
+#
+EXPORTS_LIST      = $(OBJ_DIR)/watcom-ftexports.lbc
+EXPORTS_OPTIONS   = -\"export @$(EXPORTS_LIST)\"-
+APINAMES_OPTIONS := -wW
+
+include $(TOP_DIR)/builds/win32/win32-def.mk
+include $(TOP_DIR)/builds/compiler/watcom.mk
+
+# include linking instructions
+include $(TOP_DIR)/builds/link_dos.mk
+
+
+# EOF
diff --git a/builds/win32/win32-def.mk b/builds/win32/win32-def.mk
new file mode 100644 (file)
index 0000000..e6ae31c
--- /dev/null
@@ -0,0 +1,47 @@
+#
+# FreeType 2 Win32 specific definitions
+#
+
+
+# Copyright 1996-2000, 2003, 2005, 2006 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.
+
+
+DELETE    := del
+CAT       := type
+SEP       := $(strip \ )
+BUILD_DIR := $(TOP_DIR)/builds/win32
+PLATFORM  := win32
+
+# The executable file extension (for tools). NOTE: WE INCLUDE THE DOT HERE !!
+#
+E := .exe
+E_BUILD := .exe
+
+
+# The directory where all library files are placed.
+#
+# By default, this is the same as $(OBJ_DIR); however, this can be changed
+# to suit particular needs.
+#
+LIB_DIR := $(OBJ_DIR)
+
+
+# The name of the final library file.  Note that the DOS-specific Makefile
+# uses a shorter (8.3) name.
+#
+LIBRARY := $(PROJECT)
+
+
+# The NO_OUTPUT macro is used to ignore the output of commands.
+#
+NO_OUTPUT = 2> nul
+
+
+# EOF
diff --git a/builds/wince/ftdebug.c b/builds/wince/ftdebug.c
new file mode 100644 (file)
index 0000000..272415d
--- /dev/null
@@ -0,0 +1,236 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftdebug.c                                                              */
+/*                                                                         */
+/*    Debugging and logging component for WinCE (body).                    */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This component contains various macros and functions used to ease the */
+  /* debugging of the FreeType engine.  Its main purpose is in assertion   */
+  /* checking, tracing, and error detection.                               */
+  /*                                                                       */
+  /* There are now three debugging modes:                                  */
+  /*                                                                       */
+  /* - trace mode                                                          */
+  /*                                                                       */
+  /*   Error and trace messages are sent to the log file (which can be the */
+  /*   standard error output).                                             */
+  /*                                                                       */
+  /* - error mode                                                          */
+  /*                                                                       */
+  /*   Only error messages are generated.                                  */
+  /*                                                                       */
+  /* - release mode:                                                       */
+  /*                                                                       */
+  /*   No error message is sent or generated.  The code is free from any   */
+  /*   debugging parts.                                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <windows.h>
+
+
+  void
+  OutputDebugStringEx( const char*  str )
+  {
+    static WCHAR  buf[8192];
+
+
+    int sz = MultiByteToWideChar( CP_ACP, 0, str, -1, buf,
+                                  sizeof ( buf ) / sizeof ( *buf ) );
+    if ( !sz )
+      lstrcpyW( buf, L"OutputDebugStringEx: MultiByteToWideChar failed" );
+
+    OutputDebugStringW( buf );
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Message( const char*  fmt, ... )
+  {
+    static char  buf[8192];
+    va_list      ap;
+
+
+    va_start( ap, fmt );
+    vprintf( fmt, ap );
+    /* send the string to the debugger as well */
+    vsprintf( buf, fmt, ap );
+    OutputDebugStringEx( buf );
+    va_end( ap );
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Panic( const char*  fmt, ... )
+  {
+    static char  buf[8192];
+    va_list      ap;
+
+
+    va_start( ap, fmt );
+    vsprintf( buf, fmt, ap );
+    OutputDebugStringEx( buf );
+    va_end( ap );
+
+    exit( EXIT_FAILURE );
+  }
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+
+  /* array of trace levels, initialized to 0 */
+  int  ft_trace_levels[trace_count];
+
+  /* define array of trace toggle names */
+#define FT_TRACE_DEF( x )  #x ,
+
+  static const char*  ft_trace_toggles[trace_count + 1] =
+  {
+#include FT_INTERNAL_TRACE_H
+    NULL
+  };
+
+#undef FT_TRACE_DEF
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Initialize the tracing sub-system.  This is done by retrieving the    */
+  /* value of the "FT2_DEBUG" environment variable.  It must be a list of  */
+  /* toggles, separated by spaces, `;' or `,'.  Example:                   */
+  /*                                                                       */
+  /*    "any:3 memory:6 stream:5"                                          */
+  /*                                                                       */
+  /* This will request that all levels be set to 3, except the trace level */
+  /* for the memory and stream components which are set to 6 and 5,        */
+  /* respectively.                                                         */
+  /*                                                                       */
+  /* See the file <freetype/internal/fttrace.h> for details of the         */
+  /* available toggle names.                                               */
+  /*                                                                       */
+  /* The level must be between 0 and 6; 0 means quiet (except for serious  */
+  /* runtime errors), and 6 means _very_ verbose.                          */
+  /*                                                                       */
+  FT_BASE_DEF( void )
+  ft_debug_init( void )
+  {
+    /* Windows Mobile doesn't have environment API:           */
+    /* GetEnvironmentStrings, GetEnvironmentVariable, getenv. */
+    /*                                                        */
+    /* FIXME!!! How to set debug mode?                        */
+
+    /* const char*  ft2_debug = getenv( "FT2_DEBUG" ); */
+
+    const char*  ft2_debug = 0;
+
+
+    if ( ft2_debug )
+    {
+      const char*  p = ft2_debug;
+      const char*  q;
+
+
+      for ( ; *p; p++ )
+      {
+        /* skip leading whitespace and separators */
+        if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' )
+          continue;
+
+        /* read toggle name, followed by ':' */
+        q = p;
+        while ( *p && *p != ':' )
+          p++;
+
+        if ( *p == ':' && p > q )
+        {
+          int  n, i, len = p - q;
+          int  level = -1, found = -1;
+
+
+          for ( n = 0; n < trace_count; n++ )
+          {
+            const char*  toggle = ft_trace_toggles[n];
+
+
+            for ( i = 0; i < len; i++ )
+            {
+              if ( toggle[i] != q[i] )
+                break;
+            }
+
+            if ( i == len && toggle[i] == 0 )
+            {
+              found = n;
+              break;
+            }
+          }
+
+          /* read level */
+          p++;
+          if ( *p )
+          {
+            level = *p++ - '0';
+            if ( level < 0 || level > 7 )
+              level = -1;
+          }
+
+          if ( found >= 0 && level >= 0 )
+          {
+            if ( found == trace_any )
+            {
+              /* special case for "any" */
+              for ( n = 0; n < trace_count; n++ )
+                ft_trace_levels[n] = level;
+            }
+            else
+              ft_trace_levels[found] = level;
+          }
+        }
+      }
+    }
+  }
+
+
+#else  /* !FT_DEBUG_LEVEL_TRACE */
+
+
+  FT_BASE_DEF( void )
+  ft_debug_init( void )
+  {
+    /* nothing */
+  }
+
+
+#endif /* !FT_DEBUG_LEVEL_TRACE */
+
+#endif /* FT_DEBUG_LEVEL_ERROR */
+
+
+/* END */
diff --git a/builds/wince/vc2005-ce/freetype.sln b/builds/wince/vc2005-ce/freetype.sln
new file mode 100644 (file)
index 0000000..76e52d8
--- /dev/null
@@ -0,0 +1,158 @@
+\r
+Microsoft Visual Studio Solution File, Format Version 9.00\r
+# Visual Studio 2005\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               LIB Debug Multithreaded|Pocket PC 2003 (ARMV4) = LIB Debug Multithreaded|Pocket PC 2003 (ARMV4)\r
+               LIB Debug Multithreaded|Smartphone 2003 (ARMV4) = LIB Debug Multithreaded|Smartphone 2003 (ARMV4)\r
+               LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4) = LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4)\r
+               LIB Debug Singlethreaded|Smartphone 2003 (ARMV4) = LIB Debug Singlethreaded|Smartphone 2003 (ARMV4)\r
+               LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               LIB Debug|Pocket PC 2003 (ARMV4) = LIB Debug|Pocket PC 2003 (ARMV4)\r
+               LIB Debug|Smartphone 2003 (ARMV4) = LIB Debug|Smartphone 2003 (ARMV4)\r
+               LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               LIB Release Multithreaded|Pocket PC 2003 (ARMV4) = LIB Release Multithreaded|Pocket PC 2003 (ARMV4)\r
+               LIB Release Multithreaded|Smartphone 2003 (ARMV4) = LIB Release Multithreaded|Smartphone 2003 (ARMV4)\r
+               LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               LIB Release Singlethreaded|Pocket PC 2003 (ARMV4) = LIB Release Singlethreaded|Pocket PC 2003 (ARMV4)\r
+               LIB Release Singlethreaded|Smartphone 2003 (ARMV4) = LIB Release Singlethreaded|Smartphone 2003 (ARMV4)\r
+               LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               LIB Release|Pocket PC 2003 (ARMV4) = LIB Release|Pocket PC 2003 (ARMV4)\r
+               LIB Release|Smartphone 2003 (ARMV4) = LIB Release|Smartphone 2003 (ARMV4)\r
+               LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               LIB Release|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Release|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               LIB Release|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Release|Windows Mobile 6 Standard SDK (ARMV4I)\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Debug Multithreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Pocket PC 2003 (ARMV4).Build.0 = Debug Multithreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Debug Multithreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Smartphone 2003 (ARMV4).ActiveCfg = Debug Multithreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Smartphone 2003 (ARMV4).Build.0 = Debug Multithreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Smartphone 2003 (ARMV4).Deploy.0 = Debug Multithreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Debug Singlethreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4).Build.0 = Debug Singlethreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Debug Singlethreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Smartphone 2003 (ARMV4).ActiveCfg = Debug Singlethreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Smartphone 2003 (ARMV4).Build.0 = Debug Singlethreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Smartphone 2003 (ARMV4).Deploy.0 = Debug Singlethreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Smartphone 2003 (ARMV4).ActiveCfg = Debug|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Smartphone 2003 (ARMV4).Build.0 = Debug|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Smartphone 2003 (ARMV4).Deploy.0 = Debug|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Debug|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Release Multithreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Pocket PC 2003 (ARMV4).Build.0 = Release Multithreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Release Multithreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Smartphone 2003 (ARMV4).ActiveCfg = Release Multithreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Smartphone 2003 (ARMV4).Build.0 = Release Multithreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Smartphone 2003 (ARMV4).Deploy.0 = Release Multithreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Release Singlethreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Pocket PC 2003 (ARMV4).Build.0 = Release Singlethreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Release Singlethreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Smartphone 2003 (ARMV4).ActiveCfg = Release Singlethreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Smartphone 2003 (ARMV4).Build.0 = Release Singlethreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Smartphone 2003 (ARMV4).Deploy.0 = Release Singlethreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Smartphone 2003 (ARMV4).ActiveCfg = Release|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Smartphone 2003 (ARMV4).Build.0 = Release|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Smartphone 2003 (ARMV4).Deploy.0 = Release|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Releaase|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Release|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 6 Standard SDK (ARMV4I)\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/builds/wince/vc2005-ce/freetype.vcproj b/builds/wince/vc2005-ce/freetype.vcproj
new file mode 100644 (file)
index 0000000..fa0e986
--- /dev/null
@@ -0,0 +1,3839 @@
+<?xml version="1.0" encoding="Windows-1252"?>\r
+<VisualStudioProject ProjectType="Visual C++" Version="8.00" Name="freetype" ProjectGUID="{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}" TargetFrameworkVersion="0">\r
+  <Platforms>\r
+    <Platform Name="Pocket PC 2003 (ARMV4)" />\r
+    <Platform Name="Smartphone 2003 (ARMV4)" />\r
+    <Platform Name="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)" />\r
+    <Platform Name="Windows Mobile 5.0 Smartphone SDK (ARMV4I)" />\r
+    <Platform Name="Windows Mobile 6 Professional SDK (ARMV4I)" />\r
+    <Platform Name="Windows Mobile 6 Standard SDK (ARMV4I)" />\r
+  </Platforms>\r
+  <ToolFiles>\r
+  </ToolFiles>\r
+  <Configurations>\r
+    <Configuration Name="Release|Pocket PC 2003 (ARMV4)" OutputDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)" IntermediateDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H" StringPooling="false" MinimalRebuild="true" RuntimeLibrary="2" EnableFunctionLevelLinking="false" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release/" ObjectFile=".\..\..\..\objs\release/" ProgramDataBaseFileName=".\..\..\..\objs\release/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Release|Smartphone 2003 (ARMV4)" OutputDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)" IntermediateDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H" StringPooling="false" MinimalRebuild="true" RuntimeLibrary="2" EnableFunctionLevelLinking="false" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release/" ObjectFile=".\..\..\..\objs\release/" ProgramDataBaseFileName=".\..\..\..\objs\release/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)" OutputDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H" StringPooling="false" MinimalRebuild="true" RuntimeLibrary="2" EnableFunctionLevelLinking="false" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release/" ObjectFile=".\..\..\..\objs\release/" ProgramDataBaseFileName=".\..\..\..\objs\release/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)" OutputDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H" StringPooling="false" MinimalRebuild="true" RuntimeLibrary="2" EnableFunctionLevelLinking="false" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release/" ObjectFile=".\..\..\..\objs\release/" ProgramDataBaseFileName=".\..\..\..\objs\release/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)" OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H" StringPooling="false" MinimalRebuild="true" RuntimeLibrary="2" EnableFunctionLevelLinking="false" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release/" ObjectFile=".\..\..\..\objs\release/" ProgramDataBaseFileName=".\..\..\..\objs\release/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)" OutputDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H" StringPooling="false" MinimalRebuild="true" RuntimeLibrary="2" EnableFunctionLevelLinking="false" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release/" ObjectFile=".\..\..\..\objs\release/" ProgramDataBaseFileName=".\..\..\..\objs\release/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)" OutputDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)" IntermediateDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H" StringPooling="true" RuntimeLibrary="0" EnableFunctionLevelLinking="true" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release_mt/" ObjectFile=".\..\..\..\objs\release_mt/" ProgramDataBaseFileName=".\..\..\..\objs\release_mt/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249MT.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Release Multithreaded|Smartphone 2003 (ARMV4)" OutputDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)" IntermediateDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H" StringPooling="true" RuntimeLibrary="0" EnableFunctionLevelLinking="true" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release_mt/" ObjectFile=".\..\..\..\objs\release_mt/" ProgramDataBaseFileName=".\..\..\..\objs\release_mt/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249MT.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)" OutputDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H" StringPooling="true" RuntimeLibrary="0" EnableFunctionLevelLinking="true" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release_mt/" ObjectFile=".\..\..\..\objs\release_mt/" ProgramDataBaseFileName=".\..\..\..\objs\release_mt/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249MT.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)" OutputDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H" StringPooling="true" RuntimeLibrary="0" EnableFunctionLevelLinking="true" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release_mt/" ObjectFile=".\..\..\..\objs\release_mt/" ProgramDataBaseFileName=".\..\..\..\objs\release_mt/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249MT.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)" OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H" StringPooling="true" RuntimeLibrary="0" EnableFunctionLevelLinking="true" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release_mt/" ObjectFile=".\..\..\..\objs\release_mt/" ProgramDataBaseFileName=".\..\..\..\objs\release_mt/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249MT.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)" OutputDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H" StringPooling="true" RuntimeLibrary="0" EnableFunctionLevelLinking="true" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release_mt/" ObjectFile=".\..\..\..\objs\release_mt/" ProgramDataBaseFileName=".\..\..\..\objs\release_mt/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249MT.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)" OutputDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)" IntermediateDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);WIN32;_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H" StringPooling="false" RuntimeLibrary="0" EnableFunctionLevelLinking="false" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release_st/" ObjectFile=".\..\..\..\objs\release_st/" ProgramDataBaseFileName=".\..\..\..\objs\release_st/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249ST.lib" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)" OutputDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)" IntermediateDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);WIN32;_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H" StringPooling="false" RuntimeLibrary="0" EnableFunctionLevelLinking="false" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release_st/" ObjectFile=".\..\..\..\objs\release_st/" ProgramDataBaseFileName=".\..\..\..\objs\release_st/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249ST.lib" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)" OutputDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);WIN32;_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H" StringPooling="false" RuntimeLibrary="0" EnableFunctionLevelLinking="false" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release_st/" ObjectFile=".\..\..\..\objs\release_st/" ProgramDataBaseFileName=".\..\..\..\objs\release_st/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249ST.lib" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)" OutputDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);WIN32;_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H" StringPooling="false" RuntimeLibrary="0" EnableFunctionLevelLinking="false" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release_st/" ObjectFile=".\..\..\..\objs\release_st/" ProgramDataBaseFileName=".\..\..\..\objs\release_st/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249ST.lib" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)" OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);WIN32;_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H" StringPooling="false" RuntimeLibrary="0" EnableFunctionLevelLinking="false" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release_st/" ObjectFile=".\..\..\..\objs\release_st/" ProgramDataBaseFileName=".\..\..\..\objs\release_st/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249ST.lib" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)" OutputDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);WIN32;_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H" StringPooling="false" RuntimeLibrary="0" EnableFunctionLevelLinking="false" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release_st/" ObjectFile=".\..\..\..\objs\release_st/" ProgramDataBaseFileName=".\..\..\..\objs\release_st/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249ST.lib" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Debug|Pocket PC 2003 (ARMV4)" OutputDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)" IntermediateDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;NO_ERRNO_H" RuntimeLibrary="3" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug/" ObjectFile=".\..\..\..\objs\debug/" ProgramDataBaseFileName=".\..\..\..\objs\debug/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Debug|Smartphone 2003 (ARMV4)" OutputDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)" IntermediateDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;NO_ERRNO_H" RuntimeLibrary="3" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug/" ObjectFile=".\..\..\..\objs\debug/" ProgramDataBaseFileName=".\..\..\..\objs\debug/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)" OutputDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;NO_ERRNO_H" RuntimeLibrary="3" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug/" ObjectFile=".\..\..\..\objs\debug/" ProgramDataBaseFileName=".\..\..\..\objs\debug/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)" OutputDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;NO_ERRNO_H" RuntimeLibrary="3" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug/" ObjectFile=".\..\..\..\objs\debug/" ProgramDataBaseFileName=".\..\..\..\objs\debug/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)" OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;NO_ERRNO_H" RuntimeLibrary="3" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug/" ObjectFile=".\..\..\..\objs\debug/" ProgramDataBaseFileName=".\..\..\..\objs\debug/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)" OutputDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;NO_ERRNO_H" RuntimeLibrary="3" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug/" ObjectFile=".\..\..\..\objs\debug/" ProgramDataBaseFileName=".\..\..\..\objs\debug/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)" OutputDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)" IntermediateDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY" RuntimeLibrary="1" DisableLanguageExtensions="true" PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug_st/" ObjectFile=".\..\..\..\objs\debug_st/" ProgramDataBaseFileName=".\..\..\..\objs\debug_st/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249ST_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)" OutputDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)" IntermediateDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY" RuntimeLibrary="1" DisableLanguageExtensions="true" PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug_st/" ObjectFile=".\..\..\..\objs\debug_st/" ProgramDataBaseFileName=".\..\..\..\objs\debug_st/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249ST_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)" OutputDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;NO_ERRNO_H" RuntimeLibrary="1" DisableLanguageExtensions="true" PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug_st/" ObjectFile=".\..\..\..\objs\debug_st/" ProgramDataBaseFileName=".\..\..\..\objs\debug_st/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249ST_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)" OutputDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY" RuntimeLibrary="1" DisableLanguageExtensions="true" PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug_st/" ObjectFile=".\..\..\..\objs\debug_st/" ProgramDataBaseFileName=".\..\..\..\objs\debug_st/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249ST_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)" OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY" RuntimeLibrary="1" DisableLanguageExtensions="true" PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug_st/" ObjectFile=".\..\..\..\objs\debug_st/" ProgramDataBaseFileName=".\..\..\..\objs\debug_st/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249ST_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)" OutputDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY" RuntimeLibrary="1" DisableLanguageExtensions="true" PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug_st/" ObjectFile=".\..\..\..\objs\debug_st/" ProgramDataBaseFileName=".\..\..\..\objs\debug_st/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249ST_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)" OutputDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)" IntermediateDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE" GeneratePreprocessedFile="0" RuntimeLibrary="1" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug_mt/" ObjectFile=".\..\..\..\objs\debug_mt/" ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249MT_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)" OutputDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)" IntermediateDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE" GeneratePreprocessedFile="0" RuntimeLibrary="1" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug_mt/" ObjectFile=".\..\..\..\objs\debug_mt/" ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249MT_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)" OutputDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE;NO_ERRNO_H" GeneratePreprocessedFile="0" RuntimeLibrary="1" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug_mt/" ObjectFile=".\..\..\..\objs\debug_mt/" ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249MT_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)" OutputDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE" GeneratePreprocessedFile="0" RuntimeLibrary="1" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug_mt/" ObjectFile=".\..\..\..\objs\debug_mt/" ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249MT_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)" OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE" GeneratePreprocessedFile="0" RuntimeLibrary="1" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug_mt/" ObjectFile=".\..\..\..\objs\debug_mt/" ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249MT_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)" OutputDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)" IntermediateDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" TargetEnvironment="1" />\r
+      <Tool Name="VCCLCompilerTool" ExecutionBucket="7" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE" GeneratePreprocessedFile="0" RuntimeLibrary="1" DisableLanguageExtensions="false" PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug_mt/" ObjectFile=".\..\..\..\objs\debug_mt/" ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249MT_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCCodeSignTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+      <DeploymentTool ForceDirty="-1" RemoteDirectory="" RegisterOutput="0" AdditionalFiles="" />\r
+      <DebuggerTool />\r
+    </Configuration>\r
+    <Configuration Name="Release Multithreaded|Win32" OutputDirectory=".\..\..\..\objs\release_mt" IntermediateDirectory=".\..\..\..\objs\release_mt" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" />\r
+      <Tool Name="VCCLCompilerTool" Optimization="2" InlineFunctionExpansion="1" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY" StringPooling="true" RuntimeLibrary="0" EnableFunctionLevelLinking="true" DisableLanguageExtensions="true" PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\release_mt/" ObjectFile=".\..\..\..\objs\release_mt/" ProgramDataBaseFileName=".\..\..\..\objs\release_mt/" WarningLevel="4" DebugInformationFormat="0" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249MT.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+    </Configuration>\r
+    <Configuration Name="Debug Multithreaded|Win32" OutputDirectory=".\..\..\..\objs\debug_mt" IntermediateDirectory=".\..\..\..\objs\debug_mt" ConfigurationType="4" InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops" UseOfMFC="0" ATLMinimizesCRunTimeLibraryUsage="false" CharacterSet="2">\r
+      <Tool Name="VCPreBuildEventTool" />\r
+      <Tool Name="VCCustomBuildTool" />\r
+      <Tool Name="VCXMLDataGeneratorTool" />\r
+      <Tool Name="VCWebServiceProxyGeneratorTool" />\r
+      <Tool Name="VCMIDLTool" />\r
+      <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="..\..\..\include" PreprocessorDefinitions="_DEBUG;WIN32;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE" GeneratePreprocessedFile="0" BasicRuntimeChecks="3" RuntimeLibrary="1" DisableLanguageExtensions="true" PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch" AssemblerListingLocation=".\..\..\..\objs\debug_mt/" ObjectFile=".\..\..\..\objs\debug_mt/" ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/" WarningLevel="4" DebugInformationFormat="3" CompileAs="0" />\r
+      <Tool Name="VCManagedResourceCompilerTool" />\r
+      <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
+      <Tool Name="VCPreLinkEventTool" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype249MT_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCALinkTool" />\r
+      <Tool Name="VCXDCMakeTool" />\r
+      <Tool Name="VCBscMakeTool" />\r
+      <Tool Name="VCFxCopTool" />\r
+      <Tool Name="VCPostBuildEventTool" />\r
+    </Configuration>\r
+  </Configurations>\r
+  <References>\r
+  </References>\r
+  <Files>\r
+    <Filter Name="Source Files" Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">\r
+      <File RelativePath="..\..\..\src\autofit\autofit.c">\r
+      </File>\r
+      <File RelativePath="..\..\..\src\bdf\bdf.c">\r
+        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\..\..\src\cff\cff.c">\r
+        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\..\..\src\base\ftbase.c">\r
+        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\..\..\src\base\ftbitmap.c">\r
+      </File>\r
+      <File RelativePath="..\..\..\src\cache\ftcache.c">\r
+        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\ftdebug.c">\r
+        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" DisableLanguageExtensions="false" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\..\..\src\base\ftfstype.c">\r
+      </File>\r
+      <File RelativePath="..\..\..\src\base\ftgasp.c">\r
+      </File>\r
+      <File RelativePath="..\..\..\src\base\ftglyph.c">\r
+        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\..\..\src\gzip\ftgzip.c">\r
+        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\..\..\src\base\ftinit.c">\r
+        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\..\..\src\lzw\ftlzw.c">\r
+        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\..\..\src\base\ftstroke.c">\r
+      </File>\r
+      <File RelativePath="..\..\..\src\base\ftsystem.c">\r
+        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <File RelativePath="..\..\..\src\smooth\smooth.c">\r
+        <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Release Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+        <FileConfiguration Name="Debug Multithreaded|Win32">\r
+          <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+        </FileConfiguration>\r
+      </File>\r
+      <Filter Name="FT_MODULES">\r
+        <File RelativePath="..\..\..\src\base\ftbbox.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftbdf.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftcid.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftgxval.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftlcdfil.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftmm.c">\r
+          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftotval.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftpatent.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftpfr.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftsynth.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\fttype1.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftwinfnt.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\base\ftxf86.c">\r
+        </File>\r
+        <File RelativePath="..\..\..\src\pcf\pcf.c">\r
+          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\pfr\pfr.c">\r
+          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\psaux\psaux.c">\r
+          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\pshinter\pshinter.c">\r
+          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\psnames\psmodule.c">\r
+          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\raster\raster.c">\r
+          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\sfnt\sfnt.c">\r
+          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\truetype\truetype.c">\r
+          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\type1\type1.c">\r
+          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\cid\type1cid.c">\r
+          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\type42\type42.c">\r
+          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+        <File RelativePath="..\..\..\src\winfonts\winfnt.c">\r
+          <FileConfiguration Name="Release|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Smartphone 2003 (ARMV4)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Release Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="2" AdditionalIncludeDirectories="" PreprocessorDefinitions="" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Singlethreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+          <FileConfiguration Name="Debug Multithreaded|Win32">\r
+            <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="" PreprocessorDefinitions="" BasicRuntimeChecks="3" />\r
+          </FileConfiguration>\r
+        </File>\r
+      </Filter>\r
+    </Filter>\r
+    <Filter Name="Header Files" Filter="h;hpp;hxx;hm;inl">\r
+      <File RelativePath="..\..\..\include\ft2build.h">\r
+      </File>\r
+      <File RelativePath="..\..\..\include\freetype\config\ftconfig.h">\r
+      </File>\r
+      <File RelativePath="..\..\..\include\freetype\config\ftheader.h">\r
+      </File>\r
+      <File RelativePath="..\..\..\include\freetype\config\ftmodule.h">\r
+      </File>\r
+      <File RelativePath="..\..\..\include\freetype\config\ftoption.h">\r
+      </File>\r
+      <File RelativePath="..\..\..\include\freetype\config\ftstdlib.h">\r
+      </File>\r
+    </Filter>\r
+  </Files>\r
+  <Globals>\r
+  </Globals>\r
+</VisualStudioProject>
\ No newline at end of file
diff --git a/builds/wince/vc2005-ce/index.html b/builds/wince/vc2005-ce/index.html
new file mode 100644 (file)
index 0000000..cffa8cb
--- /dev/null
@@ -0,0 +1,47 @@
+<html>
+<header>
+<title>
+  FreeType&nbsp;2 Project Files for VS.NET&nbsp;2005
+  (Pocket PC)
+</title>
+
+<body>
+<h1>
+  FreeType&nbsp;2 Project Files for VS.NET&nbsp;2005
+  (Pocket PC)
+</h1>
+
+<p>This directory contains project files for Visual C++, named
+<tt>freetype.vcproj</tt>, and Visual Studio, called <tt>freetype.sln</tt> for
+the following targets:
+
+<ul>
+  <li>PPC/SP 2003 (Pocket PC 2003)</li>
+  <li>PPC/SP WM5 (Windows Mobile 5)</li>
+  <li>PPC/SP WM6 (Windows Mobile 6)</li>
+</ul>
+
+It compiles the following libraries from the FreeType 2.4.9 sources:</p>
+
+<ul>
+  <pre>
+    freetype249.lib     - release build; single threaded
+    freetype249_D.lib   - debug build;   single threaded
+    freetype249MT.lib   - release build; multi-threaded
+    freetype249MT_D.lib - debug build;   multi-threaded</pre>
+</ul>
+
+<p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
+archives are already stored this way, so no further action is required.  If
+you use some <tt>.tar.*z</tt> archives, be sure to configure your extracting
+tool to convert the line endings.  For example, with <a
+href="http://www.winzip.com">WinZip</a>, you should activate the <it>TAR
+file smart CR/LF Conversion</it> option.  Alternatively, you may consider
+using the <tt>unix2dos</tt> or <tt>u2d</tt> utilities that are floating
+around, which specifically deal with this particular problem.
+
+<p>Build directories are placed in the top-level <tt>objs</tt>
+directory.</p>
+
+</body>
+</html>
diff --git a/builds/wince/vc2008-ce/freetype.sln b/builds/wince/vc2008-ce/freetype.sln
new file mode 100644 (file)
index 0000000..d8efd96
--- /dev/null
@@ -0,0 +1,158 @@
+\r
+Microsoft Visual Studio Solution File, Format Version 10.00\r
+# Visual Studio 2008\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "freetype.vcproj", "{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}"\r
+EndProject\r
+Global\r
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+               LIB Debug Multithreaded|Pocket PC 2003 (ARMV4) = LIB Debug Multithreaded|Pocket PC 2003 (ARMV4)\r
+               LIB Debug Multithreaded|Smartphone 2003 (ARMV4) = LIB Debug Multithreaded|Smartphone 2003 (ARMV4)\r
+               LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4) = LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4)\r
+               LIB Debug Singlethreaded|Smartphone 2003 (ARMV4) = LIB Debug Singlethreaded|Smartphone 2003 (ARMV4)\r
+               LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               LIB Debug|Pocket PC 2003 (ARMV4) = LIB Debug|Pocket PC 2003 (ARMV4)\r
+               LIB Debug|Smartphone 2003 (ARMV4) = LIB Debug|Smartphone 2003 (ARMV4)\r
+               LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               LIB Release Multithreaded|Pocket PC 2003 (ARMV4) = LIB Release Multithreaded|Pocket PC 2003 (ARMV4)\r
+               LIB Release Multithreaded|Smartphone 2003 (ARMV4) = LIB Release Multithreaded|Smartphone 2003 (ARMV4)\r
+               LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               LIB Release Singlethreaded|Pocket PC 2003 (ARMV4) = LIB Release Singlethreaded|Pocket PC 2003 (ARMV4)\r
+               LIB Release Singlethreaded|Smartphone 2003 (ARMV4) = LIB Release Singlethreaded|Smartphone 2003 (ARMV4)\r
+               LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               LIB Release|Pocket PC 2003 (ARMV4) = LIB Release|Pocket PC 2003 (ARMV4)\r
+               LIB Release|Smartphone 2003 (ARMV4) = LIB Release|Smartphone 2003 (ARMV4)\r
+               LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I) = LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               LIB Release|Windows Mobile 6 Professional SDK (ARMV4I) = LIB Release|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               LIB Release|Windows Mobile 6 Standard SDK (ARMV4I) = LIB Release|Windows Mobile 6 Standard SDK (ARMV4I)\r
+       EndGlobalSection\r
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Debug Multithreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Pocket PC 2003 (ARMV4).Build.0 = Debug Multithreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Debug Multithreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Smartphone 2003 (ARMV4).ActiveCfg = Debug Multithreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Smartphone 2003 (ARMV4).Build.0 = Debug Multithreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Smartphone 2003 (ARMV4).Deploy.0 = Debug Multithreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Debug Singlethreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4).Build.0 = Debug Singlethreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Debug Singlethreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Smartphone 2003 (ARMV4).ActiveCfg = Debug Singlethreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Smartphone 2003 (ARMV4).Build.0 = Debug Singlethreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Smartphone 2003 (ARMV4).Deploy.0 = Debug Singlethreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Smartphone 2003 (ARMV4).ActiveCfg = Debug|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Smartphone 2003 (ARMV4).Build.0 = Debug|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Smartphone 2003 (ARMV4).Deploy.0 = Debug|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Debug|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Debug|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Debug|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Release Multithreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Pocket PC 2003 (ARMV4).Build.0 = Release Multithreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Release Multithreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Smartphone 2003 (ARMV4).ActiveCfg = Release Multithreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Smartphone 2003 (ARMV4).Build.0 = Release Multithreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Smartphone 2003 (ARMV4).Deploy.0 = Release Multithreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Pocket PC 2003 (ARMV4).ActiveCfg = Release Singlethreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Pocket PC 2003 (ARMV4).Build.0 = Release Singlethreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Pocket PC 2003 (ARMV4).Deploy.0 = Release Singlethreaded|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Smartphone 2003 (ARMV4).ActiveCfg = Release Singlethreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Smartphone 2003 (ARMV4).Build.0 = Release Singlethreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Smartphone 2003 (ARMV4).Deploy.0 = Release Singlethreaded|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Smartphone 2003 (ARMV4).ActiveCfg = Release|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Smartphone 2003 (ARMV4).Build.0 = Release|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Smartphone 2003 (ARMV4).Deploy.0 = Release|Smartphone 2003 (ARMV4)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Professional SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Professional SDK (ARMV4I).Build.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Professional SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 6 Professional SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Standard SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Standard SDK (ARMV4I).Build.0 = Release|Windows Mobile 6 Standard SDK (ARMV4I)\r
+               {78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}.LIB Release|Windows Mobile 6 Standard SDK (ARMV4I).Deploy.0 = Release|Windows Mobile 6 Standard SDK (ARMV4I)\r
+       EndGlobalSection\r
+       GlobalSection(SolutionProperties) = preSolution\r
+               HideSolutionNode = FALSE\r
+       EndGlobalSection\r
+EndGlobal\r
diff --git a/builds/wince/vc2008-ce/freetype.vcproj b/builds/wince/vc2008-ce/freetype.vcproj
new file mode 100644 (file)
index 0000000..1f052c1
--- /dev/null
@@ -0,0 +1,13495 @@
+<?xml version="1.0" encoding="Windows-1252"?>\r
+<VisualStudioProject\r
+       ProjectType="Visual C++"\r
+       Version="9,00"\r
+       Name="freetype"\r
+       ProjectGUID="{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}"\r
+       TargetFrameworkVersion="0"\r
+       >\r
+       <Platforms>\r
+               <Platform\r
+                       Name="Pocket PC 2003 (ARMV4)"\r
+               />\r
+               <Platform\r
+                       Name="Smartphone 2003 (ARMV4)"\r
+               />\r
+               <Platform\r
+                       Name="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+               />\r
+               <Platform\r
+                       Name="Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+               />\r
+               <Platform\r
+                       Name="Windows Mobile 6 Professional SDK (ARMV4I)"\r
+               />\r
+               <Platform\r
+                       Name="Windows Mobile 6 Standard SDK (ARMV4I)"\r
+               />\r
+       </Platforms>\r
+       <ToolFiles>\r
+       </ToolFiles>\r
+       <Configurations>\r
+               <Configuration\r
+                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                       OutputDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               StringPooling="false"\r
+                               MinimalRebuild="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release/"\r
+                               ObjectFile=".\..\..\..\objs\release/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                       OutputDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               StringPooling="false"\r
+                               MinimalRebuild="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release/"\r
+                               ObjectFile=".\..\..\..\objs\release/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               StringPooling="false"\r
+                               MinimalRebuild="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release/"\r
+                               ObjectFile=".\..\..\..\objs\release/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               StringPooling="false"\r
+                               MinimalRebuild="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release/"\r
+                               ObjectFile=".\..\..\..\objs\release/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               StringPooling="false"\r
+                               MinimalRebuild="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release/"\r
+                               ObjectFile=".\..\..\..\objs\release/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               StringPooling="false"\r
+                               MinimalRebuild="true"\r
+                               RuntimeLibrary="2"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release/"\r
+                               ObjectFile=".\..\..\..\objs\release/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                       OutputDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_mt/"\r
+                               ObjectFile=".\..\..\..\objs\release_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249MT.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                       OutputDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_mt/"\r
+                               ObjectFile=".\..\..\..\objs\release_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249MT.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_mt/"\r
+                               ObjectFile=".\..\..\..\objs\release_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249MT.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_mt/"\r
+                               ObjectFile=".\..\..\..\objs\release_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249MT.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_mt/"\r
+                               ObjectFile=".\..\..\..\objs\release_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249MT.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_mt/"\r
+                               ObjectFile=".\..\..\..\objs\release_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249MT.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                       OutputDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);WIN32;_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               StringPooling="false"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_st/"\r
+                               ObjectFile=".\..\..\..\objs\release_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249ST.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                       OutputDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);WIN32;_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               StringPooling="false"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_st/"\r
+                               ObjectFile=".\..\..\..\objs\release_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249ST.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);WIN32;_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               StringPooling="false"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_st/"\r
+                               ObjectFile=".\..\..\..\objs\release_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249ST.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);WIN32;_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               StringPooling="false"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_st/"\r
+                               ObjectFile=".\..\..\..\objs\release_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249ST.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);WIN32;_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               StringPooling="false"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_st/"\r
+                               ObjectFile=".\..\..\..\objs\release_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249ST.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;NDEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);WIN32;_LIB;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               StringPooling="false"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="false"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_st/"\r
+                               ObjectFile=".\..\..\..\objs\release_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249ST.lib"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                       OutputDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               RuntimeLibrary="3"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug/"\r
+                               ObjectFile=".\..\..\..\objs\debug/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                       OutputDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               RuntimeLibrary="3"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug/"\r
+                               ObjectFile=".\..\..\..\objs\debug/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               RuntimeLibrary="3"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug/"\r
+                               ObjectFile=".\..\..\..\objs\debug/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               RuntimeLibrary="3"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug/"\r
+                               ObjectFile=".\..\..\..\objs\debug/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               RuntimeLibrary="3"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug/"\r
+                               ObjectFile=".\..\..\..\objs\debug/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               RuntimeLibrary="3"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug/"\r
+                               ObjectFile=".\..\..\..\objs\debug/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                       OutputDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_st/"\r
+                               ObjectFile=".\..\..\..\objs\debug_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249ST_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                       OutputDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_st/"\r
+                               ObjectFile=".\..\..\..\objs\debug_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249ST_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;NO_ERRNO_H"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_st/"\r
+                               ObjectFile=".\..\..\..\objs\debug_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249ST_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_st/"\r
+                               ObjectFile=".\..\..\..\objs\debug_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249ST_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_st/"\r
+                               ObjectFile=".\..\..\..\objs\debug_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249ST_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_st/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_st/"\r
+                               ObjectFile=".\..\..\..\objs\debug_st/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_st/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249ST_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                       OutputDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Pocket PC 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE"\r
+                               GeneratePreprocessedFile="0"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_mt/"\r
+                               ObjectFile=".\..\..\..\objs\debug_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249MT_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                       OutputDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Smartphone 2003 (ARMV4)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE"\r
+                               GeneratePreprocessedFile="0"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_mt/"\r
+                               ObjectFile=".\..\..\..\objs\debug_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249MT_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE;NO_ERRNO_H"\r
+                               GeneratePreprocessedFile="0"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_mt/"\r
+                               ObjectFile=".\..\..\..\objs\debug_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249MT_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 5.0 Smartphone SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE"\r
+                               GeneratePreprocessedFile="0"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_mt/"\r
+                               ObjectFile=".\..\..\..\objs\debug_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249MT_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE"\r
+                               GeneratePreprocessedFile="0"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_mt/"\r
+                               ObjectFile=".\..\..\..\objs\debug_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249MT_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                       OutputDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       IntermediateDirectory="Windows Mobile 6 Standard SDK (ARMV4I)\$(ConfigurationName)"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                               TargetEnvironment="1"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               ExecutionBucket="7"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;_DEBUG;$(PLATFORMDEFINES);$(ARCHFAM);$(_ARCHFAM_);_DEBUG;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE"\r
+                               GeneratePreprocessedFile="0"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="false"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_mt/"\r
+                               ObjectFile=".\..\..\..\objs\debug_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249MT_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCodeSignTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+                       <DeploymentTool\r
+                               ForceDirty="-1"\r
+                               RemoteDirectory=""\r
+                               RegisterOutput="0"\r
+                               AdditionalFiles=""\r
+                       />\r
+                       <DebuggerTool\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Release Multithreaded|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\release_mt"\r
+                       IntermediateDirectory=".\..\..\..\objs\release_mt"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="2"\r
+                               InlineFunctionExpansion="1"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="NDEBUG;WIN32;_LIB;FT2_BUILD_LIBRARY"\r
+                               StringPooling="true"\r
+                               RuntimeLibrary="0"\r
+                               EnableFunctionLevelLinking="true"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\release_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\release_mt/"\r
+                               ObjectFile=".\..\..\..\objs\release_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\release_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="0"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="NDEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249MT.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+               <Configuration\r
+                       Name="Debug Multithreaded|Win32"\r
+                       OutputDirectory=".\..\..\..\objs\debug_mt"\r
+                       IntermediateDirectory=".\..\..\..\objs\debug_mt"\r
+                       ConfigurationType="4"\r
+                       InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"\r
+                       UseOfMFC="0"\r
+                       ATLMinimizesCRunTimeLibraryUsage="false"\r
+                       CharacterSet="2"\r
+                       >\r
+                       <Tool\r
+                               Name="VCPreBuildEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCustomBuildTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXMLDataGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCWebServiceProxyGeneratorTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCMIDLTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCCLCompilerTool"\r
+                               Optimization="0"\r
+                               AdditionalIncludeDirectories="..\..\..\include"\r
+                               PreprocessorDefinitions="_DEBUG;WIN32;_LIB;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;_CRT_SECURE_NO_DEPRECATE"\r
+                               GeneratePreprocessedFile="0"\r
+                               BasicRuntimeChecks="3"\r
+                               RuntimeLibrary="1"\r
+                               DisableLanguageExtensions="true"\r
+                               PrecompiledHeaderFile=".\..\..\..\objs\debug_mt/freetype.pch"\r
+                               AssemblerListingLocation=".\..\..\..\objs\debug_mt/"\r
+                               ObjectFile=".\..\..\..\objs\debug_mt/"\r
+                               ProgramDataBaseFileName=".\..\..\..\objs\debug_mt/"\r
+                               WarningLevel="4"\r
+                               DebugInformationFormat="3"\r
+                               CompileAs="0"\r
+                       />\r
+                       <Tool\r
+                               Name="VCManagedResourceCompilerTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCResourceCompilerTool"\r
+                               PreprocessorDefinitions="_DEBUG"\r
+                               Culture="1033"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPreLinkEventTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCLibrarianTool"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype249MT_D.lib"\r
+                               SuppressStartupBanner="true"\r
+                       />\r
+                       <Tool\r
+                               Name="VCALinkTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCXDCMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCBscMakeTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCFxCopTool"\r
+                       />\r
+                       <Tool\r
+                               Name="VCPostBuildEventTool"\r
+                       />\r
+               </Configuration>\r
+       </Configurations>\r
+       <References>\r
+       </References>\r
+       <Files>\r
+               <Filter\r
+                       Name="Source Files"\r
+                       Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\src\autofit\autofit.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\bdf\bdf.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\cff\cff.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftbase.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftbitmap.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\cache\ftcache.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\ftdebug.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                               DisableLanguageExtensions="false"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftfstype.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftgasp.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftglyph.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\gzip\ftgzip.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftinit.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\lzw\ftlzw.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftstroke.c"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\base\ftsystem.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\src\smooth\smooth.c"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="2"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Singlethreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug Multithreaded|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               Optimization="0"\r
+                                               AdditionalIncludeDirectories=""\r
+                                               PreprocessorDefinitions=""\r
+                                               BasicRuntimeChecks="3"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <Filter\r
+                               Name="FT_MODULES"\r
+                               >\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftbbox.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftbdf.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftcid.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftgxval.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftlcdfil.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftmm.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftotval.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftpatent.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftpfr.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftsynth.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\fttype1.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftwinfnt.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\base\ftxf86.c"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\pcf\pcf.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\pfr\pfr.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\psaux\psaux.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\pshinter\pshinter.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\psnames\psmodule.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\raster\raster.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\sfnt\sfnt.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\truetype\truetype.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\type1\type1.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\cid\type1cid.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\type42\type42.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\..\..\src\winfonts\winfnt.c"\r
+                                       >\r
+                                       <FileConfiguration\r
+                                               Name="Release|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Pocket PC 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Smartphone 2003 (ARMV4)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Pocket PC SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 5.0 Smartphone SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Professional SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Windows Mobile 6 Standard SDK (ARMV4I)"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Release Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="2"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Singlethreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                                       <FileConfiguration\r
+                                               Name="Debug Multithreaded|Win32"\r
+                                               >\r
+                                               <Tool\r
+                                                       Name="VCCLCompilerTool"\r
+                                                       Optimization="0"\r
+                                                       AdditionalIncludeDirectories=""\r
+                                                       PreprocessorDefinitions=""\r
+                                                       BasicRuntimeChecks="3"\r
+                                               />\r
+                                       </FileConfiguration>\r
+                               </File>\r
+                       </Filter>\r
+               </Filter>\r
+               <Filter\r
+                       Name="Header Files"\r
+                       Filter="h;hpp;hxx;hm;inl"\r
+                       >\r
+                       <File\r
+                               RelativePath="..\..\..\include\ft2build.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftconfig.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftheader.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftmodule.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftoption.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
+                               RelativePath="..\..\..\include\freetype\config\ftstdlib.h"\r
+                               >\r
+                       </File>\r
+               </Filter>\r
+       </Files>\r
+       <Globals>\r
+       </Globals>\r
+</VisualStudioProject>\r
diff --git a/builds/wince/vc2008-ce/index.html b/builds/wince/vc2008-ce/index.html
new file mode 100644 (file)
index 0000000..0c636b6
--- /dev/null
@@ -0,0 +1,47 @@
+<html>
+<header>
+<title>
+  FreeType&nbsp;2 Project Files for VS.NET&nbsp;2008
+  (Pocket PC)
+</title>
+
+<body>
+<h1>
+  FreeType&nbsp;2 Project Files for VS.NET&nbsp;2008
+  (Pocket PC)
+</h1>
+
+<p>This directory contains project files for Visual C++, named
+<tt>freetype.dsp</tt>, and Visual Studio, called <tt>freetype.sln</tt> for
+the following targets:
+
+<ul>
+  <li>PPC/SP 2003 (Pocket PC 2003)</li>
+  <li>PPC/SP WM5 (Windows Mobile 5)</li>
+  <li>PPC/SP WM6 (Windows Mobile 6)</li>
+</ul>
+
+It compiles the following libraries from the FreeType 2.4.9 sources:</p>
+
+<ul>
+  <pre>
+    freetype249.lib     - release build; single threaded
+    freetype249_D.lib   - debug build;   single threaded
+    freetype249MT.lib   - release build; multi-threaded
+    freetype249MT_D.lib - debug build;   multi-threaded</pre>
+</ul>
+
+<p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
+archives are already stored this way, so no further action is required.  If
+you use some <tt>.tar.*z</tt> archives, be sure to configure your extracting
+tool to convert the line endings.  For example, with <a
+href="http://www.winzip.com">WinZip</a>, you should activate the <it>TAR
+file smart CR/LF Conversion</it> option.  Alternatively, you may consider
+using the <tt>unix2dos</tt> or <tt>u2d</tt> utilities that are floating
+around, which specifically deal with this particular problem.
+
+<p>Build directories are placed in the top-level <tt>objs</tt>
+directory.</p>
+
+</body>
+</html>
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..55a24fd
--- /dev/null
+++ b/configure
@@ -0,0 +1,125 @@
+#!/bin/sh
+#
+# Copyright 2002, 2003, 2004, 2005, 2006, 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.
+#
+#
+# Call the `configure' script located in `builds/unix'.
+#
+
+rm -f config.mk builds/unix/unix-def.mk builds/unix/unix-cc.mk
+
+if test "x$GNUMAKE" = x; then
+  GNUMAKE=make
+fi
+
+if test -z "`$GNUMAKE -v 2>/dev/null | grep GNU`"; then
+  if test -z "`$GNUMAKE -v 2>/dev/null | grep makepp`"; then
+    echo "GNU make (>= 3.80) or makepp (>= 1.19) is required to build FreeType2." >&2
+    echo "Please try" >&2
+    echo "  \`GNUMAKE=<GNU make command name> $0'." >&2
+    echo "or >&2"
+    echo "  \`GNUMAKE=\"makepp --norc-substitution\" $0'." >&2
+    exit 1
+  fi
+fi
+
+# Get `dirname' functionality.  This is taken and adapted from autoconf's
+# m4sh.m4 (_AS_EXPR_PREPARE, AS_DIRNAME_EXPR, and AS_DIRNAME_SED).
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  ft_expr=expr
+else
+  ft_expr=false
+fi
+
+ft2_dir=`(dirname "$0") 2>/dev/null                         ||
+         $ft_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+                  X"$0" : 'X\(//\)[^/]' \| \
+                  X"$0" : 'X\(//\)$' \| \
+                  X"$0" : 'X\(/\)' \| \
+                  .     : '\(.\)' 2>/dev/null               ||
+         echo X"$0" |
+           sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\/\)[^/].*/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\/\)$/{
+                  s//\1/
+                  q
+                }
+                /^X\(\/\).*/{
+                  s//\1/
+                  q
+                }
+                s/.*/./; q'`
+
+abs_curr_dir=`pwd`
+abs_ft2_dir=`cd "$ft2_dir" && pwd`
+
+# `--srcdir=' option can override abs_ft2_dir
+
+if test $# -gt 0; then
+  for x in "$@"; do
+    case x"$x" in
+    x--srcdir=*)
+      abs_ft2_dir=`echo $x | sed 's/^--srcdir=//'` ;;
+    esac
+  done
+fi
+
+# build a dummy Makefile if we are not building in the source tree;
+# we use inodes to avoid issues with symbolic links
+inode_src=`ls -id $abs_ft2_dir | awk '{print $1}'`
+inode_dst=`ls -id $abs_curr_dir | awk '{print $1}'`
+
+if test $inode_src -ne $inode_dst; then
+  if test ! -d reference; then
+    mkdir reference
+  fi
+  if test ! -r $abs_curr_dir/modules.cfg; then
+    echo "Copying \`modules.cfg'"
+    cp $abs_ft2_dir/modules.cfg $abs_curr_dir
+  fi
+  echo "Generating \`Makefile'"
+  echo "TOP_DIR        := $abs_ft2_dir"           > Makefile
+  echo "OBJ_DIR        := $abs_curr_dir"         >> Makefile
+  echo "OBJ_BUILD      := \$(OBJ_DIR)"           >> Makefile
+  echo "DOC_DIR        := \$(OBJ_DIR)/reference" >> Makefile
+  echo "FT_LIBTOOL_DIR := \$(OBJ_DIR)"           >> Makefile
+  echo "ifndef FT2DEMOS"                         >> Makefile
+  echo "  include \$(TOP_DIR)/Makefile"          >> Makefile
+  echo "else"                                    >> Makefile
+  echo "  TOP_DIR_2 := \$(TOP_DIR)/../ft2demos"  >> Makefile
+  echo "  PROJECT   := freetype"                 >> Makefile
+  echo "  CONFIG_MK := \$(OBJ_DIR)/config.mk"    >> Makefile
+  echo "  include \$(TOP_DIR_2)/Makefile"        >> Makefile
+  echo "endif"                                   >> Makefile
+fi
+
+# call make
+
+CFG=
+# work around zsh bug which doesn't like `${1+"$@"}'
+case $# in
+0) ;;
+*) for x in "$@"; do
+     case x"$x" in
+     x--srcdir=* ) CFG="$CFG '$x'/builds/unix" ;;
+     *) CFG="$CFG '$x'" ;;
+     esac
+   done ;;
+esac
+CFG=$CFG $GNUMAKE setup unix
+
+# eof
diff --git a/debian/changelog b/debian/changelog
new file mode 100644 (file)
index 0000000..13476fd
--- /dev/null
@@ -0,0 +1,104 @@
+freetype (2.4.9-slp2+1) unstable; urgency=low
+
+  * FT2 version upgrade from 2.4.3 to 2.4.9
+  * Git: 165.213.180.234:/slp/unmodified/freetype
+  * Tag: freetype_2.4.9-slp2+1
+ -- Deokjin Kim <deokjin81.kim@samsung.com>  Wed, 30 May 2012 15:18:41 +0900
+
+freetype (2.4.3-6slp2+1) unstable; urgency=low
+
+  * Fix text display bug in m.etnews.com
+  * Git: 165.213.180.234:/slp/unmodified/freetype
+  * Tag: freetype_2.4.3-6slp2+1
+
+ -- Deokjin Kim <deokjin81.kim@samsung.com>  Thu, 20 Oct 2011 16:17:50 +0900
+
+freetype (2.4.3-5slp4) unstable; urgency=low
+
+  * Packag Rollback
+  * Git: 165.213.180.234:/slp/unmodified/freetype
+  * Tag: freetype_2.4.3-5slp4
+
+ -- WooHyun Jung <wh0705.jung@samsung.com>  Mon, 11 Apr 2011 12:16:22 +0900
+
+freetype (2.4.3-5slp3) unstable; urgency=low
+
+  * Rollback pkgs
+  * Git: 165.213.180.234:/slp/unmodified/freetype
+  * Tag: freetype_2.4.3-5slp3
+
+ -- WooHyun Jung <wh0705.jung@samsung.com>  Mon, 11 Apr 2011 11:56:46 +0900
+
+freetype (2.4.3-5slp2) unstable; urgency=low
+
+  * Removed unused modules
+  * Git: 165.213.180.234:slp/unmodified/freetype
+  * Tag: freetype_2.4.3-5slp2
+
+ -- Deokjin Kim <deokjin81.kim@samsung.com>  Tue, 05 Apr 2011 10:51:07 +0900
+
+freetype (2.4.3-4slp2) unstable; urgency=low
+
+  * Rollback removing API
+  * Git: 165.213.180.234:slp/unmodified/freetype
+  * Tag: freetype_2.4.3-4slp2
+
+ -- Deokjin Kim <deokjin81.kim@samsung.com>  Wed, 02 Mar 2011 14:11:53 +0900
+
+freetype (2.4.3-3slp2) unstable; urgency=low
+
+  * Reduce amount of memory usage
+  * Git: 165.213.180.234:slp/unmodified/freetype
+  * Tag: freetype_2.4.3-3slp2
+
+ -- Deokjin Kim <deokjin81.kim@samsung.com>  Fri, 18 Feb 2011 11:14:20 +0900
+
+freetype (2.4.3-2slp2) unstable; urgency=low
+
+  * Add debug package
+  * Git: 165.213.180.234:/git/slp/unmodified/freetype
+  * Tag: freetype_2.4.3-2slp2
+
+ -- Deokjin Kim <deokjin81.kim@samsung.com>  Thu, 18 Nov 2010 14:58:43 +0900
+
+freetype (2.4.3-1slp2) unstable; urgency=low
+
+  * Freetype version upgrade (from 2.3.5 to 2.4.3)
+  * Git: 165.213.180.234:/git/slp/unmodified/freetype
+  * Tag: freetype_2.4.3-1slp2
+
+ -- Deokjin Kim <deokjin81.kim@samsung.com>  Tue, 09 Nov 2010 16:54:10 +0900
+
+freetype (2.3.5-5slp2) unstable; urgency=low
+
+  * Change maintainer
+
+ -- Jihoon Kim <jihoon48.kim@samsung.com>  Tue, 20 Apr 2010 11:06:10 +0900
+
+freetype (2.3.5-4slp2) unstable; urgency=low
+
+  * Change revision
+
+ -- Sung-Jin Park <sj76.park@samsung.com>  Thu, 25 Mar 2010 19:34:16 +0900
+
+freetype (2.3.5-3) unstable; urgency=low
+
+  [ Kyu Young Kim ]
+  * modify debian files
+
+  [ root ]
+  * -
+
+ -- root <root@input-desktop>  Thu, 25 Mar 2010 19:34:13 +0900
+
+freetype (2.3.5-2) unstable; urgency=low
+
+  * install modify
+
+ -- Kyu Young Kim <ky0928.kim@samsung.com>  Thu, 12 Nov 2009 15:45:39 +0900
+
+freetype (2.3.5) unstable; urgency=low
+
+  * Initial Release.
+
+ -- Kyu Young Kim <ky0928.kim@samsung.com>  Thu, 12 Nov 2009 13:27:46 +0900
diff --git a/debian/compat b/debian/compat
new file mode 100644 (file)
index 0000000..7ed6ff8
--- /dev/null
@@ -0,0 +1 @@
+5
diff --git a/debian/control b/debian/control
new file mode 100644 (file)
index 0000000..f14499e
--- /dev/null
@@ -0,0 +1,68 @@
+Source: freetype
+Section: libs
+Priority: optional
+Uploaders: Deokjin Kim <deokjin81.kim@samsung.com>
+Maintainer: Deokjin Kim <deokjin81.kim@samsung.com>, Inpyo Kang <mantiger@samsung.com> 
+Build-Depends: debhelper (>= 5), autotools-dev
+Standards-Version: 3.7.2
+
+Package: libfreetype6
+Architecture: any
+Section: libs
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Conflicts: freetype, xpdf-reader (<< 1.00-4)
+Description: FreeType 2 font engine, shared library files
+ The FreeType project is a team of volunteers who develop free,
+ portable and high-quality software solutions for digital typography.
+ They specifically target embedded systems and focus on bringing small,
+ efficient and ubiquitous products.
+ .
+ The FreeType 2 library is their new software font engine.  It has been
+ designed to provide the following important features:
+  * A universal and simple API to manage font files
+  * Support for several font formats through loadable modules
+  * High-quality anti-aliasing
+  * High portability & performance
+ .
+ Supported font formats include:
+  * TrueType files (.ttf) and collections (.ttc)
+  * Type 1 font files both in ASCII (.pfa) or binary (.pfb) format
+  * Type 1 Multiple Master fonts.  The FreeType 2 API also provides
+    routines to manage design instances easily
+  * Type 1 CID-keyed fonts
+  * OpenType/CFF (.otf) fonts
+  * CFF/Type 2 fonts
+  * Adobe CEF fonts (.cef), used to embed fonts in SVG documents with
+    the Adobe SVG viewer plugin.
+  * Windows FNT/FON bitmap fonts
+
+Package: libfreetype6-dev
+Architecture: any
+Section: libdevel
+Depends: libfreetype6 (= ${binary:Version}), libc6-dev | libc-dev, zlib1g-dev | libz-dev
+Conflicts: freetype0-dev, freetype1 (<= 1.0.0.1998-03-22-1), freetype1-dev
+Replaces: freetype0-dev, freetype1-dev
+Description: FreeType 2 font engine, development files
+ The FreeType project is a team of volunteers who develop free,
+ portable and high-quality software solutions for digital typography.
+ They specifically target embedded systems and focus on bringing small,
+ efficient and ubiquitous products.
+ .
+ This package contains all supplementary files (static library, headers
+ and documentation) you need to develop your own programs using the
+ FreeType 2 library.
+
+Package: libfreetype6-dbg
+Section: debug
+Priority: extra
+Architecture: any
+Depends: ${misc:Depends},
+         libfreetype6 (= ${binary:Version})
+Conflicts: libfreetype6-dbg 
+Replaces: libfreetype6-dbg 
+Description: FreeType 2 font engine, debugging symbols
+ The FreeType project is a team of volunteers who develop free,
+ portable and high-quality software solutions for digital typography.
+ They specifically target embedded systems and focus on bringing small,
+ efficient and ubiquitous products.
+ .
diff --git a/debian/copyright b/debian/copyright
new file mode 100644 (file)
index 0000000..761470d
--- /dev/null
@@ -0,0 +1,22 @@
+This is libfreetype6, written and maintained by Se Mun Lee <semun.lee@samsung.com>
+on Fri, 13 Nov 2009 14:08:22 +0900.
+
+The original source can always be found at:
+       ftp://slp.samsung.net/dists/unstable/main/source/
+
+Copyright Holder: Se Mun Lee
+
+License:
+       samsung
+
+/*
+ * SLP2.0
+ * Copyright (c) 2008 Samsung Electronics, Inc.
+ * All rights reserved.
+ *
+ * This software is a confidential and proprietary information
+ * of Samsung Electronics, Inc. ("Confidential Information").  You
+ * shall not disclose such Confidential Information and shall use
+ * it only in accordance with the terms of the license agreement
+ * you entered into with Samsung Electronics. 
+ */
diff --git a/debian/dirs b/debian/dirs
new file mode 100644 (file)
index 0000000..ca882bb
--- /dev/null
@@ -0,0 +1,2 @@
+usr/bin
+usr/sbin
diff --git a/debian/docs b/debian/docs
new file mode 100644 (file)
index 0000000..cb7384d
--- /dev/null
@@ -0,0 +1,6 @@
+README
+README.git
+ChangeLog.20
+ChangeLog.21
+ChangeLog.22
+ChangeLog.23
diff --git a/debian/libfreetype6-dev.install.in b/debian/libfreetype6-dev.install.in
new file mode 100644 (file)
index 0000000..fa49e27
--- /dev/null
@@ -0,0 +1,7 @@
+@PREFIX@/bin/freetype-config
+@PREFIX@/include/
+@PREFIX@/lib/*.so
+@PREFIX@/lib/*.la
+@PREFIX@/lib/*.a
+@PREFIX@/lib/pkgconfig/
+@PREFIX@/share/aclocal/
diff --git a/debian/libfreetype6.install.in b/debian/libfreetype6.install.in
new file mode 100644 (file)
index 0000000..a7c24c5
--- /dev/null
@@ -0,0 +1 @@
+@PREFIX@/lib/*.so.*
diff --git a/debian/rules b/debian/rules
new file mode 100755 (executable)
index 0000000..c88e6cc
--- /dev/null
@@ -0,0 +1,119 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+
+# These are used for cross-compiling and for saving the configure script
+# from having to guess our platform (since we know it already)
+DEB_HOST_GNU_TYPE   ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE  ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+CFLAGS ?= -Wall -g
+LDFLAGS ?= 
+PREFIX ?= /usr
+DATADIR ?= /opt
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+       CFLAGS += -O0
+else
+       CFLAGS += -O2
+endif
+
+LDFLAGS += -Wl,--rpath=$(PREFIX)/lib -Wl,--as-needed
+
+config.status: configure
+       dh_testdir
+       # Add here commands to configure the package.
+       CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" ./configure --prefix=$(PREFIX) 
+
+build: build-stamp
+
+build-stamp:  config.status
+       dh_testdir
+
+       # Add here commands to compile the package.
+       $(MAKE)
+       #docbook-to-man debian/ncurses.sgml > ncurses.1
+
+       for f in `find $(CURDIR)/debian/ -name "*.in"`; do \
+               cat $$f > $${f%.in}; \
+               sed -i -e "s#@PREFIX@#$(PREFIX)#g" $${f%.in}; \
+               sed -i -e "s#@DATADIR@#$(DATADIR)#g" $${f%.in}; \
+       done
+
+       touch $@
+
+clean:
+       dh_testdir
+       dh_testroot
+       rm -f build-stamp 
+
+       # Add here commands to clean up after the build process.
+       -$(MAKE) distclean
+ifneq "$(wildcard /usr/share/misc/config.sub)" ""
+       cp -f /usr/share/misc/config.sub config.sub
+endif
+ifneq "$(wildcard /usr/share/misc/config.guess)" ""
+       cp -f /usr/share/misc/config.guess config.guess
+endif
+
+       for f in `find $(CURDIR)/debian/ -name "*.in"`; do \
+               rm -f $${f%.in}; \
+       done
+
+       dh_clean 
+
+install: build
+       dh_testdir
+       dh_testroot
+       dh_clean -k 
+       dh_installdirs
+
+       # Add here commands to install the package into debian/ncurses.
+       $(MAKE) DESTDIR=$(CURDIR)/debian/tmp install
+
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+       dh_testdir
+       dh_testroot
+       dh_installchangelogs 
+       dh_installdocs
+       dh_installexamples
+       dh_install --sourcedir=debian/tmp
+#      dh_installmenu
+#      dh_installdebconf       
+#      dh_installlogrotate
+#      dh_installemacsen
+#      dh_installpam
+#      dh_installmime
+#      dh_python
+#      dh_installinit
+#      dh_installcron
+#      dh_installinfo
+       dh_installman
+       dh_link
+       dh_strip --dbg-package=libfreetype6-dbg
+       dh_compress
+       dh_fixperms
+#      dh_perl
+       dh_makeshlibs
+       dh_installdeb
+       dh_shlibdeps
+       dh_gencontrol
+       dh_md5sums
+       dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install 
diff --git a/devel/ft2build.h b/devel/ft2build.h
new file mode 100644 (file)
index 0000000..c1d38c3
--- /dev/null
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ft2build.h                                                             */
+/*                                                                         */
+/*    FreeType 2 build and setup macros.                                   */
+/*    (Generic version)                                                    */
+/*                                                                         */
+/*  Copyright 1996-2001, 2003, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+ /*
+  *  This is a development version of <ft2build.h> that is used
+  *  to build the library in debug mode.  Its only difference with
+  *  the reference is that it forces the use of the local `ftoption.h'
+  *  which contains different settings for all configuration macros.
+  *
+  *  To use it, you must define the environment variable FT2_BUILD_INCLUDE
+  *  to point to the directory containing these two files (`ft2build.h' and
+  *  `ftoption.h'), then invoke Jam as usual.
+  */
+
+#ifndef __FT2_BUILD_DEVEL_H__
+#define __FT2_BUILD_DEVEL_H__
+
+#define  FT_CONFIG_OPTIONS_H   <ftoption.h>
+
+#include <freetype/config/ftheader.h>
+
+#endif /* __FT2_BUILD_DEVEL_H__ */
+
+
+/* END */
diff --git a/devel/ftoption.h b/devel/ftoption.h
new file mode 100644 (file)
index 0000000..4da0221
--- /dev/null
@@ -0,0 +1,805 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftoption.h (for development)                                           */
+/*                                                                         */
+/*    User-selectable configuration macros (specification only).           */
+/*                                                                         */
+/*  Copyright 1996-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTOPTION_H__
+#define __FTOPTION_H__
+
+
+#include <ft2build.h>
+
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                 USER-SELECTABLE CONFIGURATION MACROS                  */
+  /*                                                                       */
+  /* This file contains the default configuration macro definitions for    */
+  /* a standard build of the FreeType library.  There are three ways to    */
+  /* use this file to build project-specific versions of the library:      */
+  /*                                                                       */
+  /*  - You can modify this file by hand, but this is not recommended in   */
+  /*    cases where you would like to build several versions of the        */
+  /*    library from a single source directory.                            */
+  /*                                                                       */
+  /*  - You can put a copy of this file in your build directory, more      */
+  /*    precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD'   */
+  /*    is the name of a directory that is included _before_ the FreeType  */
+  /*    include path during compilation.                                   */
+  /*                                                                       */
+  /*    The default FreeType Makefiles and Jamfiles use the build          */
+  /*    directory `builds/<system>' by default, but you can easily change  */
+  /*    that for your own projects.                                        */
+  /*                                                                       */
+  /*  - Copy the file <ft2build.h> to `$BUILD/ft2build.h' and modify it    */
+  /*    slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to       */
+  /*    locate this file during the build.  For example,                   */
+  /*                                                                       */
+  /*      #define FT_CONFIG_OPTIONS_H  <myftoptions.h>                     */
+  /*      #include <freetype/config/ftheader.h>                            */
+  /*                                                                       */
+  /*    will use `$BUILD/myftoptions.h' instead of this file for macro     */
+  /*    definitions.                                                       */
+  /*                                                                       */
+  /*    Note also that you can similarly pre-define the macro              */
+  /*    FT_CONFIG_MODULES_H used to locate the file listing of the modules */
+  /*    that are statically linked to the library at compile time.  By     */
+  /*    default, this file is <freetype/config/ftmodule.h>.                */
+  /*                                                                       */
+  /*  We highly recommend using the third method whenever possible.        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /**** G E N E R A L   F R E E T Y P E   2   C O N F I G U R A T I O N ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Uncomment the line below if you want to activate sub-pixel rendering  */
+  /* (a.k.a. LCD rendering, or ClearType) in this build of the library.    */
+  /*                                                                       */
+  /* Note that this feature is covered by several Microsoft patents        */
+  /* and should not be activated in any default build of the library.      */
+  /*                                                                       */
+  /* This macro has no impact on the FreeType API, only on its             */
+  /* _implementation_.  For example, using FT_RENDER_MODE_LCD when calling */
+  /* FT_Render_Glyph still generates a bitmap that is 3 times wider than   */
+  /* the original size in case this macro isn't defined; however, each     */
+  /* triplet of subpixels has R=G=B.                                       */
+  /*                                                                       */
+  /* This is done to allow FreeType clients to run unmodified, forcing     */
+  /* them to display normal gray-level anti-aliased glyphs.                */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Many compilers provide a non-ANSI 64-bit data type that can be used   */
+  /* by FreeType to speed up some computations.  However, this will create */
+  /* some problems when compiling the library in strict ANSI mode.         */
+  /*                                                                       */
+  /* For this reason, the use of 64-bit integers is normally disabled when */
+  /* the __STDC__ macro is defined.  You can however disable this by       */
+  /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here.                 */
+  /*                                                                       */
+  /* For most compilers, this will only create compilation warnings when   */
+  /* building the library.                                                 */
+  /*                                                                       */
+  /* ObNote: The compiler-specific 64-bit integers are detected in the     */
+  /*         file `ftconfig.h' either statically or through the            */
+  /*         `configure' script on supported platforms.                    */
+  /*                                                                       */
+#undef FT_CONFIG_OPTION_FORCE_INT64
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* If this macro is defined, do not try to use an assembler version of   */
+  /* performance-critical functions (e.g. FT_MulFix).  You should only do  */
+  /* that to verify that the assembler function works properly, or to      */
+  /* execute benchmark tests of the various implementations.               */
+/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* If this macro is defined, try to use an inlined assembler version of  */
+  /* the `FT_MulFix' function, which is a `hotspot' when loading and       */
+  /* hinting glyphs, and which should be executed as fast as possible.     */
+  /*                                                                       */
+  /* Note that if your compiler or CPU is not supported, this will default */
+  /* to the standard and portable implementation found in `ftcalc.c'.      */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_INLINE_MULFIX
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* LZW-compressed file support.                                          */
+  /*                                                                       */
+  /*   FreeType now handles font files that have been compressed with the  */
+  /*   `compress' program.  This is mostly used to parse many of the PCF   */
+  /*   files that come with various X11 distributions.  The implementation */
+  /*   uses NetBSD's `zopen' to partially uncompress the file on the fly   */
+  /*   (see src/lzw/ftgzip.c).                                             */
+  /*                                                                       */
+  /*   Define this macro if you want to enable this `feature'.             */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_USE_LZW
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Gzip-compressed file support.                                         */
+  /*                                                                       */
+  /*   FreeType now handles font files that have been compressed with the  */
+  /*   `gzip' program.  This is mostly used to parse many of the PCF files */
+  /*   that come with XFree86.  The implementation uses `zlib' to          */
+  /*   partially uncompress the file on the fly (see src/gzip/ftgzip.c).   */
+  /*                                                                       */
+  /*   Define this macro if you want to enable this `feature'.  See also   */
+  /*   the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below.                       */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_USE_ZLIB
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ZLib library selection                                                */
+  /*                                                                       */
+  /*   This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined.  */
+  /*   It allows FreeType's `ftgzip' component to link to the system's     */
+  /*   installation of the ZLib library.  This is useful on systems like   */
+  /*   Unix or VMS where it generally is already available.                */
+  /*                                                                       */
+  /*   If you let it undefined, the component will use its own copy        */
+  /*   of the zlib sources instead.  These have been modified to be        */
+  /*   included directly within the component and *not* export external    */
+  /*   function names.  This allows you to link any program with FreeType  */
+  /*   _and_ ZLib without linking conflicts.                               */
+  /*                                                                       */
+  /*   Do not #undef this macro here since the build system might define   */
+  /*   it for certain configurations only.                                 */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Bzip2-compressed file support.                                        */
+  /*                                                                       */
+  /*   FreeType now handles font files that have been compressed with the  */
+  /*   `bzip2' program.  This is mostly used to parse many of the PCF      */
+  /*   files that come with XFree86.  The implementation uses `libbz2' to  */
+  /*   partially uncompress the file on the fly (see src/bzip2/ftbzip2.c). */
+  /*   Contrary to gzip, bzip2 currently is not included and need to use   */
+  /*   the system available bzip2 implementation.                          */
+  /*                                                                       */
+  /*   Define this macro if you want to enable this `feature'.             */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_USE_BZIP2
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define to disable the use of file stream functions and types, FILE,   */
+  /* fopen() etc.  Enables the use of smaller system libraries on embedded */
+  /* systems that have multiple system libraries, some with or without     */
+  /* file stream support, in the cases where file stream support is not    */
+  /* necessary such as memory loading of font files.                       */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* DLL export compilation                                                */
+  /*                                                                       */
+  /*   When compiling FreeType as a DLL, some systems/compilers need a     */
+  /*   special keyword in front OR after the return type of function       */
+  /*   declarations.                                                       */
+  /*                                                                       */
+  /*   Two macros are used within the FreeType source code to define       */
+  /*   exported library functions: FT_EXPORT and FT_EXPORT_DEF.            */
+  /*                                                                       */
+  /*     FT_EXPORT( return_type )                                          */
+  /*                                                                       */
+  /*       is used in a function declaration, as in                        */
+  /*                                                                       */
+  /*         FT_EXPORT( FT_Error )                                         */
+  /*         FT_Init_FreeType( FT_Library*  alibrary );                    */
+  /*                                                                       */
+  /*                                                                       */
+  /*     FT_EXPORT_DEF( return_type )                                      */
+  /*                                                                       */
+  /*       is used in a function definition, as in                         */
+  /*                                                                       */
+  /*         FT_EXPORT_DEF( FT_Error )                                     */
+  /*         FT_Init_FreeType( FT_Library*  alibrary )                     */
+  /*         {                                                             */
+  /*           ... some code ...                                           */
+  /*           return FT_Err_Ok;                                           */
+  /*         }                                                             */
+  /*                                                                       */
+  /*   You can provide your own implementation of FT_EXPORT and            */
+  /*   FT_EXPORT_DEF here if you want.  If you leave them undefined, they  */
+  /*   will be later automatically defined as `extern return_type' to      */
+  /*   allow normal compilation.                                           */
+  /*                                                                       */
+  /*   Do not #undef these macros here since the build system might define */
+  /*   them for certain configurations only.                               */
+  /*                                                                       */
+/* #define FT_EXPORT(x)      extern x */
+/* #define FT_EXPORT_DEF(x)  x */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Glyph Postscript Names handling                                       */
+  /*                                                                       */
+  /*   By default, FreeType 2 is compiled with the `psnames' module.  This */
+  /*   module is in charge of converting a glyph name string into a        */
+  /*   Unicode value, or return a Macintosh standard glyph name for the    */
+  /*   use with the TrueType `post' table.                                 */
+  /*                                                                       */
+  /*   Undefine this macro if you do not want `psnames' compiled in your   */
+  /*   build of FreeType.  This has the following effects:                 */
+  /*                                                                       */
+  /*   - The TrueType driver will provide its own set of glyph names,      */
+  /*     if you build it to support postscript names in the TrueType       */
+  /*     `post' table.                                                     */
+  /*                                                                       */
+  /*   - The Type 1 driver will not be able to synthesize a Unicode        */
+  /*     charmap out of the glyphs found in the fonts.                     */
+  /*                                                                       */
+  /*   You would normally undefine this configuration macro when building  */
+  /*   a version of FreeType that doesn't contain a Type 1 or CFF driver.  */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Postscript Names to Unicode Values support                            */
+  /*                                                                       */
+  /*   By default, FreeType 2 is built with the `PSNames' module compiled  */
+  /*   in.  Among other things, the module is used to convert a glyph name */
+  /*   into a Unicode value.  This is especially useful in order to        */
+  /*   synthesize on the fly a Unicode charmap from the CFF/Type 1 driver  */
+  /*   through a big table named the `Adobe Glyph List' (AGL).             */
+  /*                                                                       */
+  /*   Undefine this macro if you do not want the Adobe Glyph List         */
+  /*   compiled in your `PSNames' module.  The Type 1 driver will not be   */
+  /*   able to synthesize a Unicode charmap out of the glyphs found in the */
+  /*   fonts.                                                              */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Support for Mac fonts                                                 */
+  /*                                                                       */
+  /*   Define this macro if you want support for outline fonts in Mac      */
+  /*   format (mac dfont, mac resource, macbinary containing a mac         */
+  /*   resource) on non-Mac platforms.                                     */
+  /*                                                                       */
+  /*   Note that the `FOND' resource isn't checked.                        */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_MAC_FONTS
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Guessing methods to access embedded resource forks                    */
+  /*                                                                       */
+  /*   Enable extra Mac fonts support on non-Mac platforms (e.g.           */
+  /*   GNU/Linux).                                                         */
+  /*                                                                       */
+  /*   Resource forks which include fonts data are stored sometimes in     */
+  /*   locations which users or developers don't expected.  In some cases, */
+  /*   resource forks start with some offset from the head of a file.  In  */
+  /*   other cases, the actual resource fork is stored in file different   */
+  /*   from what the user specifies.  If this option is activated,         */
+  /*   FreeType tries to guess whether such offsets or different file      */
+  /*   names must be used.                                                 */
+  /*                                                                       */
+  /*   Note that normal, direct access of resource forks is controlled via */
+  /*   the FT_CONFIG_OPTION_MAC_FONTS option.                              */
+  /*                                                                       */
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Allow the use of FT_Incremental_Interface to load typefaces that      */
+  /* contain no glyph data, but supply it via a callback function.         */
+  /* This is required by clients supporting document formats which         */
+  /* supply font data incrementally as the document is parsed, such        */
+  /* as the Ghostscript interpreter for the PostScript language.           */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_INCREMENTAL
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The size in bytes of the render pool used by the scan-line converter  */
+  /* to do all of its work.                                                */
+  /*                                                                       */
+  /* This must be greater than 4KByte if you use FreeType to rasterize     */
+  /* glyphs; otherwise, you may set it to zero to avoid unnecessary        */
+  /* allocation of the render pool.                                        */
+  /*                                                                       */
+#define FT_RENDER_POOL_SIZE  16384L
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FT_MAX_MODULES                                                        */
+  /*                                                                       */
+  /*   The maximum number of modules that can be registered in a single    */
+  /*   FreeType library object.  32 is the default.                        */
+  /*                                                                       */
+#define FT_MAX_MODULES  32
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Debug level                                                           */
+  /*                                                                       */
+  /*   FreeType can be compiled in debug or trace mode.  In debug mode,    */
+  /*   errors are reported through the `ftdebug' component.  In trace      */
+  /*   mode, additional messages are sent to the standard output during    */
+  /*   execution.                                                          */
+  /*                                                                       */
+  /*   Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode.     */
+  /*   Define FT_DEBUG_LEVEL_TRACE to build it in trace mode.              */
+  /*                                                                       */
+  /*   Don't define any of these macros to compile in `release' mode!      */
+  /*                                                                       */
+  /*   Do not #undef these macros here since the build system might define */
+  /*   them for certain configurations only.                               */
+  /*                                                                       */
+#define FT_DEBUG_LEVEL_ERROR
+#define FT_DEBUG_LEVEL_TRACE
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Autofitter debugging                                                  */
+  /*                                                                       */
+  /*   If FT_DEBUG_AUTOFIT is defined, FreeType provides some means to     */
+  /*   control the autofitter behaviour for debugging purposes with global */
+  /*   boolean variables (consequently, you should *never* enable this     */
+  /*   while compiling in `release' mode):                                 */
+  /*                                                                       */
+  /*     _af_debug_disable_horz_hints                                      */
+  /*     _af_debug_disable_vert_hints                                      */
+  /*     _af_debug_disable_blue_hints                                      */
+  /*                                                                       */
+  /*   Additionally, the following functions provide dumps of various      */
+  /*   internal autofit structures to stdout (using `printf'):             */
+  /*                                                                       */
+  /*     af_glyph_hints_dump_points                                        */
+  /*     af_glyph_hints_dump_segments                                      */
+  /*     af_glyph_hints_dump_edges                                         */
+  /*                                                                       */
+  /*   As an argument, they use another global variable:                   */
+  /*                                                                       */
+  /*     _af_debug_hints                                                   */
+  /*                                                                       */
+  /*   Please have a look at the `ftgrid' demo program to see how those    */
+  /*   variables and macros should be used.                                */
+  /*                                                                       */
+  /*   Do not #undef these macros here since the build system might define */
+  /*   them for certain configurations only.                               */
+  /*                                                                       */
+#define FT_DEBUG_AUTOFIT
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Memory Debugging                                                      */
+  /*                                                                       */
+  /*   FreeType now comes with an integrated memory debugger that is       */
+  /*   capable of detecting simple errors like memory leaks or double      */
+  /*   deletes.  To compile it within your build of the library, you       */
+  /*   should define FT_DEBUG_MEMORY here.                                 */
+  /*                                                                       */
+  /*   Note that the memory debugger is only activated at runtime when     */
+  /*   when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */
+  /*                                                                       */
+  /*   Do not #undef this macro here since the build system might define   */
+  /*   it for certain configurations only.                                 */
+  /*                                                                       */
+#define FT_DEBUG_MEMORY
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Module errors                                                         */
+  /*                                                                       */
+  /*   If this macro is set (which is _not_ the default), the higher byte  */
+  /*   of an error code gives the module in which the error has occurred,  */
+  /*   while the lower byte is the real error code.                        */
+  /*                                                                       */
+  /*   Setting this macro makes sense for debugging purposes only, since   */
+  /*   it would break source compatibility of certain programs that use    */
+  /*   FreeType 2.                                                         */
+  /*                                                                       */
+  /*   More details can be found in the files ftmoderr.h and fterrors.h.   */
+  /*                                                                       */
+#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Position Independent Code                                             */
+  /*                                                                       */
+  /*   If this macro is set (which is _not_ the default), FreeType2 will   */
+  /*   avoid creating constants that require address fixups.  Instead the  */
+  /*   constants will be moved into a struct and additional intialization  */
+  /*   code will be used.                                                  */
+  /*                                                                       */
+  /*   Setting this macro is needed for systems that prohibit address      */
+  /*   fixups, such as BREW.                                               */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_PIC */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****        S F N T   D R I V E R    C O N F I G U R A T I O N       ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support       */
+  /* embedded bitmaps in all formats using the SFNT module (namely         */
+  /* TrueType & OpenType).                                                 */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to    */
+  /* load and enumerate the glyph Postscript names in a TrueType or        */
+  /* OpenType file.                                                        */
+  /*                                                                       */
+  /* Note that when you do not compile the `PSNames' module by undefining  */
+  /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will   */
+  /* contain additional code used to read the PS Names table from a font.  */
+  /*                                                                       */
+  /* (By default, the module uses `PSNames' to extract glyph names.)       */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to       */
+  /* access the internal name table in a SFNT-based format like TrueType   */
+  /* or OpenType.  The name table contains various strings used to         */
+  /* describe the font, like family name, copyright, version, etc.  It     */
+  /* does not contain any glyph name though.                               */
+  /*                                                                       */
+  /* Accessing SFNT names is done through the functions declared in        */
+  /* `freetype/ftsnames.h'.                                                */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_SFNT_NAMES
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TrueType CMap support                                                 */
+  /*                                                                       */
+  /*   Here you can fine-tune which TrueType CMap table format shall be    */
+  /*   supported.                                                          */
+#define TT_CONFIG_CMAP_FORMAT_0
+#define TT_CONFIG_CMAP_FORMAT_2
+#define TT_CONFIG_CMAP_FORMAT_4
+#define TT_CONFIG_CMAP_FORMAT_6
+#define TT_CONFIG_CMAP_FORMAT_8
+#define TT_CONFIG_CMAP_FORMAT_10
+#define TT_CONFIG_CMAP_FORMAT_12
+#define TT_CONFIG_CMAP_FORMAT_13
+#define TT_CONFIG_CMAP_FORMAT_14
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****    T R U E T Y P E   D R I V E R    C O N F I G U R A T I O N   ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile   */
+  /* a bytecode interpreter in the TrueType driver.                        */
+  /*                                                                       */
+  /* By undefining this, you will only compile the code necessary to load  */
+  /* TrueType glyphs without hinting.                                      */
+  /*                                                                       */
+  /*   Do not #undef this macro here, since the build system might         */
+  /*   define it for certain configurations only.                          */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version  */
+  /* of the TrueType bytecode interpreter is used that doesn't implement   */
+  /* any of the patented opcodes and algorithms.  The patents related to   */
+  /* TrueType hinting have expired worldwide since May 2010; this option   */
+  /* is now deprecated.                                                    */
+  /*                                                                       */
+  /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored*  */
+  /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words,  */
+  /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or                */
+  /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time.    */
+  /*                                                                       */
+  /* This macro is only useful for a small number of font files (mostly    */
+  /* for Asian scripts) that require bytecode interpretation to properly   */
+  /* load glyphs.  For all other fonts, this produces unpleasant results,  */
+  /* thus the unpatented interpreter is never used to load glyphs from     */
+  /* TrueType fonts unless one of the following two options is used.       */
+  /*                                                                       */
+  /*   - The unpatented interpreter is explicitly activated by the user    */
+  /*     through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag         */
+  /*     when opening the FT_Face.                                         */
+  /*                                                                       */
+  /*   - FreeType detects that the FT_Face corresponds to one of the       */
+  /*     `trick' fonts (e.g., `Mingliu') it knows about.  The font engine  */
+  /*     contains a hard-coded list of font names and other matching       */
+  /*     parameters (see function `tt_face_init' in file                   */
+  /*     `src/truetype/ttobjs.c').                                         */
+  /*                                                                       */
+  /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */
+  /*                                                                       */
+  /*   {                                                                   */
+  /*     FT_Parameter  parameter;                                          */
+  /*     FT_Open_Args  open_args;                                          */
+  /*                                                                       */
+  /*                                                                       */
+  /*     parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING;                  */
+  /*                                                                       */
+  /*     open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;         */
+  /*     open_args.pathname   = my_font_pathname;                          */
+  /*     open_args.num_params = 1;                                         */
+  /*     open_args.params     = &parameter;                                */
+  /*                                                                       */
+  /*     error = FT_Open_Face( library, &open_args, index, &face );        */
+  /*     ...                                                               */
+  /*   }                                                                   */
+  /*                                                                       */
+/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType    */
+  /* bytecode interpreter with a huge switch statement, rather than a call */
+  /* table.  This results in smaller and faster code for a number of       */
+  /* architectures.                                                        */
+  /*                                                                       */
+  /* Note however that on some compiler/processor combinations, undefining */
+  /* this macro will generate faster, though larger, code.                 */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the        */
+  /* TrueType glyph loader to use Apple's definition of how to handle      */
+  /* component offsets in composite glyphs.                                */
+  /*                                                                       */
+  /* Apple and MS disagree on the default behavior of component offsets    */
+  /* in composites.  Apple says that they should be scaled by the scaling  */
+  /* factors in the transformation matrix (roughly, it's more complex)     */
+  /* while MS says they should not.  OpenType defines two bits in the      */
+  /* composite flags array which can be used to disambiguate, but old      */
+  /* fonts will not have them.                                             */
+  /*                                                                       */
+  /*   http://www.microsoft.com/typography/otspec/glyf.htm                 */
+  /*   http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html                 */
+  /*                                                                       */
+#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include         */
+  /* support for Apple's distortable font technology (fvar, gvar, cvar,    */
+  /* and avar tables).  This has many similarities to Type 1 Multiple      */
+  /* Masters support.                                                      */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_BDF if you want to include support for        */
+  /* an embedded `BDF ' table within SFNT-based bitmap formats.            */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_BDF
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****      T Y P E 1   D R I V E R    C O N F I G U R A T I O N       ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* T1_MAX_DICT_DEPTH is the maximal depth of nest dictionaries and       */
+  /* arrays in the Type 1 stream (see t1load.c).  A minimum of 4 is        */
+  /* required.                                                             */
+  /*                                                                       */
+#define T1_MAX_DICT_DEPTH  5
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine   */
+  /* calls during glyph loading.                                           */
+  /*                                                                       */
+#define T1_MAX_SUBRS_CALLS  16
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A     */
+  /* minimum of 16 is required.                                            */
+  /*                                                                       */
+  /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */
+  /*                                                                       */
+#define T1_MAX_CHARSTRINGS_OPERANDS  256
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define this configuration macro if you want to prevent the            */
+  /* compilation of `t1afm', which is in charge of reading Type 1 AFM      */
+  /* files into an existing face.  Note that if set, the T1 driver will be */
+  /* unable to produce kerning distances.                                  */
+  /*                                                                       */
+#undef T1_CONFIG_OPTION_NO_AFM
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define this configuration macro if you want to prevent the            */
+  /* compilation of the Multiple Masters font support in the Type 1        */
+  /* driver.                                                               */
+  /*                                                                       */
+#undef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****    A U T O F I T   M O D U L E    C O N F I G U R A T I O N     ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Compile autofit module with CJK (Chinese, Japanese, Korean) script    */
+  /* support.                                                              */
+  /*                                                                       */
+#define AF_CONFIG_OPTION_CJK
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Compile autofit module with Indic script support.                     */
+  /*                                                                       */
+#define AF_CONFIG_OPTION_INDIC
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Compile autofit module with warp hinting.  The idea of the warping    */
+  /* code is to slightly scale and shift a glyph within a single dimension */
+  /* so that as much of its segments are aligned (more or less) on the     */
+  /* grid.  To find out the optimal scaling and shifting value, various    */
+  /* parameter combinations are tried and scored.                          */
+  /*                                                                       */
+  /* This experimental option is only active if the render mode is         */
+  /* FT_RENDER_MODE_LIGHT.                                                 */
+  /*                                                                       */
+#define AF_CONFIG_OPTION_USE_WARPER
+
+  /* */
+
+
+  /*
+   * Define this variable if you want to keep the layout of internal
+   * structures that was used prior to FreeType 2.2.  This also compiles in
+   * a few obsolete functions to avoid linking problems on typical Unix
+   * distributions.
+   *
+   * For embedded systems or building a new distribution from scratch, it
+   * is recommended to disable the macro since it reduces the library's code
+   * size and activates a few memory-saving optimizations as well.
+   */
+#define FT_CONFIG_OPTION_OLD_INTERNALS
+
+
+  /*
+   *  To detect legacy cache-lookup call from a rogue client (<= 2.1.7),
+   *  we restrict the number of charmaps in a font.  The current API of
+   *  FTC_CMapCache_Lookup() takes cmap_index & charcode, but old API
+   *  takes charcode only.  To determine the passed value is for cmap_index
+   *  or charcode, the possible cmap_index is restricted not to exceed
+   *  the minimum possible charcode by a rogue client.  It is also very
+   *  unlikely that a rogue client is interested in Unicode values 0 to 15.
+   *
+   *  NOTE: The original threshold was 4 deduced from popular number of
+   *        cmap subtables in UCS-4 TrueType fonts, but now it is not
+   *        irregular for OpenType fonts to have more than 4 subtables,
+   *        because variation selector subtables are available for Apple
+   *        and Microsoft platforms.
+   */
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+#define FT_MAX_CHARMAP_CACHEABLE 15
+#endif
+
+
+  /*
+   * This macro is defined if either unpatented or native TrueType
+   * hinting is requested by the definitions above.
+   */
+#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+#define  TT_USE_BYTECODE_INTERPRETER
+#undef   TT_CONFIG_OPTION_UNPATENTED_HINTING
+#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define  TT_USE_BYTECODE_INTERPRETER
+#endif
+
+FT_END_HEADER
+
+
+#endif /* __FTOPTION_H__ */
+
+
+/* END */
diff --git a/docs/CHANGES b/docs/CHANGES
new file mode 100644 (file)
index 0000000..ae57932
--- /dev/null
@@ -0,0 +1,3647 @@
+
+CHANGES BETWEEN 2.4.8 and 2.4.9
+
+  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
+
+  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
+
+  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
+
+  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
+
+  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
+
+  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
+
+  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
+
+  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
+
+  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
+
+  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:
+
+      http://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:
+
+        http://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
+
+        http://www.adobe.com/products/indesign/sing_gaiji.html
+
+      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 embolded.
+
+    - `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_FLAGS_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,GIB5,WANSONG,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:
+
+        http://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 sub-pixel displays (like LCD
+                                 screens).  THIS IS STILL
+                                 EXPERIMENTAL!
+
+        FT_LOAD_TARGET_LCD_V  :: Same as FT_LOAD_TARGET_LCD, for
+                                 vertical sub-pixel 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:
+
+        http://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/fttrig.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:
+
+        http://www.freetype.org/
+          freetype2/docs/tutorial/step1.html
+
+      or
+
+        http://freetype.sourceforge.net/
+          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:
+
+        http://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
+    http://www.freetype.org/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 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.
+
+  - 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 2000-2012 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 ---
diff --git a/docs/CUSTOMIZE b/docs/CUSTOMIZE
new file mode 100644 (file)
index 0000000..7d7d474
--- /dev/null
@@ -0,0 +1,150 @@
+How to customize the compilation of the library
+===============================================
+
+  FreeType  is highly  customizable  to fit  various  needs, and  this
+  document  describes  how  it  is  possible  to  select  options  and
+  components at compilation time.
+
+
+I. Configuration macros
+
+  The  file found  in `include/freetype/config/ftoption.h'  contains a
+  list  of  commented configuration  macros  that  can  be toggled  by
+  developers  to  indicate  which  features  should  be  active  while
+  building the library.
+
+  These  options range  from debug  level to  availability  of certain
+  features,   like  native   TrueType  hinting   through   a  bytecode
+  interpreter.
+
+  We  invite you  to read  this file  for more  information.   You can
+  change the  file's content to suit  your needs, or  override it with
+  one of the techniques described below.
+
+
+II. Modules list
+
+  If you  use GNU make  please edit the top-level  file `modules.cfg'.
+  It contains a  list of available FreeType modules  and extensions to
+  be compiled.  Change it to suit your own preferences.  Be aware that
+  certain modules  depend on  others, as described  in the  file.  GNU
+  make  uses `modules.cfg'  to  generate `ftmodule.h'  (in the  object
+  directory).
+
+  If  you don't  use  GNU make  you  have to  manually  edit the  file
+  `include/freetype/config/ftmodule.h'  (which is  *not* used  with if
+  compiled with GNU make) to  add or remove the drivers and components
+  you want  to compile into  the library.  See `INSTALL.ANY'  for more
+  information.
+
+
+III. System interface
+
+  FreeType's  default interface to  the system  (i.e., the  parts that
+  deal  with  memory  management   and  i/o  streams)  is  located  in
+  `src/base/ftsystem.c'.
+
+  The current  implementation uses standard C library  calls to manage
+  memory  and to read  font files.   It is  however possible  to write
+  custom implementations to suit specific systems.
+
+  To  tell the  GNU Make-based  build system  to use  a  custom system
+  interface, you have to  define the environment variable FTSYS_SRC to
+  point to the relevant implementation:
+
+    on Unix:
+
+      ./configure <your options>
+      export FTSYS_SRC=foo/my_ftsystem.c
+      make
+      make install
+
+    on Windows:
+
+      make setup <compiler>
+      set FTSYS_SRC=foo/my_ftsystem.c
+      make
+
+
+IV. Overriding default configuration and module headers
+
+  It  is possible  to override  the default  configuration  and module
+  headers without  changing the original files.  There  are three ways
+  to do that:
+
+
+  1. With GNU make
+
+    [This is actually a combination of method 2 and 3.]
+
+    Just put your custom  `ftoption.h' file into the objects directory
+    (normally  `<topdir>/objs'),  which  GNU  make  prefers  over  the
+    standard location.   No action is needed  for `ftmodule.h' because
+    it is generated automatically in the objects directory.
+
+
+  2. Using the C include path
+
+    Use the  C include path  to ensure that  your own versions  of the
+    files are used at compile time when the lines
+
+      #include FT_CONFIG_OPTIONS_H
+      #include FT_CONFIG_MODULES_H
+
+    are      compiled.       Their      default      values      being
+    <freetype/config/ftoption.h> and <freetype/config/ftmodule.h>, you
+    can do something like:
+
+      custom/
+        freetype/
+          config/
+            ftoption.h    => custom options header
+            ftmodule.h    => custom modules list
+
+      include/            => normal FreeType 2 include
+        freetype/
+          ...
+
+    then change the C include path to always give the path to `custom'
+    before the FreeType 2 `include'.
+
+
+  3. Redefining FT_CONFIG_OPTIONS_H and FT_CONFIG_MODULES_H
+
+    Another way to do the same thing is to redefine the macros used to
+    name  the configuration  headers.  To  do  so, you  need a  custom
+    `ft2build.h' whose content can be as simple as:
+
+      #ifndef __FT2_BUILD_MY_PLATFORM_H__
+      #define __FT2_BUILD_MY_PLATFORM_H__
+
+      #define FT_CONFIG_OPTIONS_H  <custom/my-ftoption.h>
+      #define FT_CONFIG_MODULES_H  <custom/my-ftmodule.h>
+
+      #include <freetype/config/ftheader.h>
+
+      #endif /* __FT2_BUILD_MY_PLATFORM_H__ */
+
+    Place those files in a separate directory, e.g.,
+
+      custom/
+        ft2build.h           => custom version described above
+        my-ftoption.h        => custom options header
+        my-ftmodule.h        => custom modules list header
+
+    and change  the C include path  to ensure that  `custom' is always
+    placed before the FT2 `include' during compilation.
+
+----------------------------------------------------------------------
+
+Copyright 2003, 2005, 2006 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 CUSTOMIZE ---
diff --git a/docs/DEBUG b/docs/DEBUG
new file mode 100644 (file)
index 0000000..3d6acd3
--- /dev/null
@@ -0,0 +1,202 @@
+Debugging within the FreeType sources
+=====================================
+
+I. Configuration macros
+-----------------------
+
+There  are several ways  to enable  debugging features  in a  FreeType 2
+builds.   This is controlled  through the  definition of  special macros
+located in the file `ftoptions.h'.  The macros are:
+
+
+  FT_DEBUG_LEVEL_ERROR
+
+    #define this macro  if you want to compile  the FT_ERROR macro calls
+    to  print error messages  during program  execution.  This  will not
+    stop  the  program.   Very  useful  to  spot  invalid  fonts  during
+    development and to code workarounds for them.
+
+  FT_DEBUG_LEVEL_TRACE
+
+    #define this macro  if you want to compile  both macros FT_ERROR and
+    FT_TRACE.   This also  includes the  variants  FT_TRACE0, FT_TRACE1,
+    FT_TRACE2, ..., FT_TRACE7.
+
+    The  trace  macros are  used  to  send  debugging messages  when  an
+    appropriate  `debug  level' is  configured  at  runtime through  the
+    FT2_DEBUG environment variable (more on this later).
+
+  FT_DEBUG_MEMORY
+
+    If  this macro is  #defined, the  FreeType engine  is linked  with a
+    small  but  effective  debugging  memory  manager  that  tracks  all
+    allocations and frees that are performed within the font engine.
+
+    When  the  FT2_DEBUG_MEMORY   environment  variable  is  defined  at
+    runtime,  a call  to FT_Done_FreeType  will dump  memory statistics,
+    including the list of leaked memory blocks with the source locations
+    where these were allocated.  It is always a very good idea to define
+    this in development builds.  This works with _any_ program linked to
+    FreeType, but  requires a big  deal of memory (the  debugging memory
+    manager never frees the blocks to the heap in order to detect double
+    frees).
+
+    When FT2_DEBUG_MEMORY isn't defined at runtime, the debugging memory
+    manager is ignored, and performance is unaffected.
+
+
+II. Debugging macros
+--------------------
+
+Several macros can be used within the FreeType sources to help debugging
+its code:
+
+
+  1. FT_ERROR(( ... ))
+
+    This macro is  used to send debug messages  that indicate relatively
+    serious  errors (like  broken font  files),  but will  not stop  the
+    execution of  the running program.   Its code is compiled  only when
+    either FT_DEBUG_LEVEL_ERROR  or FT_DEBUG_LEVEL_TRACE are  defined in
+    `ftoption.h'.
+
+    Note that you  have to use a printf-like  signature, but with double
+    parentheses, like in
+
+      FT_ERROR(( "your %s is not %s\n", "foo", "bar" ));
+
+
+  2. FT_ASSERT( condition )
+
+    This macro  is used to check  strong assertions at  runtime.  If its
+    condition isn't TRUE,  the program will abort with  a panic message.
+    Its   code   is  compiled   when   either  FT_DEBUG_LEVEL_ERROR   or
+    FT_DEBUG_LEVEL_TRACE are defined.  You don't need double parentheses
+    here.  For example
+
+      FT_ASSERT( ptr != NULL );
+
+
+  3. FT_TRACE( level, (message...) )
+
+    The  FT_TRACE  macro  is  used  to  send  general-purpose  debugging
+    messages during  program execution.   This macro uses  an *implicit*
+    macro named FT_COMPONENT used to name the current FreeType component
+    being run.
+
+    The developer should always  define FT_COMPONENT as appropriate, for
+    example as in
+
+      #undef  FT_COMPONENT
+      #define FT_COMPONENT  trace_io
+
+    The  value  of  the  FT_COMPONENT  macro  is  an  enumeration  named
+    trace_XXXX where XXXX  is one of the component  names defined in the
+    internal file `freetype/internal/fttrace.h'.  If you modify FreeType
+    source  and insert  new trace_XXXX macro,  you  must register  it in
+    fttrace.h. If you insert or remove many trace macros,  you can check
+    the undefined or the unused trace macro by src/tools/chktrcmp.py.
+
+    Each  such component  is assigned  a `debug  level', ranging  from 0
+    to  7,  through  the  use  of  the  FT2_DEBUG  environment  variable
+    (described below) when a program linked with FreeType starts.
+
+    When FT_TRACE  is called, its  level is compared  to the one  of the
+    corresponding component.   Messages with trace  levels *higher* than
+    the corresponding component level are filtered and never printed.
+
+    This  means that  trace messages  with level  0 are  always printed,
+    those with level 2 are only  printed when the component level is *at
+    least* 2.
+
+    The  second  parameter  to  FT_TRACE must  contain  parentheses  and
+    correspond to a printf-like call, as in
+
+      FT_TRACE( 2, ( "your %s is not %s\n", "foo", "bar" ) )
+
+    The shortcut macros  FT_TRACE0, FT_TRACE1, FT_TRACE2, ..., FT_TRACE7
+    can be  used with  constant level indices,  and are much  cleaner to
+    use, as in
+
+     FT_TRACE2(( "your %s is not %s\n", "foo", "bar" ));
+
+
+III. Environment variables
+--------------------------
+
+The  following  environment   variables  control  debugging  output  and
+behaviour of FreeType at runtime.
+
+
+  FT2_DEBUG
+
+    This   variable  is   only  used   when  FreeType   is   built  with
+    FT_DEBUG_LEVEL_TRACE defined.  It contains a list of component level
+    definitions, following this format:
+
+       component1:level1 component2:level2 component3:level3 ...
+
+    where `componentX' is the name of a tracing component, as defined in
+    `fttrace.h',  but  without the  `trace_'  prefix.   `levelX' is  the
+    corresponding level to use at runtime.
+
+    `any'  is a  special  component  name that  will  be interpreted  as
+    `any/all components'.  For example, the following definitions
+
+       set FT2_DEBUG=any:2 memory:5 io:4        (on Windows)
+       export FT2_DEBUG="any:2 memory:5 io:4"   (on Linux with bash)
+
+    both stipulate that  all components should have level  2, except for
+    the memory and io components which will be set to trace levels 5 and
+    4, respectively.
+
+
+  FT2_DEBUG_MEMORY
+
+    This  environment variable, when  defined, tells  FreeType to  use a
+    debugging memory  manager that will  track leaking memory  blocks as
+    well as other  common errors like double frees.   It is also capable
+    of  reporting  _where_  the  leaking blocks  were  allocated,  which
+    considerably saves time when debugging new additions to the library.
+
+    This  code  is  only  compiled  when  FreeType  is  built  with  the
+    FT_DEBUG_MEMORY macro  #defined in  `ftoption.h' though, it  will be
+    ignored in other builds.
+
+
+  FT2_ALLOC_TOTAL_MAX
+
+    This  variable is ignored  if FT2_DEBUG_MEMORY  is not  defined.  It
+    allows you to specify a maximum heap size for all memory allocations
+    performed by FreeType.   This is very useful to  test the robustness
+    of  the  font  engine and  programs  that  use  it in  tight  memory
+    conditions.
+
+    If it is  undefined, or if its value is  not strictly positive, then
+    no allocation bounds are checked at runtime.
+
+
+  FT2_ALLOC_COUNT_MAX
+
+    This  variable is ignored  if FT2_DEBUG_MEMORY  is not  defined.  It
+    allows  you  to  specify  a  maximum number  of  memory  allocations
+    performed    by     FreeType    before    returning     the    error
+    FT_Err_Out_Of_Memory.  This is useful  for debugging and testing the
+    engine's robustness.
+
+    If it is  undefined, or if its value is  not strictly positive, then
+    no allocation bounds are checked at runtime.
+
+------------------------------------------------------------------------
+
+Copyright 2002, 2003, 2004, 2005, 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 DEBUG ---
diff --git a/docs/FTL.TXT b/docs/FTL.TXT
new file mode 100644 (file)
index 0000000..bbaba33
--- /dev/null
@@ -0,0 +1,169 @@
+                    The FreeType Project LICENSE
+                    ----------------------------
+
+                            2006-Jan-27
+
+                    Copyright 1996-2002, 2006 by
+          David Turner, Robert Wilhelm, and Werner Lemberg
+
+
+
+Introduction
+============
+
+  The FreeType  Project is distributed in  several archive packages;
+  some of them may contain, in addition to the FreeType font engine,
+  various tools and  contributions which rely on, or  relate to, the
+  FreeType Project.
+
+  This  license applies  to all  files found  in such  packages, and
+  which do not  fall under their own explicit  license.  The license
+  affects  thus  the  FreeType   font  engine,  the  test  programs,
+  documentation and makefiles, at the very least.
+
+  This  license   was  inspired  by  the  BSD,   Artistic,  and  IJG
+  (Independent JPEG  Group) licenses, which  all encourage inclusion
+  and  use of  free  software in  commercial  and freeware  products
+  alike.  As a consequence, its main points are that:
+
+    o We don't promise that this software works. However, we will be
+      interested in any kind of bug reports. (`as is' distribution)
+
+    o You can  use this software for whatever you  want, in parts or
+      full form, without having to pay us. (`royalty-free' usage)
+
+    o You may not pretend that  you wrote this software.  If you use
+      it, or  only parts of it,  in a program,  you must acknowledge
+      somewhere  in  your  documentation  that  you  have  used  the
+      FreeType code. (`credits')
+
+  We  specifically  permit  and  encourage  the  inclusion  of  this
+  software, with  or without modifications,  in commercial products.
+  We  disclaim  all warranties  covering  The  FreeType Project  and
+  assume no liability related to The FreeType Project.
+
+
+  Finally,  many  people  asked  us  for  a  preferred  form  for  a
+  credit/disclaimer to use in compliance with this license.  We thus
+  encourage you to use the following text:
+
+   """
+    Portions of this software are copyright © <year> The FreeType
+    Project (www.freetype.org).  All rights reserved.
+   """
+
+  Please replace <year> with the value from the FreeType version you
+  actually use.
+
+
+Legal Terms
+===========
+
+0. Definitions
+--------------
+
+  Throughout this license,  the terms `package', `FreeType Project',
+  and  `FreeType  archive' refer  to  the  set  of files  originally
+  distributed  by the  authors  (David Turner,  Robert Wilhelm,  and
+  Werner Lemberg) as the `FreeType Project', be they named as alpha,
+  beta or final release.
+
+  `You' refers to  the licensee, or person using  the project, where
+  `using' is a generic term including compiling the project's source
+  code as  well as linking it  to form a  `program' or `executable'.
+  This  program is  referred to  as  `a program  using the  FreeType
+  engine'.
+
+  This  license applies  to all  files distributed  in  the original
+  FreeType  Project,   including  all  source   code,  binaries  and
+  documentation,  unless  otherwise  stated   in  the  file  in  its
+  original, unmodified form as  distributed in the original archive.
+  If you are  unsure whether or not a particular  file is covered by
+  this license, you must contact us to verify this.
+
+  The FreeType  Project is copyright (C) 1996-2000  by David Turner,
+  Robert Wilhelm, and Werner Lemberg.  All rights reserved except as
+  specified below.
+
+1. No Warranty
+--------------
+
+  THE FREETYPE PROJECT  IS PROVIDED `AS IS' WITHOUT  WARRANTY OF ANY
+  KIND, EITHER  EXPRESS OR IMPLIED,  INCLUDING, BUT NOT  LIMITED TO,
+  WARRANTIES  OF  MERCHANTABILITY   AND  FITNESS  FOR  A  PARTICULAR
+  PURPOSE.  IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS
+  BE LIABLE  FOR ANY DAMAGES CAUSED  BY THE USE OR  THE INABILITY TO
+  USE, OF THE FREETYPE PROJECT.
+
+2. Redistribution
+-----------------
+
+  This  license  grants  a  worldwide, royalty-free,  perpetual  and
+  irrevocable right  and license to use,  execute, perform, compile,
+  display,  copy,   create  derivative  works   of,  distribute  and
+  sublicense the  FreeType Project (in  both source and  object code
+  forms)  and  derivative works  thereof  for  any  purpose; and  to
+  authorize others  to exercise  some or all  of the  rights granted
+  herein, subject to the following conditions:
+
+    o Redistribution of  source code  must retain this  license file
+      (`FTL.TXT') unaltered; any  additions, deletions or changes to
+      the original  files must be clearly  indicated in accompanying
+      documentation.   The  copyright   notices  of  the  unaltered,
+      original  files must  be  preserved in  all  copies of  source
+      files.
+
+    o Redistribution in binary form must provide a  disclaimer  that
+      states  that  the software is based in part of the work of the
+      FreeType Team,  in  the  distribution  documentation.  We also
+      encourage you to put an URL to the FreeType web page  in  your
+      documentation, though this isn't mandatory.
+
+  These conditions  apply to any  software derived from or  based on
+  the FreeType Project,  not just the unmodified files.   If you use
+  our work, you  must acknowledge us.  However, no  fee need be paid
+  to us.
+
+3. Advertising
+--------------
+
+  Neither the  FreeType authors and  contributors nor you  shall use
+  the name of the  other for commercial, advertising, or promotional
+  purposes without specific prior written permission.
+
+  We suggest,  but do not require, that  you use one or  more of the
+  following phrases to refer  to this software in your documentation
+  or advertising  materials: `FreeType Project',  `FreeType Engine',
+  `FreeType library', or `FreeType Distribution'.
+
+  As  you have  not signed  this license,  you are  not  required to
+  accept  it.   However,  as  the FreeType  Project  is  copyrighted
+  material, only  this license, or  another one contracted  with the
+  authors, grants you  the right to use, distribute,  and modify it.
+  Therefore,  by  using,  distributing,  or modifying  the  FreeType
+  Project, you indicate that you understand and accept all the terms
+  of this license.
+
+4. Contacts
+-----------
+
+  There are two mailing lists related to FreeType:
+
+    o freetype@nongnu.org
+
+      Discusses general use and applications of FreeType, as well as
+      future and  wanted additions to the  library and distribution.
+      If  you are looking  for support,  start in  this list  if you
+      haven't found anything to help you in the documentation.
+
+    o freetype-devel@nongnu.org
+
+      Discusses bugs,  as well  as engine internals,  design issues,
+      specific licenses, porting, etc.
+
+  Our home page can be found at
+
+    http://www.freetype.org
+
+
+--- end of FTL.TXT ---
diff --git a/docs/GPLv2.TXT b/docs/GPLv2.TXT
new file mode 100644 (file)
index 0000000..b2fe7b6
--- /dev/null
@@ -0,0 +1,340 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+     51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year  name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/docs/INSTALL b/docs/INSTALL
new file mode 100644 (file)
index 0000000..fc699a8
--- /dev/null
@@ -0,0 +1,83 @@
+
+There are  several ways  to build the  FreeType library,  depending on
+your system and the level of  customization you need.  Here is a short
+overview of the documentation available:
+
+
+I. Normal installation and upgrades
+===================================
+
+  1. Unix Systems (including Mac OS X, Cygwin, and MSys on Windows)
+
+    Please read `INSTALL.UNIX' to install or upgrade FreeType  2 on  a
+    Unix system.   Note  that  you  *need*  GNU  Make   for  automatic
+    compilation,  since other make tools won't work (this includes BSD
+    Make).
+
+    GNU Make VERSION 3.80 OR NEWER IS NEEDED!
+
+
+  2. On VMS with the `mms' build tool
+
+    See `INSTALL.VMS' for installation instructions on this platform.
+
+
+  3. Other systems using GNU Make
+
+    On non-Unix platforms,  it is possible to build  the library using
+    GNU Make  utility.  Note that  *NO OTHER MAKE TOOL  WILL WORK*[1]!
+    This  methods supports  several  compilers on  Windows, OS/2,  and
+    BeOS, including MinGW, Visual C++, Borland C++, and more.
+
+    Instructions are provided in the file `INSTALL.GNU'.
+
+
+  4. With an IDE Project File (e.g., for Visual Studio or CodeWarrior)
+
+    We provide a  small number of `project files'  for various IDEs to
+    automatically build  the library as  well.  Note that  these files
+    are  not supported  and only  sporadically maintained  by FreeType
+    developers, so don't expect them to work in each release.
+
+    To find them, have a  look at the content of the `builds/<system>'
+    directory, where <system> stands for your OS or environment.
+
+
+  5. From you own IDE, or own Makefiles
+
+    If  you  want  to  create   your  own  project  file,  follow  the
+    instructions   given  in  the   `INSTALL.ANY'  document   of  this
+    directory.
+
+
+II. Custom builds of the library
+================================
+
+  Customizing the compilation  of FreeType is easy, and  allows you to
+  select only the components of  the font engine that you really need.
+  For more details read the file `CUSTOMIZE'.
+
+
+----------------------------------------------------------------------
+
+[1] make++, a make tool written in Perl, has sufficient support of GNU
+    make extensions to build FreeType.  See
+
+      http://makepp.sourceforge.net
+
+    for more information; you need version 1.19 or newer, and you must
+    pass option `--norc-substitution'.
+
+----------------------------------------------------------------------
+
+Copyright   2000-2008, 2010-2011
+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 INSTALL ---
diff --git a/docs/INSTALL.ANY b/docs/INSTALL.ANY
new file mode 100644 (file)
index 0000000..80f161c
--- /dev/null
@@ -0,0 +1,156 @@
+Instructions on how to build FreeType with your own build tool
+==============================================================
+
+See  the  file `CUSTOMIZE'  to  learn  how  to customize  FreeType  to
+specific environments.
+
+
+I. Standard procedure
+---------------------
+
+  * DISABLE PRE-COMPILED  HEADERS!  This is very  important for Visual
+    C++, because FreeType uses lines like:
+
+      #include FT_FREETYPE_H
+
+    which are not correctly supported by this compiler while being ISO
+    C compliant!
+
+  * You  need  to  add  the directories  `freetype2/include'  to  your
+    include path when compiling the library.
+
+  * FreeType 2 is made of  several components; each of them is located
+    in    a   subdirectory    of   `freetype2/src'.     For   example,
+    `freetype2/src/truetype/' contains the TrueType font driver.
+
+  * DO NOT COMPILE ALL C FILES!  Rather, compile the following ones.
+
+    -- base components (required)
+
+      src/base/ftsystem.c
+      src/base/ftinit.c
+      src/base/ftdebug.c
+
+      src/base/ftbase.c
+
+      src/base/ftbbox.c       -- recommended, see <freetype/ftbbox.h>
+      src/base/ftglyph.c      -- recommended, see <freetype/ftglyph.h>
+
+      src/base/ftbdf.c        -- optional, see <freetype/ftbdf.h>
+      src/base/ftbitmap.c     -- optional, see <freetype/ftbitmap.h>
+      src/base/ftcid.c        -- optional, see <freetype/ftcid.h>
+      src/base/ftfstype.c     -- optional
+      src/base/ftgasp.c       -- optional, see <freetype/ftgasp.h>
+      src/base/ftgxval.c      -- optional, see <freetype/ftgxval.h>
+      src/base/ftlcdfil.c     -- optional, see <freetype/ftlcdfil.h>
+      src/base/ftmm.c         -- optional, see <freetype/ftmm.h>
+      src/base/ftotval.c      -- optional, see <freetype/ftotval.h>
+      src/base/ftpatent.c     -- optional
+      src/base/ftpfr.c        -- optional, see <freetype/ftpfr.h>
+      src/base/ftstroke.c     -- optional, see <freetype/ftstroke.h>
+      src/base/ftsynth.c      -- optional, see <freetype/ftsynth.h>
+      src/base/fttype1.c      -- optional, see <freetype/t1tables.h>
+      src/base/ftwinfnt.c     -- optional, see <freetype/ftwinfnt.h>
+      src/base/ftxf86.c       -- optional, see <freetype/ftxf86.h>
+
+      src/base/ftmac.c        -- only on the Macintosh
+
+    -- font drivers (optional; at least one is needed)
+
+      src/bdf/bdf.c           -- BDF font driver
+      src/cff/cff.c           -- CFF/OpenType font driver
+      src/cid/type1cid.c      -- Type 1 CID-keyed font driver
+      src/pcf/pcf.c           -- PCF font driver
+      src/pfr/pfr.c           -- PFR/TrueDoc font driver
+      src/sfnt/sfnt.c         -- SFNT files support
+                                 (TrueType & OpenType)
+      src/truetype/truetype.c -- TrueType font driver
+      src/type1/type1.c       -- Type 1 font driver
+      src/type42/type42.c     -- Type 42 font driver
+      src/winfonts/winfnt.c   -- Windows FONT / FNT font driver
+
+    -- rasterizers (optional; at least one is needed for vector
+       formats)
+
+      src/raster/raster.c     -- monochrome rasterizer
+      src/smooth/smooth.c     -- anti-aliasing rasterizer
+
+    -- auxiliary modules (optional)
+
+      src/autofit/autofit.c   -- auto hinting module
+      src/cache/ftcache.c     -- cache sub-system (in beta)
+      src/gzip/ftgzip.c       -- support for compressed fonts (.gz)
+      src/lzw/ftlzw.c         -- support for compressed fonts (.Z)
+      src/bzip2/ftbzip2.c     -- support for compressed fonts (.bz2)
+      src/gxvalid/gxvalid.c   -- TrueTypeGX/AAT table validation
+      src/otvalid/otvalid.c   -- OpenType table validation
+      src/psaux/psaux.c       -- PostScript Type 1 parsing
+      src/pshinter/pshinter.c -- PS hinting module
+      src/psnames/psnames.c   -- PostScript glyph names support
+
+
+    Notes:
+
+      `ftcache.c'  needs `ftglyph.c'
+      `ftfstype.c' needs `fttype1.c'
+      `ftglyph.c'  needs `ftbitmap.c'
+      `ftstroke.c' needs `ftglyph.c'
+      `ftsynth.c'  needs `ftbitmap.c'
+
+      `cff.c'      needs `sfnt.c', `pshinter.c', and `psnames.c'
+      `truetype.c' needs `sfnt.c' and `psnames.c'
+      `type1.c'    needs `psaux.c' `pshinter.c', and `psnames.c'
+      `type1cid.c' needs `psaux.c', `pshinter.c', and `psnames.c'
+      `type42.c'   needs `truetype.c'
+
+      To use `ftbzip2.c', an application must be linked with a library
+      which implements bzip2 support  (and the bzip2 header files must
+      be available also during compilation).
+
+
+  Read the file `CUSTOMIZE' in case  you want to compile only a subset
+  of  the  drivers,  renderers,   and  optional  modules;  a  detailed
+  description of the various base  extension is given in the top-level
+  file `modules.cfg'.
+
+  You are done.  In case of problems, see the archives of the FreeType
+  development mailing list.
+
+
+II. Support for flat-directory compilation
+------------------------------------------
+
+  It is  possible to  put all  FreeType 2 source  files into  a single
+  directory, with the *exception* of the `include' hierarchy.
+
+  1. Copy all files in current directory
+
+      cp freetype2/src/base/*.[hc] .
+      cp freetype2/src/raster1/*.[hc] .
+      cp freetype2/src/smooth/*.[hc] .
+      etc.
+
+  2. Compile sources
+
+      cc -c -Ifreetype2/include -DFT2_BUILD_LIBRARY ftsystem.c
+      cc -c -Ifreetype2/include -DFT2_BUILD_LIBRARY ftinit.c
+      cc -c -Ifreetype2/include -DFT2_BUILD_LIBRARY ftdebug.c
+      cc -c -Ifreetype2/include -DFT2_BUILD_LIBRARY ftbase.c
+      etc.
+
+    You don't  need to define  the FT_FLAT_COMPILATION macro  (as this
+    was required in previous releases of FreeType 2).
+
+----------------------------------------------------------------------
+
+Copyright 2003, 2005, 2006, 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 INSTALL.ANY ---
diff --git a/docs/INSTALL.CROSS b/docs/INSTALL.CROSS
new file mode 100644 (file)
index 0000000..3def12c
--- /dev/null
@@ -0,0 +1,135 @@
+This document contains instructions on how to cross-build the FreeType
+library on Unix systems, for example, building binaries for Linux/MIPS
+on  FreeBSD/i386.   Before   reading  this  document,  please  consult
+INSTALL.UNIX for required tools and the basic self-building procedure.
+
+
+  1. Required Tools
+  -----------------
+
+    For self-building the FreeType library  on a Unix system, GNU Make
+    3.80 or  newer is required.   INSTALL.UNIX  contains  hints how to
+    check the installed `make'.
+
+    The GNU C  compiler to cross-build the target  system is required.
+    At present, using non-GNU cross compiler is not tested.  The cross
+    compiler is  expected to be  installed with a system  prefix.  For
+    example, if  your building system  is FreeBSD/i386 and  the target
+    system is Linux/MIPS, the  cross compiler should be installed with
+    the name `mips-ip22-linuxelf-gcc'.
+
+    A C  compiler for a self-build  is required also, to  build a tool
+    that  is executed  during  the building  procedure.  Non-GNU  self
+    compilers are acceptable, but such a setup is not tested yet.
+
+
+  2. Configuration
+  ----------------
+
+    2.1. Building and target system
+
+      To configure for  cross-build, the options `--host=<system>' and
+      `--build=<system>' must be passed to configure.  For example, if
+      your building  system is FreeBSD/i386  and the target  system is
+      Linux/MIPS, say
+
+        ./configure \
+          --build=i386-unknown-freebsd \
+          --host=mips-ip22-linuxelf \
+          [other options]
+
+      It should  be noted that `--host=<system>'  specifies the system
+      where the built binaries will  be executed, not the system where
+      the build actually happens.   Older versions of GNU autoconf use
+      the option  pair `--host=' and `--target='.  This  is broken and
+      doesn't work.  Similarly, an explicit CC specification like
+
+        env CC=mips-ip22-linux-gcc ./configure
+
+      or
+
+        env CC=/usr/local/mips-ip22-linux/bin/gcc ./configure
+
+      doesn't   work  either;  such   a  configuration   confuses  the
+      `configure' script while  trying to find the cross  and native C
+      compilers.
+
+
+    2.2. The prefix to install FreeType2
+
+      Setting `--prefix=<prefix>'  properly is important.   The prefix
+      to install FreeType2 is  written into the freetype-config script
+      and freetype2.pc configuration file.
+
+      If  the built  FreeType  2 library  is  used as  a  part of  the
+      cross-building system,  the prefix  is expected to  be different
+      from the self-building  system.  For example, configuration with
+      `--prefix=/usr/local'  installs binaries  into  the system  wide
+      `/usr/local'  directory  which  then  can't be  executed.   This
+      causes confusion in configuration  of all applications which use
+      FreeType2.   Instead,  use a  prefix to install  the cross-build
+      into     a     separate     system    tree,     for     example,
+      `--prefix=/usr/local/mips-ip22-linux/'.
+
+      On the other  hand, if the built FreeType2 is used  as a part of
+      the target system, the prefix to install should reflect the file
+      system structure of the target system.
+
+
+  3. Building command
+  -------------------
+
+    If  the  configuration  finishes successfully,  invoking  GNU make
+    builds FreeType2.  Just say
+
+      make
+
+    or
+
+      gmake
+
+    depending on the name the GNU make binary actually has.
+
+
+  4. Installation
+  ---------------
+
+    Saying
+
+      make install
+
+    as usual to install FreeType2 into the directory tree specified by
+    the argument of the `--prefix' option.
+
+    As noted in section 2.2,  FreeType2  is sometimes configured to be
+    installed  into the  system directory  of the  target  system, and
+    should  not be installed  in the  cross-building system.   In such
+    cases, the  make variable `DESTDIR'  is useful to change  the root
+    directory in the installation.  For example, after
+
+      make DESTDIR=/mnt/target_system_root/ install
+
+    the built FreeType2 library files are installed into the directory
+    `/mnt/target_system_root/<prefix_in_configure>/lib'.
+
+
+  5. TODO
+  -------
+
+    Cross building between Cygwin (or MSys) and Unix must be tested.
+
+
+----------------------------------------------------------------------
+
+Copyright 2006, 2008 by suzuki toshiya
+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 INSTALL.CROSS ---
diff --git a/docs/INSTALL.GNU b/docs/INSTALL.GNU
new file mode 100644 (file)
index 0000000..72df50a
--- /dev/null
@@ -0,0 +1,159 @@
+This document contains instructions  how to build the FreeType library
+on non-Unix systems  with the help of GNU Make.  Note  that if you are
+running Cygwin or MSys in  Windows, you should follow the instructions
+in the file INSTALL.UNIX instead.
+
+
+  FreeType 2 includes a powerful and flexible build system that allows
+  you to  easily compile it on  a great variety of  platforms from the
+  command line.  To do so, just follow these simple instructions.
+
+  1. Install GNU Make
+  -------------------
+
+    Because  GNU Make  is  the  only Make  tool  supported to  compile
+    FreeType 2, you should install it on your machine.
+
+    The FreeType 2 build system relies on many features special to GNU
+    Make.
+
+    NEARLY ALL OTHER MAKE TOOLS  FAIL, INCLUDING `BSD MAKE', SO REALLY
+    INSTALL A RECENT VERSION OF GNU MAKE ON YOUR SYSTEM!
+
+    Note that  make++, a  make tool written  in Perl,  supports enough
+    features of GNU make to compile FreeType.  See
+
+      http://makepp.sourceforge.net
+
+    for more information; you need version 1.19 or newer, and you must
+    pass option `--norc-substitution'.
+
+    Make sure that you are invoking GNU Make from the command line, by
+    typing something like:
+
+      make -v
+
+    to display its version number.
+
+    VERSION 3.80 OR NEWER IS NEEDED!
+
+
+  2. Invoke `make'
+  ----------------
+
+    Go to  the root  directory of FreeType  2, then simply  invoke GNU
+    Make from the command line.   This will launch the FreeType 2 host
+    platform  detection routines.   A summary  will be  displayed, for
+    example, on Win32.
+
+
+      ==============================================================
+      FreeType build system -- automatic system detection
+
+      The following settings are used:
+
+        platform                     win32
+        compiler                     gcc
+        configuration directory      .\builds\win32
+        configuration rules          .\builds\win32\w32-gcc.mk
+
+      If this does not correspond to your system or settings please
+      remove the file 'config.mk' from this directory then read the
+      INSTALL file for help.
+
+      Otherwise, simply type 'make' again to build the library
+      or 'make refdoc' to build the API reference (the latter needs
+      python).
+      =============================================================
+
+
+    If the detected settings correspond to your platform and compiler,
+    skip to step 5.  Note that if your platform is completely alien to
+    the build system, the detected platform will be `ansi'.
+
+
+  3. Configure the build system for a different compiler
+  ------------------------------------------------------
+
+    If the build system correctly detected your platform, but you want
+    to use a different compiler  than the one specified in the summary
+    (for most platforms, gcc is the default compiler), invoke GNU Make
+    with
+
+      make setup <compiler>
+
+    Examples:
+
+      to use Visual C++ on Win32, type:  `make setup visualc'
+      to use Borland C++ on Win32, type  `make setup bcc32'
+      to use Watcom C++ on Win32, type   `make setup watcom'
+      to use Intel C++ on Win32, type    `make setup intelc'
+      to use LCC-Win32 on Win32, type:   `make setup lcc'
+      to use Watcom C++ on OS/2, type    `make setup watcom'
+      to use VisualAge C++ on OS/2, type `make setup visualage'
+
+    The  <compiler> name to  use is  platform-dependent.  The  list of
+    available  compilers for  your  system is  available  in the  file
+    `builds/<system>/detect.mk'.
+
+    If you  are satisfied  by the new  configuration summary,  skip to
+    step 5.
+
+
+  4. Configure the build system for an unknown platform/compiler
+  --------------------------------------------------------------
+
+    The auto-detection/setup  phase of the build system  copies a file
+    to the current directory under the name `config.mk'.
+
+    For    example,    on    OS/2+gcc,    it   would    simply    copy
+    `builds/os2/os2-gcc.mk' to `./config.mk'.
+
+    If for  some reason your  platform isn't correctly  detected, copy
+    manually the configuration sub-makefile to `./config.mk' and go to
+    step 5.
+
+    Note  that  this file  is  a  sub-Makefile  used to  specify  Make
+    variables  for compiler  and linker  invocation during  the build.
+    You can  easily create your own  version from one  of the existing
+    configuration files,  then copy it to the  current directory under
+    the name `./config.mk'.
+
+
+  5. Build the library
+  --------------------
+
+    The auto-detection/setup  phase should have  copied a file  in the
+    current  directory,  called  `./config.mk'.   This  file  contains
+    definitions of various Make  variables used to invoke the compiler
+    and linker during the build.  [It has also generated a file called
+    `ftmodule.h'   in  the  objects   directory  (which   is  normally
+    `<toplevel>/objs/');  please read  the  file `docs/CUSTOMIZE'  for
+    customization of FreeType.]
+
+    To  launch  the build,  simply  invoke  GNU  Make again:  The  top
+    Makefile will detect the configuration file and run the build with
+    it.
+
+
+  Final note
+
+    The build  system builds a  statically linked library of  the font
+    engine in the  `objs' directory.  It does _not_  support the build
+    of  DLLs on  Windows and  OS/2.  If  you need  these, you  have to
+    either   use  an   IDE-specific  project   file,  or   follow  the
+    instructions in `INSTALL.ANY' to create your own Makefiles.
+
+----------------------------------------------------------------------
+
+Copyright 2003, 2004, 2005, 2006, 2008 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 INSTALL.GNU ---
diff --git a/docs/INSTALL.MAC b/docs/INSTALL.MAC
new file mode 100644 (file)
index 0000000..42bb0d8
--- /dev/null
@@ -0,0 +1,32 @@
+Please follow the instructions  in INSTALL.UNIX to install FreeType on
+Mac OS X.
+
+Currently FreeType2 functions based on some deprecated Carbon APIs
+return FT_Err_Unimplemented_Feature always, even if FreeType2 is
+configured and built on the system that deprecated Carbon APIs are
+available. To enable deprecated FreeType2 functions as far as possible,
+replace src/base/ftmac.c by builds/mac/ftmac.c.
+
+Starting with Mac OS X 10.5, gcc defaults the deployment target
+to 10.5. In previous versions of Mac OS X, this defaulted to 10.1.
+If you want your built binaries to run only on 10.5, this change
+does not concern you.  If you want them to also run on older versions
+of Mac OS X, then you must either set the MACOSX_DEPLOYMENT_TARGET
+environment variable or pass -mmacosx-version-min to gcc. You should
+specify the oldest version of Mac OS you want the code to run on.
+For example, if you use Bourne shell:
+
+       export MACOSX_DEPLOYMENT_TARGET=10.2
+
+or, if you use C shell:
+
+       setenv MACOSX_DEPLOYMENT_TARGET 10.2
+
+Alternatively, you could pass "-mmacosx-version-min=10.2" to gcc.
+
+Here the number 10.2 is the lowest version that the built binaries
+can run on. In the cases in above, the built binaries will run on
+Mac OS X 10.2 and later, but _not_ earlier. If you want to run on
+earlier, you have to set lower version, e.g. 10.0.
+
+For classic Mac OS (Mac OS 7, 8, 9) please refer to builds/mac/README.
diff --git a/docs/INSTALL.UNIX b/docs/INSTALL.UNIX
new file mode 100644 (file)
index 0000000..5dc0764
--- /dev/null
@@ -0,0 +1,96 @@
+This  document contains  instructions  on how  to  build the  FreeType
+library on Unix  systems.  This also works for  emulations like Cygwin
+or MSys on Win32:
+
+
+  1. Ensure that you are using GNU Make
+  -------------------------------------
+
+    The FreeType build system  _exclusively_ works with GNU Make.  You
+    will  not be  able to  compile the  library with  the instructions
+    below using any other alternative (including BSD Make).
+
+    Check that you have GNU make by running the command:
+
+       make -v
+
+    This should dump some text that begins with:
+
+       GNU Make  <version number>
+       Copyright (C) <year> Free Software Foundation Inc.
+
+    Note that version  3.80 or higher is *required* or the  build will
+    fail.
+
+    It is also fine to have GNU Make under another name (e.g. 'gmake')
+    if you use the GNUMAKE variable as described below.
+
+    As  a  special exception,  'makepp'  can  also  be used  to  build
+    FreeType 2.  See the file docs/MAKEPP for details.
+
+
+  2. Regenerate the configure script if needed
+  --------------------------------------------
+
+    This only applies if you  are building a git snapshot or checkout,
+    *not* if you grabbed the sources of an official release.
+
+    You  need  to invoke  the  `autogen.sh'  script  in the  top-level
+    directory  in order  to  create the  `configure'  script for  your
+    platform.  Normally, this simply means typing:
+
+      sh autogen.sh
+
+    In case of problems, you  may need to install or upgrade Automake,
+    Autoconf or  Libtool.  See  README.git in the  top-level directory
+    for more information.
+
+
+  3. Build and install the library
+  --------------------------------
+
+    The following  should work  on all Unix  systems where  the `make'
+    command invokes GNU Make:
+
+      ./configure [options]
+      make
+      make install           (as root)
+
+    The default installation path  is `/usr/local'.  It can be changed
+    with the `--prefix=<path>' option.  Example:
+
+      ./configure --prefix=/usr
+
+    When using a different command to invoke GNU Make, use the GNUMAKE
+    variable.  For example,  if `gmake' is the command  to use on your
+    system, do something like:
+
+       GNUMAKE=gmake ./configure [options]
+       gmake
+       gmake install            (as root)
+
+    If  this still doesn't  work, there  must be  a problem  with your
+    system (e.g., you are using a very old version of GNU Make).
+
+    It  is possible  to  compile FreeType  in  a different  directory.
+    Assuming the FreeType source  files in directory `/src/freetype' a
+    compilation in directory `foo' works as follows:
+
+      cd foo
+      /src/freetype/configure [options]
+      make
+      make install
+
+----------------------------------------------------------------------
+
+Copyright 2003, 2004, 2005, 2006, 2007 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 INSTALL.UNIX ---
diff --git a/docs/INSTALL.VMS b/docs/INSTALL.VMS
new file mode 100644 (file)
index 0000000..994e566
--- /dev/null
@@ -0,0 +1,62 @@
+How to build the freetype2 library on VMS
+-----------------------------------------
+
+It is actually very  straightforward to install the Freetype2 library.
+Just  execute vms_make.com from  the toplevel  directory to  build the
+library.  This procedure currently accepts the following options:
+
+DEBUG
+  Build the library with debug information and without optimization.
+
+lopts=<value>
+  Options to pass to the link command e.g. lopts=/traceback
+
+ccopt=<value>
+  Options to pass to the C compiler e.g. ccopt=/float=ieee
+
+In case you did download the demos, place them in a separate directory
+sharing the same toplevel as the directory of Freetype2 and follow the
+same  instructions as  above  for  the demos  from  there.  The  build
+process relies on this to figure the location of the Freetype2 include
+files.
+
+
+To rebuild  the  sources it is necessary to  have MMS/MMK installed on
+the system.
+
+The library is available in the directory
+
+  [.LIB]
+
+To  compile applications  using  FreeType  2 you  have  to define  the
+logical FREETYPE pointing to the directory
+
+  [.INCLUDE.FREETYPE]
+
+i.e., if  the directory in which  this INSTALL.VMS file  is located is
+$disk:[freetype] then define the logical with
+
+  define freetype $disk:[freetype.include.freetype]
+
+This version has  been tested with Compaq C  V6.2-006 on OpenVMS Alpha
+V7.2-1.
+
+
+  Any problems can be reported to
+
+    Jouk Jansen <joukj@hrem.stm.tudelft.nl> or
+    Martin P.J. Zinser <zinser@zinser.no-ip.info>
+
+------------------------------------------------------------------------
+
+Copyright 2000, 2004 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 INSTALL.VMS ---
diff --git a/docs/LICENSE.TXT b/docs/LICENSE.TXT
new file mode 100644 (file)
index 0000000..62945c8
--- /dev/null
@@ -0,0 +1,34 @@
+
+The  FreeType 2  font  engine is  copyrighted  work and  cannot be  used
+legally  without a  software license.   In  order to  make this  project
+usable  to a vast  majority of  developers, we  distribute it  under two
+mutually exclusive open-source licenses.
+
+This means  that *you* must choose  *one* of the  two licenses described
+below, then obey  all its terms and conditions when  using FreeType 2 in
+any of your projects or products.
+
+  - The FreeType License, found in  the file `FTL.TXT', which is similar
+    to the original BSD license *with* an advertising clause that forces
+    you  to  explicitly cite  the  FreeType  project  in your  product's
+    documentation.  All  details are in the license  file.  This license
+    is  suited  to products  which  don't  use  the GNU  General  Public
+    License.
+
+    Note that  this license  is  compatible  to the  GNU General  Public
+    License version 3, but not version 2.
+
+  - The GNU General Public License version 2, found in  `GPLv2.TXT' (any
+    later version can be used  also), for programs which already use the
+    GPL.  Note  that the  FTL is  incompatible  with  GPLv2 due  to  its
+    advertisement clause.
+
+The contributed BDF and PCF drivers come with a license similar  to that
+of the X Window System.  It is compatible to the above two licenses (see
+file src/bdf/README and src/pcf/README).
+
+The gzip module uses the zlib license (see src/gzip/zlib.h) which too is
+compatible to the above two licenses.
+
+
+--- end of LICENSE.TXT ---
diff --git a/docs/MAKEPP b/docs/MAKEPP
new file mode 100644 (file)
index 0000000..58eaf55
--- /dev/null
@@ -0,0 +1,5 @@
+As a special  exception, FreeType can also be  built with the 'makepp'
+build tool, available from http://makepp.sourceforge.net.
+
+Note, however. that  you will need at least version  1.19 and pass the
+option --norc-substitution to have it work correctly.
diff --git a/docs/PROBLEMS b/docs/PROBLEMS
new file mode 100644 (file)
index 0000000..40bdc35
--- /dev/null
@@ -0,0 +1,90 @@
+This  file describes various  problems that  have been  encountered in
+compiling,  installing  and   running  FreeType  2.   Suggestions  for
+additions or other improvements to this file are welcome.
+
+----------------------------------------------------------------------
+
+Running Problems
+================
+
+
+* Some Type 1, Multiple Masters, and CID-keyed PostScript fonts aren't
+  handled correctly.
+
+-----
+
+Of course,  there might be  bugs in FreeType,  but some fonts based on
+the  PostScript  format can't  be handled indeed.  The reason  is that
+FreeType  doesn't contain a full  PostScript  interpreter  but applies
+pattern matching instead.  In case a font doesn't follow the  standard
+structure of the given font format, FreeType fails.  A typical example
+is Adobe's `Optima'  font family which  contains extra code  to switch
+between low and high resolution versions of the glyphs.
+
+It might be  possible to patch  FreeType in  some situations,  though.
+Please report failing fonts so that we investigate the problem and set
+up a list of such problematic fonts.
+
+
+* Why do identical FreeType  versions render differently  on different
+  platforms?
+
+-----
+
+Different distributions compile FreeType with different options.   The
+developer  version of  a  distribution's  FreeType  package,  which is
+needed to compile  your program  against FreeType,  includes the  file
+ftoption.h.  Compare  each platform's  copy of ftoption.h to  find the
+differences.
+
+
+----------------------------------------------------------------------
+
+
+Compilation Problems
+====================
+
+
+* I get an `internal compilation error' (ICE) while compiling FreeType
+  2.2.1 with Intel C++.
+
+  This has been reported for the following compiler version:
+
+    Intel(R) C++ Compiler for 32-bit applications,
+      Version 9.0 Build 20050430Z Package ID: W_CC_P_9.0.019
+
+-----
+
+The best solution is to update the compiler to version
+
+  Intel(R) C++ Compiler for 32-bit applications,
+    Version 9.1 Build 20060323Z Package ID: W_CC_P_9.1.022
+
+or newer.  If this isn't feasible, apply the following patch.
+
+
+--- src/cache/ftcbasic.c 20 Mar 2006 12:10:24 -0000 1.20
++++ src/cache/ftcbasic.c.patched 15 May 2006 02:51:02 -0000
+@@ -252,7 +252,7 @@
+   */
+
+   FT_CALLBACK_TABLE_DEF
+-  const FTC_IFamilyClassRec  ftc_basic_image_family_class =
++  FTC_IFamilyClassRec  ftc_basic_image_family_class =
+   {
+     {
+       sizeof ( FTC_BasicFamilyRec ),
+@@ -266,7 +266,7 @@
+
+
+   FT_CALLBACK_TABLE_DEF
+-  const FTC_GCacheClassRec  ftc_basic_image_cache_class =
++  FTC_GCacheClassRec  ftc_basic_image_cache_class =
+   {
+     {
+       ftc_inode_new,
+
+
+----------------------------------------------------------------------
+
+--- end of PROBLEMS ---
diff --git a/docs/TODO b/docs/TODO
new file mode 100644 (file)
index 0000000..be60d6f
--- /dev/null
+++ b/docs/TODO
@@ -0,0 +1,40 @@
+Here is a list of items that need to be addressed in FreeType 2
+---------------------------------------------------------------
+
+* Implement stem3/counter hints properly in the Postscript hinter.
+
+* Add CIDCMap support to the CID driver.
+
+* Add track kerning support to the PFR driver.
+
+* Add kerning (AFM file) support to the CID driver.
+
+
+Here is a list of bugs which should be handled
+----------------------------------------------
+
+Other bugs have been registered at the savannah bugzilla of FreeType.
+
+* CID driver:
+    Handle the case where a CID font has a top-level font matrix also
+    (see PLRM, 5.11.3, Type 0 CIDFonts).  Since CID_FaceInfoRec lacks
+    a font_matrix entry we have to directly apply it to all subfont
+    matrices.
+
+* CID driver:
+    Use top-level font matrix entry for setting the upem value, not the
+    entries in the FDarray.  If absent, use 1000.
+
+------------------------------------------------------------------------
+
+Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007 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 TODO ---
diff --git a/docs/VERSION.DLL b/docs/VERSION.DLL
new file mode 100644 (file)
index 0000000..1dfc8c1
--- /dev/null
@@ -0,0 +1,148 @@
+Due  to our  use of  `libtool' to  generate and  install the  FreeType 2
+libraries on  Unix systems,  as well as  other historical events,  it is
+generally very  difficult to  know precisely which  release of  the font
+engine is installed on a given system.
+
+This file tries  to explain why and to document  ways to properly detect
+FreeType on Unix.
+
+
+1. Version and Release numbers
+------------------------------
+
+For each new  public release of FreeType 2,  there are generally *three*
+distinct `version' numbers to consider:
+
+  * The official FreeType 2 release number, like 2.0.9 or 2.1.3.
+
+  * The libtool (and Unix) specific version number, like 9.2.3.  This is
+    what `freetype-config --version' returns.
+
+  * The platform-specific  shared object  number, used for  example when
+    the library is installed as `/usr/lib/libfreetype.so.6.3.2'.
+
+The platform-specific  number is, unsurprisingly,  platform-specific and
+varies  with the  operating system  you are  using (several  variants of
+Linux, FreeBSD,  Solaris, etc.).  You  should thus _never_ use  it, even
+for simple tests.
+
+The libtool-specific  number does  not equal the  release number  but is
+tied to it.
+
+The release number is available  at *compile* time through the following
+macros defined in FT_FREETYPE_H:
+
+  - FREETYPE_MAJOR: major release number
+  - FREETYPE_MINOR: minor release number
+  - FREETYPE_PATCH: patch release number
+
+See below for a small autoconf fragment.
+
+The  release   number  is  also  available  at   *runtime*  through  the
+`FT_Library_Version' API.   Unfortunately, this one  wasn't available or
+working correctly before the 2.1.3 official release.
+
+
+2. History
+----------
+
+The following table gives,  for each official release, the corresponding
+libtool  number, as well  as the  shared object  number found  on _most_
+systems, but not all of them:
+
+
+    release    libtool      so
+  -------------------------------
+     2.4.9      14.1.8    6.8.1
+     2.4.8      14.0.8    6.8.0
+     2.4.7      13.2.7    6.7.2
+     2.4.6      13.1.7    6.7.1
+     2.4.5      13.0.7    6.7.0
+     2.4.4      12.2.6    6.6.2
+     2.4.3      12.1.6    6.6.1
+     2.4.2      12.0.6    6.6.0
+     2.4.1      11.1.5    6.5.1
+     2.4.0      11.0.5    6.5.0
+     2.3.12     10.0.4    6.4.0
+     2.3.11     9.22.3    6.3.22
+     2.3.10     9.21.3    6.3.21
+     2.3.9      9.20.3    6.3.20
+     2.3.8      9.19.3    6.3.19
+     2.3.7      9.18.3    6.3.18
+     2.3.6      9.17.3    6.3.17
+     2.3.5      9.16.3    6.3.16
+     2.3.4      9.15.3    6.3.15
+     2.3.3      9.14.3    6.3.14
+     2.3.2      9.13.3    6.3.13
+     2.3.1      9.12.3    6.3.12
+     2.3.0      9.11.3    6.3.11
+     2.2.1      9.10.3    6.3.10
+     2.2.0      9.9.3     6.3.9
+     2.1.10     9.8.3     6.3.8
+     2.1.9      9.7.3     6.3.7
+     2.1.8      9.6.3     6.3.6
+     2.1.7      9.5.3     6.3.5
+     2.1.6      9.5.3     6.3.5
+     2.1.5      9.4.3     6.3.4
+     2.1.4      9.3.3     6.3.3
+     2.1.3      9.2.3     6.3.2
+     2.1.2      9.1.3     6.3.1
+     2.1.1      9.0.3         ?
+     2.1.0      8.0.2         ?
+     2.0.9      9.0.3         ?
+     2.0.8      8.0.2         ?
+     2.0.4      7.0.1         ?
+     2.0.1      6.1.0         ?
+
+The libtool numbers are a bit inconsistent due to the library's history:
+
+  - 2.1.0 was created as a development branch from 2.0.8 (hence the same
+    libtool numbers).
+
+  - 2.0.9  was  a  bug-fix  release  of  the  `stable'  branch,  and  we
+    incorrectly increased its libtool number.
+
+  - 2.1.4 was a development version, however it was stable  enough to be
+    the basis of the 2.2.0 release.
+
+
+3. Autoconf Code Fragment
+-------------------------
+
+Lars Clausen contributed the following autoconf fragment to detect which
+version of  FreeType is  installed on  a system.  This  one tests  for a
+version that  is at least 2.0.9;  you should change it  to check against
+other release numbers.
+
+
+  AC_MSG_CHECKING([whether FreeType version is 2.0.9 or higher])
+  old_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS=`freetype-config --cflags`
+  AC_TRY_CPP([
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#if (FREETYPE_MAJOR*1000 + FREETYPE_MINOR)*1000 + FREETYPE_PATCH < 2000009
+#error Freetype version too low.
+#endif
+  ],
+  [AC_MSG_RESULT(yes)
+   FREETYPE_LIBS=`freetype-config --libs`
+   AC_SUBST(FREETYPE_LIBS)
+   AC_DEFINE(HAVE_FREETYPE,1,[Define if you have the FreeType2 library])
+   CPPFLAGS="$old_CPPFLAGS"],
+  [AC_MSG_ERROR([Need FreeType library version 2.0.9 or higher])])
+
+------------------------------------------------------------------------
+
+Copyright 2002-2012 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 VERSION.DLL ---
diff --git a/docs/formats.txt b/docs/formats.txt
new file mode 100644 (file)
index 0000000..827c894
--- /dev/null
@@ -0,0 +1,174 @@
+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 ---
diff --git a/docs/raster.txt b/docs/raster.txt
new file mode 100644 (file)
index 0000000..95d9e24
--- /dev/null
@@ -0,0 +1,635 @@
+
+                   How FreeType's rasterizer work
+
+                          by David Turner
+
+                        Revised 2007-Feb-01
+
+
+This file  is an  attempt to explain  the internals of  the FreeType
+rasterizer.  The  rasterizer is of  quite general purpose  and could
+easily be integrated into other programs.
+
+
+  I. Introduction
+
+ II. Rendering Technology
+     1. Requirements
+     2. Profiles and Spans
+        a. Sweeping the Shape
+        b. Decomposing Outlines into Profiles
+        c. The Render Pool
+        d. Computing Profiles Extents
+        e. Computing Profiles Coordinates
+        f. Sweeping and Sorting the Spans
+
+
+I. Introduction
+===============
+
+  A  rasterizer is  a library  in charge  of converting  a vectorial
+  representation of a shape  into a bitmap.  The FreeType rasterizer
+  has  been  originally developed  to  render  the  glyphs found  in
+  TrueType  files, made  up  of segments  and second-order  Béziers.
+  Meanwhile it has been extended to render third-order Bézier curves
+  also.   This  document  is   an  explanation  of  its  design  and
+  implementation.
+
+  While  these explanations start  from the  basics, a  knowledge of
+  common rasterization techniques is assumed.
+
+
+II. Rendering Technology
+========================
+
+1. Requirements
+---------------
+
+  We  assume that  all scaling,  rotating, hinting,  etc.,  has been
+  already done.  The glyph is thus  described by a list of points in
+  the device space.
+
+  - All point coordinates  are in the 26.6 fixed  float format.  The
+    used orientation is:
+
+
+       ^ y
+       |         reference orientation
+       |
+       *----> x
+      0
+
+
+    `26.6' means  that 26 bits  are used for  the integer part  of a
+    value   and  6   bits  are   used  for   the   fractional  part.
+    Consequently, the `distance'  between two neighbouring pixels is
+    64 `units' (1 unit = 1/64th of a pixel).
+
+    Note  that, for  the rasterizer,  pixel centers  are  located at
+    integer   coordinates.   The   TrueType   bytecode  interpreter,
+    however, assumes that  the lower left edge of  a pixel (which is
+    taken  to be  a square  with  a length  of 1  unit) has  integer
+    coordinates.
+
+
+        ^ y                                        ^ y
+        |                                          |
+        |            (1,1)                         |      (0.5,0.5)
+        +-----------+                        +-----+-----+
+        |           |                        |     |     |
+        |           |                        |     |     |
+        |           |                        |     o-----+-----> x
+        |           |                        |   (0,0)   |
+        |           |                        |           |
+        o-----------+-----> x                +-----------+
+      (0,0)                             (-0.5,-0.5)
+
+   TrueType bytecode interpreter          FreeType rasterizer
+
+
+    A pixel line in the target bitmap is called a `scanline'.
+
+  - A  glyph  is  usually  made  of several  contours,  also  called
+    `outlines'.  A contour is simply a closed curve that delimits an
+    outer or inner region of the glyph.  It is described by a series
+    of successive points of the points table.
+
+    Each point  of the glyph  has an associated flag  that indicates
+    whether  it is  `on' or  `off' the  curve.  Two  successive `on'
+    points indicate a line segment joining the two points.
+
+    One `off' point amidst two `on' points indicates a second-degree
+    (conic)  Bézier parametric  arc, defined  by these  three points
+    (the `off' point being the  control point, and the `on' ones the
+    start and end points).  Similarly, a third-degree (cubic) Bézier
+    curve  is described  by four  points (two  `off'  control points
+    between two `on' points).
+
+    Finally,  for  second-order curves  only,  two successive  `off'
+    points  forces the  rasterizer to  create, during  rendering, an
+    `on'  point amidst them,  at their  exact middle.   This greatly
+    facilitates the  definition of  successive Bézier arcs.
+
+  The parametric form of a second-order Bézier curve is:
+
+      P(t) = (1-t)^2*P1 + 2*t*(1-t)*P2 + t^2*P3
+
+      (P1 and P3 are the end points, P2 the control point.)
+
+  The parametric form of a third-order Bézier curve is:
+
+      P(t) = (1-t)^3*P1 + 3*t*(1-t)^2*P2 + 3*t^2*(1-t)*P3 + t^3*P4
+
+      (P1 and P4 are the end points, P2 and P3 the control points.)
+
+  For both formulae, t is a real number in the range [0..1].
+
+  Note  that the rasterizer  does not  use these  formulae directly.
+  They exhibit,  however, one very  useful property of  Bézier arcs:
+  Each  point of  the curve  is a  weighted average  of  the control
+  points.
+
+  As all weights  are positive and always sum up  to 1, whatever the
+  value  of t,  each arc  point lies  within the  triangle (polygon)
+  defined by the arc's three (four) control points.
+
+  In  the following,  only second-order  curves are  discussed since
+  rasterization of third-order curves is completely identical.
+
+  Here some samples for second-order curves.
+
+
+                                        *            # on curve
+                                                     * off curve
+                                     __---__
+        #-__                      _--       -_
+            --__                _-            -
+                --__           #               \
+                    --__                        #
+                        -#
+                                 Two `on' points
+         Two `on' points       and one `off' point
+                                  between them
+
+                      *
+        #            __      Two `on' points with two `off'
+         \          -  -     points between them. The point
+          \        /    \    marked `0' is the middle of the
+           -      0      \   `off' points, and is a `virtual
+            -_  _-       #   on' point where the curve passes.
+              --             It does not appear in the point
+              *              list.
+
+
+2. Profiles and Spans
+---------------------
+
+  The following is a basic explanation of the _kind_ of computations
+  made  by  the   rasterizer  to  build  a  bitmap   from  a  vector
+  representation.  Note  that the actual  implementation is slightly
+  different, due to performance tuning and other factors.
+
+  However, the following ideas remain  in the same category, and are
+  more convenient to understand.
+
+
+  a. Sweeping the Shape
+
+    The best way to fill a shape is to decompose it into a number of
+    simple  horizontal segments,  then turn  them on  in  the target
+    bitmap.  These segments are called `spans'.
+
+                __---__
+             _--       -_
+           _-            -
+          -               \
+         /                 \
+        /                   \
+       |                     \
+
+                __---__         Example: filling a shape
+             _----------_                with spans.
+           _--------------
+          ----------------\
+         /-----------------\    This is typically done from the top
+        /                   \   to the bottom of the shape, in a
+       |           |         \  movement called a `sweep'.
+                   V
+
+                __---__
+             _----------_
+           _--------------
+          ----------------\
+         /-----------------\
+        /-------------------\
+       |---------------------\
+
+
+    In  order  to draw  a  span,  the  rasterizer must  compute  its
+    coordinates, which  are simply the x coordinates  of the shape's
+    contours, taken on the y scanlines.
+
+
+                   /---/    |---|   Note that there are usually
+                  /---/     |---|   several spans per scanline.
+        |        /---/      |---|
+        |       /---/_______|---|   When rendering this shape to the
+        V      /----------------|   current scanline y, we must
+              /-----------------|   compute the x values of the
+           a /----|         |---|   points a, b, c, and d.
+      - - - *     * - - - - *   * - - y -
+           /     / b       c|   |d
+
+
+                   /---/    |---|
+                  /---/     |---|  And then turn on the spans a-b
+                 /---/      |---|  and c-d.
+                /---/_______|---|
+               /----------------|
+              /-----------------|
+           a /----|         |---|
+      - - - ####### - - - - ##### - - y -
+           /     / b       c|   |d
+
+
+  b. Decomposing Outlines into Profiles
+
+    For  each  scanline during  the  sweep,  we  need the  following
+    information:
+
+    o The  number of  spans on  the current  scanline, given  by the
+      number of  shape points  intersecting the scanline  (these are
+      the points a, b, c, and d in the above example).
+
+    o The x coordinates of these points.
+
+    x coordinates are  computed before the sweep, in  a phase called
+    `decomposition' which converts the glyph into *profiles*.
+
+    Put it simply, a `profile'  is a contour's portion that can only
+    be either ascending or descending,  i.e., it is monotonic in the
+    vertical direction (we also say  y-monotonic).  There is no such
+    thing as a horizontal profile, as we shall see.
+
+    Here are a few examples:
+
+
+      this square
+                                          1         2
+         ---->----     is made of two
+        |         |                       |         |
+        |         |       profiles        |         |
+        ^         v                       ^    +    v
+        |         |                       |         |
+        |         |                       |         |
+         ----<----
+
+                                         up        down
+
+
+      this triangle
+
+             P2                             1          2
+
+             |\        is made of two       |         \
+          ^  | \  \                         |          \
+          | |   \  \      profiles         |            \      |
+         |  |    \  v                  ^   |             \     |
+           |      \                    |  |         +     \    v
+           |       \                   |  |                \
+        P1 ---___   \                     ---___            \
+                 ---_\                          ---_         \
+             <--__     P3                   up           down
+
+
+
+      A more general contour can be made of more than two profiles:
+
+              __     ^
+             /  |   /  ___          /    |
+            /   |     /   |        /     |       /     |
+           |    |    /   /    =>  |      v      /     /
+           |    |   |   |         |      |     ^     |
+        ^  |    |___|   |  |      ^   +  |  +  |  +  v
+        |  |           |   v      |                 |
+           |           |          |           up    |
+           |___________|          |    down         |
+
+                <--               up              down
+
+
+    Successive  profiles are  always joined  by  horizontal segments
+    that are not part of the profiles themselves.
+
+    For  the  rasterizer,  a  profile  is  simply  an  *array*  that
+    associates  one  horizontal *pixel*  coordinate  to each  bitmap
+    *scanline*  crossed  by  the  contour's section  containing  the
+    profile.  Note that profiles are *oriented* up or down along the
+    glyph's original flow orientation.
+
+    In other graphics libraries, profiles are also called `edges' or
+    `edgelists'.
+
+
+  c. The Render Pool
+
+    FreeType  has been designed  to be  able to  run well  on _very_
+    light systems, including embedded systems with very few memory.
+
+    A render pool  will be allocated once; the  rasterizer uses this
+    pool for all  its needs by managing this  memory directly in it.
+    The  algorithms that are  used for  profile computation  make it
+    possible to use  the pool as a simple  growing heap.  This means
+    that this  memory management is  actually quite easy  and faster
+    than any kind of malloc()/free() combination.
+
+    Moreover,  we'll see  later that  the rasterizer  is  able, when
+    dealing with profiles too large  and numerous to lie all at once
+    in  the render  pool, to  immediately decompose  recursively the
+    rendering process  into independent sub-tasks,  each taking less
+    memory to be performed (see `sub-banding' below).
+
+    The  render pool doesn't  need to  be large.   A 4KByte  pool is
+    enough for nearly all renditions, though nearly 100% slower than
+    a more comfortable 16KByte or 32KByte pool (that was tested with
+    complex glyphs at sizes over 500 pixels).
+
+
+  d. Computing Profiles Extents
+
+    Remember that a profile is an array, associating a _scanline_ to
+    the x pixel coordinate of its intersection with a contour.
+
+    Though it's not exactly how the FreeType rasterizer works, it is
+    convenient  to think  that  we need  a  profile's height  before
+    allocating it in the pool and computing its coordinates.
+
+    The profile's height  is the number of scanlines  crossed by the
+    y-monotonic section of a contour.  We thus need to compute these
+    sections from  the vectorial description.  In order  to do that,
+    we are  obliged to compute all  (local and global)  y extrema of
+    the glyph (minima and maxima).
+
+
+           P2             For instance, this triangle has only
+                          two y-extrema, which are simply
+           |\
+           | \               P2.y  as a vertical maximum
+          |   \              P3.y  as a vertical minimum
+          |    \
+         |      \            P1.y is not a vertical extremum (though
+         |       \           it is a horizontal minimum, which we
+      P1 ---___   \          don't need).
+               ---_\
+                     P3
+
+
+    Note  that the  extrema are  expressed  in pixel  units, not  in
+    scanlines.   The triangle's  height  is certainly  (P3.y-P2.y+1)
+    pixel  units,   but  its  profiles'  heights   are  computed  in
+    scanlines.  The exact conversion is simple:
+
+      - min scanline = FLOOR  ( min y )
+      - max scanline = CEILING( max y )
+
+    A problem  arises with Bézier  Arcs.  While a segment  is always
+    necessarily y-monotonic (i.e.,  flat, ascending, or descending),
+    which makes extrema computations easy,  the ascent of an arc can
+    vary between its control points.
+
+
+                          P2
+                         *
+                                       # on curve
+                                       * off curve
+                   __-x--_
+                _--       -_
+          P1  _-            -          A non y-monotonic Bézier arc.
+             #               \
+                              -        The arc goes from P1 to P3.
+                               \
+                                \  P3
+                                 #
+
+
+    We first  need to be  able to easily detect  non-monotonic arcs,
+    according to  their control points.  I will  state here, without
+    proof, that the monotony condition can be expressed as:
+
+      P1.y <= P2.y <= P3.y   for an ever-ascending arc
+
+      P1.y >= P2.y >= P3.y   for an ever-descending arc
+
+    with the special case of
+
+      P1.y = P2.y = P3.y     where the arc is said to be `flat'.
+
+    As  you can  see, these  conditions can  be very  easily tested.
+    They are, however, extremely important, as any arc that does not
+    satisfy them necessarily contains an extremum.
+
+    Note  also that  a monotonic  arc can  contain an  extremum too,
+    which is then one of its `on' points:
+
+
+        P1           P2
+          #---__   *         P1P2P3 is ever-descending, but P1
+                -_           is an y-extremum.
+                  -
+           ---_    \
+               ->   \
+                     \  P3
+                      #
+
+
+    Let's go back to our previous example:
+
+
+                          P2
+                         *
+                                       # on curve
+                                       * off curve
+                   __-x--_
+                _--       -_
+          P1  _-            -          A non-y-monotonic Bézier arc.
+             #               \
+                              -        Here we have
+                               \              P2.y >= P1.y &&
+                                \  P3         P2.y >= P3.y      (!)
+                                 #
+
+
+    We need to  compute the vertical maximum of this  arc to be able
+    to compute a profile's height (the point marked by an `x').  The
+    arc's equation indicates that  a direct computation is possible,
+    but  we rely  on a  different technique,  which use  will become
+    apparent soon.
+
+    Bézier  arcs have  the  special property  of  being very  easily
+    decomposed into two sub-arcs,  which are themselves Bézier arcs.
+    Moreover, it is easy to prove that there is at most one vertical
+    extremum on  each Bézier arc (for  second-degree curves; similar
+    conditions can be found for third-order arcs).
+
+    For instance,  the following arc  P1P2P3 can be  decomposed into
+    two sub-arcs Q1Q2Q3 and R1R2R3:
+
+
+                    P2
+                   *
+                                    # on  curve
+                                    * off curve
+
+
+                                    original Bézier arc P1P2P3.
+                __---__
+             _--       --_
+           _-             -_
+          -                 -
+         /                   \
+        /                     \
+       #                       #
+     P1                         P3
+
+
+
+                    P2
+                   *
+
+
+
+                   Q3                 Decomposed into two subarcs
+          Q2                R2        Q1Q2Q3 and R1R2R3
+            *   __-#-__   *
+             _--       --_
+           _-       R1    -_          Q1 = P1         R3 = P3
+          -                 -         Q2 = (P1+P2)/2  R2 = (P2+P3)/2
+         /                   \
+        /                     \            Q3 = R1 = (Q2+R2)/2
+       #                       #
+     Q1                         R3    Note that Q2, R2, and Q3=R1
+                                      are on a single line which is
+                                      tangent to the curve.
+
+
+    We have then decomposed  a non-y-monotonic Bézier curve into two
+    smaller sub-arcs.  Note that in the above drawing, both sub-arcs
+    are monotonic, and that the extremum is then Q3=R1.  However, in
+    a  more general  case,  only  one sub-arc  is  guaranteed to  be
+    monotonic.  Getting back to our former example:
+
+
+                    Q2
+                   *
+
+                   __-x--_ R1
+                _--       #_
+          Q1  _-        Q3  -   R2
+             #               \ *
+                              -
+                               \
+                                \  R3
+                                 #
+
+
+    Here, we see that,  though Q1Q2Q3 is still non-monotonic, R1R2R3
+    is ever  descending: We  thus know that  it doesn't  contain the
+    extremum.  We can then re-subdivide Q1Q2Q3 into two sub-arcs and
+    go  on recursively,  stopping  when we  encounter two  monotonic
+    subarcs, or when the subarcs become simply too small.
+
+    We  will finally  find  the vertical  extremum.   Note that  the
+    iterative process of finding an extremum is called `flattening'.
+
+
+  e. Computing Profiles Coordinates
+
+    Once we have the height of each profile, we are able to allocate
+    it in the render pool.   The next task is to compute coordinates
+    for each scanline.
+
+    In  the case  of segments,  the computation  is straightforward,
+    using  the  Euclidean   algorithm  (also  known  as  Bresenham).
+    However, for Bézier arcs, the job is a little more complicated.
+
+    We assume  that all Béziers that  are part of a  profile are the
+    result of  flattening the curve,  which means that they  are all
+    y-monotonic (ascending  or descending, and never  flat).  We now
+    have  to compute the  intersections of  arcs with  the profile's
+    scanlines.  One  way is  to use a  similar scheme  to flattening
+    called `stepping'.
+
+
+                                 Consider this arc, going from P1 to
+      ---------------------      P3.  Suppose that we need to
+                                 compute its intersections with the
+                                 drawn scanlines.  As already
+      ---------------------      mentioned this can be done
+                                 directly, but the involved
+          * P2         _---# P3  algorithm is far too slow.
+      ------------- _--  --
+                  _-
+                _/               Instead, it is still possible to
+      ---------/-----------      use the decomposition property in
+              /                  the same recursive way, i.e.,
+             |                   subdivide the arc into subarcs
+      ------|--------------      until these get too small to cross
+            |                    more than one scanline!
+           |
+      -----|---------------      This is very easily done using a
+          |                      rasterizer-managed stack of
+          |                      subarcs.
+          # P1
+
+
+  f. Sweeping and Sorting the Spans
+
+    Once all our profiles have  been computed, we begin the sweep to
+    build (and fill) the spans.
+
+    As both the  TrueType and Type 1 specifications  use the winding
+    fill  rule (but  with opposite  directions), we  place,  on each
+    scanline, the present profiles in two separate lists.
+
+    One  list,  called  the  `left'  one,  only  contains  ascending
+    profiles, while  the other `right' list  contains the descending
+    profiles.
+
+    As  each glyph  is made  of  closed curves,  a simple  geometric
+    property ensures that  the two lists contain the  same number of
+    elements.
+
+    Creating spans is thus straightforward:
+
+    1. We sort each list in increasing horizontal order.
+
+    2. We pair  each value of  the left list with  its corresponding
+       value in the right list.
+
+
+                   /     /  |   |          For example, we have here
+                  /     /   |   |          four profiles.  Two of
+                >/     /    |   |  |       them are ascending (1 &
+              1//     /   ^ |   |  | 2     3), while the two others
+              //     //  3| |   |  v       are descending (2 & 4).
+              /     //4   | |   |          On the given scanline,
+           a /     /<       |   |          the left list is (1,3),
+      - - - *-----* - - - - *---* - - y -  and the right one is
+           /     / b       c|   |d         (4,2) (sorted).
+
+                                   There are then two spans, joining
+                                   1 to 4 (i.e. a-b) and 3 to 2
+                                   (i.e. c-d)!
+
+
+    Sorting doesn't necessarily  take much time, as in  99 cases out
+    of 100, the lists' order is  kept from one scanline to the next.
+    We can  thus implement it  with two simple  singly-linked lists,
+    sorted by a classic bubble-sort, which takes a minimum amount of
+    time when the lists are already sorted.
+
+    A  previous  version  of  the  rasterizer  used  more  elaborate
+    structures, like arrays to  perform `faster' sorting.  It turned
+    out that  this old scheme is  not faster than  the one described
+    above.
+
+    Once the spans  have been `created', we can  simply draw them in
+    the target bitmap.
+
+------------------------------------------------------------------------
+
+Copyright 2003, 2007 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 raster.txt ---
+
+Local Variables:
+coding: utf-8
+End:
diff --git a/docs/reference/.gitignore b/docs/reference/.gitignore
new file mode 100644 (file)
index 0000000..2d19fc7
--- /dev/null
@@ -0,0 +1 @@
+*.html
diff --git a/docs/reference/README b/docs/reference/README
new file mode 100644 (file)
index 0000000..51b04d6
--- /dev/null
@@ -0,0 +1,5 @@
+After saying `make refdoc' this directory contains the FreeType API
+reference.  You need python to make this target.
+
+This also works with Jam: Just type `jam refdoc' in the main directory.
+
diff --git a/docs/release b/docs/release
new file mode 100644 (file)
index 0000000..28a8235
--- /dev/null
@@ -0,0 +1,209 @@
+How to prepare a new release
+----------------------------
+
+. include/freetype/freetype.h:  Update FREETYPE_MAJOR, FREETYPE_MINOR,
+  and FREETYPE_PATCH.
+
+. Update version numbers in all files where necessary (for example, do
+  a grep for both `2.3.1' and `231' for release 2.3.1).
+
+. builds/unix/configure.raw: Update `version_info'.
+
+. docs/CHANGES: Document differences to last release.
+
+. README: Update.
+
+. docs/VERSION.DLL: Document changed `version_info'.
+
+. ChangeLog:   Announce  new  release   (both  in  the  freetype2  and
+  freetype2-demos modules).
+
+. Clone the git archive to another directory with
+
+    git clone -l -s . ../freetype2.test
+
+  or something like this and run
+
+    make distclean; make devel; make
+    make distclean; make devel; make multi
+    make distclean; make devel CC=g++; make CC=g++
+    make distclean; make devel CC=g++; make multi CC=g++
+
+    sh autogen.sh
+    make distclean; ./configure; make
+    make distclean; ./configure CC=g++; make
+
+  in the cloned repository to test compilation with both gcc and g++.
+
+. Test C++ compilation  for freetype2-demos too  (using `git clone' as
+  above).
+
+. Run  src/tools/chktrcmp.py  and check  that there  are no  undefined
+  trace_XXXX macros.
+
+. Tag the git repositories (freetype2, freetype2-demos) with
+
+    git tag VER-<version> -m "" -u <committer>
+
+  and push the tags with
+
+    git push --tags
+
+  TODO: Tag the home page CVS on savannah.nongnu.org.
+
+. Say `make  dist' in both the  freetype2 and freetype2-demos  modules
+  to generate the .tar.gz, .tar.bz2, and .zip files.
+
+. Create     the     doc    bundles    (freetype-doc-<version>.tar.gz,
+  freetype-doc-<version>.tar.bz2,    ftdoc<version>.zip).    This   is
+  everything below
+
+    freetype.freedesktop.org:/srv/freetype.freedesktop.org/www/freetype2/docs/
+
+  except the `reference' subdirectory.   Do *not* use option `-l' from
+  zip!
+
+. Run the following script (with updated `$VERSION', `$SAVANNAH_USER',
+  and $SOURCEFORGE_USER  variables) to sign and upload the  bundles to
+  both Savannah and SourceForge.  The signing code has been taken from
+  the `gnupload' script (part of the automake bundle).
+
+    #!/bin/sh
+
+    VERSION=2.4.8
+    SAVANNAH_USER=wl
+    SOURCEFORGE_USER=wlemb
+
+    #####################################################################
+
+    GPG='/usr/bin/gpg --batch --no-tty'
+
+    version=`echo $VERSION | sed "s/\\.//g"`
+
+    FREETYPE_PACKAGES="freetype-$VERSION.tar.gz \
+                       freetype-$VERSION.tar.bz2 \
+                       ft$version.zip"
+    FT2DEMOS_PACKAGES="ft2demos-$VERSION.tar.gz \
+                       ft2demos-$VERSION.tar.bz2 \
+                       ftdmo$version.zip"
+    FTDOC_PACKAGES="freetype-doc-$VERSION.tar.gz \
+                    freetype-doc-$VERSION.tar.bz2 \
+                    ftdoc$version.zip"
+
+    PACKAGE_LIST="$FREETYPE_PACKAGES \
+                  $FT2DEMOS_PACKAGES \
+                  $FTDOC_PACKAGES"
+
+    set -e
+    unset passphrase
+
+    PATH=/empty echo -n "Enter GPG passphrase: "
+    stty -echo
+    read -r passphrase
+    stty echo
+    echo
+
+    for f in $PACKAGE_LIST; do
+      if test ! -f $f; then
+        echo "$0: Cannot find \`$f'" 1>&2
+        exit 1
+      else
+        :
+      fi
+    done
+
+    for f in $PACKAGE_LIST; do
+      echo "Signing $f..."
+      rm -f $f.sig
+      echo $passphrase | $GPG --passphrase-fd 0 -ba -o $f.sig $f
+    done
+
+    FREETYPE_SIGNATURES=
+    for i in $FREETYPE_PACKAGES; do
+      FREETYPE_SIGNATURES="$FREETYPE_SIGNATURES $i.sig"
+    done
+
+    FT2DEMOS_SIGNATURES=
+    for i in $FT2DEMOS_PACKAGES; do
+      FT2DEMOS_SIGNATURES="$FT2DEMOS_SIGNATURES $i.sig"
+    done
+
+    FTDOC_SIGNATURES=
+    for i in $FTDOC_PACKAGES; do
+      FTDOC_SIGNATURES="$FTDOC_SIGNATURES $i.sig"
+    done
+
+    SIGNATURE_LIST="$FREETYPE_SIGNATURES \
+                    $FT2DEMOS_SIGNATURES \
+                    $FTDOC_SIGNATURES"
+
+    scp $PACKAGE_LIST $SIGNATURE_LIST \
+      $SAVANNAH_USER@dl.sv.nongnu.org:/releases/freetype/
+
+    rsync -avP -e ssh $FREETYPE_PACKAGES $FREETYPE_SIGNATURES \
+      $SOURCEFORGE_USER,freetype@frs.sf.net:/home/frs/project/f/fr/freetype/freetype2/$VERSION/
+    rsync -avP -e ssh $FT2DEMOS_PACKAGES $FT2DEMOS_SIGNATURES \
+      $SOURCEFORGE_USER,freetype@frs.sf.net:/home/frs/project/f/fr/freetype/freetype-demos/$VERSION/
+    rsync -avP -e ssh $FTDOC_PACKAGES $FTDOC_SIGNATURES \
+      $SOURCEFORGE_USER,freetype@frs.sf.net:/home/frs/project/f/fr/freetype/freetype-docs/$VERSION/
+
+    # EOF
+
+. Prepare a  README for SourceForge  and upload it  with the following
+  script (with updated `$VERSION' and $SOURCEFORGE_USER variables).
+
+    #!/bin/sh
+
+    VERSION=2.4.8
+    SOURCEFORGE_USER=wlemb
+
+    #####################################################################
+
+    rsync -avP -e ssh README \
+      $SOURCEFORGE_USER,freetype@frs.sf.net:/home/frs/project/f/fr/freetype/freetype2/$VERSION/
+
+    # EOF
+
+. On   SourceForge,   tag   the   just   uploaded   `ftXXXX.zip'   and
+  `freetype-XXX.tar.bz2'  files as the  default files to  download for
+  `Windows' and `Others', respectively.
+
+. Copy the reference files (generated by `make dist') to
+
+    freetype.freedesktop.org:/srv/freetype.freedesktop.org/www/freetype2/docs/reference
+
+  and
+
+    shell.sf.net:/home/groups/f/fr/freetype/htdocs/freetype2/docs/reference
+
+  TODO: Create  FreeType  home  page  CVS  on savannah.nongnu.org  and
+        update it accordingly.
+
+        Write script to automatically do this.
+
+        Mirror FreeType's savannah home page everywhere.
+
+. Update
+
+    freetype.freedesktop.org:/srv/freetype.freedesktop.org/www/index2.html
+
+  and copy it to
+
+    shell.sf.net:/home/groups/f/fr/freetype/htdocs/index2.html
+
+. Announce new release on freetype-announce@nongnu.org and to relevant
+  newsgroups.
+
+----------------------------------------------------------------------
+
+Copyright 2003, 2005-2007, 2009, 2011 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 release ---
diff --git a/ft2demos/ftbench b/ft2demos/ftbench
new file mode 100755 (executable)
index 0000000..a53d002
Binary files /dev/null and b/ft2demos/ftbench differ
diff --git a/ft2demos/ftdiff b/ft2demos/ftdiff
new file mode 100755 (executable)
index 0000000..e25e76a
Binary files /dev/null and b/ft2demos/ftdiff differ
diff --git a/ft2demos/ftdump b/ft2demos/ftdump
new file mode 100755 (executable)
index 0000000..45a3572
Binary files /dev/null and b/ft2demos/ftdump differ
diff --git a/ft2demos/ftgamma b/ft2demos/ftgamma
new file mode 100755 (executable)
index 0000000..46015e8
Binary files /dev/null and b/ft2demos/ftgamma differ
diff --git a/ft2demos/ftgrid b/ft2demos/ftgrid
new file mode 100755 (executable)
index 0000000..a11e773
Binary files /dev/null and b/ft2demos/ftgrid differ
diff --git a/ft2demos/ftlint b/ft2demos/ftlint
new file mode 100755 (executable)
index 0000000..d6482b2
Binary files /dev/null and b/ft2demos/ftlint differ
diff --git a/ft2demos/ftmulti b/ft2demos/ftmulti
new file mode 100755 (executable)
index 0000000..3e48474
Binary files /dev/null and b/ft2demos/ftmulti differ
diff --git a/ft2demos/ftstring b/ft2demos/ftstring
new file mode 100755 (executable)
index 0000000..a02606f
Binary files /dev/null and b/ft2demos/ftstring differ
diff --git a/ft2demos/ftview b/ft2demos/ftview
new file mode 100755 (executable)
index 0000000..91e725d
Binary files /dev/null and b/ft2demos/ftview differ
diff --git a/include/freetype/config/ftconfig.h b/include/freetype/config/ftconfig.h
new file mode 100644 (file)
index 0000000..5628569
--- /dev/null
@@ -0,0 +1,563 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftconfig.h                                                             */
+/*                                                                         */
+/*    ANSI-specific configuration file (specification only).               */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006-2008, 2010-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This header file contains a number of macro definitions that are used */
+  /* by the rest of the engine.  Most of the macros here are automatically */
+  /* determined at compile time, and you should not need to change it to   */
+  /* port FreeType, except to compile the library with a non-ANSI          */
+  /* compiler.                                                             */
+  /*                                                                       */
+  /* Note however that if some specific modifications are needed, we       */
+  /* advise you to place a modified copy in your build directory.          */
+  /*                                                                       */
+  /* The build directory is usually `freetype/builds/<system>', and        */
+  /* contains system-specific files that are always included first when    */
+  /* building the library.                                                 */
+  /*                                                                       */
+  /* This ANSI version should stay in `include/freetype/config'.           */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __FTCONFIG_H__
+#define __FTCONFIG_H__
+
+#include <ft2build.h>
+#include FT_CONFIG_OPTIONS_H
+#include FT_CONFIG_STANDARD_LIBRARY_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*               PLATFORM-SPECIFIC CONFIGURATION MACROS                  */
+  /*                                                                       */
+  /* These macros can be toggled to suit a specific system.  The current   */
+  /* ones are defaults used to compile FreeType in an ANSI C environment   */
+  /* (16bit compilers are also supported).  Copy this file to your own     */
+  /* `freetype/builds/<system>' directory, and edit it to port the engine. */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* There are systems (like the Texas Instruments 'C54x) where a `char' */
+  /* has 16 bits.  ANSI C says that sizeof(char) is always 1.  Since an  */
+  /* `int' has 16 bits also for this system, sizeof(int) gives 1 which   */
+  /* is probably unexpected.                                             */
+  /*                                                                     */
+  /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a      */
+  /* `char' type.                                                        */
+
+#ifndef FT_CHAR_BIT
+#define FT_CHAR_BIT  CHAR_BIT
+#endif
+
+
+  /* The size of an `int' type.  */
+#if                                 FT_UINT_MAX == 0xFFFFUL
+#define FT_SIZEOF_INT  (16 / FT_CHAR_BIT)
+#elif                               FT_UINT_MAX == 0xFFFFFFFFUL
+#define FT_SIZEOF_INT  (32 / FT_CHAR_BIT)
+#elif FT_UINT_MAX > 0xFFFFFFFFUL && FT_UINT_MAX == 0xFFFFFFFFFFFFFFFFUL
+#define FT_SIZEOF_INT  (64 / FT_CHAR_BIT)
+#else
+#error "Unsupported size of `int' type!"
+#endif
+
+  /* The size of a `long' type.  A five-byte `long' (as used e.g. on the */
+  /* DM642) is recognized but avoided.                                   */
+#if                                  FT_ULONG_MAX == 0xFFFFFFFFUL
+#define FT_SIZEOF_LONG  (32 / FT_CHAR_BIT)
+#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL
+#define FT_SIZEOF_LONG  (32 / FT_CHAR_BIT)
+#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFFFFFFFUL
+#define FT_SIZEOF_LONG  (64 / FT_CHAR_BIT)
+#else
+#error "Unsupported size of `long' type!"
+#endif
+
+
+  /* FT_UNUSED is a macro used to indicate that a given parameter is not  */
+  /* used -- this is only used to get rid of unpleasant compiler warnings */
+#ifndef FT_UNUSED
+#define FT_UNUSED( arg )  ( (arg) = (arg) )
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                     AUTOMATIC CONFIGURATION MACROS                    */
+  /*                                                                       */
+  /* These macros are computed from the ones defined above.  Don't touch   */
+  /* their definition, unless you know precisely what you are doing.  No   */
+  /* porter should need to mess with them.                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Mac support                                                           */
+  /*                                                                       */
+  /*   This is the only necessary change, so it is defined here instead    */
+  /*   providing a new configuration file.                                 */
+  /*                                                                       */
+#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) )
+  /* no Carbon frameworks for 64bit 10.4.x */
+  /* AvailabilityMacros.h is available since Mac OS X 10.2,        */
+  /* so guess the system version by maximum errno before inclusion */
+#include <errno.h>
+#ifdef ECANCELED /* defined since 10.2 */
+#include "AvailabilityMacros.h"
+#endif
+#if defined( __LP64__ ) && \
+    ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 )
+#undef FT_MACINTOSH
+#endif
+
+#elif defined( __SC__ ) || defined( __MRC__ )
+  /* Classic MacOS compilers */
+#include "ConditionalMacros.h"
+#if TARGET_OS_MAC
+#define FT_MACINTOSH 1
+#endif
+
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    basic_types                                                        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Int16                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for a 16bit signed integer type.                         */
+  /*                                                                       */
+  typedef signed short  FT_Int16;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_UInt16                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for a 16bit unsigned integer type.                       */
+  /*                                                                       */
+  typedef unsigned short  FT_UInt16;
+
+  /* */
+
+
+  /* this #if 0 ... #endif clause is for documentation purposes */
+#if 0
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Int32                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for a 32bit signed integer type.  The size depends on    */
+  /*    the configuration.                                                 */
+  /*                                                                       */
+  typedef signed XXX  FT_Int32;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_UInt32                                                          */
+  /*                                                                       */
+  /*    A typedef for a 32bit unsigned integer type.  The size depends on  */
+  /*    the configuration.                                                 */
+  /*                                                                       */
+  typedef unsigned XXX  FT_UInt32;
+
+  /* */
+
+#endif
+
+#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT)
+
+  typedef signed int      FT_Int32;
+  typedef unsigned int    FT_UInt32;
+
+#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT)
+
+  typedef signed long     FT_Int32;
+  typedef unsigned long   FT_UInt32;
+
+#else
+#error "no 32bit type found -- please check your configuration files"
+#endif
+
+
+  /* look up an integer type that is at least 32 bits */
+#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT)
+
+  typedef int            FT_Fast;
+  typedef unsigned int   FT_UFast;
+
+#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT)
+
+  typedef long           FT_Fast;
+  typedef unsigned long  FT_UFast;
+
+#endif
+
+
+  /* determine whether we have a 64-bit int type for platforms without */
+  /* Autoconf                                                          */
+#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT)
+
+  /* FT_LONG64 must be defined if a 64-bit type is available */
+#define FT_LONG64
+#define FT_INT64  long
+
+#elif defined( _MSC_VER ) && _MSC_VER >= 900  /* Visual C++ (and Intel C++) */
+
+  /* this compiler provides the __int64 type */
+#define FT_LONG64
+#define FT_INT64  __int64
+
+#elif defined( __BORLANDC__ )  /* Borland C++ */
+
+  /* XXXX: We should probably check the value of __BORLANDC__ in order */
+  /*       to test the compiler version.                               */
+
+  /* this compiler provides the __int64 type */
+#define FT_LONG64
+#define FT_INT64  __int64
+
+#elif defined( __WATCOMC__ )   /* Watcom C++ */
+
+  /* Watcom doesn't provide 64-bit data types */
+
+#elif defined( __MWERKS__ )    /* Metrowerks CodeWarrior */
+
+#define FT_LONG64
+#define FT_INT64  long long int
+
+#elif defined( __GNUC__ )
+
+  /* GCC provides the `long long' type */
+#define FT_LONG64
+#define FT_INT64  long long int
+
+#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* A 64-bit data type will create compilation problems if you compile    */
+  /* in strict ANSI mode.  To avoid them, we disable its use if __STDC__   */
+  /* is defined.  You can however ignore this rule by defining the         */
+  /* FT_CONFIG_OPTION_FORCE_INT64 configuration macro.                     */
+  /*                                                                       */
+#if defined( FT_LONG64 ) && !defined( FT_CONFIG_OPTION_FORCE_INT64 )
+
+#ifdef __STDC__
+
+  /* undefine the 64-bit macros in strict ANSI compilation mode */
+#undef FT_LONG64
+#undef FT_INT64
+
+#endif /* __STDC__ */
+
+#endif /* FT_LONG64 && !FT_CONFIG_OPTION_FORCE_INT64 */
+
+
+#define FT_BEGIN_STMNT  do {
+#define FT_END_STMNT    } while ( 0 )
+#define FT_DUMMY_STMNT  FT_BEGIN_STMNT FT_END_STMNT
+
+
+#ifndef  FT_CONFIG_OPTION_NO_ASSEMBLER
+  /* Provide assembler fragments for performance-critical functions. */
+  /* These must be defined `static __inline__' with GCC.             */
+
+#if defined( __CC_ARM ) || defined( __ARMCC__ )  /* RVCT */
+#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm
+
+  /* documentation is in freetype.h */
+
+  static __inline FT_Int32
+  FT_MulFix_arm( FT_Int32  a,
+                 FT_Int32  b )
+  {
+    register FT_Int32  t, t2;
+
+
+    __asm
+    {
+      smull t2, t,  b,  a           /* (lo=t2,hi=t) = a*b */
+      mov   a,  t,  asr #31         /* a   = (hi >> 31) */
+      add   a,  a,  #0x8000         /* a  += 0x8000 */
+      adds  t2, t2, a               /* t2 += a */
+      adc   t,  t,  #0              /* t  += carry */
+      mov   a,  t2, lsr #16         /* a   = t2 >> 16 */
+      orr   a,  a,  t,  lsl #16     /* a  |= t << 16 */
+    }
+    return a;
+  }
+
+#endif /* __CC_ARM || __ARMCC__ */
+
+
+#ifdef __GNUC__
+
+#if defined( __arm__ ) && !defined( __thumb__ )    && \
+    !( defined( __CC_ARM ) || defined( __ARMCC__ ) )
+#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm
+
+  /* documentation is in freetype.h */
+
+  static __inline__ FT_Int32
+  FT_MulFix_arm( FT_Int32  a,
+                 FT_Int32  b )
+  {
+    register FT_Int32  t, t2;
+
+
+    __asm__ __volatile__ (
+      "smull  %1, %2, %4, %3\n\t"       /* (lo=%1,hi=%2) = a*b */
+      "mov    %0, %2, asr #31\n\t"      /* %0  = (hi >> 31) */
+      "add    %0, %0, #0x8000\n\t"      /* %0 += 0x8000 */
+      "adds   %1, %1, %0\n\t"           /* %1 += %0 */
+      "adc    %2, %2, #0\n\t"           /* %2 += carry */
+      "mov    %0, %1, lsr #16\n\t"      /* %0  = %1 >> 16 */
+      "orr    %0, %0, %2, lsl #16\n\t"  /* %0 |= %2 << 16 */
+      : "=r"(a), "=&r"(t2), "=&r"(t)
+      : "r"(a), "r"(b) );
+    return a;
+  }
+
+#endif /* __arm__ && !__thumb__ && !( __CC_ARM || __ARMCC__ ) */
+
+#if defined( __i386__ )
+#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386
+
+  /* documentation is in freetype.h */
+
+  static __inline__ FT_Int32
+  FT_MulFix_i386( FT_Int32  a,
+                  FT_Int32  b )
+  {
+    register FT_Int32  result;
+
+
+    __asm__ __volatile__ (
+      "imul  %%edx\n"
+      "movl  %%edx, %%ecx\n"
+      "sarl  $31, %%ecx\n"
+      "addl  $0x8000, %%ecx\n"
+      "addl  %%ecx, %%eax\n"
+      "adcl  $0, %%edx\n"
+      "shrl  $16, %%eax\n"
+      "shll  $16, %%edx\n"
+      "addl  %%edx, %%eax\n"
+      : "=a"(result), "=d"(b)
+      : "a"(a), "d"(b)
+      : "%ecx", "cc" );
+    return result;
+  }
+
+#endif /* i386 */
+
+#endif /* __GNUC__ */
+
+
+#ifdef _MSC_VER /* Visual C++ */
+
+#ifdef _M_IX86
+
+#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386
+
+  /* documentation is in freetype.h */
+
+  static __inline FT_Int32
+  FT_MulFix_i386( FT_Int32  a,
+                  FT_Int32  b )
+  {
+    register FT_Int32  result;
+
+    __asm
+    {
+      mov eax, a
+      mov edx, b
+      imul edx
+      mov ecx, edx
+      sar ecx, 31
+      add ecx, 8000h
+      add eax, ecx
+      adc edx, 0
+      shr eax, 16
+      shl edx, 16
+      add eax, edx
+      mov result, eax
+    }
+    return result;
+  }
+
+#endif /* _M_IX86 */
+
+#endif /* _MSC_VER */
+
+#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+
+#ifdef FT_CONFIG_OPTION_INLINE_MULFIX
+#ifdef FT_MULFIX_ASSEMBLER
+#define FT_MULFIX_INLINED  FT_MULFIX_ASSEMBLER
+#endif
+#endif
+
+
+#ifdef FT_MAKE_OPTION_SINGLE_OBJECT
+
+#define FT_LOCAL( x )      static  x
+#define FT_LOCAL_DEF( x )  static  x
+
+#else
+
+#ifdef __cplusplus
+#define FT_LOCAL( x )      extern "C"  x
+#define FT_LOCAL_DEF( x )  extern "C"  x
+#else
+#define FT_LOCAL( x )      extern  x
+#define FT_LOCAL_DEF( x )  x
+#endif
+
+#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */
+
+
+#ifndef FT_BASE
+
+#ifdef __cplusplus
+#define FT_BASE( x )  extern "C"  x
+#else
+#define FT_BASE( x )  extern  x
+#endif
+
+#endif /* !FT_BASE */
+
+
+#ifndef FT_BASE_DEF
+
+#ifdef __cplusplus
+#define FT_BASE_DEF( x )  x
+#else
+#define FT_BASE_DEF( x )  x
+#endif
+
+#endif /* !FT_BASE_DEF */
+
+
+#ifndef FT_EXPORT
+
+#ifdef __cplusplus
+#define FT_EXPORT( x )  extern "C"  x
+#else
+#define FT_EXPORT( x )  extern  x
+#endif
+
+#endif /* !FT_EXPORT */
+
+
+#ifndef FT_EXPORT_DEF
+
+#ifdef __cplusplus
+#define FT_EXPORT_DEF( x )  extern "C"  x
+#else
+#define FT_EXPORT_DEF( x )  extern  x
+#endif
+
+#endif /* !FT_EXPORT_DEF */
+
+
+#ifndef FT_EXPORT_VAR
+
+#ifdef __cplusplus
+#define FT_EXPORT_VAR( x )  extern "C"  x
+#else
+#define FT_EXPORT_VAR( x )  extern  x
+#endif
+
+#endif /* !FT_EXPORT_VAR */
+
+  /* The following macros are needed to compile the library with a   */
+  /* C++ compiler and with 16bit compilers.                          */
+  /*                                                                 */
+
+  /* This is special.  Within C++, you must specify `extern "C"' for */
+  /* functions which are used via function pointers, and you also    */
+  /* must do that for structures which contain function pointers to  */
+  /* assure C linkage -- it's not possible to have (local) anonymous */
+  /* functions which are accessed by (global) function pointers.     */
+  /*                                                                 */
+  /*                                                                 */
+  /* FT_CALLBACK_DEF is used to _define_ a callback function.        */
+  /*                                                                 */
+  /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */
+  /* contains pointers to callback functions.                        */
+  /*                                                                 */
+  /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable   */
+  /* that contains pointers to callback functions.                   */
+  /*                                                                 */
+  /*                                                                 */
+  /* Some 16bit compilers have to redefine these macros to insert    */
+  /* the infamous `_cdecl' or `__fastcall' declarations.             */
+  /*                                                                 */
+#ifndef FT_CALLBACK_DEF
+#ifdef __cplusplus
+#define FT_CALLBACK_DEF( x )  extern "C"  x
+#else
+#define FT_CALLBACK_DEF( x )  static  x
+#endif
+#endif /* FT_CALLBACK_DEF */
+
+#ifndef FT_CALLBACK_TABLE
+#ifdef __cplusplus
+#define FT_CALLBACK_TABLE      extern "C"
+#define FT_CALLBACK_TABLE_DEF  extern "C"
+#else
+#define FT_CALLBACK_TABLE      extern
+#define FT_CALLBACK_TABLE_DEF  /* nothing */
+#endif
+#endif /* FT_CALLBACK_TABLE */
+
+
+FT_END_HEADER
+
+
+#endif /* __FTCONFIG_H__ */
+
+
+/* END */
diff --git a/include/freetype/config/ftheader.h b/include/freetype/config/ftheader.h
new file mode 100644 (file)
index 0000000..2a7b8c4
--- /dev/null
@@ -0,0 +1,793 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftheader.h                                                             */
+/*                                                                         */
+/*    Build macros of the FreeType 2 library.                              */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#ifndef __FT_HEADER_H__
+#define __FT_HEADER_H__
+
+
+  /*@***********************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_BEGIN_HEADER                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This macro is used in association with @FT_END_HEADER in header    */
+  /*    files to ensure that the declarations within are properly          */
+  /*    encapsulated in an `extern "C" { .. }' block when included from a  */
+  /*    C++ compiler.                                                      */
+  /*                                                                       */
+#ifdef __cplusplus
+#define FT_BEGIN_HEADER  extern "C" {
+#else
+#define FT_BEGIN_HEADER  /* nothing */
+#endif
+
+
+  /*@***********************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_END_HEADER                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This macro is used in association with @FT_BEGIN_HEADER in header  */
+  /*    files to ensure that the declarations within are properly          */
+  /*    encapsulated in an `extern "C" { .. }' block when included from a  */
+  /*    C++ compiler.                                                      */
+  /*                                                                       */
+#ifdef __cplusplus
+#define FT_END_HEADER  }
+#else
+#define FT_END_HEADER  /* nothing */
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Aliases for the FreeType 2 public and configuration files.            */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    header_file_macros                                                 */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Header File Macros                                                 */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Macro definitions used to #include specific header files.          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The following macros are defined to the name of specific           */
+  /*    FreeType~2 header files.  They can be used directly in #include    */
+  /*    statements as in:                                                  */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      #include FT_FREETYPE_H                                           */
+  /*      #include FT_MULTIPLE_MASTERS_H                                   */
+  /*      #include FT_GLYPH_H                                              */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    There are several reasons why we are now using macros to name      */
+  /*    public header files.  The first one is that such macros are not    */
+  /*    limited to the infamous 8.3~naming rule required by DOS (and       */
+  /*    `FT_MULTIPLE_MASTERS_H' is a lot more meaningful than `ftmm.h').   */
+  /*                                                                       */
+  /*    The second reason is that it allows for more flexibility in the    */
+  /*    way FreeType~2 is installed on a given system.                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* configuration files */
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CONFIG_CONFIG_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing
+   *   FreeType~2 configuration data.
+   *
+   */
+#ifndef FT_CONFIG_CONFIG_H
+#define FT_CONFIG_CONFIG_H  <freetype/config/ftconfig.h>
+#endif
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CONFIG_STANDARD_LIBRARY_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing
+   *   FreeType~2 interface to the standard C library functions.
+   *
+   */
+#ifndef FT_CONFIG_STANDARD_LIBRARY_H
+#define FT_CONFIG_STANDARD_LIBRARY_H  <freetype/config/ftstdlib.h>
+#endif
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CONFIG_OPTIONS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing
+   *   FreeType~2 project-specific configuration options.
+   *
+   */
+#ifndef FT_CONFIG_OPTIONS_H
+#define FT_CONFIG_OPTIONS_H  <freetype/config/ftoption.h>
+#endif
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CONFIG_MODULES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   list of FreeType~2 modules that are statically linked to new library
+   *   instances in @FT_Init_FreeType.
+   *
+   */
+#ifndef FT_CONFIG_MODULES_H
+#define FT_CONFIG_MODULES_H  <freetype/config/ftmodule.h>
+#endif
+
+  /* */
+
+  /* public headers */
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_FREETYPE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   base FreeType~2 API.
+   *
+   */
+#define FT_FREETYPE_H  <freetype/freetype.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_ERRORS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   list of FreeType~2 error codes (and messages).
+   *
+   *   It is included by @FT_FREETYPE_H.
+   *
+   */
+#define FT_ERRORS_H  <freetype/fterrors.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_MODULE_ERRORS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   list of FreeType~2 module error offsets (and messages).
+   *
+   */
+#define FT_MODULE_ERRORS_H  <freetype/ftmoderr.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_SYSTEM_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 interface to low-level operations (i.e., memory management
+   *   and stream i/o).
+   *
+   *   It is included by @FT_FREETYPE_H.
+   *
+   */
+#define FT_SYSTEM_H  <freetype/ftsystem.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_IMAGE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing type
+   *   definitions related to glyph images (i.e., bitmaps, outlines,
+   *   scan-converter parameters).
+   *
+   *   It is included by @FT_FREETYPE_H.
+   *
+   */
+#define FT_IMAGE_H  <freetype/ftimage.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TYPES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   basic data types defined by FreeType~2.
+   *
+   *   It is included by @FT_FREETYPE_H.
+   *
+   */
+#define FT_TYPES_H  <freetype/fttypes.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_LIST_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   list management API of FreeType~2.
+   *
+   *   (Most applications will never need to include this file.)
+   *
+   */
+#define FT_LIST_H  <freetype/ftlist.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_OUTLINE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   scalable outline management API of FreeType~2.
+   *
+   */
+#define FT_OUTLINE_H  <freetype/ftoutln.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_SIZES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   API which manages multiple @FT_Size objects per face.
+   *
+   */
+#define FT_SIZES_H  <freetype/ftsizes.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_MODULE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   module management API of FreeType~2.
+   *
+   */
+#define FT_MODULE_H  <freetype/ftmodapi.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_RENDER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   renderer module management API of FreeType~2.
+   *
+   */
+#define FT_RENDER_H  <freetype/ftrender.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TYPE1_TABLES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   types and API specific to the Type~1 format.
+   *
+   */
+#define FT_TYPE1_TABLES_H  <freetype/t1tables.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TRUETYPE_IDS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   enumeration values which identify name strings, languages, encodings,
+   *   etc.  This file really contains a _large_ set of constant macro
+   *   definitions, taken from the TrueType and OpenType specifications.
+   *
+   */
+#define FT_TRUETYPE_IDS_H  <freetype/ttnameid.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TRUETYPE_TABLES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   types and API specific to the TrueType (as well as OpenType) format.
+   *
+   */
+#define FT_TRUETYPE_TABLES_H  <freetype/tttables.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TRUETYPE_TAGS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of TrueType four-byte `tags' which identify blocks in
+   *   SFNT-based font formats (i.e., TrueType and OpenType).
+   *
+   */
+#define FT_TRUETYPE_TAGS_H  <freetype/tttags.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_BDF_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of an API which accesses BDF-specific strings from a
+   *   face.
+   *
+   */
+#define FT_BDF_H  <freetype/ftbdf.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CID_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of an API which access CID font information from a
+   *   face.
+   *
+   */
+#define FT_CID_H  <freetype/ftcid.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_GZIP_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of an API which supports gzip-compressed files.
+   *
+   */
+#define FT_GZIP_H  <freetype/ftgzip.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_LZW_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of an API which supports LZW-compressed files.
+   *
+   */
+#define FT_LZW_H  <freetype/ftlzw.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_BZIP2_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of an API which supports bzip2-compressed files.
+   *
+   */
+#define FT_BZIP2_H  <freetype/ftbzip2.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_WINFONTS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   definitions of an API which supports Windows FNT files.
+   *
+   */
+#define FT_WINFONTS_H   <freetype/ftwinfnt.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_GLYPH_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   API of the optional glyph management component.
+   *
+   */
+#define FT_GLYPH_H  <freetype/ftglyph.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_BITMAP_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   API of the optional bitmap conversion component.
+   *
+   */
+#define FT_BITMAP_H  <freetype/ftbitmap.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_BBOX_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   API of the optional exact bounding box computation routines.
+   *
+   */
+#define FT_BBOX_H  <freetype/ftbbox.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CACHE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   API of the optional FreeType~2 cache sub-system.
+   *
+   */
+#define FT_CACHE_H  <freetype/ftcache.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CACHE_IMAGE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   `glyph image' API of the FreeType~2 cache sub-system.
+   *
+   *   It is used to define a cache for @FT_Glyph elements.  You can also
+   *   use the API defined in @FT_CACHE_SMALL_BITMAPS_H if you only need to
+   *   store small glyph bitmaps, as it will use less memory.
+   *
+   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all
+   *   glyph image-related cache declarations.
+   *
+   */
+#define FT_CACHE_IMAGE_H  FT_CACHE_H
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CACHE_SMALL_BITMAPS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   `small bitmaps' API of the FreeType~2 cache sub-system.
+   *
+   *   It is used to define a cache for small glyph bitmaps in a relatively
+   *   memory-efficient way.  You can also use the API defined in
+   *   @FT_CACHE_IMAGE_H if you want to cache arbitrary glyph images,
+   *   including scalable outlines.
+   *
+   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all
+   *   small bitmaps-related cache declarations.
+   *
+   */
+#define FT_CACHE_SMALL_BITMAPS_H  FT_CACHE_H
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_CACHE_CHARMAP_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   `charmap' API of the FreeType~2 cache sub-system.
+   *
+   *   This macro is deprecated.  Simply include @FT_CACHE_H to have all
+   *   charmap-based cache declarations.
+   *
+   */
+#define FT_CACHE_CHARMAP_H  FT_CACHE_H
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_MAC_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   Macintosh-specific FreeType~2 API.  The latter is used to access
+   *   fonts embedded in resource forks.
+   *
+   *   This header file must be explicitly included by client applications
+   *   compiled on the Mac (note that the base API still works though).
+   *
+   */
+#define FT_MAC_H  <freetype/ftmac.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_MULTIPLE_MASTERS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   optional multiple-masters management API of FreeType~2.
+   *
+   */
+#define FT_MULTIPLE_MASTERS_H  <freetype/ftmm.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_SFNT_NAMES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   optional FreeType~2 API which accesses embedded `name' strings in
+   *   SFNT-based font formats (i.e., TrueType and OpenType).
+   *
+   */
+#define FT_SFNT_NAMES_H  <freetype/ftsnames.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_OPENTYPE_VALIDATE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   optional FreeType~2 API which validates OpenType tables (BASE, GDEF,
+   *   GPOS, GSUB, JSTF).
+   *
+   */
+#define FT_OPENTYPE_VALIDATE_H  <freetype/ftotval.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_GX_VALIDATE_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   optional FreeType~2 API which validates TrueTypeGX/AAT tables (feat,
+   *   mort, morx, bsln, just, kern, opbd, trak, prop).
+   *
+   */
+#define FT_GX_VALIDATE_H  <freetype/ftgxval.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_PFR_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which accesses PFR-specific data.
+   *
+   */
+#define FT_PFR_H  <freetype/ftpfr.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_STROKER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which provides functions to stroke outline paths.
+   */
+#define FT_STROKER_H  <freetype/ftstroke.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_SYNTHESIS_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which performs artificial obliquing and emboldening.
+   */
+#define FT_SYNTHESIS_H  <freetype/ftsynth.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_XFREE86_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which provides functions specific to the XFree86 and
+   *   X.Org X11 servers.
+   */
+#define FT_XFREE86_H  <freetype/ftxf86.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_TRIGONOMETRY_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which performs trigonometric computations (e.g.,
+   *   cosines and arc tangents).
+   */
+#define FT_TRIGONOMETRY_H  <freetype/fttrigon.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_LCD_FILTER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which performs color filtering for subpixel rendering.
+   */
+#define FT_LCD_FILTER_H  <freetype/ftlcdfil.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_UNPATENTED_HINTING_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which performs color filtering for subpixel rendering.
+   */
+#define FT_UNPATENTED_HINTING_H  <freetype/ttunpat.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_INCREMENTAL_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which performs color filtering for subpixel rendering.
+   */
+#define FT_INCREMENTAL_H  <freetype/ftincrem.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_GASP_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which returns entries from the TrueType GASP table.
+   */
+#define FT_GASP_H  <freetype/ftgasp.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_ADVANCES_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing the
+   *   FreeType~2 API which returns individual and ranged glyph advances.
+   */
+#define FT_ADVANCES_H  <freetype/ftadvanc.h>
+
+
+  /* */
+
+#define FT_ERROR_DEFINITIONS_H  <freetype/fterrdef.h>
+
+
+  /* The internals of the cache sub-system are no longer exposed.  We */
+  /* default to FT_CACHE_H at the moment just in case, but we know of */
+  /* no rogue client that uses them.                                  */
+  /*                                                                  */
+#define FT_CACHE_MANAGER_H           <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_MRU_H      <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_MANAGER_H  <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_CACHE_H    <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_GLYPH_H    <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_IMAGE_H    <freetype/ftcache.h>
+#define FT_CACHE_INTERNAL_SBITS_H    <freetype/ftcache.h>
+
+
+#define FT_INCREMENTAL_H          <freetype/ftincrem.h>
+
+#define FT_TRUETYPE_UNPATENTED_H  <freetype/ttunpat.h>
+
+
+  /*
+   * Include internal headers definitions from <freetype/internal/...>
+   * only when building the library.
+   */
+#ifdef FT2_BUILD_LIBRARY
+#define  FT_INTERNAL_INTERNAL_H  <freetype/internal/internal.h>
+#include FT_INTERNAL_INTERNAL_H
+#endif /* FT2_BUILD_LIBRARY */
+
+
+#endif /* __FT2_BUILD_H__ */
+
+
+/* END */
diff --git a/include/freetype/config/ftmodule.h b/include/freetype/config/ftmodule.h
new file mode 100644 (file)
index 0000000..76d271a
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ *  This file registers the FreeType modules compiled into the library.
+ *
+ *  If you use GNU make, this file IS NOT USED!  Instead, it is created in
+ *  the objects directory (normally `<topdir>/objs/') based on information
+ *  from `<topdir>/modules.cfg'.
+ *
+ *  Please read `docs/INSTALL.ANY' and `docs/CUSTOMIZE' how to compile
+ *  FreeType without GNU make.
+ *
+ */
+
+FT_USE_MODULE( FT_Module_Class, autofit_module_class )
+FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class )
+FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class )
+FT_USE_MODULE( FT_Module_Class, psaux_module_class )
+FT_USE_MODULE( FT_Module_Class, psnames_module_class )
+FT_USE_MODULE( FT_Module_Class, pshinter_module_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class )
+FT_USE_MODULE( FT_Module_Class, sfnt_module_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class )
+FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class )
+FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class )
+
+/* EOF */
diff --git a/include/freetype/config/ftoption.h b/include/freetype/config/ftoption.h
new file mode 100644 (file)
index 0000000..041e24a
--- /dev/null
@@ -0,0 +1,805 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftoption.h                                                             */
+/*                                                                         */
+/*    User-selectable configuration macros (specification only).           */
+/*                                                                         */
+/*  Copyright 1996-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTOPTION_H__
+#define __FTOPTION_H__
+
+
+#include <ft2build.h>
+
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                 USER-SELECTABLE CONFIGURATION MACROS                  */
+  /*                                                                       */
+  /* This file contains the default configuration macro definitions for    */
+  /* a standard build of the FreeType library.  There are three ways to    */
+  /* use this file to build project-specific versions of the library:      */
+  /*                                                                       */
+  /*  - You can modify this file by hand, but this is not recommended in   */
+  /*    cases where you would like to build several versions of the        */
+  /*    library from a single source directory.                            */
+  /*                                                                       */
+  /*  - You can put a copy of this file in your build directory, more      */
+  /*    precisely in `$BUILD/freetype/config/ftoption.h', where `$BUILD'   */
+  /*    is the name of a directory that is included _before_ the FreeType  */
+  /*    include path during compilation.                                   */
+  /*                                                                       */
+  /*    The default FreeType Makefiles and Jamfiles use the build          */
+  /*    directory `builds/<system>' by default, but you can easily change  */
+  /*    that for your own projects.                                        */
+  /*                                                                       */
+  /*  - Copy the file <ft2build.h> to `$BUILD/ft2build.h' and modify it    */
+  /*    slightly to pre-define the macro FT_CONFIG_OPTIONS_H used to       */
+  /*    locate this file during the build.  For example,                   */
+  /*                                                                       */
+  /*      #define FT_CONFIG_OPTIONS_H  <myftoptions.h>                     */
+  /*      #include <freetype/config/ftheader.h>                            */
+  /*                                                                       */
+  /*    will use `$BUILD/myftoptions.h' instead of this file for macro     */
+  /*    definitions.                                                       */
+  /*                                                                       */
+  /*    Note also that you can similarly pre-define the macro              */
+  /*    FT_CONFIG_MODULES_H used to locate the file listing of the modules */
+  /*    that are statically linked to the library at compile time.  By     */
+  /*    default, this file is <freetype/config/ftmodule.h>.                */
+  /*                                                                       */
+  /*  We highly recommend using the third method whenever possible.        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /**** G E N E R A L   F R E E T Y P E   2   C O N F I G U R A T I O N ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Uncomment the line below if you want to activate sub-pixel rendering  */
+  /* (a.k.a. LCD rendering, or ClearType) in this build of the library.    */
+  /*                                                                       */
+  /* Note that this feature is covered by several Microsoft patents        */
+  /* and should not be activated in any default build of the library.      */
+  /*                                                                       */
+  /* This macro has no impact on the FreeType API, only on its             */
+  /* _implementation_.  For example, using FT_RENDER_MODE_LCD when calling */
+  /* FT_Render_Glyph still generates a bitmap that is 3 times wider than   */
+  /* the original size in case this macro isn't defined; however, each     */
+  /* triplet of subpixels has R=G=B.                                       */
+  /*                                                                       */
+  /* This is done to allow FreeType clients to run unmodified, forcing     */
+  /* them to display normal gray-level anti-aliased glyphs.                */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Many compilers provide a non-ANSI 64-bit data type that can be used   */
+  /* by FreeType to speed up some computations.  However, this will create */
+  /* some problems when compiling the library in strict ANSI mode.         */
+  /*                                                                       */
+  /* For this reason, the use of 64-bit integers is normally disabled when */
+  /* the __STDC__ macro is defined.  You can however disable this by       */
+  /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here.                 */
+  /*                                                                       */
+  /* For most compilers, this will only create compilation warnings when   */
+  /* building the library.                                                 */
+  /*                                                                       */
+  /* ObNote: The compiler-specific 64-bit integers are detected in the     */
+  /*         file `ftconfig.h' either statically or through the            */
+  /*         `configure' script on supported platforms.                    */
+  /*                                                                       */
+#undef FT_CONFIG_OPTION_FORCE_INT64
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* If this macro is defined, do not try to use an assembler version of   */
+  /* performance-critical functions (e.g. FT_MulFix).  You should only do  */
+  /* that to verify that the assembler function works properly, or to      */
+  /* execute benchmark tests of the various implementations.               */
+/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* If this macro is defined, try to use an inlined assembler version of  */
+  /* the `FT_MulFix' function, which is a `hotspot' when loading and       */
+  /* hinting glyphs, and which should be executed as fast as possible.     */
+  /*                                                                       */
+  /* Note that if your compiler or CPU is not supported, this will default */
+  /* to the standard and portable implementation found in `ftcalc.c'.      */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_INLINE_MULFIX
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* LZW-compressed file support.                                          */
+  /*                                                                       */
+  /*   FreeType now handles font files that have been compressed with the  */
+  /*   `compress' program.  This is mostly used to parse many of the PCF   */
+  /*   files that come with various X11 distributions.  The implementation */
+  /*   uses NetBSD's `zopen' to partially uncompress the file on the fly   */
+  /*   (see src/lzw/ftgzip.c).                                             */
+  /*                                                                       */
+  /*   Define this macro if you want to enable this `feature'.             */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_USE_LZW
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Gzip-compressed file support.                                         */
+  /*                                                                       */
+  /*   FreeType now handles font files that have been compressed with the  */
+  /*   `gzip' program.  This is mostly used to parse many of the PCF files */
+  /*   that come with XFree86.  The implementation uses `zlib' to          */
+  /*   partially uncompress the file on the fly (see src/gzip/ftgzip.c).   */
+  /*                                                                       */
+  /*   Define this macro if you want to enable this `feature'.  See also   */
+  /*   the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below.                       */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_USE_ZLIB
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ZLib library selection                                                */
+  /*                                                                       */
+  /*   This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined.  */
+  /*   It allows FreeType's `ftgzip' component to link to the system's     */
+  /*   installation of the ZLib library.  This is useful on systems like   */
+  /*   Unix or VMS where it generally is already available.                */
+  /*                                                                       */
+  /*   If you let it undefined, the component will use its own copy        */
+  /*   of the zlib sources instead.  These have been modified to be        */
+  /*   included directly within the component and *not* export external    */
+  /*   function names.  This allows you to link any program with FreeType  */
+  /*   _and_ ZLib without linking conflicts.                               */
+  /*                                                                       */
+  /*   Do not #undef this macro here since the build system might define   */
+  /*   it for certain configurations only.                                 */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Bzip2-compressed file support.                                        */
+  /*                                                                       */
+  /*   FreeType now handles font files that have been compressed with the  */
+  /*   `bzip2' program.  This is mostly used to parse many of the PCF      */
+  /*   files that come with XFree86.  The implementation uses `libbz2' to  */
+  /*   partially uncompress the file on the fly (see src/bzip2/ftbzip2.c). */
+  /*   Contrary to gzip, bzip2 currently is not included and need to use   */
+  /*   the system available bzip2 implementation.                          */
+  /*                                                                       */
+  /*   Define this macro if you want to enable this `feature'.             */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_USE_BZIP2 */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define to disable the use of file stream functions and types, FILE,   */
+  /* fopen() etc.  Enables the use of smaller system libraries on embedded */
+  /* systems that have multiple system libraries, some with or without     */
+  /* file stream support, in the cases where file stream support is not    */
+  /* necessary such as memory loading of font files.                       */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* DLL export compilation                                                */
+  /*                                                                       */
+  /*   When compiling FreeType as a DLL, some systems/compilers need a     */
+  /*   special keyword in front OR after the return type of function       */
+  /*   declarations.                                                       */
+  /*                                                                       */
+  /*   Two macros are used within the FreeType source code to define       */
+  /*   exported library functions: FT_EXPORT and FT_EXPORT_DEF.            */
+  /*                                                                       */
+  /*     FT_EXPORT( return_type )                                          */
+  /*                                                                       */
+  /*       is used in a function declaration, as in                        */
+  /*                                                                       */
+  /*         FT_EXPORT( FT_Error )                                         */
+  /*         FT_Init_FreeType( FT_Library*  alibrary );                    */
+  /*                                                                       */
+  /*                                                                       */
+  /*     FT_EXPORT_DEF( return_type )                                      */
+  /*                                                                       */
+  /*       is used in a function definition, as in                         */
+  /*                                                                       */
+  /*         FT_EXPORT_DEF( FT_Error )                                     */
+  /*         FT_Init_FreeType( FT_Library*  alibrary )                     */
+  /*         {                                                             */
+  /*           ... some code ...                                           */
+  /*           return FT_Err_Ok;                                           */
+  /*         }                                                             */
+  /*                                                                       */
+  /*   You can provide your own implementation of FT_EXPORT and            */
+  /*   FT_EXPORT_DEF here if you want.  If you leave them undefined, they  */
+  /*   will be later automatically defined as `extern return_type' to      */
+  /*   allow normal compilation.                                           */
+  /*                                                                       */
+  /*   Do not #undef these macros here since the build system might define */
+  /*   them for certain configurations only.                               */
+  /*                                                                       */
+/* #define FT_EXPORT(x)      extern x */
+/* #define FT_EXPORT_DEF(x)  x */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Glyph Postscript Names handling                                       */
+  /*                                                                       */
+  /*   By default, FreeType 2 is compiled with the `psnames' module.  This */
+  /*   module is in charge of converting a glyph name string into a        */
+  /*   Unicode value, or return a Macintosh standard glyph name for the    */
+  /*   use with the TrueType `post' table.                                 */
+  /*                                                                       */
+  /*   Undefine this macro if you do not want `psnames' compiled in your   */
+  /*   build of FreeType.  This has the following effects:                 */
+  /*                                                                       */
+  /*   - The TrueType driver will provide its own set of glyph names,      */
+  /*     if you build it to support postscript names in the TrueType       */
+  /*     `post' table.                                                     */
+  /*                                                                       */
+  /*   - The Type 1 driver will not be able to synthesize a Unicode        */
+  /*     charmap out of the glyphs found in the fonts.                     */
+  /*                                                                       */
+  /*   You would normally undefine this configuration macro when building  */
+  /*   a version of FreeType that doesn't contain a Type 1 or CFF driver.  */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Postscript Names to Unicode Values support                            */
+  /*                                                                       */
+  /*   By default, FreeType 2 is built with the `PSNames' module compiled  */
+  /*   in.  Among other things, the module is used to convert a glyph name */
+  /*   into a Unicode value.  This is especially useful in order to        */
+  /*   synthesize on the fly a Unicode charmap from the CFF/Type 1 driver  */
+  /*   through a big table named the `Adobe Glyph List' (AGL).             */
+  /*                                                                       */
+  /*   Undefine this macro if you do not want the Adobe Glyph List         */
+  /*   compiled in your `PSNames' module.  The Type 1 driver will not be   */
+  /*   able to synthesize a Unicode charmap out of the glyphs found in the */
+  /*   fonts.                                                              */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Support for Mac fonts                                                 */
+  /*                                                                       */
+  /*   Define this macro if you want support for outline fonts in Mac      */
+  /*   format (mac dfont, mac resource, macbinary containing a mac         */
+  /*   resource) on non-Mac platforms.                                     */
+  /*                                                                       */
+  /*   Note that the `FOND' resource isn't checked.                        */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_MAC_FONTS
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Guessing methods to access embedded resource forks                    */
+  /*                                                                       */
+  /*   Enable extra Mac fonts support on non-Mac platforms (e.g.           */
+  /*   GNU/Linux).                                                         */
+  /*                                                                       */
+  /*   Resource forks which include fonts data are stored sometimes in     */
+  /*   locations which users or developers don't expected.  In some cases, */
+  /*   resource forks start with some offset from the head of a file.  In  */
+  /*   other cases, the actual resource fork is stored in file different   */
+  /*   from what the user specifies.  If this option is activated,         */
+  /*   FreeType tries to guess whether such offsets or different file      */
+  /*   names must be used.                                                 */
+  /*                                                                       */
+  /*   Note that normal, direct access of resource forks is controlled via */
+  /*   the FT_CONFIG_OPTION_MAC_FONTS option.                              */
+  /*                                                                       */
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Allow the use of FT_Incremental_Interface to load typefaces that      */
+  /* contain no glyph data, but supply it via a callback function.         */
+  /* This is required by clients supporting document formats which         */
+  /* supply font data incrementally as the document is parsed, such        */
+  /* as the Ghostscript interpreter for the PostScript language.           */
+  /*                                                                       */
+#define FT_CONFIG_OPTION_INCREMENTAL
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The size in bytes of the render pool used by the scan-line converter  */
+  /* to do all of its work.                                                */
+  /*                                                                       */
+  /* This must be greater than 4KByte if you use FreeType to rasterize     */
+  /* glyphs; otherwise, you may set it to zero to avoid unnecessary        */
+  /* allocation of the render pool.                                        */
+  /*                                                                       */
+#define FT_RENDER_POOL_SIZE  16384L
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FT_MAX_MODULES                                                        */
+  /*                                                                       */
+  /*   The maximum number of modules that can be registered in a single    */
+  /*   FreeType library object.  32 is the default.                        */
+  /*                                                                       */
+#define FT_MAX_MODULES  32
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Debug level                                                           */
+  /*                                                                       */
+  /*   FreeType can be compiled in debug or trace mode.  In debug mode,    */
+  /*   errors are reported through the `ftdebug' component.  In trace      */
+  /*   mode, additional messages are sent to the standard output during    */
+  /*   execution.                                                          */
+  /*                                                                       */
+  /*   Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode.     */
+  /*   Define FT_DEBUG_LEVEL_TRACE to build it in trace mode.              */
+  /*                                                                       */
+  /*   Don't define any of these macros to compile in `release' mode!      */
+  /*                                                                       */
+  /*   Do not #undef these macros here since the build system might define */
+  /*   them for certain configurations only.                               */
+  /*                                                                       */
+/* #define FT_DEBUG_LEVEL_ERROR */
+/* #define FT_DEBUG_LEVEL_TRACE */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Autofitter debugging                                                  */
+  /*                                                                       */
+  /*   If FT_DEBUG_AUTOFIT is defined, FreeType provides some means to     */
+  /*   control the autofitter behaviour for debugging purposes with global */
+  /*   boolean variables (consequently, you should *never* enable this     */
+  /*   while compiling in `release' mode):                                 */
+  /*                                                                       */
+  /*     _af_debug_disable_horz_hints                                      */
+  /*     _af_debug_disable_vert_hints                                      */
+  /*     _af_debug_disable_blue_hints                                      */
+  /*                                                                       */
+  /*   Additionally, the following functions provide dumps of various      */
+  /*   internal autofit structures to stdout (using `printf'):             */
+  /*                                                                       */
+  /*     af_glyph_hints_dump_points                                        */
+  /*     af_glyph_hints_dump_segments                                      */
+  /*     af_glyph_hints_dump_edges                                         */
+  /*                                                                       */
+  /*   As an argument, they use another global variable:                   */
+  /*                                                                       */
+  /*     _af_debug_hints                                                   */
+  /*                                                                       */
+  /*   Please have a look at the `ftgrid' demo program to see how those    */
+  /*   variables and macros should be used.                                */
+  /*                                                                       */
+  /*   Do not #undef these macros here since the build system might define */
+  /*   them for certain configurations only.                               */
+  /*                                                                       */
+/* #define FT_DEBUG_AUTOFIT */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Memory Debugging                                                      */
+  /*                                                                       */
+  /*   FreeType now comes with an integrated memory debugger that is       */
+  /*   capable of detecting simple errors like memory leaks or double      */
+  /*   deletes.  To compile it within your build of the library, you       */
+  /*   should define FT_DEBUG_MEMORY here.                                 */
+  /*                                                                       */
+  /*   Note that the memory debugger is only activated at runtime when     */
+  /*   when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */
+  /*                                                                       */
+  /*   Do not #undef this macro here since the build system might define   */
+  /*   it for certain configurations only.                                 */
+  /*                                                                       */
+/* #define FT_DEBUG_MEMORY */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Module errors                                                         */
+  /*                                                                       */
+  /*   If this macro is set (which is _not_ the default), the higher byte  */
+  /*   of an error code gives the module in which the error has occurred,  */
+  /*   while the lower byte is the real error code.                        */
+  /*                                                                       */
+  /*   Setting this macro makes sense for debugging purposes only, since   */
+  /*   it would break source compatibility of certain programs that use    */
+  /*   FreeType 2.                                                         */
+  /*                                                                       */
+  /*   More details can be found in the files ftmoderr.h and fterrors.h.   */
+  /*                                                                       */
+#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Position Independent Code                                             */
+  /*                                                                       */
+  /*   If this macro is set (which is _not_ the default), FreeType2 will   */
+  /*   avoid creating constants that require address fixups.  Instead the  */
+  /*   constants will be moved into a struct and additional intialization  */
+  /*   code will be used.                                                  */
+  /*                                                                       */
+  /*   Setting this macro is needed for systems that prohibit address      */
+  /*   fixups, such as BREW.                                               */
+  /*                                                                       */
+/* #define FT_CONFIG_OPTION_PIC */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****        S F N T   D R I V E R    C O N F I G U R A T I O N       ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support       */
+  /* embedded bitmaps in all formats using the SFNT module (namely         */
+  /* TrueType & OpenType).                                                 */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to    */
+  /* load and enumerate the glyph Postscript names in a TrueType or        */
+  /* OpenType file.                                                        */
+  /*                                                                       */
+  /* Note that when you do not compile the `PSNames' module by undefining  */
+  /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will   */
+  /* contain additional code used to read the PS Names table from a font.  */
+  /*                                                                       */
+  /* (By default, the module uses `PSNames' to extract glyph names.)       */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to       */
+  /* access the internal name table in a SFNT-based format like TrueType   */
+  /* or OpenType.  The name table contains various strings used to         */
+  /* describe the font, like family name, copyright, version, etc.  It     */
+  /* does not contain any glyph name though.                               */
+  /*                                                                       */
+  /* Accessing SFNT names is done through the functions declared in        */
+  /* `freetype/ftsnames.h'.                                                */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_SFNT_NAMES
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TrueType CMap support                                                 */
+  /*                                                                       */
+  /*   Here you can fine-tune which TrueType CMap table format shall be    */
+  /*   supported.                                                          */
+#define TT_CONFIG_CMAP_FORMAT_0
+#define TT_CONFIG_CMAP_FORMAT_2
+#define TT_CONFIG_CMAP_FORMAT_4
+#define TT_CONFIG_CMAP_FORMAT_6
+#define TT_CONFIG_CMAP_FORMAT_8
+#define TT_CONFIG_CMAP_FORMAT_10
+#define TT_CONFIG_CMAP_FORMAT_12
+#define TT_CONFIG_CMAP_FORMAT_13
+#define TT_CONFIG_CMAP_FORMAT_14
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****    T R U E T Y P E   D R I V E R    C O N F I G U R A T I O N   ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile   */
+  /* a bytecode interpreter in the TrueType driver.                        */
+  /*                                                                       */
+  /* By undefining this, you will only compile the code necessary to load  */
+  /* TrueType glyphs without hinting.                                      */
+  /*                                                                       */
+  /*   Do not #undef this macro here, since the build system might         */
+  /*   define it for certain configurations only.                          */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* If you define TT_CONFIG_OPTION_UNPATENTED_HINTING, a special version  */
+  /* of the TrueType bytecode interpreter is used that doesn't implement   */
+  /* any of the patented opcodes and algorithms.  The patents related to   */
+  /* TrueType hinting have expired worldwide since May 2010; this option   */
+  /* is now deprecated.                                                    */
+  /*                                                                       */
+  /* Note that the TT_CONFIG_OPTION_UNPATENTED_HINTING macro is *ignored*  */
+  /* if you define TT_CONFIG_OPTION_BYTECODE_INTERPRETER; in other words,  */
+  /* either define TT_CONFIG_OPTION_BYTECODE_INTERPRETER or                */
+  /* TT_CONFIG_OPTION_UNPATENTED_HINTING but not both at the same time.    */
+  /*                                                                       */
+  /* This macro is only useful for a small number of font files (mostly    */
+  /* for Asian scripts) that require bytecode interpretation to properly   */
+  /* load glyphs.  For all other fonts, this produces unpleasant results,  */
+  /* thus the unpatented interpreter is never used to load glyphs from     */
+  /* TrueType fonts unless one of the following two options is used.       */
+  /*                                                                       */
+  /*   - The unpatented interpreter is explicitly activated by the user    */
+  /*     through the FT_PARAM_TAG_UNPATENTED_HINTING parameter tag         */
+  /*     when opening the FT_Face.                                         */
+  /*                                                                       */
+  /*   - FreeType detects that the FT_Face corresponds to one of the       */
+  /*     `trick' fonts (e.g., `Mingliu') it knows about.  The font engine  */
+  /*     contains a hard-coded list of font names and other matching       */
+  /*     parameters (see function `tt_face_init' in file                   */
+  /*     `src/truetype/ttobjs.c').                                         */
+  /*                                                                       */
+  /* Here a sample code snippet for using FT_PARAM_TAG_UNPATENTED_HINTING. */
+  /*                                                                       */
+  /*   {                                                                   */
+  /*     FT_Parameter  parameter;                                          */
+  /*     FT_Open_Args  open_args;                                          */
+  /*                                                                       */
+  /*                                                                       */
+  /*     parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING;                  */
+  /*                                                                       */
+  /*     open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;         */
+  /*     open_args.pathname   = my_font_pathname;                          */
+  /*     open_args.num_params = 1;                                         */
+  /*     open_args.params     = &parameter;                                */
+  /*                                                                       */
+  /*     error = FT_Open_Face( library, &open_args, index, &face );        */
+  /*     ...                                                               */
+  /*   }                                                                   */
+  /*                                                                       */
+/* #define TT_CONFIG_OPTION_UNPATENTED_HINTING */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_INTERPRETER_SWITCH to compile the TrueType    */
+  /* bytecode interpreter with a huge switch statement, rather than a call */
+  /* table.  This results in smaller and faster code for a number of       */
+  /* architectures.                                                        */
+  /*                                                                       */
+  /* Note however that on some compiler/processor combinations, undefining */
+  /* this macro will generate faster, though larger, code.                 */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the        */
+  /* TrueType glyph loader to use Apple's definition of how to handle      */
+  /* component offsets in composite glyphs.                                */
+  /*                                                                       */
+  /* Apple and MS disagree on the default behavior of component offsets    */
+  /* in composites.  Apple says that they should be scaled by the scaling  */
+  /* factors in the transformation matrix (roughly, it's more complex)     */
+  /* while MS says they should not.  OpenType defines two bits in the      */
+  /* composite flags array which can be used to disambiguate, but old      */
+  /* fonts will not have them.                                             */
+  /*                                                                       */
+  /*   http://www.microsoft.com/typography/otspec/glyf.htm                 */
+  /*   http://fonts.apple.com/TTRefMan/RM06/Chap6glyf.html                 */
+  /*                                                                       */
+#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include         */
+  /* support for Apple's distortable font technology (fvar, gvar, cvar,    */
+  /* and avar tables).  This has many similarities to Type 1 Multiple      */
+  /* Masters support.                                                      */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define TT_CONFIG_OPTION_BDF if you want to include support for        */
+  /* an embedded `BDF ' table within SFNT-based bitmap formats.            */
+  /*                                                                       */
+#define TT_CONFIG_OPTION_BDF
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****      T Y P E 1   D R I V E R    C O N F I G U R A T I O N       ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* T1_MAX_DICT_DEPTH is the maximal depth of nest dictionaries and       */
+  /* arrays in the Type 1 stream (see t1load.c).  A minimum of 4 is        */
+  /* required.                                                             */
+  /*                                                                       */
+#define T1_MAX_DICT_DEPTH  5
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine   */
+  /* calls during glyph loading.                                           */
+  /*                                                                       */
+#define T1_MAX_SUBRS_CALLS  16
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A     */
+  /* minimum of 16 is required.                                            */
+  /*                                                                       */
+  /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */
+  /*                                                                       */
+#define T1_MAX_CHARSTRINGS_OPERANDS  256
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define this configuration macro if you want to prevent the            */
+  /* compilation of `t1afm', which is in charge of reading Type 1 AFM      */
+  /* files into an existing face.  Note that if set, the T1 driver will be */
+  /* unable to produce kerning distances.                                  */
+  /*                                                                       */
+#undef T1_CONFIG_OPTION_NO_AFM
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define this configuration macro if you want to prevent the            */
+  /* compilation of the Multiple Masters font support in the Type 1        */
+  /* driver.                                                               */
+  /*                                                                       */
+#undef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****    A U T O F I T   M O D U L E    C O N F I G U R A T I O N     ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Compile autofit module with CJK (Chinese, Japanese, Korean) script    */
+  /* support.                                                              */
+  /*                                                                       */
+#define AF_CONFIG_OPTION_CJK
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Compile autofit module with Indic script support.                     */
+  /*                                                                       */
+#define AF_CONFIG_OPTION_INDIC
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Compile autofit module with warp hinting.  The idea of the warping    */
+  /* code is to slightly scale and shift a glyph within a single dimension */
+  /* so that as much of its segments are aligned (more or less) on the     */
+  /* grid.  To find out the optimal scaling and shifting value, various    */
+  /* parameter combinations are tried and scored.                          */
+  /*                                                                       */
+  /* This experimental option is only active if the render mode is         */
+  /* FT_RENDER_MODE_LIGHT.                                                 */
+  /*                                                                       */
+/* #define AF_CONFIG_OPTION_USE_WARPER */
+
+  /* */
+
+
+  /*
+   * Define this variable if you want to keep the layout of internal
+   * structures that was used prior to FreeType 2.2.  This also compiles in
+   * a few obsolete functions to avoid linking problems on typical Unix
+   * distributions.
+   *
+   * For embedded systems or building a new distribution from scratch, it
+   * is recommended to disable the macro since it reduces the library's code
+   * size and activates a few memory-saving optimizations as well.
+   */
+#define FT_CONFIG_OPTION_OLD_INTERNALS
+
+
+  /*
+   *  To detect legacy cache-lookup call from a rogue client (<= 2.1.7),
+   *  we restrict the number of charmaps in a font.  The current API of
+   *  FTC_CMapCache_Lookup() takes cmap_index & charcode, but old API
+   *  takes charcode only.  To determine the passed value is for cmap_index
+   *  or charcode, the possible cmap_index is restricted not to exceed
+   *  the minimum possible charcode by a rogue client.  It is also very
+   *  unlikely that a rogue client is interested in Unicode values 0 to 15.
+   *
+   *  NOTE: The original threshold was 4 deduced from popular number of
+   *        cmap subtables in UCS-4 TrueType fonts, but now it is not
+   *        irregular for OpenType fonts to have more than 4 subtables,
+   *        because variation selector subtables are available for Apple
+   *        and Microsoft platforms.
+   */
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+#define FT_MAX_CHARMAP_CACHEABLE 15
+#endif
+
+
+  /*
+   * This macro is defined if either unpatented or native TrueType
+   * hinting is requested by the definitions above.
+   */
+#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+#define  TT_USE_BYTECODE_INTERPRETER
+#undef   TT_CONFIG_OPTION_UNPATENTED_HINTING
+#elif defined TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define  TT_USE_BYTECODE_INTERPRETER
+#endif
+
+FT_END_HEADER
+
+
+#endif /* __FTOPTION_H__ */
+
+
+/* END */
diff --git a/include/freetype/config/ftstdlib.h b/include/freetype/config/ftstdlib.h
new file mode 100644 (file)
index 0000000..11d5d0e
--- /dev/null
@@ -0,0 +1,174 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftstdlib.h                                                             */
+/*                                                                         */
+/*    ANSI-specific library and header configuration file (specification   */
+/*    only).                                                               */
+/*                                                                         */
+/*  Copyright 2002-2007, 2009, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to group all #includes to the ANSI C library that   */
+  /* FreeType normally requires.  It also defines macros to rename the     */
+  /* standard functions within the FreeType source code.                   */
+  /*                                                                       */
+  /* Load a file which defines __FTSTDLIB_H__ before this one to override  */
+  /* it.                                                                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTSTDLIB_H__
+#define __FTSTDLIB_H__
+
+
+#include <stddef.h>
+
+#define ft_ptrdiff_t  ptrdiff_t
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                           integer limits                           */
+  /*                                                                    */
+  /* UINT_MAX and ULONG_MAX are used to automatically compute the size  */
+  /* of `int' and `long' in bytes at compile-time.  So far, this works  */
+  /* for all platforms the library has been tested on.                  */
+  /*                                                                    */
+  /* Note that on the extremely rare platforms that do not provide      */
+  /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some    */
+  /* old Crays where `int' is 36 bits), we do not make any guarantee    */
+  /* about the correct behaviour of FT2 with all fonts.                 */
+  /*                                                                    */
+  /* In these case, `ftconfig.h' will refuse to compile anyway with a   */
+  /* message like `couldn't find 32-bit type' or something similar.     */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+#include <limits.h>
+
+#define FT_CHAR_BIT    CHAR_BIT
+#define FT_USHORT_MAX  USHRT_MAX
+#define FT_INT_MAX     INT_MAX
+#define FT_INT_MIN     INT_MIN
+#define FT_UINT_MAX    UINT_MAX
+#define FT_ULONG_MAX   ULONG_MAX
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                 character and string processing                    */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+#include <string.h>
+
+#define ft_memchr   memchr
+#define ft_memcmp   memcmp
+#define ft_memcpy   memcpy
+#define ft_memmove  memmove
+#define ft_memset   memset
+#define ft_strcat   strcat
+#define ft_strcmp   strcmp
+#define ft_strcpy   strcpy
+#define ft_strlen   strlen
+#define ft_strncmp  strncmp
+#define ft_strncpy  strncpy
+#define ft_strrchr  strrchr
+#define ft_strstr   strstr
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                           file handling                            */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+#include <stdio.h>
+
+#define FT_FILE     FILE
+#define ft_fclose   fclose
+#define ft_fopen    fopen
+#define ft_fread    fread
+#define ft_fseek    fseek
+#define ft_ftell    ftell
+#define ft_sprintf  sprintf
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                             sorting                                */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+#include <stdlib.h>
+
+#define ft_qsort  qsort
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                        memory allocation                           */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+#define ft_scalloc   calloc
+#define ft_sfree     free
+#define ft_smalloc   malloc
+#define ft_srealloc  realloc
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                          miscellaneous                             */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+#define ft_atol   atol
+#define ft_labs   labs
+
+
+  /**********************************************************************/
+  /*                                                                    */
+  /*                         execution control                          */
+  /*                                                                    */
+  /**********************************************************************/
+
+
+#include <setjmp.h>
+
+#define ft_jmp_buf     jmp_buf  /* note: this cannot be a typedef since */
+                                /*       jmp_buf is defined as a macro  */
+                                /*       on certain platforms           */
+
+#define ft_longjmp     longjmp
+#define ft_setjmp( b ) setjmp( *(jmp_buf*) &(b) )    /* same thing here */
+
+
+  /* the following is only used for debugging purposes, i.e., if */
+  /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined    */
+
+#include <stdarg.h>
+
+
+#endif /* __FTSTDLIB_H__ */
+
+
+/* END */
diff --git a/include/freetype/freetype.h b/include/freetype/freetype.h
new file mode 100644 (file)
index 0000000..63c291a
--- /dev/null
@@ -0,0 +1,3945 @@
+/***************************************************************************/
+/*                                                                         */
+/*  freetype.h                                                             */
+/*                                                                         */
+/*    FreeType high-level API and common types (specification only).       */
+/*                                                                         */
+/*  Copyright 1996-2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef FT_FREETYPE_H
+#error "`ft2build.h' hasn't been included yet!"
+#error "Please always use macros to include FreeType header files."
+#error "Example:"
+#error "  #include <ft2build.h>"
+#error "  #include FT_FREETYPE_H"
+#endif
+
+
+#ifndef __FREETYPE_H__
+#define __FREETYPE_H__
+
+
+#include <ft2build.h>
+#include FT_CONFIG_CONFIG_H
+#include FT_ERRORS_H
+#include FT_TYPES_H
+
+
+FT_BEGIN_HEADER
+
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    user_allocation                                                    */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    User allocation                                                    */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    How client applications should allocate FreeType data structures.  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    FreeType assumes that structures allocated by the user and passed  */
+  /*    as arguments are zeroed out except for the actual data.  In other  */
+  /*    words, it is recommended to use `calloc' (or variants of it)       */
+  /*    instead of `malloc' for allocation.                                */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*                                                                       */
+  /*                        B A S I C   T Y P E S                          */
+  /*                                                                       */
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    base_interface                                                     */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Base Interface                                                     */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    The FreeType~2 base font interface.                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section describes the public high-level API of FreeType~2.    */
+  /*                                                                       */
+  /* <Order>                                                               */
+  /*    FT_Library                                                         */
+  /*    FT_Face                                                            */
+  /*    FT_Size                                                            */
+  /*    FT_GlyphSlot                                                       */
+  /*    FT_CharMap                                                         */
+  /*    FT_Encoding                                                        */
+  /*                                                                       */
+  /*    FT_FaceRec                                                         */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_SCALABLE                                              */
+  /*    FT_FACE_FLAG_FIXED_SIZES                                           */
+  /*    FT_FACE_FLAG_FIXED_WIDTH                                           */
+  /*    FT_FACE_FLAG_HORIZONTAL                                            */
+  /*    FT_FACE_FLAG_VERTICAL                                              */
+  /*    FT_FACE_FLAG_SFNT                                                  */
+  /*    FT_FACE_FLAG_KERNING                                               */
+  /*    FT_FACE_FLAG_MULTIPLE_MASTERS                                      */
+  /*    FT_FACE_FLAG_GLYPH_NAMES                                           */
+  /*    FT_FACE_FLAG_EXTERNAL_STREAM                                       */
+  /*    FT_FACE_FLAG_FAST_GLYPHS                                           */
+  /*    FT_FACE_FLAG_HINTER                                                */
+  /*                                                                       */
+  /*    FT_STYLE_FLAG_BOLD                                                 */
+  /*    FT_STYLE_FLAG_ITALIC                                               */
+  /*                                                                       */
+  /*    FT_SizeRec                                                         */
+  /*    FT_Size_Metrics                                                    */
+  /*                                                                       */
+  /*    FT_GlyphSlotRec                                                    */
+  /*    FT_Glyph_Metrics                                                   */
+  /*    FT_SubGlyph                                                        */
+  /*                                                                       */
+  /*    FT_Bitmap_Size                                                     */
+  /*                                                                       */
+  /*    FT_Init_FreeType                                                   */
+  /*    FT_Done_FreeType                                                   */
+  /*                                                                       */
+  /*    FT_New_Face                                                        */
+  /*    FT_Done_Face                                                       */
+  /*    FT_New_Memory_Face                                                 */
+  /*    FT_Open_Face                                                       */
+  /*    FT_Open_Args                                                       */
+  /*    FT_Parameter                                                       */
+  /*    FT_Attach_File                                                     */
+  /*    FT_Attach_Stream                                                   */
+  /*                                                                       */
+  /*    FT_Set_Char_Size                                                   */
+  /*    FT_Set_Pixel_Sizes                                                 */
+  /*    FT_Request_Size                                                    */
+  /*    FT_Select_Size                                                     */
+  /*    FT_Size_Request_Type                                               */
+  /*    FT_Size_Request                                                    */
+  /*    FT_Set_Transform                                                   */
+  /*    FT_Load_Glyph                                                      */
+  /*    FT_Get_Char_Index                                                  */
+  /*    FT_Get_Name_Index                                                  */
+  /*    FT_Load_Char                                                       */
+  /*                                                                       */
+  /*    FT_OPEN_MEMORY                                                     */
+  /*    FT_OPEN_STREAM                                                     */
+  /*    FT_OPEN_PATHNAME                                                   */
+  /*    FT_OPEN_DRIVER                                                     */
+  /*    FT_OPEN_PARAMS                                                     */
+  /*                                                                       */
+  /*    FT_LOAD_DEFAULT                                                    */
+  /*    FT_LOAD_RENDER                                                     */
+  /*    FT_LOAD_MONOCHROME                                                 */
+  /*    FT_LOAD_LINEAR_DESIGN                                              */
+  /*    FT_LOAD_NO_SCALE                                                   */
+  /*    FT_LOAD_NO_HINTING                                                 */
+  /*    FT_LOAD_NO_BITMAP                                                  */
+  /*    FT_LOAD_CROP_BITMAP                                                */
+  /*                                                                       */
+  /*    FT_LOAD_VERTICAL_LAYOUT                                            */
+  /*    FT_LOAD_IGNORE_TRANSFORM                                           */
+  /*    FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH                                */
+  /*    FT_LOAD_FORCE_AUTOHINT                                             */
+  /*    FT_LOAD_NO_RECURSE                                                 */
+  /*    FT_LOAD_PEDANTIC                                                   */
+  /*                                                                       */
+  /*    FT_LOAD_TARGET_NORMAL                                              */
+  /*    FT_LOAD_TARGET_LIGHT                                               */
+  /*    FT_LOAD_TARGET_MONO                                                */
+  /*    FT_LOAD_TARGET_LCD                                                 */
+  /*    FT_LOAD_TARGET_LCD_V                                               */
+  /*                                                                       */
+  /*    FT_Render_Glyph                                                    */
+  /*    FT_Render_Mode                                                     */
+  /*    FT_Get_Kerning                                                     */
+  /*    FT_Kerning_Mode                                                    */
+  /*    FT_Get_Track_Kerning                                               */
+  /*    FT_Get_Glyph_Name                                                  */
+  /*    FT_Get_Postscript_Name                                             */
+  /*                                                                       */
+  /*    FT_CharMapRec                                                      */
+  /*    FT_Select_Charmap                                                  */
+  /*    FT_Set_Charmap                                                     */
+  /*    FT_Get_Charmap_Index                                               */
+  /*                                                                       */
+  /*    FT_FSTYPE_INSTALLABLE_EMBEDDING                                    */
+  /*    FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING                             */
+  /*    FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING                              */
+  /*    FT_FSTYPE_EDITABLE_EMBEDDING                                       */
+  /*    FT_FSTYPE_NO_SUBSETTING                                            */
+  /*    FT_FSTYPE_BITMAP_EMBEDDING_ONLY                                    */
+  /*                                                                       */
+  /*    FT_Get_FSType_Flags                                                */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Glyph_Metrics                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model the metrics of a single glyph.  The      */
+  /*    values are expressed in 26.6 fractional pixel format; if the flag  */
+  /*    @FT_LOAD_NO_SCALE has been used while loading the glyph, values    */
+  /*    are expressed in font units instead.                               */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    width ::                                                           */
+  /*      The glyph's width.                                               */
+  /*                                                                       */
+  /*    height ::                                                          */
+  /*      The glyph's height.                                              */
+  /*                                                                       */
+  /*    horiBearingX ::                                                    */
+  /*      Left side bearing for horizontal layout.                         */
+  /*                                                                       */
+  /*    horiBearingY ::                                                    */
+  /*      Top side bearing for horizontal layout.                          */
+  /*                                                                       */
+  /*    horiAdvance ::                                                     */
+  /*      Advance width for horizontal layout.                             */
+  /*                                                                       */
+  /*    vertBearingX ::                                                    */
+  /*      Left side bearing for vertical layout.                           */
+  /*                                                                       */
+  /*    vertBearingY ::                                                    */
+  /*      Top side bearing for vertical layout.  Larger positive values    */
+  /*      mean further below the vertical glyph origin.                    */
+  /*                                                                       */
+  /*    vertAdvance ::                                                     */
+  /*      Advance height for vertical layout.  Positive values mean the    */
+  /*      glyph has a positive advance downward.                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If not disabled with @FT_LOAD_NO_HINTING, the values represent     */
+  /*    dimensions of the hinted glyph (in case hinting is applicable).    */
+  /*                                                                       */
+  typedef struct  FT_Glyph_Metrics_
+  {
+    FT_Pos  width;
+    FT_Pos  height;
+
+    FT_Pos  horiBearingX;
+    FT_Pos  horiBearingY;
+    FT_Pos  horiAdvance;
+
+    FT_Pos  vertBearingX;
+    FT_Pos  vertBearingY;
+    FT_Pos  vertAdvance;
+
+  } FT_Glyph_Metrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Bitmap_Size                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure models the metrics of a bitmap strike (i.e., a set  */
+  /*    of glyphs for a given point size and resolution) in a bitmap font. */
+  /*    It is used for the `available_sizes' field of @FT_Face.            */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    height :: The vertical distance, in pixels, between two            */
+  /*              consecutive baselines.  It is always positive.           */
+  /*                                                                       */
+  /*    width  :: The average width, in pixels, of all glyphs in the       */
+  /*              strike.                                                  */
+  /*                                                                       */
+  /*    size   :: The nominal size of the strike in 26.6 fractional        */
+  /*              points.  This field is not very useful.                  */
+  /*                                                                       */
+  /*    x_ppem :: The horizontal ppem (nominal width) in 26.6 fractional   */
+  /*              pixels.                                                  */
+  /*                                                                       */
+  /*    y_ppem :: The vertical ppem (nominal height) in 26.6 fractional    */
+  /*              pixels.                                                  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Windows FNT:                                                       */
+  /*      The nominal size given in a FNT font is not reliable.  Thus when */
+  /*      the driver finds it incorrect, it sets `size' to some calculated */
+  /*      values and sets `x_ppem' and `y_ppem' to the pixel width and     */
+  /*      height given in the font, respectively.                          */
+  /*                                                                       */
+  /*    TrueType embedded bitmaps:                                         */
+  /*      `size', `width', and `height' values are not contained in the    */
+  /*      bitmap strike itself.  They are computed from the global font    */
+  /*      parameters.                                                      */
+  /*                                                                       */
+  typedef struct  FT_Bitmap_Size_
+  {
+    FT_Short  height;
+    FT_Short  width;
+
+    FT_Pos    size;
+
+    FT_Pos    x_ppem;
+    FT_Pos    y_ppem;
+
+  } FT_Bitmap_Size;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*                                                                       */
+  /*                     O B J E C T   C L A S S E S                       */
+  /*                                                                       */
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Library                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a FreeType library instance.  Each `library' is        */
+  /*    completely independent from the others; it is the `root' of a set  */
+  /*    of objects like fonts, faces, sizes, etc.                          */
+  /*                                                                       */
+  /*    It also embeds a memory manager (see @FT_Memory), as well as a     */
+  /*    scan-line converter object (see @FT_Raster).                       */
+  /*                                                                       */
+  /*    For multi-threading applications each thread should have its own   */
+  /*    FT_Library object.                                                 */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Library objects are normally created by @FT_Init_FreeType, and     */
+  /*    destroyed with @FT_Done_FreeType.                                  */
+  /*                                                                       */
+  typedef struct FT_LibraryRec_  *FT_Library;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Module                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a given FreeType module object.  Each module can be a  */
+  /*    font driver, a renderer, or anything else that provides services   */
+  /*    to the formers.                                                    */
+  /*                                                                       */
+  typedef struct FT_ModuleRec_*  FT_Module;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Driver                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a given FreeType font driver object.  Each font driver */
+  /*    is a special module capable of creating faces from font files.     */
+  /*                                                                       */
+  typedef struct FT_DriverRec_*  FT_Driver;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Renderer                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a given FreeType renderer.  A renderer is a special    */
+  /*    module in charge of converting a glyph image to a bitmap, when     */
+  /*    necessary.  Each renderer supports a given glyph image format, and */
+  /*    one or more target surface depths.                                 */
+  /*                                                                       */
+  typedef struct FT_RendererRec_*  FT_Renderer;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Face                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a given typographic face object.  A face object models */
+  /*    a given typeface, in a given style.                                */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Each face object also owns a single @FT_GlyphSlot object, as well  */
+  /*    as one or more @FT_Size objects.                                   */
+  /*                                                                       */
+  /*    Use @FT_New_Face or @FT_Open_Face to create a new face object from */
+  /*    a given filepathname or a custom input stream.                     */
+  /*                                                                       */
+  /*    Use @FT_Done_Face to destroy it (along with its slot and sizes).   */
+  /*                                                                       */
+  /* <Also>                                                                */
+  /*    See @FT_FaceRec for the publicly accessible fields of a given face */
+  /*    object.                                                            */
+  /*                                                                       */
+  typedef struct FT_FaceRec_*  FT_Face;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Size                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an object used to model a face scaled to a given       */
+  /*    character size.                                                    */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Each @FT_Face has an _active_ @FT_Size object that is used by      */
+  /*    functions like @FT_Load_Glyph to determine the scaling             */
+  /*    transformation which is used to load and hint glyphs and metrics.  */
+  /*                                                                       */
+  /*    You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes,                */
+  /*    @FT_Request_Size or even @FT_Select_Size to change the content     */
+  /*    (i.e., the scaling values) of the active @FT_Size.                 */
+  /*                                                                       */
+  /*    You can use @FT_New_Size to create additional size objects for a   */
+  /*    given @FT_Face, but they won't be used by other functions until    */
+  /*    you activate it through @FT_Activate_Size.  Only one size can be   */
+  /*    activated at any given time per face.                              */
+  /*                                                                       */
+  /* <Also>                                                                */
+  /*    See @FT_SizeRec for the publicly accessible fields of a given size */
+  /*    object.                                                            */
+  /*                                                                       */
+  typedef struct FT_SizeRec_*  FT_Size;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_GlyphSlot                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a given `glyph slot'.  A slot is a container where it  */
+  /*    is possible to load any of the glyphs contained in its parent      */
+  /*    face.                                                              */
+  /*                                                                       */
+  /*    In other words, each time you call @FT_Load_Glyph or               */
+  /*    @FT_Load_Char, the slot's content is erased by the new glyph data, */
+  /*    i.e., the glyph's metrics, its image (bitmap or outline), and      */
+  /*    other control information.                                         */
+  /*                                                                       */
+  /* <Also>                                                                */
+  /*    See @FT_GlyphSlotRec for the publicly accessible glyph fields.     */
+  /*                                                                       */
+  typedef struct FT_GlyphSlotRec_*  FT_GlyphSlot;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_CharMap                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a given character map.  A charmap is used to translate */
+  /*    character codes in a given encoding into glyph indexes for its     */
+  /*    parent's face.  Some font formats may provide several charmaps per */
+  /*    font.                                                              */
+  /*                                                                       */
+  /*    Each face object owns zero or more charmaps, but only one of them  */
+  /*    can be `active' and used by @FT_Get_Char_Index or @FT_Load_Char.   */
+  /*                                                                       */
+  /*    The list of available charmaps in a face is available through the  */
+  /*    `face->num_charmaps' and `face->charmaps' fields of @FT_FaceRec.   */
+  /*                                                                       */
+  /*    The currently active charmap is available as `face->charmap'.      */
+  /*    You should call @FT_Set_Charmap to change it.                      */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    When a new face is created (either through @FT_New_Face or         */
+  /*    @FT_Open_Face), the library looks for a Unicode charmap within     */
+  /*    the list and automatically activates it.                           */
+  /*                                                                       */
+  /* <Also>                                                                */
+  /*    See @FT_CharMapRec for the publicly accessible fields of a given   */
+  /*    character map.                                                     */
+  /*                                                                       */
+  typedef struct FT_CharMapRec_*  FT_CharMap;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_ENC_TAG                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This macro converts four-letter tags into an unsigned long.  It is */
+  /*    used to define `encoding' identifiers (see @FT_Encoding).          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Since many 16-bit compilers don't like 32-bit enumerations, you    */
+  /*    should redefine this macro in case of problems to something like   */
+  /*    this:                                                              */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      #define FT_ENC_TAG( value, a, b, c, d )  value                   */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    to get a simple enumeration without assigning special numbers.     */
+  /*                                                                       */
+
+#ifndef FT_ENC_TAG
+#define FT_ENC_TAG( value, a, b, c, d )         \
+          value = ( ( (FT_UInt32)(a) << 24 ) |  \
+                    ( (FT_UInt32)(b) << 16 ) |  \
+                    ( (FT_UInt32)(c) <<  8 ) |  \
+                      (FT_UInt32)(d)         )
+
+#endif /* FT_ENC_TAG */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Encoding                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration used to specify character sets supported by         */
+  /*    charmaps.  Used in the @FT_Select_Charmap API function.            */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Despite the name, this enumeration lists specific character        */
+  /*    repertories (i.e., charsets), and not text encoding methods (e.g., */
+  /*    UTF-8, UTF-16, etc.).                                              */
+  /*                                                                       */
+  /*    Other encodings might be defined in the future.                    */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_ENCODING_NONE ::                                                */
+  /*      The encoding value~0 is reserved.                                */
+  /*                                                                       */
+  /*    FT_ENCODING_UNICODE ::                                             */
+  /*      Corresponds to the Unicode character set.  This value covers     */
+  /*      all versions of the Unicode repertoire, including ASCII and      */
+  /*      Latin-1.  Most fonts include a Unicode charmap, but not all      */
+  /*      of them.                                                         */
+  /*                                                                       */
+  /*      For example, if you want to access Unicode value U+1F028 (and    */
+  /*      the font contains it), use value 0x1F028 as the input value for  */
+  /*      @FT_Get_Char_Index.                                              */
+  /*                                                                       */
+  /*    FT_ENCODING_MS_SYMBOL ::                                           */
+  /*      Corresponds to the Microsoft Symbol encoding, used to encode     */
+  /*      mathematical symbols in the 32..255 character code range.  For   */
+  /*      more information, see `http://www.ceviz.net/symbol.htm'.         */
+  /*                                                                       */
+  /*    FT_ENCODING_SJIS ::                                                */
+  /*      Corresponds to Japanese SJIS encoding.  More info at             */
+  /*      at `http://langsupport.japanreference.com/encoding.shtml'.       */
+  /*      See note on multi-byte encodings below.                          */
+  /*                                                                       */
+  /*    FT_ENCODING_GB2312 ::                                              */
+  /*      Corresponds to an encoding system for Simplified Chinese as used */
+  /*      used in mainland China.                                          */
+  /*                                                                       */
+  /*    FT_ENCODING_BIG5 ::                                                */
+  /*      Corresponds to an encoding system for Traditional Chinese as     */
+  /*      used in Taiwan and Hong Kong.                                    */
+  /*                                                                       */
+  /*    FT_ENCODING_WANSUNG ::                                             */
+  /*      Corresponds to the Korean encoding system known as Wansung.      */
+  /*      For more information see                                         */
+  /*      `http://www.microsoft.com/typography/unicode/949.txt'.           */
+  /*                                                                       */
+  /*    FT_ENCODING_JOHAB ::                                               */
+  /*      The Korean standard character set (KS~C 5601-1992), which        */
+  /*      corresponds to MS Windows code page 1361.  This character set    */
+  /*      includes all possible Hangeul character combinations.            */
+  /*                                                                       */
+  /*    FT_ENCODING_ADOBE_LATIN_1 ::                                       */
+  /*      Corresponds to a Latin-1 encoding as defined in a Type~1         */
+  /*      PostScript font.  It is limited to 256 character codes.          */
+  /*                                                                       */
+  /*    FT_ENCODING_ADOBE_STANDARD ::                                      */
+  /*      Corresponds to the Adobe Standard encoding, as found in Type~1,  */
+  /*      CFF, and OpenType/CFF fonts.  It is limited to 256 character     */
+  /*      codes.                                                           */
+  /*                                                                       */
+  /*    FT_ENCODING_ADOBE_EXPERT ::                                        */
+  /*      Corresponds to the Adobe Expert encoding, as found in Type~1,    */
+  /*      CFF, and OpenType/CFF fonts.  It is limited to 256 character     */
+  /*      codes.                                                           */
+  /*                                                                       */
+  /*    FT_ENCODING_ADOBE_CUSTOM ::                                        */
+  /*      Corresponds to a custom encoding, as found in Type~1, CFF, and   */
+  /*      OpenType/CFF fonts.  It is limited to 256 character codes.       */
+  /*                                                                       */
+  /*    FT_ENCODING_APPLE_ROMAN ::                                         */
+  /*      Corresponds to the 8-bit Apple roman encoding.  Many TrueType    */
+  /*      and OpenType fonts contain a charmap for this encoding, since    */
+  /*      older versions of Mac OS are able to use it.                     */
+  /*                                                                       */
+  /*    FT_ENCODING_OLD_LATIN_2 ::                                         */
+  /*      This value is deprecated and was never used nor reported by      */
+  /*      FreeType.  Don't use or test for it.                             */
+  /*                                                                       */
+  /*    FT_ENCODING_MS_SJIS ::                                             */
+  /*      Same as FT_ENCODING_SJIS.  Deprecated.                           */
+  /*                                                                       */
+  /*    FT_ENCODING_MS_GB2312 ::                                           */
+  /*      Same as FT_ENCODING_GB2312.  Deprecated.                         */
+  /*                                                                       */
+  /*    FT_ENCODING_MS_BIG5 ::                                             */
+  /*      Same as FT_ENCODING_BIG5.  Deprecated.                           */
+  /*                                                                       */
+  /*    FT_ENCODING_MS_WANSUNG ::                                          */
+  /*      Same as FT_ENCODING_WANSUNG.  Deprecated.                        */
+  /*                                                                       */
+  /*    FT_ENCODING_MS_JOHAB ::                                            */
+  /*      Same as FT_ENCODING_JOHAB.  Deprecated.                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    By default, FreeType automatically synthesizes a Unicode charmap   */
+  /*    for PostScript fonts, using their glyph names dictionaries.        */
+  /*    However, it also reports the encodings defined explicitly in the   */
+  /*    font file, for the cases when they are needed, with the Adobe      */
+  /*    values as well.                                                    */
+  /*                                                                       */
+  /*    FT_ENCODING_NONE is set by the BDF and PCF drivers if the charmap  */
+  /*    is neither Unicode nor ISO-8859-1 (otherwise it is set to          */
+  /*    FT_ENCODING_UNICODE).  Use @FT_Get_BDF_Charset_ID to find out      */
+  /*    which encoding is really present.  If, for example, the            */
+  /*    `cs_registry' field is `KOI8' and the `cs_encoding' field is `R',  */
+  /*    the font is encoded in KOI8-R.                                     */
+  /*                                                                       */
+  /*    FT_ENCODING_NONE is always set (with a single exception) by the    */
+  /*    winfonts driver.  Use @FT_Get_WinFNT_Header and examine the        */
+  /*    `charset' field of the @FT_WinFNT_HeaderRec structure to find out  */
+  /*    which encoding is really present.  For example,                    */
+  /*    @FT_WinFNT_ID_CP1251 (204) means Windows code page 1251 (for       */
+  /*    Russian).                                                          */
+  /*                                                                       */
+  /*    FT_ENCODING_NONE is set if `platform_id' is @TT_PLATFORM_MACINTOSH */
+  /*    and `encoding_id' is not @TT_MAC_ID_ROMAN (otherwise it is set to  */
+  /*    FT_ENCODING_APPLE_ROMAN).                                          */
+  /*                                                                       */
+  /*    If `platform_id' is @TT_PLATFORM_MACINTOSH, use the function       */
+  /*    @FT_Get_CMap_Language_ID  to query the Mac language ID which may   */
+  /*    be needed to be able to distinguish Apple encoding variants.  See  */
+  /*                                                                       */
+  /*      http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/README.TXT  */
+  /*                                                                       */
+  /*    to get an idea how to do that.  Basically, if the language ID      */
+  /*    is~0, don't use it, otherwise subtract 1 from the language ID.     */
+  /*    Then examine `encoding_id'.  If, for example, `encoding_id' is     */
+  /*    @TT_MAC_ID_ROMAN and the language ID (minus~1) is                  */
+  /*    `TT_MAC_LANGID_GREEK', it is the Greek encoding, not Roman.        */
+  /*    @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi       */
+  /*    variant the Arabic encoding.                                       */
+  /*                                                                       */
+  typedef enum  FT_Encoding_
+  {
+    FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ),
+
+    FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ),
+    FT_ENC_TAG( FT_ENCODING_UNICODE,   'u', 'n', 'i', 'c' ),
+
+    FT_ENC_TAG( FT_ENCODING_SJIS,    's', 'j', 'i', 's' ),
+    FT_ENC_TAG( FT_ENCODING_GB2312,  'g', 'b', ' ', ' ' ),
+    FT_ENC_TAG( FT_ENCODING_BIG5,    'b', 'i', 'g', '5' ),
+    FT_ENC_TAG( FT_ENCODING_WANSUNG, 'w', 'a', 'n', 's' ),
+    FT_ENC_TAG( FT_ENCODING_JOHAB,   'j', 'o', 'h', 'a' ),
+
+    /* for backwards compatibility */
+    FT_ENCODING_MS_SJIS    = FT_ENCODING_SJIS,
+    FT_ENCODING_MS_GB2312  = FT_ENCODING_GB2312,
+    FT_ENCODING_MS_BIG5    = FT_ENCODING_BIG5,
+    FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG,
+    FT_ENCODING_MS_JOHAB   = FT_ENCODING_JOHAB,
+
+    FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ),
+    FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT,   'A', 'D', 'B', 'E' ),
+    FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM,   'A', 'D', 'B', 'C' ),
+    FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1,  'l', 'a', 't', '1' ),
+
+    FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ),
+
+    FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' )
+
+  } FT_Encoding;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    ft_encoding_xxx                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    These constants are deprecated; use the corresponding @FT_Encoding */
+  /*    values instead.                                                    */
+  /*                                                                       */
+#define ft_encoding_none            FT_ENCODING_NONE
+#define ft_encoding_unicode         FT_ENCODING_UNICODE
+#define ft_encoding_symbol          FT_ENCODING_MS_SYMBOL
+#define ft_encoding_latin_1         FT_ENCODING_ADOBE_LATIN_1
+#define ft_encoding_latin_2         FT_ENCODING_OLD_LATIN_2
+#define ft_encoding_sjis            FT_ENCODING_SJIS
+#define ft_encoding_gb2312          FT_ENCODING_GB2312
+#define ft_encoding_big5            FT_ENCODING_BIG5
+#define ft_encoding_wansung         FT_ENCODING_WANSUNG
+#define ft_encoding_johab           FT_ENCODING_JOHAB
+
+#define ft_encoding_adobe_standard  FT_ENCODING_ADOBE_STANDARD
+#define ft_encoding_adobe_expert    FT_ENCODING_ADOBE_EXPERT
+#define ft_encoding_adobe_custom    FT_ENCODING_ADOBE_CUSTOM
+#define ft_encoding_apple_roman     FT_ENCODING_APPLE_ROMAN
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_CharMapRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The base charmap structure.                                        */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    face        :: A handle to the parent face object.                 */
+  /*                                                                       */
+  /*    encoding    :: An @FT_Encoding tag identifying the charmap.  Use   */
+  /*                   this with @FT_Select_Charmap.                       */
+  /*                                                                       */
+  /*    platform_id :: An ID number describing the platform for the        */
+  /*                   following encoding ID.  This comes directly from    */
+  /*                   the TrueType specification and should be emulated   */
+  /*                   for other formats.                                  */
+  /*                                                                       */
+  /*    encoding_id :: A platform specific encoding number.  This also     */
+  /*                   comes from the TrueType specification and should be */
+  /*                   emulated similarly.                                 */
+  /*                                                                       */
+  typedef struct  FT_CharMapRec_
+  {
+    FT_Face      face;
+    FT_Encoding  encoding;
+    FT_UShort    platform_id;
+    FT_UShort    encoding_id;
+
+  } FT_CharMapRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*                                                                       */
+  /*                 B A S E   O B J E C T   C L A S S E S                 */
+  /*                                                                       */
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Face_Internal                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An opaque handle to an `FT_Face_InternalRec' structure, used to    */
+  /*    model private data of a given @FT_Face object.                     */
+  /*                                                                       */
+  /*    This structure might change between releases of FreeType~2 and is  */
+  /*    not generally available to client applications.                    */
+  /*                                                                       */
+  typedef struct FT_Face_InternalRec_*  FT_Face_Internal;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_FaceRec                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    FreeType root face class structure.  A face object models a        */
+  /*    typeface in a font file.                                           */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_faces           :: The number of faces in the font file.  Some */
+  /*                           font formats can have multiple faces in     */
+  /*                           a font file.                                */
+  /*                                                                       */
+  /*    face_index          :: The index of the face in the font file.  It */
+  /*                           is set to~0 if there is only one face in    */
+  /*                           the font file.                              */
+  /*                                                                       */
+  /*    face_flags          :: A set of bit flags that give important      */
+  /*                           information about the face; see             */
+  /*                           @FT_FACE_FLAG_XXX for the details.          */
+  /*                                                                       */
+  /*    style_flags         :: A set of bit flags indicating the style of  */
+  /*                           the face; see @FT_STYLE_FLAG_XXX for the    */
+  /*                           details.                                    */
+  /*                                                                       */
+  /*    num_glyphs          :: The number of glyphs in the face.  If the   */
+  /*                           face is scalable and has sbits (see         */
+  /*                           `num_fixed_sizes'), it is set to the number */
+  /*                           of outline glyphs.                          */
+  /*                                                                       */
+  /*                           For CID-keyed fonts, this value gives the   */
+  /*                           highest CID used in the font.               */
+  /*                                                                       */
+  /*    family_name         :: The face's family name.  This is an ASCII   */
+  /*                           string, usually in English, which describes */
+  /*                           the typeface's family (like `Times New      */
+  /*                           Roman', `Bodoni', `Garamond', etc).  This   */
+  /*                           is a least common denominator used to list  */
+  /*                           fonts.  Some formats (TrueType & OpenType)  */
+  /*                           provide localized and Unicode versions of   */
+  /*                           this string.  Applications should use the   */
+  /*                           format specific interface to access them.   */
+  /*                           Can be NULL (e.g., in fonts embedded in a   */
+  /*                           PDF file).                                  */
+  /*                                                                       */
+  /*    style_name          :: The face's style name.  This is an ASCII    */
+  /*                           string, usually in English, which describes */
+  /*                           the typeface's style (like `Italic',        */
+  /*                           `Bold', `Condensed', etc).  Not all font    */
+  /*                           formats provide a style name, so this field */
+  /*                           is optional, and can be set to NULL.  As    */
+  /*                           for `family_name', some formats provide     */
+  /*                           localized and Unicode versions of this      */
+  /*                           string.  Applications should use the format */
+  /*                           specific interface to access them.          */
+  /*                                                                       */
+  /*    num_fixed_sizes     :: The number of bitmap strikes in the face.   */
+  /*                           Even if the face is scalable, there might   */
+  /*                           still be bitmap strikes, which are called   */
+  /*                           `sbits' in that case.                       */
+  /*                                                                       */
+  /*    available_sizes     :: An array of @FT_Bitmap_Size for all bitmap  */
+  /*                           strikes in the face.  It is set to NULL if  */
+  /*                           there is no bitmap strike.                  */
+  /*                                                                       */
+  /*    num_charmaps        :: The number of charmaps in the face.         */
+  /*                                                                       */
+  /*    charmaps            :: An array of the charmaps of the face.       */
+  /*                                                                       */
+  /*    generic             :: A field reserved for client uses.  See the  */
+  /*                           @FT_Generic type description.               */
+  /*                                                                       */
+  /*    bbox                :: The font bounding box.  Coordinates are     */
+  /*                           expressed in font units (see                */
+  /*                           `units_per_EM').  The box is large enough   */
+  /*                           to contain any glyph from the font.  Thus,  */
+  /*                           `bbox.yMax' can be seen as the `maximal     */
+  /*                           ascender', and `bbox.yMin' as the `minimal  */
+  /*                           descender'.  Only relevant for scalable     */
+  /*                           formats.                                    */
+  /*                                                                       */
+  /*                           Note that the bounding box might be off by  */
+  /*                           (at least) one pixel for hinted fonts.  See */
+  /*                           @FT_Size_Metrics for further discussion.    */
+  /*                                                                       */
+  /*    units_per_EM        :: The number of font units per EM square for  */
+  /*                           this face.  This is typically 2048 for      */
+  /*                           TrueType fonts, and 1000 for Type~1 fonts.  */
+  /*                           Only relevant for scalable formats.         */
+  /*                                                                       */
+  /*    ascender            :: The typographic ascender of the face,       */
+  /*                           expressed in font units.  For font formats  */
+  /*                           not having this information, it is set to   */
+  /*                           `bbox.yMax'.  Only relevant for scalable    */
+  /*                           formats.                                    */
+  /*                                                                       */
+  /*    descender           :: The typographic descender of the face,      */
+  /*                           expressed in font units.  For font formats  */
+  /*                           not having this information, it is set to   */
+  /*                           `bbox.yMin'.  Note that this field is       */
+  /*                           usually negative.  Only relevant for        */
+  /*                           scalable formats.                           */
+  /*                                                                       */
+  /*    height              :: The height is the vertical distance         */
+  /*                           between two consecutive baselines,          */
+  /*                           expressed in font units.  It is always      */
+  /*                           positive.  Only relevant for scalable       */
+  /*                           formats.                                    */
+  /*                                                                       */
+  /*    max_advance_width   :: The maximal advance width, in font units,   */
+  /*                           for all glyphs in this face.  This can be   */
+  /*                           used to make word wrapping computations     */
+  /*                           faster.  Only relevant for scalable         */
+  /*                           formats.                                    */
+  /*                                                                       */
+  /*    max_advance_height  :: The maximal advance height, in font units,  */
+  /*                           for all glyphs in this face.  This is only  */
+  /*                           relevant for vertical layouts, and is set   */
+  /*                           to `height' for fonts that do not provide   */
+  /*                           vertical metrics.  Only relevant for        */
+  /*                           scalable formats.                           */
+  /*                                                                       */
+  /*    underline_position  :: The position, in font units, of the         */
+  /*                           underline line for this face.  It is the    */
+  /*                           center of the underlining stem.  Only       */
+  /*                           relevant for scalable formats.              */
+  /*                                                                       */
+  /*    underline_thickness :: The thickness, in font units, of the        */
+  /*                           underline for this face.  Only relevant for */
+  /*                           scalable formats.                           */
+  /*                                                                       */
+  /*    glyph               :: The face's associated glyph slot(s).        */
+  /*                                                                       */
+  /*    size                :: The current active size for this face.      */
+  /*                                                                       */
+  /*    charmap             :: The current active charmap for this face.   */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Fields may be changed after a call to @FT_Attach_File or           */
+  /*    @FT_Attach_Stream.                                                 */
+  /*                                                                       */
+  typedef struct  FT_FaceRec_
+  {
+    FT_Long           num_faces;
+    FT_Long           face_index;
+
+    FT_Long           face_flags;
+    FT_Long           style_flags;
+
+    FT_Long           num_glyphs;
+
+    FT_String*        family_name;
+    FT_String*        style_name;
+
+    FT_Int            num_fixed_sizes;
+    FT_Bitmap_Size*   available_sizes;
+
+    FT_Int            num_charmaps;
+    FT_CharMap*       charmaps;
+
+    FT_Generic        generic;
+
+    /*# The following member variables (down to `underline_thickness') */
+    /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size    */
+    /*# for bitmap fonts.                                              */
+    FT_BBox           bbox;
+
+    FT_UShort         units_per_EM;
+    FT_Short          ascender;
+    FT_Short          descender;
+    FT_Short          height;
+
+    FT_Short          max_advance_width;
+    FT_Short          max_advance_height;
+
+    FT_Short          underline_position;
+    FT_Short          underline_thickness;
+
+    FT_GlyphSlot      glyph;
+    FT_Size           size;
+    FT_CharMap        charmap;
+
+    /*@private begin */
+
+    FT_Driver         driver;
+    FT_Memory         memory;
+    FT_Stream         stream;
+
+    FT_ListRec        sizes_list;
+
+    FT_Generic        autohint;   /* face-specific auto-hinter data */
+    void*             extensions; /* unused                         */
+
+    FT_Face_Internal  internal;
+
+    /*@private end */
+
+  } FT_FaceRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_FACE_FLAG_XXX                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of bit flags used in the `face_flags' field of the          */
+  /*    @FT_FaceRec structure.  They inform client applications of         */
+  /*    properties of the corresponding face.                              */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_FACE_FLAG_SCALABLE ::                                           */
+  /*      Indicates that the face contains outline glyphs.  This doesn't   */
+  /*      prevent bitmap strikes, i.e., a face can have both this and      */
+  /*      and @FT_FACE_FLAG_FIXED_SIZES set.                               */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_FIXED_SIZES ::                                        */
+  /*      Indicates that the face contains bitmap strikes.  See also the   */
+  /*      `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec.   */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_FIXED_WIDTH ::                                        */
+  /*      Indicates that the face contains fixed-width characters (like    */
+  /*      Courier, Lucido, MonoType, etc.).                                */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_SFNT ::                                               */
+  /*      Indicates that the face uses the `sfnt' storage scheme.  For     */
+  /*      now, this means TrueType and OpenType.                           */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_HORIZONTAL ::                                         */
+  /*      Indicates that the face contains horizontal glyph metrics.  This */
+  /*      should be set for all common formats.                            */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_VERTICAL ::                                           */
+  /*      Indicates that the face contains vertical glyph metrics.  This   */
+  /*      is only available in some formats, not all of them.              */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_KERNING ::                                            */
+  /*      Indicates that the face contains kerning information.  If set,   */
+  /*      the kerning distance can be retrieved through the function       */
+  /*      @FT_Get_Kerning.  Otherwise the function always return the       */
+  /*      vector (0,0).  Note that FreeType doesn't handle kerning data    */
+  /*      from the `GPOS' table (as present in some OpenType fonts).       */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_FAST_GLYPHS ::                                        */
+  /*      THIS FLAG IS DEPRECATED.  DO NOT USE OR TEST IT.                 */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_MULTIPLE_MASTERS ::                                   */
+  /*      Indicates that the font contains multiple masters and is capable */
+  /*      of interpolating between them.  See the multiple-masters         */
+  /*      specific API for details.                                        */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_GLYPH_NAMES ::                                        */
+  /*      Indicates that the font contains glyph names that can be         */
+  /*      retrieved through @FT_Get_Glyph_Name.  Note that some TrueType   */
+  /*      fonts contain broken glyph name tables.  Use the function        */
+  /*      @FT_Has_PS_Glyph_Names when needed.                              */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_EXTERNAL_STREAM ::                                    */
+  /*      Used internally by FreeType to indicate that a face's stream was */
+  /*      provided by the client application and should not be destroyed   */
+  /*      when @FT_Done_Face is called.  Don't read or test this flag.     */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_HINTER ::                                             */
+  /*      Set if the font driver has a hinting machine of its own.  For    */
+  /*      example, with TrueType fonts, it makes sense to use data from    */
+  /*      the SFNT `gasp' table only if the native TrueType hinting engine */
+  /*      (with the bytecode interpreter) is available and active.         */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_CID_KEYED ::                                          */
+  /*      Set if the font is CID-keyed.  In that case, the font is not     */
+  /*      accessed by glyph indices but by CID values.  For subsetted      */
+  /*      CID-keyed fonts this has the consequence that not all index      */
+  /*      values are a valid argument to FT_Load_Glyph.  Only the CID      */
+  /*      values for which corresponding glyphs in the subsetted font      */
+  /*      exist make FT_Load_Glyph return successfully; in all other cases */
+  /*      you get an `FT_Err_Invalid_Argument' error.                      */
+  /*                                                                       */
+  /*      Note that CID-keyed fonts which are in an SFNT wrapper don't     */
+  /*      have this flag set since the glyphs are accessed in the normal   */
+  /*      way (using contiguous indices); the `CID-ness' isn't visible to  */
+  /*      the application.                                                 */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_TRICKY ::                                             */
+  /*      Set if the font is `tricky', this is, it always needs the        */
+  /*      font format's native hinting engine to get a reasonable result.  */
+  /*      A typical example is the Chinese font `mingli.ttf' which uses    */
+  /*      TrueType bytecode instructions to move and scale all of its      */
+  /*      subglyphs.                                                       */
+  /*                                                                       */
+  /*      It is not possible to autohint such fonts using                  */
+  /*      @FT_LOAD_FORCE_AUTOHINT; it will also ignore                     */
+  /*      @FT_LOAD_NO_HINTING.  You have to set both @FT_LOAD_NO_HINTING   */
+  /*      and @FT_LOAD_NO_AUTOHINT to really disable hinting; however, you */
+  /*      probably never want this except for demonstration purposes.      */
+  /*                                                                       */
+  /*      Currently, there are about a dozen TrueType fonts in the list of */
+  /*      tricky fonts; they are hard-coded in file `ttobjs.c'.            */
+  /*                                                                       */
+#define FT_FACE_FLAG_SCALABLE          ( 1L <<  0 )
+#define FT_FACE_FLAG_FIXED_SIZES       ( 1L <<  1 )
+#define FT_FACE_FLAG_FIXED_WIDTH       ( 1L <<  2 )
+#define FT_FACE_FLAG_SFNT              ( 1L <<  3 )
+#define FT_FACE_FLAG_HORIZONTAL        ( 1L <<  4 )
+#define FT_FACE_FLAG_VERTICAL          ( 1L <<  5 )
+#define FT_FACE_FLAG_KERNING           ( 1L <<  6 )
+#define FT_FACE_FLAG_FAST_GLYPHS       ( 1L <<  7 )
+#define FT_FACE_FLAG_MULTIPLE_MASTERS  ( 1L <<  8 )
+#define FT_FACE_FLAG_GLYPH_NAMES       ( 1L <<  9 )
+#define FT_FACE_FLAG_EXTERNAL_STREAM   ( 1L << 10 )
+#define FT_FACE_FLAG_HINTER            ( 1L << 11 )
+#define FT_FACE_FLAG_CID_KEYED         ( 1L << 12 )
+#define FT_FACE_FLAG_TRICKY            ( 1L << 13 )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_HAS_HORIZONTAL( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains
+   *   horizontal metrics (this is true for all font formats though).
+   *
+   * @also:
+   *   @FT_HAS_VERTICAL can be used to check for vertical metrics.
+   *
+   */
+#define FT_HAS_HORIZONTAL( face ) \
+          ( face->face_flags & FT_FACE_FLAG_HORIZONTAL )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_HAS_VERTICAL( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains vertical
+   *   metrics.
+   *
+   */
+#define FT_HAS_VERTICAL( face ) \
+          ( face->face_flags & FT_FACE_FLAG_VERTICAL )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_HAS_KERNING( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains kerning
+   *   data that can be accessed with @FT_Get_Kerning.
+   *
+   */
+#define FT_HAS_KERNING( face ) \
+          ( face->face_flags & FT_FACE_FLAG_KERNING )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_IS_SCALABLE( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains a scalable
+   *   font face (true for TrueType, Type~1, Type~42, CID, OpenType/CFF,
+   *   and PFR font formats.
+   *
+   */
+#define FT_IS_SCALABLE( face ) \
+          ( face->face_flags & FT_FACE_FLAG_SCALABLE )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_IS_SFNT( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains a font
+   *   whose format is based on the SFNT storage scheme.  This usually
+   *   means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded
+   *   bitmap fonts.
+   *
+   *   If this macro is true, all functions defined in @FT_SFNT_NAMES_H and
+   *   @FT_TRUETYPE_TABLES_H are available.
+   *
+   */
+#define FT_IS_SFNT( face ) \
+          ( face->face_flags & FT_FACE_FLAG_SFNT )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_IS_FIXED_WIDTH( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains a font face
+   *   that contains fixed-width (or `monospace', `fixed-pitch', etc.)
+   *   glyphs.
+   *
+   */
+#define FT_IS_FIXED_WIDTH( face ) \
+          ( face->face_flags & FT_FACE_FLAG_FIXED_WIDTH )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_HAS_FIXED_SIZES( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains some
+   *   embedded bitmaps.  See the `available_sizes' field of the
+   *   @FT_FaceRec structure.
+   *
+   */
+#define FT_HAS_FIXED_SIZES( face ) \
+          ( face->face_flags & FT_FACE_FLAG_FIXED_SIZES )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_HAS_FAST_GLYPHS( face )
+   *
+   * @description:
+   *   Deprecated.
+   *
+   */
+#define FT_HAS_FAST_GLYPHS( face )  0
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_HAS_GLYPH_NAMES( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains some glyph
+   *   names that can be accessed through @FT_Get_Glyph_Name.
+   *
+   */
+#define FT_HAS_GLYPH_NAMES( face ) \
+          ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_HAS_MULTIPLE_MASTERS( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains some
+   *   multiple masters.  The functions provided by @FT_MULTIPLE_MASTERS_H
+   *   are then available to choose the exact design you want.
+   *
+   */
+#define FT_HAS_MULTIPLE_MASTERS( face ) \
+          ( face->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_IS_CID_KEYED( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object contains a CID-keyed
+   *   font.  See the discussion of @FT_FACE_FLAG_CID_KEYED for more
+   *   details.
+   *
+   *   If this macro is true, all functions defined in @FT_CID_H are
+   *   available.
+   *
+   */
+#define FT_IS_CID_KEYED( face ) \
+          ( face->face_flags & FT_FACE_FLAG_CID_KEYED )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_IS_TRICKY( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face represents a `tricky' font.
+   *   See the discussion of @FT_FACE_FLAG_TRICKY for more details.
+   *
+   */
+#define FT_IS_TRICKY( face ) \
+          ( face->face_flags & FT_FACE_FLAG_TRICKY )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Const>                                                               */
+  /*    FT_STYLE_FLAG_XXX                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of bit-flags used to indicate the style of a given face.    */
+  /*    These are used in the `style_flags' field of @FT_FaceRec.          */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_STYLE_FLAG_ITALIC ::                                            */
+  /*      Indicates that a given face style is italic or oblique.          */
+  /*                                                                       */
+  /*    FT_STYLE_FLAG_BOLD ::                                              */
+  /*      Indicates that a given face is bold.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The style information as provided by FreeType is very basic.  More */
+  /*    details are beyond the scope and should be done on a higher level  */
+  /*    (for example, by analyzing various fields of the `OS/2' table in   */
+  /*    SFNT based fonts).                                                 */
+  /*                                                                       */
+#define FT_STYLE_FLAG_ITALIC  ( 1 << 0 )
+#define FT_STYLE_FLAG_BOLD    ( 1 << 1 )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Size_Internal                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An opaque handle to an `FT_Size_InternalRec' structure, used to    */
+  /*    model private data of a given @FT_Size object.                     */
+  /*                                                                       */
+  typedef struct FT_Size_InternalRec_*  FT_Size_Internal;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Size_Metrics                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The size metrics structure gives the metrics of a size object.     */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    x_ppem       :: The width of the scaled EM square in pixels, hence */
+  /*                    the term `ppem' (pixels per EM).  It is also       */
+  /*                    referred to as `nominal width'.                    */
+  /*                                                                       */
+  /*    y_ppem       :: The height of the scaled EM square in pixels,      */
+  /*                    hence the term `ppem' (pixels per EM).  It is also */
+  /*                    referred to as `nominal height'.                   */
+  /*                                                                       */
+  /*    x_scale      :: A 16.16 fractional scaling value used to convert   */
+  /*                    horizontal metrics from font units to 26.6         */
+  /*                    fractional pixels.  Only relevant for scalable     */
+  /*                    font formats.                                      */
+  /*                                                                       */
+  /*    y_scale      :: A 16.16 fractional scaling value used to convert   */
+  /*                    vertical metrics from font units to 26.6           */
+  /*                    fractional pixels.  Only relevant for scalable     */
+  /*                    font formats.                                      */
+  /*                                                                       */
+  /*    ascender     :: The ascender in 26.6 fractional pixels.  See       */
+  /*                    @FT_FaceRec for the details.                       */
+  /*                                                                       */
+  /*    descender    :: The descender in 26.6 fractional pixels.  See      */
+  /*                    @FT_FaceRec for the details.                       */
+  /*                                                                       */
+  /*    height       :: The height in 26.6 fractional pixels.  See         */
+  /*                    @FT_FaceRec for the details.                       */
+  /*                                                                       */
+  /*    max_advance  :: The maximal advance width in 26.6 fractional       */
+  /*                    pixels.  See @FT_FaceRec for the details.          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The scaling values, if relevant, are determined first during a     */
+  /*    size changing operation.  The remaining fields are then set by the */
+  /*    driver.  For scalable formats, they are usually set to scaled      */
+  /*    values of the corresponding fields in @FT_FaceRec.                 */
+  /*                                                                       */
+  /*    Note that due to glyph hinting, these values might not be exact    */
+  /*    for certain fonts.  Thus they must be treated as unreliable        */
+  /*    with an error margin of at least one pixel!                        */
+  /*                                                                       */
+  /*    Indeed, the only way to get the exact metrics is to render _all_   */
+  /*    glyphs.  As this would be a definite performance hit, it is up to  */
+  /*    client applications to perform such computations.                  */
+  /*                                                                       */
+  /*    The FT_Size_Metrics structure is valid for bitmap fonts also.      */
+  /*                                                                       */
+  typedef struct  FT_Size_Metrics_
+  {
+    FT_UShort  x_ppem;      /* horizontal pixels per EM               */
+    FT_UShort  y_ppem;      /* vertical pixels per EM                 */
+
+    FT_Fixed   x_scale;     /* scaling values used to convert font    */
+    FT_Fixed   y_scale;     /* units to 26.6 fractional pixels        */
+
+    FT_Pos     ascender;    /* ascender in 26.6 frac. pixels          */
+    FT_Pos     descender;   /* descender in 26.6 frac. pixels         */
+    FT_Pos     height;      /* text height in 26.6 frac. pixels       */
+    FT_Pos     max_advance; /* max horizontal advance, in 26.6 pixels */
+
+  } FT_Size_Metrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_SizeRec                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    FreeType root size class structure.  A size object models a face   */
+  /*    object at a given size.                                            */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    face    :: Handle to the parent face object.                       */
+  /*                                                                       */
+  /*    generic :: A typeless pointer, which is unused by the FreeType     */
+  /*               library or any of its drivers.  It can be used by       */
+  /*               client applications to link their own data to each size */
+  /*               object.                                                 */
+  /*                                                                       */
+  /*    metrics :: Metrics for this size object.  This field is read-only. */
+  /*                                                                       */
+  typedef struct  FT_SizeRec_
+  {
+    FT_Face           face;      /* parent face object              */
+    FT_Generic        generic;   /* generic pointer for client uses */
+    FT_Size_Metrics   metrics;   /* size metrics                    */
+    FT_Size_Internal  internal;
+
+  } FT_SizeRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_SubGlyph                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The subglyph structure is an internal object used to describe      */
+  /*    subglyphs (for example, in the case of composites).                */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The subglyph implementation is not part of the high-level API,     */
+  /*    hence the forward structure declaration.                           */
+  /*                                                                       */
+  /*    You can however retrieve subglyph information with                 */
+  /*    @FT_Get_SubGlyph_Info.                                             */
+  /*                                                                       */
+  typedef struct FT_SubGlyphRec_*  FT_SubGlyph;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Slot_Internal                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An opaque handle to an `FT_Slot_InternalRec' structure, used to    */
+  /*    model private data of a given @FT_GlyphSlot object.                */
+  /*                                                                       */
+  typedef struct FT_Slot_InternalRec_*  FT_Slot_Internal;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_GlyphSlotRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    FreeType root glyph slot class structure.  A glyph slot is a       */
+  /*    container where individual glyphs can be loaded, be they in        */
+  /*    outline or bitmap format.                                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    library           :: A handle to the FreeType library instance     */
+  /*                         this slot belongs to.                         */
+  /*                                                                       */
+  /*    face              :: A handle to the parent face object.           */
+  /*                                                                       */
+  /*    next              :: In some cases (like some font tools), several */
+  /*                         glyph slots per face object can be a good     */
+  /*                         thing.  As this is rare, the glyph slots are  */
+  /*                         listed through a direct, single-linked list   */
+  /*                         using its `next' field.                       */
+  /*                                                                       */
+  /*    generic           :: A typeless pointer which is unused by the     */
+  /*                         FreeType library or any of its drivers.  It   */
+  /*                         can be used by client applications to link    */
+  /*                         their own data to each glyph slot object.     */
+  /*                                                                       */
+  /*    metrics           :: The metrics of the last loaded glyph in the   */
+  /*                         slot.  The returned values depend on the last */
+  /*                         load flags (see the @FT_Load_Glyph API        */
+  /*                         function) and can be expressed either in 26.6 */
+  /*                         fractional pixels or font units.              */
+  /*                                                                       */
+  /*                         Note that even when the glyph image is        */
+  /*                         transformed, the metrics are not.             */
+  /*                                                                       */
+  /*    linearHoriAdvance :: The advance width of the unhinted glyph.      */
+  /*                         Its value is expressed in 16.16 fractional    */
+  /*                         pixels, unless @FT_LOAD_LINEAR_DESIGN is set  */
+  /*                         when loading the glyph.  This field can be    */
+  /*                         important to perform correct WYSIWYG layout.  */
+  /*                         Only relevant for outline glyphs.             */
+  /*                                                                       */
+  /*    linearVertAdvance :: The advance height of the unhinted glyph.     */
+  /*                         Its value is expressed in 16.16 fractional    */
+  /*                         pixels, unless @FT_LOAD_LINEAR_DESIGN is set  */
+  /*                         when loading the glyph.  This field can be    */
+  /*                         important to perform correct WYSIWYG layout.  */
+  /*                         Only relevant for outline glyphs.             */
+  /*                                                                       */
+  /*    advance           :: This shorthand is, depending on               */
+  /*                         @FT_LOAD_IGNORE_TRANSFORM, the transformed    */
+  /*                         advance width for the glyph (in 26.6          */
+  /*                         fractional pixel format).  As specified with  */
+  /*                         @FT_LOAD_VERTICAL_LAYOUT, it uses either the  */
+  /*                         `horiAdvance' or the `vertAdvance' value of   */
+  /*                         `metrics' field.                              */
+  /*                                                                       */
+  /*    format            :: This field indicates the format of the image  */
+  /*                         contained in the glyph slot.  Typically       */
+  /*                         @FT_GLYPH_FORMAT_BITMAP,                      */
+  /*                         @FT_GLYPH_FORMAT_OUTLINE, or                  */
+  /*                         @FT_GLYPH_FORMAT_COMPOSITE, but others are    */
+  /*                         possible.                                     */
+  /*                                                                       */
+  /*    bitmap            :: This field is used as a bitmap descriptor     */
+  /*                         when the slot format is                       */
+  /*                         @FT_GLYPH_FORMAT_BITMAP.  Note that the       */
+  /*                         address and content of the bitmap buffer can  */
+  /*                         change between calls of @FT_Load_Glyph and a  */
+  /*                         few other functions.                          */
+  /*                                                                       */
+  /*    bitmap_left       :: This is the bitmap's left bearing expressed   */
+  /*                         in integer pixels.  Of course, this is only   */
+  /*                         valid if the format is                        */
+  /*                         @FT_GLYPH_FORMAT_BITMAP.                      */
+  /*                                                                       */
+  /*    bitmap_top        :: This is the bitmap's top bearing expressed in */
+  /*                         integer pixels.  Remember that this is the    */
+  /*                         distance from the baseline to the top-most    */
+  /*                         glyph scanline, upwards y~coordinates being   */
+  /*                         *positive*.                                   */
+  /*                                                                       */
+  /*    outline           :: The outline descriptor for the current glyph  */
+  /*                         image if its format is                        */
+  /*                         @FT_GLYPH_FORMAT_OUTLINE.  Once a glyph is    */
+  /*                         loaded, `outline' can be transformed,         */
+  /*                         distorted, embolded, etc.  However, it must   */
+  /*                         not be freed.                                 */
+  /*                                                                       */
+  /*    num_subglyphs     :: The number of subglyphs in a composite glyph. */
+  /*                         This field is only valid for the composite    */
+  /*                         glyph format that should normally only be     */
+  /*                         loaded with the @FT_LOAD_NO_RECURSE flag.     */
+  /*                         For now this is internal to FreeType.         */
+  /*                                                                       */
+  /*    subglyphs         :: An array of subglyph descriptors for          */
+  /*                         composite glyphs.  There are `num_subglyphs'  */
+  /*                         elements in there.  Currently internal to     */
+  /*                         FreeType.                                     */
+  /*                                                                       */
+  /*    control_data      :: Certain font drivers can also return the      */
+  /*                         control data for a given glyph image (e.g.    */
+  /*                         TrueType bytecode, Type~1 charstrings, etc.). */
+  /*                         This field is a pointer to such data.         */
+  /*                                                                       */
+  /*    control_len       :: This is the length in bytes of the control    */
+  /*                         data.                                         */
+  /*                                                                       */
+  /*    other             :: Really wicked formats can use this pointer to */
+  /*                         present their own glyph image to client       */
+  /*                         applications.  Note that the application      */
+  /*                         needs to know about the image format.         */
+  /*                                                                       */
+  /*    lsb_delta         :: The difference between hinted and unhinted    */
+  /*                         left side bearing while autohinting is        */
+  /*                         active.  Zero otherwise.                      */
+  /*                                                                       */
+  /*    rsb_delta         :: The difference between hinted and unhinted    */
+  /*                         right side bearing while autohinting is       */
+  /*                         active.  Zero otherwise.                      */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If @FT_Load_Glyph is called with default flags (see                */
+  /*    @FT_LOAD_DEFAULT) the glyph image is loaded in the glyph slot in   */
+  /*    its native format (e.g., an outline glyph for TrueType and Type~1  */
+  /*    formats).                                                          */
+  /*                                                                       */
+  /*    This image can later be converted into a bitmap by calling         */
+  /*    @FT_Render_Glyph.  This function finds the current renderer for    */
+  /*    the native image's format, then invokes it.                        */
+  /*                                                                       */
+  /*    The renderer is in charge of transforming the native image through */
+  /*    the slot's face transformation fields, then converting it into a   */
+  /*    bitmap that is returned in `slot->bitmap'.                         */
+  /*                                                                       */
+  /*    Note that `slot->bitmap_left' and `slot->bitmap_top' are also used */
+  /*    to specify the position of the bitmap relative to the current pen  */
+  /*    position (e.g., coordinates (0,0) on the baseline).  Of course,    */
+  /*    `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP.         */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Here a small pseudo code fragment which shows how to use           */
+  /*    `lsb_delta' and `rsb_delta':                                       */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      FT_Pos  origin_x       = 0;                                      */
+  /*      FT_Pos  prev_rsb_delta = 0;                                      */
+  /*                                                                       */
+  /*                                                                       */
+  /*      for all glyphs do                                                */
+  /*        <compute kern between current and previous glyph and add it to */
+  /*         `origin_x'>                                                   */
+  /*                                                                       */
+  /*        <load glyph with `FT_Load_Glyph'>                              */
+  /*                                                                       */
+  /*        if ( prev_rsb_delta - face->glyph->lsb_delta >= 32 )           */
+  /*          origin_x -= 64;                                              */
+  /*        else if ( prev_rsb_delta - face->glyph->lsb_delta < -32 )      */
+  /*          origin_x += 64;                                              */
+  /*                                                                       */
+  /*        prev_rsb_delta = face->glyph->rsb_delta;                       */
+  /*                                                                       */
+  /*        <save glyph image, or render glyph, or ...>                    */
+  /*                                                                       */
+  /*        origin_x += face->glyph->advance.x;                            */
+  /*      endfor                                                           */
+  /*    }                                                                  */
+  /*                                                                       */
+  typedef struct  FT_GlyphSlotRec_
+  {
+    FT_Library        library;
+    FT_Face           face;
+    FT_GlyphSlot      next;
+    FT_UInt           reserved;       /* retained for binary compatibility */
+    FT_Generic        generic;
+
+    FT_Glyph_Metrics  metrics;
+    FT_Fixed          linearHoriAdvance;
+    FT_Fixed          linearVertAdvance;
+    FT_Vector         advance;
+
+    FT_Glyph_Format   format;
+
+    FT_Bitmap         bitmap;
+    FT_Int            bitmap_left;
+    FT_Int            bitmap_top;
+
+    FT_Outline        outline;
+
+    FT_UInt           num_subglyphs;
+    FT_SubGlyph       subglyphs;
+
+    void*             control_data;
+    long              control_len;
+
+    FT_Pos            lsb_delta;
+    FT_Pos            rsb_delta;
+
+    void*             other;
+
+    FT_Slot_Internal  internal;
+
+  } FT_GlyphSlotRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*                                                                       */
+  /*                         F U N C T I O N S                             */
+  /*                                                                       */
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Init_FreeType                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initialize a new FreeType library object.  The set of modules      */
+  /*    that are registered by this function is determined at build time.  */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    alibrary :: A handle to a new library object.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    In case you want to provide your own memory allocating routines,   */
+  /*    use @FT_New_Library instead, followed by a call to                 */
+  /*    @FT_Add_Default_Modules (or a series of calls to @FT_Add_Module).  */
+  /*                                                                       */
+  /*    For multi-threading applications each thread should have its own   */
+  /*    FT_Library object.                                                 */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Init_FreeType( FT_Library  *alibrary );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_FreeType                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroy a given FreeType library object and all of its children,   */
+  /*    including resources, drivers, faces, sizes, etc.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to the target library object.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Done_FreeType( FT_Library  library );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_OPEN_XXX                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of bit-field constants used within the `flags' field of the */
+  /*    @FT_Open_Args structure.                                           */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_OPEN_MEMORY   :: This is a memory-based stream.                 */
+  /*                                                                       */
+  /*    FT_OPEN_STREAM   :: Copy the stream from the `stream' field.       */
+  /*                                                                       */
+  /*    FT_OPEN_PATHNAME :: Create a new input stream from a C~path        */
+  /*                        name.                                          */
+  /*                                                                       */
+  /*    FT_OPEN_DRIVER   :: Use the `driver' field.                        */
+  /*                                                                       */
+  /*    FT_OPEN_PARAMS   :: Use the `num_params' and `params' fields.      */
+  /*                                                                       */
+  /*    ft_open_memory   :: Deprecated; use @FT_OPEN_MEMORY instead.       */
+  /*                                                                       */
+  /*    ft_open_stream   :: Deprecated; use @FT_OPEN_STREAM instead.       */
+  /*                                                                       */
+  /*    ft_open_pathname :: Deprecated; use @FT_OPEN_PATHNAME instead.     */
+  /*                                                                       */
+  /*    ft_open_driver   :: Deprecated; use @FT_OPEN_DRIVER instead.       */
+  /*                                                                       */
+  /*    ft_open_params   :: Deprecated; use @FT_OPEN_PARAMS instead.       */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The `FT_OPEN_MEMORY', `FT_OPEN_STREAM', and `FT_OPEN_PATHNAME'     */
+  /*    flags are mutually exclusive.                                      */
+  /*                                                                       */
+#define FT_OPEN_MEMORY    0x1
+#define FT_OPEN_STREAM    0x2
+#define FT_OPEN_PATHNAME  0x4
+#define FT_OPEN_DRIVER    0x8
+#define FT_OPEN_PARAMS    0x10
+
+#define ft_open_memory    FT_OPEN_MEMORY     /* deprecated */
+#define ft_open_stream    FT_OPEN_STREAM     /* deprecated */
+#define ft_open_pathname  FT_OPEN_PATHNAME   /* deprecated */
+#define ft_open_driver    FT_OPEN_DRIVER     /* deprecated */
+#define ft_open_params    FT_OPEN_PARAMS     /* deprecated */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Parameter                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to pass more or less generic parameters to */
+  /*    @FT_Open_Face.                                                     */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    tag  :: A four-byte identification tag.                            */
+  /*                                                                       */
+  /*    data :: A pointer to the parameter data.                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The ID and function of parameters are driver-specific.  See the    */
+  /*    various FT_PARAM_TAG_XXX flags for more information.               */
+  /*                                                                       */
+  typedef struct  FT_Parameter_
+  {
+    FT_ULong    tag;
+    FT_Pointer  data;
+
+  } FT_Parameter;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Open_Args                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to indicate how to open a new font file or        */
+  /*    stream.  A pointer to such a structure can be used as a parameter  */
+  /*    for the functions @FT_Open_Face and @FT_Attach_Stream.             */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    flags       :: A set of bit flags indicating how to use the        */
+  /*                   structure.                                          */
+  /*                                                                       */
+  /*    memory_base :: The first byte of the file in memory.               */
+  /*                                                                       */
+  /*    memory_size :: The size in bytes of the file in memory.            */
+  /*                                                                       */
+  /*    pathname    :: A pointer to an 8-bit file pathname.                */
+  /*                                                                       */
+  /*    stream      :: A handle to a source stream object.                 */
+  /*                                                                       */
+  /*    driver      :: This field is exclusively used by @FT_Open_Face;    */
+  /*                   it simply specifies the font driver to use to open  */
+  /*                   the face.  If set to~0, FreeType tries to load the  */
+  /*                   face with each one of the drivers in its list.      */
+  /*                                                                       */
+  /*    num_params  :: The number of extra parameters.                     */
+  /*                                                                       */
+  /*    params      :: Extra parameters passed to the font driver when     */
+  /*                   opening a new face.                                 */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The stream type is determined by the contents of `flags' which     */
+  /*    are tested in the following order by @FT_Open_Face:                */
+  /*                                                                       */
+  /*    If the `FT_OPEN_MEMORY' bit is set, assume that this is a          */
+  /*    memory file of `memory_size' bytes, located at `memory_address'.   */
+  /*    The data are are not copied, and the client is responsible for     */
+  /*    releasing and destroying them _after_ the corresponding call to    */
+  /*    @FT_Done_Face.                                                     */
+  /*                                                                       */
+  /*    Otherwise, if the `FT_OPEN_STREAM' bit is set, assume that a       */
+  /*    custom input stream `stream' is used.                              */
+  /*                                                                       */
+  /*    Otherwise, if the `FT_OPEN_PATHNAME' bit is set, assume that this  */
+  /*    is a normal file and use `pathname' to open it.                    */
+  /*                                                                       */
+  /*    If the `FT_OPEN_DRIVER' bit is set, @FT_Open_Face only tries to    */
+  /*    open the file with the driver whose handler is in `driver'.        */
+  /*                                                                       */
+  /*    If the `FT_OPEN_PARAMS' bit is set, the parameters given by        */
+  /*    `num_params' and `params' is used.  They are ignored otherwise.    */
+  /*                                                                       */
+  /*    Ideally, both the `pathname' and `params' fields should be tagged  */
+  /*    as `const'; this is missing for API backwards compatibility.  In   */
+  /*    other words, applications should treat them as read-only.          */
+  /*                                                                       */
+  typedef struct  FT_Open_Args_
+  {
+    FT_UInt         flags;
+    const FT_Byte*  memory_base;
+    FT_Long         memory_size;
+    FT_String*      pathname;
+    FT_Stream       stream;
+    FT_Module       driver;
+    FT_Int          num_params;
+    FT_Parameter*   params;
+
+  } FT_Open_Args;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function calls @FT_Open_Face to open a font by its pathname.  */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library resource.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    pathname   :: A path to the font file.                             */
+  /*                                                                       */
+  /*    face_index :: The index of the face within the font.  The first    */
+  /*                  face has index~0.                                    */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aface      :: A handle to a new face object.  If `face_index' is   */
+  /*                  greater than or equal to zero, it must be non-NULL.  */
+  /*                  See @FT_Open_Face for more details.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Face( FT_Library   library,
+               const char*  filepathname,
+               FT_Long      face_index,
+               FT_Face     *aface );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Memory_Face                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function calls @FT_Open_Face to open a font which has been    */
+  /*    loaded into memory.                                                */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library resource.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    file_base  :: A pointer to the beginning of the font data.         */
+  /*                                                                       */
+  /*    file_size  :: The size of the memory chunk used by the font data.  */
+  /*                                                                       */
+  /*    face_index :: The index of the face within the font.  The first    */
+  /*                  face has index~0.                                    */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aface      :: A handle to a new face object.  If `face_index' is   */
+  /*                  greater than or equal to zero, it must be non-NULL.  */
+  /*                  See @FT_Open_Face for more details.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You must not deallocate the memory before calling @FT_Done_Face.   */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Memory_Face( FT_Library      library,
+                      const FT_Byte*  file_base,
+                      FT_Long         file_size,
+                      FT_Long         face_index,
+                      FT_Face        *aface );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Open_Face                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a face object from a given resource described by            */
+  /*    @FT_Open_Args.                                                     */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library resource.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    args       :: A pointer to an `FT_Open_Args' structure which must  */
+  /*                  be filled by the caller.                             */
+  /*                                                                       */
+  /*    face_index :: The index of the face within the font.  The first    */
+  /*                  face has index~0.                                    */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aface      :: A handle to a new face object.  If `face_index' is   */
+  /*                  greater than or equal to zero, it must be non-NULL.  */
+  /*                  See note below.                                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Unlike FreeType 1.x, this function automatically creates a glyph   */
+  /*    slot for the face object which can be accessed directly through    */
+  /*    `face->glyph'.                                                     */
+  /*                                                                       */
+  /*    FT_Open_Face can be used to quickly check whether the font         */
+  /*    format of a given font resource is supported by FreeType.  If the  */
+  /*    `face_index' field is negative, the function's return value is~0   */
+  /*    if the font format is recognized, or non-zero otherwise;           */
+  /*    the function returns a more or less empty face handle in `*aface'  */
+  /*    (if `aface' isn't NULL).  The only useful field in this special    */
+  /*    case is `face->num_faces' which gives the number of faces within   */
+  /*    the font file.  After examination, the returned @FT_Face structure */
+  /*    should be deallocated with a call to @FT_Done_Face.                */
+  /*                                                                       */
+  /*    Each new face object created with this function also owns a        */
+  /*    default @FT_Size object, accessible as `face->size'.               */
+  /*                                                                       */
+  /*    One @FT_Library instance can have multiple face objects, this is,  */
+  /*    @FT_Open_Face and its siblings can be called multiple times using  */
+  /*    the same `library' argument.                                       */
+  /*                                                                       */
+  /*    See the discussion of reference counters in the description of     */
+  /*    @FT_Reference_Face.                                                */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Open_Face( FT_Library           library,
+                const FT_Open_Args*  args,
+                FT_Long              face_index,
+                FT_Face             *aface );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Attach_File                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function calls @FT_Attach_Stream to attach a file.            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face         :: The target face object.                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    filepathname :: The pathname.                                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Attach_File( FT_Face      face,
+                  const char*  filepathname );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Attach_Stream                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    `Attach' data to a face object.  Normally, this is used to read    */
+  /*    additional information for the face object.  For example, you can  */
+  /*    attach an AFM file that comes with a Type~1 font to get the        */
+  /*    kerning values and other metrics.                                  */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: The target face object.                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    parameters :: A pointer to @FT_Open_Args which must be filled by   */
+  /*                  the caller.                                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The meaning of the `attach' (i.e., what really happens when the    */
+  /*    new file is read) is not fixed by FreeType itself.  It really      */
+  /*    depends on the font format (and thus the font driver).             */
+  /*                                                                       */
+  /*    Client applications are expected to know what they are doing       */
+  /*    when invoking this function.  Most drivers simply do not implement */
+  /*    file attachments.                                                  */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Attach_Stream( FT_Face        face,
+                    FT_Open_Args*  parameters );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Reference_Face                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A counter gets initialized to~1 at the time an @FT_Face structure  */
+  /*    is created.  This function increments the counter.  @FT_Done_Face  */
+  /*    then only destroys a face if the counter is~1, otherwise it simply */
+  /*    decrements the counter.                                            */
+  /*                                                                       */
+  /*    This function helps in managing life-cycles of structures which    */
+  /*    reference @FT_Face objects.                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to a target face object.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.4.2                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Reference_Face( FT_Face  face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_Face                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Discard a given face object, as well as all of its child slots and */
+  /*    sizes.                                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to a target face object.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    See the discussion of reference counters in the description of     */
+  /*    @FT_Reference_Face.                                                */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Done_Face( FT_Face  face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Select_Size                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Select a bitmap strike.                                            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face         :: A handle to a target face object.                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    strike_index :: The index of the bitmap strike in the              */
+  /*                    `available_sizes' field of @FT_FaceRec structure.  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Select_Size( FT_Face  face,
+                  FT_Int   strike_index );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Size_Request_Type                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration type that lists the supported size request types.   */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_SIZE_REQUEST_TYPE_NOMINAL ::                                    */
+  /*      The nominal size.  The `units_per_EM' field of @FT_FaceRec is    */
+  /*      used to determine both scaling values.                           */
+  /*                                                                       */
+  /*    FT_SIZE_REQUEST_TYPE_REAL_DIM ::                                   */
+  /*      The real dimension.  The sum of the the `ascender' and (minus    */
+  /*      of) the `descender' fields of @FT_FaceRec are used to determine  */
+  /*      both scaling values.                                             */
+  /*                                                                       */
+  /*    FT_SIZE_REQUEST_TYPE_BBOX ::                                       */
+  /*      The font bounding box.  The width and height of the `bbox' field */
+  /*      of @FT_FaceRec are used to determine the horizontal and vertical */
+  /*      scaling value, respectively.                                     */
+  /*                                                                       */
+  /*    FT_SIZE_REQUEST_TYPE_CELL ::                                       */
+  /*      The `max_advance_width' field of @FT_FaceRec is used to          */
+  /*      determine the horizontal scaling value; the vertical scaling     */
+  /*      value is determined the same way as                              */
+  /*      @FT_SIZE_REQUEST_TYPE_REAL_DIM does.  Finally, both scaling      */
+  /*      values are set to the smaller one.  This type is useful if you   */
+  /*      want to specify the font size for, say, a window of a given      */
+  /*      dimension and 80x24 cells.                                       */
+  /*                                                                       */
+  /*    FT_SIZE_REQUEST_TYPE_SCALES ::                                     */
+  /*      Specify the scaling values directly.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The above descriptions only apply to scalable formats.  For bitmap */
+  /*    formats, the behaviour is up to the driver.                        */
+  /*                                                                       */
+  /*    See the note section of @FT_Size_Metrics if you wonder how size    */
+  /*    requesting relates to scaling values.                              */
+  /*                                                                       */
+  typedef enum  FT_Size_Request_Type_
+  {
+    FT_SIZE_REQUEST_TYPE_NOMINAL,
+    FT_SIZE_REQUEST_TYPE_REAL_DIM,
+    FT_SIZE_REQUEST_TYPE_BBOX,
+    FT_SIZE_REQUEST_TYPE_CELL,
+    FT_SIZE_REQUEST_TYPE_SCALES,
+
+    FT_SIZE_REQUEST_TYPE_MAX
+
+  } FT_Size_Request_Type;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Size_RequestRec                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a size request.                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    type           :: See @FT_Size_Request_Type.                       */
+  /*                                                                       */
+  /*    width          :: The desired width.                               */
+  /*                                                                       */
+  /*    height         :: The desired height.                              */
+  /*                                                                       */
+  /*    horiResolution :: The horizontal resolution.  If set to zero,      */
+  /*                      `width' is treated as a 26.6 fractional pixel    */
+  /*                      value.                                           */
+  /*                                                                       */
+  /*    vertResolution :: The vertical resolution.  If set to zero,        */
+  /*                      `height' is treated as a 26.6 fractional pixel   */
+  /*                      value.                                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If `width' is zero, then the horizontal scaling value is set equal */
+  /*    to the vertical scaling value, and vice versa.                     */
+  /*                                                                       */
+  typedef struct  FT_Size_RequestRec_
+  {
+    FT_Size_Request_Type  type;
+    FT_Long               width;
+    FT_Long               height;
+    FT_UInt               horiResolution;
+    FT_UInt               vertResolution;
+
+  } FT_Size_RequestRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Size_Request                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a size request structure.                              */
+  /*                                                                       */
+  typedef struct FT_Size_RequestRec_  *FT_Size_Request;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Request_Size                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Resize the scale of the active @FT_Size object in a face.          */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face :: A handle to a target face object.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    req  :: A pointer to a @FT_Size_RequestRec.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Although drivers may select the bitmap strike matching the         */
+  /*    request, you should not rely on this if you intend to select a     */
+  /*    particular bitmap strike.  Use @FT_Select_Size instead in that     */
+  /*    case.                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Request_Size( FT_Face          face,
+                   FT_Size_Request  req );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Char_Size                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function calls @FT_Request_Size to request the nominal size   */
+  /*    (in points).                                                       */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face            :: A handle to a target face object.               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    char_width      :: The nominal width, in 26.6 fractional points.   */
+  /*                                                                       */
+  /*    char_height     :: The nominal height, in 26.6 fractional points.  */
+  /*                                                                       */
+  /*    horz_resolution :: The horizontal resolution in dpi.               */
+  /*                                                                       */
+  /*    vert_resolution :: The vertical resolution in dpi.                 */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If either the character width or height is zero, it is set equal   */
+  /*    to the other value.                                                */
+  /*                                                                       */
+  /*    If either the horizontal or vertical resolution is zero, it is set */
+  /*    equal to the other value.                                          */
+  /*                                                                       */
+  /*    A character width or height smaller than 1pt is set to 1pt; if     */
+  /*    both resolution values are zero, they are set to 72dpi.            */
+  /*                                                                       */
+  /*    Don't use this function if you are using the FreeType cache API.   */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Char_Size( FT_Face     face,
+                    FT_F26Dot6  char_width,
+                    FT_F26Dot6  char_height,
+                    FT_UInt     horz_resolution,
+                    FT_UInt     vert_resolution );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Pixel_Sizes                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function calls @FT_Request_Size to request the nominal size   */
+  /*    (in pixels).                                                       */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face         :: A handle to the target face object.                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    pixel_width  :: The nominal width, in pixels.                      */
+  /*                                                                       */
+  /*    pixel_height :: The nominal height, in pixels.                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Pixel_Sizes( FT_Face  face,
+                      FT_UInt  pixel_width,
+                      FT_UInt  pixel_height );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Load_Glyph                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to load a single glyph into the glyph slot of a    */
+  /*    face object.                                                       */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face        :: A handle to the target face object where the glyph  */
+  /*                   is loaded.                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    glyph_index :: The index of the glyph in the font file.  For       */
+  /*                   CID-keyed fonts (either in PS or in CFF format)     */
+  /*                   this argument specifies the CID value.              */
+  /*                                                                       */
+  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
+  /*                   @FT_LOAD_XXX constants can be used to control the   */
+  /*                   glyph loading process (e.g., whether the outline    */
+  /*                   should be scaled, whether to load bitmaps or not,   */
+  /*                   whether to hint the outline, etc).                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The loaded glyph may be transformed.  See @FT_Set_Transform for    */
+  /*    the details.                                                       */
+  /*                                                                       */
+  /*    For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument' is        */
+  /*    returned for invalid CID values (this is, for CID values which     */
+  /*    don't have a corresponding glyph in the font).  See the discussion */
+  /*    of the @FT_FACE_FLAG_CID_KEYED flag for more details.              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Load_Glyph( FT_Face   face,
+                 FT_UInt   glyph_index,
+                 FT_Int32  load_flags );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Load_Char                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to load a single glyph into the glyph slot of a    */
+  /*    face object, according to its character code.                      */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face        :: A handle to a target face object where the glyph    */
+  /*                   is loaded.                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    char_code   :: The glyph's character code, according to the        */
+  /*                   current charmap used in the face.                   */
+  /*                                                                       */
+  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
+  /*                   @FT_LOAD_XXX constants can be used to control the   */
+  /*                   glyph loading process (e.g., whether the outline    */
+  /*                   should be scaled, whether to load bitmaps or not,   */
+  /*                   whether to hint the outline, etc).                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function simply calls @FT_Get_Char_Index and @FT_Load_Glyph.  */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Load_Char( FT_Face   face,
+                FT_ULong  char_code,
+                FT_Int32  load_flags );
+
+
+  /*************************************************************************
+   *
+   * @enum:
+   *   FT_LOAD_XXX
+   *
+   * @description:
+   *   A list of bit-field constants used with @FT_Load_Glyph to indicate
+   *   what kind of operations to perform during glyph loading.
+   *
+   * @values:
+   *   FT_LOAD_DEFAULT ::
+   *     Corresponding to~0, this value is used as the default glyph load
+   *     operation.  In this case, the following happens:
+   *
+   *     1. FreeType looks for a bitmap for the glyph corresponding to the
+   *        face's current size.  If one is found, the function returns.
+   *        The bitmap data can be accessed from the glyph slot (see note
+   *        below).
+   *
+   *     2. If no embedded bitmap is searched or found, FreeType looks for a
+   *        scalable outline.  If one is found, it is loaded from the font
+   *        file, scaled to device pixels, then `hinted' to the pixel grid
+   *        in order to optimize it.  The outline data can be accessed from
+   *        the glyph slot (see note below).
+   *
+   *     Note that by default, the glyph loader doesn't render outlines into
+   *     bitmaps.  The following flags are used to modify this default
+   *     behaviour to more specific and useful cases.
+   *
+   *   FT_LOAD_NO_SCALE ::
+   *     Don't scale the outline glyph loaded, but keep it in font units.
+   *
+   *     This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and
+   *     unsets @FT_LOAD_RENDER.
+   *
+   *   FT_LOAD_NO_HINTING ::
+   *     Disable hinting.  This generally generates `blurrier' bitmap glyph
+   *     when the glyph is rendered in any of the anti-aliased modes.  See
+   *     also the note below.
+   *
+   *     This flag is implied by @FT_LOAD_NO_SCALE.
+   *
+   *   FT_LOAD_RENDER ::
+   *     Call @FT_Render_Glyph after the glyph is loaded.  By default, the
+   *     glyph is rendered in @FT_RENDER_MODE_NORMAL mode.  This can be
+   *     overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME.
+   *
+   *     This flag is unset by @FT_LOAD_NO_SCALE.
+   *
+   *   FT_LOAD_NO_BITMAP ::
+   *     Ignore bitmap strikes when loading.  Bitmap-only fonts ignore this
+   *     flag.
+   *
+   *     @FT_LOAD_NO_SCALE always sets this flag.
+   *
+   *   FT_LOAD_VERTICAL_LAYOUT ::
+   *     Load the glyph for vertical text layout.  _Don't_ use it as it is
+   *     problematic currently.
+   *
+   *   FT_LOAD_FORCE_AUTOHINT ::
+   *     Indicates that the auto-hinter is preferred over the font's native
+   *     hinter.  See also the note below.
+   *
+   *   FT_LOAD_CROP_BITMAP ::
+   *     Indicates that the font driver should crop the loaded bitmap glyph
+   *     (i.e., remove all space around its black bits).  Not all drivers
+   *     implement this.
+   *
+   *   FT_LOAD_PEDANTIC ::
+   *     Indicates that the font driver should perform pedantic verifications
+   *     during glyph loading.  This is mostly used to detect broken glyphs
+   *     in fonts.  By default, FreeType tries to handle broken fonts also.
+   *
+   *     In particular, errors from the TrueType bytecode engine are not
+   *     passed to the application if this flag is not set; this might
+   *     result in partially hinted or distorted glyphs in case a glyph's
+   *     bytecode is buggy.
+   *
+   *   FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ::
+   *     Ignored.  Deprecated.
+   *
+   *   FT_LOAD_NO_RECURSE ::
+   *     This flag is only used internally.  It merely indicates that the
+   *     font driver should not load composite glyphs recursively.  Instead,
+   *     it should set the `num_subglyph' and `subglyphs' values of the
+   *     glyph slot accordingly, and set `glyph->format' to
+   *     @FT_GLYPH_FORMAT_COMPOSITE.
+   *
+   *     The description of sub-glyphs is not available to client
+   *     applications for now.
+   *
+   *     This flag implies @FT_LOAD_NO_SCALE and @FT_LOAD_IGNORE_TRANSFORM.
+   *
+   *   FT_LOAD_IGNORE_TRANSFORM ::
+   *     Indicates that the transform matrix set by @FT_Set_Transform should
+   *     be ignored.
+   *
+   *   FT_LOAD_MONOCHROME ::
+   *     This flag is used with @FT_LOAD_RENDER to indicate that you want to
+   *     render an outline glyph to a 1-bit monochrome bitmap glyph, with
+   *     8~pixels packed into each byte of the bitmap data.
+   *
+   *     Note that this has no effect on the hinting algorithm used.  You
+   *     should rather use @FT_LOAD_TARGET_MONO so that the
+   *     monochrome-optimized hinting algorithm is used.
+   *
+   *   FT_LOAD_LINEAR_DESIGN ::
+   *     Indicates that the `linearHoriAdvance' and `linearVertAdvance'
+   *     fields of @FT_GlyphSlotRec should be kept in font units.  See
+   *     @FT_GlyphSlotRec for details.
+   *
+   *   FT_LOAD_NO_AUTOHINT ::
+   *     Disable auto-hinter.  See also the note below.
+   *
+   * @note:
+   *   By default, hinting is enabled and the font's native hinter (see
+   *   @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter.  You can
+   *   disable hinting by setting @FT_LOAD_NO_HINTING or change the
+   *   precedence by setting @FT_LOAD_FORCE_AUTOHINT.  You can also set
+   *   @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be
+   *   used at all.
+   *
+   *   See the description of @FT_FACE_FLAG_TRICKY for a special exception
+   *   (affecting only a handful of Asian fonts).
+   *
+   *   Besides deciding which hinter to use, you can also decide which
+   *   hinting algorithm to use.  See @FT_LOAD_TARGET_XXX for details.
+   *
+   */
+#define FT_LOAD_DEFAULT                      0x0
+#define FT_LOAD_NO_SCALE                     ( 1L << 0 )
+#define FT_LOAD_NO_HINTING                   ( 1L << 1 )
+#define FT_LOAD_RENDER                       ( 1L << 2 )
+#define FT_LOAD_NO_BITMAP                    ( 1L << 3 )
+#define FT_LOAD_VERTICAL_LAYOUT              ( 1L << 4 )
+#define FT_LOAD_FORCE_AUTOHINT               ( 1L << 5 )
+#define FT_LOAD_CROP_BITMAP                  ( 1L << 6 )
+#define FT_LOAD_PEDANTIC                     ( 1L << 7 )
+#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH  ( 1L << 9 )
+#define FT_LOAD_NO_RECURSE                   ( 1L << 10 )
+#define FT_LOAD_IGNORE_TRANSFORM             ( 1L << 11 )
+#define FT_LOAD_MONOCHROME                   ( 1L << 12 )
+#define FT_LOAD_LINEAR_DESIGN                ( 1L << 13 )
+#define FT_LOAD_NO_AUTOHINT                  ( 1L << 15 )
+
+  /* */
+
+  /* used internally only by certain font drivers! */
+#define FT_LOAD_ADVANCE_ONLY                 ( 1L << 8 )
+#define FT_LOAD_SBITS_ONLY                   ( 1L << 14 )
+
+
+  /**************************************************************************
+   *
+   * @enum:
+   *   FT_LOAD_TARGET_XXX
+   *
+   * @description:
+   *   A list of values that are used to select a specific hinting algorithm
+   *   to use by the hinter.  You should OR one of these values to your
+   *   `load_flags' when calling @FT_Load_Glyph.
+   *
+   *   Note that font's native hinters may ignore the hinting algorithm you
+   *   have specified (e.g., the TrueType bytecode interpreter).  You can set
+   *   @FT_LOAD_FORCE_AUTOHINT to ensure that the auto-hinter is used.
+   *
+   *   Also note that @FT_LOAD_TARGET_LIGHT is an exception, in that it
+   *   always implies @FT_LOAD_FORCE_AUTOHINT.
+   *
+   * @values:
+   *   FT_LOAD_TARGET_NORMAL ::
+   *     This corresponds to the default hinting algorithm, optimized for
+   *     standard gray-level rendering.  For monochrome output, use
+   *     @FT_LOAD_TARGET_MONO instead.
+   *
+   *   FT_LOAD_TARGET_LIGHT ::
+   *     A lighter hinting algorithm for non-monochrome modes.  Many
+   *     generated glyphs are more fuzzy but better resemble its original
+   *     shape.  A bit like rendering on Mac OS~X.
+   *
+   *     As a special exception, this target implies @FT_LOAD_FORCE_AUTOHINT.
+   *
+   *   FT_LOAD_TARGET_MONO ::
+   *     Strong hinting algorithm that should only be used for monochrome
+   *     output.  The result is probably unpleasant if the glyph is rendered
+   *     in non-monochrome modes.
+   *
+   *   FT_LOAD_TARGET_LCD ::
+   *     A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally
+   *     decimated LCD displays.
+   *
+   *   FT_LOAD_TARGET_LCD_V ::
+   *     A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically
+   *     decimated LCD displays.
+   *
+   * @note:
+   *   You should use only _one_ of the FT_LOAD_TARGET_XXX values in your
+   *   `load_flags'.  They can't be ORed.
+   *
+   *   If @FT_LOAD_RENDER is also set, the glyph is rendered in the
+   *   corresponding mode (i.e., the mode which matches the used algorithm
+   *   best) unless @FT_LOAD_MONOCHROME is set.
+   *
+   *   You can use a hinting algorithm that doesn't correspond to the same
+   *   rendering mode.  As an example, it is possible to use the `light'
+   *   hinting algorithm and have the results rendered in horizontal LCD
+   *   pixel mode, with code like
+   *
+   *     {
+   *       FT_Load_Glyph( face, glyph_index,
+   *                      load_flags | FT_LOAD_TARGET_LIGHT );
+   *
+   *       FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD );
+   *     }
+   *
+   */
+#define FT_LOAD_TARGET_( x )   ( (FT_Int32)( (x) & 15 ) << 16 )
+
+#define FT_LOAD_TARGET_NORMAL  FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL )
+#define FT_LOAD_TARGET_LIGHT   FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT  )
+#define FT_LOAD_TARGET_MONO    FT_LOAD_TARGET_( FT_RENDER_MODE_MONO   )
+#define FT_LOAD_TARGET_LCD     FT_LOAD_TARGET_( FT_RENDER_MODE_LCD    )
+#define FT_LOAD_TARGET_LCD_V   FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V  )
+
+
+  /**************************************************************************
+   *
+   * @macro:
+   *   FT_LOAD_TARGET_MODE
+   *
+   * @description:
+   *   Return the @FT_Render_Mode corresponding to a given
+   *   @FT_LOAD_TARGET_XXX value.
+   *
+   */
+#define FT_LOAD_TARGET_MODE( x )  ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Transform                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to set the transformation that is applied to glyph */
+  /*    images when they are loaded into a glyph slot through              */
+  /*    @FT_Load_Glyph.                                                    */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face   :: A handle to the source face object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    matrix :: A pointer to the transformation's 2x2 matrix.  Use~0 for */
+  /*              the identity matrix.                                     */
+  /*    delta  :: A pointer to the translation vector.  Use~0 for the null */
+  /*              vector.                                                  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The transformation is only applied to scalable image formats after */
+  /*    the glyph has been loaded.  It means that hinting is unaltered by  */
+  /*    the transformation and is performed on the character size given in */
+  /*    the last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes.         */
+  /*                                                                       */
+  /*    Note that this also transforms the `face.glyph.advance' field, but */
+  /*    *not* the values in `face.glyph.metrics'.                          */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Set_Transform( FT_Face     face,
+                    FT_Matrix*  matrix,
+                    FT_Vector*  delta );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Render_Mode                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration type that lists the render modes supported by       */
+  /*    FreeType~2.  Each mode corresponds to a specific type of scanline  */
+  /*    conversion performed on the outline.                               */
+  /*                                                                       */
+  /*    For bitmap fonts and embedded bitmaps the `bitmap->pixel_mode'     */
+  /*    field in the @FT_GlyphSlotRec structure gives the format of the    */
+  /*    returned bitmap.                                                   */
+  /*                                                                       */
+  /*    All modes except @FT_RENDER_MODE_MONO use 256 levels of opacity.   */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_RENDER_MODE_NORMAL ::                                           */
+  /*      This is the default render mode; it corresponds to 8-bit         */
+  /*      anti-aliased bitmaps.                                            */
+  /*                                                                       */
+  /*    FT_RENDER_MODE_LIGHT ::                                            */
+  /*      This is equivalent to @FT_RENDER_MODE_NORMAL.  It is only        */
+  /*      defined as a separate value because render modes are also used   */
+  /*      indirectly to define hinting algorithm selectors.  See           */
+  /*      @FT_LOAD_TARGET_XXX for details.                                 */
+  /*                                                                       */
+  /*    FT_RENDER_MODE_MONO ::                                             */
+  /*      This mode corresponds to 1-bit bitmaps (with 2~levels of         */
+  /*      opacity).                                                        */
+  /*                                                                       */
+  /*    FT_RENDER_MODE_LCD ::                                              */
+  /*      This mode corresponds to horizontal RGB and BGR sub-pixel        */
+  /*      displays like LCD screens.  It produces 8-bit bitmaps that are   */
+  /*      3~times the width of the original glyph outline in pixels, and   */
+  /*      which use the @FT_PIXEL_MODE_LCD mode.                           */
+  /*                                                                       */
+  /*    FT_RENDER_MODE_LCD_V ::                                            */
+  /*      This mode corresponds to vertical RGB and BGR sub-pixel displays */
+  /*      (like PDA screens, rotated LCD displays, etc.).  It produces     */
+  /*      8-bit bitmaps that are 3~times the height of the original        */
+  /*      glyph outline in pixels and use the @FT_PIXEL_MODE_LCD_V mode.   */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The LCD-optimized glyph bitmaps produced by FT_Render_Glyph can be */
+  /*    filtered to reduce color-fringes by using @FT_Library_SetLcdFilter */
+  /*    (not active in the default builds).  It is up to the caller to     */
+  /*    either call @FT_Library_SetLcdFilter (if available) or do the      */
+  /*    filtering itself.                                                  */
+  /*                                                                       */
+  /*    The selected render mode only affects vector glyphs of a font.     */
+  /*    Embedded bitmaps often have a different pixel mode like            */
+  /*    @FT_PIXEL_MODE_MONO.  You can use @FT_Bitmap_Convert to transform  */
+  /*    them into 8-bit pixmaps.                                           */
+  /*                                                                       */
+  typedef enum  FT_Render_Mode_
+  {
+    FT_RENDER_MODE_NORMAL = 0,
+    FT_RENDER_MODE_LIGHT,
+    FT_RENDER_MODE_MONO,
+    FT_RENDER_MODE_LCD,
+    FT_RENDER_MODE_LCD_V,
+
+    FT_RENDER_MODE_MAX
+
+  } FT_Render_Mode;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    ft_render_mode_xxx                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    These constants are deprecated.  Use the corresponding             */
+  /*    @FT_Render_Mode values instead.                                    */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    ft_render_mode_normal :: see @FT_RENDER_MODE_NORMAL                */
+  /*    ft_render_mode_mono   :: see @FT_RENDER_MODE_MONO                  */
+  /*                                                                       */
+#define ft_render_mode_normal  FT_RENDER_MODE_NORMAL
+#define ft_render_mode_mono    FT_RENDER_MODE_MONO
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Render_Glyph                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Convert a given glyph image to a bitmap.  It does so by inspecting */
+  /*    the glyph image format, finding the relevant renderer, and         */
+  /*    invoking it.                                                       */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    slot        :: A handle to the glyph slot containing the image to  */
+  /*                   convert.                                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    render_mode :: This is the render mode used to render the glyph    */
+  /*                   image into a bitmap.  See @FT_Render_Mode for a     */
+  /*                   list of possible values.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Render_Glyph( FT_GlyphSlot    slot,
+                   FT_Render_Mode  render_mode );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Kerning_Mode                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration used to specify which kerning values to return in   */
+  /*    @FT_Get_Kerning.                                                   */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_KERNING_DEFAULT  :: Return scaled and grid-fitted kerning       */
+  /*                           distances (value is~0).                     */
+  /*                                                                       */
+  /*    FT_KERNING_UNFITTED :: Return scaled but un-grid-fitted kerning    */
+  /*                           distances.                                  */
+  /*                                                                       */
+  /*    FT_KERNING_UNSCALED :: Return the kerning vector in original font  */
+  /*                           units.                                      */
+  /*                                                                       */
+  typedef enum  FT_Kerning_Mode_
+  {
+    FT_KERNING_DEFAULT  = 0,
+    FT_KERNING_UNFITTED,
+    FT_KERNING_UNSCALED
+
+  } FT_Kerning_Mode;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Const>                                                               */
+  /*    ft_kerning_default                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This constant is deprecated.  Please use @FT_KERNING_DEFAULT       */
+  /*    instead.                                                           */
+  /*                                                                       */
+#define ft_kerning_default   FT_KERNING_DEFAULT
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Const>                                                               */
+  /*    ft_kerning_unfitted                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This constant is deprecated.  Please use @FT_KERNING_UNFITTED      */
+  /*    instead.                                                           */
+  /*                                                                       */
+#define ft_kerning_unfitted  FT_KERNING_UNFITTED
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Const>                                                               */
+  /*    ft_kerning_unscaled                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This constant is deprecated.  Please use @FT_KERNING_UNSCALED      */
+  /*    instead.                                                           */
+  /*                                                                       */
+#define ft_kerning_unscaled  FT_KERNING_UNSCALED
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Kerning                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the kerning vector between two glyphs of a same face.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face        :: A handle to a source face object.                   */
+  /*                                                                       */
+  /*    left_glyph  :: The index of the left glyph in the kern pair.       */
+  /*                                                                       */
+  /*    right_glyph :: The index of the right glyph in the kern pair.      */
+  /*                                                                       */
+  /*    kern_mode   :: See @FT_Kerning_Mode for more information.          */
+  /*                   Determines the scale and dimension of the returned  */
+  /*                   kerning vector.                                     */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    akerning    :: The kerning vector.  This is either in font units   */
+  /*                   or in pixels (26.6 format) for scalable formats,    */
+  /*                   and in pixels for fixed-sizes formats.              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only horizontal layouts (left-to-right & right-to-left) are        */
+  /*    supported by this method.  Other layouts, or more sophisticated    */
+  /*    kernings, are out of the scope of this API function -- they can be */
+  /*    implemented through format-specific interfaces.                    */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Kerning( FT_Face     face,
+                  FT_UInt     left_glyph,
+                  FT_UInt     right_glyph,
+                  FT_UInt     kern_mode,
+                  FT_Vector  *akerning );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Track_Kerning                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the track kerning for a given face object at a given size.  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face       :: A handle to a source face object.                    */
+  /*                                                                       */
+  /*    point_size :: The point size in 16.16 fractional points.           */
+  /*                                                                       */
+  /*    degree     :: The degree of tightness.  Increasingly negative      */
+  /*                  values represent tighter track kerning, while        */
+  /*                  increasingly positive values represent looser track  */
+  /*                  kerning.  Value zero means no track kerning.         */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    akerning   :: The kerning in 16.16 fractional points, to be        */
+  /*                  uniformly applied between all glyphs.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Currently, only the Type~1 font driver supports track kerning,     */
+  /*    using data from AFM files (if attached with @FT_Attach_File or     */
+  /*    @FT_Attach_Stream).                                                */
+  /*                                                                       */
+  /*    Only very few AFM files come with track kerning data; please refer */
+  /*    to the Adobe's AFM specification for more details.                 */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Track_Kerning( FT_Face    face,
+                        FT_Fixed   point_size,
+                        FT_Int     degree,
+                        FT_Fixed*  akerning );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Glyph_Name                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the ASCII name of a given glyph in a face.  This only     */
+  /*    works for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1.   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face        :: A handle to a source face object.                   */
+  /*                                                                       */
+  /*    glyph_index :: The glyph index.                                    */
+  /*                                                                       */
+  /*    buffer_max  :: The maximal number of bytes available in the        */
+  /*                   buffer.                                             */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    buffer      :: A pointer to a target buffer where the name is      */
+  /*                   copied to.                                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    An error is returned if the face doesn't provide glyph names or if */
+  /*    the glyph index is invalid.  In all cases of failure, the first    */
+  /*    byte of `buffer' is set to~0 to indicate an empty name.            */
+  /*                                                                       */
+  /*    The glyph name is truncated to fit within the buffer if it is too  */
+  /*    long.  The returned string is always zero-terminated.              */
+  /*                                                                       */
+  /*    Be aware that FreeType reorders glyph indices internally so that   */
+  /*    glyph index~0 always corresponds to the `missing glyph' (called    */
+  /*    `.notdef').                                                        */
+  /*                                                                       */
+  /*    This function is not compiled within the library if the config     */
+  /*    macro `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is defined in              */
+  /*    `include/freetype/config/ftoptions.h'.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Glyph_Name( FT_Face     face,
+                     FT_UInt     glyph_index,
+                     FT_Pointer  buffer,
+                     FT_UInt     buffer_max );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Postscript_Name                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the ASCII PostScript name of a given face, if available.  */
+  /*    This only works with PostScript and TrueType fonts.                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the source face object.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A pointer to the face's PostScript name.  NULL if unavailable.     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The returned pointer is owned by the face and is destroyed with    */
+  /*    it.                                                                */
+  /*                                                                       */
+  FT_EXPORT( const char* )
+  FT_Get_Postscript_Name( FT_Face  face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Select_Charmap                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Select a given charmap by its encoding tag (as listed in           */
+  /*    `freetype.h').                                                     */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face     :: A handle to the source face object.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    encoding :: A handle to the selected encoding.                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function returns an error if no charmap in the face           */
+  /*    corresponds to the encoding queried here.                          */
+  /*                                                                       */
+  /*    Because many fonts contain more than a single cmap for Unicode     */
+  /*    encoding, this function has some special code to select the one    */
+  /*    which covers Unicode best (`best' in the sense that a UCS-4 cmap   */
+  /*    is preferred to a UCS-2 cmap).  It is thus preferable to           */
+  /*    @FT_Set_Charmap in this case.                                      */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Select_Charmap( FT_Face      face,
+                     FT_Encoding  encoding );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Charmap                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Select a given charmap for character code to glyph index mapping.  */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face    :: A handle to the source face object.                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    charmap :: A handle to the selected charmap.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function returns an error if the charmap is not part of       */
+  /*    the face (i.e., if it is not listed in the `face->charmaps'        */
+  /*    table).                                                            */
+  /*                                                                       */
+  /*    It also fails if a type~14 charmap is selected.                    */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Charmap( FT_Face     face,
+                  FT_CharMap  charmap );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Get_Charmap_Index
+   *
+   * @description:
+   *   Retrieve index of a given charmap.
+   *
+   * @input:
+   *   charmap ::
+   *     A handle to a charmap.
+   *
+   * @return:
+   *   The index into the array of character maps within the face to which
+   *   `charmap' belongs.  If an error occurs, -1 is returned.
+   *
+   */
+  FT_EXPORT( FT_Int )
+  FT_Get_Charmap_Index( FT_CharMap  charmap );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Char_Index                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the glyph index of a given character code.  This function   */
+  /*    uses a charmap object to do the mapping.                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face     :: A handle to the source face object.                    */
+  /*                                                                       */
+  /*    charcode :: The character code.                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The glyph index.  0~means `undefined character code'.              */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If you use FreeType to manipulate the contents of font files       */
+  /*    directly, be aware that the glyph index returned by this function  */
+  /*    doesn't always correspond to the internal indices used within      */
+  /*    the file.  This is done to ensure that value~0 always corresponds  */
+  /*    to the `missing glyph'.                                            */
+  /*                                                                       */
+  FT_EXPORT( FT_UInt )
+  FT_Get_Char_Index( FT_Face   face,
+                     FT_ULong  charcode );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_First_Char                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used to return the first character code in the    */
+  /*    current charmap of a given face.  It also returns the              */
+  /*    corresponding glyph index.                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face    :: A handle to the source face object.                     */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    agindex :: Glyph index of first character code.  0~if charmap is   */
+  /*               empty.                                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The charmap's first character code.                                */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You should use this function with @FT_Get_Next_Char to be able to  */
+  /*    parse all character codes available in a given charmap.  The code  */
+  /*    should look like this:                                             */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      FT_ULong  charcode;                                              */
+  /*      FT_UInt   gindex;                                                */
+  /*                                                                       */
+  /*                                                                       */
+  /*      charcode = FT_Get_First_Char( face, &gindex );                   */
+  /*      while ( gindex != 0 )                                            */
+  /*      {                                                                */
+  /*        ... do something with (charcode,gindex) pair ...               */
+  /*                                                                       */
+  /*        charcode = FT_Get_Next_Char( face, charcode, &gindex );        */
+  /*      }                                                                */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    Note that `*agindex' is set to~0 if the charmap is empty.  The     */
+  /*    result itself can be~0 in two cases: if the charmap is empty or    */
+  /*    if the value~0 is the first valid character code.                  */
+  /*                                                                       */
+  FT_EXPORT( FT_ULong )
+  FT_Get_First_Char( FT_Face   face,
+                     FT_UInt  *agindex );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Next_Char                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used to return the next character code in the     */
+  /*    current charmap of a given face following the value `char_code',   */
+  /*    as well as the corresponding glyph index.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face      :: A handle to the source face object.                   */
+  /*    char_code :: The starting character code.                          */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    agindex   :: Glyph index of next character code.  0~if charmap     */
+  /*                 is empty.                                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The charmap's next character code.                                 */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You should use this function with @FT_Get_First_Char to walk       */
+  /*    over all character codes available in a given charmap.  See the    */
+  /*    note for this function for a simple code example.                  */
+  /*                                                                       */
+  /*    Note that `*agindex' is set to~0 when there are no more codes in   */
+  /*    the charmap.                                                       */
+  /*                                                                       */
+  FT_EXPORT( FT_ULong )
+  FT_Get_Next_Char( FT_Face    face,
+                    FT_ULong   char_code,
+                    FT_UInt   *agindex );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Name_Index                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the glyph index of a given glyph name.  This function uses  */
+  /*    driver specific objects to do the translation.                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face       :: A handle to the source face object.                  */
+  /*                                                                       */
+  /*    glyph_name :: The glyph name.                                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The glyph index.  0~means `undefined character code'.              */
+  /*                                                                       */
+  FT_EXPORT( FT_UInt )
+  FT_Get_Name_Index( FT_Face     face,
+                     FT_String*  glyph_name );
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_SUBGLYPH_FLAG_XXX
+   *
+   * @description:
+   *   A list of constants used to describe subglyphs.  Please refer to the
+   *   TrueType specification for the meaning of the various flags.
+   *
+   * @values:
+   *   FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS ::
+   *   FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ::
+   *   FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID ::
+   *   FT_SUBGLYPH_FLAG_SCALE ::
+   *   FT_SUBGLYPH_FLAG_XY_SCALE ::
+   *   FT_SUBGLYPH_FLAG_2X2 ::
+   *   FT_SUBGLYPH_FLAG_USE_MY_METRICS ::
+   *
+   */
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS          1
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES      2
+#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID        4
+#define FT_SUBGLYPH_FLAG_SCALE                   8
+#define FT_SUBGLYPH_FLAG_XY_SCALE             0x40
+#define FT_SUBGLYPH_FLAG_2X2                  0x80
+#define FT_SUBGLYPH_FLAG_USE_MY_METRICS      0x200
+
+
+  /*************************************************************************
+   *
+   * @func:
+   *   FT_Get_SubGlyph_Info
+   *
+   * @description:
+   *   Retrieve a description of a given subglyph.  Only use it if
+   *   `glyph->format' is @FT_GLYPH_FORMAT_COMPOSITE; an error is
+   *   returned otherwise.
+   *
+   * @input:
+   *   glyph ::
+   *     The source glyph slot.
+   *
+   *   sub_index ::
+   *     The index of the subglyph.  Must be less than
+   *     `glyph->num_subglyphs'.
+   *
+   * @output:
+   *   p_index ::
+   *     The glyph index of the subglyph.
+   *
+   *   p_flags ::
+   *     The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX.
+   *
+   *   p_arg1 ::
+   *     The subglyph's first argument (if any).
+   *
+   *   p_arg2 ::
+   *     The subglyph's second argument (if any).
+   *
+   *   p_transform ::
+   *     The subglyph transformation (if any).
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   The values of `*p_arg1', `*p_arg2', and `*p_transform' must be
+   *   interpreted depending on the flags returned in `*p_flags'.  See the
+   *   TrueType specification for details.
+   *
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_SubGlyph_Info( FT_GlyphSlot  glyph,
+                        FT_UInt       sub_index,
+                        FT_Int       *p_index,
+                        FT_UInt      *p_flags,
+                        FT_Int       *p_arg1,
+                        FT_Int       *p_arg2,
+                        FT_Matrix    *p_transform );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_FSTYPE_XXX                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of bit flags used in the `fsType' field of the OS/2 table   */
+  /*    in a TrueType or OpenType font and the `FSType' entry in a         */
+  /*    PostScript font.  These bit flags are returned by                  */
+  /*    @FT_Get_FSType_Flags; they inform client applications of embedding */
+  /*    and subsetting restrictions associated with a font.                */
+  /*                                                                       */
+  /*    See http://www.adobe.com/devnet/acrobat/pdfs/FontPolicies.pdf for  */
+  /*    more details.                                                      */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_FSTYPE_INSTALLABLE_EMBEDDING ::                                 */
+  /*      Fonts with no fsType bit set may be embedded and permanently     */
+  /*      installed on the remote system by an application.                */
+  /*                                                                       */
+  /*    FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING ::                          */
+  /*      Fonts that have only this bit set must not be modified, embedded */
+  /*      or exchanged in any manner without first obtaining permission of */
+  /*      the font software copyright owner.                               */
+  /*                                                                       */
+  /*    FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING ::                           */
+  /*      If this bit is set, the font may be embedded and temporarily     */
+  /*      loaded on the remote system.  Documents containing Preview &     */
+  /*      Print fonts must be opened `read-only'; no edits can be applied  */
+  /*      to the document.                                                 */
+  /*                                                                       */
+  /*    FT_FSTYPE_EDITABLE_EMBEDDING ::                                    */
+  /*      If this bit is set, the font may be embedded but must only be    */
+  /*      installed temporarily on other systems.  In contrast to Preview  */
+  /*      & Print fonts, documents containing editable fonts may be opened */
+  /*      for reading, editing is permitted, and changes may be saved.     */
+  /*                                                                       */
+  /*    FT_FSTYPE_NO_SUBSETTING ::                                         */
+  /*      If this bit is set, the font may not be subsetted prior to       */
+  /*      embedding.                                                       */
+  /*                                                                       */
+  /*    FT_FSTYPE_BITMAP_EMBEDDING_ONLY ::                                 */
+  /*      If this bit is set, only bitmaps contained in the font may be    */
+  /*      embedded; no outline data may be embedded.  If there are no      */
+  /*      bitmaps available in the font, then the font is unembeddable.    */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    While the fsType flags can indicate that a font may be embedded, a */
+  /*    license with the font vendor may be separately required to use the */
+  /*    font in this way.                                                  */
+  /*                                                                       */
+#define FT_FSTYPE_INSTALLABLE_EMBEDDING         0x0000
+#define FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING  0x0002
+#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING   0x0004
+#define FT_FSTYPE_EDITABLE_EMBEDDING            0x0008
+#define FT_FSTYPE_NO_SUBSETTING                 0x0100
+#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY         0x0200
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_FSType_Flags                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the fsType flags for a font.                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the source face object.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The fsType flags, @FT_FSTYPE_XXX.                                  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Use this function rather than directly reading the `fs_type' field */
+  /*    in the @PS_FontInfoRec structure which is only guaranteed to       */
+  /*    return the correct results for Type~1 fonts.                       */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.3.8                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_UShort )
+  FT_Get_FSType_Flags( FT_Face  face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    glyph_variants                                                     */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Glyph Variants                                                     */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    The FreeType~2 interface to Unicode Ideographic Variation          */
+  /*    Sequences (IVS), using the SFNT cmap format~14.                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Many CJK characters have variant forms.  They are a sort of grey   */
+  /*    area somewhere between being totally irrelevant and semantically   */
+  /*    distinct; for this reason, the Unicode consortium decided to       */
+  /*    introduce Ideographic Variation Sequences (IVS), consisting of a   */
+  /*    Unicode base character and one of 240 variant selectors            */
+  /*    (U+E0100-U+E01EF), instead of further extending the already huge   */
+  /*    code range for CJK characters.                                     */
+  /*                                                                       */
+  /*    An IVS is registered and unique; for further details please refer  */
+  /*    to Unicode Technical Report #37, the Ideographic Variation         */
+  /*    Database.  To date (October 2007), the character with the most     */
+  /*    variants is U+908A, having 8~such IVS.                             */
+  /*                                                                       */
+  /*    Adobe and MS decided to support IVS with a new cmap subtable       */
+  /*    (format~14).  It is an odd subtable because it is not a mapping of */
+  /*    input code points to glyphs, but contains lists of all variants    */
+  /*    supported by the font.                                             */
+  /*                                                                       */
+  /*    A variant may be either `default' or `non-default'.  A default     */
+  /*    variant is the one you will get for that code point if you look it */
+  /*    up in the standard Unicode cmap.  A non-default variant is a       */
+  /*    different glyph.                                                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Face_GetCharVariantIndex                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the glyph index of a given character code as modified by    */
+  /*    the variation selector.                                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face ::                                                            */
+  /*      A handle to the source face object.                              */
+  /*                                                                       */
+  /*    charcode ::                                                        */
+  /*      The character code point in Unicode.                             */
+  /*                                                                       */
+  /*    variantSelector ::                                                 */
+  /*      The Unicode code point of the variation selector.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The glyph index.  0~means either `undefined character code', or    */
+  /*    `undefined selector code', or `no variation selector cmap          */
+  /*    subtable', or `current CharMap is not Unicode'.                    */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If you use FreeType to manipulate the contents of font files       */
+  /*    directly, be aware that the glyph index returned by this function  */
+  /*    doesn't always correspond to the internal indices used within      */
+  /*    the file.  This is done to ensure that value~0 always corresponds  */
+  /*    to the `missing glyph'.                                            */
+  /*                                                                       */
+  /*    This function is only meaningful if                                */
+  /*      a) the font has a variation selector cmap sub table,             */
+  /*    and                                                                */
+  /*      b) the current charmap has a Unicode encoding.                   */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.3.6                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_UInt )
+  FT_Face_GetCharVariantIndex( FT_Face   face,
+                               FT_ULong  charcode,
+                               FT_ULong  variantSelector );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Face_GetCharVariantIsDefault                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Check whether this variant of this Unicode character is the one to */
+  /*    be found in the `cmap'.                                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face ::                                                            */
+  /*      A handle to the source face object.                              */
+  /*                                                                       */
+  /*    charcode ::                                                        */
+  /*      The character codepoint in Unicode.                              */
+  /*                                                                       */
+  /*    variantSelector ::                                                 */
+  /*      The Unicode codepoint of the variation selector.                 */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    1~if found in the standard (Unicode) cmap, 0~if found in the       */
+  /*    variation selector cmap, or -1 if it is not a variant.             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function is only meaningful if the font has a variation       */
+  /*    selector cmap subtable.                                            */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.3.6                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Int )
+  FT_Face_GetCharVariantIsDefault( FT_Face   face,
+                                   FT_ULong  charcode,
+                                   FT_ULong  variantSelector );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Face_GetVariantSelectors                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return a zero-terminated list of Unicode variant selectors found   */
+  /*    in the font.                                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face ::                                                            */
+  /*      A handle to the source face object.                              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A pointer to an array of selector code points, or NULL if there is */
+  /*    no valid variant selector cmap subtable.                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The last item in the array is~0; the array is owned by the         */
+  /*    @FT_Face object but can be overwritten or released on the next     */
+  /*    call to a FreeType function.                                       */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.3.6                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_UInt32* )
+  FT_Face_GetVariantSelectors( FT_Face  face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Face_GetVariantsOfChar                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return a zero-terminated list of Unicode variant selectors found   */
+  /*    for the specified character code.                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face ::                                                            */
+  /*      A handle to the source face object.                              */
+  /*                                                                       */
+  /*    charcode ::                                                        */
+  /*      The character codepoint in Unicode.                              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A pointer to an array of variant selector code points which are    */
+  /*    active for the given character, or NULL if the corresponding list  */
+  /*    is empty.                                                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The last item in the array is~0; the array is owned by the         */
+  /*    @FT_Face object but can be overwritten or released on the next     */
+  /*    call to a FreeType function.                                       */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.3.6                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_UInt32* )
+  FT_Face_GetVariantsOfChar( FT_Face   face,
+                             FT_ULong  charcode );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Face_GetCharsOfVariant                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return a zero-terminated list of Unicode character codes found for */
+  /*    the specified variant selector.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face ::                                                            */
+  /*      A handle to the source face object.                              */
+  /*                                                                       */
+  /*    variantSelector ::                                                 */
+  /*      The variant selector code point in Unicode.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A list of all the code points which are specified by this selector */
+  /*    (both default and non-default codes are returned) or NULL if there */
+  /*    is no valid cmap or the variant selector is invalid.               */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The last item in the array is~0; the array is owned by the         */
+  /*    @FT_Face object but can be overwritten or released on the next     */
+  /*    call to a FreeType function.                                       */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.3.6                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_UInt32* )
+  FT_Face_GetCharsOfVariant( FT_Face   face,
+                             FT_ULong  variantSelector );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    computations                                                       */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Computations                                                       */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Crunching fixed numbers and vectors.                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains various functions used to perform            */
+  /*    computations on 16.16 fixed-float numbers or 2d vectors.           */
+  /*                                                                       */
+  /* <Order>                                                               */
+  /*    FT_MulDiv                                                          */
+  /*    FT_MulFix                                                          */
+  /*    FT_DivFix                                                          */
+  /*    FT_RoundFix                                                        */
+  /*    FT_CeilFix                                                         */
+  /*    FT_FloorFix                                                        */
+  /*    FT_Vector_Transform                                                */
+  /*    FT_Matrix_Multiply                                                 */
+  /*    FT_Matrix_Invert                                                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_MulDiv                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A very simple function used to perform the computation `(a*b)/c'   */
+  /*    with maximal accuracy (it uses a 64-bit intermediate integer       */
+  /*    whenever necessary).                                               */
+  /*                                                                       */
+  /*    This function isn't necessarily as fast as some processor specific */
+  /*    operations, but is at least completely portable.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    a :: The first multiplier.                                         */
+  /*    b :: The second multiplier.                                        */
+  /*    c :: The divisor.                                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `(a*b)/c'.  This function never traps when trying to */
+  /*    divide by zero; it simply returns `MaxInt' or `MinInt' depending   */
+  /*    on the signs of `a' and `b'.                                       */
+  /*                                                                       */
+  FT_EXPORT( FT_Long )
+  FT_MulDiv( FT_Long  a,
+             FT_Long  b,
+             FT_Long  c );
+
+
+  /* */
+
+  /* The following #if 0 ... #endif is for the documentation formatter, */
+  /* hiding the internal `FT_MULFIX_INLINED' macro.                     */
+
+#if 0
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_MulFix                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A very simple function used to perform the computation             */
+  /*    `(a*b)/0x10000' with maximal accuracy.  Most of the time this is   */
+  /*    used to multiply a given value by a 16.16 fixed float factor.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    a :: The first multiplier.                                         */
+  /*    b :: The second multiplier.  Use a 16.16 factor here whenever      */
+  /*         possible (see note below).                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `(a*b)/0x10000'.                                     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function has been optimized for the case where the absolute   */
+  /*    value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */
+  /*    As this happens mainly when scaling from notional units to         */
+  /*    fractional pixels in FreeType, it resulted in noticeable speed     */
+  /*    improvements between versions 2.x and 1.x.                         */
+  /*                                                                       */
+  /*    As a conclusion, always try to place a 16.16 factor as the         */
+  /*    _second_ argument of this function; this can make a great          */
+  /*    difference.                                                        */
+  /*                                                                       */
+  FT_EXPORT( FT_Long )
+  FT_MulFix( FT_Long  a,
+             FT_Long  b );
+
+  /* */
+#endif
+
+#ifdef FT_MULFIX_INLINED
+#define FT_MulFix( a, b )  FT_MULFIX_INLINED( a, b )
+#else
+  FT_EXPORT( FT_Long )
+  FT_MulFix( FT_Long  a,
+             FT_Long  b );
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_DivFix                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A very simple function used to perform the computation             */
+  /*    `(a*0x10000)/b' with maximal accuracy.  Most of the time, this is  */
+  /*    used to divide a given value by a 16.16 fixed float factor.        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    a :: The first multiplier.                                         */
+  /*    b :: The second multiplier.  Use a 16.16 factor here whenever      */
+  /*         possible (see note below).                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `(a*0x10000)/b'.                                     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The optimization for FT_DivFix() is simple: If (a~<<~16) fits in   */
+  /*    32~bits, then the division is computed directly.  Otherwise, we    */
+  /*    use a specialized version of @FT_MulDiv.                           */
+  /*                                                                       */
+  FT_EXPORT( FT_Long )
+  FT_DivFix( FT_Long  a,
+             FT_Long  b );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_RoundFix                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A very simple function used to round a 16.16 fixed number.         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    a :: The number to be rounded.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `(a + 0x8000) & -0x10000'.                           */
+  /*                                                                       */
+  FT_EXPORT( FT_Fixed )
+  FT_RoundFix( FT_Fixed  a );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_CeilFix                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A very simple function used to compute the ceiling function of a   */
+  /*    16.16 fixed number.                                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    a :: The number for which the ceiling function is to be computed.  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `(a + 0x10000 - 1) & -0x10000'.                      */
+  /*                                                                       */
+  FT_EXPORT( FT_Fixed )
+  FT_CeilFix( FT_Fixed  a );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_FloorFix                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A very simple function used to compute the floor function of a     */
+  /*    16.16 fixed number.                                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    a :: The number for which the floor function is to be computed.    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `a & -0x10000'.                                      */
+  /*                                                                       */
+  FT_EXPORT( FT_Fixed )
+  FT_FloorFix( FT_Fixed  a );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Vector_Transform                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Transform a single vector through a 2x2 matrix.                    */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    vector :: The target vector to transform.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    matrix :: A pointer to the source 2x2 matrix.                      */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The result is undefined if either `vector' or `matrix' is invalid. */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Vector_Transform( FT_Vector*        vec,
+                       const FT_Matrix*  matrix );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    version                                                            */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    FreeType Version                                                   */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Functions and macros related to FreeType versions.                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Note that those functions and macros are of limited use because    */
+  /*    even a new release of FreeType with only documentation changes     */
+  /*    increases the version number.                                      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @enum:
+   *   FREETYPE_XXX
+   *
+   * @description:
+   *   These three macros identify the FreeType source code version.
+   *   Use @FT_Library_Version to access them at runtime.
+   *
+   * @values:
+   *   FREETYPE_MAJOR :: The major version number.
+   *   FREETYPE_MINOR :: The minor version number.
+   *   FREETYPE_PATCH :: The patch level.
+   *
+   * @note:
+   *   The version number of FreeType if built as a dynamic link library
+   *   with the `libtool' package is _not_ controlled by these three
+   *   macros.
+   *
+   */
+#define FREETYPE_MAJOR  2
+#define FREETYPE_MINOR  4
+#define FREETYPE_PATCH  9
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Library_Version                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the version of the FreeType library being used.  This is    */
+  /*    useful when dynamically linking to the library, since one cannot   */
+  /*    use the macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and               */
+  /*    @FREETYPE_PATCH.                                                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A source library handle.                                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    amajor  :: The major version number.                               */
+  /*                                                                       */
+  /*    aminor  :: The minor version number.                               */
+  /*                                                                       */
+  /*    apatch  :: The patch version number.                               */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The reason why this function takes a `library' argument is because */
+  /*    certain programs implement library initialization in a custom way  */
+  /*    that doesn't use @FT_Init_FreeType.                                */
+  /*                                                                       */
+  /*    In such cases, the library version might not be available before   */
+  /*    the library object has been created.                               */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Library_Version( FT_Library   library,
+                      FT_Int      *amajor,
+                      FT_Int      *aminor,
+                      FT_Int      *apatch );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Face_CheckTrueTypePatents                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Parse all bytecode instructions of a TrueType font file to check   */
+  /*    whether any of the patented opcodes are used.  This is only useful */
+  /*    if you want to be able to use the unpatented hinter with           */
+  /*    fonts that do *not* use these opcodes.                             */
+  /*                                                                       */
+  /*    Note that this function parses *all* glyph instructions in the     */
+  /*    font file, which may be slow.                                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A face handle.                                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    1~if this is a TrueType font that uses one of the patented         */
+  /*    opcodes, 0~otherwise.                                              */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Since May 2010, TrueType hinting is no longer patented.            */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.3.5                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Bool )
+  FT_Face_CheckTrueTypePatents( FT_Face  face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Face_SetUnpatentedHinting                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Enable or disable the unpatented hinter for a given face.          */
+  /*    Only enable it if you have determined that the face doesn't        */
+  /*    use any patented opcodes (see @FT_Face_CheckTrueTypePatents).      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face  :: A face handle.                                            */
+  /*                                                                       */
+  /*    value :: New boolean setting.                                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The old setting value.  This will always be false if this is not   */
+  /*    an SFNT font, or if the unpatented hinter is not compiled in this  */
+  /*    instance of the library.                                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Since May 2010, TrueType hinting is no longer patented.            */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.3.5                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Bool )
+  FT_Face_SetUnpatentedHinting( FT_Face  face,
+                                FT_Bool  value );
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FREETYPE_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftadvanc.h b/include/freetype/ftadvanc.h
new file mode 100644 (file)
index 0000000..b2451be
--- /dev/null
@@ -0,0 +1,179 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftadvanc.h                                                             */
+/*                                                                         */
+/*    Quick computation of advance widths (specification only).            */
+/*                                                                         */
+/*  Copyright 2008 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTADVANC_H__
+#define __FTADVANC_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   quick_advance
+   *
+   * @title:
+   *   Quick retrieval of advance values
+   *
+   * @abstract:
+   *   Retrieve horizontal and vertical advance values without processing
+   *   glyph outlines, if possible.
+   *
+   * @description:
+   *   This section contains functions to quickly extract advance values
+   *   without handling glyph outlines, if possible.
+   */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Const>                                                               */
+  /*    FT_ADVANCE_FLAG_FAST_ONLY                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A bit-flag to be OR-ed with the `flags' parameter of the           */
+  /*    @FT_Get_Advance and @FT_Get_Advances functions.                    */
+  /*                                                                       */
+  /*    If set, it indicates that you want these functions to fail if the  */
+  /*    corresponding hinting mode or font driver doesn't allow for very   */
+  /*    quick advance computation.                                         */
+  /*                                                                       */
+  /*    Typically, glyphs which are either unscaled, unhinted, bitmapped,  */
+  /*    or light-hinted can have their advance width computed very         */
+  /*    quickly.                                                           */
+  /*                                                                       */
+  /*    Normal and bytecode hinted modes, which require loading, scaling,  */
+  /*    and hinting of the glyph outline, are extremely slow by            */
+  /*    comparison.                                                        */
+  /*                                                                       */
+#define FT_ADVANCE_FLAG_FAST_ONLY  0x20000000UL
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Advance                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the advance value of a given glyph outline in an          */
+  /*    @FT_Face.  By default, the unhinted advance is returned in font    */
+  /*    units.                                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face       :: The source @FT_Face handle.                          */
+  /*                                                                       */
+  /*    gindex     :: The glyph index.                                     */
+  /*                                                                       */
+  /*    load_flags :: A set of bit flags similar to those used when        */
+  /*                  calling @FT_Load_Glyph, used to determine what kind  */
+  /*                  of advances you need.                                */
+  /* <Output>                                                              */
+  /*    padvance :: The advance value, in either font units or 16.16       */
+  /*                format.                                                */
+  /*                                                                       */
+  /*                If @FT_LOAD_VERTICAL_LAYOUT is set, this is the        */
+  /*                vertical advance corresponding to a vertical layout.   */
+  /*                Otherwise, it is the horizontal advance in a           */
+  /*                horizontal layout.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and   */
+  /*    if the corresponding font backend doesn't have a quick way to      */
+  /*    retrieve the advances.                                             */
+  /*                                                                       */
+  /*    A scaled advance is returned in 16.16 format but isn't transformed */
+  /*    by the affine transformation specified by @FT_Set_Transform.       */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Advance( FT_Face    face,
+                  FT_UInt    gindex,
+                  FT_Int32   load_flags,
+                  FT_Fixed  *padvance );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Advances                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the advance values of several glyph outlines in an        */
+  /*    @FT_Face.  By default, the unhinted advances are returned in font  */
+  /*    units.                                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face        :: The source @FT_Face handle.                         */
+  /*                                                                       */
+  /*    start       :: The first glyph index.                              */
+  /*                                                                       */
+  /*    count       :: The number of advance values you want to retrieve.  */
+  /*                                                                       */
+  /*    load_flags  :: A set of bit flags similar to those used when       */
+  /*                   calling @FT_Load_Glyph.                             */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    padvance :: The advances, in either font units or 16.16 format.    */
+  /*                This array must contain at least `count' elements.     */
+  /*                                                                       */
+  /*                If @FT_LOAD_VERTICAL_LAYOUT is set, these are the      */
+  /*                vertical advances corresponding to a vertical layout.  */
+  /*                Otherwise, they are the horizontal advances in a       */
+  /*                horizontal layout.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and   */
+  /*    if the corresponding font backend doesn't have a quick way to      */
+  /*    retrieve the advances.                                             */
+  /*                                                                       */
+  /*    Scaled advances are returned in 16.16 format but aren't            */
+  /*    transformed by the affine transformation specified by              */
+  /*    @FT_Set_Transform.                                                 */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Advances( FT_Face    face,
+                   FT_UInt    start,
+                   FT_UInt    count,
+                   FT_Int32   load_flags,
+                   FT_Fixed  *padvances );
+
+/* */
+
+
+FT_END_HEADER
+
+#endif /* __FTADVANC_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftbbox.h b/include/freetype/ftbbox.h
new file mode 100644 (file)
index 0000000..9766919
--- /dev/null
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbbox.h                                                               */
+/*                                                                         */
+/*    FreeType exact bbox computation (specification).                     */
+/*                                                                         */
+/*  Copyright 1996-2001, 2003, 2007, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This component has a _single_ role: to compute exact outline bounding */
+  /* boxes.                                                                */
+  /*                                                                       */
+  /* It is separated from the rest of the engine for various technical     */
+  /* reasons.  It may well be integrated in `ftoutln' later.               */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTBBOX_H__
+#define __FTBBOX_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    outline_processing                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Get_BBox                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Compute the exact bounding box of an outline.  This is slower      */
+  /*    than computing the control box.  However, it uses an advanced      */
+  /*    algorithm which returns _very_ quickly when the two boxes          */
+  /*    coincide.  Otherwise, the outline Bézier arcs are traversed to     */
+  /*    extract their extrema.                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    outline :: A pointer to the source outline.                        */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    abbox   :: The outline's exact bounding box.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If the font is tricky and the glyph has been loaded with           */
+  /*    @FT_LOAD_NO_SCALE, the resulting BBox is meaningless.  To get      */
+  /*    reasonable values for the BBox it is necessary to load the glyph   */
+  /*    at a large ppem value (so that the hinting instructions can        */
+  /*    properly shift and scale the subglyphs), then extracting the BBox  */
+  /*    which can be eventually converted back to font units.              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Get_BBox( FT_Outline*  outline,
+                       FT_BBox     *abbox );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTBBOX_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/include/freetype/ftbdf.h b/include/freetype/ftbdf.h
new file mode 100644 (file)
index 0000000..4f8baf8
--- /dev/null
@@ -0,0 +1,209 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbdf.h                                                                */
+/*                                                                         */
+/*    FreeType API for accessing BDF-specific strings (specification).     */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTBDF_H__
+#define __FTBDF_H__
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    bdf_fonts                                                          */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    BDF and PCF Files                                                  */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    BDF and PCF specific API.                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of functions specific to BDF */
+  /*    and PCF fonts.                                                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /**********************************************************************
+   *
+   * @enum:
+   *    FT_PropertyType
+   *
+   * @description:
+   *    A list of BDF property types.
+   *
+   * @values:
+   *    BDF_PROPERTY_TYPE_NONE ::
+   *      Value~0 is used to indicate a missing property.
+   *
+   *    BDF_PROPERTY_TYPE_ATOM ::
+   *      Property is a string atom.
+   *
+   *    BDF_PROPERTY_TYPE_INTEGER ::
+   *      Property is a 32-bit signed integer.
+   *
+   *    BDF_PROPERTY_TYPE_CARDINAL ::
+   *      Property is a 32-bit unsigned integer.
+   */
+  typedef enum  BDF_PropertyType_
+  {
+    BDF_PROPERTY_TYPE_NONE     = 0,
+    BDF_PROPERTY_TYPE_ATOM     = 1,
+    BDF_PROPERTY_TYPE_INTEGER  = 2,
+    BDF_PROPERTY_TYPE_CARDINAL = 3
+
+  } BDF_PropertyType;
+
+
+  /**********************************************************************
+   *
+   * @type:
+   *    BDF_Property
+   *
+   * @description:
+   *    A handle to a @BDF_PropertyRec structure to model a given
+   *    BDF/PCF property.
+   */
+  typedef struct BDF_PropertyRec_*  BDF_Property;
+
+
+ /**********************************************************************
+  *
+  * @struct:
+  *    BDF_PropertyRec
+  *
+  * @description:
+  *    This structure models a given BDF/PCF property.
+  *
+  * @fields:
+  *    type ::
+  *      The property type.
+  *
+  *    u.atom ::
+  *      The atom string, if type is @BDF_PROPERTY_TYPE_ATOM.
+  *
+  *    u.integer ::
+  *      A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER.
+  *
+  *    u.cardinal ::
+  *      An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL.
+  */
+  typedef struct  BDF_PropertyRec_
+  {
+    BDF_PropertyType  type;
+    union {
+      const char*     atom;
+      FT_Int32        integer;
+      FT_UInt32       cardinal;
+
+    } u;
+
+  } BDF_PropertyRec;
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Get_BDF_Charset_ID
+  *
+  * @description:
+  *    Retrieve a BDF font character set identity, according to
+  *    the BDF specification.
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  * @output:
+  *    acharset_encoding ::
+  *       Charset encoding, as a C~string, owned by the face.
+  *
+  *    acharset_registry ::
+  *       Charset registry, as a C~string, owned by the face.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   This function only works with BDF faces, returning an error otherwise.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Get_BDF_Charset_ID( FT_Face       face,
+                         const char*  *acharset_encoding,
+                         const char*  *acharset_registry );
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Get_BDF_Property
+  *
+  * @description:
+  *    Retrieve a BDF property from a BDF or PCF font file.
+  *
+  * @input:
+  *    face :: A handle to the input face.
+  *
+  *    name :: The property name.
+  *
+  * @output:
+  *    aproperty :: The property.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   This function works with BDF _and_ PCF fonts.  It returns an error
+  *   otherwise.  It also returns an error if the property is not in the
+  *   font.
+  *
+  *   A `property' is a either key-value pair within the STARTPROPERTIES
+  *   ... ENDPROPERTIES block of a BDF font or a key-value pair from the
+  *   `info->props' array within a `FontRec' structure of a PCF font.
+  *
+  *   Integer properties are always stored as `signed' within PCF fonts;
+  *   consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value
+  *   for BDF fonts only.
+  *
+  *   In case of error, `aproperty->type' is always set to
+  *   @BDF_PROPERTY_TYPE_NONE.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Get_BDF_Property( FT_Face           face,
+                       const char*       prop_name,
+                       BDF_PropertyRec  *aproperty );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTBDF_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftbitmap.h b/include/freetype/ftbitmap.h
new file mode 100644 (file)
index 0000000..9274236
--- /dev/null
@@ -0,0 +1,227 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbitmap.h                                                             */
+/*                                                                         */
+/*    FreeType utility functions for bitmaps (specification).              */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2006, 2008 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTBITMAP_H__
+#define __FTBITMAP_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    bitmap_handling                                                    */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Bitmap Handling                                                    */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Handling FT_Bitmap objects.                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains functions for converting FT_Bitmap objects.  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Bitmap_New                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initialize a pointer to an @FT_Bitmap structure.                   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    abitmap :: A pointer to the bitmap structure.                      */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Bitmap_New( FT_Bitmap  *abitmap );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Bitmap_Copy                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Copy a bitmap into another one.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to a library object.                           */
+  /*                                                                       */
+  /*    source  :: A handle to the source bitmap.                          */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    target  :: A handle to the target bitmap.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Bitmap_Copy( FT_Library        library,
+                  const FT_Bitmap  *source,
+                  FT_Bitmap        *target);
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Bitmap_Embolden                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Embolden a bitmap.  The new bitmap will be about `xStrength'       */
+  /*    pixels wider and `yStrength' pixels higher.  The left and bottom   */
+  /*    borders are kept unchanged.                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library   :: A handle to a library object.                         */
+  /*                                                                       */
+  /*    xStrength :: How strong the glyph is emboldened horizontally.      */
+  /*                 Expressed in 26.6 pixel format.                       */
+  /*                                                                       */
+  /*    yStrength :: How strong the glyph is emboldened vertically.        */
+  /*                 Expressed in 26.6 pixel format.                       */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    bitmap    :: A handle to the target bitmap.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The current implementation restricts `xStrength' to be less than   */
+  /*    or equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO.      */
+  /*                                                                       */
+  /*    If you want to embolden the bitmap owned by a @FT_GlyphSlotRec,    */
+  /*    you should call @FT_GlyphSlot_Own_Bitmap on the slot first.        */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Bitmap_Embolden( FT_Library  library,
+                      FT_Bitmap*  bitmap,
+                      FT_Pos      xStrength,
+                      FT_Pos      yStrength );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Bitmap_Convert                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, or 8bpp to a  */
+  /*    bitmap object with depth 8bpp, making the number of used bytes per */
+  /*    line (a.k.a. the `pitch') a multiple of `alignment'.               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library   :: A handle to a library object.                         */
+  /*                                                                       */
+  /*    source    :: The source bitmap.                                    */
+  /*                                                                       */
+  /*    alignment :: The pitch of the bitmap is a multiple of this         */
+  /*                 parameter.  Common values are 1, 2, or 4.             */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    target    :: The target bitmap.                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    It is possible to call @FT_Bitmap_Convert multiple times without   */
+  /*    calling @FT_Bitmap_Done (the memory is simply reallocated).        */
+  /*                                                                       */
+  /*    Use @FT_Bitmap_Done to finally remove the bitmap object.           */
+  /*                                                                       */
+  /*    The `library' argument is taken to have access to FreeType's       */
+  /*    memory handling functions.                                         */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Bitmap_Convert( FT_Library        library,
+                     const FT_Bitmap  *source,
+                     FT_Bitmap        *target,
+                     FT_Int            alignment );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_GlyphSlot_Own_Bitmap                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Make sure that a glyph slot owns `slot->bitmap'.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    slot :: The glyph slot.                                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function is to be used in combination with                    */
+  /*    @FT_Bitmap_Embolden.                                               */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot  slot );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Bitmap_Done                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroy a bitmap object created with @FT_Bitmap_New.               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to a library object.                           */
+  /*                                                                       */
+  /*    bitmap  :: The bitmap object to be freed.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The `library' argument is taken to have access to FreeType's       */
+  /*    memory handling functions.                                         */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Bitmap_Done( FT_Library  library,
+                  FT_Bitmap  *bitmap );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTBITMAP_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftbzip2.h b/include/freetype/ftbzip2.h
new file mode 100644 (file)
index 0000000..1bf81b1
--- /dev/null
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbzip2.h                                                              */
+/*                                                                         */
+/*    Bzip2-compressed stream support.                                     */
+/*                                                                         */
+/*  Copyright 2010 by                                                      */
+/*  Joel Klinghed.                                                         */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTBZIP2_H__
+#define __FTBZIP2_H__
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    bzip2                                                              */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    BZIP2 Streams                                                      */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Using bzip2-compressed font files.                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of Bzip2-specific functions. */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+ /************************************************************************
+  *
+  * @function:
+  *   FT_Stream_OpenBzip2
+  *
+  * @description:
+  *   Open a new stream to parse bzip2-compressed font files.  This is
+  *   mainly used to support the compressed `*.pcf.bz2' fonts that come
+  *   with XFree86.
+  *
+  * @input:
+  *   stream ::
+  *     The target embedding stream.
+  *
+  *   source ::
+  *     The source stream.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   The source stream must be opened _before_ calling this function.
+  *
+  *   Calling the internal function `FT_Stream_Close' on the new stream will
+  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream
+  *   objects will be released to the heap.
+  *
+  *   The stream implementation is very basic and resets the decompression
+  *   process each time seeking backwards is needed within the stream.
+  *
+  *   In certain builds of the library, bzip2 compression recognition is
+  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.
+  *   This means that if no font driver is capable of handling the raw
+  *   compressed file, the library will try to open a bzip2 compressed stream
+  *   from it and re-open the face with it.
+  *
+  *   This function may return `FT_Err_Unimplemented_Feature' if your build
+  *   of FreeType was not compiled with bzip2 support.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Stream_OpenBzip2( FT_Stream  stream,
+                       FT_Stream  source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTBZIP2_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftcache.h b/include/freetype/ftcache.h
new file mode 100644 (file)
index 0000000..6af5306
--- /dev/null
@@ -0,0 +1,1140 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcache.h                                                              */
+/*                                                                         */
+/*    FreeType Cache subsystem (specification).                            */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTCACHE_H__
+#define __FTCACHE_H__
+
+
+#include <ft2build.h>
+#include FT_GLYPH_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************
+   *
+   * <Section>
+   *    cache_subsystem
+   *
+   * <Title>
+   *    Cache Sub-System
+   *
+   * <Abstract>
+   *    How to cache face, size, and glyph data with FreeType~2.
+   *
+   * <Description>
+   *   This section describes the FreeType~2 cache sub-system, which is used
+   *   to limit the number of concurrently opened @FT_Face and @FT_Size
+   *   objects, as well as caching information like character maps and glyph
+   *   images while limiting their maximum memory usage.
+   *
+   *   Note that all types and functions begin with the `FTC_' prefix.
+   *
+   *   The cache is highly portable and thus doesn't know anything about the
+   *   fonts installed on your system, or how to access them.  This implies
+   *   the following scheme:
+   *
+   *   First, available or installed font faces are uniquely identified by
+   *   @FTC_FaceID values, provided to the cache by the client.  Note that
+   *   the cache only stores and compares these values, and doesn't try to
+   *   interpret them in any way.
+   *
+   *   Second, the cache calls, only when needed, a client-provided function
+   *   to convert an @FTC_FaceID into a new @FT_Face object.  The latter is
+   *   then completely managed by the cache, including its termination
+   *   through @FT_Done_Face.  To monitor termination of face objects, the
+   *   finalizer callback in the `generic' field of the @FT_Face object can
+   *   be used, which might also be used to store the @FTC_FaceID of the
+   *   face.
+   *
+   *   Clients are free to map face IDs to anything else.  The most simple
+   *   usage is to associate them to a (pathname,face_index) pair that is
+   *   used to call @FT_New_Face.  However, more complex schemes are also
+   *   possible.
+   *
+   *   Note that for the cache to work correctly, the face ID values must be
+   *   *persistent*, which means that the contents they point to should not
+   *   change at runtime, or that their value should not become invalid.
+   *
+   *   If this is unavoidable (e.g., when a font is uninstalled at runtime),
+   *   you should call @FTC_Manager_RemoveFaceID as soon as possible, to let
+   *   the cache get rid of any references to the old @FTC_FaceID it may
+   *   keep internally.  Failure to do so will lead to incorrect behaviour
+   *   or even crashes.
+   *
+   *   To use the cache, start with calling @FTC_Manager_New to create a new
+   *   @FTC_Manager object, which models a single cache instance.  You can
+   *   then look up @FT_Face and @FT_Size objects with
+   *   @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively.
+   *
+   *   If you want to use the charmap caching, call @FTC_CMapCache_New, then
+   *   later use @FTC_CMapCache_Lookup to perform the equivalent of
+   *   @FT_Get_Char_Index, only much faster.
+   *
+   *   If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then
+   *   later use @FTC_ImageCache_Lookup to retrieve the corresponding
+   *   @FT_Glyph objects from the cache.
+   *
+   *   If you need lots of small bitmaps, it is much more memory efficient
+   *   to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup.  This
+   *   returns @FTC_SBitRec structures, which are used to store small
+   *   bitmaps directly.  (A small bitmap is one whose metrics and
+   *   dimensions all fit into 8-bit integers).
+   *
+   *   We hope to also provide a kerning cache in the near future.
+   *
+   *
+   * <Order>
+   *   FTC_Manager
+   *   FTC_FaceID
+   *   FTC_Face_Requester
+   *
+   *   FTC_Manager_New
+   *   FTC_Manager_Reset
+   *   FTC_Manager_Done
+   *   FTC_Manager_LookupFace
+   *   FTC_Manager_LookupSize
+   *   FTC_Manager_RemoveFaceID
+   *
+   *   FTC_Node
+   *   FTC_Node_Unref
+   *
+   *   FTC_ImageCache
+   *   FTC_ImageCache_New
+   *   FTC_ImageCache_Lookup
+   *
+   *   FTC_SBit
+   *   FTC_SBitCache
+   *   FTC_SBitCache_New
+   *   FTC_SBitCache_Lookup
+   *
+   *   FTC_CMapCache
+   *   FTC_CMapCache_New
+   *   FTC_CMapCache_Lookup
+   *
+   *************************************************************************/
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    BASIC TYPE DEFINITIONS                     *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @type: FTC_FaceID
+   *
+   * @description:
+   *   An opaque pointer type that is used to identity face objects.  The
+   *   contents of such objects is application-dependent.
+   *
+   *   These pointers are typically used to point to a user-defined
+   *   structure containing a font file path, and face index.
+   *
+   * @note:
+   *   Never use NULL as a valid @FTC_FaceID.
+   *
+   *   Face IDs are passed by the client to the cache manager, which calls,
+   *   when needed, the @FTC_Face_Requester to translate them into new
+   *   @FT_Face objects.
+   *
+   *   If the content of a given face ID changes at runtime, or if the value
+   *   becomes invalid (e.g., when uninstalling a font), you should
+   *   immediately call @FTC_Manager_RemoveFaceID before any other cache
+   *   function.
+   *
+   *   Failure to do so will result in incorrect behaviour or even
+   *   memory leaks and crashes.
+   */
+  typedef FT_Pointer  FTC_FaceID;
+
+
+  /************************************************************************
+   *
+   * @functype:
+   *   FTC_Face_Requester
+   *
+   * @description:
+   *   A callback function provided by client applications.  It is used by
+   *   the cache manager to translate a given @FTC_FaceID into a new valid
+   *   @FT_Face object, on demand.
+   *
+   * <Input>
+   *   face_id ::
+   *     The face ID to resolve.
+   *
+   *   library ::
+   *     A handle to a FreeType library object.
+   *
+   *   req_data ::
+   *     Application-provided request data (see note below).
+   *
+   * <Output>
+   *   aface ::
+   *     A new @FT_Face handle.
+   *
+   * <Return>
+   *   FreeType error code.  0~means success.
+   *
+   * <Note>
+   *   The third parameter `req_data' is the same as the one passed by the
+   *   client when @FTC_Manager_New is called.
+   *
+   *   The face requester should not perform funny things on the returned
+   *   face object, like creating a new @FT_Size for it, or setting a
+   *   transformation through @FT_Set_Transform!
+   */
+  typedef FT_Error
+  (*FTC_Face_Requester)( FTC_FaceID  face_id,
+                         FT_Library  library,
+                         FT_Pointer  request_data,
+                         FT_Face*    aface );
+
+ /* */
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  /* these macros are incompatible with LLP64, should not be used */
+
+#define FT_POINTER_TO_ULONG( p )  ( (FT_ULong)(FT_Pointer)(p) )
+
+#define FTC_FACE_ID_HASH( i )                                \
+          ((FT_UInt32)(( FT_POINTER_TO_ULONG( i ) >> 3 ) ^   \
+                       ( FT_POINTER_TO_ULONG( i ) << 7 ) ) )
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      CACHE MANAGER OBJECT                     *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FTC_Manager                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This object corresponds to one instance of the cache-subsystem.    */
+  /*    It is used to cache one or more @FT_Face objects, along with       */
+  /*    corresponding @FT_Size objects.                                    */
+  /*                                                                       */
+  /*    The manager intentionally limits the total number of opened        */
+  /*    @FT_Face and @FT_Size objects to control memory usage.  See the    */
+  /*    `max_faces' and `max_sizes' parameters of @FTC_Manager_New.        */
+  /*                                                                       */
+  /*    The manager is also used to cache `nodes' of various types while   */
+  /*    limiting their total memory usage.                                 */
+  /*                                                                       */
+  /*    All limitations are enforced by keeping lists of managed objects   */
+  /*    in most-recently-used order, and flushing old nodes to make room   */
+  /*    for new ones.                                                      */
+  /*                                                                       */
+  typedef struct FTC_ManagerRec_*  FTC_Manager;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FTC_Node                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An opaque handle to a cache node object.  Each cache node is       */
+  /*    reference-counted.  A node with a count of~0 might be flushed      */
+  /*    out of a full cache whenever a lookup request is performed.        */
+  /*                                                                       */
+  /*    If you look up nodes, you have the ability to `acquire' them,      */
+  /*    i.e., to increment their reference count.  This will prevent the   */
+  /*    node from being flushed out of the cache until you explicitly      */
+  /*    `release' it (see @FTC_Node_Unref).                                */
+  /*                                                                       */
+  /*    See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup.         */
+  /*                                                                       */
+  typedef struct FTC_NodeRec_*  FTC_Node;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Manager_New                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new cache manager.                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library   :: The parent FreeType library handle to use.            */
+  /*                                                                       */
+  /*    max_faces :: Maximum number of opened @FT_Face objects managed by  */
+  /*                 this cache instance.  Use~0 for defaults.             */
+  /*                                                                       */
+  /*    max_sizes :: Maximum number of opened @FT_Size objects managed by  */
+  /*                 this cache instance.  Use~0 for defaults.             */
+  /*                                                                       */
+  /*    max_bytes :: Maximum number of bytes to use for cached data nodes. */
+  /*                 Use~0 for defaults.  Note that this value does not    */
+  /*                 account for managed @FT_Face and @FT_Size objects.    */
+  /*                                                                       */
+  /*    requester :: An application-provided callback used to translate    */
+  /*                 face IDs into real @FT_Face objects.                  */
+  /*                                                                       */
+  /*    req_data  :: A generic pointer that is passed to the requester     */
+  /*                 each time it is called (see @FTC_Face_Requester).     */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    amanager  :: A handle to a new manager object.  0~in case of       */
+  /*                 failure.                                              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_Manager_New( FT_Library          library,
+                   FT_UInt             max_faces,
+                   FT_UInt             max_sizes,
+                   FT_ULong            max_bytes,
+                   FTC_Face_Requester  requester,
+                   FT_Pointer          req_data,
+                   FTC_Manager        *amanager );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Manager_Reset                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Empty a given cache manager.  This simply gets rid of all the      */
+  /*    currently cached @FT_Face and @FT_Size objects within the manager. */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    manager :: A handle to the manager.                                */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FTC_Manager_Reset( FTC_Manager  manager );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Manager_Done                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroy a given manager after emptying it.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    manager :: A handle to the target cache manager object.            */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FTC_Manager_Done( FTC_Manager  manager );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Manager_LookupFace                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the @FT_Face object that corresponds to a given face ID   */
+  /*    through a cache manager.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    manager :: A handle to the cache manager.                          */
+  /*                                                                       */
+  /*    face_id :: The ID of the face object.                              */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aface   :: A handle to the face object.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The returned @FT_Face object is always owned by the manager.  You  */
+  /*    should never try to discard it yourself.                           */
+  /*                                                                       */
+  /*    The @FT_Face object doesn't necessarily have a current size object */
+  /*    (i.e., face->size can be 0).  If you need a specific `font size',  */
+  /*    use @FTC_Manager_LookupSize instead.                               */
+  /*                                                                       */
+  /*    Never change the face's transformation matrix (i.e., never call    */
+  /*    the @FT_Set_Transform function) on a returned face!  If you need   */
+  /*    to transform glyphs, do it yourself after glyph loading.           */
+  /*                                                                       */
+  /*    When you perform a lookup, out-of-memory errors are detected       */
+  /*    _within_ the lookup and force incremental flushes of the cache     */
+  /*    until enough memory is released for the lookup to succeed.         */
+  /*                                                                       */
+  /*    If a lookup fails with `FT_Err_Out_Of_Memory' the cache has        */
+  /*    already been completely flushed, and still no memory was available */
+  /*    for the operation.                                                 */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_Manager_LookupFace( FTC_Manager  manager,
+                          FTC_FaceID   face_id,
+                          FT_Face     *aface );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FTC_ScalerRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to describe a given character size in either      */
+  /*    pixels or points to the cache manager.  See                        */
+  /*    @FTC_Manager_LookupSize.                                           */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    face_id :: The source face ID.                                     */
+  /*                                                                       */
+  /*    width   :: The character width.                                    */
+  /*                                                                       */
+  /*    height  :: The character height.                                   */
+  /*                                                                       */
+  /*    pixel   :: A Boolean.  If 1, the `width' and `height' fields are   */
+  /*               interpreted as integer pixel character sizes.           */
+  /*               Otherwise, they are expressed as 1/64th of points.      */
+  /*                                                                       */
+  /*    x_res   :: Only used when `pixel' is value~0 to indicate the       */
+  /*               horizontal resolution in dpi.                           */
+  /*                                                                       */
+  /*    y_res   :: Only used when `pixel' is value~0 to indicate the       */
+  /*               vertical resolution in dpi.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This type is mainly used to retrieve @FT_Size objects through the  */
+  /*    cache manager.                                                     */
+  /*                                                                       */
+  typedef struct  FTC_ScalerRec_
+  {
+    FTC_FaceID  face_id;
+    FT_UInt     width;
+    FT_UInt     height;
+    FT_Int      pixel;
+    FT_UInt     x_res;
+    FT_UInt     y_res;
+
+  } FTC_ScalerRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FTC_Scaler                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an @FTC_ScalerRec structure.                           */
+  /*                                                                       */
+  typedef struct FTC_ScalerRec_*  FTC_Scaler;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Manager_LookupSize                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the @FT_Size object that corresponds to a given           */
+  /*    @FTC_ScalerRec pointer through a cache manager.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    manager :: A handle to the cache manager.                          */
+  /*                                                                       */
+  /*    scaler  :: A scaler handle.                                        */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    asize   :: A handle to the size object.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The returned @FT_Size object is always owned by the manager.  You  */
+  /*    should never try to discard it by yourself.                        */
+  /*                                                                       */
+  /*    You can access the parent @FT_Face object simply as `size->face'   */
+  /*    if you need it.  Note that this object is also owned by the        */
+  /*    manager.                                                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    When you perform a lookup, out-of-memory errors are detected       */
+  /*    _within_ the lookup and force incremental flushes of the cache     */
+  /*    until enough memory is released for the lookup to succeed.         */
+  /*                                                                       */
+  /*    If a lookup fails with `FT_Err_Out_Of_Memory' the cache has        */
+  /*    already been completely flushed, and still no memory is available  */
+  /*    for the operation.                                                 */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_Manager_LookupSize( FTC_Manager  manager,
+                          FTC_Scaler   scaler,
+                          FT_Size     *asize );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Node_Unref                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Decrement a cache node's internal reference count.  When the count */
+  /*    reaches 0, it is not destroyed but becomes eligible for subsequent */
+  /*    cache flushes.                                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    node    :: The cache node handle.                                  */
+  /*                                                                       */
+  /*    manager :: The cache manager handle.                               */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FTC_Node_Unref( FTC_Node     node,
+                  FTC_Manager  manager );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FTC_Manager_RemoveFaceID
+   *
+   * @description:
+   *   A special function used to indicate to the cache manager that
+   *   a given @FTC_FaceID is no longer valid, either because its
+   *   content changed, or because it was deallocated or uninstalled.
+   *
+   * @input:
+   *   manager ::
+   *     The cache manager handle.
+   *
+   *   face_id ::
+   *     The @FTC_FaceID to be removed.
+   *
+   * @note:
+   *   This function flushes all nodes from the cache corresponding to this
+   *   `face_id', with the exception of nodes with a non-null reference
+   *   count.
+   *
+   *   Such nodes are however modified internally so as to never appear
+   *   in later lookups with the same `face_id' value, and to be immediately
+   *   destroyed when released by all their users.
+   *
+   */
+  FT_EXPORT( void )
+  FTC_Manager_RemoveFaceID( FTC_Manager  manager,
+                            FTC_FaceID   face_id );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    cache_subsystem                                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /*************************************************************************
+   *
+   * @type:
+   *   FTC_CMapCache
+   *
+   * @description:
+   *   An opaque handle used to model a charmap cache.  This cache is to
+   *   hold character codes -> glyph indices mappings.
+   *
+   */
+  typedef struct FTC_CMapCacheRec_*  FTC_CMapCache;
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FTC_CMapCache_New
+   *
+   * @description:
+   *   Create a new charmap cache.
+   *
+   * @input:
+   *   manager ::
+   *     A handle to the cache manager.
+   *
+   * @output:
+   *   acache ::
+   *     A new cache handle.  NULL in case of error.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   Like all other caches, this one will be destroyed with the cache
+   *   manager.
+   *
+   */
+  FT_EXPORT( FT_Error )
+  FTC_CMapCache_New( FTC_Manager     manager,
+                     FTC_CMapCache  *acache );
+
+
+  /************************************************************************
+   *
+   * @function:
+   *   FTC_CMapCache_Lookup
+   *
+   * @description:
+   *   Translate a character code into a glyph index, using the charmap
+   *   cache.
+   *
+   * @input:
+   *   cache ::
+   *     A charmap cache handle.
+   *
+   *   face_id ::
+   *     The source face ID.
+   *
+   *   cmap_index ::
+   *     The index of the charmap in the source face.  Any negative value
+   *     means to use the cache @FT_Face's default charmap.
+   *
+   *   char_code ::
+   *     The character code (in the corresponding charmap).
+   *
+   * @return:
+   *    Glyph index.  0~means `no glyph'.
+   *
+   */
+  FT_EXPORT( FT_UInt )
+  FTC_CMapCache_Lookup( FTC_CMapCache  cache,
+                        FTC_FaceID     face_id,
+                        FT_Int         cmap_index,
+                        FT_UInt32      char_code );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    cache_subsystem                                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       IMAGE CACHE OBJECT                      *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @struct:
+   *   FTC_ImageTypeRec
+   *
+   * @description:
+   *   A structure used to model the type of images in a glyph cache.
+   *
+   * @fields:
+   *   face_id ::
+   *     The face ID.
+   *
+   *   width ::
+   *     The width in pixels.
+   *
+   *   height ::
+   *     The height in pixels.
+   *
+   *   flags ::
+   *     The load flags, as in @FT_Load_Glyph.
+   *
+   */
+  typedef struct  FTC_ImageTypeRec_
+  {
+    FTC_FaceID  face_id;
+    FT_Int      width;
+    FT_Int      height;
+    FT_Int32    flags;
+
+  } FTC_ImageTypeRec;
+
+
+  /*************************************************************************
+   *
+   * @type:
+   *   FTC_ImageType
+   *
+   * @description:
+   *   A handle to an @FTC_ImageTypeRec structure.
+   *
+   */
+  typedef struct FTC_ImageTypeRec_*  FTC_ImageType;
+
+
+  /* */
+
+
+#define FTC_IMAGE_TYPE_COMPARE( d1, d2 )      \
+          ( (d1)->face_id == (d2)->face_id && \
+            (d1)->width   == (d2)->width   && \
+            (d1)->flags   == (d2)->flags   )
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  /* this macro is incompatible with LLP64, should not be used */
+
+#define FTC_IMAGE_TYPE_HASH( d )                          \
+          (FT_UFast)( FTC_FACE_ID_HASH( (d)->face_id )  ^ \
+                      ( (d)->width << 8 ) ^ (d)->height ^ \
+                      ( (d)->flags << 4 )               )
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FTC_ImageCache                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an glyph image cache object.  They are designed to     */
+  /*    hold many distinct glyph images while not exceeding a certain      */
+  /*    memory threshold.                                                  */
+  /*                                                                       */
+  typedef struct FTC_ImageCacheRec_*  FTC_ImageCache;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_ImageCache_New                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new glyph image cache.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    manager :: The parent manager for the image cache.                 */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    acache  :: A handle to the new glyph image cache object.           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_ImageCache_New( FTC_Manager      manager,
+                      FTC_ImageCache  *acache );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_ImageCache_Lookup                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve a given glyph image from a glyph image cache.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    cache  :: A handle to the source glyph image cache.                */
+  /*                                                                       */
+  /*    type   :: A pointer to a glyph image type descriptor.              */
+  /*                                                                       */
+  /*    gindex :: The glyph index to retrieve.                             */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aglyph :: The corresponding @FT_Glyph object.  0~in case of        */
+  /*              failure.                                                 */
+  /*                                                                       */
+  /*    anode  :: Used to return the address of of the corresponding cache */
+  /*              node after incrementing its reference count (see note    */
+  /*              below).                                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The returned glyph is owned and managed by the glyph image cache.  */
+  /*    Never try to transform or discard it manually!  You can however    */
+  /*    create a copy with @FT_Glyph_Copy and modify the new one.          */
+  /*                                                                       */
+  /*    If `anode' is _not_ NULL, it receives the address of the cache     */
+  /*    node containing the glyph image, after increasing its reference    */
+  /*    count.  This ensures that the node (as well as the @FT_Glyph) will */
+  /*    always be kept in the cache until you call @FTC_Node_Unref to      */
+  /*    `release' it.                                                      */
+  /*                                                                       */
+  /*    If `anode' is NULL, the cache node is left unchanged, which means  */
+  /*    that the @FT_Glyph could be flushed out of the cache on the next   */
+  /*    call to one of the caching sub-system APIs.  Don't assume that it  */
+  /*    is persistent!                                                     */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_ImageCache_Lookup( FTC_ImageCache  cache,
+                         FTC_ImageType   type,
+                         FT_UInt         gindex,
+                         FT_Glyph       *aglyph,
+                         FTC_Node       *anode );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_ImageCache_LookupScaler                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec    */
+  /*    to specify the face ID and its size.                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    cache      :: A handle to the source glyph image cache.            */
+  /*                                                                       */
+  /*    scaler     :: A pointer to a scaler descriptor.                    */
+  /*                                                                       */
+  /*    load_flags :: The corresponding load flags.                        */
+  /*                                                                       */
+  /*    gindex     :: The glyph index to retrieve.                         */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aglyph     :: The corresponding @FT_Glyph object.  0~in case of    */
+  /*                  failure.                                             */
+  /*                                                                       */
+  /*    anode      :: Used to return the address of of the corresponding   */
+  /*                  cache node after incrementing its reference count    */
+  /*                  (see note below).                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The returned glyph is owned and managed by the glyph image cache.  */
+  /*    Never try to transform or discard it manually!  You can however    */
+  /*    create a copy with @FT_Glyph_Copy and modify the new one.          */
+  /*                                                                       */
+  /*    If `anode' is _not_ NULL, it receives the address of the cache     */
+  /*    node containing the glyph image, after increasing its reference    */
+  /*    count.  This ensures that the node (as well as the @FT_Glyph) will */
+  /*    always be kept in the cache until you call @FTC_Node_Unref to      */
+  /*    `release' it.                                                      */
+  /*                                                                       */
+  /*    If `anode' is NULL, the cache node is left unchanged, which means  */
+  /*    that the @FT_Glyph could be flushed out of the cache on the next   */
+  /*    call to one of the caching sub-system APIs.  Don't assume that it  */
+  /*    is persistent!                                                     */
+  /*                                                                       */
+  /*    Calls to @FT_Set_Char_Size and friends have no effect on cached    */
+  /*    glyphs; you should always use the FreeType cache API instead.      */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_ImageCache_LookupScaler( FTC_ImageCache  cache,
+                               FTC_Scaler      scaler,
+                               FT_ULong        load_flags,
+                               FT_UInt         gindex,
+                               FT_Glyph       *aglyph,
+                               FTC_Node       *anode );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FTC_SBit                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a small bitmap descriptor.  See the @FTC_SBitRec       */
+  /*    structure for details.                                             */
+  /*                                                                       */
+  typedef struct FTC_SBitRec_*  FTC_SBit;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FTC_SBitRec                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A very compact structure used to describe a small glyph bitmap.    */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    width     :: The bitmap width in pixels.                           */
+  /*                                                                       */
+  /*    height    :: The bitmap height in pixels.                          */
+  /*                                                                       */
+  /*    left      :: The horizontal distance from the pen position to the  */
+  /*                 left bitmap border (a.k.a. `left side bearing', or    */
+  /*                 `lsb').                                               */
+  /*                                                                       */
+  /*    top       :: The vertical distance from the pen position (on the   */
+  /*                 baseline) to the upper bitmap border (a.k.a. `top     */
+  /*                 side bearing').  The distance is positive for upwards */
+  /*                 y~coordinates.                                        */
+  /*                                                                       */
+  /*    format    :: The format of the glyph bitmap (monochrome or gray).  */
+  /*                                                                       */
+  /*    max_grays :: Maximum gray level value (in the range 1 to~255).     */
+  /*                                                                       */
+  /*    pitch     :: The number of bytes per bitmap line.  May be positive */
+  /*                 or negative.                                          */
+  /*                                                                       */
+  /*    xadvance  :: The horizontal advance width in pixels.               */
+  /*                                                                       */
+  /*    yadvance  :: The vertical advance height in pixels.                */
+  /*                                                                       */
+  /*    buffer    :: A pointer to the bitmap pixels.                       */
+  /*                                                                       */
+  typedef struct  FTC_SBitRec_
+  {
+    FT_Byte   width;
+    FT_Byte   height;
+    FT_Char   left;
+    FT_Char   top;
+
+    FT_Byte   format;
+    FT_Byte   max_grays;
+    FT_Short  pitch;
+    FT_Char   xadvance;
+    FT_Char   yadvance;
+
+    FT_Byte*  buffer;
+
+  } FTC_SBitRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FTC_SBitCache                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a small bitmap cache.  These are special cache objects */
+  /*    used to store small glyph bitmaps (and anti-aliased pixmaps) in a  */
+  /*    much more efficient way than the traditional glyph image cache     */
+  /*    implemented by @FTC_ImageCache.                                    */
+  /*                                                                       */
+  typedef struct FTC_SBitCacheRec_*  FTC_SBitCache;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_SBitCache_New                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new cache to store small glyph bitmaps.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    manager :: A handle to the source cache manager.                   */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    acache  :: A handle to the new sbit cache.  NULL in case of error. */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_SBitCache_New( FTC_Manager     manager,
+                     FTC_SBitCache  *acache );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_SBitCache_Lookup                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Look up a given small glyph bitmap in a given sbit cache and       */
+  /*    `lock' it to prevent its flushing from the cache until needed.     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    cache  :: A handle to the source sbit cache.                       */
+  /*                                                                       */
+  /*    type   :: A pointer to the glyph image type descriptor.            */
+  /*                                                                       */
+  /*    gindex :: The glyph index.                                         */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    sbit   :: A handle to a small bitmap descriptor.                   */
+  /*                                                                       */
+  /*    anode  :: Used to return the address of of the corresponding cache */
+  /*              node after incrementing its reference count (see note    */
+  /*              below).                                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The small bitmap descriptor and its bit buffer are owned by the    */
+  /*    cache and should never be freed by the application.  They might    */
+  /*    as well disappear from memory on the next cache lookup, so don't   */
+  /*    treat them as persistent data.                                     */
+  /*                                                                       */
+  /*    The descriptor's `buffer' field is set to~0 to indicate a missing  */
+  /*    glyph bitmap.                                                      */
+  /*                                                                       */
+  /*    If `anode' is _not_ NULL, it receives the address of the cache     */
+  /*    node containing the bitmap, after increasing its reference count.  */
+  /*    This ensures that the node (as well as the image) will always be   */
+  /*    kept in the cache until you call @FTC_Node_Unref to `release' it.  */
+  /*                                                                       */
+  /*    If `anode' is NULL, the cache node is left unchanged, which means  */
+  /*    that the bitmap could be flushed out of the cache on the next      */
+  /*    call to one of the caching sub-system APIs.  Don't assume that it  */
+  /*    is persistent!                                                     */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_SBitCache_Lookup( FTC_SBitCache    cache,
+                        FTC_ImageType    type,
+                        FT_UInt          gindex,
+                        FTC_SBit        *sbit,
+                        FTC_Node        *anode );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_SBitCache_LookupScaler                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec     */
+  /*    to specify the face ID and its size.                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    cache      :: A handle to the source sbit cache.                   */
+  /*                                                                       */
+  /*    scaler     :: A pointer to the scaler descriptor.                  */
+  /*                                                                       */
+  /*    load_flags :: The corresponding load flags.                        */
+  /*                                                                       */
+  /*    gindex     :: The glyph index.                                     */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    sbit       :: A handle to a small bitmap descriptor.               */
+  /*                                                                       */
+  /*    anode      :: Used to return the address of of the corresponding   */
+  /*                  cache node after incrementing its reference count    */
+  /*                  (see note below).                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The small bitmap descriptor and its bit buffer are owned by the    */
+  /*    cache and should never be freed by the application.  They might    */
+  /*    as well disappear from memory on the next cache lookup, so don't   */
+  /*    treat them as persistent data.                                     */
+  /*                                                                       */
+  /*    The descriptor's `buffer' field is set to~0 to indicate a missing  */
+  /*    glyph bitmap.                                                      */
+  /*                                                                       */
+  /*    If `anode' is _not_ NULL, it receives the address of the cache     */
+  /*    node containing the bitmap, after increasing its reference count.  */
+  /*    This ensures that the node (as well as the image) will always be   */
+  /*    kept in the cache until you call @FTC_Node_Unref to `release' it.  */
+  /*                                                                       */
+  /*    If `anode' is NULL, the cache node is left unchanged, which means  */
+  /*    that the bitmap could be flushed out of the cache on the next      */
+  /*    call to one of the caching sub-system APIs.  Don't assume that it  */
+  /*    is persistent!                                                     */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FTC_SBitCache_LookupScaler( FTC_SBitCache  cache,
+                              FTC_Scaler     scaler,
+                              FT_ULong       load_flags,
+                              FT_UInt        gindex,
+                              FTC_SBit      *sbit,
+                              FTC_Node      *anode );
+
+
+ /* */
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  /*@***********************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FTC_FontRec                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to describe a given `font' to the cache    */
+  /*    manager.  Note that a `font' is the combination of a given face    */
+  /*    with a given character size.                                       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    face_id    :: The ID of the face to use.                           */
+  /*                                                                       */
+  /*    pix_width  :: The character width in integer pixels.               */
+  /*                                                                       */
+  /*    pix_height :: The character height in integer pixels.              */
+  /*                                                                       */
+  typedef struct  FTC_FontRec_
+  {
+    FTC_FaceID  face_id;
+    FT_UShort   pix_width;
+    FT_UShort   pix_height;
+
+  } FTC_FontRec;
+
+
+  /* */
+
+
+#define FTC_FONT_COMPARE( f1, f2 )                  \
+          ( (f1)->face_id    == (f2)->face_id    && \
+            (f1)->pix_width  == (f2)->pix_width  && \
+            (f1)->pix_height == (f2)->pix_height )
+
+  /* this macro is incompatible with LLP64, should not be used */
+#define FTC_FONT_HASH( f )                              \
+          (FT_UInt32)( FTC_FACE_ID_HASH((f)->face_id) ^ \
+                       ((f)->pix_width << 8)          ^ \
+                       ((f)->pix_height)              )
+
+  typedef FTC_FontRec*  FTC_Font;
+
+
+  FT_EXPORT( FT_Error )
+  FTC_Manager_Lookup_Face( FTC_Manager  manager,
+                           FTC_FaceID   face_id,
+                           FT_Face     *aface );
+
+  FT_EXPORT( FT_Error )
+  FTC_Manager_Lookup_Size( FTC_Manager  manager,
+                           FTC_Font     font,
+                           FT_Face     *aface,
+                           FT_Size     *asize );
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTCACHE_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftchapters.h b/include/freetype/ftchapters.h
new file mode 100644 (file)
index 0000000..6cdf54e
--- /dev/null
@@ -0,0 +1,104 @@
+/***************************************************************************/
+/*                                                                         */
+/* This file defines the structure of the FreeType reference.              */
+/* It is used by the python script which generates the HTML files.         */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* <Chapter>                                                               */
+/*    general_remarks                                                      */
+/*                                                                         */
+/* <Title>                                                                 */
+/*    General Remarks                                                      */
+/*                                                                         */
+/* <Sections>                                                              */
+/*    user_allocation                                                      */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* <Chapter>                                                               */
+/*    core_api                                                             */
+/*                                                                         */
+/* <Title>                                                                 */
+/*    Core API                                                             */
+/*                                                                         */
+/* <Sections>                                                              */
+/*    version                                                              */
+/*    basic_types                                                          */
+/*    base_interface                                                       */
+/*    glyph_variants                                                       */
+/*    glyph_management                                                     */
+/*    mac_specific                                                         */
+/*    sizes_management                                                     */
+/*    header_file_macros                                                   */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* <Chapter>                                                               */
+/*    format_specific                                                      */
+/*                                                                         */
+/* <Title>                                                                 */
+/*    Format-Specific API                                                  */
+/*                                                                         */
+/* <Sections>                                                              */
+/*    multiple_masters                                                     */
+/*    truetype_tables                                                      */
+/*    type1_tables                                                         */
+/*    sfnt_names                                                           */
+/*    bdf_fonts                                                            */
+/*    cid_fonts                                                            */
+/*    pfr_fonts                                                            */
+/*    winfnt_fonts                                                         */
+/*    font_formats                                                         */
+/*    gasp_table                                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* <Chapter>                                                               */
+/*    cache_subsystem                                                      */
+/*                                                                         */
+/* <Title>                                                                 */
+/*    Cache Sub-System                                                     */
+/*                                                                         */
+/* <Sections>                                                              */
+/*    cache_subsystem                                                      */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* <Chapter>                                                               */
+/*    support_api                                                          */
+/*                                                                         */
+/* <Title>                                                                 */
+/*    Support API                                                          */
+/*                                                                         */
+/* <Sections>                                                              */
+/*    computations                                                         */
+/*    list_processing                                                      */
+/*    outline_processing                                                   */
+/*    quick_advance                                                        */
+/*    bitmap_handling                                                      */
+/*    raster                                                               */
+/*    glyph_stroker                                                        */
+/*    system_interface                                                     */
+/*    module_management                                                    */
+/*    gzip                                                                 */
+/*    lzw                                                                  */
+/*    bzip2                                                                */
+/*    lcd_filtering                                                        */
+/*                                                                         */
+/***************************************************************************/
diff --git a/include/freetype/ftcid.h b/include/freetype/ftcid.h
new file mode 100644 (file)
index 0000000..203a30c
--- /dev/null
@@ -0,0 +1,166 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcid.h                                                                */
+/*                                                                         */
+/*    FreeType API for accessing CID font information (specification).     */
+/*                                                                         */
+/*  Copyright 2007, 2009 by Dereg Clegg, Michael Toftdal.                  */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTCID_H__
+#define __FTCID_H__
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    cid_fonts                                                          */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    CID Fonts                                                          */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    CID-keyed font specific API.                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of CID-keyed font specific   */
+  /*    functions.                                                         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /**********************************************************************
+   *
+   * @function:
+   *    FT_Get_CID_Registry_Ordering_Supplement
+   *
+   * @description:
+   *    Retrieve the Registry/Ordering/Supplement triple (also known as the
+   *    "R/O/S") from a CID-keyed font.
+   *
+   * @input:
+   *    face ::
+   *       A handle to the input face.
+   *
+   * @output:
+   *    registry ::
+   *       The registry, as a C~string, owned by the face.
+   *
+   *    ordering ::
+   *       The ordering, as a C~string, owned by the face.
+   *
+   *    supplement ::
+   *       The supplement.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *    This function only works with CID faces, returning an error
+   *    otherwise.
+   *
+   * @since:
+   *    2.3.6
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_CID_Registry_Ordering_Supplement( FT_Face       face,
+                                           const char*  *registry,
+                                           const char*  *ordering,
+                                           FT_Int       *supplement);
+
+
+  /**********************************************************************
+   *
+   * @function:
+   *    FT_Get_CID_Is_Internally_CID_Keyed
+   *
+   * @description:
+   *    Retrieve the type of the input face, CID keyed or not.  In
+   *    constrast to the @FT_IS_CID_KEYED macro this function returns
+   *    successfully also for CID-keyed fonts in an SNFT wrapper.
+   *
+   * @input:
+   *    face ::
+   *       A handle to the input face.
+   *
+   * @output:
+   *    is_cid ::
+   *       The type of the face as an @FT_Bool.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *    This function only works with CID faces and OpenType fonts,
+   *    returning an error otherwise.
+   *
+   * @since:
+   *    2.3.9
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_CID_Is_Internally_CID_Keyed( FT_Face   face,
+                                      FT_Bool  *is_cid );
+
+
+  /**********************************************************************
+   *
+   * @function:
+   *    FT_Get_CID_From_Glyph_Index
+   *
+   * @description:
+   *    Retrieve the CID of the input glyph index.
+   *
+   * @input:
+   *    face ::
+   *       A handle to the input face.
+   *
+   *    glyph_index ::
+   *       The input glyph index.
+   *
+   * @output:
+   *    cid ::
+   *       The CID as an @FT_UInt.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *    This function only works with CID faces and OpenType fonts,
+   *    returning an error otherwise.
+   *
+   * @since:
+   *    2.3.9
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_CID_From_Glyph_Index( FT_Face   face,
+                               FT_UInt   glyph_index,
+                               FT_UInt  *cid );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTCID_H__ */
+
+
+/* END */
diff --git a/include/freetype/fterrdef.h b/include/freetype/fterrdef.h
new file mode 100644 (file)
index 0000000..fb4b53b
--- /dev/null
@@ -0,0 +1,245 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fterrdef.h                                                             */
+/*                                                                         */
+/*    FreeType error codes (specification).                                */
+/*                                                                         */
+/*  Copyright 2002, 2004, 2006, 2007, 2010-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                LIST OF ERROR CODES/MESSAGES             *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+
+  /* You need to define both FT_ERRORDEF_ and FT_NOERRORDEF_ before */
+  /* including this file.                                           */
+
+
+  /* generic errors */
+
+  FT_NOERRORDEF_( Ok,                                        0x00, \
+                  "no error" )
+
+  FT_ERRORDEF_( Cannot_Open_Resource,                        0x01, \
+                "cannot open resource" )
+  FT_ERRORDEF_( Unknown_File_Format,                         0x02, \
+                "unknown file format" )
+  FT_ERRORDEF_( Invalid_File_Format,                         0x03, \
+                "broken file" )
+  FT_ERRORDEF_( Invalid_Version,                             0x04, \
+                "invalid FreeType version" )
+  FT_ERRORDEF_( Lower_Module_Version,                        0x05, \
+                "module version is too low" )
+  FT_ERRORDEF_( Invalid_Argument,                            0x06, \
+                "invalid argument" )
+  FT_ERRORDEF_( Unimplemented_Feature,                       0x07, \
+                "unimplemented feature" )
+  FT_ERRORDEF_( Invalid_Table,                               0x08, \
+                "broken table" )
+  FT_ERRORDEF_( Invalid_Offset,                              0x09, \
+                "broken offset within table" )
+  FT_ERRORDEF_( Array_Too_Large,                             0x0A, \
+                "array allocation size too large" )
+  FT_ERRORDEF_( Missing_Module,                              0x0B, \
+                "missing module" )
+
+  /* glyph/character errors */
+
+  FT_ERRORDEF_( Invalid_Glyph_Index,                         0x10, \
+                "invalid glyph index" )
+  FT_ERRORDEF_( Invalid_Character_Code,                      0x11, \
+                "invalid character code" )
+  FT_ERRORDEF_( Invalid_Glyph_Format,                        0x12, \
+                "unsupported glyph image format" )
+  FT_ERRORDEF_( Cannot_Render_Glyph,                         0x13, \
+                "cannot render this glyph format" )
+  FT_ERRORDEF_( Invalid_Outline,                             0x14, \
+                "invalid outline" )
+  FT_ERRORDEF_( Invalid_Composite,                           0x15, \
+                "invalid composite glyph" )
+  FT_ERRORDEF_( Too_Many_Hints,                              0x16, \
+                "too many hints" )
+  FT_ERRORDEF_( Invalid_Pixel_Size,                          0x17, \
+                "invalid pixel size" )
+
+  /* handle errors */
+
+  FT_ERRORDEF_( Invalid_Handle,                              0x20, \
+                "invalid object handle" )
+  FT_ERRORDEF_( Invalid_Library_Handle,                      0x21, \
+                "invalid library handle" )
+  FT_ERRORDEF_( Invalid_Driver_Handle,                       0x22, \
+                "invalid module handle" )
+  FT_ERRORDEF_( Invalid_Face_Handle,                         0x23, \
+                "invalid face handle" )
+  FT_ERRORDEF_( Invalid_Size_Handle,                         0x24, \
+                "invalid size handle" )
+  FT_ERRORDEF_( Invalid_Slot_Handle,                         0x25, \
+                "invalid glyph slot handle" )
+  FT_ERRORDEF_( Invalid_CharMap_Handle,                      0x26, \
+                "invalid charmap handle" )
+  FT_ERRORDEF_( Invalid_Cache_Handle,                        0x27, \
+                "invalid cache manager handle" )
+  FT_ERRORDEF_( Invalid_Stream_Handle,                       0x28, \
+                "invalid stream handle" )
+
+  /* driver errors */
+
+  FT_ERRORDEF_( Too_Many_Drivers,                            0x30, \
+                "too many modules" )
+  FT_ERRORDEF_( Too_Many_Extensions,                         0x31, \
+                "too many extensions" )
+
+  /* memory errors */
+
+  FT_ERRORDEF_( Out_Of_Memory,                               0x40, \
+                "out of memory" )
+  FT_ERRORDEF_( Unlisted_Object,                             0x41, \
+                "unlisted object" )
+
+  /* stream errors */
+
+  FT_ERRORDEF_( Cannot_Open_Stream,                          0x51, \
+                "cannot open stream" )
+  FT_ERRORDEF_( Invalid_Stream_Seek,                         0x52, \
+                "invalid stream seek" )
+  FT_ERRORDEF_( Invalid_Stream_Skip,                         0x53, \
+                "invalid stream skip" )
+  FT_ERRORDEF_( Invalid_Stream_Read,                         0x54, \
+                "invalid stream read" )
+  FT_ERRORDEF_( Invalid_Stream_Operation,                    0x55, \
+                "invalid stream operation" )
+  FT_ERRORDEF_( Invalid_Frame_Operation,                     0x56, \
+                "invalid frame operation" )
+  FT_ERRORDEF_( Nested_Frame_Access,                         0x57, \
+                "nested frame access" )
+  FT_ERRORDEF_( Invalid_Frame_Read,                          0x58, \
+                "invalid frame read" )
+
+  /* raster errors */
+
+  FT_ERRORDEF_( Raster_Uninitialized,                        0x60, \
+                "raster uninitialized" )
+  FT_ERRORDEF_( Raster_Corrupted,                            0x61, \
+                "raster corrupted" )
+  FT_ERRORDEF_( Raster_Overflow,                             0x62, \
+                "raster overflow" )
+  FT_ERRORDEF_( Raster_Negative_Height,                      0x63, \
+                "negative height while rastering" )
+
+  /* cache errors */
+
+  FT_ERRORDEF_( Too_Many_Caches,                             0x70, \
+                "too many registered caches" )
+
+  /* TrueType and SFNT errors */
+
+  FT_ERRORDEF_( Invalid_Opcode,                              0x80, \
+                "invalid opcode" )
+  FT_ERRORDEF_( Too_Few_Arguments,                           0x81, \
+                "too few arguments" )
+  FT_ERRORDEF_( Stack_Overflow,                              0x82, \
+                "stack overflow" )
+  FT_ERRORDEF_( Code_Overflow,                               0x83, \
+                "code overflow" )
+  FT_ERRORDEF_( Bad_Argument,                                0x84, \
+                "bad argument" )
+  FT_ERRORDEF_( Divide_By_Zero,                              0x85, \
+                "division by zero" )
+  FT_ERRORDEF_( Invalid_Reference,                           0x86, \
+                "invalid reference" )
+  FT_ERRORDEF_( Debug_OpCode,                                0x87, \
+                "found debug opcode" )
+  FT_ERRORDEF_( ENDF_In_Exec_Stream,                         0x88, \
+                "found ENDF opcode in execution stream" )
+  FT_ERRORDEF_( Nested_DEFS,                                 0x89, \
+                "nested DEFS" )
+  FT_ERRORDEF_( Invalid_CodeRange,                           0x8A, \
+                "invalid code range" )
+  FT_ERRORDEF_( Execution_Too_Long,                          0x8B, \
+                "execution context too long" )
+  FT_ERRORDEF_( Too_Many_Function_Defs,                      0x8C, \
+                "too many function definitions" )
+  FT_ERRORDEF_( Too_Many_Instruction_Defs,                   0x8D, \
+                "too many instruction definitions" )
+  FT_ERRORDEF_( Table_Missing,                               0x8E, \
+                "SFNT font table missing" )
+  FT_ERRORDEF_( Horiz_Header_Missing,                        0x8F, \
+                "horizontal header (hhea) table missing" )
+  FT_ERRORDEF_( Locations_Missing,                           0x90, \
+                "locations (loca) table missing" )
+  FT_ERRORDEF_( Name_Table_Missing,                          0x91, \
+                "name table missing" )
+  FT_ERRORDEF_( CMap_Table_Missing,                          0x92, \
+                "character map (cmap) table missing" )
+  FT_ERRORDEF_( Hmtx_Table_Missing,                          0x93, \
+                "horizontal metrics (hmtx) table missing" )
+  FT_ERRORDEF_( Post_Table_Missing,                          0x94, \
+                "PostScript (post) table missing" )
+  FT_ERRORDEF_( Invalid_Horiz_Metrics,                       0x95, \
+                "invalid horizontal metrics" )
+  FT_ERRORDEF_( Invalid_CharMap_Format,                      0x96, \
+                "invalid character map (cmap) format" )
+  FT_ERRORDEF_( Invalid_PPem,                                0x97, \
+                "invalid ppem value" )
+  FT_ERRORDEF_( Invalid_Vert_Metrics,                        0x98, \
+                "invalid vertical metrics" )
+  FT_ERRORDEF_( Could_Not_Find_Context,                      0x99, \
+                "could not find context" )
+  FT_ERRORDEF_( Invalid_Post_Table_Format,                   0x9A, \
+                "invalid PostScript (post) table format" )
+  FT_ERRORDEF_( Invalid_Post_Table,                          0x9B, \
+                "invalid PostScript (post) table" )
+
+  /* CFF, CID, and Type 1 errors */
+
+  FT_ERRORDEF_( Syntax_Error,                                0xA0, \
+                "opcode syntax error" )
+  FT_ERRORDEF_( Stack_Underflow,                             0xA1, \
+                "argument stack underflow" )
+  FT_ERRORDEF_( Ignore,                                      0xA2, \
+                "ignore" )
+  FT_ERRORDEF_( No_Unicode_Glyph_Name,                       0xA3, \
+                "no Unicode glyph name found" )
+
+  /* BDF errors */
+
+  FT_ERRORDEF_( Missing_Startfont_Field,                     0xB0, \
+                "`STARTFONT' field missing" )
+  FT_ERRORDEF_( Missing_Font_Field,                          0xB1, \
+                "`FONT' field missing" )
+  FT_ERRORDEF_( Missing_Size_Field,                          0xB2, \
+                "`SIZE' field missing" )
+  FT_ERRORDEF_( Missing_Fontboundingbox_Field,               0xB3, \
+                "`FONTBOUNDINGBOX' field missing" )
+  FT_ERRORDEF_( Missing_Chars_Field,                         0xB4, \
+                "`CHARS' field missing" )
+  FT_ERRORDEF_( Missing_Startchar_Field,                     0xB5, \
+                "`STARTCHAR' field missing" )
+  FT_ERRORDEF_( Missing_Encoding_Field,                      0xB6, \
+                "`ENCODING' field missing" )
+  FT_ERRORDEF_( Missing_Bbx_Field,                           0xB7, \
+                "`BBX' field missing" )
+  FT_ERRORDEF_( Bbx_Too_Big,                                 0xB8, \
+                "`BBX' too big" )
+  FT_ERRORDEF_( Corrupted_Font_Header,                       0xB9, \
+                "Font header corrupted or missing fields" )
+  FT_ERRORDEF_( Corrupted_Font_Glyphs,                       0xBA, \
+                "Font glyphs corrupted or missing fields" )
+
+
+/* END */
diff --git a/include/freetype/fterrors.h b/include/freetype/fterrors.h
new file mode 100644 (file)
index 0000000..a54699f
--- /dev/null
@@ -0,0 +1,207 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fterrors.h                                                             */
+/*                                                                         */
+/*    FreeType error code handling (specification).                        */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2004, 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This special header file is used to define the handling of FT2        */
+  /* enumeration constants.  It can also be used to generate error message */
+  /* strings with a small macro trick explained below.                     */
+  /*                                                                       */
+  /* I - Error Formats                                                     */
+  /* -----------------                                                     */
+  /*                                                                       */
+  /*   The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be   */
+  /*   defined in ftoption.h in order to make the higher byte indicate     */
+  /*   the module where the error has happened (this is not compatible     */
+  /*   with standard builds of FreeType 2).  You can then use the macro    */
+  /*   FT_ERROR_BASE macro to extract the generic error code from an       */
+  /*   FT_Error value.                                                     */
+  /*                                                                       */
+  /*                                                                       */
+  /* II - Error Message strings                                            */
+  /* --------------------------                                            */
+  /*                                                                       */
+  /*   The error definitions below are made through special macros that    */
+  /*   allow client applications to build a table of error message strings */
+  /*   if they need it.  The strings are not included in a normal build of */
+  /*   FreeType 2 to save space (most client applications do not use       */
+  /*   them).                                                              */
+  /*                                                                       */
+  /*   To do so, you have to define the following macros before including  */
+  /*   this file:                                                          */
+  /*                                                                       */
+  /*   FT_ERROR_START_LIST ::                                              */
+  /*     This macro is called before anything else to define the start of  */
+  /*     the error list.  It is followed by several FT_ERROR_DEF calls     */
+  /*     (see below).                                                      */
+  /*                                                                       */
+  /*   FT_ERROR_DEF( e, v, s ) ::                                          */
+  /*     This macro is called to define one single error.                  */
+  /*     `e' is the error code identifier (e.g. FT_Err_Invalid_Argument).  */
+  /*     `v' is the error numerical value.                                 */
+  /*     `s' is the corresponding error string.                            */
+  /*                                                                       */
+  /*   FT_ERROR_END_LIST ::                                                */
+  /*     This macro ends the list.                                         */
+  /*                                                                       */
+  /*   Additionally, you have to undefine __FTERRORS_H__ before #including */
+  /*   this file.                                                          */
+  /*                                                                       */
+  /*   Here is a simple example:                                           */
+  /*                                                                       */
+  /*     {                                                                 */
+  /*       #undef __FTERRORS_H__                                           */
+  /*       #define FT_ERRORDEF( e, v, s )  { e, s },                       */
+  /*       #define FT_ERROR_START_LIST     {                               */
+  /*       #define FT_ERROR_END_LIST       { 0, 0 } };                     */
+  /*                                                                       */
+  /*       const struct                                                    */
+  /*       {                                                               */
+  /*         int          err_code;                                        */
+  /*         const char*  err_msg;                                         */
+  /*       } ft_errors[] =                                                 */
+  /*                                                                       */
+  /*       #include FT_ERRORS_H                                            */
+  /*     }                                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTERRORS_H__
+#define __FTERRORS_H__
+
+
+  /* include module base error codes */
+#include FT_MODULE_ERRORS_H
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                       SETUP MACROS                      *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+
+#undef  FT_NEED_EXTERN_C
+
+#undef  FT_ERR_XCAT
+#undef  FT_ERR_CAT
+
+#define FT_ERR_XCAT( x, y )  x ## y
+#define FT_ERR_CAT( x, y )   FT_ERR_XCAT( x, y )
+
+
+  /* FT_ERR_PREFIX is used as a prefix for error identifiers. */
+  /* By default, we use `FT_Err_'.                            */
+  /*                                                          */
+#ifndef FT_ERR_PREFIX
+#define FT_ERR_PREFIX  FT_Err_
+#endif
+
+
+  /* FT_ERR_BASE is used as the base for module-specific errors. */
+  /*                                                             */
+#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+
+#ifndef FT_ERR_BASE
+#define FT_ERR_BASE  FT_Mod_Err_Base
+#endif
+
+#else
+
+#undef FT_ERR_BASE
+#define FT_ERR_BASE  0
+
+#endif /* FT_CONFIG_OPTION_USE_MODULE_ERRORS */
+
+
+  /* If FT_ERRORDEF is not defined, we need to define a simple */
+  /* enumeration type.                                         */
+  /*                                                           */
+#ifndef FT_ERRORDEF
+
+#define FT_ERRORDEF( e, v, s )  e = v,
+#define FT_ERROR_START_LIST     enum {
+#define FT_ERROR_END_LIST       FT_ERR_CAT( FT_ERR_PREFIX, Max ) };
+
+#ifdef __cplusplus
+#define FT_NEED_EXTERN_C
+  extern "C" {
+#endif
+
+#endif /* !FT_ERRORDEF */
+
+
+  /* this macro is used to define an error */
+#define FT_ERRORDEF_( e, v, s )   \
+          FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v + FT_ERR_BASE, s )
+
+  /* this is only used for <module>_Err_Ok, which must be 0! */
+#define FT_NOERRORDEF_( e, v, s ) \
+          FT_ERRORDEF( FT_ERR_CAT( FT_ERR_PREFIX, e ), v, s )
+
+
+#ifdef FT_ERROR_START_LIST
+  FT_ERROR_START_LIST
+#endif
+
+
+  /* now include the error codes */
+#include FT_ERROR_DEFINITIONS_H
+
+
+#ifdef FT_ERROR_END_LIST
+  FT_ERROR_END_LIST
+#endif
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                      SIMPLE CLEANUP                     *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+#ifdef FT_NEED_EXTERN_C
+  }
+#endif
+
+#undef FT_ERROR_START_LIST
+#undef FT_ERROR_END_LIST
+
+#undef FT_ERRORDEF
+#undef FT_ERRORDEF_
+#undef FT_NOERRORDEF_
+
+#undef FT_NEED_EXTERN_C
+#undef FT_ERR_BASE
+
+  /* FT_KEEP_ERR_PREFIX is needed for ftvalid.h */
+#ifndef FT_KEEP_ERR_PREFIX
+#undef FT_ERR_PREFIX
+#else
+#undef FT_KEEP_ERR_PREFIX
+#endif
+
+#endif /* __FTERRORS_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftgasp.h b/include/freetype/ftgasp.h
new file mode 100644 (file)
index 0000000..453d4fa
--- /dev/null
@@ -0,0 +1,128 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgasp.h                                                               */
+/*                                                                         */
+/*    Access of TrueType's `gasp' table (specification).                   */
+/*                                                                         */
+/*  Copyright 2007, 2008, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef _FT_GASP_H_
+#define _FT_GASP_H_
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+  /***************************************************************************
+   *
+   * @section:
+   *   gasp_table
+   *
+   * @title:
+   *   Gasp Table
+   *
+   * @abstract:
+   *   Retrieving TrueType `gasp' table entries.
+   *
+   * @description:
+   *   The function @FT_Get_Gasp can be used to query a TrueType or OpenType
+   *   font for specific entries in its `gasp' table, if any.  This is
+   *   mainly useful when implementing native TrueType hinting with the
+   *   bytecode interpreter to duplicate the Windows text rendering results.
+   */
+
+  /*************************************************************************
+   *
+   * @enum:
+   *   FT_GASP_XXX
+   *
+   * @description:
+   *   A list of values and/or bit-flags returned by the @FT_Get_Gasp
+   *   function.
+   *
+   * @values:
+   *   FT_GASP_NO_TABLE ::
+   *     This special value means that there is no GASP table in this face.
+   *     It is up to the client to decide what to do.
+   *
+   *   FT_GASP_DO_GRIDFIT ::
+   *     Grid-fitting and hinting should be performed at the specified ppem.
+   *     This *really* means TrueType bytecode interpretation.  If this bit
+   *     is not set, no hinting gets applied.
+   *
+   *   FT_GASP_DO_GRAY ::
+   *     Anti-aliased rendering should be performed at the specified ppem.
+   *     If not set, do monochrome rendering.
+   *
+   *   FT_GASP_SYMMETRIC_SMOOTHING ::
+   *     If set, smoothing along multiple axes must be used with ClearType.
+   *
+   *   FT_GASP_SYMMETRIC_GRIDFIT ::
+   *     Grid-fitting must be used with ClearType's symmetric smoothing.
+   *
+   * @note:
+   *   The bit-flags `FT_GASP_DO_GRIDFIT' and `FT_GASP_DO_GRAY' are to be
+   *   used for standard font rasterization only.  Independently of that,
+   *   `FT_GASP_SYMMETRIC_SMOOTHING' and `FT_GASP_SYMMETRIC_GRIDFIT' are to
+   *   be used if ClearType is enabled (and `FT_GASP_DO_GRIDFIT' and
+   *   `FT_GASP_DO_GRAY' are consequently ignored).
+   *
+   *   `ClearType' is Microsoft's implementation of LCD rendering, partly
+   *   protected by patents.
+   *
+   * @since:
+   *   2.3.0
+   */
+#define FT_GASP_NO_TABLE               -1
+#define FT_GASP_DO_GRIDFIT           0x01
+#define FT_GASP_DO_GRAY              0x02
+#define FT_GASP_SYMMETRIC_SMOOTHING  0x08
+#define FT_GASP_SYMMETRIC_GRIDFIT    0x10
+
+
+  /*************************************************************************
+   *
+   * @func:
+   *   FT_Get_Gasp
+   *
+   * @description:
+   *   Read the `gasp' table from a TrueType or OpenType font file and
+   *   return the entry corresponding to a given character pixel size.
+   *
+   * @input:
+   *   face :: The source face handle.
+   *   ppem :: The vertical character pixel size.
+   *
+   * @return:
+   *   Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no
+   *   `gasp' table in the face.
+   *
+   * @since:
+   *   2.3.0
+   */
+  FT_EXPORT( FT_Int )
+  FT_Get_Gasp( FT_Face  face,
+               FT_UInt  ppem );
+
+/* */
+
+#endif /* _FT_GASP_H_ */
+
+
+/* END */
diff --git a/include/freetype/ftglyph.h b/include/freetype/ftglyph.h
new file mode 100644 (file)
index 0000000..3de69f7
--- /dev/null
@@ -0,0 +1,620 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftglyph.h                                                              */
+/*                                                                         */
+/*    FreeType convenience functions to handle glyphs (specification).     */
+/*                                                                         */
+/*  Copyright 1996-2003, 2006, 2008, 2009, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file contains the definition of several convenience functions    */
+  /* that can be used by client applications to easily retrieve glyph      */
+  /* bitmaps and outlines from a given face.                               */
+  /*                                                                       */
+  /* These functions should be optional if you are writing a font server   */
+  /* or text layout engine on top of FreeType.  However, they are pretty   */
+  /* handy for many other simple uses of the library.                      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTGLYPH_H__
+#define __FTGLYPH_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    glyph_management                                                   */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Glyph Management                                                   */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Generic interface to manage individual glyph data.                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains definitions used to manage glyph data        */
+  /*    through generic FT_Glyph objects.  Each of them can contain a      */
+  /*    bitmap, a vector outline, or even images in other formats.         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* forward declaration to a private type */
+  typedef struct FT_Glyph_Class_  FT_Glyph_Class;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Glyph                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Handle to an object used to model generic glyph images.  It is a   */
+  /*    pointer to the @FT_GlyphRec structure and can contain a glyph      */
+  /*    bitmap or pointer.                                                 */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Glyph objects are not owned by the library.  You must thus release */
+  /*    them manually (through @FT_Done_Glyph) _before_ calling            */
+  /*    @FT_Done_FreeType.                                                 */
+  /*                                                                       */
+  typedef struct FT_GlyphRec_*  FT_Glyph;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_GlyphRec                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The root glyph structure contains a given glyph image plus its     */
+  /*    advance width in 16.16 fixed float format.                         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    library :: A handle to the FreeType library object.                */
+  /*                                                                       */
+  /*    clazz   :: A pointer to the glyph's class.  Private.               */
+  /*                                                                       */
+  /*    format  :: The format of the glyph's image.                        */
+  /*                                                                       */
+  /*    advance :: A 16.16 vector that gives the glyph's advance width.    */
+  /*                                                                       */
+  typedef struct  FT_GlyphRec_
+  {
+    FT_Library             library;
+    const FT_Glyph_Class*  clazz;
+    FT_Glyph_Format        format;
+    FT_Vector              advance;
+
+  } FT_GlyphRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_BitmapGlyph                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an object used to model a bitmap glyph image.  This is */
+  /*    a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec.     */
+  /*                                                                       */
+  typedef struct FT_BitmapGlyphRec_*  FT_BitmapGlyph;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_BitmapGlyphRec                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used for bitmap glyph images.  This really is a        */
+  /*    `sub-class' of @FT_GlyphRec.                                       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root   :: The root @FT_Glyph fields.                               */
+  /*                                                                       */
+  /*    left   :: The left-side bearing, i.e., the horizontal distance     */
+  /*              from the current pen position to the left border of the  */
+  /*              glyph bitmap.                                            */
+  /*                                                                       */
+  /*    top    :: The top-side bearing, i.e., the vertical distance from   */
+  /*              the current pen position to the top border of the glyph  */
+  /*              bitmap.  This distance is positive for upwards~y!        */
+  /*                                                                       */
+  /*    bitmap :: A descriptor for the bitmap.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have       */
+  /*    `glyph->format == FT_GLYPH_FORMAT_BITMAP'.  This lets you access   */
+  /*    the bitmap's contents easily.                                      */
+  /*                                                                       */
+  /*    The corresponding pixel buffer is always owned by @FT_BitmapGlyph  */
+  /*    and is thus created and destroyed with it.                         */
+  /*                                                                       */
+  typedef struct  FT_BitmapGlyphRec_
+  {
+    FT_GlyphRec  root;
+    FT_Int       left;
+    FT_Int       top;
+    FT_Bitmap    bitmap;
+
+  } FT_BitmapGlyphRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_OutlineGlyph                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an object used to model an outline glyph image.  This  */
+  /*    is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */
+  /*                                                                       */
+  typedef struct FT_OutlineGlyphRec_*  FT_OutlineGlyph;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_OutlineGlyphRec                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used for outline (vectorial) glyph images.  This       */
+  /*    really is a `sub-class' of @FT_GlyphRec.                           */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root    :: The root @FT_Glyph fields.                              */
+  /*                                                                       */
+  /*    outline :: A descriptor for the outline.                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have      */
+  /*    `glyph->format == FT_GLYPH_FORMAT_OUTLINE'.  This lets you access  */
+  /*    the outline's content easily.                                      */
+  /*                                                                       */
+  /*    As the outline is extracted from a glyph slot, its coordinates are */
+  /*    expressed normally in 26.6 pixels, unless the flag                 */
+  /*    @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char(). */
+  /*                                                                       */
+  /*    The outline's tables are always owned by the object and are        */
+  /*    destroyed with it.                                                 */
+  /*                                                                       */
+  typedef struct  FT_OutlineGlyphRec_
+  {
+    FT_GlyphRec  root;
+    FT_Outline   outline;
+
+  } FT_OutlineGlyphRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Glyph                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to extract a glyph image from a slot.  Note that   */
+  /*    the created @FT_Glyph object must be released with @FT_Done_Glyph. */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    slot   :: A handle to the source glyph slot.                       */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aglyph :: A handle to the glyph object.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Glyph( FT_GlyphSlot  slot,
+                FT_Glyph     *aglyph );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Glyph_Copy                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to copy a glyph image.  Note that the created      */
+  /*    @FT_Glyph object must be released with @FT_Done_Glyph.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    source :: A handle to the source glyph object.                     */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    target :: A handle to the target glyph object.  0~in case of       */
+  /*              error.                                                   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Glyph_Copy( FT_Glyph   source,
+                 FT_Glyph  *target );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Glyph_Transform                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Transform a glyph image if its format is scalable.                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    glyph  :: A handle to the target glyph object.                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    matrix :: A pointer to a 2x2 matrix to apply.                      */
+  /*                                                                       */
+  /*    delta  :: A pointer to a 2d vector to apply.  Coordinates are      */
+  /*              expressed in 1/64th of a pixel.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code (if not 0, the glyph format is not scalable).  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The 2x2 transformation matrix is also applied to the glyph's       */
+  /*    advance vector.                                                    */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Glyph_Transform( FT_Glyph    glyph,
+                      FT_Matrix*  matrix,
+                      FT_Vector*  delta );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Glyph_BBox_Mode                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The mode how the values of @FT_Glyph_Get_CBox are returned.        */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_GLYPH_BBOX_UNSCALED ::                                          */
+  /*      Return unscaled font units.                                      */
+  /*                                                                       */
+  /*    FT_GLYPH_BBOX_SUBPIXELS ::                                         */
+  /*      Return unfitted 26.6 coordinates.                                */
+  /*                                                                       */
+  /*    FT_GLYPH_BBOX_GRIDFIT ::                                           */
+  /*      Return grid-fitted 26.6 coordinates.                             */
+  /*                                                                       */
+  /*    FT_GLYPH_BBOX_TRUNCATE ::                                          */
+  /*      Return coordinates in integer pixels.                            */
+  /*                                                                       */
+  /*    FT_GLYPH_BBOX_PIXELS ::                                            */
+  /*      Return grid-fitted pixel coordinates.                            */
+  /*                                                                       */
+  typedef enum  FT_Glyph_BBox_Mode_
+  {
+    FT_GLYPH_BBOX_UNSCALED  = 0,
+    FT_GLYPH_BBOX_SUBPIXELS = 0,
+    FT_GLYPH_BBOX_GRIDFIT   = 1,
+    FT_GLYPH_BBOX_TRUNCATE  = 2,
+    FT_GLYPH_BBOX_PIXELS    = 3
+
+  } FT_Glyph_BBox_Mode;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    ft_glyph_bbox_xxx                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    These constants are deprecated.  Use the corresponding             */
+  /*    @FT_Glyph_BBox_Mode values instead.                                */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*   ft_glyph_bbox_unscaled  :: See @FT_GLYPH_BBOX_UNSCALED.             */
+  /*   ft_glyph_bbox_subpixels :: See @FT_GLYPH_BBOX_SUBPIXELS.            */
+  /*   ft_glyph_bbox_gridfit   :: See @FT_GLYPH_BBOX_GRIDFIT.              */
+  /*   ft_glyph_bbox_truncate  :: See @FT_GLYPH_BBOX_TRUNCATE.             */
+  /*   ft_glyph_bbox_pixels    :: See @FT_GLYPH_BBOX_PIXELS.               */
+  /*                                                                       */
+#define ft_glyph_bbox_unscaled   FT_GLYPH_BBOX_UNSCALED
+#define ft_glyph_bbox_subpixels  FT_GLYPH_BBOX_SUBPIXELS
+#define ft_glyph_bbox_gridfit    FT_GLYPH_BBOX_GRIDFIT
+#define ft_glyph_bbox_truncate   FT_GLYPH_BBOX_TRUNCATE
+#define ft_glyph_bbox_pixels     FT_GLYPH_BBOX_PIXELS
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Glyph_Get_CBox                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return a glyph's `control box'.  The control box encloses all the  */
+  /*    outline's points, including Bézier control points.  Though it      */
+  /*    coincides with the exact bounding box for most glyphs, it can be   */
+  /*    slightly larger in some situations (like when rotating an outline  */
+  /*    which contains Bézier outside arcs).                               */
+  /*                                                                       */
+  /*    Computing the control box is very fast, while getting the bounding */
+  /*    box can take much more time as it needs to walk over all segments  */
+  /*    and arcs in the outline.  To get the latter, you can use the       */
+  /*    `ftbbox' component which is dedicated to this single task.         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    glyph :: A handle to the source glyph object.                      */
+  /*                                                                       */
+  /*    mode  :: The mode which indicates how to interpret the returned    */
+  /*             bounding box values.                                      */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    acbox :: The glyph coordinate bounding box.  Coordinates are       */
+  /*             expressed in 1/64th of pixels if it is grid-fitted.       */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Coordinates are relative to the glyph origin, using the y~upwards  */
+  /*    convention.                                                        */
+  /*                                                                       */
+  /*    If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode'   */
+  /*    must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font        */
+  /*    units in 26.6 pixel format.  The value @FT_GLYPH_BBOX_SUBPIXELS    */
+  /*    is another name for this constant.                                 */
+  /*                                                                       */
+  /*    If the font is tricky and the glyph has been loaded with           */
+  /*    @FT_LOAD_NO_SCALE, the resulting CBox is meaningless.  To get      */
+  /*    reasonable values for the CBox it is necessary to load the glyph   */
+  /*    at a large ppem value (so that the hinting instructions can        */
+  /*    properly shift and scale the subglyphs), then extracting the CBox  */
+  /*    which can be eventually converted back to font units.              */
+  /*                                                                       */
+  /*    Note that the maximum coordinates are exclusive, which means that  */
+  /*    one can compute the width and height of the glyph image (be it in  */
+  /*    integer or 26.6 pixels) as:                                        */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      width  = bbox.xMax - bbox.xMin;                                  */
+  /*      height = bbox.yMax - bbox.yMin;                                  */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    Note also that for 26.6 coordinates, if `bbox_mode' is set to      */
+  /*    @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted,  */
+  /*    which corresponds to:                                              */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      bbox.xMin = FLOOR(bbox.xMin);                                    */
+  /*      bbox.yMin = FLOOR(bbox.yMin);                                    */
+  /*      bbox.xMax = CEILING(bbox.xMax);                                  */
+  /*      bbox.yMax = CEILING(bbox.yMax);                                  */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    To get the bbox in pixel coordinates, set `bbox_mode' to           */
+  /*    @FT_GLYPH_BBOX_TRUNCATE.                                           */
+  /*                                                                       */
+  /*    To get the bbox in grid-fitted pixel coordinates, set `bbox_mode'  */
+  /*    to @FT_GLYPH_BBOX_PIXELS.                                          */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Glyph_Get_CBox( FT_Glyph  glyph,
+                     FT_UInt   bbox_mode,
+                     FT_BBox  *acbox );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Glyph_To_Bitmap                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Convert a given glyph object to a bitmap glyph object.             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    the_glyph   :: A pointer to a handle to the target glyph.          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    render_mode :: An enumeration that describes how the data is       */
+  /*                   rendered.                                           */
+  /*                                                                       */
+  /*    origin      :: A pointer to a vector used to translate the glyph   */
+  /*                   image before rendering.  Can be~0 (if no            */
+  /*                   translation).  The origin is expressed in           */
+  /*                   26.6 pixels.                                        */
+  /*                                                                       */
+  /*    destroy     :: A boolean that indicates that the original glyph    */
+  /*                   image should be destroyed by this function.  It is  */
+  /*                   never destroyed in case of error.                   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function does nothing if the glyph format isn't scalable.     */
+  /*                                                                       */
+  /*    The glyph image is translated with the `origin' vector before      */
+  /*    rendering.                                                         */
+  /*                                                                       */
+  /*    The first parameter is a pointer to an @FT_Glyph handle, that will */
+  /*    be _replaced_ by this function (with newly allocated data).        */
+  /*    Typically, you would use (omitting error handling):                */
+  /*                                                                       */
+  /*                                                                       */
+  /*      {                                                                */
+  /*        FT_Glyph        glyph;                                         */
+  /*        FT_BitmapGlyph  glyph_bitmap;                                  */
+  /*                                                                       */
+  /*                                                                       */
+  /*        // load glyph                                                  */
+  /*        error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT );     */
+  /*                                                                       */
+  /*        // extract glyph image                                         */
+  /*        error = FT_Get_Glyph( face->glyph, &glyph );                   */
+  /*                                                                       */
+  /*        // convert to a bitmap (default render mode + destroying old)  */
+  /*        if ( glyph->format != FT_GLYPH_FORMAT_BITMAP )                 */
+  /*        {                                                              */
+  /*          error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL,   */
+  /*                                      0, 1 );                          */
+  /*          if ( error ) // `glyph' unchanged                            */
+  /*            ...                                                        */
+  /*        }                                                              */
+  /*                                                                       */
+  /*        // access bitmap content by typecasting                        */
+  /*        glyph_bitmap = (FT_BitmapGlyph)glyph;                          */
+  /*                                                                       */
+  /*        // do funny stuff with it, like blitting/drawing               */
+  /*        ...                                                            */
+  /*                                                                       */
+  /*        // discard glyph image (bitmap or not)                         */
+  /*        FT_Done_Glyph( glyph );                                        */
+  /*      }                                                                */
+  /*                                                                       */
+  /*                                                                       */
+  /*    Here another example, again without error handling:                */
+  /*                                                                       */
+  /*                                                                       */
+  /*      {                                                                */
+  /*        FT_Glyph  glyphs[MAX_GLYPHS]                                   */
+  /*                                                                       */
+  /*                                                                       */
+  /*        ...                                                            */
+  /*                                                                       */
+  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */
+  /*          error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) ||       */
+  /*                  FT_Get_Glyph ( face->glyph, &glyph[idx] );           */
+  /*                                                                       */
+  /*        ...                                                            */
+  /*                                                                       */
+  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */
+  /*        {                                                              */
+  /*          FT_Glyph  bitmap = glyphs[idx];                              */
+  /*                                                                       */
+  /*                                                                       */
+  /*          ...                                                          */
+  /*                                                                       */
+  /*          // after this call, `bitmap' no longer points into           */
+  /*          // the `glyphs' array (and the old value isn't destroyed)    */
+  /*          FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 );    */
+  /*                                                                       */
+  /*          ...                                                          */
+  /*                                                                       */
+  /*          FT_Done_Glyph( bitmap );                                     */
+  /*        }                                                              */
+  /*                                                                       */
+  /*        ...                                                            */
+  /*                                                                       */
+  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */
+  /*          FT_Done_Glyph( glyphs[idx] );                                */
+  /*      }                                                                */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Glyph_To_Bitmap( FT_Glyph*       the_glyph,
+                      FT_Render_Mode  render_mode,
+                      FT_Vector*      origin,
+                      FT_Bool         destroy );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_Glyph                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroy a given glyph.                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    glyph :: A handle to the target glyph object.                      */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Done_Glyph( FT_Glyph  glyph );
+
+  /* */
+
+
+  /* other helpful functions */
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    computations                                                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Matrix_Multiply                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Perform the matrix operation `b = a*b'.                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    a :: A pointer to matrix `a'.                                      */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    b :: A pointer to matrix `b'.                                      */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The result is undefined if either `a' or `b' is zero.              */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Matrix_Multiply( const FT_Matrix*  a,
+                      FT_Matrix*        b );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Matrix_Invert                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Invert a 2x2 matrix.  Return an error if it can't be inverted.     */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    matrix :: A pointer to the target matrix.  Remains untouched in    */
+  /*              case of error.                                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Matrix_Invert( FT_Matrix*  matrix );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGLYPH_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/include/freetype/ftgxval.h b/include/freetype/ftgxval.h
new file mode 100644 (file)
index 0000000..497015c
--- /dev/null
@@ -0,0 +1,358 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgxval.h                                                              */
+/*                                                                         */
+/*    FreeType API for validating TrueTypeGX/AAT tables (specification).   */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2006 by                                          */
+/*  Masatake YAMATO, Redhat K.K,                                           */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTGXVAL_H__
+#define __FTGXVAL_H__
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    gx_validation                                                      */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    TrueTypeGX/AAT Validation                                          */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    An API to validate TrueTypeGX/AAT tables.                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of functions to validate     */
+  /*    some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd,  */
+  /*    trak, prop, lcar).                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                                                                       */
+  /* Warning: Use FT_VALIDATE_XXX to validate a table.                     */
+  /*          Following definitions are for gxvalid developers.            */
+  /*                                                                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+#define FT_VALIDATE_feat_INDEX     0
+#define FT_VALIDATE_mort_INDEX     1
+#define FT_VALIDATE_morx_INDEX     2
+#define FT_VALIDATE_bsln_INDEX     3
+#define FT_VALIDATE_just_INDEX     4
+#define FT_VALIDATE_kern_INDEX     5
+#define FT_VALIDATE_opbd_INDEX     6
+#define FT_VALIDATE_trak_INDEX     7
+#define FT_VALIDATE_prop_INDEX     8
+#define FT_VALIDATE_lcar_INDEX     9
+#define FT_VALIDATE_GX_LAST_INDEX  FT_VALIDATE_lcar_INDEX
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_VALIDATE_GX_LENGTH
+   *
+   * @description:
+   *   The number of tables checked in this module.  Use it as a parameter
+   *   for the `table-length' argument of function @FT_TrueTypeGX_Validate.
+   */
+#define FT_VALIDATE_GX_LENGTH     (FT_VALIDATE_GX_LAST_INDEX + 1)
+
+  /* */
+
+  /* Up to 0x1000 is used by otvalid.
+     Ox2xxx is reserved for feature OT extension. */
+#define FT_VALIDATE_GX_START 0x4000
+#define FT_VALIDATE_GX_BITFIELD( tag )                  \
+  ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX )
+
+
+ /**********************************************************************
+  *
+  * @enum:
+  *    FT_VALIDATE_GXXXX
+  *
+  * @description:
+  *    A list of bit-field constants used with @FT_TrueTypeGX_Validate to
+  *    indicate which TrueTypeGX/AAT Type tables should be validated.
+  *
+  * @values:
+  *    FT_VALIDATE_feat ::
+  *      Validate `feat' table.
+  *
+  *    FT_VALIDATE_mort ::
+  *      Validate `mort' table.
+  *
+  *    FT_VALIDATE_morx ::
+  *      Validate `morx' table.
+  *
+  *    FT_VALIDATE_bsln ::
+  *      Validate `bsln' table.
+  *
+  *    FT_VALIDATE_just ::
+  *      Validate `just' table.
+  *
+  *    FT_VALIDATE_kern ::
+  *      Validate `kern' table.
+  *
+  *    FT_VALIDATE_opbd ::
+  *      Validate `opbd' table.
+  *
+  *    FT_VALIDATE_trak ::
+  *      Validate `trak' table.
+  *
+  *    FT_VALIDATE_prop ::
+  *      Validate `prop' table.
+  *
+  *    FT_VALIDATE_lcar ::
+  *      Validate `lcar' table.
+  *
+  *    FT_VALIDATE_GX ::
+  *      Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern,
+  *      opbd, trak, prop and lcar).
+  *
+  */
+
+#define FT_VALIDATE_feat  FT_VALIDATE_GX_BITFIELD( feat )
+#define FT_VALIDATE_mort  FT_VALIDATE_GX_BITFIELD( mort )
+#define FT_VALIDATE_morx  FT_VALIDATE_GX_BITFIELD( morx )
+#define FT_VALIDATE_bsln  FT_VALIDATE_GX_BITFIELD( bsln )
+#define FT_VALIDATE_just  FT_VALIDATE_GX_BITFIELD( just )
+#define FT_VALIDATE_kern  FT_VALIDATE_GX_BITFIELD( kern )
+#define FT_VALIDATE_opbd  FT_VALIDATE_GX_BITFIELD( opbd )
+#define FT_VALIDATE_trak  FT_VALIDATE_GX_BITFIELD( trak )
+#define FT_VALIDATE_prop  FT_VALIDATE_GX_BITFIELD( prop )
+#define FT_VALIDATE_lcar  FT_VALIDATE_GX_BITFIELD( lcar )
+
+#define FT_VALIDATE_GX  ( FT_VALIDATE_feat | \
+                          FT_VALIDATE_mort | \
+                          FT_VALIDATE_morx | \
+                          FT_VALIDATE_bsln | \
+                          FT_VALIDATE_just | \
+                          FT_VALIDATE_kern | \
+                          FT_VALIDATE_opbd | \
+                          FT_VALIDATE_trak | \
+                          FT_VALIDATE_prop | \
+                          FT_VALIDATE_lcar )
+
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_TrueTypeGX_Validate
+  *
+  * @description:
+  *    Validate various TrueTypeGX tables to assure that all offsets and
+  *    indices are valid.  The idea is that a higher-level library which
+  *    actually does the text layout can access those tables without
+  *    error checking (which can be quite time consuming).
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    validation_flags ::
+  *       A bit field which specifies the tables to be validated.  See
+  *       @FT_VALIDATE_GXXXX for possible values.
+  *
+  *    table_length ::
+  *       The size of the `tables' array.  Normally, @FT_VALIDATE_GX_LENGTH
+  *       should be passed.
+  *
+  * @output:
+  *    tables ::
+  *       The array where all validated sfnt tables are stored.
+  *       The array itself must be allocated by a client.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   This function only works with TrueTypeGX fonts, returning an error
+  *   otherwise.
+  *
+  *   After use, the application should deallocate the buffers pointed to by
+  *   each `tables' element, by calling @FT_TrueTypeGX_Free.  A NULL value
+  *   indicates that the table either doesn't exist in the font, the
+  *   application hasn't asked for validation, or the validator doesn't have
+  *   the ability to validate the sfnt table.
+  */
+  FT_EXPORT( FT_Error )
+  FT_TrueTypeGX_Validate( FT_Face   face,
+                          FT_UInt   validation_flags,
+                          FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],
+                          FT_UInt   table_length );
+
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_TrueTypeGX_Free
+  *
+  * @description:
+  *    Free the buffer allocated by TrueTypeGX validator.
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    table ::
+  *       The pointer to the buffer allocated by
+  *       @FT_TrueTypeGX_Validate.
+  *
+  * @note:
+  *   This function must be used to free the buffer allocated by
+  *   @FT_TrueTypeGX_Validate only.
+  */
+  FT_EXPORT( void )
+  FT_TrueTypeGX_Free( FT_Face   face,
+                      FT_Bytes  table );
+
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @enum:
+  *    FT_VALIDATE_CKERNXXX
+  *
+  * @description:
+  *    A list of bit-field constants used with @FT_ClassicKern_Validate
+  *    to indicate the classic kern dialect or dialects.  If the selected
+  *    type doesn't fit, @FT_ClassicKern_Validate regards the table as
+  *    invalid.
+  *
+  * @values:
+  *    FT_VALIDATE_MS ::
+  *      Handle the `kern' table as a classic Microsoft kern table.
+  *
+  *    FT_VALIDATE_APPLE ::
+  *      Handle the `kern' table as a classic Apple kern table.
+  *
+  *    FT_VALIDATE_CKERN ::
+  *      Handle the `kern' as either classic Apple or Microsoft kern table.
+  */
+#define FT_VALIDATE_MS     ( FT_VALIDATE_GX_START << 0 )
+#define FT_VALIDATE_APPLE  ( FT_VALIDATE_GX_START << 1 )
+
+#define FT_VALIDATE_CKERN  ( FT_VALIDATE_MS | FT_VALIDATE_APPLE )
+
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_ClassicKern_Validate
+  *
+  * @description:
+  *    Validate classic (16-bit format) kern table to assure that the offsets
+  *    and indices are valid.  The idea is that a higher-level library which
+  *    actually does the text layout can access those tables without error
+  *    checking (which can be quite time consuming).
+  *
+  *    The `kern' table validator in @FT_TrueTypeGX_Validate deals with both
+  *    the new 32-bit format and the classic 16-bit format, while
+  *    FT_ClassicKern_Validate only supports the classic 16-bit format.
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    validation_flags ::
+  *       A bit field which specifies the dialect to be validated.  See
+  *       @FT_VALIDATE_CKERNXXX for possible values.
+  *
+  * @output:
+  *    ckern_table ::
+  *       A pointer to the kern table.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   After use, the application should deallocate the buffers pointed to by
+  *   `ckern_table', by calling @FT_ClassicKern_Free.  A NULL value
+  *   indicates that the table doesn't exist in the font.
+  */
+  FT_EXPORT( FT_Error )
+  FT_ClassicKern_Validate( FT_Face    face,
+                           FT_UInt    validation_flags,
+                           FT_Bytes  *ckern_table );
+
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_ClassicKern_Free
+  *
+  * @description:
+  *    Free the buffer allocated by classic Kern validator.
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    table ::
+  *       The pointer to the buffer that is allocated by
+  *       @FT_ClassicKern_Validate.
+  *
+  * @note:
+  *   This function must be used to free the buffer allocated by
+  *   @FT_ClassicKern_Validate only.
+  */
+  FT_EXPORT( void )
+  FT_ClassicKern_Free( FT_Face   face,
+                       FT_Bytes  table );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGXVAL_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftgzip.h b/include/freetype/ftgzip.h
new file mode 100644 (file)
index 0000000..acbc4f0
--- /dev/null
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgzip.h                                                               */
+/*                                                                         */
+/*    Gzip-compressed stream support.                                      */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTGZIP_H__
+#define __FTGZIP_H__
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    gzip                                                               */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    GZIP Streams                                                       */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Using gzip-compressed font files.                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of Gzip-specific functions.  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+ /************************************************************************
+  *
+  * @function:
+  *   FT_Stream_OpenGzip
+  *
+  * @description:
+  *   Open a new stream to parse gzip-compressed font files.  This is
+  *   mainly used to support the compressed `*.pcf.gz' fonts that come
+  *   with XFree86.
+  *
+  * @input:
+  *   stream ::
+  *     The target embedding stream.
+  *
+  *   source ::
+  *     The source stream.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   The source stream must be opened _before_ calling this function.
+  *
+  *   Calling the internal function `FT_Stream_Close' on the new stream will
+  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream
+  *   objects will be released to the heap.
+  *
+  *   The stream implementation is very basic and resets the decompression
+  *   process each time seeking backwards is needed within the stream.
+  *
+  *   In certain builds of the library, gzip compression recognition is
+  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.
+  *   This means that if no font driver is capable of handling the raw
+  *   compressed file, the library will try to open a gzipped stream from
+  *   it and re-open the face with it.
+  *
+  *   This function may return `FT_Err_Unimplemented_Feature' if your build
+  *   of FreeType was not compiled with zlib support.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Stream_OpenGzip( FT_Stream  stream,
+                      FT_Stream  source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGZIP_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftimage.h b/include/freetype/ftimage.h
new file mode 100644 (file)
index 0000000..04b5e04
--- /dev/null
@@ -0,0 +1,1313 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftimage.h                                                              */
+/*                                                                         */
+/*    FreeType glyph image formats and default raster interface            */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Note: A `raster' is simply a scan-line converter, used to render      */
+  /*       FT_Outlines into FT_Bitmaps.                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTIMAGE_H__
+#define __FTIMAGE_H__
+
+
+  /* _STANDALONE_ is from ftgrays.c */
+#ifndef _STANDALONE_
+#include <ft2build.h>
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    basic_types                                                        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Pos                                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The type FT_Pos is used to store vectorial coordinates.  Depending */
+  /*    on the context, these can represent distances in integer font      */
+  /*    units, or 16.16, or 26.6 fixed float pixel coordinates.            */
+  /*                                                                       */
+  typedef signed long  FT_Pos;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Vector                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to store a 2D vector; coordinates are of   */
+  /*    the FT_Pos type.                                                   */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    x :: The horizontal coordinate.                                    */
+  /*    y :: The vertical coordinate.                                      */
+  /*                                                                       */
+  typedef struct  FT_Vector_
+  {
+    FT_Pos  x;
+    FT_Pos  y;
+
+  } FT_Vector;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_BBox                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to hold an outline's bounding box, i.e., the      */
+  /*    coordinates of its extrema in the horizontal and vertical          */
+  /*    directions.                                                        */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    xMin :: The horizontal minimum (left-most).                        */
+  /*                                                                       */
+  /*    yMin :: The vertical minimum (bottom-most).                        */
+  /*                                                                       */
+  /*    xMax :: The horizontal maximum (right-most).                       */
+  /*                                                                       */
+  /*    yMax :: The vertical maximum (top-most).                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The bounding box is specified with the coordinates of the lower    */
+  /*    left and the upper right corner.  In PostScript, those values are  */
+  /*    often called (llx,lly) and (urx,ury), respectively.                */
+  /*                                                                       */
+  /*    If `yMin' is negative, this value gives the glyph's descender.     */
+  /*    Otherwise, the glyph doesn't descend below the baseline.           */
+  /*    Similarly, if `ymax' is positive, this value gives the glyph's     */
+  /*    ascender.                                                          */
+  /*                                                                       */
+  /*    `xMin' gives the horizontal distance from the glyph's origin to    */
+  /*    the left edge of the glyph's bounding box.  If `xMin' is negative, */
+  /*    the glyph extends to the left of the origin.                       */
+  /*                                                                       */
+  typedef struct  FT_BBox_
+  {
+    FT_Pos  xMin, yMin;
+    FT_Pos  xMax, yMax;
+
+  } FT_BBox;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Pixel_Mode                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration type used to describe the format of pixels in a     */
+  /*    given bitmap.  Note that additional formats may be added in the    */
+  /*    future.                                                            */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_PIXEL_MODE_NONE ::                                              */
+  /*      Value~0 is reserved.                                             */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_MONO ::                                              */
+  /*      A monochrome bitmap, using 1~bit per pixel.  Note that pixels    */
+  /*      are stored in most-significant order (MSB), which means that     */
+  /*      the left-most pixel in a byte has value 128.                     */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_GRAY ::                                              */
+  /*      An 8-bit bitmap, generally used to represent anti-aliased glyph  */
+  /*      images.  Each pixel is stored in one byte.  Note that the number */
+  /*      of `gray' levels is stored in the `num_grays' field of the       */
+  /*      @FT_Bitmap structure (it generally is 256).                      */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_GRAY2 ::                                             */
+  /*      A 2-bit per pixel bitmap, used to represent embedded             */
+  /*      anti-aliased bitmaps in font files according to the OpenType     */
+  /*      specification.  We haven't found a single font using this        */
+  /*      format, however.                                                 */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_GRAY4 ::                                             */
+  /*      A 4-bit per pixel bitmap, representing embedded anti-aliased     */
+  /*      bitmaps in font files according to the OpenType specification.   */
+  /*      We haven't found a single font using this format, however.       */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_LCD ::                                               */
+  /*      An 8-bit bitmap, representing RGB or BGR decimated glyph images  */
+  /*      used for display on LCD displays; the bitmap is three times      */
+  /*      wider than the original glyph image.  See also                   */
+  /*      @FT_RENDER_MODE_LCD.                                             */
+  /*                                                                       */
+  /*    FT_PIXEL_MODE_LCD_V ::                                             */
+  /*      An 8-bit bitmap, representing RGB or BGR decimated glyph images  */
+  /*      used for display on rotated LCD displays; the bitmap is three    */
+  /*      times taller than the original glyph image.  See also            */
+  /*      @FT_RENDER_MODE_LCD_V.                                           */
+  /*                                                                       */
+  typedef enum  FT_Pixel_Mode_
+  {
+    FT_PIXEL_MODE_NONE = 0,
+    FT_PIXEL_MODE_MONO,
+    FT_PIXEL_MODE_GRAY,
+    FT_PIXEL_MODE_GRAY2,
+    FT_PIXEL_MODE_GRAY4,
+    FT_PIXEL_MODE_LCD,
+    FT_PIXEL_MODE_LCD_V,
+
+    FT_PIXEL_MODE_MAX      /* do not remove */
+
+  } FT_Pixel_Mode;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    ft_pixel_mode_xxx                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of deprecated constants.  Use the corresponding             */
+  /*    @FT_Pixel_Mode values instead.                                     */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    ft_pixel_mode_none  :: See @FT_PIXEL_MODE_NONE.                    */
+  /*    ft_pixel_mode_mono  :: See @FT_PIXEL_MODE_MONO.                    */
+  /*    ft_pixel_mode_grays :: See @FT_PIXEL_MODE_GRAY.                    */
+  /*    ft_pixel_mode_pal2  :: See @FT_PIXEL_MODE_GRAY2.                   */
+  /*    ft_pixel_mode_pal4  :: See @FT_PIXEL_MODE_GRAY4.                   */
+  /*                                                                       */
+#define ft_pixel_mode_none   FT_PIXEL_MODE_NONE
+#define ft_pixel_mode_mono   FT_PIXEL_MODE_MONO
+#define ft_pixel_mode_grays  FT_PIXEL_MODE_GRAY
+#define ft_pixel_mode_pal2   FT_PIXEL_MODE_GRAY2
+#define ft_pixel_mode_pal4   FT_PIXEL_MODE_GRAY4
+
+ /* */
+
+#if 0
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Palette_Mode                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    THIS TYPE IS DEPRECATED.  DO NOT USE IT!                           */
+  /*                                                                       */
+  /*    An enumeration type to describe the format of a bitmap palette,    */
+  /*    used with ft_pixel_mode_pal4 and ft_pixel_mode_pal8.               */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    ft_palette_mode_rgb  :: The palette is an array of 3-byte RGB      */
+  /*                            records.                                   */
+  /*                                                                       */
+  /*    ft_palette_mode_rgba :: The palette is an array of 4-byte RGBA     */
+  /*                            records.                                   */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    As ft_pixel_mode_pal2, pal4 and pal8 are currently unused by       */
+  /*    FreeType, these types are not handled by the library itself.       */
+  /*                                                                       */
+  typedef enum  FT_Palette_Mode_
+  {
+    ft_palette_mode_rgb = 0,
+    ft_palette_mode_rgba,
+
+    ft_palette_mode_max   /* do not remove */
+
+  } FT_Palette_Mode;
+
+  /* */
+
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Bitmap                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to describe a bitmap or pixmap to the raster.     */
+  /*    Note that we now manage pixmaps of various depths through the      */
+  /*    `pixel_mode' field.                                                */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    rows         :: The number of bitmap rows.                         */
+  /*                                                                       */
+  /*    width        :: The number of pixels in bitmap row.                */
+  /*                                                                       */
+  /*    pitch        :: The pitch's absolute value is the number of bytes  */
+  /*                    taken by one bitmap row, including padding.        */
+  /*                    However, the pitch is positive when the bitmap has */
+  /*                    a `down' flow, and negative when it has an `up'    */
+  /*                    flow.  In all cases, the pitch is an offset to add */
+  /*                    to a bitmap pointer in order to go down one row.   */
+  /*                                                                       */
+  /*                    Note that `padding' means the alignment of a       */
+  /*                    bitmap to a byte border, and FreeType functions    */
+  /*                    normally align to the smallest possible integer    */
+  /*                    value.                                             */
+  /*                                                                       */
+  /*                    For the B/W rasterizer, `pitch' is always an even  */
+  /*                    number.                                            */
+  /*                                                                       */
+  /*                    To change the pitch of a bitmap (say, to make it a */
+  /*                    multiple of 4), use @FT_Bitmap_Convert.            */
+  /*                    Alternatively, you might use callback functions to */
+  /*                    directly render to the application's surface; see  */
+  /*                    the file `example2.cpp' in the tutorial for a      */
+  /*                    demonstration.                                     */
+  /*                                                                       */
+  /*    buffer       :: A typeless pointer to the bitmap buffer.  This     */
+  /*                    value should be aligned on 32-bit boundaries in    */
+  /*                    most cases.                                        */
+  /*                                                                       */
+  /*    num_grays    :: This field is only used with                       */
+  /*                    @FT_PIXEL_MODE_GRAY; it gives the number of gray   */
+  /*                    levels used in the bitmap.                         */
+  /*                                                                       */
+  /*    pixel_mode   :: The pixel mode, i.e., how pixel bits are stored.   */
+  /*                    See @FT_Pixel_Mode for possible values.            */
+  /*                                                                       */
+  /*    palette_mode :: This field is intended for paletted pixel modes;   */
+  /*                    it indicates how the palette is stored.  Not       */
+  /*                    used currently.                                    */
+  /*                                                                       */
+  /*    palette      :: A typeless pointer to the bitmap palette; this     */
+  /*                    field is intended for paletted pixel modes.  Not   */
+  /*                    used currently.                                    */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*   For now, the only pixel modes supported by FreeType are mono and    */
+  /*   grays.  However, drivers might be added in the future to support    */
+  /*   more `colorful' options.                                            */
+  /*                                                                       */
+  typedef struct  FT_Bitmap_
+  {
+    int             rows;
+    int             width;
+    int             pitch;
+    unsigned char*  buffer;
+    short           num_grays;
+    char            pixel_mode;
+    char            palette_mode;
+    void*           palette;
+
+  } FT_Bitmap;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    outline_processing                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Outline                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure is used to describe an outline to the scan-line     */
+  /*    converter.                                                         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    n_contours :: The number of contours in the outline.               */
+  /*                                                                       */
+  /*    n_points   :: The number of points in the outline.                 */
+  /*                                                                       */
+  /*    points     :: A pointer to an array of `n_points' @FT_Vector       */
+  /*                  elements, giving the outline's point coordinates.    */
+  /*                                                                       */
+  /*    tags       :: A pointer to an array of `n_points' chars, giving    */
+  /*                  each outline point's type.                           */
+  /*                                                                       */
+  /*                  If bit~0 is unset, the point is `off' the curve,     */
+  /*                  i.e., a Bézier control point, while it is `on' if    */
+  /*                  set.                                                 */
+  /*                                                                       */
+  /*                  Bit~1 is meaningful for `off' points only.  If set,  */
+  /*                  it indicates a third-order Bézier arc control point; */
+  /*                  and a second-order control point if unset.           */
+  /*                                                                       */
+  /*                  If bit~2 is set, bits 5-7 contain the drop-out mode  */
+  /*                  (as defined in the OpenType specification; the value */
+  /*                  is the same as the argument to the SCANMODE          */
+  /*                  instruction).                                        */
+  /*                                                                       */
+  /*                  Bits 3 and~4 are reserved for internal purposes.     */
+  /*                                                                       */
+  /*    contours   :: An array of `n_contours' shorts, giving the end      */
+  /*                  point of each contour within the outline.  For       */
+  /*                  example, the first contour is defined by the points  */
+  /*                  `0' to `contours[0]', the second one is defined by   */
+  /*                  the points `contours[0]+1' to `contours[1]', etc.    */
+  /*                                                                       */
+  /*    flags      :: A set of bit flags used to characterize the outline  */
+  /*                  and give hints to the scan-converter and hinter on   */
+  /*                  how to convert/grid-fit it.  See @FT_OUTLINE_FLAGS.  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The B/W rasterizer only checks bit~2 in the `tags' array for the   */
+  /*    first point of each contour.  The drop-out mode as given with      */
+  /*    @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and       */
+  /*    @FT_OUTLINE_INCLUDE_STUBS in `flags' is then overridden.           */
+  /*                                                                       */
+  typedef struct  FT_Outline_
+  {
+    short       n_contours;      /* number of contours in glyph        */
+    short       n_points;        /* number of points in the glyph      */
+
+    FT_Vector*  points;          /* the outline's points               */
+    char*       tags;            /* the points flags                   */
+    short*      contours;        /* the contour end points             */
+
+    int         flags;           /* outline masks                      */
+
+  } FT_Outline;
+
+  /* Following limits must be consistent with */
+  /* FT_Outline.{n_contours,n_points}         */
+#define FT_OUTLINE_CONTOURS_MAX  SHRT_MAX
+#define FT_OUTLINE_POINTS_MAX    SHRT_MAX
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_OUTLINE_FLAGS                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of bit-field constants use for the flags in an outline's    */
+  /*    `flags' field.                                                     */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_OUTLINE_NONE ::                                                 */
+  /*      Value~0 is reserved.                                             */
+  /*                                                                       */
+  /*    FT_OUTLINE_OWNER ::                                                */
+  /*      If set, this flag indicates that the outline's field arrays      */
+  /*      (i.e., `points', `flags', and `contours') are `owned' by the     */
+  /*      outline object, and should thus be freed when it is destroyed.   */
+  /*                                                                       */
+  /*    FT_OUTLINE_EVEN_ODD_FILL ::                                        */
+  /*      By default, outlines are filled using the non-zero winding rule. */
+  /*      If set to 1, the outline will be filled using the even-odd fill  */
+  /*      rule (only works with the smooth rasterizer).                    */
+  /*                                                                       */
+  /*    FT_OUTLINE_REVERSE_FILL ::                                         */
+  /*      By default, outside contours of an outline are oriented in       */
+  /*      clock-wise direction, as defined in the TrueType specification.  */
+  /*      This flag is set if the outline uses the opposite direction      */
+  /*      (typically for Type~1 fonts).  This flag is ignored by the scan  */
+  /*      converter.                                                       */
+  /*                                                                       */
+  /*    FT_OUTLINE_IGNORE_DROPOUTS ::                                      */
+  /*      By default, the scan converter will try to detect drop-outs in   */
+  /*      an outline and correct the glyph bitmap to ensure consistent     */
+  /*      shape continuity.  If set, this flag hints the scan-line         */
+  /*      converter to ignore such cases.  See below for more information. */
+  /*                                                                       */
+  /*    FT_OUTLINE_SMART_DROPOUTS ::                                       */
+  /*      Select smart dropout control.  If unset, use simple dropout      */
+  /*      control.  Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set.  See    */
+  /*      below for more information.                                      */
+  /*                                                                       */
+  /*    FT_OUTLINE_INCLUDE_STUBS ::                                        */
+  /*      If set, turn pixels on for `stubs', otherwise exclude them.      */
+  /*      Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set.  See below for    */
+  /*      more information.                                                */
+  /*                                                                       */
+  /*    FT_OUTLINE_HIGH_PRECISION ::                                       */
+  /*      This flag indicates that the scan-line converter should try to   */
+  /*      convert this outline to bitmaps with the highest possible        */
+  /*      quality.  It is typically set for small character sizes.  Note   */
+  /*      that this is only a hint that might be completely ignored by a   */
+  /*      given scan-converter.                                            */
+  /*                                                                       */
+  /*    FT_OUTLINE_SINGLE_PASS ::                                          */
+  /*      This flag is set to force a given scan-converter to only use a   */
+  /*      single pass over the outline to render a bitmap glyph image.     */
+  /*      Normally, it is set for very large character sizes.  It is only  */
+  /*      a hint that might be completely ignored by a given               */
+  /*      scan-converter.                                                  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, */
+  /*    and @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth            */
+  /*    rasterizer.                                                        */
+  /*                                                                       */
+  /*    There exists a second mechanism to pass the drop-out mode to the   */
+  /*    B/W rasterizer; see the `tags' field in @FT_Outline.               */
+  /*                                                                       */
+  /*    Please refer to the description of the `SCANTYPE' instruction in   */
+  /*    the OpenType specification (in file `ttinst1.doc') how simple      */
+  /*    drop-outs, smart drop-outs, and stubs are defined.                 */
+  /*                                                                       */
+#define FT_OUTLINE_NONE             0x0
+#define FT_OUTLINE_OWNER            0x1
+#define FT_OUTLINE_EVEN_ODD_FILL    0x2
+#define FT_OUTLINE_REVERSE_FILL     0x4
+#define FT_OUTLINE_IGNORE_DROPOUTS  0x8
+#define FT_OUTLINE_SMART_DROPOUTS   0x10
+#define FT_OUTLINE_INCLUDE_STUBS    0x20
+
+#define FT_OUTLINE_HIGH_PRECISION   0x100
+#define FT_OUTLINE_SINGLE_PASS      0x200
+
+
+ /*************************************************************************
+  *
+  * @enum:
+  *   ft_outline_flags
+  *
+  * @description:
+  *   These constants are deprecated.  Please use the corresponding
+  *   @FT_OUTLINE_FLAGS values.
+  *
+  * @values:
+  *   ft_outline_none            :: See @FT_OUTLINE_NONE.
+  *   ft_outline_owner           :: See @FT_OUTLINE_OWNER.
+  *   ft_outline_even_odd_fill   :: See @FT_OUTLINE_EVEN_ODD_FILL.
+  *   ft_outline_reverse_fill    :: See @FT_OUTLINE_REVERSE_FILL.
+  *   ft_outline_ignore_dropouts :: See @FT_OUTLINE_IGNORE_DROPOUTS.
+  *   ft_outline_high_precision  :: See @FT_OUTLINE_HIGH_PRECISION.
+  *   ft_outline_single_pass     :: See @FT_OUTLINE_SINGLE_PASS.
+  */
+#define ft_outline_none             FT_OUTLINE_NONE
+#define ft_outline_owner            FT_OUTLINE_OWNER
+#define ft_outline_even_odd_fill    FT_OUTLINE_EVEN_ODD_FILL
+#define ft_outline_reverse_fill     FT_OUTLINE_REVERSE_FILL
+#define ft_outline_ignore_dropouts  FT_OUTLINE_IGNORE_DROPOUTS
+#define ft_outline_high_precision   FT_OUTLINE_HIGH_PRECISION
+#define ft_outline_single_pass      FT_OUTLINE_SINGLE_PASS
+
+  /* */
+
+#define FT_CURVE_TAG( flag )  ( flag & 3 )
+
+#define FT_CURVE_TAG_ON            1
+#define FT_CURVE_TAG_CONIC         0
+#define FT_CURVE_TAG_CUBIC         2
+
+#define FT_CURVE_TAG_HAS_SCANMODE  4
+
+#define FT_CURVE_TAG_TOUCH_X       8  /* reserved for the TrueType hinter */
+#define FT_CURVE_TAG_TOUCH_Y      16  /* reserved for the TrueType hinter */
+
+#define FT_CURVE_TAG_TOUCH_BOTH    ( FT_CURVE_TAG_TOUCH_X | \
+                                     FT_CURVE_TAG_TOUCH_Y )
+
+#define FT_Curve_Tag_On       FT_CURVE_TAG_ON
+#define FT_Curve_Tag_Conic    FT_CURVE_TAG_CONIC
+#define FT_Curve_Tag_Cubic    FT_CURVE_TAG_CUBIC
+#define FT_Curve_Tag_Touch_X  FT_CURVE_TAG_TOUCH_X
+#define FT_Curve_Tag_Touch_Y  FT_CURVE_TAG_TOUCH_Y
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Outline_MoveToFunc                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function pointer type used to describe the signature of a `move  */
+  /*    to' function during outline walking/decomposition.                 */
+  /*                                                                       */
+  /*    A `move to' is emitted to start a new contour in an outline.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    to   :: A pointer to the target point of the `move to'.            */
+  /*                                                                       */
+  /*    user :: A typeless pointer which is passed from the caller of the  */
+  /*            decomposition function.                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0~means success.                                      */
+  /*                                                                       */
+  typedef int
+  (*FT_Outline_MoveToFunc)( const FT_Vector*  to,
+                            void*             user );
+
+#define FT_Outline_MoveTo_Func  FT_Outline_MoveToFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Outline_LineToFunc                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function pointer type used to describe the signature of a `line  */
+  /*    to' function during outline walking/decomposition.                 */
+  /*                                                                       */
+  /*    A `line to' is emitted to indicate a segment in the outline.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    to   :: A pointer to the target point of the `line to'.            */
+  /*                                                                       */
+  /*    user :: A typeless pointer which is passed from the caller of the  */
+  /*            decomposition function.                                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0~means success.                                      */
+  /*                                                                       */
+  typedef int
+  (*FT_Outline_LineToFunc)( const FT_Vector*  to,
+                            void*             user );
+
+#define FT_Outline_LineTo_Func  FT_Outline_LineToFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Outline_ConicToFunc                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function pointer type used to describe the signature of a `conic */
+  /*    to' function during outline walking or decomposition.              */
+  /*                                                                       */
+  /*    A `conic to' is emitted to indicate a second-order Bézier arc in   */
+  /*    the outline.                                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    control :: An intermediate control point between the last position */
+  /*               and the new target in `to'.                             */
+  /*                                                                       */
+  /*    to      :: A pointer to the target end point of the conic arc.     */
+  /*                                                                       */
+  /*    user    :: A typeless pointer which is passed from the caller of   */
+  /*               the decomposition function.                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0~means success.                                      */
+  /*                                                                       */
+  typedef int
+  (*FT_Outline_ConicToFunc)( const FT_Vector*  control,
+                             const FT_Vector*  to,
+                             void*             user );
+
+#define FT_Outline_ConicTo_Func  FT_Outline_ConicToFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Outline_CubicToFunc                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function pointer type used to describe the signature of a `cubic */
+  /*    to' function during outline walking or decomposition.              */
+  /*                                                                       */
+  /*    A `cubic to' is emitted to indicate a third-order Bézier arc.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    control1 :: A pointer to the first Bézier control point.           */
+  /*                                                                       */
+  /*    control2 :: A pointer to the second Bézier control point.          */
+  /*                                                                       */
+  /*    to       :: A pointer to the target end point.                     */
+  /*                                                                       */
+  /*    user     :: A typeless pointer which is passed from the caller of  */
+  /*                the decomposition function.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0~means success.                                      */
+  /*                                                                       */
+  typedef int
+  (*FT_Outline_CubicToFunc)( const FT_Vector*  control1,
+                             const FT_Vector*  control2,
+                             const FT_Vector*  to,
+                             void*             user );
+
+#define FT_Outline_CubicTo_Func  FT_Outline_CubicToFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Outline_Funcs                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure to hold various function pointers used during outline  */
+  /*    decomposition in order to emit segments, conic, and cubic Béziers. */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    move_to  :: The `move to' emitter.                                 */
+  /*                                                                       */
+  /*    line_to  :: The segment emitter.                                   */
+  /*                                                                       */
+  /*    conic_to :: The second-order Bézier arc emitter.                   */
+  /*                                                                       */
+  /*    cubic_to :: The third-order Bézier arc emitter.                    */
+  /*                                                                       */
+  /*    shift    :: The shift that is applied to coordinates before they   */
+  /*                are sent to the emitter.                               */
+  /*                                                                       */
+  /*    delta    :: The delta that is applied to coordinates before they   */
+  /*                are sent to the emitter, but after the shift.          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The point coordinates sent to the emitters are the transformed     */
+  /*    version of the original coordinates (this is important for high    */
+  /*    accuracy during scan-conversion).  The transformation is simple:   */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      x' = (x << shift) - delta                                        */
+  /*      y' = (x << shift) - delta                                        */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    Set the values of `shift' and `delta' to~0 to get the original     */
+  /*    point coordinates.                                                 */
+  /*                                                                       */
+  typedef struct  FT_Outline_Funcs_
+  {
+    FT_Outline_MoveToFunc   move_to;
+    FT_Outline_LineToFunc   line_to;
+    FT_Outline_ConicToFunc  conic_to;
+    FT_Outline_CubicToFunc  cubic_to;
+
+    int                     shift;
+    FT_Pos                  delta;
+
+  } FT_Outline_Funcs;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    basic_types                                                        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_IMAGE_TAG                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This macro converts four-letter tags to an unsigned long type.     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Since many 16-bit compilers don't like 32-bit enumerations, you    */
+  /*    should redefine this macro in case of problems to something like   */
+  /*    this:                                                              */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 )  value         */
+  /*    }                                                                  */
+  /*                                                                       */
+  /*    to get a simple enumeration without assigning special numbers.     */
+  /*                                                                       */
+#ifndef FT_IMAGE_TAG
+#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 )  \
+          value = ( ( (unsigned long)_x1 << 24 ) | \
+                    ( (unsigned long)_x2 << 16 ) | \
+                    ( (unsigned long)_x3 << 8  ) | \
+                      (unsigned long)_x4         )
+#endif /* FT_IMAGE_TAG */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Glyph_Format                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration type used to describe the format of a given glyph   */
+  /*    image.  Note that this version of FreeType only supports two image */
+  /*    formats, even though future font drivers will be able to register  */
+  /*    their own format.                                                  */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_GLYPH_FORMAT_NONE ::                                            */
+  /*      The value~0 is reserved.                                         */
+  /*                                                                       */
+  /*    FT_GLYPH_FORMAT_COMPOSITE ::                                       */
+  /*      The glyph image is a composite of several other images.  This    */
+  /*      format is _only_ used with @FT_LOAD_NO_RECURSE, and is used to   */
+  /*      report compound glyphs (like accented characters).               */
+  /*                                                                       */
+  /*    FT_GLYPH_FORMAT_BITMAP ::                                          */
+  /*      The glyph image is a bitmap, and can be described as an          */
+  /*      @FT_Bitmap.  You generally need to access the `bitmap' field of  */
+  /*      the @FT_GlyphSlotRec structure to read it.                       */
+  /*                                                                       */
+  /*    FT_GLYPH_FORMAT_OUTLINE ::                                         */
+  /*      The glyph image is a vectorial outline made of line segments     */
+  /*      and Bézier arcs; it can be described as an @FT_Outline; you      */
+  /*      generally want to access the `outline' field of the              */
+  /*      @FT_GlyphSlotRec structure to read it.                           */
+  /*                                                                       */
+  /*    FT_GLYPH_FORMAT_PLOTTER ::                                         */
+  /*      The glyph image is a vectorial path with no inside and outside   */
+  /*      contours.  Some Type~1 fonts, like those in the Hershey family,  */
+  /*      contain glyphs in this format.  These are described as           */
+  /*      @FT_Outline, but FreeType isn't currently capable of rendering   */
+  /*      them correctly.                                                  */
+  /*                                                                       */
+  typedef enum  FT_Glyph_Format_
+  {
+    FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ),
+
+    FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ),
+    FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP,    'b', 'i', 't', 's' ),
+    FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE,   'o', 'u', 't', 'l' ),
+    FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER,   'p', 'l', 'o', 't' )
+
+  } FT_Glyph_Format;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    ft_glyph_format_xxx                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of deprecated constants.  Use the corresponding             */
+  /*    @FT_Glyph_Format values instead.                                   */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    ft_glyph_format_none      :: See @FT_GLYPH_FORMAT_NONE.            */
+  /*    ft_glyph_format_composite :: See @FT_GLYPH_FORMAT_COMPOSITE.       */
+  /*    ft_glyph_format_bitmap    :: See @FT_GLYPH_FORMAT_BITMAP.          */
+  /*    ft_glyph_format_outline   :: See @FT_GLYPH_FORMAT_OUTLINE.         */
+  /*    ft_glyph_format_plotter   :: See @FT_GLYPH_FORMAT_PLOTTER.         */
+  /*                                                                       */
+#define ft_glyph_format_none       FT_GLYPH_FORMAT_NONE
+#define ft_glyph_format_composite  FT_GLYPH_FORMAT_COMPOSITE
+#define ft_glyph_format_bitmap     FT_GLYPH_FORMAT_BITMAP
+#define ft_glyph_format_outline    FT_GLYPH_FORMAT_OUTLINE
+#define ft_glyph_format_plotter    FT_GLYPH_FORMAT_PLOTTER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****            R A S T E R   D E F I N I T I O N S                *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* A raster is a scan converter, in charge of rendering an outline into  */
+  /* a a bitmap.  This section contains the public API for rasters.        */
+  /*                                                                       */
+  /* Note that in FreeType 2, all rasters are now encapsulated within      */
+  /* specific modules called `renderers'.  See `freetype/ftrender.h' for   */
+  /* more details on renderers.                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    raster                                                             */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Scanline Converter                                                 */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    How vectorial outlines are converted into bitmaps and pixmaps.     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains technical definitions.                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Raster                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle (pointer) to a raster object.  Each object can be used    */
+  /*    independently to convert an outline into a bitmap or pixmap.       */
+  /*                                                                       */
+  typedef struct FT_RasterRec_*  FT_Raster;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Span                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a single span of gray (or black) pixels  */
+  /*    when rendering a monochrome or anti-aliased bitmap.                */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    x        :: The span's horizontal start position.                  */
+  /*                                                                       */
+  /*    len      :: The span's length in pixels.                           */
+  /*                                                                       */
+  /*    coverage :: The span color/coverage, ranging from 0 (background)   */
+  /*                to 255 (foreground).  Only used for anti-aliased       */
+  /*                rendering.                                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This structure is used by the span drawing callback type named     */
+  /*    @FT_SpanFunc which takes the y~coordinate of the span as a         */
+  /*    a parameter.                                                       */
+  /*                                                                       */
+  /*    The coverage value is always between 0 and 255.  If you want less  */
+  /*    gray values, the callback function has to reduce them.             */
+  /*                                                                       */
+  typedef struct  FT_Span_
+  {
+    short           x;
+    unsigned short  len;
+    unsigned char   coverage;
+
+  } FT_Span;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_SpanFunc                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used as a call-back by the anti-aliased renderer in     */
+  /*    order to let client applications draw themselves the gray pixel    */
+  /*    spans on each scan line.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    y     :: The scanline's y~coordinate.                              */
+  /*                                                                       */
+  /*    count :: The number of spans to draw on this scanline.             */
+  /*                                                                       */
+  /*    spans :: A table of `count' spans to draw on the scanline.         */
+  /*                                                                       */
+  /*    user  :: User-supplied data that is passed to the callback.        */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This callback allows client applications to directly render the    */
+  /*    gray spans of the anti-aliased bitmap to any kind of surfaces.     */
+  /*                                                                       */
+  /*    This can be used to write anti-aliased outlines directly to a      */
+  /*    given background bitmap, and even perform translucency.            */
+  /*                                                                       */
+  /*    Note that the `count' field cannot be greater than a fixed value   */
+  /*    defined by the `FT_MAX_GRAY_SPANS' configuration macro in          */
+  /*    `ftoption.h'.  By default, this value is set to~32, which means    */
+  /*    that if there are more than 32~spans on a given scanline, the      */
+  /*    callback is called several times with the same `y' parameter in    */
+  /*    order to draw all callbacks.                                       */
+  /*                                                                       */
+  /*    Otherwise, the callback is only called once per scan-line, and     */
+  /*    only for those scanlines that do have `gray' pixels on them.       */
+  /*                                                                       */
+  typedef void
+  (*FT_SpanFunc)( int             y,
+                  int             count,
+                  const FT_Span*  spans,
+                  void*           user );
+
+#define FT_Raster_Span_Func  FT_SpanFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_BitTest_Func                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    THIS TYPE IS DEPRECATED.  DO NOT USE IT.                           */
+  /*                                                                       */
+  /*    A function used as a call-back by the monochrome scan-converter    */
+  /*    to test whether a given target pixel is already set to the drawing */
+  /*    `color'.  These tests are crucial to implement drop-out control    */
+  /*    per-se the TrueType spec.                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    y     :: The pixel's y~coordinate.                                 */
+  /*                                                                       */
+  /*    x     :: The pixel's x~coordinate.                                 */
+  /*                                                                       */
+  /*    user  :: User-supplied data that is passed to the callback.        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*   1~if the pixel is `set', 0~otherwise.                               */
+  /*                                                                       */
+  typedef int
+  (*FT_Raster_BitTest_Func)( int    y,
+                             int    x,
+                             void*  user );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_BitSet_Func                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    THIS TYPE IS DEPRECATED.  DO NOT USE IT.                           */
+  /*                                                                       */
+  /*    A function used as a call-back by the monochrome scan-converter    */
+  /*    to set an individual target pixel.  This is crucial to implement   */
+  /*    drop-out control according to the TrueType specification.          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    y     :: The pixel's y~coordinate.                                 */
+  /*                                                                       */
+  /*    x     :: The pixel's x~coordinate.                                 */
+  /*                                                                       */
+  /*    user  :: User-supplied data that is passed to the callback.        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    1~if the pixel is `set', 0~otherwise.                              */
+  /*                                                                       */
+  typedef void
+  (*FT_Raster_BitSet_Func)( int    y,
+                            int    x,
+                            void*  user );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_RASTER_FLAG_XXX                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of bit flag constants as used in the `flags' field of a     */
+  /*    @FT_Raster_Params structure.                                       */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_RASTER_FLAG_DEFAULT :: This value is 0.                         */
+  /*                                                                       */
+  /*    FT_RASTER_FLAG_AA      :: This flag is set to indicate that an     */
+  /*                              anti-aliased glyph image should be       */
+  /*                              generated.  Otherwise, it will be        */
+  /*                              monochrome (1-bit).                      */
+  /*                                                                       */
+  /*    FT_RASTER_FLAG_DIRECT  :: This flag is set to indicate direct      */
+  /*                              rendering.  In this mode, client         */
+  /*                              applications must provide their own span */
+  /*                              callback.  This lets them directly       */
+  /*                              draw or compose over an existing bitmap. */
+  /*                              If this bit is not set, the target       */
+  /*                              pixmap's buffer _must_ be zeroed before  */
+  /*                              rendering.                               */
+  /*                                                                       */
+  /*                              Note that for now, direct rendering is   */
+  /*                              only possible with anti-aliased glyphs.  */
+  /*                                                                       */
+  /*    FT_RASTER_FLAG_CLIP    :: This flag is only used in direct         */
+  /*                              rendering mode.  If set, the output will */
+  /*                              be clipped to a box specified in the     */
+  /*                              `clip_box' field of the                  */
+  /*                              @FT_Raster_Params structure.             */
+  /*                                                                       */
+  /*                              Note that by default, the glyph bitmap   */
+  /*                              is clipped to the target pixmap, except  */
+  /*                              in direct rendering mode where all spans */
+  /*                              are generated if no clipping box is set. */
+  /*                                                                       */
+#define FT_RASTER_FLAG_DEFAULT  0x0
+#define FT_RASTER_FLAG_AA       0x1
+#define FT_RASTER_FLAG_DIRECT   0x2
+#define FT_RASTER_FLAG_CLIP     0x4
+
+  /* deprecated */
+#define ft_raster_flag_default  FT_RASTER_FLAG_DEFAULT
+#define ft_raster_flag_aa       FT_RASTER_FLAG_AA
+#define ft_raster_flag_direct   FT_RASTER_FLAG_DIRECT
+#define ft_raster_flag_clip     FT_RASTER_FLAG_CLIP
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Raster_Params                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure to hold the arguments used by a raster's render        */
+  /*    function.                                                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    target      :: The target bitmap.                                  */
+  /*                                                                       */
+  /*    source      :: A pointer to the source glyph image (e.g., an       */
+  /*                   @FT_Outline).                                       */
+  /*                                                                       */
+  /*    flags       :: The rendering flags.                                */
+  /*                                                                       */
+  /*    gray_spans  :: The gray span drawing callback.                     */
+  /*                                                                       */
+  /*    black_spans :: The black span drawing callback.  UNIMPLEMENTED!    */
+  /*                                                                       */
+  /*    bit_test    :: The bit test callback.  UNIMPLEMENTED!              */
+  /*                                                                       */
+  /*    bit_set     :: The bit set callback.  UNIMPLEMENTED!               */
+  /*                                                                       */
+  /*    user        :: User-supplied data that is passed to each drawing   */
+  /*                   callback.                                           */
+  /*                                                                       */
+  /*    clip_box    :: An optional clipping box.  It is only used in       */
+  /*                   direct rendering mode.  Note that coordinates here  */
+  /*                   should be expressed in _integer_ pixels (and not in */
+  /*                   26.6 fixed-point units).                            */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA    */
+  /*    bit flag is set in the `flags' field, otherwise a monochrome       */
+  /*    bitmap is generated.                                               */
+  /*                                                                       */
+  /*    If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the      */
+  /*    raster will call the `gray_spans' callback to draw gray pixel      */
+  /*    spans, in the case of an aa glyph bitmap, it will call             */
+  /*    `black_spans', and `bit_test' and `bit_set' in the case of a       */
+  /*    monochrome bitmap.  This allows direct composition over a          */
+  /*    pre-existing bitmap through user-provided callbacks to perform the */
+  /*    span drawing/composition.                                          */
+  /*                                                                       */
+  /*    Note that the `bit_test' and `bit_set' callbacks are required when */
+  /*    rendering a monochrome bitmap, as they are crucial to implement    */
+  /*    correct drop-out control as defined in the TrueType specification. */
+  /*                                                                       */
+  typedef struct  FT_Raster_Params_
+  {
+    const FT_Bitmap*        target;
+    const void*             source;
+    int                     flags;
+    FT_SpanFunc             gray_spans;
+    FT_SpanFunc             black_spans;  /* doesn't work! */
+    FT_Raster_BitTest_Func  bit_test;     /* doesn't work! */
+    FT_Raster_BitSet_Func   bit_set;      /* doesn't work! */
+    void*                   user;
+    FT_BBox                 clip_box;
+
+  } FT_Raster_Params;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_NewFunc                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to create a new raster object.                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory :: A handle to the memory allocator.                        */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    raster :: A handle to the new raster object.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0~means success.                                      */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The `memory' parameter is a typeless pointer in order to avoid     */
+  /*    un-wanted dependencies on the rest of the FreeType code.  In       */
+  /*    practice, it is an @FT_Memory object, i.e., a handle to the        */
+  /*    standard FreeType memory allocator.  However, this field can be    */
+  /*    completely ignored by a given raster implementation.               */
+  /*                                                                       */
+  typedef int
+  (*FT_Raster_NewFunc)( void*       memory,
+                        FT_Raster*  raster );
+
+#define FT_Raster_New_Func  FT_Raster_NewFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_DoneFunc                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to destroy a given raster object.                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    raster :: A handle to the raster object.                           */
+  /*                                                                       */
+  typedef void
+  (*FT_Raster_DoneFunc)( FT_Raster  raster );
+
+#define FT_Raster_Done_Func  FT_Raster_DoneFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_ResetFunc                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    FreeType provides an area of memory called the `render pool',      */
+  /*    available to all registered rasters.  This pool can be freely used */
+  /*    during a given scan-conversion but is shared by all rasters.  Its  */
+  /*    content is thus transient.                                         */
+  /*                                                                       */
+  /*    This function is called each time the render pool changes, or just */
+  /*    after a new raster object is created.                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    raster    :: A handle to the new raster object.                    */
+  /*                                                                       */
+  /*    pool_base :: The address in memory of the render pool.             */
+  /*                                                                       */
+  /*    pool_size :: The size in bytes of the render pool.                 */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Rasters can ignore the render pool and rely on dynamic memory      */
+  /*    allocation if they want to (a handle to the memory allocator is    */
+  /*    passed to the raster constructor).  However, this is not           */
+  /*    recommended for efficiency purposes.                               */
+  /*                                                                       */
+  typedef void
+  (*FT_Raster_ResetFunc)( FT_Raster       raster,
+                          unsigned char*  pool_base,
+                          unsigned long   pool_size );
+
+#define FT_Raster_Reset_Func  FT_Raster_ResetFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_SetModeFunc                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is a generic facility to change modes or attributes  */
+  /*    in a given raster.  This can be used for debugging purposes, or    */
+  /*    simply to allow implementation-specific `features' in a given      */
+  /*    raster module.                                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    raster :: A handle to the new raster object.                       */
+  /*                                                                       */
+  /*    mode   :: A 4-byte tag used to name the mode or property.          */
+  /*                                                                       */
+  /*    args   :: A pointer to the new mode/property to use.               */
+  /*                                                                       */
+  typedef int
+  (*FT_Raster_SetModeFunc)( FT_Raster      raster,
+                            unsigned long  mode,
+                            void*          args );
+
+#define FT_Raster_Set_Mode_Func  FT_Raster_SetModeFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Raster_RenderFunc                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Invoke a given raster to scan-convert a given glyph image into a   */
+  /*    target bitmap.                                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    raster :: A handle to the raster object.                           */
+  /*                                                                       */
+  /*    params :: A pointer to an @FT_Raster_Params structure used to      */
+  /*              store the rendering parameters.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0~means success.                                      */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The exact format of the source image depends on the raster's glyph */
+  /*    format defined in its @FT_Raster_Funcs structure.  It can be an    */
+  /*    @FT_Outline or anything else in order to support a large array of  */
+  /*    glyph formats.                                                     */
+  /*                                                                       */
+  /*    Note also that the render function can fail and return a           */
+  /*    `FT_Err_Unimplemented_Feature' error code if the raster used does  */
+  /*    not support direct composition.                                    */
+  /*                                                                       */
+  /*    XXX: For now, the standard raster doesn't support direct           */
+  /*         composition but this should change for the final release (see */
+  /*         the files `demos/src/ftgrays.c' and `demos/src/ftgrays2.c'    */
+  /*         for examples of distinct implementations which support direct */
+  /*         composition).                                                 */
+  /*                                                                       */
+  typedef int
+  (*FT_Raster_RenderFunc)( FT_Raster                raster,
+                           const FT_Raster_Params*  params );
+
+#define FT_Raster_Render_Func  FT_Raster_RenderFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Raster_Funcs                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   A structure used to describe a given raster class to the library.   */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    glyph_format  :: The supported glyph format for this raster.       */
+  /*                                                                       */
+  /*    raster_new    :: The raster constructor.                           */
+  /*                                                                       */
+  /*    raster_reset  :: Used to reset the render pool within the raster.  */
+  /*                                                                       */
+  /*    raster_render :: A function to render a glyph into a given bitmap. */
+  /*                                                                       */
+  /*    raster_done   :: The raster destructor.                            */
+  /*                                                                       */
+  typedef struct  FT_Raster_Funcs_
+  {
+    FT_Glyph_Format        glyph_format;
+    FT_Raster_NewFunc      raster_new;
+    FT_Raster_ResetFunc    raster_reset;
+    FT_Raster_SetModeFunc  raster_set_mode;
+    FT_Raster_RenderFunc   raster_render;
+    FT_Raster_DoneFunc     raster_done;
+
+  } FT_Raster_Funcs;
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTIMAGE_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/include/freetype/ftincrem.h b/include/freetype/ftincrem.h
new file mode 100644 (file)
index 0000000..aaf689f
--- /dev/null
@@ -0,0 +1,353 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftincrem.h                                                             */
+/*                                                                         */
+/*    FreeType incremental loading (specification).                        */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2006, 2007, 2008, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTINCREM_H__
+#define __FTINCREM_H__
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /***************************************************************************
+   *
+   * @section:
+   *    incremental
+   *
+   * @title:
+   *    Incremental Loading
+   *
+   * @abstract:
+   *    Custom Glyph Loading.
+   *
+   * @description:
+   *   This section contains various functions used to perform so-called
+   *   `incremental' glyph loading.  This is a mode where all glyphs loaded
+   *   from a given @FT_Face are provided by the client application,
+   *
+   *   Apart from that, all other tables are loaded normally from the font
+   *   file.  This mode is useful when FreeType is used within another
+   *   engine, e.g., a PostScript Imaging Processor.
+   *
+   *   To enable this mode, you must use @FT_Open_Face, passing an
+   *   @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an
+   *   @FT_Incremental_Interface value.  See the comments for
+   *   @FT_Incremental_InterfaceRec for an example.
+   *
+   */
+
+
+  /***************************************************************************
+   *
+   * @type:
+   *   FT_Incremental
+   *
+   * @description:
+   *   An opaque type describing a user-provided object used to implement
+   *   `incremental' glyph loading within FreeType.  This is used to support
+   *   embedded fonts in certain environments (e.g., PostScript interpreters),
+   *   where the glyph data isn't in the font file, or must be overridden by
+   *   different values.
+   *
+   * @note:
+   *   It is up to client applications to create and implement @FT_Incremental
+   *   objects, as long as they provide implementations for the methods
+   *   @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc
+   *   and @FT_Incremental_GetGlyphMetricsFunc.
+   *
+   *   See the description of @FT_Incremental_InterfaceRec to understand how
+   *   to use incremental objects with FreeType.
+   *
+   */
+  typedef struct FT_IncrementalRec_*  FT_Incremental;
+
+
+  /***************************************************************************
+   *
+   * @struct:
+   *   FT_Incremental_MetricsRec
+   *
+   * @description:
+   *   A small structure used to contain the basic glyph metrics returned
+   *   by the @FT_Incremental_GetGlyphMetricsFunc method.
+   *
+   * @fields:
+   *   bearing_x ::
+   *     Left bearing, in font units.
+   *
+   *   bearing_y ::
+   *     Top bearing, in font units.
+   *
+   *   advance ::
+   *     Horizontal component of glyph advance, in font units.
+   *
+   *   advance_v ::
+   *     Vertical component of glyph advance, in font units.
+   *
+   * @note:
+   *   These correspond to horizontal or vertical metrics depending on the
+   *   value of the `vertical' argument to the function
+   *   @FT_Incremental_GetGlyphMetricsFunc.
+   *
+   */
+  typedef struct  FT_Incremental_MetricsRec_
+  {
+    FT_Long  bearing_x;
+    FT_Long  bearing_y;
+    FT_Long  advance;
+    FT_Long  advance_v;     /* since 2.3.12 */
+
+  } FT_Incremental_MetricsRec;
+
+
+  /***************************************************************************
+   *
+   * @struct:
+   *   FT_Incremental_Metrics
+   *
+   * @description:
+   *   A handle to an @FT_Incremental_MetricsRec structure.
+   *
+   */
+   typedef struct FT_Incremental_MetricsRec_*  FT_Incremental_Metrics;
+
+
+  /***************************************************************************
+   *
+   * @type:
+   *   FT_Incremental_GetGlyphDataFunc
+   *
+   * @description:
+   *   A function called by FreeType to access a given glyph's data bytes
+   *   during @FT_Load_Glyph or @FT_Load_Char if incremental loading is
+   *   enabled.
+   *
+   *   Note that the format of the glyph's data bytes depends on the font
+   *   file format.  For TrueType, it must correspond to the raw bytes within
+   *   the `glyf' table.  For PostScript formats, it must correspond to the
+   *   *unencrypted* charstring bytes, without any `lenIV' header.  It is
+   *   undefined for any other format.
+   *
+   * @input:
+   *   incremental ::
+   *     Handle to an opaque @FT_Incremental handle provided by the client
+   *     application.
+   *
+   *   glyph_index ::
+   *     Index of relevant glyph.
+   *
+   * @output:
+   *   adata ::
+   *     A structure describing the returned glyph data bytes (which will be
+   *     accessed as a read-only byte block).
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   If this function returns successfully the method
+   *   @FT_Incremental_FreeGlyphDataFunc will be called later to release
+   *   the data bytes.
+   *
+   *   Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for
+   *   compound glyphs.
+   *
+   */
+  typedef FT_Error
+  (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental  incremental,
+                                      FT_UInt         glyph_index,
+                                      FT_Data*        adata );
+
+
+  /***************************************************************************
+   *
+   * @type:
+   *   FT_Incremental_FreeGlyphDataFunc
+   *
+   * @description:
+   *   A function used to release the glyph data bytes returned by a
+   *   successful call to @FT_Incremental_GetGlyphDataFunc.
+   *
+   * @input:
+   *   incremental ::
+   *     A handle to an opaque @FT_Incremental handle provided by the client
+   *     application.
+   *
+   *   data ::
+   *     A structure describing the glyph data bytes (which will be accessed
+   *     as a read-only byte block).
+   *
+   */
+  typedef void
+  (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental  incremental,
+                                       FT_Data*        data );
+
+
+  /***************************************************************************
+   *
+   * @type:
+   *   FT_Incremental_GetGlyphMetricsFunc
+   *
+   * @description:
+   *   A function used to retrieve the basic metrics of a given glyph index
+   *   before accessing its data.  This is necessary because, in certain
+   *   formats like TrueType, the metrics are stored in a different place from
+   *   the glyph images proper.
+   *
+   * @input:
+   *   incremental ::
+   *     A handle to an opaque @FT_Incremental handle provided by the client
+   *     application.
+   *
+   *   glyph_index ::
+   *     Index of relevant glyph.
+   *
+   *   vertical ::
+   *     If true, return vertical metrics.
+   *
+   *   ametrics ::
+   *     This parameter is used for both input and output.
+   *     The original glyph metrics, if any, in font units.  If metrics are
+   *     not available all the values must be set to zero.
+   *
+   * @output:
+   *   ametrics ::
+   *     The replacement glyph metrics in font units.
+   *
+   */
+  typedef FT_Error
+  (*FT_Incremental_GetGlyphMetricsFunc)
+                      ( FT_Incremental              incremental,
+                        FT_UInt                     glyph_index,
+                        FT_Bool                     vertical,
+                        FT_Incremental_MetricsRec  *ametrics );
+
+
+  /**************************************************************************
+   *
+   * @struct:
+   *   FT_Incremental_FuncsRec
+   *
+   * @description:
+   *   A table of functions for accessing fonts that load data
+   *   incrementally.  Used in @FT_Incremental_InterfaceRec.
+   *
+   * @fields:
+   *   get_glyph_data ::
+   *     The function to get glyph data.  Must not be null.
+   *
+   *   free_glyph_data ::
+   *     The function to release glyph data.  Must not be null.
+   *
+   *   get_glyph_metrics ::
+   *     The function to get glyph metrics.  May be null if the font does
+   *     not provide overriding glyph metrics.
+   *
+   */
+  typedef struct  FT_Incremental_FuncsRec_
+  {
+    FT_Incremental_GetGlyphDataFunc     get_glyph_data;
+    FT_Incremental_FreeGlyphDataFunc    free_glyph_data;
+    FT_Incremental_GetGlyphMetricsFunc  get_glyph_metrics;
+
+  } FT_Incremental_FuncsRec;
+
+
+  /***************************************************************************
+   *
+   * @struct:
+   *   FT_Incremental_InterfaceRec
+   *
+   * @description:
+   *   A structure to be used with @FT_Open_Face to indicate that the user
+   *   wants to support incremental glyph loading.  You should use it with
+   *   @FT_PARAM_TAG_INCREMENTAL as in the following example:
+   *
+   *     {
+   *       FT_Incremental_InterfaceRec  inc_int;
+   *       FT_Parameter                 parameter;
+   *       FT_Open_Args                 open_args;
+   *
+   *
+   *       // set up incremental descriptor
+   *       inc_int.funcs  = my_funcs;
+   *       inc_int.object = my_object;
+   *
+   *       // set up optional parameter
+   *       parameter.tag  = FT_PARAM_TAG_INCREMENTAL;
+   *       parameter.data = &inc_int;
+   *
+   *       // set up FT_Open_Args structure
+   *       open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;
+   *       open_args.pathname   = my_font_pathname;
+   *       open_args.num_params = 1;
+   *       open_args.params     = &parameter; // we use one optional argument
+   *
+   *       // open the font
+   *       error = FT_Open_Face( library, &open_args, index, &face );
+   *       ...
+   *     }
+   *
+   */
+  typedef struct  FT_Incremental_InterfaceRec_
+  {
+    const FT_Incremental_FuncsRec*  funcs;
+    FT_Incremental                  object;
+
+  } FT_Incremental_InterfaceRec;
+
+
+  /***************************************************************************
+   *
+   * @type:
+   *   FT_Incremental_Interface
+   *
+   * @description:
+   *   A pointer to an @FT_Incremental_InterfaceRec structure.
+   *
+   */
+  typedef FT_Incremental_InterfaceRec*   FT_Incremental_Interface;
+
+
+  /***************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_INCREMENTAL
+   *
+   * @description:
+   *   A constant used as the tag of @FT_Parameter structures to indicate
+   *   an incremental loading object to be used by FreeType.
+   *
+   */
+#define FT_PARAM_TAG_INCREMENTAL  FT_MAKE_TAG( 'i', 'n', 'c', 'r' )
+
+  /* */
+
+FT_END_HEADER
+
+#endif /* __FTINCREM_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftlcdfil.h b/include/freetype/ftlcdfil.h
new file mode 100644 (file)
index 0000000..0b55ebe
--- /dev/null
@@ -0,0 +1,213 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftlcdfil.h                                                             */
+/*                                                                         */
+/*    FreeType API for color filtering of subpixel bitmap glyphs           */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 2006, 2007, 2008, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FT_LCD_FILTER_H__
+#define __FT_LCD_FILTER_H__
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /***************************************************************************
+   *
+   * @section:
+   *   lcd_filtering
+   *
+   * @title:
+   *   LCD Filtering
+   *
+   * @abstract:
+   *   Reduce color fringes of LCD-optimized bitmaps.
+   *
+   * @description:
+   *   The @FT_Library_SetLcdFilter API can be used to specify a low-pass
+   *   filter which is then applied to LCD-optimized bitmaps generated
+   *   through @FT_Render_Glyph.  This is useful to reduce color fringes
+   *   which would occur with unfiltered rendering.
+   *
+   *   Note that no filter is active by default, and that this function is
+   *   *not* implemented in default builds of the library.  You need to
+   *   #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your `ftoption.h' file
+   *   in order to activate it.
+   */
+
+
+  /****************************************************************************
+   *
+   * @enum:
+   *   FT_LcdFilter
+   *
+   * @description:
+   *   A list of values to identify various types of LCD filters.
+   *
+   * @values:
+   *   FT_LCD_FILTER_NONE ::
+   *     Do not perform filtering.  When used with subpixel rendering, this
+   *     results in sometimes severe color fringes.
+   *
+   *   FT_LCD_FILTER_DEFAULT ::
+   *     The default filter reduces color fringes considerably, at the cost
+   *     of a slight blurriness in the output.
+   *
+   *   FT_LCD_FILTER_LIGHT ::
+   *     The light filter is a variant that produces less blurriness at the
+   *     cost of slightly more color fringes than the default one.  It might
+   *     be better, depending on taste, your monitor, or your personal vision.
+   *
+   *   FT_LCD_FILTER_LEGACY ::
+   *     This filter corresponds to the original libXft color filter.  It
+   *     provides high contrast output but can exhibit really bad color
+   *     fringes if glyphs are not extremely well hinted to the pixel grid.
+   *     In other words, it only works well if the TrueType bytecode
+   *     interpreter is enabled *and* high-quality hinted fonts are used.
+   *
+   *     This filter is only provided for comparison purposes, and might be
+   *     disabled or stay unsupported in the future.
+   *
+   * @since:
+   *   2.3.0
+   */
+  typedef enum  FT_LcdFilter_
+  {
+    FT_LCD_FILTER_NONE    = 0,
+    FT_LCD_FILTER_DEFAULT = 1,
+    FT_LCD_FILTER_LIGHT   = 2,
+    FT_LCD_FILTER_LEGACY  = 16,
+
+    FT_LCD_FILTER_MAX   /* do not remove */
+
+  } FT_LcdFilter;
+
+
+  /**************************************************************************
+   *
+   * @func:
+   *   FT_Library_SetLcdFilter
+   *
+   * @description:
+   *   This function is used to apply color filtering to LCD decimated
+   *   bitmaps, like the ones used when calling @FT_Render_Glyph with
+   *   @FT_RENDER_MODE_LCD or @FT_RENDER_MODE_LCD_V.
+   *
+   * @input:
+   *   library ::
+   *     A handle to the target library instance.
+   *
+   *   filter ::
+   *     The filter type.
+   *
+   *     You can use @FT_LCD_FILTER_NONE here to disable this feature, or
+   *     @FT_LCD_FILTER_DEFAULT to use a default filter that should work
+   *     well on most LCD screens.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   This feature is always disabled by default.  Clients must make an
+   *   explicit call to this function with a `filter' value other than
+   *   @FT_LCD_FILTER_NONE in order to enable it.
+   *
+   *   Due to *PATENTS* covering subpixel rendering, this function doesn't
+   *   do anything except returning `FT_Err_Unimplemented_Feature' if the
+   *   configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not
+   *   defined in your build of the library, which should correspond to all
+   *   default builds of FreeType.
+   *
+   *   The filter affects glyph bitmaps rendered through @FT_Render_Glyph,
+   *   @FT_Outline_Get_Bitmap, @FT_Load_Glyph, and @FT_Load_Char.
+   *
+   *   It does _not_ affect the output of @FT_Outline_Render and
+   *   @FT_Outline_Get_Bitmap.
+   *
+   *   If this feature is activated, the dimensions of LCD glyph bitmaps are
+   *   either larger or taller than the dimensions of the corresponding
+   *   outline with regards to the pixel grid.  For example, for
+   *   @FT_RENDER_MODE_LCD, the filter adds up to 3~pixels to the left, and
+   *   up to 3~pixels to the right.
+   *
+   *   The bitmap offset values are adjusted correctly, so clients shouldn't
+   *   need to modify their layout and glyph positioning code when enabling
+   *   the filter.
+   *
+   * @since:
+   *   2.3.0
+   */
+  FT_EXPORT( FT_Error )
+  FT_Library_SetLcdFilter( FT_Library    library,
+                           FT_LcdFilter  filter );
+
+
+  /**************************************************************************
+   *
+   * @func:
+   *   FT_Library_SetLcdFilterWeights
+   *
+   * @description:
+   *   Use this function to override the filter weights selected by
+   *   @FT_Library_SetLcdFilter.  By default, FreeType uses the quintuple
+   *   (0x00, 0x55, 0x56, 0x55, 0x00) for FT_LCD_FILTER_LIGHT, and (0x10,
+   *   0x40, 0x70, 0x40, 0x10) for FT_LCD_FILTER_DEFAULT and
+   *   FT_LCD_FILTER_LEGACY.
+   *
+   * @input:
+   *   library ::
+   *     A handle to the target library instance.
+   *
+   *   weights ::
+   *     A pointer to an array; the function copies the first five bytes and
+   *     uses them to specify the filter weights.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   Due to *PATENTS* covering subpixel rendering, this function doesn't
+   *   do anything except returning `FT_Err_Unimplemented_Feature' if the
+   *   configuration macro FT_CONFIG_OPTION_SUBPIXEL_RENDERING is not
+   *   defined in your build of the library, which should correspond to all
+   *   default builds of FreeType.
+   *
+   *   This function must be called after @FT_Library_SetLcdFilter to have
+   *   any effect.
+   *
+   * @since:
+   *   2.4.0
+   */
+  FT_EXPORT( FT_Error )
+  FT_Library_SetLcdFilterWeights( FT_Library      library,
+                                  unsigned char  *weights );
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FT_LCD_FILTER_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftlist.h b/include/freetype/ftlist.h
new file mode 100644 (file)
index 0000000..bb6f7f1
--- /dev/null
@@ -0,0 +1,277 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftlist.h                                                               */
+/*                                                                         */
+/*    Generic list support for FreeType (specification).                   */
+/*                                                                         */
+/*  Copyright 1996-2001, 2003, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  This file implements functions relative to list processing.  Its     */
+  /*  data structures are defined in `freetype.h'.                         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTLIST_H__
+#define __FTLIST_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    list_processing                                                    */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    List Processing                                                    */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Simple management of lists.                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains various definitions related to list          */
+  /*    processing using doubly-linked nodes.                              */
+  /*                                                                       */
+  /* <Order>                                                               */
+  /*    FT_List                                                            */
+  /*    FT_ListNode                                                        */
+  /*    FT_ListRec                                                         */
+  /*    FT_ListNodeRec                                                     */
+  /*                                                                       */
+  /*    FT_List_Add                                                        */
+  /*    FT_List_Insert                                                     */
+  /*    FT_List_Find                                                       */
+  /*    FT_List_Remove                                                     */
+  /*    FT_List_Up                                                         */
+  /*    FT_List_Iterate                                                    */
+  /*    FT_List_Iterator                                                   */
+  /*    FT_List_Finalize                                                   */
+  /*    FT_List_Destructor                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Find                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Find the list node for a given listed object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    list :: A pointer to the parent list.                              */
+  /*    data :: The address of the listed object.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    List node.  NULL if it wasn't found.                               */
+  /*                                                                       */
+  FT_EXPORT( FT_ListNode )
+  FT_List_Find( FT_List  list,
+                void*    data );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Add                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Append an element to the end of a list.                            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    list :: A pointer to the parent list.                              */
+  /*    node :: The node to append.                                        */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_List_Add( FT_List      list,
+               FT_ListNode  node );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Insert                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Insert an element at the head of a list.                           */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    list :: A pointer to parent list.                                  */
+  /*    node :: The node to insert.                                        */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_List_Insert( FT_List      list,
+                  FT_ListNode  node );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Remove                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Remove a node from a list.  This function doesn't check whether    */
+  /*    the node is in the list!                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    node :: The node to remove.                                        */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    list :: A pointer to the parent list.                              */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_List_Remove( FT_List      list,
+                  FT_ListNode  node );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Up                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Move a node to the head/top of a list.  Used to maintain LRU       */
+  /*    lists.                                                             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    list :: A pointer to the parent list.                              */
+  /*    node :: The node to move.                                          */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_List_Up( FT_List      list,
+              FT_ListNode  node );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_List_Iterator                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An FT_List iterator function which is called during a list parse   */
+  /*    by @FT_List_Iterate.                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    node :: The current iteration list node.                           */
+  /*                                                                       */
+  /*    user :: A typeless pointer passed to @FT_List_Iterate.             */
+  /*            Can be used to point to the iteration's state.             */
+  /*                                                                       */
+  typedef FT_Error
+  (*FT_List_Iterator)( FT_ListNode  node,
+                       void*        user );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Iterate                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Parse a list and calls a given iterator function on each element.  */
+  /*    Note that parsing is stopped as soon as one of the iterator calls  */
+  /*    returns a non-zero value.                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    list     :: A handle to the list.                                  */
+  /*    iterator :: An iterator function, called on each node of the list. */
+  /*    user     :: A user-supplied field which is passed as the second    */
+  /*                argument to the iterator.                              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result (a FreeType error code) of the last iterator call.      */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_List_Iterate( FT_List           list,
+                   FT_List_Iterator  iterator,
+                   void*             user );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_List_Destructor                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An @FT_List iterator function which is called during a list        */
+  /*    finalization by @FT_List_Finalize to destroy all elements in a     */
+  /*    given list.                                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    system :: The current system object.                               */
+  /*                                                                       */
+  /*    data   :: The current object to destroy.                           */
+  /*                                                                       */
+  /*    user   :: A typeless pointer passed to @FT_List_Iterate.  It can   */
+  /*              be used to point to the iteration's state.               */
+  /*                                                                       */
+  typedef void
+  (*FT_List_Destructor)( FT_Memory  memory,
+                         void*      data,
+                         void*      user );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_List_Finalize                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroy all elements in the list as well as the list itself.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    list    :: A handle to the list.                                   */
+  /*                                                                       */
+  /*    destroy :: A list destructor that will be applied to each element  */
+  /*               of the list.                                            */
+  /*                                                                       */
+  /*    memory  :: The current memory object which handles deallocation.   */
+  /*                                                                       */
+  /*    user    :: A user-supplied field which is passed as the last       */
+  /*               argument to the destructor.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function expects that all nodes added by @FT_List_Add or      */
+  /*    @FT_List_Insert have been dynamically allocated.                   */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_List_Finalize( FT_List             list,
+                    FT_List_Destructor  destroy,
+                    FT_Memory           memory,
+                    void*               user );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTLIST_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftlzw.h b/include/freetype/ftlzw.h
new file mode 100644 (file)
index 0000000..00d4016
--- /dev/null
@@ -0,0 +1,99 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftlzw.h                                                                */
+/*                                                                         */
+/*    LZW-compressed stream support.                                       */
+/*                                                                         */
+/*  Copyright 2004, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTLZW_H__
+#define __FTLZW_H__
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    lzw                                                                */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    LZW Streams                                                        */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Using LZW-compressed font files.                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of LZW-specific functions.   */
+  /*                                                                       */
+  /*************************************************************************/
+
+ /************************************************************************
+  *
+  * @function:
+  *   FT_Stream_OpenLZW
+  *
+  * @description:
+  *   Open a new stream to parse LZW-compressed font files.  This is
+  *   mainly used to support the compressed `*.pcf.Z' fonts that come
+  *   with XFree86.
+  *
+  * @input:
+  *   stream :: The target embedding stream.
+  *
+  *   source :: The source stream.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   The source stream must be opened _before_ calling this function.
+  *
+  *   Calling the internal function `FT_Stream_Close' on the new stream will
+  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream
+  *   objects will be released to the heap.
+  *
+  *   The stream implementation is very basic and resets the decompression
+  *   process each time seeking backwards is needed within the stream
+  *
+  *   In certain builds of the library, LZW compression recognition is
+  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.
+  *   This means that if no font driver is capable of handling the raw
+  *   compressed file, the library will try to open a LZW stream from it
+  *   and re-open the face with it.
+  *
+  *   This function may return `FT_Err_Unimplemented_Feature' if your build
+  *   of FreeType was not compiled with LZW support.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Stream_OpenLZW( FT_Stream  stream,
+                     FT_Stream  source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTLZW_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftmac.h b/include/freetype/ftmac.h
new file mode 100644 (file)
index 0000000..ab5bab5
--- /dev/null
@@ -0,0 +1,274 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmac.h                                                                */
+/*                                                                         */
+/*    Additional Mac-specific API.                                         */
+/*                                                                         */
+/*  Copyright 1996-2001, 2004, 2006, 2007 by                               */
+/*  Just van Rossum, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* NOTE: Include this file after <freetype/freetype.h> and after any       */
+/*       Mac-specific headers (because this header uses Mac types such as  */
+/*       Handle, FSSpec, FSRef, etc.)                                      */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTMAC_H__
+#define __FTMAC_H__
+
+
+#include <ft2build.h>
+
+
+FT_BEGIN_HEADER
+
+
+/* gcc-3.4.1 and later can warn about functions tagged as deprecated */
+#ifndef FT_DEPRECATED_ATTRIBUTE
+#if defined(__GNUC__)                                               && \
+    ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))
+#define FT_DEPRECATED_ATTRIBUTE  __attribute__((deprecated))
+#else
+#define FT_DEPRECATED_ATTRIBUTE
+#endif
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    mac_specific                                                       */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Mac Specific Interface                                             */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Only available on the Macintosh.                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The following definitions are only available if FreeType is        */
+  /*    compiled on a Macintosh.                                           */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face_From_FOND                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new face object from a FOND resource.                     */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library resource.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    fond       :: A FOND resource.                                     */
+  /*                                                                       */
+  /*    face_index :: Only supported for the -1 `sanity check' special     */
+  /*                  case.                                                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aface      :: A handle to a new face object.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Notes>                                                               */
+  /*    This function can be used to create @FT_Face objects from fonts    */
+  /*    that are installed in the system as follows.                       */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      fond = GetResource( 'FOND', fontName );                          */
+  /*      error = FT_New_Face_From_FOND( library, fond, 0, &face );        */
+  /*    }                                                                  */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Face_From_FOND( FT_Library  library,
+                         Handle      fond,
+                         FT_Long     face_index,
+                         FT_Face    *aface )
+                       FT_DEPRECATED_ATTRIBUTE;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_GetFile_From_Mac_Name                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return an FSSpec for the disk file containing the named font.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    fontName   :: Mac OS name of the font (e.g., Times New Roman       */
+  /*                  Bold).                                               */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    pathSpec   :: FSSpec to the file.  For passing to                  */
+  /*                  @FT_New_Face_From_FSSpec.                            */
+  /*                                                                       */
+  /*    face_index :: Index of the face.  For passing to                   */
+  /*                  @FT_New_Face_From_FSSpec.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_GetFile_From_Mac_Name( const char*  fontName,
+                            FSSpec*      pathSpec,
+                            FT_Long*     face_index )
+                          FT_DEPRECATED_ATTRIBUTE;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_GetFile_From_Mac_ATS_Name                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return an FSSpec for the disk file containing the named font.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    fontName   :: Mac OS name of the font in ATS framework.            */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    pathSpec   :: FSSpec to the file. For passing to                   */
+  /*                  @FT_New_Face_From_FSSpec.                            */
+  /*                                                                       */
+  /*    face_index :: Index of the face. For passing to                    */
+  /*                  @FT_New_Face_From_FSSpec.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_GetFile_From_Mac_ATS_Name( const char*  fontName,
+                                FSSpec*      pathSpec,
+                                FT_Long*     face_index )
+                              FT_DEPRECATED_ATTRIBUTE;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_GetFilePath_From_Mac_ATS_Name                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return a pathname of the disk file and face index for given font   */
+  /*    name which is handled by ATS framework.                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    fontName    :: Mac OS name of the font in ATS framework.           */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    path        :: Buffer to store pathname of the file.  For passing  */
+  /*                   to @FT_New_Face.  The client must allocate this     */
+  /*                   buffer before calling this function.                */
+  /*                                                                       */
+  /*    maxPathSize :: Lengths of the buffer `path' that client allocated. */
+  /*                                                                       */
+  /*    face_index  :: Index of the face.  For passing to @FT_New_Face.    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_GetFilePath_From_Mac_ATS_Name( const char*  fontName,
+                                    UInt8*       path,
+                                    UInt32       maxPathSize,
+                                    FT_Long*     face_index )
+                                  FT_DEPRECATED_ATTRIBUTE;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face_From_FSSpec                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new face object from a given resource and typeface index  */
+  /*    using an FSSpec to the font file.                                  */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library resource.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    spec       :: FSSpec to the font file.                             */
+  /*                                                                       */
+  /*    face_index :: The index of the face within the resource.  The      */
+  /*                  first face has index~0.                              */
+  /* <Output>                                                              */
+  /*    aface      :: A handle to a new face object.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    @FT_New_Face_From_FSSpec is identical to @FT_New_Face except       */
+  /*    it accepts an FSSpec instead of a path.                            */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Face_From_FSSpec( FT_Library     library,
+                           const FSSpec  *spec,
+                           FT_Long        face_index,
+                           FT_Face       *aface )
+                         FT_DEPRECATED_ATTRIBUTE;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face_From_FSRef                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new face object from a given resource and typeface index  */
+  /*    using an FSRef to the font file.                                   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library resource.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    spec       :: FSRef to the font file.                              */
+  /*                                                                       */
+  /*    face_index :: The index of the face within the resource.  The      */
+  /*                  first face has index~0.                              */
+  /* <Output>                                                              */
+  /*    aface      :: A handle to a new face object.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    @FT_New_Face_From_FSRef is identical to @FT_New_Face except        */
+  /*    it accepts an FSRef instead of a path.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Face_From_FSRef( FT_Library    library,
+                          const FSRef  *ref,
+                          FT_Long       face_index,
+                          FT_Face      *aface )
+                        FT_DEPRECATED_ATTRIBUTE;
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __FTMAC_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftmm.h b/include/freetype/ftmm.h
new file mode 100644 (file)
index 0000000..3aefb9e
--- /dev/null
@@ -0,0 +1,378 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmm.h                                                                 */
+/*                                                                         */
+/*    FreeType Multiple Master font interface (specification).             */
+/*                                                                         */
+/*  Copyright 1996-2001, 2003, 2004, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTMM_H__
+#define __FTMM_H__
+
+
+#include <ft2build.h>
+#include FT_TYPE1_TABLES_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    multiple_masters                                                   */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Multiple Masters                                                   */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    How to manage Multiple Masters fonts.                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The following types and functions are used to manage Multiple      */
+  /*    Master fonts, i.e., the selection of specific design instances by  */
+  /*    setting design axis coordinates.                                   */
+  /*                                                                       */
+  /*    George Williams has extended this interface to make it work with   */
+  /*    both Type~1 Multiple Masters fonts and GX distortable (var)        */
+  /*    fonts.  Some of these routines only work with MM fonts, others     */
+  /*    will work with both types.  They are similar enough that a         */
+  /*    consistent interface makes sense.                                  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_MM_Axis                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to model a given axis in design space for  */
+  /*    Multiple Masters fonts.                                            */
+  /*                                                                       */
+  /*    This structure can't be used for GX var fonts.                     */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    name    :: The axis's name.                                        */
+  /*                                                                       */
+  /*    minimum :: The axis's minimum design coordinate.                   */
+  /*                                                                       */
+  /*    maximum :: The axis's maximum design coordinate.                   */
+  /*                                                                       */
+  typedef struct  FT_MM_Axis_
+  {
+    FT_String*  name;
+    FT_Long     minimum;
+    FT_Long     maximum;
+
+  } FT_MM_Axis;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Multi_Master                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model the axes and space of a Multiple Masters */
+  /*    font.                                                              */
+  /*                                                                       */
+  /*    This structure can't be used for GX var fonts.                     */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_axis    :: Number of axes.  Cannot exceed~4.                   */
+  /*                                                                       */
+  /*    num_designs :: Number of designs; should be normally 2^num_axis    */
+  /*                   even though the Type~1 specification strangely      */
+  /*                   allows for intermediate designs to be present. This */
+  /*                   number cannot exceed~16.                            */
+  /*                                                                       */
+  /*    axis        :: A table of axis descriptors.                        */
+  /*                                                                       */
+  typedef struct  FT_Multi_Master_
+  {
+    FT_UInt     num_axis;
+    FT_UInt     num_designs;
+    FT_MM_Axis  axis[T1_MAX_MM_AXIS];
+
+  } FT_Multi_Master;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Var_Axis                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to model a given axis in design space for  */
+  /*    Multiple Masters and GX var fonts.                                 */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    name    :: The axis's name.                                        */
+  /*               Not always meaningful for GX.                           */
+  /*                                                                       */
+  /*    minimum :: The axis's minimum design coordinate.                   */
+  /*                                                                       */
+  /*    def     :: The axis's default design coordinate.                   */
+  /*               FreeType computes meaningful default values for MM; it  */
+  /*               is then an integer value, not in 16.16 format.          */
+  /*                                                                       */
+  /*    maximum :: The axis's maximum design coordinate.                   */
+  /*                                                                       */
+  /*    tag     :: The axis's tag (the GX equivalent to `name').           */
+  /*               FreeType provides default values for MM if possible.    */
+  /*                                                                       */
+  /*    strid   :: The entry in `name' table (another GX version of        */
+  /*               `name').                                                */
+  /*               Not meaningful for MM.                                  */
+  /*                                                                       */
+  typedef struct  FT_Var_Axis_
+  {
+    FT_String*  name;
+
+    FT_Fixed    minimum;
+    FT_Fixed    def;
+    FT_Fixed    maximum;
+
+    FT_ULong    tag;
+    FT_UInt     strid;
+
+  } FT_Var_Axis;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Var_Named_Style                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to model a named style in a GX var font.   */
+  /*                                                                       */
+  /*    This structure can't be used for MM fonts.                         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    coords :: The design coordinates for this style.                   */
+  /*              This is an array with one entry for each axis.           */
+  /*                                                                       */
+  /*    strid  :: The entry in `name' table identifying this style.        */
+  /*                                                                       */
+  typedef struct  FT_Var_Named_Style_
+  {
+    FT_Fixed*  coords;
+    FT_UInt    strid;
+
+  } FT_Var_Named_Style;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_MM_Var                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model the axes and space of a Multiple Masters */
+  /*    or GX var distortable font.                                        */
+  /*                                                                       */
+  /*    Some fields are specific to one format and not to the other.       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_axis        :: The number of axes.  The maximum value is~4 for */
+  /*                       MM; no limit in GX.                             */
+  /*                                                                       */
+  /*    num_designs     :: The number of designs; should be normally       */
+  /*                       2^num_axis for MM fonts.  Not meaningful for GX */
+  /*                       (where every glyph could have a different       */
+  /*                       number of designs).                             */
+  /*                                                                       */
+  /*    num_namedstyles :: The number of named styles; only meaningful for */
+  /*                       GX which allows certain design coordinates to   */
+  /*                       have a string ID (in the `name' table)          */
+  /*                       associated with them.  The font can tell the    */
+  /*                       user that, for example, Weight=1.5 is `Bold'.   */
+  /*                                                                       */
+  /*    axis            :: A table of axis descriptors.                    */
+  /*                       GX fonts contain slightly more data than MM.    */
+  /*                                                                       */
+  /*    namedstyles     :: A table of named styles.                        */
+  /*                       Only meaningful with GX.                        */
+  /*                                                                       */
+  typedef struct  FT_MM_Var_
+  {
+    FT_UInt              num_axis;
+    FT_UInt              num_designs;
+    FT_UInt              num_namedstyles;
+    FT_Var_Axis*         axis;
+    FT_Var_Named_Style*  namedstyle;
+
+  } FT_MM_Var;
+
+
+  /* */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Multi_Master                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the Multiple Master descriptor of a given font.           */
+  /*                                                                       */
+  /*    This function can't be used with GX fonts.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face    :: A handle to the source face.                            */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    amaster :: The Multiple Masters descriptor.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Multi_Master( FT_Face           face,
+                       FT_Multi_Master  *amaster );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_MM_Var                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the Multiple Master/GX var descriptor of a given font.    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face    :: A handle to the source face.                            */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    amaster :: The Multiple Masters/GX var descriptor.                 */
+  /*               Allocates a data structure, which the user must free    */
+  /*               (a single call to FT_FREE will do it).                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_MM_Var( FT_Face      face,
+                 FT_MM_Var*  *amaster );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_MM_Design_Coordinates                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    For Multiple Masters fonts, choose an interpolated font design     */
+  /*    through design coordinates.                                        */
+  /*                                                                       */
+  /*    This function can't be used with GX fonts.                         */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: A handle to the source face.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    num_coords :: The number of design coordinates (must be equal to   */
+  /*                  the number of axes in the font).                     */
+  /*                                                                       */
+  /*    coords     :: An array of design coordinates.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_MM_Design_Coordinates( FT_Face   face,
+                                FT_UInt   num_coords,
+                                FT_Long*  coords );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Var_Design_Coordinates                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    For Multiple Master or GX Var fonts, choose an interpolated font   */
+  /*    design through design coordinates.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: A handle to the source face.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    num_coords :: The number of design coordinates (must be equal to   */
+  /*                  the number of axes in the font).                     */
+  /*                                                                       */
+  /*    coords     :: An array of design coordinates.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Var_Design_Coordinates( FT_Face    face,
+                                 FT_UInt    num_coords,
+                                 FT_Fixed*  coords );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_MM_Blend_Coordinates                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    For Multiple Masters and GX var fonts, choose an interpolated font */
+  /*    design through normalized blend coordinates.                       */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: A handle to the source face.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    num_coords :: The number of design coordinates (must be equal to   */
+  /*                  the number of axes in the font).                     */
+  /*                                                                       */
+  /*    coords     :: The design coordinates array (each element must be   */
+  /*                  between 0 and 1.0).                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_MM_Blend_Coordinates( FT_Face    face,
+                               FT_UInt    num_coords,
+                               FT_Fixed*  coords );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Var_Blend_Coordinates                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This is another name of @FT_Set_MM_Blend_Coordinates.              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Var_Blend_Coordinates( FT_Face    face,
+                                FT_UInt    num_coords,
+                                FT_Fixed*  coords );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTMM_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftmodapi.h b/include/freetype/ftmodapi.h
new file mode 100644 (file)
index 0000000..8f2e017
--- /dev/null
@@ -0,0 +1,483 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmodapi.h                                                             */
+/*                                                                         */
+/*    FreeType modules public interface (specification).                   */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTMODAPI_H__
+#define __FTMODAPI_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    module_management                                                  */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Module Management                                                  */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    How to add, upgrade, and remove modules from FreeType.             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The definitions below are used to manage modules within FreeType.  */
+  /*    Modules can be added, upgraded, and removed at runtime.            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* module bit flags */
+#define FT_MODULE_FONT_DRIVER         1  /* this module is a font driver  */
+#define FT_MODULE_RENDERER            2  /* this module is a renderer     */
+#define FT_MODULE_HINTER              4  /* this module is a glyph hinter */
+#define FT_MODULE_STYLER              8  /* this module is a styler       */
+
+#define FT_MODULE_DRIVER_SCALABLE     0x100   /* the driver supports      */
+                                              /* scalable fonts           */
+#define FT_MODULE_DRIVER_NO_OUTLINES  0x200   /* the driver does not      */
+                                              /* support vector outlines  */
+#define FT_MODULE_DRIVER_HAS_HINTER   0x400   /* the driver provides its  */
+                                              /* own hinter               */
+
+
+  /* deprecated values */
+#define ft_module_font_driver         FT_MODULE_FONT_DRIVER
+#define ft_module_renderer            FT_MODULE_RENDERER
+#define ft_module_hinter              FT_MODULE_HINTER
+#define ft_module_styler              FT_MODULE_STYLER
+
+#define ft_module_driver_scalable     FT_MODULE_DRIVER_SCALABLE
+#define ft_module_driver_no_outlines  FT_MODULE_DRIVER_NO_OUTLINES
+#define ft_module_driver_has_hinter   FT_MODULE_DRIVER_HAS_HINTER
+
+
+  typedef FT_Pointer  FT_Module_Interface;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Module_Constructor                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to initialize (not create) a new module object.    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    module :: The module to initialize.                                */
+  /*                                                                       */
+  typedef FT_Error
+  (*FT_Module_Constructor)( FT_Module  module );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Module_Destructor                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to finalize (not destroy) a given module object.   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    module :: The module to finalize.                                  */
+  /*                                                                       */
+  typedef void
+  (*FT_Module_Destructor)( FT_Module  module );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Module_Requester                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to query a given module for a specific interface.  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    module :: The module to finalize.                                  */
+  /*                                                                       */
+  /*    name ::   The name of the interface in the module.                 */
+  /*                                                                       */
+  typedef FT_Module_Interface
+  (*FT_Module_Requester)( FT_Module    module,
+                          const char*  name );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Module_Class                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The module class descriptor.                                       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    module_flags    :: Bit flags describing the module.                */
+  /*                                                                       */
+  /*    module_size     :: The size of one module object/instance in       */
+  /*                       bytes.                                          */
+  /*                                                                       */
+  /*    module_name     :: The name of the module.                         */
+  /*                                                                       */
+  /*    module_version  :: The version, as a 16.16 fixed number            */
+  /*                       (major.minor).                                  */
+  /*                                                                       */
+  /*    module_requires :: The version of FreeType this module requires,   */
+  /*                       as a 16.16 fixed number (major.minor).  Starts  */
+  /*                       at version 2.0, i.e., 0x20000.                  */
+  /*                                                                       */
+  /*    module_init     :: The initializing function.                      */
+  /*                                                                       */
+  /*    module_done     :: The finalizing function.                        */
+  /*                                                                       */
+  /*    get_interface   :: The interface requesting function.              */
+  /*                                                                       */
+  typedef struct  FT_Module_Class_
+  {
+    FT_ULong               module_flags;
+    FT_Long                module_size;
+    const FT_String*       module_name;
+    FT_Fixed               module_version;
+    FT_Fixed               module_requires;
+
+    const void*            module_interface;
+
+    FT_Module_Constructor  module_init;
+    FT_Module_Destructor   module_done;
+    FT_Module_Requester    get_interface;
+
+  } FT_Module_Class;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Add_Module                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Add a new module to a given library instance.                      */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library :: A handle to the library object.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    clazz   :: A pointer to class descriptor for the module.           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    An error will be returned if a module already exists by that name, */
+  /*    or if the module requires a version of FreeType that is too great. */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Add_Module( FT_Library              library,
+                 const FT_Module_Class*  clazz );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Module                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Find a module by its name.                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library     :: A handle to the library object.                     */
+  /*                                                                       */
+  /*    module_name :: The module's name (as an ASCII string).             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A module handle.  0~if none was found.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    FreeType's internal modules aren't documented very well, and you   */
+  /*    should look up the source code for details.                        */
+  /*                                                                       */
+  FT_EXPORT( FT_Module )
+  FT_Get_Module( FT_Library   library,
+                 const char*  module_name );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Remove_Module                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Remove a given module from a library instance.                     */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library :: A handle to a library object.                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    module  :: A handle to a module object.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The module object is destroyed by the function in case of success. */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Remove_Module( FT_Library  library,
+                    FT_Module   module );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Reference_Library                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A counter gets initialized to~1 at the time an @FT_Library         */
+  /*    structure is created.  This function increments the counter.       */
+  /*    @FT_Done_Library then only destroys a library if the counter is~1, */
+  /*    otherwise it simply decrements the counter.                        */
+  /*                                                                       */
+  /*    This function helps in managing life-cycles of structures which    */
+  /*    reference @FT_Library objects.                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to a target library object.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.4.2                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Reference_Library( FT_Library  library );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Library                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used to create a new FreeType library instance    */
+  /*    from a given memory object.  It is thus possible to use libraries  */
+  /*    with distinct memory allocators within the same program.           */
+  /*                                                                       */
+  /*    Normally, you would call this function (followed by a call to      */
+  /*    @FT_Add_Default_Modules or a series of calls to @FT_Add_Module)    */
+  /*    instead of @FT_Init_FreeType to initialize the FreeType library.   */
+  /*                                                                       */
+  /*    Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a      */
+  /*    library instance.                                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory   :: A handle to the original memory object.                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    alibrary :: A pointer to handle of a new library object.           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    See the discussion of reference counters in the description of     */
+  /*    @FT_Reference_Library.                                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Library( FT_Memory    memory,
+                  FT_Library  *alibrary );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_Library                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Discard a given library object.  This closes all drivers and       */
+  /*    discards all resource objects.                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to the target library.                         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    See the discussion of reference counters in the description of     */
+  /*    @FT_Reference_Library.                                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Done_Library( FT_Library  library );
+
+/* */
+
+  typedef void
+  (*FT_DebugHook_Func)( void*  arg );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Debug_Hook                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Set a debug hook function for debugging the interpreter of a font  */
+  /*    format.                                                            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    hook_index :: The index of the debug hook.  You should use the     */
+  /*                  values defined in `ftobjs.h', e.g.,                  */
+  /*                  `FT_DEBUG_HOOK_TRUETYPE'.                            */
+  /*                                                                       */
+  /*    debug_hook :: The function used to debug the interpreter.          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Currently, four debug hook slots are available, but only two (for  */
+  /*    the TrueType and the Type~1 interpreter) are defined.              */
+  /*                                                                       */
+  /*    Since the internal headers of FreeType are no longer installed,    */
+  /*    the symbol `FT_DEBUG_HOOK_TRUETYPE' isn't available publicly.      */
+  /*    This is a bug and will be fixed in a forthcoming release.          */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Set_Debug_Hook( FT_Library         library,
+                     FT_UInt            hook_index,
+                     FT_DebugHook_Func  debug_hook );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Add_Default_Modules                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Add the set of default drivers to a given library object.          */
+  /*    This is only useful when you create a library object with          */
+  /*    @FT_New_Library (usually to plug a custom memory manager).         */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library :: A handle to a new library object.                       */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Add_Default_Modules( FT_Library  library );
+
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   truetype_engine
+   *
+   * @title:
+   *   The TrueType Engine
+   *
+   * @abstract:
+   *   TrueType bytecode support.
+   *
+   * @description:
+   *   This section contains a function used to query the level of TrueType
+   *   bytecode support compiled in this version of the library.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   *  @enum:
+   *     FT_TrueTypeEngineType
+   *
+   *  @description:
+   *     A list of values describing which kind of TrueType bytecode
+   *     engine is implemented in a given FT_Library instance.  It is used
+   *     by the @FT_Get_TrueType_Engine_Type function.
+   *
+   *  @values:
+   *     FT_TRUETYPE_ENGINE_TYPE_NONE ::
+   *       The library doesn't implement any kind of bytecode interpreter.
+   *
+   *     FT_TRUETYPE_ENGINE_TYPE_UNPATENTED ::
+   *       The library implements a bytecode interpreter that doesn't
+   *       support the patented operations of the TrueType virtual machine.
+   *
+   *       Its main use is to load certain Asian fonts which position and
+   *       scale glyph components with bytecode instructions.  It produces
+   *       bad output for most other fonts.
+   *
+   *    FT_TRUETYPE_ENGINE_TYPE_PATENTED ::
+   *       The library implements a bytecode interpreter that covers
+   *       the full instruction set of the TrueType virtual machine (this
+   *       was governed by patents until May 2010, hence the name).
+   *
+   *  @since:
+   *       2.2
+   *
+   */
+  typedef enum  FT_TrueTypeEngineType_
+  {
+    FT_TRUETYPE_ENGINE_TYPE_NONE = 0,
+    FT_TRUETYPE_ENGINE_TYPE_UNPATENTED,
+    FT_TRUETYPE_ENGINE_TYPE_PATENTED
+
+  } FT_TrueTypeEngineType;
+
+
+  /**************************************************************************
+   *
+   *  @func:
+   *     FT_Get_TrueType_Engine_Type
+   *
+   *  @description:
+   *     Return an @FT_TrueTypeEngineType value to indicate which level of
+   *     the TrueType virtual machine a given library instance supports.
+   *
+   *  @input:
+   *     library ::
+   *       A library instance.
+   *
+   *  @return:
+   *     A value indicating which level is supported.
+   *
+   *  @since:
+   *     2.2
+   *
+   */
+  FT_EXPORT( FT_TrueTypeEngineType )
+  FT_Get_TrueType_Engine_Type( FT_Library  library );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTMODAPI_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftmoderr.h b/include/freetype/ftmoderr.h
new file mode 100644 (file)
index 0000000..1bf3b38
--- /dev/null
@@ -0,0 +1,156 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmoderr.h                                                             */
+/*                                                                         */
+/*    FreeType module error offsets (specification).                       */
+/*                                                                         */
+/*  Copyright 2001, 2002, 2003, 2004, 2005, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the FreeType module error offsets.        */
+  /*                                                                       */
+  /* The lower byte gives the error code, the higher byte gives the        */
+  /* module.  The base module has error offset 0.  For example, the error  */
+  /* `FT_Err_Invalid_File_Format' has value 0x003, the error               */
+  /* `TT_Err_Invalid_File_Format' has value 0x1103, the error              */
+  /* `T1_Err_Invalid_File_Format' has value 0x1203, etc.                   */
+  /*                                                                       */
+  /* Undefine the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in ftoption.h   */
+  /* to make the higher byte always zero (disabling the module error       */
+  /* mechanism).                                                           */
+  /*                                                                       */
+  /* It can also be used to create a module error message table easily     */
+  /* with something like                                                   */
+  /*                                                                       */
+  /*   {                                                                   */
+  /*     #undef __FTMODERR_H__                                             */
+  /*     #define FT_MODERRDEF( e, v, s )  { FT_Mod_Err_ ## e, s },         */
+  /*     #define FT_MODERR_START_LIST     {                                */
+  /*     #define FT_MODERR_END_LIST       { 0, 0 } };                      */
+  /*                                                                       */
+  /*     const struct                                                      */
+  /*     {                                                                 */
+  /*       int          mod_err_offset;                                    */
+  /*       const char*  mod_err_msg                                        */
+  /*     } ft_mod_errors[] =                                               */
+  /*                                                                       */
+  /*     #include FT_MODULE_ERRORS_H                                       */
+  /*   }                                                                   */
+  /*                                                                       */
+  /* To use such a table, all errors must be ANDed with 0xFF00 to remove   */
+  /* the error code.                                                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTMODERR_H__
+#define __FTMODERR_H__
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                       SETUP MACROS                      *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+
+#undef  FT_NEED_EXTERN_C
+
+#ifndef FT_MODERRDEF
+
+#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS
+#define FT_MODERRDEF( e, v, s )  FT_Mod_Err_ ## e = v,
+#else
+#define FT_MODERRDEF( e, v, s )  FT_Mod_Err_ ## e = 0,
+#endif
+
+#define FT_MODERR_START_LIST  enum {
+#define FT_MODERR_END_LIST    FT_Mod_Err_Max };
+
+#ifdef __cplusplus
+#define FT_NEED_EXTERN_C
+  extern "C" {
+#endif
+
+#endif /* !FT_MODERRDEF */
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****               LIST MODULE ERROR BASES                   *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+
+#ifdef FT_MODERR_START_LIST
+  FT_MODERR_START_LIST
+#endif
+
+
+  FT_MODERRDEF( Base,      0x000, "base module" )
+  FT_MODERRDEF( Autofit,   0x100, "autofitter module" )
+  FT_MODERRDEF( BDF,       0x200, "BDF module" )
+  FT_MODERRDEF( Bzip2,     0x300, "Bzip2 module" )
+  FT_MODERRDEF( Cache,     0x400, "cache module" )
+  FT_MODERRDEF( CFF,       0x500, "CFF module" )
+  FT_MODERRDEF( CID,       0x600, "CID module" )
+  FT_MODERRDEF( Gzip,      0x700, "Gzip module" )
+  FT_MODERRDEF( LZW,       0x800, "LZW module" )
+  FT_MODERRDEF( OTvalid,   0x900, "OpenType validation module" )
+  FT_MODERRDEF( PCF,       0xA00, "PCF module" )
+  FT_MODERRDEF( PFR,       0xB00, "PFR module" )
+  FT_MODERRDEF( PSaux,     0xC00, "PS auxiliary module" )
+  FT_MODERRDEF( PShinter,  0xD00, "PS hinter module" )
+  FT_MODERRDEF( PSnames,   0xE00, "PS names module" )
+  FT_MODERRDEF( Raster,    0xF00, "raster module" )
+  FT_MODERRDEF( SFNT,     0x1000, "SFNT module" )
+  FT_MODERRDEF( Smooth,   0x1100, "smooth raster module" )
+  FT_MODERRDEF( TrueType, 0x1200, "TrueType module" )
+  FT_MODERRDEF( Type1,    0x1300, "Type 1 module" )
+  FT_MODERRDEF( Type42,   0x1400, "Type 42 module" )
+  FT_MODERRDEF( Winfonts, 0x1500, "Windows FON/FNT module" )
+
+
+#ifdef FT_MODERR_END_LIST
+  FT_MODERR_END_LIST
+#endif
+
+
+  /*******************************************************************/
+  /*******************************************************************/
+  /*****                                                         *****/
+  /*****                      CLEANUP                            *****/
+  /*****                                                         *****/
+  /*******************************************************************/
+  /*******************************************************************/
+
+
+#ifdef FT_NEED_EXTERN_C
+  }
+#endif
+
+#undef FT_MODERR_START_LIST
+#undef FT_MODERR_END_LIST
+#undef FT_MODERRDEF
+#undef FT_NEED_EXTERN_C
+
+
+#endif /* __FTMODERR_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftotval.h b/include/freetype/ftotval.h
new file mode 100644 (file)
index 0000000..027f2e8
--- /dev/null
@@ -0,0 +1,203 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftotval.h                                                              */
+/*                                                                         */
+/*    FreeType API for validating OpenType tables (specification).         */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2006, 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/*                                                                         */
+/* Warning: This module might be moved to a different library in the       */
+/*          future to avoid a tight dependency between FreeType and the    */
+/*          OpenType specification.                                        */
+/*                                                                         */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTOTVAL_H__
+#define __FTOTVAL_H__
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    ot_validation                                                      */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    OpenType Validation                                                */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    An API to validate OpenType tables.                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of functions to validate     */
+  /*    some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+ /**********************************************************************
+  *
+  * @enum:
+  *    FT_VALIDATE_OTXXX
+  *
+  * @description:
+  *    A list of bit-field constants used with @FT_OpenType_Validate to
+  *    indicate which OpenType tables should be validated.
+  *
+  * @values:
+  *    FT_VALIDATE_BASE ::
+  *      Validate BASE table.
+  *
+  *    FT_VALIDATE_GDEF ::
+  *      Validate GDEF table.
+  *
+  *    FT_VALIDATE_GPOS ::
+  *      Validate GPOS table.
+  *
+  *    FT_VALIDATE_GSUB ::
+  *      Validate GSUB table.
+  *
+  *    FT_VALIDATE_JSTF ::
+  *      Validate JSTF table.
+  *
+  *    FT_VALIDATE_MATH ::
+  *      Validate MATH table.
+  *
+  *    FT_VALIDATE_OT ::
+  *      Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).
+  *
+  */
+#define FT_VALIDATE_BASE  0x0100
+#define FT_VALIDATE_GDEF  0x0200
+#define FT_VALIDATE_GPOS  0x0400
+#define FT_VALIDATE_GSUB  0x0800
+#define FT_VALIDATE_JSTF  0x1000
+#define FT_VALIDATE_MATH  0x2000
+
+#define FT_VALIDATE_OT  FT_VALIDATE_BASE | \
+                        FT_VALIDATE_GDEF | \
+                        FT_VALIDATE_GPOS | \
+                        FT_VALIDATE_GSUB | \
+                        FT_VALIDATE_JSTF | \
+                        FT_VALIDATE_MATH
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_OpenType_Validate
+  *
+  * @description:
+  *    Validate various OpenType tables to assure that all offsets and
+  *    indices are valid.  The idea is that a higher-level library which
+  *    actually does the text layout can access those tables without
+  *    error checking (which can be quite time consuming).
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    validation_flags ::
+  *       A bit field which specifies the tables to be validated.  See
+  *       @FT_VALIDATE_OTXXX for possible values.
+  *
+  * @output:
+  *    BASE_table ::
+  *       A pointer to the BASE table.
+  *
+  *    GDEF_table ::
+  *       A pointer to the GDEF table.
+  *
+  *    GPOS_table ::
+  *       A pointer to the GPOS table.
+  *
+  *    GSUB_table ::
+  *       A pointer to the GSUB table.
+  *
+  *    JSTF_table ::
+  *       A pointer to the JSTF table.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   This function only works with OpenType fonts, returning an error
+  *   otherwise.
+  *
+  *   After use, the application should deallocate the five tables with
+  *   @FT_OpenType_Free.  A NULL value indicates that the table either
+  *   doesn't exist in the font, or the application hasn't asked for
+  *   validation.
+  */
+  FT_EXPORT( FT_Error )
+  FT_OpenType_Validate( FT_Face    face,
+                        FT_UInt    validation_flags,
+                        FT_Bytes  *BASE_table,
+                        FT_Bytes  *GDEF_table,
+                        FT_Bytes  *GPOS_table,
+                        FT_Bytes  *GSUB_table,
+                        FT_Bytes  *JSTF_table );
+
+  /* */
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_OpenType_Free
+  *
+  * @description:
+  *    Free the buffer allocated by OpenType validator.
+  *
+  * @input:
+  *    face ::
+  *       A handle to the input face.
+  *
+  *    table ::
+  *       The pointer to the buffer that is allocated by
+  *       @FT_OpenType_Validate.
+  *
+  * @note:
+  *   This function must be used to free the buffer allocated by
+  *   @FT_OpenType_Validate only.
+  */
+  FT_EXPORT( void )
+  FT_OpenType_Free( FT_Face   face,
+                    FT_Bytes  table );
+
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTOTVAL_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftoutln.h b/include/freetype/ftoutln.h
new file mode 100644 (file)
index 0000000..1cf3c3f
--- /dev/null
@@ -0,0 +1,540 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftoutln.h                                                              */
+/*                                                                         */
+/*    Support for the FT_Outline type used to store glyph shapes of        */
+/*    most scalable font formats (specification).                          */
+/*                                                                         */
+/*  Copyright 1996-2003, 2005-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTOUTLN_H__
+#define __FTOUTLN_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    outline_processing                                                 */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Outline Processing                                                 */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Functions to create, transform, and render vectorial glyph images. */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains routines used to create and destroy scalable */
+  /*    glyph images known as `outlines'.  These can also be measured,     */
+  /*    transformed, and converted into bitmaps and pixmaps.               */
+  /*                                                                       */
+  /* <Order>                                                               */
+  /*    FT_Outline                                                         */
+  /*    FT_OUTLINE_FLAGS                                                   */
+  /*    FT_Outline_New                                                     */
+  /*    FT_Outline_Done                                                    */
+  /*    FT_Outline_Copy                                                    */
+  /*    FT_Outline_Translate                                               */
+  /*    FT_Outline_Transform                                               */
+  /*    FT_Outline_Embolden                                                */
+  /*    FT_Outline_Reverse                                                 */
+  /*    FT_Outline_Check                                                   */
+  /*                                                                       */
+  /*    FT_Outline_Get_CBox                                                */
+  /*    FT_Outline_Get_BBox                                                */
+  /*                                                                       */
+  /*    FT_Outline_Get_Bitmap                                              */
+  /*    FT_Outline_Render                                                  */
+  /*                                                                       */
+  /*    FT_Outline_Decompose                                               */
+  /*    FT_Outline_Funcs                                                   */
+  /*    FT_Outline_MoveTo_Func                                             */
+  /*    FT_Outline_LineTo_Func                                             */
+  /*    FT_Outline_ConicTo_Func                                            */
+  /*    FT_Outline_CubicTo_Func                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Decompose                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Walk over an outline's structure to decompose it into individual   */
+  /*    segments and Bézier arcs.  This function also emits `move to'      */
+  /*    operations to indicate the start of new contours in the outline.   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    outline        :: A pointer to the source target.                  */
+  /*                                                                       */
+  /*    func_interface :: A table of `emitters', i.e., function pointers   */
+  /*                      called during decomposition to indicate path     */
+  /*                      operations.                                      */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    user           :: A typeless pointer which is passed to each       */
+  /*                      emitter during the decomposition.  It can be     */
+  /*                      used to store the state during the               */
+  /*                      decomposition.                                   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Decompose( FT_Outline*              outline,
+                        const FT_Outline_Funcs*  func_interface,
+                        void*                    user );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_New                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new outline of a given size.                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library     :: A handle to the library object from where the       */
+  /*                   outline is allocated.  Note however that the new    */
+  /*                   outline will *not* necessarily be *freed*, when     */
+  /*                   destroying the library, by @FT_Done_FreeType.       */
+  /*                                                                       */
+  /*    numPoints   :: The maximal number of points within the outline.    */
+  /*                                                                       */
+  /*    numContours :: The maximal number of contours within the outline.  */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    anoutline   :: A handle to the new outline.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The reason why this function takes a `library' parameter is simply */
+  /*    to use the library's memory allocator.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_New( FT_Library   library,
+                  FT_UInt      numPoints,
+                  FT_Int       numContours,
+                  FT_Outline  *anoutline );
+
+
+  FT_EXPORT( FT_Error )
+  FT_Outline_New_Internal( FT_Memory    memory,
+                           FT_UInt      numPoints,
+                           FT_Int       numContours,
+                           FT_Outline  *anoutline );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Done                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroy an outline created with @FT_Outline_New.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle of the library object used to allocate the     */
+  /*               outline.                                                */
+  /*                                                                       */
+  /*    outline :: A pointer to the outline object to be discarded.        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If the outline's `owner' field is not set, only the outline        */
+  /*    descriptor will be released.                                       */
+  /*                                                                       */
+  /*    The reason why this function takes an `library' parameter is       */
+  /*    simply to use ft_mem_free().                                       */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Done( FT_Library   library,
+                   FT_Outline*  outline );
+
+
+  FT_EXPORT( FT_Error )
+  FT_Outline_Done_Internal( FT_Memory    memory,
+                            FT_Outline*  outline );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Check                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Check the contents of an outline descriptor.                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    outline :: A handle to a source outline.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Check( FT_Outline*  outline );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Get_CBox                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return an outline's `control box'.  The control box encloses all   */
+  /*    the outline's points, including Bézier control points.  Though it  */
+  /*    coincides with the exact bounding box for most glyphs, it can be   */
+  /*    slightly larger in some situations (like when rotating an outline  */
+  /*    which contains Bézier outside arcs).                               */
+  /*                                                                       */
+  /*    Computing the control box is very fast, while getting the bounding */
+  /*    box can take much more time as it needs to walk over all segments  */
+  /*    and arcs in the outline.  To get the latter, you can use the       */
+  /*    `ftbbox' component which is dedicated to this single task.         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    outline :: A pointer to the source outline descriptor.             */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    acbox   :: The outline's control box.                              */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    See @FT_Glyph_Get_CBox for a discussion of tricky fonts.           */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Outline_Get_CBox( const FT_Outline*  outline,
+                       FT_BBox           *acbox );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Translate                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Apply a simple translation to the points of an outline.            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    outline :: A pointer to the target outline descriptor.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    xOffset :: The horizontal offset.                                  */
+  /*                                                                       */
+  /*    yOffset :: The vertical offset.                                    */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Outline_Translate( const FT_Outline*  outline,
+                        FT_Pos             xOffset,
+                        FT_Pos             yOffset );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Copy                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Copy an outline into another one.  Both objects must have the      */
+  /*    same sizes (number of points & number of contours) when this       */
+  /*    function is called.                                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    source :: A handle to the source outline.                          */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    target :: A handle to the target outline.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Copy( const FT_Outline*  source,
+                   FT_Outline        *target );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Transform                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Apply a simple 2x2 matrix to all of an outline's points.  Useful   */
+  /*    for applying rotations, slanting, flipping, etc.                   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    outline :: A pointer to the target outline descriptor.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    matrix  :: A pointer to the transformation matrix.                 */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You can use @FT_Outline_Translate if you need to translate the     */
+  /*    outline's points.                                                  */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Outline_Transform( const FT_Outline*  outline,
+                        const FT_Matrix*   matrix );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Embolden                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Embolden an outline.  The new outline will be at most 4~times      */
+  /*    `strength' pixels wider and higher.  You may think of the left and */
+  /*    bottom borders as unchanged.                                       */
+  /*                                                                       */
+  /*    Negative `strength' values to reduce the outline thickness are     */
+  /*    possible also.                                                     */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    outline  :: A handle to the target outline.                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    strength :: How strong the glyph is emboldened.  Expressed in      */
+  /*                26.6 pixel format.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The used algorithm to increase or decrease the thickness of the    */
+  /*    glyph doesn't change the number of points; this means that certain */
+  /*    situations like acute angles or intersections are sometimes        */
+  /*    handled incorrectly.                                               */
+  /*                                                                       */
+  /*    If you need `better' metrics values you should call                */
+  /*    @FT_Outline_Get_CBox or @FT_Outline_Get_BBox.                      */
+  /*                                                                       */
+  /*    Example call:                                                      */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      FT_Load_Glyph( face, index, FT_LOAD_DEFAULT );                   */
+  /*      if ( face->slot->format == FT_GLYPH_FORMAT_OUTLINE )             */
+  /*        FT_Outline_Embolden( &face->slot->outline, strength );         */
+  /*    }                                                                  */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Embolden( FT_Outline*  outline,
+                       FT_Pos       strength );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Reverse                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Reverse the drawing direction of an outline.  This is used to      */
+  /*    ensure consistent fill conventions for mirrored glyphs.            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    outline :: A pointer to the target outline descriptor.             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in     */
+  /*    the outline's `flags' field.                                       */
+  /*                                                                       */
+  /*    It shouldn't be used by a normal client application, unless it     */
+  /*    knows what it is doing.                                            */
+  /*                                                                       */
+  FT_EXPORT( void )
+  FT_Outline_Reverse( FT_Outline*  outline );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Get_Bitmap                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Render an outline within a bitmap.  The outline's image is simply  */
+  /*    OR-ed to the target bitmap.                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to a FreeType library object.                  */
+  /*                                                                       */
+  /*    outline :: A pointer to the source outline descriptor.             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    abitmap :: A pointer to the target bitmap descriptor.              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function does NOT CREATE the bitmap, it only renders an       */
+  /*    outline image within the one you pass to it!  Consequently, the    */
+  /*    various fields in `abitmap' should be set accordingly.             */
+  /*                                                                       */
+  /*    It will use the raster corresponding to the default glyph format.  */
+  /*                                                                       */
+  /*    The value of the `num_grays' field in `abitmap' is ignored.  If    */
+  /*    you select the gray-level rasterizer, and you want less than 256   */
+  /*    gray levels, you have to use @FT_Outline_Render directly.          */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Get_Bitmap( FT_Library        library,
+                         FT_Outline*       outline,
+                         const FT_Bitmap  *abitmap );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Render                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Render an outline within a bitmap using the current scan-convert.  */
+  /*    This function uses an @FT_Raster_Params structure as an argument,  */
+  /*    allowing advanced features like direct composition, translucency,  */
+  /*    etc.                                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to a FreeType library object.                  */
+  /*                                                                       */
+  /*    outline :: A pointer to the source outline descriptor.             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    params  :: A pointer to an @FT_Raster_Params structure used to     */
+  /*               describe the rendering operation.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You should know what you are doing and how @FT_Raster_Params works */
+  /*    to use this function.                                              */
+  /*                                                                       */
+  /*    The field `params.source' will be set to `outline' before the scan */
+  /*    converter is called, which means that the value you give to it is  */
+  /*    actually ignored.                                                  */
+  /*                                                                       */
+  /*    The gray-level rasterizer always uses 256 gray levels.  If you     */
+  /*    want less gray levels, you have to provide your own span callback. */
+  /*    See the @FT_RASTER_FLAG_DIRECT value of the `flags' field in the   */
+  /*    @FT_Raster_Params structure for more details.                      */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Outline_Render( FT_Library         library,
+                     FT_Outline*        outline,
+                     FT_Raster_Params*  params );
+
+
+ /**************************************************************************
+  *
+  * @enum:
+  *   FT_Orientation
+  *
+  * @description:
+  *   A list of values used to describe an outline's contour orientation.
+  *
+  *   The TrueType and PostScript specifications use different conventions
+  *   to determine whether outline contours should be filled or unfilled.
+  *
+  * @values:
+  *   FT_ORIENTATION_TRUETYPE ::
+  *     According to the TrueType specification, clockwise contours must
+  *     be filled, and counter-clockwise ones must be unfilled.
+  *
+  *   FT_ORIENTATION_POSTSCRIPT ::
+  *     According to the PostScript specification, counter-clockwise contours
+  *     must be filled, and clockwise ones must be unfilled.
+  *
+  *   FT_ORIENTATION_FILL_RIGHT ::
+  *     This is identical to @FT_ORIENTATION_TRUETYPE, but is used to
+  *     remember that in TrueType, everything that is to the right of
+  *     the drawing direction of a contour must be filled.
+  *
+  *   FT_ORIENTATION_FILL_LEFT ::
+  *     This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to
+  *     remember that in PostScript, everything that is to the left of
+  *     the drawing direction of a contour must be filled.
+  *
+  *   FT_ORIENTATION_NONE ::
+  *     The orientation cannot be determined.  That is, different parts of
+  *     the glyph have different orientation.
+  *
+  */
+  typedef enum  FT_Orientation_
+  {
+    FT_ORIENTATION_TRUETYPE   = 0,
+    FT_ORIENTATION_POSTSCRIPT = 1,
+    FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE,
+    FT_ORIENTATION_FILL_LEFT  = FT_ORIENTATION_POSTSCRIPT,
+    FT_ORIENTATION_NONE
+
+  } FT_Orientation;
+
+
+ /**************************************************************************
+  *
+  * @function:
+  *   FT_Outline_Get_Orientation
+  *
+  * @description:
+  *   This function analyzes a glyph outline and tries to compute its
+  *   fill orientation (see @FT_Orientation).  This is done by computing
+  *   the direction of each global horizontal and/or vertical extrema
+  *   within the outline.
+  *
+  *   Note that this will return @FT_ORIENTATION_TRUETYPE for empty
+  *   outlines.
+  *
+  * @input:
+  *   outline ::
+  *     A handle to the source outline.
+  *
+  * @return:
+  *   The orientation.
+  *
+  */
+  FT_EXPORT( FT_Orientation )
+  FT_Outline_Get_Orientation( FT_Outline*  outline );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTOUTLN_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/include/freetype/ftpfr.h b/include/freetype/ftpfr.h
new file mode 100644 (file)
index 0000000..0b7b7d4
--- /dev/null
@@ -0,0 +1,172 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftpfr.h                                                                */
+/*                                                                         */
+/*    FreeType API for accessing PFR-specific data (specification only).   */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTPFR_H__
+#define __FTPFR_H__
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    pfr_fonts                                                          */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    PFR Fonts                                                          */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    PFR/TrueDoc specific API.                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of PFR-specific functions.   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Get_PFR_Metrics
+  *
+  * @description:
+  *    Return the outline and metrics resolutions of a given PFR face.
+  *
+  * @input:
+  *    face :: Handle to the input face.  It can be a non-PFR face.
+  *
+  * @output:
+  *    aoutline_resolution ::
+  *      Outline resolution.  This is equivalent to `face->units_per_EM'
+  *      for non-PFR fonts.  Optional (parameter can be NULL).
+  *
+  *    ametrics_resolution ::
+  *      Metrics resolution.  This is equivalent to `outline_resolution'
+  *      for non-PFR fonts.  Optional (parameter can be NULL).
+  *
+  *    ametrics_x_scale ::
+  *      A 16.16 fixed-point number used to scale distance expressed
+  *      in metrics units to device sub-pixels.  This is equivalent to
+  *      `face->size->x_scale', but for metrics only.  Optional (parameter
+  *      can be NULL).
+  *
+  *    ametrics_y_scale ::
+  *      Same as `ametrics_x_scale' but for the vertical direction.
+  *      optional (parameter can be NULL).
+  *
+  * @return:
+  *    FreeType error code.  0~means success.
+  *
+  * @note:
+  *   If the input face is not a PFR, this function will return an error.
+  *   However, in all cases, it will return valid values.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Get_PFR_Metrics( FT_Face    face,
+                      FT_UInt   *aoutline_resolution,
+                      FT_UInt   *ametrics_resolution,
+                      FT_Fixed  *ametrics_x_scale,
+                      FT_Fixed  *ametrics_y_scale );
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Get_PFR_Kerning
+  *
+  * @description:
+  *    Return the kerning pair corresponding to two glyphs in a PFR face.
+  *    The distance is expressed in metrics units, unlike the result of
+  *    @FT_Get_Kerning.
+  *
+  * @input:
+  *    face  :: A handle to the input face.
+  *
+  *    left  :: Index of the left glyph.
+  *
+  *    right :: Index of the right glyph.
+  *
+  * @output:
+  *    avector :: A kerning vector.
+  *
+  * @return:
+  *    FreeType error code.  0~means success.
+  *
+  * @note:
+  *    This function always return distances in original PFR metrics
+  *    units.  This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED
+  *    mode, which always returns distances converted to outline units.
+  *
+  *    You can use the value of the `x_scale' and `y_scale' parameters
+  *    returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels.
+  */
+  FT_EXPORT( FT_Error )
+  FT_Get_PFR_Kerning( FT_Face     face,
+                      FT_UInt     left,
+                      FT_UInt     right,
+                      FT_Vector  *avector );
+
+
+ /**********************************************************************
+  *
+  * @function:
+  *    FT_Get_PFR_Advance
+  *
+  * @description:
+  *    Return a given glyph advance, expressed in original metrics units,
+  *    from a PFR font.
+  *
+  * @input:
+  *    face   :: A handle to the input face.
+  *
+  *    gindex :: The glyph index.
+  *
+  * @output:
+  *    aadvance :: The glyph advance in metrics units.
+  *
+  * @return:
+  *    FreeType error code.  0~means success.
+  *
+  * @note:
+  *    You can use the `x_scale' or `y_scale' results of @FT_Get_PFR_Metrics
+  *    to convert the advance to device sub-pixels (i.e., 1/64th of pixels).
+  */
+  FT_EXPORT( FT_Error )
+  FT_Get_PFR_Advance( FT_Face   face,
+                      FT_UInt   gindex,
+                      FT_Pos   *aadvance );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTPFR_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftrender.h b/include/freetype/ftrender.h
new file mode 100644 (file)
index 0000000..dd0229b
--- /dev/null
@@ -0,0 +1,238 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftrender.h                                                             */
+/*                                                                         */
+/*    FreeType renderer modules public interface (specification).          */
+/*                                                                         */
+/*  Copyright 1996-2001, 2005, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTRENDER_H__
+#define __FTRENDER_H__
+
+
+#include <ft2build.h>
+#include FT_MODULE_H
+#include FT_GLYPH_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    module_management                                                  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* create a new glyph object */
+  typedef FT_Error
+  (*FT_Glyph_InitFunc)( FT_Glyph      glyph,
+                        FT_GlyphSlot  slot );
+
+  /* destroys a given glyph object */
+  typedef void
+  (*FT_Glyph_DoneFunc)( FT_Glyph  glyph );
+
+  typedef void
+  (*FT_Glyph_TransformFunc)( FT_Glyph          glyph,
+                             const FT_Matrix*  matrix,
+                             const FT_Vector*  delta );
+
+  typedef void
+  (*FT_Glyph_GetBBoxFunc)( FT_Glyph  glyph,
+                           FT_BBox*  abbox );
+
+  typedef FT_Error
+  (*FT_Glyph_CopyFunc)( FT_Glyph   source,
+                        FT_Glyph   target );
+
+  typedef FT_Error
+  (*FT_Glyph_PrepareFunc)( FT_Glyph      glyph,
+                           FT_GlyphSlot  slot );
+
+/* deprecated */
+#define FT_Glyph_Init_Func       FT_Glyph_InitFunc
+#define FT_Glyph_Done_Func       FT_Glyph_DoneFunc
+#define FT_Glyph_Transform_Func  FT_Glyph_TransformFunc
+#define FT_Glyph_BBox_Func       FT_Glyph_GetBBoxFunc
+#define FT_Glyph_Copy_Func       FT_Glyph_CopyFunc
+#define FT_Glyph_Prepare_Func    FT_Glyph_PrepareFunc
+
+
+  struct  FT_Glyph_Class_
+  {
+    FT_Long                 glyph_size;
+    FT_Glyph_Format         glyph_format;
+    FT_Glyph_InitFunc       glyph_init;
+    FT_Glyph_DoneFunc       glyph_done;
+    FT_Glyph_CopyFunc       glyph_copy;
+    FT_Glyph_TransformFunc  glyph_transform;
+    FT_Glyph_GetBBoxFunc    glyph_bbox;
+    FT_Glyph_PrepareFunc    glyph_prepare;
+  };
+
+
+  typedef FT_Error
+  (*FT_Renderer_RenderFunc)( FT_Renderer       renderer,
+                             FT_GlyphSlot      slot,
+                             FT_UInt           mode,
+                             const FT_Vector*  origin );
+
+  typedef FT_Error
+  (*FT_Renderer_TransformFunc)( FT_Renderer       renderer,
+                                FT_GlyphSlot      slot,
+                                const FT_Matrix*  matrix,
+                                const FT_Vector*  delta );
+
+
+  typedef void
+  (*FT_Renderer_GetCBoxFunc)( FT_Renderer   renderer,
+                              FT_GlyphSlot  slot,
+                              FT_BBox*      cbox );
+
+
+  typedef FT_Error
+  (*FT_Renderer_SetModeFunc)( FT_Renderer  renderer,
+                              FT_ULong     mode_tag,
+                              FT_Pointer   mode_ptr );
+
+/* deprecated identifiers */
+#define FTRenderer_render  FT_Renderer_RenderFunc
+#define FTRenderer_transform  FT_Renderer_TransformFunc
+#define FTRenderer_getCBox  FT_Renderer_GetCBoxFunc
+#define FTRenderer_setMode  FT_Renderer_SetModeFunc
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Renderer_Class                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The renderer module class descriptor.                              */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root            :: The root @FT_Module_Class fields.               */
+  /*                                                                       */
+  /*    glyph_format    :: The glyph image format this renderer handles.   */
+  /*                                                                       */
+  /*    render_glyph    :: A method used to render the image that is in a  */
+  /*                       given glyph slot into a bitmap.                 */
+  /*                                                                       */
+  /*    transform_glyph :: A method used to transform the image that is in */
+  /*                       a given glyph slot.                             */
+  /*                                                                       */
+  /*    get_glyph_cbox  :: A method used to access the glyph's cbox.       */
+  /*                                                                       */
+  /*    set_mode        :: A method used to pass additional parameters.    */
+  /*                                                                       */
+  /*    raster_class    :: For @FT_GLYPH_FORMAT_OUTLINE renderers only.    */
+  /*                       This is a pointer to its raster's class.        */
+  /*                                                                       */
+  typedef struct  FT_Renderer_Class_
+  {
+    FT_Module_Class            root;
+
+    FT_Glyph_Format            glyph_format;
+
+    FT_Renderer_RenderFunc     render_glyph;
+    FT_Renderer_TransformFunc  transform_glyph;
+    FT_Renderer_GetCBoxFunc    get_glyph_cbox;
+    FT_Renderer_SetModeFunc    set_mode;
+
+    FT_Raster_Funcs*           raster_class;
+
+  } FT_Renderer_Class;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Renderer                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the current renderer for a given glyph format.            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle to the library object.                         */
+  /*                                                                       */
+  /*    format  :: The glyph format.                                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A renderer handle.  0~if none found.                               */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    An error will be returned if a module already exists by that name, */
+  /*    or if the module requires a version of FreeType that is too great. */
+  /*                                                                       */
+  /*    To add a new renderer, simply use @FT_Add_Module.  To retrieve a   */
+  /*    renderer by its name, use @FT_Get_Module.                          */
+  /*                                                                       */
+  FT_EXPORT( FT_Renderer )
+  FT_Get_Renderer( FT_Library       library,
+                   FT_Glyph_Format  format );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Renderer                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Set the current renderer to use, and set additional mode.          */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    library    :: A handle to the library object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    renderer   :: A handle to the renderer object.                     */
+  /*                                                                       */
+  /*    num_params :: The number of additional parameters.                 */
+  /*                                                                       */
+  /*    parameters :: Additional parameters.                               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    In case of success, the renderer will be used to convert glyph     */
+  /*    images in the renderer's known format into bitmaps.                */
+  /*                                                                       */
+  /*    This doesn't change the current renderer for other formats.        */
+  /*                                                                       */
+  /*    Currently, only the B/W renderer, if compiled with                 */
+  /*    FT_RASTER_OPTION_ANTI_ALIASING (providing a 5-levels               */
+  /*    anti-aliasing mode; this option must be set directly in            */
+  /*    `ftraster.c' and is undefined by default) accepts a single tag     */
+  /*    `pal5' to set its gray palette as a character string with          */
+  /*    5~elements.  Consequently, the third and fourth argument are zero  */
+  /*    normally.                                                          */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Renderer( FT_Library     library,
+                   FT_Renderer    renderer,
+                   FT_UInt        num_params,
+                   FT_Parameter*  parameters );
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTRENDER_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftsizes.h b/include/freetype/ftsizes.h
new file mode 100644 (file)
index 0000000..3e548cc
--- /dev/null
@@ -0,0 +1,159 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsizes.h                                                              */
+/*                                                                         */
+/*    FreeType size objects management (specification).                    */
+/*                                                                         */
+/*  Copyright 1996-2001, 2003, 2004, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Typical application would normally not need to use these functions.   */
+  /* However, they have been placed in a public API for the rare cases     */
+  /* where they are needed.                                                */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTSIZES_H__
+#define __FTSIZES_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    sizes_management                                                   */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Size Management                                                    */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Managing multiple sizes per face.                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    When creating a new face object (e.g., with @FT_New_Face), an      */
+  /*    @FT_Size object is automatically created and used to store all     */
+  /*    pixel-size dependent information, available in the `face->size'    */
+  /*    field.                                                             */
+  /*                                                                       */
+  /*    It is however possible to create more sizes for a given face,      */
+  /*    mostly in order to manage several character pixel sizes of the     */
+  /*    same font family and style.  See @FT_New_Size and @FT_Done_Size.   */
+  /*                                                                       */
+  /*    Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only           */
+  /*    modify the contents of the current `active' size; you thus need    */
+  /*    to use @FT_Activate_Size to change it.                             */
+  /*                                                                       */
+  /*    99% of applications won't need the functions provided here,        */
+  /*    especially if they use the caching sub-system, so be cautious      */
+  /*    when using these.                                                  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Size                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new size object from a given face object.                 */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to a parent face object.                          */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    asize :: A handle to a new size object.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You need to call @FT_Activate_Size in order to select the new size */
+  /*    for upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size,      */
+  /*    @FT_Load_Glyph, @FT_Load_Char, etc.                                */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_New_Size( FT_Face   face,
+               FT_Size*  size );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_Size                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Discard a given size object.  Note that @FT_Done_Face              */
+  /*    automatically discards all size objects allocated with             */
+  /*    @FT_New_Size.                                                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    size :: A handle to a target size object.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Done_Size( FT_Size  size );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Activate_Size                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Even though it is possible to create several size objects for a    */
+  /*    given face (see @FT_New_Size for details), functions like          */
+  /*    @FT_Load_Glyph or @FT_Load_Char only use the one which has been    */
+  /*    activated last to determine the `current character pixel size'.    */
+  /*                                                                       */
+  /*    This function can be used to `activate' a previously created size  */
+  /*    object.                                                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    size :: A handle to a target size object.                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    If `face' is the size's parent face object, this function changes  */
+  /*    the value of `face->size' to the input size handle.                */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Activate_Size( FT_Size  size );
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTSIZES_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftsnames.h b/include/freetype/ftsnames.h
new file mode 100644 (file)
index 0000000..485e4e1
--- /dev/null
@@ -0,0 +1,200 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsnames.h                                                             */
+/*                                                                         */
+/*    Simple interface to access SFNT name tables (which are used          */
+/*    to hold font names, copyright info, notices, etc.) (specification).  */
+/*                                                                         */
+/*    This is _not_ used to retrieve glyph names!                          */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FT_SFNT_NAMES_H__
+#define __FT_SFNT_NAMES_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    sfnt_names                                                         */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    SFNT Names                                                         */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Access the names embedded in TrueType and OpenType files.          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The TrueType and OpenType specifications allow the inclusion of    */
+  /*    a special `names table' in font files.  This table contains        */
+  /*    textual (and internationalized) information regarding the font,    */
+  /*    like family name, copyright, version, etc.                         */
+  /*                                                                       */
+  /*    The definitions below are used to access them if available.        */
+  /*                                                                       */
+  /*    Note that this has nothing to do with glyph names!                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_SfntName                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model an SFNT `name' table entry.              */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    platform_id :: The platform ID for `string'.                       */
+  /*                                                                       */
+  /*    encoding_id :: The encoding ID for `string'.                       */
+  /*                                                                       */
+  /*    language_id :: The language ID for `string'.                       */
+  /*                                                                       */
+  /*    name_id     :: An identifier for `string'.                         */
+  /*                                                                       */
+  /*    string      :: The `name' string.  Note that its format differs    */
+  /*                   depending on the (platform,encoding) pair.  It can  */
+  /*                   be a Pascal String, a UTF-16 one, etc.              */
+  /*                                                                       */
+  /*                   Generally speaking, the string is not               */
+  /*                   zero-terminated.  Please refer to the TrueType      */
+  /*                   specification for details.                          */
+  /*                                                                       */
+  /*    string_len  :: The length of `string' in bytes.                    */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Possible values for `platform_id', `encoding_id', `language_id',   */
+  /*    and `name_id' are given in the file `ttnameid.h'.  For details     */
+  /*    please refer to the TrueType or OpenType specification.            */
+  /*                                                                       */
+  /*    See also @TT_PLATFORM_XXX, @TT_APPLE_ID_XXX, @TT_MAC_ID_XXX,       */
+  /*    @TT_ISO_ID_XXX, and @TT_MS_ID_XXX.                                 */
+  /*                                                                       */
+  typedef struct  FT_SfntName_
+  {
+    FT_UShort  platform_id;
+    FT_UShort  encoding_id;
+    FT_UShort  language_id;
+    FT_UShort  name_id;
+
+    FT_Byte*   string;      /* this string is *not* null-terminated! */
+    FT_UInt    string_len;  /* in bytes */
+
+  } FT_SfntName;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Sfnt_Name_Count                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve the number of name strings in the SFNT `name' table.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the source face.                               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The number of strings in the `name' table.                         */
+  /*                                                                       */
+  FT_EXPORT( FT_UInt )
+  FT_Get_Sfnt_Name_Count( FT_Face  face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Sfnt_Name                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieve a string of the SFNT `name' table for a given index.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face  :: A handle to the source face.                              */
+  /*                                                                       */
+  /*    idx   :: The index of the `name' string.                           */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aname :: The indexed @FT_SfntName structure.                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The `string' array returned in the `aname' structure is not        */
+  /*    null-terminated.  The application should deallocate it if it is no */
+  /*    longer in use.                                                     */
+  /*                                                                       */
+  /*    Use @FT_Get_Sfnt_Name_Count to get the total number of available   */
+  /*    `name' table entries, then do a loop until you get the right       */
+  /*    platform, encoding, and name ID.                                   */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Sfnt_Name( FT_Face       face,
+                    FT_UInt       idx,
+                    FT_SfntName  *aname );
+
+
+  /***************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY
+   *
+   * @description:
+   *   A constant used as the tag of @FT_Parameter structures to make
+   *   FT_Open_Face() ignore preferred family subfamily names in `name'
+   *   table since OpenType version 1.4.  For backwards compatibility with
+   *   legacy systems which has 4-face-per-family restriction.
+   *
+   */
+#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY  FT_MAKE_TAG( 'i', 'g', 'p', 'f' )
+
+
+  /***************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY
+   *
+   * @description:
+   *   A constant used as the tag of @FT_Parameter structures to make
+   *   FT_Open_Face() ignore preferred subfamily names in `name' table since
+   *   OpenType version 1.4.  For backwards compatibility with legacy
+   *   systems which has 4-face-per-family restriction.
+   *
+   */
+#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY  FT_MAKE_TAG( 'i', 'g', 'p', 's' )
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FT_SFNT_NAMES_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftstroke.h b/include/freetype/ftstroke.h
new file mode 100644 (file)
index 0000000..49ae2bc
--- /dev/null
@@ -0,0 +1,741 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftstroke.h                                                             */
+/*                                                                         */
+/*    FreeType path stroker (specification).                               */
+/*                                                                         */
+/*  Copyright 2002-2006, 2008, 2009, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FT_STROKE_H__
+#define __FT_STROKE_H__
+
+#include <ft2build.h>
+#include FT_OUTLINE_H
+#include FT_GLYPH_H
+
+
+FT_BEGIN_HEADER
+
+
+ /************************************************************************
+  *
+  * @section:
+  *    glyph_stroker
+  *
+  * @title:
+  *    Glyph Stroker
+  *
+  * @abstract:
+  *    Generating bordered and stroked glyphs.
+  *
+  * @description:
+  *    This component generates stroked outlines of a given vectorial
+  *    glyph.  It also allows you to retrieve the `outside' and/or the
+  *    `inside' borders of the stroke.
+  *
+  *    This can be useful to generate `bordered' glyph, i.e., glyphs
+  *    displayed with a coloured (and anti-aliased) border around their
+  *    shape.
+  */
+
+
+ /**************************************************************
+  *
+  * @type:
+  *   FT_Stroker
+  *
+  * @description:
+  *   Opaque handler to a path stroker object.
+  */
+  typedef struct FT_StrokerRec_*  FT_Stroker;
+
+
+  /**************************************************************
+   *
+   * @enum:
+   *   FT_Stroker_LineJoin
+   *
+   * @description:
+   *   These values determine how two joining lines are rendered
+   *   in a stroker.
+   *
+   * @values:
+   *   FT_STROKER_LINEJOIN_ROUND ::
+   *     Used to render rounded line joins.  Circular arcs are used
+   *     to join two lines smoothly.
+   *
+   *   FT_STROKER_LINEJOIN_BEVEL ::
+   *     Used to render beveled line joins.  The outer corner of
+   *     the joined lines is filled by enclosing the triangular
+   *     region of the corner with a straight line between the
+   *     outer corners of each stroke.
+   *
+   *   FT_STROKER_LINEJOIN_MITER_FIXED ::
+   *     Used to render mitered line joins, with fixed bevels if the
+   *     miter limit is exceeded.  The outer edges of the strokes
+   *     for the two segments are extended until they meet at an
+   *     angle.  If the segments meet at too sharp an angle (such
+   *     that the miter would extend from the intersection of the
+   *     segments a distance greater than the product of the miter
+   *     limit value and the border radius), then a bevel join (see
+   *     above) is used instead.  This prevents long spikes being
+   *     created.  FT_STROKER_LINEJOIN_MITER_FIXED generates a miter
+   *     line join as used in PostScript and PDF.
+   *
+   *   FT_STROKER_LINEJOIN_MITER_VARIABLE ::
+   *   FT_STROKER_LINEJOIN_MITER ::
+   *     Used to render mitered line joins, with variable bevels if
+   *     the miter limit is exceeded.  The intersection of the
+   *     strokes is clipped at a line perpendicular to the bisector
+   *     of the angle between the strokes, at the distance from the
+   *     intersection of the segments equal to the product of the
+   *     miter limit value and the border radius.  This prevents
+   *     long spikes being created.
+   *     FT_STROKER_LINEJOIN_MITER_VARIABLE generates a mitered line
+   *     join as used in XPS.  FT_STROKER_LINEJOIN_MITER is an alias
+   *     for FT_STROKER_LINEJOIN_MITER_VARIABLE, retained for
+   *     backwards compatibility.
+   */
+  typedef enum  FT_Stroker_LineJoin_
+  {
+    FT_STROKER_LINEJOIN_ROUND          = 0,
+    FT_STROKER_LINEJOIN_BEVEL          = 1,
+    FT_STROKER_LINEJOIN_MITER_VARIABLE = 2,
+    FT_STROKER_LINEJOIN_MITER          = FT_STROKER_LINEJOIN_MITER_VARIABLE,
+    FT_STROKER_LINEJOIN_MITER_FIXED    = 3
+
+  } FT_Stroker_LineJoin;
+
+
+  /**************************************************************
+   *
+   * @enum:
+   *   FT_Stroker_LineCap
+   *
+   * @description:
+   *   These values determine how the end of opened sub-paths are
+   *   rendered in a stroke.
+   *
+   * @values:
+   *   FT_STROKER_LINECAP_BUTT ::
+   *     The end of lines is rendered as a full stop on the last
+   *     point itself.
+   *
+   *   FT_STROKER_LINECAP_ROUND ::
+   *     The end of lines is rendered as a half-circle around the
+   *     last point.
+   *
+   *   FT_STROKER_LINECAP_SQUARE ::
+   *     The end of lines is rendered as a square around the
+   *     last point.
+   */
+  typedef enum  FT_Stroker_LineCap_
+  {
+    FT_STROKER_LINECAP_BUTT = 0,
+    FT_STROKER_LINECAP_ROUND,
+    FT_STROKER_LINECAP_SQUARE
+
+  } FT_Stroker_LineCap;
+
+
+  /**************************************************************
+   *
+   * @enum:
+   *   FT_StrokerBorder
+   *
+   * @description:
+   *   These values are used to select a given stroke border
+   *   in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder.
+   *
+   * @values:
+   *   FT_STROKER_BORDER_LEFT ::
+   *     Select the left border, relative to the drawing direction.
+   *
+   *   FT_STROKER_BORDER_RIGHT ::
+   *     Select the right border, relative to the drawing direction.
+   *
+   * @note:
+   *   Applications are generally interested in the `inside' and `outside'
+   *   borders.  However, there is no direct mapping between these and the
+   *   `left' and `right' ones, since this really depends on the glyph's
+   *   drawing orientation, which varies between font formats.
+   *
+   *   You can however use @FT_Outline_GetInsideBorder and
+   *   @FT_Outline_GetOutsideBorder to get these.
+   */
+  typedef enum  FT_StrokerBorder_
+  {
+    FT_STROKER_BORDER_LEFT = 0,
+    FT_STROKER_BORDER_RIGHT
+
+  } FT_StrokerBorder;
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Outline_GetInsideBorder
+   *
+   * @description:
+   *   Retrieve the @FT_StrokerBorder value corresponding to the
+   *   `inside' borders of a given outline.
+   *
+   * @input:
+   *   outline ::
+   *     The source outline handle.
+   *
+   * @return:
+   *   The border index.  @FT_STROKER_BORDER_RIGHT for empty or invalid
+   *   outlines.
+   */
+  FT_EXPORT( FT_StrokerBorder )
+  FT_Outline_GetInsideBorder( FT_Outline*  outline );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Outline_GetOutsideBorder
+   *
+   * @description:
+   *   Retrieve the @FT_StrokerBorder value corresponding to the
+   *   `outside' borders of a given outline.
+   *
+   * @input:
+   *   outline ::
+   *     The source outline handle.
+   *
+   * @return:
+   *   The border index.  @FT_STROKER_BORDER_LEFT for empty or invalid
+   *   outlines.
+   */
+  FT_EXPORT( FT_StrokerBorder )
+  FT_Outline_GetOutsideBorder( FT_Outline*  outline );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_New
+   *
+   * @description:
+   *   Create a new stroker object.
+   *
+   * @input:
+   *   library ::
+   *     FreeType library handle.
+   *
+   * @output:
+   *   astroker ::
+   *     A new stroker object handle.  NULL in case of error.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_New( FT_Library   library,
+                  FT_Stroker  *astroker );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_Set
+   *
+   * @description:
+   *   Reset a stroker object's attributes.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   radius ::
+   *     The border radius.
+   *
+   *   line_cap ::
+   *     The line cap style.
+   *
+   *   line_join ::
+   *     The line join style.
+   *
+   *   miter_limit ::
+   *     The miter limit for the FT_STROKER_LINEJOIN_MITER_FIXED and
+   *     FT_STROKER_LINEJOIN_MITER_VARIABLE line join styles,
+   *     expressed as 16.16 fixed point value.
+   *
+   * @note:
+   *   The radius is expressed in the same units as the outline
+   *   coordinates.
+   */
+  FT_EXPORT( void )
+  FT_Stroker_Set( FT_Stroker           stroker,
+                  FT_Fixed             radius,
+                  FT_Stroker_LineCap   line_cap,
+                  FT_Stroker_LineJoin  line_join,
+                  FT_Fixed             miter_limit );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_Rewind
+   *
+   * @description:
+   *   Reset a stroker object without changing its attributes.
+   *   You should call this function before beginning a new
+   *   series of calls to @FT_Stroker_BeginSubPath or
+   *   @FT_Stroker_EndSubPath.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   */
+  FT_EXPORT( void )
+  FT_Stroker_Rewind( FT_Stroker  stroker );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_ParseOutline
+   *
+   * @description:
+   *   A convenience function used to parse a whole outline with
+   *   the stroker.  The resulting outline(s) can be retrieved
+   *   later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   outline ::
+   *     The source outline.
+   *
+   *   opened ::
+   *     A boolean.  If~1, the outline is treated as an open path instead
+   *     of a closed one.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   If `opened' is~0 (the default), the outline is treated as a closed
+   *   path, and the stroker generates two distinct `border' outlines.
+   *
+   *   If `opened' is~1, the outline is processed as an open path, and the
+   *   stroker generates a single `stroke' outline.
+   *
+   *   This function calls @FT_Stroker_Rewind automatically.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_ParseOutline( FT_Stroker   stroker,
+                           FT_Outline*  outline,
+                           FT_Bool      opened );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_BeginSubPath
+   *
+   * @description:
+   *   Start a new sub-path in the stroker.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   to ::
+   *     A pointer to the start vector.
+   *
+   *   open ::
+   *     A boolean.  If~1, the sub-path is treated as an open one.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   This function is useful when you need to stroke a path that is
+   *   not stored as an @FT_Outline object.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_BeginSubPath( FT_Stroker  stroker,
+                           FT_Vector*  to,
+                           FT_Bool     open );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_EndSubPath
+   *
+   * @description:
+   *   Close the current sub-path in the stroker.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   You should call this function after @FT_Stroker_BeginSubPath.
+   *   If the subpath was not `opened', this function `draws' a
+   *   single line segment to the start position when needed.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_EndSubPath( FT_Stroker  stroker );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_LineTo
+   *
+   * @description:
+   *   `Draw' a single line segment in the stroker's current sub-path,
+   *   from the last position.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   to ::
+   *     A pointer to the destination point.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   You should call this function between @FT_Stroker_BeginSubPath and
+   *   @FT_Stroker_EndSubPath.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_LineTo( FT_Stroker  stroker,
+                     FT_Vector*  to );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_ConicTo
+   *
+   * @description:
+   *   `Draw' a single quadratic Bézier in the stroker's current sub-path,
+   *   from the last position.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   control ::
+   *     A pointer to a Bézier control point.
+   *
+   *   to ::
+   *     A pointer to the destination point.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   You should call this function between @FT_Stroker_BeginSubPath and
+   *   @FT_Stroker_EndSubPath.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_ConicTo( FT_Stroker  stroker,
+                      FT_Vector*  control,
+                      FT_Vector*  to );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_CubicTo
+   *
+   * @description:
+   *   `Draw' a single cubic Bézier in the stroker's current sub-path,
+   *   from the last position.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   control1 ::
+   *     A pointer to the first Bézier control point.
+   *
+   *   control2 ::
+   *     A pointer to second Bézier control point.
+   *
+   *   to ::
+   *     A pointer to the destination point.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   You should call this function between @FT_Stroker_BeginSubPath and
+   *   @FT_Stroker_EndSubPath.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_CubicTo( FT_Stroker  stroker,
+                      FT_Vector*  control1,
+                      FT_Vector*  control2,
+                      FT_Vector*  to );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_GetBorderCounts
+   *
+   * @description:
+   *   Call this function once you have finished parsing your paths
+   *   with the stroker.  It returns the number of points and
+   *   contours necessary to export one of the `border' or `stroke'
+   *   outlines generated by the stroker.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   border ::
+   *     The border index.
+   *
+   * @output:
+   *   anum_points ::
+   *     The number of points.
+   *
+   *   anum_contours ::
+   *     The number of contours.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   When an outline, or a sub-path, is `closed', the stroker generates
+   *   two independent `border' outlines, named `left' and `right'.
+   *
+   *   When the outline, or a sub-path, is `opened', the stroker merges
+   *   the `border' outlines with caps.  The `left' border receives all
+   *   points, while the `right' border becomes empty.
+   *
+   *   Use the function @FT_Stroker_GetCounts instead if you want to
+   *   retrieve the counts associated to both borders.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_GetBorderCounts( FT_Stroker        stroker,
+                              FT_StrokerBorder  border,
+                              FT_UInt          *anum_points,
+                              FT_UInt          *anum_contours );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_ExportBorder
+   *
+   * @description:
+   *   Call this function after @FT_Stroker_GetBorderCounts to
+   *   export the corresponding border to your own @FT_Outline
+   *   structure.
+   *
+   *   Note that this function appends the border points and
+   *   contours to your outline, but does not try to resize its
+   *   arrays.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   border ::
+   *     The border index.
+   *
+   *   outline ::
+   *     The target outline handle.
+   *
+   * @note:
+   *   Always call this function after @FT_Stroker_GetBorderCounts to
+   *   get sure that there is enough room in your @FT_Outline object to
+   *   receive all new data.
+   *
+   *   When an outline, or a sub-path, is `closed', the stroker generates
+   *   two independent `border' outlines, named `left' and `right'
+   *
+   *   When the outline, or a sub-path, is `opened', the stroker merges
+   *   the `border' outlines with caps. The `left' border receives all
+   *   points, while the `right' border becomes empty.
+   *
+   *   Use the function @FT_Stroker_Export instead if you want to
+   *   retrieve all borders at once.
+   */
+  FT_EXPORT( void )
+  FT_Stroker_ExportBorder( FT_Stroker        stroker,
+                           FT_StrokerBorder  border,
+                           FT_Outline*       outline );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_GetCounts
+   *
+   * @description:
+   *   Call this function once you have finished parsing your paths
+   *   with the stroker.  It returns the number of points and
+   *   contours necessary to export all points/borders from the stroked
+   *   outline/path.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   * @output:
+   *   anum_points ::
+   *     The number of points.
+   *
+   *   anum_contours ::
+   *     The number of contours.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Stroker_GetCounts( FT_Stroker  stroker,
+                        FT_UInt    *anum_points,
+                        FT_UInt    *anum_contours );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_Export
+   *
+   * @description:
+   *   Call this function after @FT_Stroker_GetBorderCounts to
+   *   export all borders to your own @FT_Outline structure.
+   *
+   *   Note that this function appends the border points and
+   *   contours to your outline, but does not try to resize its
+   *   arrays.
+   *
+   * @input:
+   *   stroker ::
+   *     The target stroker handle.
+   *
+   *   outline ::
+   *     The target outline handle.
+   */
+  FT_EXPORT( void )
+  FT_Stroker_Export( FT_Stroker   stroker,
+                     FT_Outline*  outline );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Stroker_Done
+   *
+   * @description:
+   *   Destroy a stroker object.
+   *
+   * @input:
+   *   stroker ::
+   *     A stroker handle.  Can be NULL.
+   */
+  FT_EXPORT( void )
+  FT_Stroker_Done( FT_Stroker  stroker );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Glyph_Stroke
+   *
+   * @description:
+   *   Stroke a given outline glyph object with a given stroker.
+   *
+   * @inout:
+   *   pglyph ::
+   *     Source glyph handle on input, new glyph handle on output.
+   *
+   * @input:
+   *   stroker ::
+   *     A stroker handle.
+   *
+   *   destroy ::
+   *     A Boolean.  If~1, the source glyph object is destroyed
+   *     on success.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *   The source glyph is untouched in case of error.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Glyph_Stroke( FT_Glyph    *pglyph,
+                   FT_Stroker   stroker,
+                   FT_Bool      destroy );
+
+
+  /**************************************************************
+   *
+   * @function:
+   *   FT_Glyph_StrokeBorder
+   *
+   * @description:
+   *   Stroke a given outline glyph object with a given stroker, but
+   *   only return either its inside or outside border.
+   *
+   * @inout:
+   *   pglyph ::
+   *     Source glyph handle on input, new glyph handle on output.
+   *
+   * @input:
+   *   stroker ::
+   *     A stroker handle.
+   *
+   *   inside ::
+   *     A Boolean.  If~1, return the inside border, otherwise
+   *     the outside border.
+   *
+   *   destroy ::
+   *     A Boolean.  If~1, the source glyph object is destroyed
+   *     on success.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *   The source glyph is untouched in case of error.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Glyph_StrokeBorder( FT_Glyph    *pglyph,
+                         FT_Stroker   stroker,
+                         FT_Bool      inside,
+                         FT_Bool      destroy );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FT_STROKE_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/include/freetype/ftsynth.h b/include/freetype/ftsynth.h
new file mode 100644 (file)
index 0000000..a068b79
--- /dev/null
@@ -0,0 +1,80 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsynth.h                                                              */
+/*                                                                         */
+/*    FreeType synthesizing code for emboldening and slanting              */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 2000-2001, 2003, 2006, 2008 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*********                                                       *********/
+  /*********        WARNING, THIS IS ALPHA CODE!  THIS API         *********/
+  /*********    IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE    *********/
+  /*********            FREETYPE DEVELOPMENT TEAM                  *********/
+  /*********                                                       *********/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* Main reason for not lifting the functions in this module to a  */
+  /* `standard' API is that the used parameters for emboldening and */
+  /* slanting are not configurable.  Consider the functions as a    */
+  /* code resource which should be copied into the application and  */
+  /* adapted to the particular needs.                               */
+
+
+#ifndef __FTSYNTH_H__
+#define __FTSYNTH_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /* Embolden a glyph by a `reasonable' value (which is highly a matter of */
+  /* taste).  This function is actually a convenience function, providing  */
+  /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden.           */
+  /*                                                                       */
+  /* For emboldened outlines the metrics are estimates only; if you need   */
+  /* precise values you should call @FT_Outline_Get_CBox.                  */
+  FT_EXPORT( void )
+  FT_GlyphSlot_Embolden( FT_GlyphSlot  slot );
+
+  /* Slant an outline glyph to the right by about 12 degrees. */
+  FT_EXPORT( void )
+  FT_GlyphSlot_Oblique( FT_GlyphSlot  slot );
+
+  /* */
+
+FT_END_HEADER
+
+#endif /* __FTSYNTH_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftsystem.h b/include/freetype/ftsystem.h
new file mode 100644 (file)
index 0000000..e07460c
--- /dev/null
@@ -0,0 +1,347 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsystem.h                                                             */
+/*                                                                         */
+/*    FreeType low-level system interface definition (specification).      */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2005, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTSYSTEM_H__
+#define __FTSYSTEM_H__
+
+
+#include <ft2build.h>
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*   system_interface                                                    */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*   System Interface                                                    */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*   How FreeType manages memory and i/o.                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   This section contains various definitions related to memory         */
+  /*   management and i/o access.  You need to understand this             */
+  /*   information if you want to use a custom memory manager or you own   */
+  /*   i/o streams.                                                        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                  M E M O R Y   M A N A G E M E N T                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @type:
+   *   FT_Memory
+   *
+   * @description:
+   *   A handle to a given memory manager object, defined with an
+   *   @FT_MemoryRec structure.
+   *
+   */
+  typedef struct FT_MemoryRec_*  FT_Memory;
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   FT_Alloc_Func
+   *
+   * @description:
+   *   A function used to allocate `size' bytes from `memory'.
+   *
+   * @input:
+   *   memory ::
+   *     A handle to the source memory manager.
+   *
+   *   size ::
+   *     The size in bytes to allocate.
+   *
+   * @return:
+   *   Address of new memory block.  0~in case of failure.
+   *
+   */
+  typedef void*
+  (*FT_Alloc_Func)( FT_Memory  memory,
+                    long       size );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   FT_Free_Func
+   *
+   * @description:
+   *   A function used to release a given block of memory.
+   *
+   * @input:
+   *   memory ::
+   *     A handle to the source memory manager.
+   *
+   *   block ::
+   *     The address of the target memory block.
+   *
+   */
+  typedef void
+  (*FT_Free_Func)( FT_Memory  memory,
+                   void*      block );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   FT_Realloc_Func
+   *
+   * @description:
+   *   A function used to re-allocate a given block of memory.
+   *
+   * @input:
+   *   memory ::
+   *     A handle to the source memory manager.
+   *
+   *   cur_size ::
+   *     The block's current size in bytes.
+   *
+   *   new_size ::
+   *     The block's requested new size.
+   *
+   *   block ::
+   *     The block's current address.
+   *
+   * @return:
+   *   New block address.  0~in case of memory shortage.
+   *
+   * @note:
+   *   In case of error, the old block must still be available.
+   *
+   */
+  typedef void*
+  (*FT_Realloc_Func)( FT_Memory  memory,
+                      long       cur_size,
+                      long       new_size,
+                      void*      block );
+
+
+  /*************************************************************************
+   *
+   * @struct:
+   *   FT_MemoryRec
+   *
+   * @description:
+   *   A structure used to describe a given memory manager to FreeType~2.
+   *
+   * @fields:
+   *   user ::
+   *     A generic typeless pointer for user data.
+   *
+   *   alloc ::
+   *     A pointer type to an allocation function.
+   *
+   *   free ::
+   *     A pointer type to an memory freeing function.
+   *
+   *   realloc ::
+   *     A pointer type to a reallocation function.
+   *
+   */
+  struct  FT_MemoryRec_
+  {
+    void*            user;
+    FT_Alloc_Func    alloc;
+    FT_Free_Func     free;
+    FT_Realloc_Func  realloc;
+  };
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                       I / O   M A N A G E M E N T                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @type:
+   *   FT_Stream
+   *
+   * @description:
+   *   A handle to an input stream.
+   *
+   */
+  typedef struct FT_StreamRec_*  FT_Stream;
+
+
+  /*************************************************************************
+   *
+   * @struct:
+   *   FT_StreamDesc
+   *
+   * @description:
+   *   A union type used to store either a long or a pointer.  This is used
+   *   to store a file descriptor or a `FILE*' in an input stream.
+   *
+   */
+  typedef union  FT_StreamDesc_
+  {
+    long   value;
+    void*  pointer;
+
+  } FT_StreamDesc;
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   FT_Stream_IoFunc
+   *
+   * @description:
+   *   A function used to seek and read data from a given input stream.
+   *
+   * @input:
+   *   stream ::
+   *     A handle to the source stream.
+   *
+   *   offset ::
+   *     The offset of read in stream (always from start).
+   *
+   *   buffer ::
+   *     The address of the read buffer.
+   *
+   *   count ::
+   *     The number of bytes to read from the stream.
+   *
+   * @return:
+   *   The number of bytes effectively read by the stream.
+   *
+   * @note:
+   *   This function might be called to perform a seek or skip operation
+   *   with a `count' of~0.  A non-zero return value then indicates an
+   *   error.
+   *
+   */
+  typedef unsigned long
+  (*FT_Stream_IoFunc)( FT_Stream       stream,
+                       unsigned long   offset,
+                       unsigned char*  buffer,
+                       unsigned long   count );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   FT_Stream_CloseFunc
+   *
+   * @description:
+   *   A function used to close a given input stream.
+   *
+   * @input:
+   *  stream ::
+   *     A handle to the target stream.
+   *
+   */
+  typedef void
+  (*FT_Stream_CloseFunc)( FT_Stream  stream );
+
+
+  /*************************************************************************
+   *
+   * @struct:
+   *   FT_StreamRec
+   *
+   * @description:
+   *   A structure used to describe an input stream.
+   *
+   * @input:
+   *   base ::
+   *     For memory-based streams, this is the address of the first stream
+   *     byte in memory.  This field should always be set to NULL for
+   *     disk-based streams.
+   *
+   *   size ::
+   *     The stream size in bytes.
+   *
+   *   pos ::
+   *     The current position within the stream.
+   *
+   *   descriptor ::
+   *     This field is a union that can hold an integer or a pointer.  It is
+   *     used by stream implementations to store file descriptors or `FILE*'
+   *     pointers.
+   *
+   *   pathname ::
+   *     This field is completely ignored by FreeType.  However, it is often
+   *     useful during debugging to use it to store the stream's filename
+   *     (where available).
+   *
+   *   read ::
+   *     The stream's input function.
+   *
+   *   close ::
+   *     The stream's close function.
+   *
+   *   memory ::
+   *     The memory manager to use to preload frames.  This is set
+   *     internally by FreeType and shouldn't be touched by stream
+   *     implementations.
+   *
+   *   cursor ::
+   *     This field is set and used internally by FreeType when parsing
+   *     frames.
+   *
+   *   limit ::
+   *     This field is set and used internally by FreeType when parsing
+   *     frames.
+   *
+   */
+  typedef struct  FT_StreamRec_
+  {
+    unsigned char*       base;
+    unsigned long        size;
+    unsigned long        pos;
+
+    FT_StreamDesc        descriptor;
+    FT_StreamDesc        pathname;
+    FT_Stream_IoFunc     read;
+    FT_Stream_CloseFunc  close;
+
+    FT_Memory            memory;
+    unsigned char*       cursor;
+    unsigned char*       limit;
+
+  } FT_StreamRec;
+
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTSYSTEM_H__ */
+
+
+/* END */
diff --git a/include/freetype/fttrigon.h b/include/freetype/fttrigon.h
new file mode 100644 (file)
index 0000000..6b77d2e
--- /dev/null
@@ -0,0 +1,350 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fttrigon.h                                                             */
+/*                                                                         */
+/*    FreeType trigonometric functions (specification).                    */
+/*                                                                         */
+/*  Copyright 2001, 2003, 2005, 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTTRIGON_H__
+#define __FTTRIGON_H__
+
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*   computations                                                        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @type:
+   *   FT_Angle
+   *
+   * @description:
+   *   This type is used to model angle values in FreeType.  Note that the
+   *   angle is a 16.16 fixed float value expressed in degrees.
+   *
+   */
+  typedef FT_Fixed  FT_Angle;
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_ANGLE_PI
+   *
+   * @description:
+   *   The angle pi expressed in @FT_Angle units.
+   *
+   */
+#define FT_ANGLE_PI  ( 180L << 16 )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_ANGLE_2PI
+   *
+   * @description:
+   *   The angle 2*pi expressed in @FT_Angle units.
+   *
+   */
+#define FT_ANGLE_2PI  ( FT_ANGLE_PI * 2 )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_ANGLE_PI2
+   *
+   * @description:
+   *   The angle pi/2 expressed in @FT_Angle units.
+   *
+   */
+#define FT_ANGLE_PI2  ( FT_ANGLE_PI / 2 )
+
+
+  /*************************************************************************
+   *
+   * @macro:
+   *   FT_ANGLE_PI4
+   *
+   * @description:
+   *   The angle pi/4 expressed in @FT_Angle units.
+   *
+   */
+#define FT_ANGLE_PI4  ( FT_ANGLE_PI / 4 )
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Sin
+   *
+   * @description:
+   *   Return the sinus of a given angle in fixed point format.
+   *
+   * @input:
+   *   angle ::
+   *     The input angle.
+   *
+   * @return:
+   *   The sinus value.
+   *
+   * @note:
+   *   If you need both the sinus and cosinus for a given angle, use the
+   *   function @FT_Vector_Unit.
+   *
+   */
+  FT_EXPORT( FT_Fixed )
+  FT_Sin( FT_Angle  angle );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Cos
+   *
+   * @description:
+   *   Return the cosinus of a given angle in fixed point format.
+   *
+   * @input:
+   *   angle ::
+   *     The input angle.
+   *
+   * @return:
+   *   The cosinus value.
+   *
+   * @note:
+   *   If you need both the sinus and cosinus for a given angle, use the
+   *   function @FT_Vector_Unit.
+   *
+   */
+  FT_EXPORT( FT_Fixed )
+  FT_Cos( FT_Angle  angle );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Tan
+   *
+   * @description:
+   *   Return the tangent of a given angle in fixed point format.
+   *
+   * @input:
+   *   angle ::
+   *     The input angle.
+   *
+   * @return:
+   *   The tangent value.
+   *
+   */
+  FT_EXPORT( FT_Fixed )
+  FT_Tan( FT_Angle  angle );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Atan2
+   *
+   * @description:
+   *   Return the arc-tangent corresponding to a given vector (x,y) in
+   *   the 2d plane.
+   *
+   * @input:
+   *   x ::
+   *     The horizontal vector coordinate.
+   *
+   *   y ::
+   *     The vertical vector coordinate.
+   *
+   * @return:
+   *   The arc-tangent value (i.e. angle).
+   *
+   */
+  FT_EXPORT( FT_Angle )
+  FT_Atan2( FT_Fixed  x,
+            FT_Fixed  y );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Angle_Diff
+   *
+   * @description:
+   *   Return the difference between two angles.  The result is always
+   *   constrained to the ]-PI..PI] interval.
+   *
+   * @input:
+   *   angle1 ::
+   *     First angle.
+   *
+   *   angle2 ::
+   *     Second angle.
+   *
+   * @return:
+   *   Constrained value of `value2-value1'.
+   *
+   */
+  FT_EXPORT( FT_Angle )
+  FT_Angle_Diff( FT_Angle  angle1,
+                 FT_Angle  angle2 );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Vector_Unit
+   *
+   * @description:
+   *   Return the unit vector corresponding to a given angle.  After the
+   *   call, the value of `vec.x' will be `sin(angle)', and the value of
+   *   `vec.y' will be `cos(angle)'.
+   *
+   *   This function is useful to retrieve both the sinus and cosinus of a
+   *   given angle quickly.
+   *
+   * @output:
+   *   vec ::
+   *     The address of target vector.
+   *
+   * @input:
+   *   angle ::
+   *     The address of angle.
+   *
+   */
+  FT_EXPORT( void )
+  FT_Vector_Unit( FT_Vector*  vec,
+                  FT_Angle    angle );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Vector_Rotate
+   *
+   * @description:
+   *   Rotate a vector by a given angle.
+   *
+   * @inout:
+   *   vec ::
+   *     The address of target vector.
+   *
+   * @input:
+   *   angle ::
+   *     The address of angle.
+   *
+   */
+  FT_EXPORT( void )
+  FT_Vector_Rotate( FT_Vector*  vec,
+                    FT_Angle    angle );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Vector_Length
+   *
+   * @description:
+   *   Return the length of a given vector.
+   *
+   * @input:
+   *   vec ::
+   *     The address of target vector.
+   *
+   * @return:
+   *   The vector length, expressed in the same units that the original
+   *   vector coordinates.
+   *
+   */
+  FT_EXPORT( FT_Fixed )
+  FT_Vector_Length( FT_Vector*  vec );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Vector_Polarize
+   *
+   * @description:
+   *   Compute both the length and angle of a given vector.
+   *
+   * @input:
+   *   vec ::
+   *     The address of source vector.
+   *
+   * @output:
+   *   length ::
+   *     The vector length.
+   *
+   *   angle ::
+   *     The vector angle.
+   *
+   */
+  FT_EXPORT( void )
+  FT_Vector_Polarize( FT_Vector*  vec,
+                      FT_Fixed   *length,
+                      FT_Angle   *angle );
+
+
+  /*************************************************************************
+   *
+   * @function:
+   *   FT_Vector_From_Polar
+   *
+   * @description:
+   *   Compute vector coordinates from a length and angle.
+   *
+   * @output:
+   *   vec ::
+   *     The address of source vector.
+   *
+   * @input:
+   *   length ::
+   *     The vector length.
+   *
+   *   angle ::
+   *     The vector angle.
+   *
+   */
+  FT_EXPORT( void )
+  FT_Vector_From_Polar( FT_Vector*  vec,
+                        FT_Fixed    length,
+                        FT_Angle    angle );
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTTRIGON_H__ */
+
+
+/* END */
diff --git a/include/freetype/fttypes.h b/include/freetype/fttypes.h
new file mode 100644 (file)
index 0000000..3255527
--- /dev/null
@@ -0,0 +1,588 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fttypes.h                                                              */
+/*                                                                         */
+/*    FreeType simple types definitions (specification only).              */
+/*                                                                         */
+/*  Copyright 1996-2002, 2004, 2006-2009, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTTYPES_H__
+#define __FTTYPES_H__
+
+
+#include <ft2build.h>
+#include FT_CONFIG_CONFIG_H
+#include FT_SYSTEM_H
+#include FT_IMAGE_H
+
+#include <stddef.h>
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    basic_types                                                        */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Basic Data Types                                                   */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    The basic data types defined by the library.                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the basic data types defined by FreeType~2,  */
+  /*    ranging from simple scalar types to bitmap descriptors.  More      */
+  /*    font-specific structures are defined in a different section.       */
+  /*                                                                       */
+  /* <Order>                                                               */
+  /*    FT_Byte                                                            */
+  /*    FT_Bytes                                                           */
+  /*    FT_Char                                                            */
+  /*    FT_Int                                                             */
+  /*    FT_UInt                                                            */
+  /*    FT_Int16                                                           */
+  /*    FT_UInt16                                                          */
+  /*    FT_Int32                                                           */
+  /*    FT_UInt32                                                          */
+  /*    FT_Short                                                           */
+  /*    FT_UShort                                                          */
+  /*    FT_Long                                                            */
+  /*    FT_ULong                                                           */
+  /*    FT_Bool                                                            */
+  /*    FT_Offset                                                          */
+  /*    FT_PtrDist                                                         */
+  /*    FT_String                                                          */
+  /*    FT_Tag                                                             */
+  /*    FT_Error                                                           */
+  /*    FT_Fixed                                                           */
+  /*    FT_Pointer                                                         */
+  /*    FT_Pos                                                             */
+  /*    FT_Vector                                                          */
+  /*    FT_BBox                                                            */
+  /*    FT_Matrix                                                          */
+  /*    FT_FWord                                                           */
+  /*    FT_UFWord                                                          */
+  /*    FT_F2Dot14                                                         */
+  /*    FT_UnitVector                                                      */
+  /*    FT_F26Dot6                                                         */
+  /*                                                                       */
+  /*                                                                       */
+  /*    FT_Generic                                                         */
+  /*    FT_Generic_Finalizer                                               */
+  /*                                                                       */
+  /*    FT_Bitmap                                                          */
+  /*    FT_Pixel_Mode                                                      */
+  /*    FT_Palette_Mode                                                    */
+  /*    FT_Glyph_Format                                                    */
+  /*    FT_IMAGE_TAG                                                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Bool                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef of unsigned char, used for simple booleans.  As usual,   */
+  /*    values 1 and~0 represent true and false, respectively.             */
+  /*                                                                       */
+  typedef unsigned char  FT_Bool;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_FWord                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A signed 16-bit integer used to store a distance in original font  */
+  /*    units.                                                             */
+  /*                                                                       */
+  typedef signed short  FT_FWord;   /* distance in FUnits */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_UFWord                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An unsigned 16-bit integer used to store a distance in original    */
+  /*    font units.                                                        */
+  /*                                                                       */
+  typedef unsigned short  FT_UFWord;  /* unsigned distance */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Char                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple typedef for the _signed_ char type.                       */
+  /*                                                                       */
+  typedef signed char  FT_Char;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Byte                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple typedef for the _unsigned_ char type.                     */
+  /*                                                                       */
+  typedef unsigned char  FT_Byte;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Bytes                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for constant memory areas.                               */
+  /*                                                                       */
+  typedef const FT_Byte*  FT_Bytes;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Tag                                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for 32-bit tags (as used in the SFNT format).            */
+  /*                                                                       */
+  typedef FT_UInt32  FT_Tag;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_String                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple typedef for the char type, usually used for strings.      */
+  /*                                                                       */
+  typedef char  FT_String;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Short                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for signed short.                                        */
+  /*                                                                       */
+  typedef signed short  FT_Short;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_UShort                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for unsigned short.                                      */
+  /*                                                                       */
+  typedef unsigned short  FT_UShort;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Int                                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for the int type.                                        */
+  /*                                                                       */
+  typedef signed int  FT_Int;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_UInt                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for the unsigned int type.                               */
+  /*                                                                       */
+  typedef unsigned int  FT_UInt;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Long                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for signed long.                                         */
+  /*                                                                       */
+  typedef signed long  FT_Long;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_ULong                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A typedef for unsigned long.                                       */
+  /*                                                                       */
+  typedef unsigned long  FT_ULong;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_F2Dot14                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A signed 2.14 fixed float type used for unit vectors.              */
+  /*                                                                       */
+  typedef signed short  FT_F2Dot14;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_F26Dot6                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A signed 26.6 fixed float type used for vectorial pixel            */
+  /*    coordinates.                                                       */
+  /*                                                                       */
+  typedef signed long  FT_F26Dot6;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Fixed                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This type is used to store 16.16 fixed float values, like scaling  */
+  /*    values or matrix coefficients.                                     */
+  /*                                                                       */
+  typedef signed long  FT_Fixed;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Error                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The FreeType error code type.  A value of~0 is always interpreted  */
+  /*    as a successful operation.                                         */
+  /*                                                                       */
+  typedef int  FT_Error;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Pointer                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple typedef for a typeless pointer.                           */
+  /*                                                                       */
+  typedef void*  FT_Pointer;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_Offset                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This is equivalent to the ANSI~C `size_t' type, i.e., the largest  */
+  /*    _unsigned_ integer type used to express a file size or position,   */
+  /*    or a memory block size.                                            */
+  /*                                                                       */
+  typedef size_t  FT_Offset;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_PtrDist                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This is equivalent to the ANSI~C `ptrdiff_t' type, i.e., the       */
+  /*    largest _signed_ integer type used to express the distance         */
+  /*    between two pointers.                                              */
+  /*                                                                       */
+  typedef ft_ptrdiff_t  FT_PtrDist;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_UnitVector                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to store a 2D vector unit vector.  Uses    */
+  /*    FT_F2Dot14 types.                                                  */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    x :: Horizontal coordinate.                                        */
+  /*                                                                       */
+  /*    y :: Vertical coordinate.                                          */
+  /*                                                                       */
+  typedef struct  FT_UnitVector_
+  {
+    FT_F2Dot14  x;
+    FT_F2Dot14  y;
+
+  } FT_UnitVector;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Matrix                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure used to store a 2x2 matrix.  Coefficients are   */
+  /*    in 16.16 fixed float format.  The computation performed is:        */
+  /*                                                                       */
+  /*       {                                                               */
+  /*          x' = x*xx + y*xy                                             */
+  /*          y' = x*yx + y*yy                                             */
+  /*       }                                                               */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    xx :: Matrix coefficient.                                          */
+  /*                                                                       */
+  /*    xy :: Matrix coefficient.                                          */
+  /*                                                                       */
+  /*    yx :: Matrix coefficient.                                          */
+  /*                                                                       */
+  /*    yy :: Matrix coefficient.                                          */
+  /*                                                                       */
+  typedef struct  FT_Matrix_
+  {
+    FT_Fixed  xx, xy;
+    FT_Fixed  yx, yy;
+
+  } FT_Matrix;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Data                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Read-only binary data represented as a pointer and a length.       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    pointer :: The data.                                               */
+  /*                                                                       */
+  /*    length  :: The length of the data in bytes.                        */
+  /*                                                                       */
+  typedef struct  FT_Data_
+  {
+    const FT_Byte*  pointer;
+    FT_Int          length;
+
+  } FT_Data;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Generic_Finalizer                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Describe a function used to destroy the `client' data of any       */
+  /*    FreeType object.  See the description of the @FT_Generic type for  */
+  /*    details of usage.                                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    The address of the FreeType object which is under finalization.    */
+  /*    Its client data is accessed through its `generic' field.           */
+  /*                                                                       */
+  typedef void  (*FT_Generic_Finalizer)(void*  object);
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Generic                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Client applications often need to associate their own data to a    */
+  /*    variety of FreeType core objects.  For example, a text layout API  */
+  /*    might want to associate a glyph cache to a given size object.      */
+  /*                                                                       */
+  /*    Some FreeType object contains a `generic' field, of type           */
+  /*    FT_Generic, which usage is left to client applications and font    */
+  /*    servers.                                                           */
+  /*                                                                       */
+  /*    It can be used to store a pointer to client-specific data, as well */
+  /*    as the address of a `finalizer' function, which will be called by  */
+  /*    FreeType when the object is destroyed (for example, the previous   */
+  /*    client example would put the address of the glyph cache destructor */
+  /*    in the `finalizer' field).                                         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    data      :: A typeless pointer to any client-specified data. This */
+  /*                 field is completely ignored by the FreeType library.  */
+  /*                                                                       */
+  /*    finalizer :: A pointer to a `generic finalizer' function, which    */
+  /*                 will be called when the object is destroyed.  If this */
+  /*                 field is set to NULL, no code will be called.         */
+  /*                                                                       */
+  typedef struct  FT_Generic_
+  {
+    void*                 data;
+    FT_Generic_Finalizer  finalizer;
+
+  } FT_Generic;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_MAKE_TAG                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This macro converts four-letter tags which are used to label       */
+  /*    TrueType tables into an unsigned long to be used within FreeType.  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The produced values *must* be 32-bit integers.  Don't redefine     */
+  /*    this macro.                                                        */
+  /*                                                                       */
+#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
+          (FT_Tag)                        \
+          ( ( (FT_ULong)_x1 << 24 ) |     \
+            ( (FT_ULong)_x2 << 16 ) |     \
+            ( (FT_ULong)_x3 <<  8 ) |     \
+              (FT_ULong)_x4         )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*                                                                       */
+  /*                    L I S T   M A N A G E M E N T                      */
+  /*                                                                       */
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    list_processing                                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_ListNode                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*     Many elements and objects in FreeType are listed through an       */
+  /*     @FT_List record (see @FT_ListRec).  As its name suggests, an      */
+  /*     FT_ListNode is a handle to a single list element.                 */
+  /*                                                                       */
+  typedef struct FT_ListNodeRec_*  FT_ListNode;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    FT_List                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a list record (see @FT_ListRec).                       */
+  /*                                                                       */
+  typedef struct FT_ListRec_*  FT_List;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_ListNodeRec                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to hold a single list element.                    */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    prev :: The previous element in the list.  NULL if first.          */
+  /*                                                                       */
+  /*    next :: The next element in the list.  NULL if last.               */
+  /*                                                                       */
+  /*    data :: A typeless pointer to the listed object.                   */
+  /*                                                                       */
+  typedef struct  FT_ListNodeRec_
+  {
+    FT_ListNode  prev;
+    FT_ListNode  next;
+    void*        data;
+
+  } FT_ListNodeRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_ListRec                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to hold a simple doubly-linked list.  These are   */
+  /*    used in many parts of FreeType.                                    */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    head :: The head (first element) of doubly-linked list.            */
+  /*                                                                       */
+  /*    tail :: The tail (last element) of doubly-linked list.             */
+  /*                                                                       */
+  typedef struct  FT_ListRec_
+  {
+    FT_ListNode  head;
+    FT_ListNode  tail;
+
+  } FT_ListRec;
+
+
+  /* */
+
+#define FT_IS_EMPTY( list )  ( (list).head == 0 )
+
+  /* return base error code (without module-specific prefix) */
+#define FT_ERROR_BASE( x )    ( (x) & 0xFF )
+
+  /* return module error code */
+#define FT_ERROR_MODULE( x )  ( (x) & 0xFF00U )
+
+#define FT_BOOL( x )  ( (FT_Bool)( x ) )
+
+FT_END_HEADER
+
+#endif /* __FTTYPES_H__ */
+
+
+/* END */
diff --git a/include/freetype/ftwinfnt.h b/include/freetype/ftwinfnt.h
new file mode 100644 (file)
index 0000000..ea33353
--- /dev/null
@@ -0,0 +1,274 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftwinfnt.h                                                             */
+/*                                                                         */
+/*    FreeType API for accessing Windows fnt-specific data.                */
+/*                                                                         */
+/*  Copyright 2003, 2004, 2008 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTWINFNT_H__
+#define __FTWINFNT_H__
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    winfnt_fonts                                                       */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Window FNT Files                                                   */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Windows FNT specific API.                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the declaration of Windows FNT specific      */
+  /*    functions.                                                         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************
+   *
+   * @enum:
+   *   FT_WinFNT_ID_XXX
+   *
+   * @description:
+   *   A list of valid values for the `charset' byte in
+   *   @FT_WinFNT_HeaderRec.  Exact mapping tables for the various cpXXXX
+   *   encodings (except for cp1361) can be found at ftp://ftp.unicode.org
+   *   in the MAPPINGS/VENDORS/MICSFT/WINDOWS subdirectory.  cp1361 is
+   *   roughly a superset of MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT.
+   *
+   * @values:
+   *   FT_WinFNT_ID_DEFAULT ::
+   *     This is used for font enumeration and font creation as a
+   *     `don't care' value.  Valid font files don't contain this value.
+   *     When querying for information about the character set of the font
+   *     that is currently selected into a specified device context, this
+   *     return value (of the related Windows API) simply denotes failure.
+   *
+   *   FT_WinFNT_ID_SYMBOL ::
+   *     There is no known mapping table available.
+   *
+   *   FT_WinFNT_ID_MAC ::
+   *     Mac Roman encoding.
+   *
+   *   FT_WinFNT_ID_OEM ::
+   *     From Michael Pöttgen <michael@poettgen.de>:
+   *
+   *       The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM
+   *       is used for the charset of vector fonts, like `modern.fon',
+   *       `roman.fon', and `script.fon' on Windows.
+   *
+   *       The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value
+   *       specifies a character set that is operating-system dependent.
+   *
+   *       The `IFIMETRICS' documentation from the `Windows Driver
+   *       Development Kit' says: This font supports an OEM-specific
+   *       character set.  The OEM character set is system dependent.
+   *
+   *       In general OEM, as opposed to ANSI (i.e., cp1252), denotes the
+   *       second default codepage that most international versions of
+   *       Windows have.  It is one of the OEM codepages from
+   *
+   *         http://www.microsoft.com/globaldev/reference/cphome.mspx,
+   *
+   *       and is used for the `DOS boxes', to support legacy applications.
+   *       A German Windows version for example usually uses ANSI codepage
+   *       1252 and OEM codepage 850.
+   *
+   *   FT_WinFNT_ID_CP874 ::
+   *     A superset of Thai TIS 620 and ISO 8859-11.
+   *
+   *   FT_WinFNT_ID_CP932 ::
+   *     A superset of Japanese Shift-JIS (with minor deviations).
+   *
+   *   FT_WinFNT_ID_CP936 ::
+   *     A superset of simplified Chinese GB 2312-1980 (with different
+   *     ordering and minor deviations).
+   *
+   *   FT_WinFNT_ID_CP949 ::
+   *     A superset of Korean Hangul KS~C 5601-1987 (with different
+   *     ordering and minor deviations).
+   *
+   *   FT_WinFNT_ID_CP950 ::
+   *     A superset of traditional Chinese Big~5 ETen (with different
+   *     ordering and minor deviations).
+   *
+   *   FT_WinFNT_ID_CP1250 ::
+   *     A superset of East European ISO 8859-2 (with slightly different
+   *     ordering).
+   *
+   *   FT_WinFNT_ID_CP1251 ::
+   *     A superset of Russian ISO 8859-5 (with different ordering).
+   *
+   *   FT_WinFNT_ID_CP1252 ::
+   *     ANSI encoding.  A superset of ISO 8859-1.
+   *
+   *   FT_WinFNT_ID_CP1253 ::
+   *     A superset of Greek ISO 8859-7 (with minor modifications).
+   *
+   *   FT_WinFNT_ID_CP1254 ::
+   *     A superset of Turkish ISO 8859-9.
+   *
+   *   FT_WinFNT_ID_CP1255 ::
+   *     A superset of Hebrew ISO 8859-8 (with some modifications).
+   *
+   *   FT_WinFNT_ID_CP1256 ::
+   *     A superset of Arabic ISO 8859-6 (with different ordering).
+   *
+   *   FT_WinFNT_ID_CP1257 ::
+   *     A superset of Baltic ISO 8859-13 (with some deviations).
+   *
+   *   FT_WinFNT_ID_CP1258 ::
+   *     For Vietnamese.  This encoding doesn't cover all necessary
+   *     characters.
+   *
+   *   FT_WinFNT_ID_CP1361 ::
+   *     Korean (Johab).
+   */
+
+#define FT_WinFNT_ID_CP1252    0
+#define FT_WinFNT_ID_DEFAULT   1
+#define FT_WinFNT_ID_SYMBOL    2
+#define FT_WinFNT_ID_MAC      77
+#define FT_WinFNT_ID_CP932   128
+#define FT_WinFNT_ID_CP949   129
+#define FT_WinFNT_ID_CP1361  130
+#define FT_WinFNT_ID_CP936   134
+#define FT_WinFNT_ID_CP950   136
+#define FT_WinFNT_ID_CP1253  161
+#define FT_WinFNT_ID_CP1254  162
+#define FT_WinFNT_ID_CP1258  163
+#define FT_WinFNT_ID_CP1255  177
+#define FT_WinFNT_ID_CP1256  178
+#define FT_WinFNT_ID_CP1257  186
+#define FT_WinFNT_ID_CP1251  204
+#define FT_WinFNT_ID_CP874   222
+#define FT_WinFNT_ID_CP1250  238
+#define FT_WinFNT_ID_OEM     255
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_WinFNT_HeaderRec                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Windows FNT Header info.                                           */
+  /*                                                                       */
+  typedef struct  FT_WinFNT_HeaderRec_
+  {
+    FT_UShort  version;
+    FT_ULong   file_size;
+    FT_Byte    copyright[60];
+    FT_UShort  file_type;
+    FT_UShort  nominal_point_size;
+    FT_UShort  vertical_resolution;
+    FT_UShort  horizontal_resolution;
+    FT_UShort  ascent;
+    FT_UShort  internal_leading;
+    FT_UShort  external_leading;
+    FT_Byte    italic;
+    FT_Byte    underline;
+    FT_Byte    strike_out;
+    FT_UShort  weight;
+    FT_Byte    charset;
+    FT_UShort  pixel_width;
+    FT_UShort  pixel_height;
+    FT_Byte    pitch_and_family;
+    FT_UShort  avg_width;
+    FT_UShort  max_width;
+    FT_Byte    first_char;
+    FT_Byte    last_char;
+    FT_Byte    default_char;
+    FT_Byte    break_char;
+    FT_UShort  bytes_per_row;
+    FT_ULong   device_offset;
+    FT_ULong   face_name_offset;
+    FT_ULong   bits_pointer;
+    FT_ULong   bits_offset;
+    FT_Byte    reserved;
+    FT_ULong   flags;
+    FT_UShort  A_space;
+    FT_UShort  B_space;
+    FT_UShort  C_space;
+    FT_UShort  color_table_offset;
+    FT_ULong   reserved1[4];
+
+  } FT_WinFNT_HeaderRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_WinFNT_Header                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an @FT_WinFNT_HeaderRec structure.                     */
+  /*                                                                       */
+  typedef struct FT_WinFNT_HeaderRec_*  FT_WinFNT_Header;
+
+
+  /**********************************************************************
+   *
+   * @function:
+   *    FT_Get_WinFNT_Header
+   *
+   * @description:
+   *    Retrieve a Windows FNT font info header.
+   *
+   * @input:
+   *    face    :: A handle to the input face.
+   *
+   * @output:
+   *    aheader :: The WinFNT header.
+   *
+   * @return:
+   *   FreeType error code.  0~means success.
+   *
+   * @note:
+   *   This function only works with Windows FNT faces, returning an error
+   *   otherwise.
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_WinFNT_Header( FT_Face               face,
+                        FT_WinFNT_HeaderRec  *aheader );
+
+
+  /* */
+
+FT_END_HEADER
+
+#endif /* __FTWINFNT_H__ */
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/include/freetype/ftxf86.h b/include/freetype/ftxf86.h
new file mode 100644 (file)
index 0000000..8c68afd
--- /dev/null
@@ -0,0 +1,83 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftxf86.h                                                               */
+/*                                                                         */
+/*    Support functions for X11.                                           */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004, 2006, 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTXF86_H__
+#define __FTXF86_H__
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*   font_formats                                                        */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*   Font Formats                                                        */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*   Getting the font format.                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   The single function in this section can be used to get the font     */
+  /*   format.  Note that this information is not needed normally;         */
+  /*   however, there are special cases (like in PDF devices) where it is  */
+  /*   important to differentiate, in spite of FreeType's uniform API.     */
+  /*                                                                       */
+  /*   This function is in the X11/xf86 namespace for historical reasons   */
+  /*   and in no way depends on that windowing system.                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*   FT_Get_X11_Font_Format                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   Return a string describing the format of a given face, using values */
+  /*   which can be used as an X11 FONT_PROPERTY.  Possible values are     */
+  /*   `TrueType', `Type~1', `BDF', `PCF', `Type~42', `CID~Type~1', `CFF', */
+  /*   `PFR', and `Windows~FNT'.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*   face ::                                                             */
+  /*     Input face handle.                                                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*   Font format string.  NULL in case of error.                         */
+  /*                                                                       */
+  FT_EXPORT( const char* )
+  FT_Get_X11_Font_Format( FT_Face  face );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTXF86_H__ */
diff --git a/include/freetype/internal/autohint.h b/include/freetype/internal/autohint.h
new file mode 100644 (file)
index 0000000..231bdd4
--- /dev/null
@@ -0,0 +1,231 @@
+/***************************************************************************/
+/*                                                                         */
+/*  autohint.h                                                             */
+/*                                                                         */
+/*    High-level `autohint' module-specific interface (specification).     */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The auto-hinter is used to load and automatically hint glyphs if a    */
+  /* format-specific hinter isn't available.                               */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __AUTOHINT_H__
+#define __AUTOHINT_H__
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* A small technical note regarding automatic hinting in order to        */
+  /* clarify this module interface.                                        */
+  /*                                                                       */
+  /* An automatic hinter might compute two kinds of data for a given face: */
+  /*                                                                       */
+  /* - global hints: Usually some metrics that describe global properties  */
+  /*                 of the face.  It is computed by scanning more or less */
+  /*                 aggressively the glyphs in the face, and thus can be  */
+  /*                 very slow to compute (even if the size of global      */
+  /*                 hints is really small).                               */
+  /*                                                                       */
+  /* - glyph hints:  These describe some important features of the glyph   */
+  /*                 outline, as well as how to align them.  They are      */
+  /*                 generally much faster to compute than global hints.   */
+  /*                                                                       */
+  /* The current FreeType auto-hinter does a pretty good job while         */
+  /* performing fast computations for both global and glyph hints.         */
+  /* However, we might be interested in introducing more complex and       */
+  /* powerful algorithms in the future, like the one described in the John */
+  /* D. Hobby paper, which unfortunately requires a lot more horsepower.   */
+  /*                                                                       */
+  /* Because a sufficiently sophisticated font management system would     */
+  /* typically implement an LRU cache of opened face objects to reduce     */
+  /* memory usage, it is a good idea to be able to avoid recomputing       */
+  /* global hints every time the same face is re-opened.                   */
+  /*                                                                       */
+  /* We thus provide the ability to cache global hints outside of the face */
+  /* object, in order to speed up font re-opening time.  Of course, this   */
+  /* feature is purely optional, so most client programs won't even notice */
+  /* it.                                                                   */
+  /*                                                                       */
+  /* I initially thought that it would be a good idea to cache the glyph   */
+  /* hints too.  However, my general idea now is that if you really need   */
+  /* to cache these too, you are simply in need of a new font format,      */
+  /* where all this information could be stored within the font file and   */
+  /* decoded on the fly.                                                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+
+FT_BEGIN_HEADER
+
+
+  typedef struct FT_AutoHinterRec_  *FT_AutoHinter;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_AutoHinter_GlobalGetFunc                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Retrieves the global hints computed for a given face object the    */
+  /*    resulting data is dissociated from the face and will survive a     */
+  /*    call to FT_Done_Face().  It must be discarded through the API      */
+  /*    FT_AutoHinter_GlobalDoneFunc().                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    hinter        :: A handle to the source auto-hinter.               */
+  /*                                                                       */
+  /*    face          :: A handle to the source face object.               */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    global_hints  :: A typeless pointer to the global hints.           */
+  /*                                                                       */
+  /*    global_len    :: The size in bytes of the global hints.            */
+  /*                                                                       */
+  typedef void
+  (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter  hinter,
+                                  FT_Face        face,
+                                  void**         global_hints,
+                                  long*          global_len );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_AutoHinter_GlobalDoneFunc                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Discards the global hints retrieved through                        */
+  /*    FT_AutoHinter_GlobalGetFunc().  This is the only way these hints   */
+  /*    are freed from memory.                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    hinter :: A handle to the auto-hinter module.                      */
+  /*                                                                       */
+  /*    global :: A pointer to retrieved global hints to discard.          */
+  /*                                                                       */
+  typedef void
+  (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter  hinter,
+                                   void*          global );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_AutoHinter_GlobalResetFunc                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used to recompute the global metrics in a given   */
+  /*    font.  This is useful when global font data changes (e.g. Multiple */
+  /*    Masters fonts where blend coordinates change).                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    hinter :: A handle to the source auto-hinter.                      */
+  /*                                                                       */
+  /*    face   :: A handle to the face.                                    */
+  /*                                                                       */
+  typedef void
+  (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter  hinter,
+                                    FT_Face        face );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_AutoHinter_GlyphLoadFunc                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used to load, scale, and automatically hint a     */
+  /*    glyph from a given face.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face        :: A handle to the face.                               */
+  /*                                                                       */
+  /*    glyph_index :: The glyph index.                                    */
+  /*                                                                       */
+  /*    load_flags  :: The load flags.                                     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function is capable of loading composite glyphs by hinting    */
+  /*    each sub-glyph independently (which improves quality).             */
+  /*                                                                       */
+  /*    It will call the font driver with FT_Load_Glyph(), with            */
+  /*    FT_LOAD_NO_SCALE set.                                              */
+  /*                                                                       */
+  typedef FT_Error
+  (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter  hinter,
+                                  FT_GlyphSlot   slot,
+                                  FT_Size        size,
+                                  FT_UInt        glyph_index,
+                                  FT_Int32       load_flags );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_AutoHinter_ServiceRec                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The auto-hinter module's interface.                                */
+  /*                                                                       */
+  typedef struct  FT_AutoHinter_ServiceRec_
+  {
+    FT_AutoHinter_GlobalResetFunc  reset_face;
+    FT_AutoHinter_GlobalGetFunc    get_global_hints;
+    FT_AutoHinter_GlobalDoneFunc   done_global_hints;
+    FT_AutoHinter_GlyphLoadFunc    load_glyph;
+
+  } FT_AutoHinter_ServiceRec, *FT_AutoHinter_Service;
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_AUTOHINTER_SERVICE(class_, reset_face_, get_global_hints_, \
+                                     done_global_hints_, load_glyph_)        \
+  FT_CALLBACK_TABLE_DEF                                                      \
+  const FT_AutoHinter_ServiceRec class_ =                                    \
+  {                                                                          \
+    reset_face_, get_global_hints_, done_global_hints_, load_glyph_          \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_AUTOHINTER_SERVICE(class_, reset_face_, get_global_hints_, \
+                                     done_global_hints_, load_glyph_)        \
+  void                                                                       \
+  FT_Init_Class_##class_( FT_Library library,                                \
+                          FT_AutoHinter_ServiceRec* clazz)                   \
+  {                                                                          \
+    FT_UNUSED(library);                                                      \
+    clazz->reset_face = reset_face_;                                         \
+    clazz->get_global_hints = get_global_hints_;                             \
+    clazz->done_global_hints = done_global_hints_;                           \
+    clazz->load_glyph = load_glyph_;                                         \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __AUTOHINT_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/ftcalc.h b/include/freetype/internal/ftcalc.h
new file mode 100644 (file)
index 0000000..f8b4324
--- /dev/null
@@ -0,0 +1,179 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcalc.h                                                               */
+/*                                                                         */
+/*    Arithmetic computations (specification).                             */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTCALC_H__
+#define __FTCALC_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_FixedSqrt                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Computes the square root of a 16.16 fixed point value.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    x :: The value to compute the root for.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `sqrt(x)'.                                           */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function is not very fast.                                    */
+  /*                                                                       */
+  FT_BASE( FT_Int32 )
+  FT_SqrtFixed( FT_Int32  x );
+
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Sqrt32                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Computes the square root of an Int32 integer (which will be        */
+  /*    handled as an unsigned long value).                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    x :: The value to compute the root for.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `sqrt(x)'.                                           */
+  /*                                                                       */
+  FT_EXPORT( FT_Int32 )
+  FT_Sqrt32( FT_Int32  x );
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FT_MulDiv() and FT_MulFix() are declared in freetype.h.               */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_MulDiv_No_Round                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A very simple function used to perform the computation `(a*b)/c'   */
+  /*    (without rounding) with maximal accuracy (it uses a 64-bit         */
+  /*    intermediate integer whenever necessary).                          */
+  /*                                                                       */
+  /*    This function isn't necessarily as fast as some processor specific */
+  /*    operations, but is at least completely portable.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    a :: The first multiplier.                                         */
+  /*    b :: The second multiplier.                                        */
+  /*    c :: The divisor.                                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The result of `(a*b)/c'.  This function never traps when trying to */
+  /*    divide by zero; it simply returns `MaxInt' or `MinInt' depending   */
+  /*    on the signs of `a' and `b'.                                       */
+  /*                                                                       */
+  FT_BASE( FT_Long )
+  FT_MulDiv_No_Round( FT_Long  a,
+                      FT_Long  b,
+                      FT_Long  c );
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+  /*
+   *  A variant of FT_Matrix_Multiply which scales its result afterwards.
+   *  The idea is that both `a' and `b' are scaled by factors of 10 so that
+   *  the values are as precise as possible to get a correct result during
+   *  the 64bit multiplication.  Let `sa' and `sb' be the scaling factors of
+   *  `a' and `b', respectively, then the scaling factor of the result is
+   *  `sa*sb'.
+   */
+  FT_BASE( void )
+  FT_Matrix_Multiply_Scaled( const FT_Matrix*  a,
+                             FT_Matrix        *b,
+                             FT_Long           scaling );
+
+
+  /*
+   *  A variant of FT_Vector_Transform.  See comments for
+   *  FT_Matrix_Multiply_Scaled.
+   */
+
+  FT_BASE( void )
+  FT_Vector_Transform_Scaled( FT_Vector*        vector,
+                              const FT_Matrix*  matrix,
+                              FT_Long           scaling );
+
+
+  /*
+   *  Return -1, 0, or +1, depending on the orientation of a given corner.
+   *  We use the Cartesian coordinate system, with positive vertical values
+   *  going upwards.  The function returns +1 if the corner turns to the
+   *  left, -1 to the right, and 0 for undecidable cases.
+   */
+  FT_BASE( FT_Int )
+  ft_corner_orientation( FT_Pos  in_x,
+                         FT_Pos  in_y,
+                         FT_Pos  out_x,
+                         FT_Pos  out_y );
+
+  /*
+   *  Return TRUE if a corner is flat or nearly flat.  This is equivalent to
+   *  saying that the angle difference between the `in' and `out' vectors is
+   *  very small.
+   */
+  FT_BASE( FT_Int )
+  ft_corner_is_flat( FT_Pos  in_x,
+                     FT_Pos  in_y,
+                     FT_Pos  out_x,
+                     FT_Pos  out_y );
+
+
+#define INT_TO_F26DOT6( x )    ( (FT_Long)(x) << 6  )
+#define INT_TO_F2DOT14( x )    ( (FT_Long)(x) << 14 )
+#define INT_TO_FIXED( x )      ( (FT_Long)(x) << 16 )
+#define F2DOT14_TO_FIXED( x )  ( (FT_Long)(x) << 2  )
+#define FLOAT_TO_FIXED( x )    ( (FT_Long)( x * 65536.0 ) )
+#define FIXED_TO_INT( x )      ( FT_RoundFix( x ) >> 16 )
+
+#define ROUND_F26DOT6( x )     ( x >= 0 ? (    ( (x) + 32 ) & -64 )     \
+                                        : ( -( ( 32 - (x) ) & -64 ) ) )
+
+
+FT_END_HEADER
+
+#endif /* __FTCALC_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/ftdebug.h b/include/freetype/internal/ftdebug.h
new file mode 100644 (file)
index 0000000..7baae35
--- /dev/null
@@ -0,0 +1,250 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftdebug.h                                                              */
+/*                                                                         */
+/*    Debugging and logging component (specification).                     */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2004, 2006, 2007, 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.                                        */
+/*                                                                         */
+/*                                                                         */
+/*  IMPORTANT: A description of FreeType's debugging support can be        */
+/*             found in `docs/DEBUG.TXT'.  Read it if you need to use or   */
+/*             understand this code.                                       */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTDEBUG_H__
+#define __FTDEBUG_H__
+
+
+#include <ft2build.h>
+#include FT_CONFIG_CONFIG_H
+#include FT_FREETYPE_H
+
+
+FT_BEGIN_HEADER
+
+
+  /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */
+  /* is already defined; this simplifies the following #ifdefs            */
+  /*                                                                      */
+#ifdef FT_DEBUG_LEVEL_TRACE
+#undef  FT_DEBUG_LEVEL_ERROR
+#define FT_DEBUG_LEVEL_ERROR
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define the trace enums as well as the trace levels array when they    */
+  /* are needed.                                                           */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#define FT_TRACE_DEF( x )  trace_ ## x ,
+
+  /* defining the enumeration */
+  typedef enum  FT_Trace_
+  {
+#include FT_INTERNAL_TRACE_H
+    trace_count
+
+  } FT_Trace;
+
+
+  /* defining the array of trace levels, provided by `src/base/ftdebug.c' */
+  extern int  ft_trace_levels[trace_count];
+
+#undef FT_TRACE_DEF
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define the FT_TRACE macro                                             */
+  /*                                                                       */
+  /* IMPORTANT!                                                            */
+  /*                                                                       */
+  /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */
+  /* value before using any TRACE macro.                                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#define FT_TRACE( level, varformat )                      \
+          do                                              \
+          {                                               \
+            if ( ft_trace_levels[FT_COMPONENT] >= level ) \
+              FT_Message varformat;                       \
+          } while ( 0 )
+
+#else /* !FT_DEBUG_LEVEL_TRACE */
+
+#define FT_TRACE( level, varformat )  do { } while ( 0 )      /* nothing */
+
+#endif /* !FT_DEBUG_LEVEL_TRACE */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Trace_Get_Count                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the number of available trace components.                   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The number of trace components.  0 if FreeType 2 is not built with */
+  /*    FT_DEBUG_LEVEL_TRACE definition.                                   */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function may be useful if you want to access elements of      */
+  /*    the internal `ft_trace_levels' array by an index.                  */
+  /*                                                                       */
+  FT_BASE( FT_Int )
+  FT_Trace_Get_Count( void );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Trace_Get_Name                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return the name of a trace component.                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    The index of the trace component.                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The name of the trace component.  This is a statically allocated   */
+  /*    C string, so do not free it after use.  NULL if FreeType 2 is not  */
+  /*    built with FT_DEBUG_LEVEL_TRACE definition.                        */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Use @FT_Trace_Get_Count to get the number of available trace       */
+  /*    components.                                                        */
+  /*                                                                       */
+  /*    This function may be useful if you want to control FreeType 2's    */
+  /*    debug level in your application.                                   */
+  /*                                                                       */
+  FT_BASE( const char * )
+  FT_Trace_Get_Name( FT_Int  idx );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* You need two opening and closing parentheses!                         */
+  /*                                                                       */
+  /* Example: FT_TRACE0(( "Value is %i", foo ))                            */
+  /*                                                                       */
+  /* Output of the FT_TRACEX macros is sent to stderr.                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+#define FT_TRACE0( varformat )  FT_TRACE( 0, varformat )
+#define FT_TRACE1( varformat )  FT_TRACE( 1, varformat )
+#define FT_TRACE2( varformat )  FT_TRACE( 2, varformat )
+#define FT_TRACE3( varformat )  FT_TRACE( 3, varformat )
+#define FT_TRACE4( varformat )  FT_TRACE( 4, varformat )
+#define FT_TRACE5( varformat )  FT_TRACE( 5, varformat )
+#define FT_TRACE6( varformat )  FT_TRACE( 6, varformat )
+#define FT_TRACE7( varformat )  FT_TRACE( 7, varformat )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define the FT_ERROR macro.                                            */
+  /*                                                                       */
+  /* Output of this macro is sent to stderr.                               */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#define FT_ERROR( varformat )  FT_Message  varformat
+
+#else  /* !FT_DEBUG_LEVEL_ERROR */
+
+#define FT_ERROR( varformat )  do { } while ( 0 )      /* nothing */
+
+#endif /* !FT_DEBUG_LEVEL_ERROR */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define the FT_ASSERT macro.                                           */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#define FT_ASSERT( condition )                                      \
+          do                                                        \
+          {                                                         \
+            if ( !( condition ) )                                   \
+              FT_Panic( "assertion failed on line %d of file %s\n", \
+                        __LINE__, __FILE__ );                       \
+          } while ( 0 )
+
+#else /* !FT_DEBUG_LEVEL_ERROR */
+
+#define FT_ASSERT( condition )  do { } while ( 0 )
+
+#endif /* !FT_DEBUG_LEVEL_ERROR */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define `FT_Message' and `FT_Panic' when needed.                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+#include "stdio.h"  /* for vfprintf() */
+
+  /* print a message */
+  FT_BASE( void )
+  FT_Message( const char*  fmt,
+              ... );
+
+  /* print a message and exit */
+  FT_BASE( void )
+  FT_Panic( const char*  fmt,
+            ... );
+
+#endif /* FT_DEBUG_LEVEL_ERROR */
+
+
+  FT_BASE( void )
+  ft_debug_init( void );
+
+
+#if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */
+
+  /* We disable the warning `conditional expression is constant' here */
+  /* in order to compile cleanly with the maximum level of warnings.  */
+#pragma warning( disable : 4127 )
+
+#endif /* _MSC_VER */
+
+
+FT_END_HEADER
+
+#endif /* __FTDEBUG_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/ftdriver.h b/include/freetype/internal/ftdriver.h
new file mode 100644 (file)
index 0000000..6f6b206
--- /dev/null
@@ -0,0 +1,421 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftdriver.h                                                             */
+/*                                                                         */
+/*    FreeType font driver interface (specification).                      */
+/*                                                                         */
+/*  Copyright 1996-2003, 2006, 2008, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTDRIVER_H__
+#define __FTDRIVER_H__
+
+
+#include <ft2build.h>
+#include FT_MODULE_H
+
+
+FT_BEGIN_HEADER
+
+
+  typedef FT_Error
+  (*FT_Face_InitFunc)( FT_Stream      stream,
+                       FT_Face        face,
+                       FT_Int         typeface_index,
+                       FT_Int         num_params,
+                       FT_Parameter*  parameters );
+
+  typedef void
+  (*FT_Face_DoneFunc)( FT_Face  face );
+
+
+  typedef FT_Error
+  (*FT_Size_InitFunc)( FT_Size  size );
+
+  typedef void
+  (*FT_Size_DoneFunc)( FT_Size  size );
+
+
+  typedef FT_Error
+  (*FT_Slot_InitFunc)( FT_GlyphSlot  slot );
+
+  typedef void
+  (*FT_Slot_DoneFunc)( FT_GlyphSlot  slot );
+
+
+  typedef FT_Error
+  (*FT_Size_RequestFunc)( FT_Size          size,
+                          FT_Size_Request  req );
+
+  typedef FT_Error
+  (*FT_Size_SelectFunc)( FT_Size   size,
+                         FT_ULong  size_index );
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  typedef FT_Error
+  (*FT_Size_ResetPointsFunc)( FT_Size     size,
+                              FT_F26Dot6  char_width,
+                              FT_F26Dot6  char_height,
+                              FT_UInt     horz_resolution,
+                              FT_UInt     vert_resolution );
+
+  typedef FT_Error
+  (*FT_Size_ResetPixelsFunc)( FT_Size  size,
+                              FT_UInt  pixel_width,
+                              FT_UInt  pixel_height );
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+  typedef FT_Error
+  (*FT_Slot_LoadFunc)( FT_GlyphSlot  slot,
+                       FT_Size       size,
+                       FT_UInt       glyph_index,
+                       FT_Int32      load_flags );
+
+
+  typedef FT_UInt
+  (*FT_CharMap_CharIndexFunc)( FT_CharMap  charmap,
+                               FT_Long     charcode );
+
+  typedef FT_Long
+  (*FT_CharMap_CharNextFunc)( FT_CharMap  charmap,
+                              FT_Long     charcode );
+
+
+  typedef FT_Error
+  (*FT_Face_GetKerningFunc)( FT_Face     face,
+                             FT_UInt     left_glyph,
+                             FT_UInt     right_glyph,
+                             FT_Vector*  kerning );
+
+
+  typedef FT_Error
+  (*FT_Face_AttachFunc)( FT_Face    face,
+                         FT_Stream  stream );
+
+
+  typedef FT_Error
+  (*FT_Face_GetAdvancesFunc)( FT_Face    face,
+                              FT_UInt    first,
+                              FT_UInt    count,
+                              FT_Int32   flags,
+                              FT_Fixed*  advances );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Driver_ClassRec                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The font driver class.  This structure mostly contains pointers to */
+  /*    driver methods.                                                    */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root             :: The parent module.                             */
+  /*                                                                       */
+  /*    face_object_size :: The size of a face object in bytes.            */
+  /*                                                                       */
+  /*    size_object_size :: The size of a size object in bytes.            */
+  /*                                                                       */
+  /*    slot_object_size :: The size of a glyph object in bytes.           */
+  /*                                                                       */
+  /*    init_face        :: The format-specific face constructor.          */
+  /*                                                                       */
+  /*    done_face        :: The format-specific face destructor.           */
+  /*                                                                       */
+  /*    init_size        :: The format-specific size constructor.          */
+  /*                                                                       */
+  /*    done_size        :: The format-specific size destructor.           */
+  /*                                                                       */
+  /*    init_slot        :: The format-specific slot constructor.          */
+  /*                                                                       */
+  /*    done_slot        :: The format-specific slot destructor.           */
+  /*                                                                       */
+  /*                                                                       */
+  /*    load_glyph       :: A function handle to load a glyph to a slot.   */
+  /*                        This field is mandatory!                       */
+  /*                                                                       */
+  /*    get_kerning      :: A function handle to return the unscaled       */
+  /*                        kerning for a given pair of glyphs.  Can be    */
+  /*                        set to 0 if the format doesn't support         */
+  /*                        kerning.                                       */
+  /*                                                                       */
+  /*    attach_file      :: This function handle is used to read           */
+  /*                        additional data for a face from another        */
+  /*                        file/stream.  For example, this can be used to */
+  /*                        add data from AFM or PFM files on a Type 1     */
+  /*                        face, or a CIDMap on a CID-keyed face.         */
+  /*                                                                       */
+  /*    get_advances     :: A function handle used to return advance       */
+  /*                        widths of `count' glyphs (in font units),      */
+  /*                        starting at `first'.  The `vertical' flag must */
+  /*                        be set to get vertical advance heights.  The   */
+  /*                        `advances' buffer is caller-allocated.         */
+  /*                        The idea of this function is to be able to     */
+  /*                        perform device-independent text layout without */
+  /*                        loading a single glyph image.                  */
+  /*                                                                       */
+  /*    request_size     :: A handle to a function used to request the new */
+  /*                        character size.  Can be set to 0 if the        */
+  /*                        scaling done in the base layer suffices.       */
+  /*                                                                       */
+  /*    select_size      :: A handle to a function used to select a new    */
+  /*                        fixed size.  It is used only if                */
+  /*                        @FT_FACE_FLAG_FIXED_SIZES is set.  Can be set  */
+  /*                        to 0 if the scaling done in the base layer     */
+  /*                        suffices.                                      */
+  /* <Note>                                                                */
+  /*    Most function pointers, with the exception of `load_glyph', can be */
+  /*    set to 0 to indicate a default behaviour.                          */
+  /*                                                                       */
+  typedef struct  FT_Driver_ClassRec_
+  {
+    FT_Module_Class           root;
+
+    FT_Long                   face_object_size;
+    FT_Long                   size_object_size;
+    FT_Long                   slot_object_size;
+
+    FT_Face_InitFunc          init_face;
+    FT_Face_DoneFunc          done_face;
+
+    FT_Size_InitFunc          init_size;
+    FT_Size_DoneFunc          done_size;
+
+    FT_Slot_InitFunc          init_slot;
+    FT_Slot_DoneFunc          done_slot;
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+    FT_Size_ResetPointsFunc   set_char_sizes;
+    FT_Size_ResetPixelsFunc   set_pixel_sizes;
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+    FT_Slot_LoadFunc          load_glyph;
+
+    FT_Face_GetKerningFunc    get_kerning;
+    FT_Face_AttachFunc        attach_file;
+    FT_Face_GetAdvancesFunc   get_advances;
+
+    /* since version 2.2 */
+    FT_Size_RequestFunc       request_size;
+    FT_Size_SelectFunc        select_size;
+
+  } FT_Driver_ClassRec, *FT_Driver_Class;
+
+
+  /*
+   *  The following functions are used as stubs for `set_char_sizes' and
+   *  `set_pixel_sizes'; the code uses `request_size' and `select_size'
+   *  functions instead.
+   *
+   *  Implementation is in `src/base/ftobjs.c'.
+   */
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  FT_BASE( FT_Error )
+  ft_stub_set_char_sizes( FT_Size     size,
+                          FT_F26Dot6  width,
+                          FT_F26Dot6  height,
+                          FT_UInt     horz_res,
+                          FT_UInt     vert_res );
+
+  FT_BASE( FT_Error )
+  ft_stub_set_pixel_sizes( FT_Size  size,
+                           FT_UInt  width,
+                           FT_UInt  height );
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DECLARE_DRIVER                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to create a forward declaration of a                          */
+  /*    FT_Driver_ClassRec stract instance.                                */
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_DRIVER                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of FT_Driver_ClassRec struct.       */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is defined a Create funtion will need    */
+  /*    to called with a pointer where the allocated stracture is returned.*/
+  /*    And when it is no longer needed a Destroy function needs           */
+  /*    to be called to release that allocation.                           */
+  /*    fcinit.c (ft_create_default_module_classes) already contains       */
+  /*    a mechanism to call these functions for the default modules        */
+  /*    described in ftmodule.h                                            */
+  /*                                                                       */
+  /*    Notice that the created Create and Destroy functions call          */
+  /*    pic_init and pic_free function to allow you to manually allocate   */
+  /*    and initialize any additional global data, like module specific    */
+  /*    interface, and put them in the global pic container defined in     */
+  /*    ftpic.h. if you don't need them just implement the functions as    */
+  /*    empty to resolve the link error.  Also the pic_init and pic_free   */
+  /*    functions should be declared in pic.h, to be referred by driver    */
+  /*    definition calling FT_DEFINE_DRIVER() in following.                */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
+  /*    allocated in the global scope (or the scope where the macro        */
+  /*    is used).                                                          */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+#define FT_DEFINE_DRIVERS_OLD_INTERNALS(a_,b_) \
+  a_, b_,
+#else
+  #define FT_DEFINE_DRIVERS_OLD_INTERNALS(a_,b_)
+#endif
+
+#define FT_DECLARE_DRIVER(class_)    \
+  FT_CALLBACK_TABLE                  \
+  const FT_Driver_ClassRec  class_;
+
+#define FT_DEFINE_DRIVER(class_,                                             \
+                         flags_, size_, name_, version_, requires_,          \
+                         interface_, init_, done_, get_interface_,           \
+                         face_object_size_, size_object_size_,               \
+                         slot_object_size_, init_face_, done_face_,          \
+                         init_size_, done_size_, init_slot_, done_slot_,     \
+                         old_set_char_sizes_, old_set_pixel_sizes_,          \
+                         load_glyph_, get_kerning_, attach_file_,            \
+                         get_advances_, request_size_, select_size_ )        \
+  FT_CALLBACK_TABLE_DEF                                                      \
+  const FT_Driver_ClassRec class_ =                                          \
+  {                                                                          \
+    FT_DEFINE_ROOT_MODULE(flags_,size_,name_,version_,requires_,interface_,  \
+                          init_,done_,get_interface_)                        \
+                                                                             \
+    face_object_size_,                                                       \
+    size_object_size_,                                                       \
+    slot_object_size_,                                                       \
+                                                                             \
+    init_face_,                                                              \
+    done_face_,                                                              \
+                                                                             \
+    init_size_,                                                              \
+    done_size_,                                                              \
+                                                                             \
+    init_slot_,                                                              \
+    done_slot_,                                                              \
+                                                                             \
+    FT_DEFINE_DRIVERS_OLD_INTERNALS(old_set_char_sizes_, old_set_pixel_sizes_) \
+                                                                             \
+    load_glyph_,                                                             \
+                                                                             \
+    get_kerning_,                                                            \
+    attach_file_,                                                            \
+    get_advances_,                                                           \
+                                                                             \
+    request_size_,                                                           \
+    select_size_                                                             \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+#define FT_DEFINE_DRIVERS_OLD_INTERNALS(a_,b_) \
+  clazz->set_char_sizes = a_; \
+  clazz->set_pixel_sizes = b_;
+#else
+  #define FT_DEFINE_DRIVERS_OLD_INTERNALS(a_,b_)
+#endif
+
+#define FT_DECLARE_DRIVER(class_)    FT_DECLARE_MODULE(class_)
+
+#define FT_DEFINE_DRIVER(class_,                                             \
+                         flags_, size_, name_, version_, requires_,          \
+                         interface_, init_, done_, get_interface_,           \
+                         face_object_size_, size_object_size_,               \
+                         slot_object_size_, init_face_, done_face_,          \
+                         init_size_, done_size_, init_slot_, done_slot_,     \
+                         old_set_char_sizes_, old_set_pixel_sizes_,          \
+                         load_glyph_, get_kerning_, attach_file_,            \
+                         get_advances_, request_size_, select_size_ )        \
+                                                                             \
+  void                                                                       \
+  FT_Destroy_Class_##class_( FT_Library        library,                      \
+                             FT_Module_Class*  clazz )                       \
+  {                                                                          \
+    FT_Memory       memory = library->memory;                                \
+    FT_Driver_Class dclazz = (FT_Driver_Class)clazz;                         \
+    class_##_pic_free( library );                                            \
+    if ( dclazz )                                                            \
+      FT_FREE( dclazz );                                                     \
+  }                                                                          \
+                                                                             \
+  FT_Error                                                                   \
+  FT_Create_Class_##class_( FT_Library        library,                       \
+                            FT_Module_Class**  output_class )                \
+  {                                                                          \
+    FT_Driver_Class  clazz;                                                  \
+    FT_Error         error;                                                  \
+    FT_Memory        memory = library->memory;                               \
+                                                                             \
+    if ( FT_ALLOC( clazz, sizeof(*clazz) ) )                                 \
+      return error;                                                          \
+                                                                             \
+    error = class_##_pic_init( library );                                    \
+    if(error)                                                                \
+    {                                                                        \
+      FT_FREE( clazz );                                                      \
+      return error;                                                          \
+    }                                                                        \
+                                                                             \
+    FT_DEFINE_ROOT_MODULE(flags_,size_,name_,version_,requires_,interface_,  \
+                          init_,done_,get_interface_)                        \
+                                                                             \
+    clazz->face_object_size    = face_object_size_;                          \
+    clazz->size_object_size    = size_object_size_;                          \
+    clazz->slot_object_size    = slot_object_size_;                          \
+                                                                             \
+    clazz->init_face           = init_face_;                                 \
+    clazz->done_face           = done_face_;                                 \
+                                                                             \
+    clazz->init_size           = init_size_;                                 \
+    clazz->done_size           = done_size_;                                 \
+                                                                             \
+    clazz->init_slot           = init_slot_;                                 \
+    clazz->done_slot           = done_slot_;                                 \
+                                                                             \
+    FT_DEFINE_DRIVERS_OLD_INTERNALS(old_set_char_sizes_, old_set_pixel_sizes_) \
+                                                                             \
+    clazz->load_glyph          = load_glyph_;                                \
+                                                                             \
+    clazz->get_kerning         = get_kerning_;                               \
+    clazz->attach_file         = attach_file_;                               \
+    clazz->get_advances        = get_advances_;                              \
+                                                                             \
+    clazz->request_size        = request_size_;                              \
+    clazz->select_size         = select_size_;                               \
+                                                                             \
+    *output_class = (FT_Module_Class*)clazz;                                 \
+    return FT_Err_Ok;                                                        \
+  }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __FTDRIVER_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/ftgloadr.h b/include/freetype/internal/ftgloadr.h
new file mode 100644 (file)
index 0000000..ce4dc6c
--- /dev/null
@@ -0,0 +1,168 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgloadr.h                                                             */
+/*                                                                         */
+/*    The FreeType glyph loader (specification).                           */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2005, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTGLOADR_H__
+#define __FTGLOADR_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_GlyphLoader                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The glyph loader is an internal object used to load several glyphs */
+  /*    together (for example, in the case of composites).                 */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The glyph loader implementation is not part of the high-level API, */
+  /*    hence the forward structure declaration.                           */
+  /*                                                                       */
+  typedef struct FT_GlyphLoaderRec_*  FT_GlyphLoader ;
+
+
+#if 0  /* moved to freetype.h in version 2.2 */
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS          1
+#define FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES      2
+#define FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID        4
+#define FT_SUBGLYPH_FLAG_SCALE                   8
+#define FT_SUBGLYPH_FLAG_XY_SCALE             0x40
+#define FT_SUBGLYPH_FLAG_2X2                  0x80
+#define FT_SUBGLYPH_FLAG_USE_MY_METRICS      0x200
+#endif
+
+
+  typedef struct  FT_SubGlyphRec_
+  {
+    FT_Int     index;
+    FT_UShort  flags;
+    FT_Int     arg1;
+    FT_Int     arg2;
+    FT_Matrix  transform;
+
+  } FT_SubGlyphRec;
+
+
+  typedef struct  FT_GlyphLoadRec_
+  {
+    FT_Outline   outline;       /* outline                   */
+    FT_Vector*   extra_points;  /* extra points table        */
+    FT_Vector*   extra_points2; /* second extra points table */
+    FT_UInt      num_subglyphs; /* number of subglyphs       */
+    FT_SubGlyph  subglyphs;     /* subglyphs                 */
+
+  } FT_GlyphLoadRec, *FT_GlyphLoad;
+
+
+  typedef struct  FT_GlyphLoaderRec_
+  {
+    FT_Memory        memory;
+    FT_UInt          max_points;
+    FT_UInt          max_contours;
+    FT_UInt          max_subglyphs;
+    FT_Bool          use_extra;
+
+    FT_GlyphLoadRec  base;
+    FT_GlyphLoadRec  current;
+
+    void*            other;            /* for possible future extension? */
+
+  } FT_GlyphLoaderRec;
+
+
+  /* create new empty glyph loader */
+  FT_BASE( FT_Error )
+  FT_GlyphLoader_New( FT_Memory        memory,
+                      FT_GlyphLoader  *aloader );
+
+  /* add an extra points table to a glyph loader */
+  FT_BASE( FT_Error )
+  FT_GlyphLoader_CreateExtra( FT_GlyphLoader  loader );
+
+  /* destroy a glyph loader */
+  FT_BASE( void )
+  FT_GlyphLoader_Done( FT_GlyphLoader  loader );
+
+  /* reset a glyph loader (frees everything int it) */
+  FT_BASE( void )
+  FT_GlyphLoader_Reset( FT_GlyphLoader  loader );
+
+  /* rewind a glyph loader */
+  FT_BASE( void )
+  FT_GlyphLoader_Rewind( FT_GlyphLoader  loader );
+
+  /* check that there is enough space to add `n_points' and `n_contours' */
+  /* to the glyph loader                                                 */
+  FT_BASE( FT_Error )
+  FT_GlyphLoader_CheckPoints( FT_GlyphLoader  loader,
+                              FT_UInt         n_points,
+                              FT_UInt         n_contours );
+
+
+#define FT_GLYPHLOADER_CHECK_P( _loader, _count )                         \
+   ( (_count) == 0 || ((_loader)->base.outline.n_points    +              \
+                       (_loader)->current.outline.n_points +              \
+                       (unsigned long)(_count)) <= (_loader)->max_points )
+
+#define FT_GLYPHLOADER_CHECK_C( _loader, _count )                          \
+  ( (_count) == 0 || ((_loader)->base.outline.n_contours    +              \
+                      (_loader)->current.outline.n_contours +              \
+                      (unsigned long)(_count)) <= (_loader)->max_contours )
+
+#define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points,_contours )      \
+  ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points )   &&                  \
+      FT_GLYPHLOADER_CHECK_C( _loader, _contours ) )                   \
+    ? 0                                                                \
+    : FT_GlyphLoader_CheckPoints( (_loader), (_points), (_contours) ) )
+
+
+  /* check that there is enough space to add `n_subs' sub-glyphs to */
+  /* a glyph loader                                                 */
+  FT_BASE( FT_Error )
+  FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader  loader,
+                                 FT_UInt         n_subs );
+
+  /* prepare a glyph loader, i.e. empty the current glyph */
+  FT_BASE( void )
+  FT_GlyphLoader_Prepare( FT_GlyphLoader  loader );
+
+  /* add the current glyph to the base glyph */
+  FT_BASE( void )
+  FT_GlyphLoader_Add( FT_GlyphLoader  loader );
+
+  /* copy points from one glyph loader to another */
+  FT_BASE( FT_Error )
+  FT_GlyphLoader_CopyPoints( FT_GlyphLoader  target,
+                             FT_GlyphLoader  source );
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTGLOADR_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/ftmemory.h b/include/freetype/internal/ftmemory.h
new file mode 100644 (file)
index 0000000..026aa63
--- /dev/null
@@ -0,0 +1,380 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmemory.h                                                             */
+/*                                                                         */
+/*    The FreeType memory management macros (specification).               */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTMEMORY_H__
+#define __FTMEMORY_H__
+
+
+#include <ft2build.h>
+#include FT_CONFIG_CONFIG_H
+#include FT_TYPES_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_SET_ERROR                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This macro is used to set an implicit `error' variable to a given  */
+  /*    expression's value (usually a function call), and convert it to a  */
+  /*    boolean which is set whenever the value is != 0.                   */
+  /*                                                                       */
+#undef  FT_SET_ERROR
+#define FT_SET_ERROR( expression ) \
+          ( ( error = (expression) ) != 0 )
+
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                           M E M O R Y                           ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*
+   *  C++ refuses to handle statements like p = (void*)anything, with `p' a
+   *  typed pointer.  Since we don't have a `typeof' operator in standard
+   *  C++, we have to use a template to emulate it.
+   */
+
+#ifdef __cplusplus
+
+  extern "C++"
+  template <typename T> inline T*
+  cplusplus_typeof(        T*,
+                    void  *v )
+  {
+    return static_cast <T*> ( v );
+  }
+
+#define FT_ASSIGNP( p, val )  (p) = cplusplus_typeof( (p), (val) )
+
+#else
+
+#define FT_ASSIGNP( p, val )  (p) = (val)
+
+#endif
+
+
+
+#ifdef FT_DEBUG_MEMORY
+
+  FT_BASE( const char* )  _ft_debug_file;
+  FT_BASE( long )         _ft_debug_lineno;
+
+#define FT_DEBUG_INNER( exp )  ( _ft_debug_file   = __FILE__, \
+                                 _ft_debug_lineno = __LINE__, \
+                                 (exp) )
+
+#define FT_ASSIGNP_INNER( p, exp )  ( _ft_debug_file   = __FILE__, \
+                                      _ft_debug_lineno = __LINE__, \
+                                      FT_ASSIGNP( p, exp ) )
+
+#else /* !FT_DEBUG_MEMORY */
+
+#define FT_DEBUG_INNER( exp )       (exp)
+#define FT_ASSIGNP_INNER( p, exp )  FT_ASSIGNP( p, exp )
+
+#endif /* !FT_DEBUG_MEMORY */
+
+
+  /*
+   *  The allocation functions return a pointer, and the error code
+   *  is written to through the `p_error' parameter.  See below for
+   *  for documentation.
+   */
+
+  FT_BASE( FT_Pointer )
+  ft_mem_alloc( FT_Memory  memory,
+                FT_Long    size,
+                FT_Error  *p_error );
+
+  FT_BASE( FT_Pointer )
+  ft_mem_qalloc( FT_Memory  memory,
+                 FT_Long    size,
+                 FT_Error  *p_error );
+
+  FT_BASE( FT_Pointer )
+  ft_mem_realloc( FT_Memory  memory,
+                  FT_Long    item_size,
+                  FT_Long    cur_count,
+                  FT_Long    new_count,
+                  void*      block,
+                  FT_Error  *p_error );
+
+  FT_BASE( FT_Pointer )
+  ft_mem_qrealloc( FT_Memory  memory,
+                   FT_Long    item_size,
+                   FT_Long    cur_count,
+                   FT_Long    new_count,
+                   void*      block,
+                   FT_Error  *p_error );
+
+  FT_BASE( void )
+  ft_mem_free( FT_Memory    memory,
+               const void*  P );
+
+
+#define FT_MEM_ALLOC( ptr, size )                                         \
+          FT_ASSIGNP_INNER( ptr, ft_mem_alloc( memory, (size), &error ) )
+
+#define FT_MEM_FREE( ptr )                \
+          FT_BEGIN_STMNT                  \
+            ft_mem_free( memory, (ptr) ); \
+            (ptr) = NULL;                 \
+          FT_END_STMNT
+
+#define FT_MEM_NEW( ptr )                        \
+          FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) )
+
+#define FT_MEM_REALLOC( ptr, cursz, newsz )                        \
+          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, 1,        \
+                                                 (cursz), (newsz), \
+                                                 (ptr), &error ) )
+
+#define FT_MEM_QALLOC( ptr, size )                                         \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory, (size), &error ) )
+
+#define FT_MEM_QNEW( ptr )                        \
+          FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) )
+
+#define FT_MEM_QREALLOC( ptr, cursz, newsz )                         \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, 1,        \
+                                                  (cursz), (newsz), \
+                                                  (ptr), &error ) )
+
+#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz )                             \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \
+                                                  (cursz), (newsz),          \
+                                                  (ptr), &error ) )
+
+#define FT_MEM_ALLOC_MULT( ptr, count, item_size )                    \
+          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, (item_size), \
+                                                 0, (count),          \
+                                                 NULL, &error ) )
+
+#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )            \
+          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, (itmsz),    \
+                                                 (oldcnt), (newcnt), \
+                                                 (ptr), &error ) )
+
+#define FT_MEM_QALLOC_MULT( ptr, count, item_size )                    \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, (item_size), \
+                                                  0, (count),          \
+                                                  NULL, &error ) )
+
+#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz)             \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, (itmsz),    \
+                                                  (oldcnt), (newcnt), \
+                                                  (ptr), &error ) )
+
+
+#define FT_MEM_SET_ERROR( cond )  ( (cond), error != 0 )
+
+
+#define FT_MEM_SET( dest, byte, count )     ft_memset( dest, byte, count )
+
+#define FT_MEM_COPY( dest, source, count )  ft_memcpy( dest, source, count )
+
+#define FT_MEM_MOVE( dest, source, count )  ft_memmove( dest, source, count )
+
+
+#define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )
+
+#define FT_ZERO( p )                FT_MEM_ZERO( p, sizeof ( *(p) ) )
+
+
+#define FT_ARRAY_ZERO( dest, count )                        \
+          FT_MEM_ZERO( dest, (count) * sizeof ( *(dest) ) )
+
+#define FT_ARRAY_COPY( dest, source, count )                        \
+          FT_MEM_COPY( dest, source, (count) * sizeof ( *(dest) ) )
+
+#define FT_ARRAY_MOVE( dest, source, count )                        \
+          FT_MEM_MOVE( dest, source, (count) * sizeof ( *(dest) ) )
+
+
+  /*
+   *  Return the maximum number of addressable elements in an array.
+   *  We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid
+   *  any problems.
+   */
+#define FT_ARRAY_MAX( ptr )           ( FT_INT_MAX / sizeof ( *(ptr) ) )
+
+#define FT_ARRAY_CHECK( ptr, count )  ( (count) <= FT_ARRAY_MAX( ptr ) )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The following functions macros expect that their pointer argument is  */
+  /* _typed_ in order to automatically compute array element sizes.        */
+  /*                                                                       */
+
+#define FT_MEM_NEW_ARRAY( ptr, count )                                      \
+          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \
+                                                 0, (count),                \
+                                                 NULL, &error ) )
+
+#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz )                             \
+          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory, sizeof ( *(ptr) ), \
+                                                 (cursz), (newsz),          \
+                                                 (ptr), &error ) )
+
+#define FT_MEM_QNEW_ARRAY( ptr, count )                                      \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \
+                                                  0, (count),                \
+                                                  NULL, &error ) )
+
+#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz )                             \
+          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory, sizeof ( *(ptr) ), \
+                                                  (cursz), (newsz),          \
+                                                  (ptr), &error ) )
+
+
+#define FT_ALLOC( ptr, size )                           \
+          FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) )
+
+#define FT_REALLOC( ptr, cursz, newsz )                           \
+          FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) )
+
+#define FT_ALLOC_MULT( ptr, count, item_size )                           \
+          FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) )
+
+#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )              \
+          FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt,      \
+                                                 newcnt, itmsz ) )
+
+#define FT_QALLOC( ptr, size )                           \
+          FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) )
+
+#define FT_QREALLOC( ptr, cursz, newsz )                           \
+          FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) )
+
+#define FT_QALLOC_MULT( ptr, count, item_size )                           \
+          FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) )
+
+#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz )              \
+          FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt,      \
+                                                  newcnt, itmsz ) )
+
+#define FT_FREE( ptr )  FT_MEM_FREE( ptr )
+
+#define FT_NEW( ptr )  FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) )
+
+#define FT_NEW_ARRAY( ptr, count )                           \
+          FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )
+
+#define FT_RENEW_ARRAY( ptr, curcnt, newcnt )                           \
+          FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )
+
+#define FT_QNEW( ptr )                           \
+          FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) )
+
+#define FT_QNEW_ARRAY( ptr, count )                          \
+          FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )
+
+#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt )                          \
+          FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )
+
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  FT_BASE( FT_Error )
+  FT_Alloc( FT_Memory  memory,
+            FT_Long    size,
+            void*     *P );
+
+  FT_BASE( FT_Error )
+  FT_QAlloc( FT_Memory  memory,
+             FT_Long    size,
+             void*     *p );
+
+  FT_BASE( FT_Error )
+  FT_Realloc( FT_Memory  memory,
+              FT_Long    current,
+              FT_Long    size,
+              void*     *P );
+
+  FT_BASE( FT_Error )
+  FT_QRealloc( FT_Memory  memory,
+               FT_Long    current,
+               FT_Long    size,
+               void*     *p );
+
+  FT_BASE( void )
+  FT_Free( FT_Memory  memory,
+           void*     *P );
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+  FT_BASE( FT_Pointer )
+  ft_mem_strdup( FT_Memory    memory,
+                 const char*  str,
+                 FT_Error    *p_error );
+
+  FT_BASE( FT_Pointer )
+  ft_mem_dup( FT_Memory    memory,
+              const void*  address,
+              FT_ULong     size,
+              FT_Error    *p_error );
+
+#define FT_MEM_STRDUP( dst, str )                                            \
+          (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error )
+
+#define FT_STRDUP( dst, str )                           \
+          FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) )
+
+#define FT_MEM_DUP( dst, address, size )                                    \
+          (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error )
+
+#define FT_DUP( dst, address, size )                           \
+          FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) )
+
+
+  /* Return >= 1 if a truncation occurs.            */
+  /* Return 0 if the source string fits the buffer. */
+  /* This is *not* the same as strlcpy().           */
+  FT_BASE( FT_Int )
+  ft_mem_strcpyn( char*        dst,
+                  const char*  src,
+                  FT_ULong     size );
+
+#define FT_STRCPYN( dst, src, size )                                         \
+          ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) )
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __FTMEMORY_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/ftobjs.h b/include/freetype/internal/ftobjs.h
new file mode 100644 (file)
index 0000000..fc18275
--- /dev/null
@@ -0,0 +1,1413 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftobjs.h                                                               */
+/*                                                                         */
+/*    The FreeType private base classes (specification).                   */
+/*                                                                         */
+/*  Copyright 1996-2006, 2008, 2010, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  This file contains the definition of all internal FreeType classes.  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTOBJS_H__
+#define __FTOBJS_H__
+
+#include <ft2build.h>
+#include FT_RENDER_H
+#include FT_SIZES_H
+#include FT_LCD_FILTER_H
+#include FT_INTERNAL_MEMORY_H
+#include FT_INTERNAL_GLYPH_LOADER_H
+#include FT_INTERNAL_DRIVER_H
+#include FT_INTERNAL_AUTOHINT_H
+#include FT_INTERNAL_SERVICE_H
+#include FT_INTERNAL_PIC_H
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+#include FT_INCREMENTAL_H
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Some generic definitions.                                             */
+  /*                                                                       */
+#ifndef TRUE
+#define TRUE  1
+#endif
+
+#ifndef FALSE
+#define FALSE  0
+#endif
+
+#ifndef NULL
+#define NULL  (void*)0
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The min and max functions missing in C.  As usual, be careful not to  */
+  /* write things like FT_MIN( a++, b++ ) to avoid side effects.           */
+  /*                                                                       */
+#define FT_MIN( a, b )  ( (a) < (b) ? (a) : (b) )
+#define FT_MAX( a, b )  ( (a) > (b) ? (a) : (b) )
+
+#define FT_ABS( a )     ( (a) < 0 ? -(a) : (a) )
+
+
+#define FT_PAD_FLOOR( x, n )  ( (x) & ~((n)-1) )
+#define FT_PAD_ROUND( x, n )  FT_PAD_FLOOR( (x) + ((n)/2), n )
+#define FT_PAD_CEIL( x, n )   FT_PAD_FLOOR( (x) + ((n)-1), n )
+
+#define FT_PIX_FLOOR( x )     ( (x) & ~63 )
+#define FT_PIX_ROUND( x )     FT_PIX_FLOOR( (x) + 32 )
+#define FT_PIX_CEIL( x )      FT_PIX_FLOOR( (x) + 63 )
+
+
+  /*
+   *  Return the highest power of 2 that is <= value; this correspond to
+   *  the highest bit in a given 32-bit value.
+   */
+  FT_BASE( FT_UInt32 )
+  ft_highpow2( FT_UInt32  value );
+
+
+  /*
+   *  character classification functions -- since these are used to parse
+   *  font files, we must not use those in <ctypes.h> which are
+   *  locale-dependent
+   */
+#define  ft_isdigit( x )   ( ( (unsigned)(x) - '0' ) < 10U )
+
+#define  ft_isxdigit( x )  ( ( (unsigned)(x) - '0' ) < 10U || \
+                             ( (unsigned)(x) - 'a' ) < 6U  || \
+                             ( (unsigned)(x) - 'A' ) < 6U  )
+
+  /* the next two macros assume ASCII representation */
+#define  ft_isupper( x )  ( ( (unsigned)(x) - 'A' ) < 26U )
+#define  ft_islower( x )  ( ( (unsigned)(x) - 'a' ) < 26U )
+
+#define  ft_isalpha( x )  ( ft_isupper( x ) || ft_islower( x ) )
+#define  ft_isalnum( x )  ( ft_isdigit( x ) || ft_isalpha( x ) )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                       C H A R M A P S                           ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* handle to internal charmap object */
+  typedef struct FT_CMapRec_*              FT_CMap;
+
+  /* handle to charmap class structure */
+  typedef const struct FT_CMap_ClassRec_*  FT_CMap_Class;
+
+  /* internal charmap object structure */
+  typedef struct  FT_CMapRec_
+  {
+    FT_CharMapRec  charmap;
+    FT_CMap_Class  clazz;
+
+  } FT_CMapRec;
+
+  /* typecase any pointer to a charmap handle */
+#define FT_CMAP( x )              ((FT_CMap)( x ))
+
+  /* obvious macros */
+#define FT_CMAP_PLATFORM_ID( x )  FT_CMAP( x )->charmap.platform_id
+#define FT_CMAP_ENCODING_ID( x )  FT_CMAP( x )->charmap.encoding_id
+#define FT_CMAP_ENCODING( x )     FT_CMAP( x )->charmap.encoding
+#define FT_CMAP_FACE( x )         FT_CMAP( x )->charmap.face
+
+
+  /* class method definitions */
+  typedef FT_Error
+  (*FT_CMap_InitFunc)( FT_CMap     cmap,
+                       FT_Pointer  init_data );
+
+  typedef void
+  (*FT_CMap_DoneFunc)( FT_CMap  cmap );
+
+  typedef FT_UInt
+  (*FT_CMap_CharIndexFunc)( FT_CMap    cmap,
+                            FT_UInt32  char_code );
+
+  typedef FT_UInt
+  (*FT_CMap_CharNextFunc)( FT_CMap     cmap,
+                           FT_UInt32  *achar_code );
+
+  typedef FT_UInt
+  (*FT_CMap_CharVarIndexFunc)( FT_CMap    cmap,
+                               FT_CMap    unicode_cmap,
+                               FT_UInt32  char_code,
+                               FT_UInt32  variant_selector );
+
+  typedef FT_Bool
+  (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap    cmap,
+                                   FT_UInt32  char_code,
+                                   FT_UInt32  variant_selector );
+
+  typedef FT_UInt32 *
+  (*FT_CMap_VariantListFunc)( FT_CMap    cmap,
+                              FT_Memory  mem );
+
+  typedef FT_UInt32 *
+  (*FT_CMap_CharVariantListFunc)( FT_CMap    cmap,
+                                  FT_Memory  mem,
+                                  FT_UInt32  char_code );
+
+  typedef FT_UInt32 *
+  (*FT_CMap_VariantCharListFunc)( FT_CMap    cmap,
+                                  FT_Memory  mem,
+                                  FT_UInt32  variant_selector );
+
+
+  typedef struct  FT_CMap_ClassRec_
+  {
+    FT_ULong               size;
+    FT_CMap_InitFunc       init;
+    FT_CMap_DoneFunc       done;
+    FT_CMap_CharIndexFunc  char_index;
+    FT_CMap_CharNextFunc   char_next;
+
+    /* Subsequent entries are special ones for format 14 -- the variant */
+    /* selector subtable which behaves like no other                    */
+
+    FT_CMap_CharVarIndexFunc      char_var_index;
+    FT_CMap_CharVarIsDefaultFunc  char_var_default;
+    FT_CMap_VariantListFunc       variant_list;
+    FT_CMap_CharVariantListFunc   charvariant_list;
+    FT_CMap_VariantCharListFunc   variantchar_list;
+
+  } FT_CMap_ClassRec;
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_CMAP_CLASS(class_) \
+    FT_CALLBACK_TABLE const FT_CMap_ClassRec class_;
+
+#define FT_DEFINE_CMAP_CLASS(class_, size_, init_, done_, char_index_,       \
+        char_next_, char_var_index_, char_var_default_, variant_list_,       \
+        charvariant_list_, variantchar_list_)                                \
+  FT_CALLBACK_TABLE_DEF                                                      \
+  const FT_CMap_ClassRec class_ =                                            \
+  {                                                                          \
+    size_, init_, done_, char_index_, char_next_, char_var_index_,           \
+    char_var_default_, variant_list_, charvariant_list_, variantchar_list_   \
+  };
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_CMAP_CLASS(class_) \
+    void FT_Init_Class_##class_( FT_Library library, FT_CMap_ClassRec*  clazz);
+
+#define FT_DEFINE_CMAP_CLASS(class_, size_, init_, done_, char_index_,       \
+        char_next_, char_var_index_, char_var_default_, variant_list_,       \
+        charvariant_list_, variantchar_list_)                                \
+  void                                                                       \
+  FT_Init_Class_##class_( FT_Library library,                                \
+                          FT_CMap_ClassRec*  clazz)                          \
+  {                                                                          \
+    FT_UNUSED(library);                                                      \
+    clazz->size = size_;                                                     \
+    clazz->init = init_;                                                     \
+    clazz->done = done_;                                                     \
+    clazz->char_index = char_index_;                                         \
+    clazz->char_next = char_next_;                                           \
+    clazz->char_var_index = char_var_index_;                                 \
+    clazz->char_var_default = char_var_default_;                             \
+    clazz->variant_list = variant_list_;                                     \
+    clazz->charvariant_list = charvariant_list_;                             \
+    clazz->variantchar_list = variantchar_list_;                             \
+  }
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* create a new charmap and add it to charmap->face */
+  FT_BASE( FT_Error )
+  FT_CMap_New( FT_CMap_Class  clazz,
+               FT_Pointer     init_data,
+               FT_CharMap     charmap,
+               FT_CMap       *acmap );
+
+  /* destroy a charmap and remove it from face's list */
+  FT_BASE( void )
+  FT_CMap_Done( FT_CMap  cmap );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Face_InternalRec                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure contains the internal fields of each FT_Face        */
+  /*    object.  These fields may change between different releases of     */
+  /*    FreeType.                                                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    max_points ::                                                      */
+  /*      The maximal number of points used to store the vectorial outline */
+  /*      of any glyph in this face.  If this value cannot be known in     */
+  /*      advance, or if the face isn't scalable, this should be set to 0. */
+  /*      Only relevant for scalable formats.                              */
+  /*                                                                       */
+  /*    max_contours ::                                                    */
+  /*      The maximal number of contours used to store the vectorial       */
+  /*      outline of any glyph in this face.  If this value cannot be      */
+  /*      known in advance, or if the face isn't scalable, this should be  */
+  /*      set to 0.  Only relevant for scalable formats.                   */
+  /*                                                                       */
+  /*    transform_matrix ::                                                */
+  /*      A 2x2 matrix of 16.16 coefficients used to transform glyph       */
+  /*      outlines after they are loaded from the font.  Only used by the  */
+  /*      convenience functions.                                           */
+  /*                                                                       */
+  /*    transform_delta ::                                                 */
+  /*      A translation vector used to transform glyph outlines after they */
+  /*      are loaded from the font.  Only used by the convenience          */
+  /*      functions.                                                       */
+  /*                                                                       */
+  /*    transform_flags ::                                                 */
+  /*      Some flags used to classify the transform.  Only used by the     */
+  /*      convenience functions.                                           */
+  /*                                                                       */
+  /*    services ::                                                        */
+  /*      A cache for frequently used services.  It should be only         */
+  /*      accessed with the macro `FT_FACE_LOOKUP_SERVICE'.                */
+  /*                                                                       */
+  /*    incremental_interface ::                                           */
+  /*      If non-null, the interface through which glyph data and metrics  */
+  /*      are loaded incrementally for faces that do not provide all of    */
+  /*      this data when first opened.  This field exists only if          */
+  /*      @FT_CONFIG_OPTION_INCREMENTAL is defined.                        */
+  /*                                                                       */
+  /*    ignore_unpatented_hinter ::                                        */
+  /*      This boolean flag instructs the glyph loader to ignore the       */
+  /*      native font hinter, if one is found.  This is exclusively used   */
+  /*      in the case when the unpatented hinter is compiled within the    */
+  /*      library.                                                         */
+  /*                                                                       */
+  /*    refcount ::                                                        */
+  /*      A counter initialized to~1 at the time an @FT_Face structure is  */
+  /*      created.  @FT_Reference_Face increments this counter, and        */
+  /*      @FT_Done_Face only destroys a face if the counter is~1,          */
+  /*      otherwise it simply decrements it.                               */
+  /*                                                                       */
+  typedef struct  FT_Face_InternalRec_
+  {
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+    FT_UShort           reserved1;
+    FT_Short            reserved2;
+#endif
+    FT_Matrix           transform_matrix;
+    FT_Vector           transform_delta;
+    FT_Int              transform_flags;
+
+    FT_ServiceCacheRec  services;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    FT_Incremental_InterfaceRec*  incremental_interface;
+#endif
+
+    FT_Bool             ignore_unpatented_hinter;
+    FT_UInt             refcount;
+
+  } FT_Face_InternalRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Slot_InternalRec                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure contains the internal fields of each FT_GlyphSlot   */
+  /*    object.  These fields may change between different releases of     */
+  /*    FreeType.                                                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    loader            :: The glyph loader object used to load outlines */
+  /*                         into the glyph slot.                          */
+  /*                                                                       */
+  /*    flags             :: Possible values are zero or                   */
+  /*                         FT_GLYPH_OWN_BITMAP.  The latter indicates    */
+  /*                         that the FT_GlyphSlot structure owns the      */
+  /*                         bitmap buffer.                                */
+  /*                                                                       */
+  /*    glyph_transformed :: Boolean.  Set to TRUE when the loaded glyph   */
+  /*                         must be transformed through a specific        */
+  /*                         font transformation.  This is _not_ the same  */
+  /*                         as the face transform set through             */
+  /*                         FT_Set_Transform().                           */
+  /*                                                                       */
+  /*    glyph_matrix      :: The 2x2 matrix corresponding to the glyph     */
+  /*                         transformation, if necessary.                 */
+  /*                                                                       */
+  /*    glyph_delta       :: The 2d translation vector corresponding to    */
+  /*                         the glyph transformation, if necessary.       */
+  /*                                                                       */
+  /*    glyph_hints       :: Format-specific glyph hints management.       */
+  /*                                                                       */
+
+#define FT_GLYPH_OWN_BITMAP  0x1
+
+  typedef struct  FT_Slot_InternalRec_
+  {
+    FT_GlyphLoader  loader;
+    FT_UInt         flags;
+    FT_Bool         glyph_transformed;
+    FT_Matrix       glyph_matrix;
+    FT_Vector       glyph_delta;
+    void*           glyph_hints;
+
+  } FT_GlyphSlot_InternalRec;
+
+
+#if 0
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_Size_InternalRec                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure contains the internal fields of each FT_Size        */
+  /*    object.  Currently, it's empty.                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+  typedef struct  FT_Size_InternalRec_
+  {
+    /* empty */
+
+  } FT_Size_InternalRec;
+
+#endif
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                         M O D U L E S                           ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_ModuleRec                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A module object instance.                                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    clazz   :: A pointer to the module's class.                        */
+  /*                                                                       */
+  /*    library :: A handle to the parent library object.                  */
+  /*                                                                       */
+  /*    memory  :: A handle to the memory manager.                         */
+  /*                                                                       */
+  typedef struct  FT_ModuleRec_
+  {
+    FT_Module_Class*  clazz;
+    FT_Library        library;
+    FT_Memory         memory;
+
+  } FT_ModuleRec;
+
+
+  /* typecast an object to an FT_Module */
+#define FT_MODULE( x )          ((FT_Module)( x ))
+#define FT_MODULE_CLASS( x )    FT_MODULE( x )->clazz
+#define FT_MODULE_LIBRARY( x )  FT_MODULE( x )->library
+#define FT_MODULE_MEMORY( x )   FT_MODULE( x )->memory
+
+
+#define FT_MODULE_IS_DRIVER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                    FT_MODULE_FONT_DRIVER )
+
+#define FT_MODULE_IS_RENDERER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                      FT_MODULE_RENDERER )
+
+#define FT_MODULE_IS_HINTER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                    FT_MODULE_HINTER )
+
+#define FT_MODULE_IS_STYLER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                    FT_MODULE_STYLER )
+
+#define FT_DRIVER_IS_SCALABLE( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                      FT_MODULE_DRIVER_SCALABLE )
+
+#define FT_DRIVER_USES_OUTLINES( x )  !( FT_MODULE_CLASS( x )->module_flags & \
+                                         FT_MODULE_DRIVER_NO_OUTLINES )
+
+#define FT_DRIVER_HAS_HINTER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
+                                     FT_MODULE_DRIVER_HAS_HINTER )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Module_Interface                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finds a module and returns its specific interface as a typeless    */
+  /*    pointer.                                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library     :: A handle to the library object.                     */
+  /*                                                                       */
+  /*    module_name :: The module's name (as an ASCII string).             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A module-specific interface if available, 0 otherwise.             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    You should better be familiar with FreeType internals to know      */
+  /*    which module to look for, and what its interface is :-)            */
+  /*                                                                       */
+  FT_BASE( const void* )
+  FT_Get_Module_Interface( FT_Library   library,
+                           const char*  mod_name );
+
+  FT_BASE( FT_Pointer )
+  ft_module_get_service( FT_Module    module,
+                         const char*  service_id );
+
+ /* */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****               FACE, SIZE & GLYPH SLOT OBJECTS                   ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* a few macros used to perform easy typecasts with minimal brain damage */
+
+#define FT_FACE( x )          ((FT_Face)(x))
+#define FT_SIZE( x )          ((FT_Size)(x))
+#define FT_SLOT( x )          ((FT_GlyphSlot)(x))
+
+#define FT_FACE_DRIVER( x )   FT_FACE( x )->driver
+#define FT_FACE_LIBRARY( x )  FT_FACE_DRIVER( x )->root.library
+#define FT_FACE_MEMORY( x )   FT_FACE( x )->memory
+#define FT_FACE_STREAM( x )   FT_FACE( x )->stream
+
+#define FT_SIZE_FACE( x )     FT_SIZE( x )->face
+#define FT_SLOT_FACE( x )     FT_SLOT( x )->face
+
+#define FT_FACE_SLOT( x )     FT_FACE( x )->glyph
+#define FT_FACE_SIZE( x )     FT_FACE( x )->size
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_GlyphSlot                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    It is sometimes useful to have more than one glyph slot for a      */
+  /*    given face object.  This function is used to create additional     */
+  /*    slots.  All of them are automatically discarded when the face is   */
+  /*    destroyed.                                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face  :: A handle to a parent face object.                         */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    aslot :: A handle to a new glyph slot object.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_BASE( FT_Error )
+  FT_New_GlyphSlot( FT_Face        face,
+                    FT_GlyphSlot  *aslot );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_GlyphSlot                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroys a given glyph slot.  Remember however that all slots are  */
+  /*    automatically destroyed with its parent.  Using this function is   */
+  /*    not always mandatory.                                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    slot :: A handle to a target glyph slot.                           */
+  /*                                                                       */
+  FT_BASE( void )
+  FT_Done_GlyphSlot( FT_GlyphSlot  slot );
+
+ /* */
+
+#define FT_REQUEST_WIDTH( req )                                            \
+          ( (req)->horiResolution                                          \
+              ? (FT_Pos)( (req)->width * (req)->horiResolution + 36 ) / 72 \
+              : (req)->width )
+
+#define FT_REQUEST_HEIGHT( req )                                            \
+          ( (req)->vertResolution                                           \
+              ? (FT_Pos)( (req)->height * (req)->vertResolution + 36 ) / 72 \
+              : (req)->height )
+
+
+  /* Set the metrics according to a bitmap strike. */
+  FT_BASE( void )
+  FT_Select_Metrics( FT_Face   face,
+                     FT_ULong  strike_index );
+
+
+  /* Set the metrics according to a size request. */
+  FT_BASE( void )
+  FT_Request_Metrics( FT_Face          face,
+                      FT_Size_Request  req );
+
+
+  /* Match a size request against `available_sizes'. */
+  FT_BASE( FT_Error )
+  FT_Match_Size( FT_Face          face,
+                 FT_Size_Request  req,
+                 FT_Bool          ignore_width,
+                 FT_ULong*        size_index );
+
+
+  /* Use the horizontal metrics to synthesize the vertical metrics. */
+  /* If `advance' is zero, it is also synthesized.                  */
+  FT_BASE( void )
+  ft_synthesize_vertical_metrics( FT_Glyph_Metrics*  metrics,
+                                  FT_Pos             advance );
+
+
+  /* Free the bitmap of a given glyphslot when needed (i.e., only when it */
+  /* was allocated with ft_glyphslot_alloc_bitmap).                       */
+  FT_BASE( void )
+  ft_glyphslot_free_bitmap( FT_GlyphSlot  slot );
+
+
+  /* Allocate a new bitmap buffer in a glyph slot. */
+  FT_BASE( FT_Error )
+  ft_glyphslot_alloc_bitmap( FT_GlyphSlot  slot,
+                             FT_ULong      size );
+
+
+  /* Set the bitmap buffer in a glyph slot to a given pointer.  The buffer */
+  /* will not be freed by a later call to ft_glyphslot_free_bitmap.        */
+  FT_BASE( void )
+  ft_glyphslot_set_bitmap( FT_GlyphSlot  slot,
+                           FT_Byte*      buffer );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                        R E N D E R E R S                        ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#define FT_RENDERER( x )      ((FT_Renderer)( x ))
+#define FT_GLYPH( x )         ((FT_Glyph)( x ))
+#define FT_BITMAP_GLYPH( x )  ((FT_BitmapGlyph)( x ))
+#define FT_OUTLINE_GLYPH( x ) ((FT_OutlineGlyph)( x ))
+
+
+  typedef struct  FT_RendererRec_
+  {
+    FT_ModuleRec            root;
+    FT_Renderer_Class*      clazz;
+    FT_Glyph_Format         glyph_format;
+    FT_Glyph_Class          glyph_class;
+
+    FT_Raster               raster;
+    FT_Raster_Render_Func   raster_render;
+    FT_Renderer_RenderFunc  render;
+
+  } FT_RendererRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                    F O N T   D R I V E R S                      ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* typecast a module into a driver easily */
+#define FT_DRIVER( x )        ((FT_Driver)(x))
+
+  /* typecast a module as a driver, and get its driver class */
+#define FT_DRIVER_CLASS( x )  FT_DRIVER( x )->clazz
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_DriverRec                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The root font driver class.  A font driver is responsible for      */
+  /*    managing and loading font files of a given format.                 */
+  /*                                                                       */
+  /*  <Fields>                                                             */
+  /*     root         :: Contains the fields of the root module class.     */
+  /*                                                                       */
+  /*     clazz        :: A pointer to the font driver's class.  Note that  */
+  /*                     this is NOT root.clazz.  `class' wasn't used      */
+  /*                     as it is a reserved word in C++.                  */
+  /*                                                                       */
+  /*     faces_list   :: The list of faces currently opened by this        */
+  /*                     driver.                                           */
+  /*                                                                       */
+  /*     glyph_loader :: The glyph loader for all faces managed by this    */
+  /*                     driver.  This object isn't defined for unscalable */
+  /*                     formats.                                          */
+  /*                                                                       */
+  typedef struct  FT_DriverRec_
+  {
+    FT_ModuleRec     root;
+    FT_Driver_Class  clazz;
+    FT_ListRec       faces_list;
+    FT_GlyphLoader   glyph_loader;
+
+  } FT_DriverRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                       L I B R A R I E S                         ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* This hook is used by the TrueType debugger.  It must be set to an */
+  /* alternate truetype bytecode interpreter function.                 */
+#define FT_DEBUG_HOOK_TRUETYPE            0
+
+
+  /* Set this debug hook to a non-null pointer to force unpatented hinting */
+  /* for all faces when both TT_USE_BYTECODE_INTERPRETER and               */
+  /* TT_CONFIG_OPTION_UNPATENTED_HINTING are defined.  This is only used   */
+  /* during debugging.                                                     */
+#define FT_DEBUG_HOOK_UNPATENTED_HINTING  1
+
+
+  typedef void  (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap*      bitmap,
+                                            FT_Render_Mode  render_mode,
+                                            FT_Library      library );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    FT_LibraryRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The FreeType library class.  This is the root of all FreeType      */
+  /*    data.  Use FT_New_Library() to create a library object, and        */
+  /*    FT_Done_Library() to discard it and all child objects.             */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    memory           :: The library's memory object.  Manages memory   */
+  /*                        allocation.                                    */
+  /*                                                                       */
+  /*    version_major    :: The major version number of the library.       */
+  /*                                                                       */
+  /*    version_minor    :: The minor version number of the library.       */
+  /*                                                                       */
+  /*    version_patch    :: The current patch level of the library.        */
+  /*                                                                       */
+  /*    num_modules      :: The number of modules currently registered     */
+  /*                        within this library.  This is set to 0 for new */
+  /*                        libraries.  New modules are added through the  */
+  /*                        FT_Add_Module() API function.                  */
+  /*                                                                       */
+  /*    modules          :: A table used to store handles to the currently */
+  /*                        registered modules. Note that each font driver */
+  /*                        contains a list of its opened faces.           */
+  /*                                                                       */
+  /*    renderers        :: The list of renderers currently registered     */
+  /*                        within the library.                            */
+  /*                                                                       */
+  /*    cur_renderer     :: The current outline renderer.  This is a       */
+  /*                        shortcut used to avoid parsing the list on     */
+  /*                        each call to FT_Outline_Render().  It is a     */
+  /*                        handle to the current renderer for the         */
+  /*                        FT_GLYPH_FORMAT_OUTLINE format.                */
+  /*                                                                       */
+  /*    auto_hinter      :: XXX                                            */
+  /*                                                                       */
+  /*    raster_pool      :: The raster object's render pool.  This can     */
+  /*                        ideally be changed dynamically at run-time.    */
+  /*                                                                       */
+  /*    raster_pool_size :: The size of the render pool in bytes.          */
+  /*                                                                       */
+  /*    debug_hooks      :: XXX                                            */
+  /*                                                                       */
+  /*    lcd_filter       :: If subpixel rendering is activated, the        */
+  /*                        selected LCD filter mode.                      */
+  /*                                                                       */
+  /*    lcd_extra        :: If subpixel rendering is activated, the number */
+  /*                        of extra pixels needed for the LCD filter.     */
+  /*                                                                       */
+  /*    lcd_weights      :: If subpixel rendering is activated, the LCD    */
+  /*                        filter weights, if any.                        */
+  /*                                                                       */
+  /*    lcd_filter_func  :: If subpixel rendering is activated, the LCD    */
+  /*                        filtering callback function.                   */
+  /*                                                                       */
+  /*    pic_container    :: Contains global structs and tables, instead    */
+  /*                        of defining them globallly.                    */
+  /*                                                                       */
+  /*    refcount         :: A counter initialized to~1 at the time an      */
+  /*                        @FT_Library structure is created.              */
+  /*                        @FT_Reference_Library increments this counter, */
+  /*                        and @FT_Done_Library only destroys a library   */
+  /*                        if the counter is~1, otherwise it simply       */
+  /*                        decrements it.                                 */
+  /*                                                                       */
+  typedef struct  FT_LibraryRec_
+  {
+    FT_Memory          memory;           /* library's memory manager */
+
+    FT_Int             version_major;
+    FT_Int             version_minor;
+    FT_Int             version_patch;
+
+    FT_UInt            num_modules;
+    FT_Module          modules[FT_MAX_MODULES];  /* module objects  */
+
+    FT_ListRec         renderers;        /* list of renderers        */
+    FT_Renderer        cur_renderer;     /* current outline renderer */
+    FT_Module          auto_hinter;
+
+    FT_Byte*           raster_pool;      /* scan-line conversion */
+                                         /* render pool          */
+    FT_ULong           raster_pool_size; /* size of render pool in bytes */
+
+    FT_DebugHook_Func  debug_hooks[4];
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+    FT_LcdFilter             lcd_filter;
+    FT_Int                   lcd_extra;        /* number of extra pixels */
+    FT_Byte                  lcd_weights[7];   /* filter weights, if any */
+    FT_Bitmap_LcdFilterFunc  lcd_filter_func;  /* filtering callback     */
+#endif
+
+#ifdef FT_CONFIG_OPTION_PIC
+    FT_PIC_Container   pic_container;
+#endif
+
+    FT_UInt            refcount;
+
+  } FT_LibraryRec;
+
+
+  FT_BASE( FT_Renderer )
+  FT_Lookup_Renderer( FT_Library       library,
+                      FT_Glyph_Format  format,
+                      FT_ListNode*     node );
+
+  FT_BASE( FT_Error )
+  FT_Render_Glyph_Internal( FT_Library      library,
+                            FT_GlyphSlot    slot,
+                            FT_Render_Mode  render_mode );
+
+  typedef const char*
+  (*FT_Face_GetPostscriptNameFunc)( FT_Face  face );
+
+  typedef FT_Error
+  (*FT_Face_GetGlyphNameFunc)( FT_Face     face,
+                               FT_UInt     glyph_index,
+                               FT_Pointer  buffer,
+                               FT_UInt     buffer_max );
+
+  typedef FT_UInt
+  (*FT_Face_GetGlyphNameIndexFunc)( FT_Face     face,
+                                    FT_String*  glyph_name );
+
+
+#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Memory                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Creates a new memory object.                                       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A pointer to the new memory object.  0 in case of error.           */
+  /*                                                                       */
+  FT_BASE( FT_Memory )
+  FT_New_Memory( void );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Done_Memory                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Discards memory manager.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory :: A handle to the memory manager.                          */
+  /*                                                                       */
+  FT_BASE( void )
+  FT_Done_Memory( FT_Memory  memory );
+
+#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
+
+
+  /* Define default raster's interface.  The default raster is located in  */
+  /* `src/base/ftraster.c'.                                                */
+  /*                                                                       */
+  /* Client applications can register new rasters through the              */
+  /* FT_Set_Raster() API.                                                  */
+
+#ifndef FT_NO_DEFAULT_RASTER
+  FT_EXPORT_VAR( FT_Raster_Funcs )  ft_default_raster;
+#endif
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****              PIC-Support Macros for ftimage.h                   ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_OUTLINE_FUNCS                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of FT_Outline_Funcs struct.         */
+  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */
+  /*    called with a pre-allocated stracture to be filled.                */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
+  /*    allocated in the global scope (or the scope where the macro        */
+  /*    is used).                                                          */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_OUTLINE_FUNCS(class_, move_to_, line_to_, conic_to_,       \
+                                cubic_to_, shift_, delta_)                   \
+  static const FT_Outline_Funcs class_ =                                     \
+  {                                                                          \
+    move_to_, line_to_, conic_to_, cubic_to_, shift_, delta_                 \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_OUTLINE_FUNCS(class_, move_to_, line_to_, conic_to_,       \
+                                cubic_to_, shift_, delta_)                   \
+  static FT_Error                                                            \
+  Init_Class_##class_( FT_Outline_Funcs*  clazz )                            \
+  {                                                                          \
+    clazz->move_to = move_to_;                                               \
+    clazz->line_to = line_to_;                                               \
+    clazz->conic_to = conic_to_;                                             \
+    clazz->cubic_to = cubic_to_;                                             \
+    clazz->shift = shift_;                                                   \
+    clazz->delta = delta_;                                                   \
+    return FT_Err_Ok;                                                        \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_RASTER_FUNCS                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of FT_Raster_Funcs struct.          */
+  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */
+  /*    called with a pre-allocated stracture to be filled.                */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
+  /*    allocated in the global scope (or the scope where the macro        */
+  /*    is used).                                                          */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_RASTER_FUNCS(class_, glyph_format_, raster_new_,           \
+                               raster_reset_, raster_set_mode_,              \
+                               raster_render_, raster_done_)                 \
+  const FT_Raster_Funcs class_ =                                      \
+  {                                                                          \
+    glyph_format_, raster_new_, raster_reset_,                               \
+    raster_set_mode_, raster_render_, raster_done_                           \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_RASTER_FUNCS(class_, glyph_format_, raster_new_,           \
+    raster_reset_, raster_set_mode_, raster_render_, raster_done_)           \
+  void                                                                       \
+  FT_Init_Class_##class_( FT_Raster_Funcs*  clazz )                          \
+  {                                                                          \
+    clazz->glyph_format = glyph_format_;                                     \
+    clazz->raster_new = raster_new_;                                         \
+    clazz->raster_reset = raster_reset_;                                     \
+    clazz->raster_set_mode = raster_set_mode_;                               \
+    clazz->raster_render = raster_render_;                                   \
+    clazz->raster_done = raster_done_;                                       \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****              PIC-Support Macros for ftrender.h                  ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_GLYPH                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of FT_Glyph_Class struct.           */
+  /*    When FT_CONFIG_OPTION_PIC is defined an init funtion will need to  */
+  /*    called with a pre-allocated stracture to be filled.                */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
+  /*    allocated in the global scope (or the scope where the macro        */
+  /*    is used).                                                          */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_GLYPH(class_, size_, format_, init_, done_, copy_,         \
+                        transform_, bbox_, prepare_)                         \
+  FT_CALLBACK_TABLE_DEF                                                      \
+  const FT_Glyph_Class class_ =                                              \
+  {                                                                          \
+    size_, format_, init_, done_, copy_, transform_, bbox_, prepare_         \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_GLYPH(class_, size_, format_, init_, done_, copy_,         \
+                        transform_, bbox_, prepare_)                         \
+  void                                                                       \
+  FT_Init_Class_##class_( FT_Glyph_Class*  clazz )                           \
+  {                                                                          \
+    clazz->glyph_size = size_;                                               \
+    clazz->glyph_format = format_;                                           \
+    clazz->glyph_init = init_;                                               \
+    clazz->glyph_done = done_;                                               \
+    clazz->glyph_copy = copy_;                                               \
+    clazz->glyph_transform = transform_;                                     \
+    clazz->glyph_bbox = bbox_;                                               \
+    clazz->glyph_prepare = prepare_;                                         \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DECLARE_RENDERER                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to create a forward declaration of a                          */
+  /*    FT_Renderer_Class stract instance.                                 */
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_RENDERER                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of FT_Renderer_Class struct.        */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is defined a Create funtion will need    */
+  /*    to called with a pointer where the allocated stracture is returned.*/
+  /*    And when it is no longer needed a Destroy function needs           */
+  /*    to be called to release that allocation.                           */
+  /*    fcinit.c (ft_create_default_module_classes) already contains       */
+  /*    a mechanism to call these functions for the default modules        */
+  /*    described in ftmodule.h                                            */
+  /*                                                                       */
+  /*    Notice that the created Create and Destroy functions call          */
+  /*    pic_init and pic_free function to allow you to manually allocate   */
+  /*    and initialize any additional global data, like module specific    */
+  /*    interface, and put them in the global pic container defined in     */
+  /*    ftpic.h. if you don't need them just implement the functions as    */
+  /*    empty to resolve the link error.  Also the pic_init and pic_free   */
+  /*    functions should be declared in pic.h, to be referred by renderer  */
+  /*    definition calling FT_DEFINE_RENDERER() in following.              */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
+  /*    allocated in the global scope (or the scope where the macro        */
+  /*    is used).                                                          */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_RENDERER(class_)                                          \
+    FT_EXPORT_VAR( const FT_Renderer_Class ) class_;
+
+#define FT_DEFINE_RENDERER(class_,                                           \
+                           flags_, size_, name_, version_, requires_,        \
+                           interface_, init_, done_, get_interface_,         \
+                           glyph_format_, render_glyph_, transform_glyph_,   \
+                           get_glyph_cbox_, set_mode_, raster_class_ )       \
+  FT_CALLBACK_TABLE_DEF                                                      \
+  const FT_Renderer_Class  class_ =                                          \
+  {                                                                          \
+    FT_DEFINE_ROOT_MODULE(flags_,size_,name_,version_,requires_,             \
+                          interface_,init_,done_,get_interface_)             \
+    glyph_format_,                                                           \
+                                                                             \
+    render_glyph_,                                                           \
+    transform_glyph_,                                                        \
+    get_glyph_cbox_,                                                         \
+    set_mode_,                                                               \
+                                                                             \
+    raster_class_                                                            \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_RENDERER(class_)  FT_DECLARE_MODULE(class_)
+
+#define FT_DEFINE_RENDERER(class_, \
+                           flags_, size_, name_, version_, requires_,        \
+                           interface_, init_, done_, get_interface_,         \
+                           glyph_format_, render_glyph_, transform_glyph_,   \
+                           get_glyph_cbox_, set_mode_, raster_class_ )       \
+                                                                             \
+  void                                                                       \
+  FT_Destroy_Class_##class_( FT_Library        library,                      \
+                        FT_Module_Class*  clazz )                            \
+  {                                                                          \
+    FT_Renderer_Class* rclazz = (FT_Renderer_Class*)clazz;                   \
+    FT_Memory         memory = library->memory;                              \
+    class_##_pic_free( library );                                            \
+    if ( rclazz )                                                            \
+      FT_FREE( rclazz );                                                     \
+  }                                                                          \
+                                                                             \
+  FT_Error                                                                   \
+  FT_Create_Class_##class_( FT_Library         library,                      \
+                            FT_Module_Class**  output_class )                \
+  {                                                                          \
+    FT_Renderer_Class*  clazz;                                               \
+    FT_Error            error;                                               \
+    FT_Memory           memory = library->memory;                            \
+                                                                             \
+    if ( FT_ALLOC( clazz, sizeof(*clazz) ) )                                 \
+      return error;                                                          \
+                                                                             \
+    error = class_##_pic_init( library );                                    \
+    if(error)                                                                \
+    {                                                                        \
+      FT_FREE( clazz );                                                      \
+      return error;                                                          \
+    }                                                                        \
+                                                                             \
+    FT_DEFINE_ROOT_MODULE(flags_,size_,name_,version_,requires_,             \
+                          interface_,init_,done_,get_interface_)             \
+                                                                             \
+    clazz->glyph_format       = glyph_format_;                               \
+                                                                             \
+    clazz->render_glyph       = render_glyph_;                               \
+    clazz->transform_glyph    = transform_glyph_;                            \
+    clazz->get_glyph_cbox     = get_glyph_cbox_;                             \
+    clazz->set_mode           = set_mode_;                                   \
+                                                                             \
+    clazz->raster_class       = raster_class_;                               \
+                                                                             \
+    *output_class = (FT_Module_Class*)clazz;                                 \
+    return FT_Err_Ok;                                                        \
+  }
+
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****              PIC-Support Macros for ftmodapi.h                  ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Module_Creator                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to create (allocate) a new module class object.    */
+  /*    The object's members are initialized, but the module itself is     */
+  /*    not.                                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory       :: A handle to the memory manager.                    */
+  /*    output_class :: Initialized with the newly allocated class.        */
+  /*                                                                       */
+  typedef FT_Error
+  (*FT_Module_Creator)( FT_Memory          memory,
+                        FT_Module_Class**  output_class );
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    FT_Module_Destroyer                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to destroy (deallocate) a module class object.     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory :: A handle to the memory manager.                          */
+  /*    clazz  :: Module class to destroy.                                 */
+  /*                                                                       */
+  typedef void
+  (*FT_Module_Destroyer)( FT_Memory         memory,
+                          FT_Module_Class*  clazz );
+
+#endif
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DECLARE_MODULE                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to create a forward declaration of a                          */
+  /*    FT_Module_Class stract instance.                                   */
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_MODULE                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of FT_Module_Class struct.          */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is defined a Create funtion will need    */
+  /*    to called with a pointer where the allocated stracture is returned.*/
+  /*    And when it is no longer needed a Destroy function needs           */
+  /*    to be called to release that allocation.                           */
+  /*    fcinit.c (ft_create_default_module_classes) already contains       */
+  /*    a mechanism to call these functions for the default modules        */
+  /*    described in ftmodule.h                                            */
+  /*                                                                       */
+  /*    Notice that the created Create and Destroy functions call          */
+  /*    pic_init and pic_free function to allow you to manually allocate   */
+  /*    and initialize any additional global data, like module specific    */
+  /*    interface, and put them in the global pic container defined in     */
+  /*    ftpic.h. if you don't need them just implement the functions as    */
+  /*    empty to resolve the link error.  Also the pic_init and pic_free   */
+  /*    functions should be declared in pic.h, to be referred by module    */
+  /*    definition calling FT_DEFINE_MODULE() in following.                */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the struct will be        */
+  /*    allocated in the global scope (or the scope where the macro        */
+  /*    is used).                                                          */
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_ROOT_MODULE                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an instance of FT_Module_Class struct inside    */
+  /*    another stract that contains it or in a function that initializes  */
+  /*    that containing stract                                             */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DECLARE_MODULE(class_)                                            \
+  FT_CALLBACK_TABLE                                                          \
+  const FT_Module_Class  class_;                                             \
+
+#define FT_DEFINE_ROOT_MODULE(flags_, size_, name_, version_, requires_,     \
+                              interface_, init_, done_, get_interface_)      \
+  {                                                                          \
+    flags_,                                                                  \
+    size_,                                                                   \
+                                                                             \
+    name_,                                                                   \
+    version_,                                                                \
+    requires_,                                                               \
+                                                                             \
+    interface_,                                                              \
+                                                                             \
+    init_,                                                                   \
+    done_,                                                                   \
+    get_interface_,                                                          \
+  },
+
+#define FT_DEFINE_MODULE(class_, flags_, size_, name_, version_, requires_,  \
+                         interface_, init_, done_, get_interface_)           \
+  FT_CALLBACK_TABLE_DEF                                                      \
+  const FT_Module_Class class_ =                                             \
+  {                                                                          \
+    flags_,                                                                  \
+    size_,                                                                   \
+                                                                             \
+    name_,                                                                   \
+    version_,                                                                \
+    requires_,                                                               \
+                                                                             \
+    interface_,                                                              \
+                                                                             \
+    init_,                                                                   \
+    done_,                                                                   \
+    get_interface_,                                                          \
+  };
+
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DECLARE_MODULE(class_)                                            \
+  FT_Error FT_Create_Class_##class_( FT_Library library,                     \
+                                     FT_Module_Class** output_class );       \
+  void     FT_Destroy_Class_##class_( FT_Library library,                    \
+                                      FT_Module_Class*  clazz );
+
+#define FT_DEFINE_ROOT_MODULE(flags_, size_, name_, version_, requires_,     \
+                              interface_, init_, done_, get_interface_)      \
+    clazz->root.module_flags       = flags_;                                 \
+    clazz->root.module_size        = size_;                                  \
+    clazz->root.module_name        = name_;                                  \
+    clazz->root.module_version     = version_;                               \
+    clazz->root.module_requires    = requires_;                              \
+                                                                             \
+    clazz->root.module_interface   = interface_;                             \
+                                                                             \
+    clazz->root.module_init        = init_;                                  \
+    clazz->root.module_done        = done_;                                  \
+    clazz->root.get_interface      = get_interface_;
+
+#define FT_DEFINE_MODULE(class_, flags_, size_, name_, version_, requires_,  \
+                         interface_, init_, done_, get_interface_)           \
+                                                                             \
+  void                                                                       \
+  FT_Destroy_Class_##class_( FT_Library library,                             \
+                             FT_Module_Class*  clazz )                       \
+  {                                                                          \
+    FT_Memory memory = library->memory;                                      \
+    class_##_pic_free( library );                                            \
+    if ( clazz )                                                             \
+      FT_FREE( clazz );                                                      \
+  }                                                                          \
+                                                                             \
+  FT_Error                                                                   \
+  FT_Create_Class_##class_( FT_Library library,                              \
+                            FT_Module_Class**  output_class )                \
+  {                                                                          \
+    FT_Memory memory = library->memory;                                      \
+    FT_Module_Class*  clazz;                                                 \
+    FT_Error          error;                                                 \
+                                                                             \
+    if ( FT_ALLOC( clazz, sizeof(*clazz) ) )                                 \
+      return error;                                                          \
+    error = class_##_pic_init( library );                                    \
+    if(error)                                                                \
+    {                                                                        \
+      FT_FREE( clazz );                                                      \
+      return error;                                                          \
+    }                                                                        \
+                                                                             \
+    clazz->module_flags       = flags_;                                      \
+    clazz->module_size        = size_;                                       \
+    clazz->module_name        = name_;                                       \
+    clazz->module_version     = version_;                                    \
+    clazz->module_requires    = requires_;                                   \
+                                                                             \
+    clazz->module_interface   = interface_;                                  \
+                                                                             \
+    clazz->module_init        = init_;                                       \
+    clazz->module_done        = done_;                                       \
+    clazz->get_interface      = get_interface_;                              \
+                                                                             \
+    *output_class = clazz;                                                   \
+    return FT_Err_Ok;                                                        \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+FT_END_HEADER
+
+#endif /* __FTOBJS_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/ftpic.h b/include/freetype/internal/ftpic.h
new file mode 100644 (file)
index 0000000..5b674e6
--- /dev/null
@@ -0,0 +1,67 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftpic.h                                                                */
+/*                                                                         */
+/*    The FreeType position independent code services (declaration).       */
+/*                                                                         */
+/*  Copyright 2009 by                                                      */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Modules that ordinarily have const global data that need address     */
+  /*  can instead define pointers here.                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTPIC_H__
+#define __FTPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  typedef struct FT_PIC_Container_
+  {
+    /* pic containers for base */
+    void* base;
+    /* pic containers for modules */
+    void* autofit;
+    void* cff;
+    void* pshinter;
+    void* psnames;
+    void* raster;
+    void* sfnt;
+    void* smooth;
+    void* truetype;
+  } FT_PIC_Container;
+
+  /* Initialize the various function tables, structs, etc. stored in the container. */
+  FT_BASE( FT_Error )
+  ft_pic_container_init( FT_Library library );
+
+
+  /* Destroy the contents of the container. */
+  FT_BASE( void )
+  ft_pic_container_destroy( FT_Library library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTPIC_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/ftrfork.h b/include/freetype/internal/ftrfork.h
new file mode 100644 (file)
index 0000000..77e1020
--- /dev/null
@@ -0,0 +1,247 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftrfork.h                                                              */
+/*                                                                         */
+/*    Embedded resource forks accessor (specification).                    */
+/*                                                                         */
+/*  Copyright 2004, 2006, 2007 by                                          */
+/*  Masatake YAMATO and Redhat K.K.                                        */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/* Development of the code in this file is support of                      */
+/* Information-technology Promotion Agency, Japan.                         */
+/***************************************************************************/
+
+
+#ifndef __FTRFORK_H__
+#define __FTRFORK_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+
+
+FT_BEGIN_HEADER
+
+
+  /* Number of guessing rules supported in `FT_Raccess_Guess'.            */
+  /* Don't forget to increment the number if you add a new guessing rule. */
+#define FT_RACCESS_N_RULES  9
+
+
+  /* A structure to describe a reference in a resource by its resource ID */
+  /* and internal offset.  The `POST' resource expects to be concatenated */
+  /* by the order of resource IDs instead of its appearance in the file.  */
+
+  typedef struct  FT_RFork_Ref_
+  {
+    FT_UShort  res_id;
+    FT_ULong   offset;
+
+  } FT_RFork_Ref;
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+  typedef FT_Error
+  (*ft_raccess_guess_func)( FT_Library  library,
+                            FT_Stream   stream,
+                            char       *base_file_name,
+                            char      **result_file_name,
+                            FT_Long    *result_offset );
+
+  typedef enum  FT_RFork_Rule_ {
+    FT_RFork_Rule_invalid = -2,
+    FT_RFork_Rule_uknown, /* -1 */
+    FT_RFork_Rule_apple_double,
+    FT_RFork_Rule_apple_single,
+    FT_RFork_Rule_darwin_ufs_export,
+    FT_RFork_Rule_darwin_newvfs,
+    FT_RFork_Rule_darwin_hfsplus,
+    FT_RFork_Rule_vfat,
+    FT_RFork_Rule_linux_cap,
+    FT_RFork_Rule_linux_double,
+    FT_RFork_Rule_linux_netatalk
+  } FT_RFork_Rule;
+
+  /* For fast translation between rule index and rule type,
+   * the macros FT_RFORK_xxx should be kept consistent with
+   * the raccess_guess_funcs table
+   */
+  typedef struct ft_raccess_guess_rec_ {
+    ft_raccess_guess_func  func;
+    FT_RFork_Rule          type;
+  } ft_raccess_guess_rec;
+
+#ifndef FT_CONFIG_OPTION_PIC
+  /* this array is a storage in non-PIC mode, so ; is needed in END */
+#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type ) \
+        const type name[] = {
+#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix ) \
+        { raccess_guess_##func_suffix, FT_RFork_Rule_##type_suffix },
+#define CONST_FT_RFORK_RULE_ARRAY_END };
+#else /* FT_CONFIG_OPTION_PIC */
+  /* this array is a function in PIC mode, so no ; is needed in END */
+#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type ) \
+        void FT_Init_##name ( type* storage ) {       \
+          type *local = storage;                      \
+          int i = 0;
+#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix ) \
+        local[i].func = raccess_guess_##func_suffix;                \
+        local[i].type = FT_RFork_Rule_##type_suffix;                \
+        i++;
+#define CONST_FT_RFORK_RULE_ARRAY_END }
+#endif /* FT_CONFIG_OPTION_PIC */
+#endif /* FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Raccess_Guess                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Guess a file name and offset where the actual resource fork is     */
+  /*    stored.  The macro FT_RACCESS_N_RULES holds the number of          */
+  /*    guessing rules;  the guessed result for the Nth rule is            */
+  /*    represented as a triplet: a new file name (new_names[N]), a file   */
+  /*    offset (offsets[N]), and an error code (errors[N]).                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library ::                                                         */
+  /*      A FreeType library instance.                                     */
+  /*                                                                       */
+  /*    stream ::                                                          */
+  /*      A file stream containing the resource fork.                      */
+  /*                                                                       */
+  /*    base_name ::                                                       */
+  /*      The (base) file name of the resource fork used for some          */
+  /*      guessing rules.                                                  */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    new_names ::                                                       */
+  /*      An array of guessed file names in which the resource forks may   */
+  /*      exist.  If `new_names[N]' is NULL, the guessed file name is      */
+  /*      equal to `base_name'.                                            */
+  /*                                                                       */
+  /*    offsets ::                                                         */
+  /*      An array of guessed file offsets.  `offsets[N]' holds the file   */
+  /*      offset of the possible start of the resource fork in file        */
+  /*      `new_names[N]'.                                                  */
+  /*                                                                       */
+  /*    errors ::                                                          */
+  /*      An array of FreeType error codes.  `errors[N]' is the error      */
+  /*      code of Nth guessing rule function.  If `errors[N]' is not       */
+  /*      FT_Err_Ok, `new_names[N]' and `offsets[N]' are meaningless.      */
+  /*                                                                       */
+  FT_BASE( void )
+  FT_Raccess_Guess( FT_Library  library,
+                    FT_Stream   stream,
+                    char*       base_name,
+                    char**      new_names,
+                    FT_Long*    offsets,
+                    FT_Error*   errors );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Raccess_Get_HeaderInfo                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the information from the header of resource fork.  The         */
+  /*    information includes the file offset where the resource map        */
+  /*    starts, and the file offset where the resource data starts.        */
+  /*    `FT_Raccess_Get_DataOffsets' requires these two data.              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library ::                                                         */
+  /*      A FreeType library instance.                                     */
+  /*                                                                       */
+  /*    stream ::                                                          */
+  /*      A file stream containing the resource fork.                      */
+  /*                                                                       */
+  /*    rfork_offset ::                                                    */
+  /*      The file offset where the resource fork starts.                  */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    map_offset ::                                                      */
+  /*      The file offset where the resource map starts.                   */
+  /*                                                                       */
+  /*    rdata_pos ::                                                       */
+  /*      The file offset where the resource data starts.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  FT_Err_Ok means success.                     */
+  /*                                                                       */
+  FT_BASE( FT_Error )
+  FT_Raccess_Get_HeaderInfo( FT_Library  library,
+                             FT_Stream   stream,
+                             FT_Long     rfork_offset,
+                             FT_Long    *map_offset,
+                             FT_Long    *rdata_pos );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Raccess_Get_DataOffsets                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the data offsets for a tag in a resource fork.  Offsets are    */
+  /*    stored in an array because, in some cases, resources in a resource */
+  /*    fork have the same tag.                                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library ::                                                         */
+  /*      A FreeType library instance.                                     */
+  /*                                                                       */
+  /*    stream ::                                                          */
+  /*      A file stream containing the resource fork.                      */
+  /*                                                                       */
+  /*    map_offset ::                                                      */
+  /*      The file offset where the resource map starts.                   */
+  /*                                                                       */
+  /*    rdata_pos ::                                                       */
+  /*      The file offset where the resource data starts.                  */
+  /*                                                                       */
+  /*    tag ::                                                             */
+  /*      The resource tag.                                                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    offsets ::                                                         */
+  /*      The stream offsets for the resource data specified by `tag'.     */
+  /*      This array is allocated by the function, so you have to call     */
+  /*      @ft_mem_free after use.                                          */
+  /*                                                                       */
+  /*    count ::                                                           */
+  /*      The length of offsets array.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  FT_Err_Ok means success.                     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Normally you should use `FT_Raccess_Get_HeaderInfo' to get the     */
+  /*    value for `map_offset' and `rdata_pos'.                            */
+  /*                                                                       */
+  FT_BASE( FT_Error )
+  FT_Raccess_Get_DataOffsets( FT_Library  library,
+                              FT_Stream   stream,
+                              FT_Long     map_offset,
+                              FT_Long     rdata_pos,
+                              FT_Long     tag,
+                              FT_Long   **offsets,
+                              FT_Long    *count );
+
+
+FT_END_HEADER
+
+#endif /* __FTRFORK_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/ftserv.h b/include/freetype/internal/ftserv.h
new file mode 100644 (file)
index 0000000..4f481db
--- /dev/null
@@ -0,0 +1,688 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftserv.h                                                               */
+/*                                                                         */
+/*    The FreeType services (specification only).                          */
+/*                                                                         */
+/*  Copyright 2003-2007, 2009, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Each module can export one or more `services'.  Each service is      */
+  /*  identified by a constant string and modeled by a pointer; the latter */
+  /*  generally corresponds to a structure containing function pointers.   */
+  /*                                                                       */
+  /*  Note that a service's data cannot be a mere function pointer because */
+  /*  in C it is possible that function pointers might be implemented      */
+  /*  differently than data pointers (e.g. 48 bits instead of 32).         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTSERV_H__
+#define __FTSERV_H__
+
+
+FT_BEGIN_HEADER
+
+#if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */
+
+  /* we disable the warning `conditional expression is constant' here */
+  /* in order to compile cleanly with the maximum level of warnings   */
+#pragma warning( disable : 4127 )
+
+#endif /* _MSC_VER */
+
+  /*
+   * @macro:
+   *   FT_FACE_FIND_SERVICE
+   *
+   * @description:
+   *   This macro is used to look up a service from a face's driver module.
+   *
+   * @input:
+   *   face ::
+   *     The source face handle.
+   *
+   *   id ::
+   *     A string describing the service as defined in the service's
+   *     header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
+   *     `multi-masters').  It is automatically prefixed with
+   *     `FT_SERVICE_ID_'.
+   *
+   * @output:
+   *   ptr ::
+   *     A variable that receives the service pointer.  Will be NULL
+   *     if not found.
+   */
+#ifdef __cplusplus
+
+#define FT_FACE_FIND_SERVICE( face, ptr, id )                               \
+  FT_BEGIN_STMNT                                                            \
+    FT_Module    module = FT_MODULE( FT_FACE( face )->driver );             \
+    FT_Pointer   _tmp_  = NULL;                                             \
+    FT_Pointer*  _pptr_ = (FT_Pointer*)&(ptr);                              \
+                                                                            \
+                                                                            \
+    if ( module->clazz->get_interface )                                     \
+      _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
+    *_pptr_ = _tmp_;                                                        \
+  FT_END_STMNT
+
+#else /* !C++ */
+
+#define FT_FACE_FIND_SERVICE( face, ptr, id )                               \
+  FT_BEGIN_STMNT                                                            \
+    FT_Module   module = FT_MODULE( FT_FACE( face )->driver );              \
+    FT_Pointer  _tmp_  = NULL;                                              \
+                                                                            \
+    if ( module->clazz->get_interface )                                     \
+      _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
+    ptr = _tmp_;                                                            \
+  FT_END_STMNT
+
+#endif /* !C++ */
+
+  /*
+   * @macro:
+   *   FT_FACE_FIND_GLOBAL_SERVICE
+   *
+   * @description:
+   *   This macro is used to look up a service from all modules.
+   *
+   * @input:
+   *   face ::
+   *     The source face handle.
+   *
+   *   id ::
+   *     A string describing the service as defined in the service's
+   *     header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
+   *     `multi-masters').  It is automatically prefixed with
+   *     `FT_SERVICE_ID_'.
+   *
+   * @output:
+   *   ptr ::
+   *     A variable that receives the service pointer.  Will be NULL
+   *     if not found.
+   */
+#ifdef __cplusplus
+
+#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id )               \
+  FT_BEGIN_STMNT                                                   \
+    FT_Module    module = FT_MODULE( FT_FACE( face )->driver );    \
+    FT_Pointer   _tmp_;                                            \
+    FT_Pointer*  _pptr_ = (FT_Pointer*)&(ptr);                     \
+                                                                   \
+                                                                   \
+    _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \
+    *_pptr_ = _tmp_;                                               \
+  FT_END_STMNT
+
+#else /* !C++ */
+
+#define FT_FACE_FIND_GLOBAL_SERVICE( face, ptr, id )               \
+  FT_BEGIN_STMNT                                                   \
+    FT_Module   module = FT_MODULE( FT_FACE( face )->driver );     \
+    FT_Pointer  _tmp_;                                             \
+                                                                   \
+                                                                   \
+    _tmp_ = ft_module_get_service( module, FT_SERVICE_ID_ ## id ); \
+    ptr   = _tmp_;                                                 \
+  FT_END_STMNT
+
+#endif /* !C++ */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****         S E R V I C E   D E S C R I P T O R S                 *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*
+   *  The following structure is used to _describe_ a given service
+   *  to the library.  This is useful to build simple static service lists.
+   */
+  typedef struct  FT_ServiceDescRec_
+  {
+    const char*  serv_id;     /* service name         */
+    const void*  serv_data;   /* service pointer/data */
+
+  } FT_ServiceDescRec;
+
+  typedef const FT_ServiceDescRec*  FT_ServiceDesc;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Macro>                                                               */
+  /*    FT_DEFINE_SERVICEDESCREC1 .. FT_DEFINE_SERVICEDESCREC6             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Used to initialize an array of FT_ServiceDescRec structures.       */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is defined a `create' function needs to  */
+  /*    be called with a pointer to return an allocated array.  As soon as */
+  /*    it is no longer needed, a `destroy' function needs to be called to */
+  /*    release that allocation.                                           */
+  /*                                                                       */
+  /*    These functions should be manually called from the `pic_init' and  */
+  /*    `pic_free' functions of your module (see FT_DEFINE_MODULE).        */
+  /*                                                                       */
+  /*    When FT_CONFIG_OPTION_PIC is not defined the array will be         */
+  /*    allocated in the global scope (or the scope where the macro is     */
+  /*    used).                                                             */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICEDESCREC1( class_,                                  \
+                                   serv_id_1, serv_data_1 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC2( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC3( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { serv_id_3, serv_data_3 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC4( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { serv_id_3, serv_data_3 },                                             \
+    { serv_id_4, serv_data_4 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC5( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { serv_id_3, serv_data_3 },                                             \
+    { serv_id_4, serv_data_4 },                                             \
+    { serv_id_5, serv_data_5 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#define FT_DEFINE_SERVICEDESCREC6( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5,                  \
+                                   serv_id_6, serv_data_6 )                 \
+  static const FT_ServiceDescRec  class_[] =                                \
+  {                                                                         \
+    { serv_id_1, serv_data_1 },                                             \
+    { serv_id_2, serv_data_2 },                                             \
+    { serv_id_3, serv_data_3 },                                             \
+    { serv_id_4, serv_data_4 },                                             \
+    { serv_id_5, serv_data_5 },                                             \
+    { serv_id_6, serv_data_6 },                                             \
+    { NULL, NULL }                                                          \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICEDESCREC1( class_,                                  \
+                                   serv_id_1, serv_data_1 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class )           \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz;                                              \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 2 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = NULL;                                              \
+    clazz[1].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC2( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class )           \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz;                                              \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 3 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = NULL;                                              \
+    clazz[2].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC3( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class )           \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz;                                              \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 4 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = serv_id_3;                                         \
+    clazz[2].serv_data = serv_data_3;                                       \
+    clazz[3].serv_id   = NULL;                                              \
+    clazz[3].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC4( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class )           \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz;                                              \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 5 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = serv_id_3;                                         \
+    clazz[2].serv_data = serv_data_3;                                       \
+    clazz[3].serv_id   = serv_id_4;                                         \
+    clazz[3].serv_data = serv_data_4;                                       \
+    clazz[4].serv_id   = NULL;                                              \
+    clazz[4].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC5( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class )           \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz;                                              \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 6 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = serv_id_3;                                         \
+    clazz[2].serv_data = serv_data_3;                                       \
+    clazz[3].serv_id   = serv_id_4;                                         \
+    clazz[3].serv_data = serv_data_4;                                       \
+    clazz[4].serv_id   = serv_id_5;                                         \
+    clazz[4].serv_data = serv_data_5;                                       \
+    clazz[5].serv_id   = NULL;                                              \
+    clazz[5].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#define FT_DEFINE_SERVICEDESCREC6( class_,                                  \
+                                   serv_id_1, serv_data_1,                  \
+                                   serv_id_2, serv_data_2,                  \
+                                   serv_id_3, serv_data_3,                  \
+                                   serv_id_4, serv_data_4,                  \
+                                   serv_id_5, serv_data_5,                  \
+                                   serv_id_6, serv_data_6 )                 \
+  void                                                                      \
+  FT_Destroy_Class_ ## class_( FT_Library          library,                 \
+                               FT_ServiceDescRec*  clazz )                  \
+  {                                                                         \
+    FT_Memory  memory = library->memory;                                    \
+                                                                            \
+                                                                            \
+    if ( clazz )                                                            \
+      FT_FREE( clazz );                                                     \
+  }                                                                         \
+                                                                            \
+  FT_Error                                                                  \
+  FT_Create_Class_ ## class_( FT_Library           library,                 \
+                              FT_ServiceDescRec**  output_class)            \
+  {                                                                         \
+    FT_ServiceDescRec*  clazz;                                              \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 7 ) )                         \
+      return error;                                                         \
+                                                                            \
+    clazz[0].serv_id   = serv_id_1;                                         \
+    clazz[0].serv_data = serv_data_1;                                       \
+    clazz[1].serv_id   = serv_id_2;                                         \
+    clazz[1].serv_data = serv_data_2;                                       \
+    clazz[2].serv_id   = serv_id_3;                                         \
+    clazz[2].serv_data = serv_data_3;                                       \
+    clazz[3].serv_id   = serv_id_4;                                         \
+    clazz[3].serv_data = serv_data_4;                                       \
+    clazz[4].serv_id   = serv_id_5;                                         \
+    clazz[4].serv_data = serv_data_5;                                       \
+    clazz[5].serv_id   = serv_id_6;                                         \
+    clazz[5].serv_data = serv_data_6;                                       \
+    clazz[6].serv_id   = NULL;                                              \
+    clazz[6].serv_data = NULL;                                              \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+  /*
+   *  Parse a list of FT_ServiceDescRec descriptors and look for
+   *  a specific service by ID.  Note that the last element in the
+   *  array must be { NULL, NULL }, and that the function should
+   *  return NULL if the service isn't available.
+   *
+   *  This function can be used by modules to implement their
+   *  `get_service' method.
+   */
+  FT_BASE( FT_Pointer )
+  ft_service_list_lookup( FT_ServiceDesc  service_descriptors,
+                          const char*     service_id );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****             S E R V I C E S   C A C H E                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*
+   *  This structure is used to store a cache for several frequently used
+   *  services.  It is the type of `face->internal->services'.  You
+   *  should only use FT_FACE_LOOKUP_SERVICE to access it.
+   *
+   *  All fields should have the type FT_Pointer to relax compilation
+   *  dependencies.  We assume the developer isn't completely stupid.
+   *
+   *  Each field must be named `service_XXXX' where `XXX' corresponds to
+   *  the correct FT_SERVICE_ID_XXXX macro.  See the definition of
+   *  FT_FACE_LOOKUP_SERVICE below how this is implemented.
+   *
+   */
+  typedef struct  FT_ServiceCacheRec_
+  {
+    FT_Pointer  service_POSTSCRIPT_FONT_NAME;
+    FT_Pointer  service_MULTI_MASTERS;
+    FT_Pointer  service_GLYPH_DICT;
+    FT_Pointer  service_PFR_METRICS;
+    FT_Pointer  service_WINFNT;
+
+  } FT_ServiceCacheRec, *FT_ServiceCache;
+
+
+  /*
+   *  A magic number used within the services cache.
+   */
+#define FT_SERVICE_UNAVAILABLE  ((FT_Pointer)-2)  /* magic number */
+
+
+  /*
+   * @macro:
+   *   FT_FACE_LOOKUP_SERVICE
+   *
+   * @description:
+   *   This macro is used to lookup a service from a face's driver module
+   *   using its cache.
+   *
+   * @input:
+   *   face::
+   *     The source face handle containing the cache.
+   *
+   *   field ::
+   *     The field name in the cache.
+   *
+   *   id ::
+   *     The service ID.
+   *
+   * @output:
+   *   ptr ::
+   *     A variable receiving the service data.  NULL if not available.
+   */
+#ifdef __cplusplus
+
+#define FT_FACE_LOOKUP_SERVICE( face, ptr, id )                \
+  FT_BEGIN_STMNT                                               \
+    FT_Pointer   svc;                                          \
+    FT_Pointer*  Pptr = (FT_Pointer*)&(ptr);                   \
+                                                               \
+                                                               \
+    svc = FT_FACE( face )->internal->services. service_ ## id; \
+    if ( svc == FT_SERVICE_UNAVAILABLE )                       \
+      svc = NULL;                                              \
+    else if ( svc == NULL )                                    \
+    {                                                          \
+      FT_FACE_FIND_SERVICE( face, svc, id );                   \
+                                                               \
+      FT_FACE( face )->internal->services. service_ ## id =    \
+        (FT_Pointer)( svc != NULL ? svc                        \
+                                  : FT_SERVICE_UNAVAILABLE );  \
+    }                                                          \
+    *Pptr = svc;                                               \
+  FT_END_STMNT
+
+#else /* !C++ */
+
+#define FT_FACE_LOOKUP_SERVICE( face, ptr, id )                \
+  FT_BEGIN_STMNT                                               \
+    FT_Pointer  svc;                                           \
+                                                               \
+                                                               \
+    svc = FT_FACE( face )->internal->services. service_ ## id; \
+    if ( svc == FT_SERVICE_UNAVAILABLE )                       \
+      svc = NULL;                                              \
+    else if ( svc == NULL )                                    \
+    {                                                          \
+      FT_FACE_FIND_SERVICE( face, svc, id );                   \
+                                                               \
+      FT_FACE( face )->internal->services. service_ ## id =    \
+        (FT_Pointer)( svc != NULL ? svc                        \
+                                  : FT_SERVICE_UNAVAILABLE );  \
+    }                                                          \
+    ptr = svc;                                                 \
+  FT_END_STMNT
+
+#endif /* !C++ */
+
+  /*
+   *  A macro used to define new service structure types.
+   */
+
+#define FT_DEFINE_SERVICE( name )            \
+  typedef struct FT_Service_ ## name ## Rec_ \
+    FT_Service_ ## name ## Rec ;             \
+  typedef struct FT_Service_ ## name ## Rec_ \
+    const * FT_Service_ ## name ;            \
+  struct FT_Service_ ## name ## Rec_
+
+  /* */
+
+  /*
+   *  The header files containing the services.
+   */
+
+#define FT_SERVICE_BDF_H                <freetype/internal/services/svbdf.h>
+#define FT_SERVICE_CID_H                <freetype/internal/services/svcid.h>
+#define FT_SERVICE_GLYPH_DICT_H         <freetype/internal/services/svgldict.h>
+#define FT_SERVICE_GX_VALIDATE_H        <freetype/internal/services/svgxval.h>
+#define FT_SERVICE_KERNING_H            <freetype/internal/services/svkern.h>
+#define FT_SERVICE_MULTIPLE_MASTERS_H   <freetype/internal/services/svmm.h>
+#define FT_SERVICE_OPENTYPE_VALIDATE_H  <freetype/internal/services/svotval.h>
+#define FT_SERVICE_PFR_H                <freetype/internal/services/svpfr.h>
+#define FT_SERVICE_POSTSCRIPT_CMAPS_H   <freetype/internal/services/svpscmap.h>
+#define FT_SERVICE_POSTSCRIPT_INFO_H    <freetype/internal/services/svpsinfo.h>
+#define FT_SERVICE_POSTSCRIPT_NAME_H    <freetype/internal/services/svpostnm.h>
+#define FT_SERVICE_SFNT_H               <freetype/internal/services/svsfnt.h>
+#define FT_SERVICE_TRUETYPE_ENGINE_H    <freetype/internal/services/svtteng.h>
+#define FT_SERVICE_TT_CMAP_H            <freetype/internal/services/svttcmap.h>
+#define FT_SERVICE_WINFNT_H             <freetype/internal/services/svwinfnt.h>
+#define FT_SERVICE_XFREE86_NAME_H       <freetype/internal/services/svxf86nm.h>
+#define FT_SERVICE_TRUETYPE_GLYF_H      <freetype/internal/services/svttglyf.h>
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTSERV_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/ftstream.h b/include/freetype/internal/ftstream.h
new file mode 100644 (file)
index 0000000..8b18500
--- /dev/null
@@ -0,0 +1,539 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftstream.h                                                             */
+/*                                                                         */
+/*    Stream handling (specification).                                     */
+/*                                                                         */
+/*  Copyright 1996-2002, 2004-2006, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTSTREAM_H__
+#define __FTSTREAM_H__
+
+
+#include <ft2build.h>
+#include FT_SYSTEM_H
+#include FT_INTERNAL_OBJECTS_H
+
+
+FT_BEGIN_HEADER
+
+
+  /* format of an 8-bit frame_op value:           */
+  /*                                              */
+  /* bit  76543210                                */
+  /*      xxxxxxes                                */
+  /*                                              */
+  /* s is set to 1 if the value is signed.        */
+  /* e is set to 1 if the value is little-endian. */
+  /* xxx is a command.                            */
+
+#define FT_FRAME_OP_SHIFT         2
+#define FT_FRAME_OP_SIGNED        1
+#define FT_FRAME_OP_LITTLE        2
+#define FT_FRAME_OP_COMMAND( x )  ( x >> FT_FRAME_OP_SHIFT )
+
+#define FT_MAKE_FRAME_OP( command, little, sign ) \
+          ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign )
+
+#define FT_FRAME_OP_END    0
+#define FT_FRAME_OP_START  1  /* start a new frame     */
+#define FT_FRAME_OP_BYTE   2  /* read 1-byte value     */
+#define FT_FRAME_OP_SHORT  3  /* read 2-byte value     */
+#define FT_FRAME_OP_LONG   4  /* read 4-byte value     */
+#define FT_FRAME_OP_OFF3   5  /* read 3-byte value     */
+#define FT_FRAME_OP_BYTES  6  /* read a bytes sequence */
+
+
+  typedef enum  FT_Frame_Op_
+  {
+    ft_frame_end       = 0,
+    ft_frame_start     = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ),
+
+    ft_frame_byte      = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE,  0, 0 ),
+    ft_frame_schar     = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE,  0, 1 ),
+
+    ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ),
+    ft_frame_short_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ),
+    ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ),
+    ft_frame_short_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ),
+
+    ft_frame_ulong_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ),
+    ft_frame_long_be   = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ),
+    ft_frame_ulong_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ),
+    ft_frame_long_le   = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ),
+
+    ft_frame_uoff3_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ),
+    ft_frame_off3_be   = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ),
+    ft_frame_uoff3_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ),
+    ft_frame_off3_le   = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ),
+
+    ft_frame_bytes     = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ),
+    ft_frame_skip      = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 )
+
+  } FT_Frame_Op;
+
+
+  typedef struct  FT_Frame_Field_
+  {
+    FT_Byte    value;
+    FT_Byte    size;
+    FT_UShort  offset;
+
+  } FT_Frame_Field;
+
+
+  /* Construct an FT_Frame_Field out of a structure type and a field name. */
+  /* The structure type must be set in the FT_STRUCTURE macro before       */
+  /* calling the FT_FRAME_START() macro.                                   */
+  /*                                                                       */
+#define FT_FIELD_SIZE( f ) \
+          (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f )
+
+#define FT_FIELD_SIZE_DELTA( f ) \
+          (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] )
+
+#define FT_FIELD_OFFSET( f ) \
+          (FT_UShort)( offsetof( FT_STRUCTURE, f ) )
+
+#define FT_FRAME_FIELD( frame_op, field ) \
+          {                               \
+            frame_op,                     \
+            FT_FIELD_SIZE( field ),       \
+            FT_FIELD_OFFSET( field )      \
+          }
+
+#define FT_MAKE_EMPTY_FIELD( frame_op )  { frame_op, 0, 0 }
+
+#define FT_FRAME_START( size )   { ft_frame_start, 0, size }
+#define FT_FRAME_END             { ft_frame_end, 0, 0 }
+
+#define FT_FRAME_LONG( f )       FT_FRAME_FIELD( ft_frame_long_be, f )
+#define FT_FRAME_ULONG( f )      FT_FRAME_FIELD( ft_frame_ulong_be, f )
+#define FT_FRAME_SHORT( f )      FT_FRAME_FIELD( ft_frame_short_be, f )
+#define FT_FRAME_USHORT( f )     FT_FRAME_FIELD( ft_frame_ushort_be, f )
+#define FT_FRAME_OFF3( f )       FT_FRAME_FIELD( ft_frame_off3_be, f )
+#define FT_FRAME_UOFF3( f )      FT_FRAME_FIELD( ft_frame_uoff3_be, f )
+#define FT_FRAME_BYTE( f )       FT_FRAME_FIELD( ft_frame_byte, f )
+#define FT_FRAME_CHAR( f )       FT_FRAME_FIELD( ft_frame_schar, f )
+
+#define FT_FRAME_LONG_LE( f )    FT_FRAME_FIELD( ft_frame_long_le, f )
+#define FT_FRAME_ULONG_LE( f )   FT_FRAME_FIELD( ft_frame_ulong_le, f )
+#define FT_FRAME_SHORT_LE( f )   FT_FRAME_FIELD( ft_frame_short_le, f )
+#define FT_FRAME_USHORT_LE( f )  FT_FRAME_FIELD( ft_frame_ushort_le, f )
+#define FT_FRAME_OFF3_LE( f )    FT_FRAME_FIELD( ft_frame_off3_le, f )
+#define FT_FRAME_UOFF3_LE( f )   FT_FRAME_FIELD( ft_frame_uoff3_le, f )
+
+#define FT_FRAME_SKIP_LONG       { ft_frame_long_be, 0, 0 }
+#define FT_FRAME_SKIP_SHORT      { ft_frame_short_be, 0, 0 }
+#define FT_FRAME_SKIP_BYTE       { ft_frame_byte, 0, 0 }
+
+#define FT_FRAME_BYTES( field, count ) \
+          {                            \
+            ft_frame_bytes,            \
+            count,                     \
+            FT_FIELD_OFFSET( field )   \
+          }
+
+#define FT_FRAME_SKIP_BYTES( count )  { ft_frame_skip, count, 0 }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Integer extraction macros -- the `buffer' parameter must ALWAYS be of */
+  /* type `char*' or equivalent (1-byte elements).                         */
+  /*                                                                       */
+
+#define FT_BYTE_( p, i )  ( ((const FT_Byte*)(p))[(i)] )
+#define FT_INT8_( p, i )  ( ((const FT_Char*)(p))[(i)] )
+
+#define FT_INT16( x )   ( (FT_Int16)(x)  )
+#define FT_UINT16( x )  ( (FT_UInt16)(x) )
+#define FT_INT32( x )   ( (FT_Int32)(x)  )
+#define FT_UINT32( x )  ( (FT_UInt32)(x) )
+
+#define FT_BYTE_I16( p, i, s )  ( FT_INT16(  FT_BYTE_( p, i ) ) << (s) )
+#define FT_BYTE_U16( p, i, s )  ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) )
+#define FT_BYTE_I32( p, i, s )  ( FT_INT32(  FT_BYTE_( p, i ) ) << (s) )
+#define FT_BYTE_U32( p, i, s )  ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) )
+
+#define FT_INT8_I16( p, i, s )  ( FT_INT16(  FT_INT8_( p, i ) ) << (s) )
+#define FT_INT8_U16( p, i, s )  ( FT_UINT16( FT_INT8_( p, i ) ) << (s) )
+#define FT_INT8_I32( p, i, s )  ( FT_INT32(  FT_INT8_( p, i ) ) << (s) )
+#define FT_INT8_U32( p, i, s )  ( FT_UINT32( FT_INT8_( p, i ) ) << (s) )
+
+
+#define FT_PEEK_SHORT( p )  FT_INT16( FT_INT8_I16( p, 0, 8) | \
+                                      FT_BYTE_I16( p, 1, 0) )
+
+#define FT_PEEK_USHORT( p )  FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \
+                                        FT_BYTE_U16( p, 1, 0 ) )
+
+#define FT_PEEK_LONG( p )  FT_INT32( FT_INT8_I32( p, 0, 24 ) | \
+                                     FT_BYTE_I32( p, 1, 16 ) | \
+                                     FT_BYTE_I32( p, 2,  8 ) | \
+                                     FT_BYTE_I32( p, 3,  0 ) )
+
+#define FT_PEEK_ULONG( p )  FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \
+                                       FT_BYTE_U32( p, 1, 16 ) | \
+                                       FT_BYTE_U32( p, 2,  8 ) | \
+                                       FT_BYTE_U32( p, 3,  0 ) )
+
+#define FT_PEEK_OFF3( p )  FT_INT32( FT_INT8_I32( p, 0, 16 ) | \
+                                     FT_BYTE_I32( p, 1,  8 ) | \
+                                     FT_BYTE_I32( p, 2,  0 ) )
+
+#define FT_PEEK_UOFF3( p )  FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \
+                                       FT_BYTE_U32( p, 1,  8 ) | \
+                                       FT_BYTE_U32( p, 2,  0 ) )
+
+#define FT_PEEK_SHORT_LE( p )  FT_INT16( FT_INT8_I16( p, 1, 8 ) | \
+                                         FT_BYTE_I16( p, 0, 0 ) )
+
+#define FT_PEEK_USHORT_LE( p )  FT_UINT16( FT_BYTE_U16( p, 1, 8 ) |  \
+                                           FT_BYTE_U16( p, 0, 0 ) )
+
+#define FT_PEEK_LONG_LE( p )  FT_INT32( FT_INT8_I32( p, 3, 24 ) | \
+                                        FT_BYTE_I32( p, 2, 16 ) | \
+                                        FT_BYTE_I32( p, 1,  8 ) | \
+                                        FT_BYTE_I32( p, 0,  0 ) )
+
+#define FT_PEEK_ULONG_LE( p )  FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \
+                                          FT_BYTE_U32( p, 2, 16 ) | \
+                                          FT_BYTE_U32( p, 1,  8 ) | \
+                                          FT_BYTE_U32( p, 0,  0 ) )
+
+#define FT_PEEK_OFF3_LE( p )  FT_INT32( FT_INT8_I32( p, 2, 16 ) | \
+                                        FT_BYTE_I32( p, 1,  8 ) | \
+                                        FT_BYTE_I32( p, 0,  0 ) )
+
+#define FT_PEEK_UOFF3_LE( p )  FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \
+                                          FT_BYTE_U32( p, 1,  8 ) | \
+                                          FT_BYTE_U32( p, 0,  0 ) )
+
+
+#define FT_NEXT_CHAR( buffer )       \
+          ( (signed char)*buffer++ )
+
+#define FT_NEXT_BYTE( buffer )         \
+          ( (unsigned char)*buffer++ )
+
+#define FT_NEXT_SHORT( buffer )                                   \
+          ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) )
+
+#define FT_NEXT_USHORT( buffer )                                            \
+          ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) )
+
+#define FT_NEXT_OFF3( buffer )                                  \
+          ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) )
+
+#define FT_NEXT_UOFF3( buffer )                                           \
+          ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) )
+
+#define FT_NEXT_LONG( buffer )                                  \
+          ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) )
+
+#define FT_NEXT_ULONG( buffer )                                           \
+          ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) )
+
+
+#define FT_NEXT_SHORT_LE( buffer )                                   \
+          ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) )
+
+#define FT_NEXT_USHORT_LE( buffer )                                            \
+          ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) )
+
+#define FT_NEXT_OFF3_LE( buffer )                                  \
+          ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) )
+
+#define FT_NEXT_UOFF3_LE( buffer )                                           \
+          ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) )
+
+#define FT_NEXT_LONG_LE( buffer )                                  \
+          ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) )
+
+#define FT_NEXT_ULONG_LE( buffer )                                           \
+          ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Each GET_xxxx() macro uses an implicit `stream' variable.             */
+  /*                                                                       */
+#if 0
+#define FT_GET_MACRO( type )    FT_NEXT_ ## type ( stream->cursor )
+
+#define FT_GET_CHAR()       FT_GET_MACRO( CHAR )
+#define FT_GET_BYTE()       FT_GET_MACRO( BYTE )
+#define FT_GET_SHORT()      FT_GET_MACRO( SHORT )
+#define FT_GET_USHORT()     FT_GET_MACRO( USHORT )
+#define FT_GET_OFF3()       FT_GET_MACRO( OFF3 )
+#define FT_GET_UOFF3()      FT_GET_MACRO( UOFF3 )
+#define FT_GET_LONG()       FT_GET_MACRO( LONG )
+#define FT_GET_ULONG()      FT_GET_MACRO( ULONG )
+#define FT_GET_TAG4()       FT_GET_MACRO( ULONG )
+
+#define FT_GET_SHORT_LE()   FT_GET_MACRO( SHORT_LE )
+#define FT_GET_USHORT_LE()  FT_GET_MACRO( USHORT_LE )
+#define FT_GET_LONG_LE()    FT_GET_MACRO( LONG_LE )
+#define FT_GET_ULONG_LE()   FT_GET_MACRO( ULONG_LE )
+
+#else
+#define FT_GET_MACRO( func, type )        ( (type)func( stream ) )
+
+#define FT_GET_CHAR()       FT_GET_MACRO( FT_Stream_GetChar, FT_Char )
+#define FT_GET_BYTE()       FT_GET_MACRO( FT_Stream_GetChar, FT_Byte )
+#define FT_GET_SHORT()      FT_GET_MACRO( FT_Stream_GetUShort, FT_Short )
+#define FT_GET_USHORT()     FT_GET_MACRO( FT_Stream_GetUShort, FT_UShort )
+#define FT_GET_OFF3()       FT_GET_MACRO( FT_Stream_GetUOffset, FT_Long )
+#define FT_GET_UOFF3()      FT_GET_MACRO( FT_Stream_GetUOffset, FT_ULong )
+#define FT_GET_LONG()       FT_GET_MACRO( FT_Stream_GetULong, FT_Long )
+#define FT_GET_ULONG()      FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )
+#define FT_GET_TAG4()       FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )
+
+#define FT_GET_SHORT_LE()   FT_GET_MACRO( FT_Stream_GetUShortLE, FT_Short )
+#define FT_GET_USHORT_LE()  FT_GET_MACRO( FT_Stream_GetUShortLE, FT_UShort )
+#define FT_GET_LONG_LE()    FT_GET_MACRO( FT_Stream_GetULongLE, FT_Long )
+#define FT_GET_ULONG_LE()   FT_GET_MACRO( FT_Stream_GetULongLE, FT_ULong )
+#endif
+
+#define FT_READ_MACRO( func, type, var )        \
+          ( var = (type)func( stream, &error ), \
+            error != FT_Err_Ok )
+
+#define FT_READ_BYTE( var )       FT_READ_MACRO( FT_Stream_ReadChar, FT_Byte, var )
+#define FT_READ_CHAR( var )       FT_READ_MACRO( FT_Stream_ReadChar, FT_Char, var )
+#define FT_READ_SHORT( var )      FT_READ_MACRO( FT_Stream_ReadUShort, FT_Short, var )
+#define FT_READ_USHORT( var )     FT_READ_MACRO( FT_Stream_ReadUShort, FT_UShort, var )
+#define FT_READ_OFF3( var )       FT_READ_MACRO( FT_Stream_ReadUOffset, FT_Long, var )
+#define FT_READ_UOFF3( var )      FT_READ_MACRO( FT_Stream_ReadUOffset, FT_ULong, var )
+#define FT_READ_LONG( var )       FT_READ_MACRO( FT_Stream_ReadULong, FT_Long, var )
+#define FT_READ_ULONG( var )      FT_READ_MACRO( FT_Stream_ReadULong, FT_ULong, var )
+
+#define FT_READ_SHORT_LE( var )   FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_Short, var )
+#define FT_READ_USHORT_LE( var )  FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_UShort, var )
+#define FT_READ_LONG_LE( var )    FT_READ_MACRO( FT_Stream_ReadULongLE, FT_Long, var )
+#define FT_READ_ULONG_LE( var )   FT_READ_MACRO( FT_Stream_ReadULongLE, FT_ULong, var )
+
+
+#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM
+
+  /* initialize a stream for reading a regular system stream */
+  FT_BASE( FT_Error )
+  FT_Stream_Open( FT_Stream    stream,
+                  const char*  filepathname );
+
+#endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
+
+
+  /* create a new (input) stream from an FT_Open_Args structure */
+  FT_BASE( FT_Error )
+  FT_Stream_New( FT_Library           library,
+                 const FT_Open_Args*  args,
+                 FT_Stream           *astream );
+
+  /* free a stream */
+  FT_BASE( void )
+  FT_Stream_Free( FT_Stream  stream,
+                  FT_Int     external );
+
+  /* initialize a stream for reading in-memory data */
+  FT_BASE( void )
+  FT_Stream_OpenMemory( FT_Stream       stream,
+                        const FT_Byte*  base,
+                        FT_ULong        size );
+
+  /* close a stream (does not destroy the stream structure) */
+  FT_BASE( void )
+  FT_Stream_Close( FT_Stream  stream );
+
+
+  /* seek within a stream. position is relative to start of stream */
+  FT_BASE( FT_Error )
+  FT_Stream_Seek( FT_Stream  stream,
+                  FT_ULong   pos );
+
+  /* skip bytes in a stream */
+  FT_BASE( FT_Error )
+  FT_Stream_Skip( FT_Stream  stream,
+                  FT_Long    distance );
+
+  /* return current stream position */
+  FT_BASE( FT_Long )
+  FT_Stream_Pos( FT_Stream  stream );
+
+  /* read bytes from a stream into a user-allocated buffer, returns an */
+  /* error if not all bytes could be read.                             */
+  FT_BASE( FT_Error )
+  FT_Stream_Read( FT_Stream  stream,
+                  FT_Byte*   buffer,
+                  FT_ULong   count );
+
+  /* read bytes from a stream at a given position */
+  FT_BASE( FT_Error )
+  FT_Stream_ReadAt( FT_Stream  stream,
+                    FT_ULong   pos,
+                    FT_Byte*   buffer,
+                    FT_ULong   count );
+
+  /* try to read bytes at the end of a stream; return number of bytes */
+  /* really available                                                 */
+  FT_BASE( FT_ULong )
+  FT_Stream_TryRead( FT_Stream  stream,
+                     FT_Byte*   buffer,
+                     FT_ULong   count );
+
+  /* Enter a frame of `count' consecutive bytes in a stream.  Returns an */
+  /* error if the frame could not be read/accessed.  The caller can use  */
+  /* the FT_Stream_Get_XXX functions to retrieve frame data without      */
+  /* error checks.                                                       */
+  /*                                                                     */
+  /* You must _always_ call FT_Stream_ExitFrame() once you have entered  */
+  /* a stream frame!                                                     */
+  /*                                                                     */
+  FT_BASE( FT_Error )
+  FT_Stream_EnterFrame( FT_Stream  stream,
+                        FT_ULong   count );
+
+  /* exit a stream frame */
+  FT_BASE( void )
+  FT_Stream_ExitFrame( FT_Stream  stream );
+
+  /* Extract a stream frame.  If the stream is disk-based, a heap block */
+  /* is allocated and the frame bytes are read into it.  If the stream  */
+  /* is memory-based, this function simply set a pointer to the data.   */
+  /*                                                                    */
+  /* Useful to optimize access to memory-based streams transparently.   */
+  /*                                                                    */
+  /* All extracted frames must be `freed' with a call to the function   */
+  /* FT_Stream_ReleaseFrame().                                          */
+  /*                                                                    */
+  FT_BASE( FT_Error )
+  FT_Stream_ExtractFrame( FT_Stream  stream,
+                          FT_ULong   count,
+                          FT_Byte**  pbytes );
+
+  /* release an extract frame (see FT_Stream_ExtractFrame) */
+  FT_BASE( void )
+  FT_Stream_ReleaseFrame( FT_Stream  stream,
+                          FT_Byte**  pbytes );
+
+  /* read a byte from an entered frame */
+  FT_BASE( FT_Char )
+  FT_Stream_GetChar( FT_Stream  stream );
+
+  /* read a 16-bit big-endian unsigned integer from an entered frame */
+  FT_BASE( FT_UShort )
+  FT_Stream_GetUShort( FT_Stream  stream );
+
+  /* read a 24-bit big-endian unsigned integer from an entered frame */
+  FT_BASE( FT_ULong )
+  FT_Stream_GetUOffset( FT_Stream  stream );
+
+  /* read a 32-bit big-endian unsigned integer from an entered frame */
+  FT_BASE( FT_ULong )
+  FT_Stream_GetULong( FT_Stream  stream );
+
+  /* read a 16-bit little-endian unsigned integer from an entered frame */
+  FT_BASE( FT_UShort )
+  FT_Stream_GetUShortLE( FT_Stream  stream );
+
+  /* read a 32-bit little-endian unsigned integer from an entered frame */
+  FT_BASE( FT_ULong )
+  FT_Stream_GetULongLE( FT_Stream  stream );
+
+
+  /* read a byte from a stream */
+  FT_BASE( FT_Char )
+  FT_Stream_ReadChar( FT_Stream  stream,
+                      FT_Error*  error );
+
+  /* read a 16-bit big-endian unsigned integer from a stream */
+  FT_BASE( FT_UShort )
+  FT_Stream_ReadUShort( FT_Stream  stream,
+                        FT_Error*  error );
+
+  /* read a 24-bit big-endian unsigned integer from a stream */
+  FT_BASE( FT_ULong )
+  FT_Stream_ReadUOffset( FT_Stream  stream,
+                         FT_Error*  error );
+
+  /* read a 32-bit big-endian integer from a stream */
+  FT_BASE( FT_ULong )
+  FT_Stream_ReadULong( FT_Stream  stream,
+                       FT_Error*  error );
+
+  /* read a 16-bit little-endian unsigned integer from a stream */
+  FT_BASE( FT_UShort )
+  FT_Stream_ReadUShortLE( FT_Stream  stream,
+                          FT_Error*  error );
+
+  /* read a 32-bit little-endian unsigned integer from a stream */
+  FT_BASE( FT_ULong )
+  FT_Stream_ReadULongLE( FT_Stream  stream,
+                         FT_Error*  error );
+
+  /* Read a structure from a stream.  The structure must be described */
+  /* by an array of FT_Frame_Field records.                           */
+  FT_BASE( FT_Error )
+  FT_Stream_ReadFields( FT_Stream              stream,
+                        const FT_Frame_Field*  fields,
+                        void*                  structure );
+
+
+#define FT_STREAM_POS()           \
+          FT_Stream_Pos( stream )
+
+#define FT_STREAM_SEEK( position )                           \
+          FT_SET_ERROR( FT_Stream_Seek( stream, position ) )
+
+#define FT_STREAM_SKIP( distance )                           \
+          FT_SET_ERROR( FT_Stream_Skip( stream, distance ) )
+
+#define FT_STREAM_READ( buffer, count )                   \
+          FT_SET_ERROR( FT_Stream_Read( stream,           \
+                                        (FT_Byte*)buffer, \
+                                        count ) )
+
+#define FT_STREAM_READ_AT( position, buffer, count )         \
+          FT_SET_ERROR( FT_Stream_ReadAt( stream,            \
+                                           position,         \
+                                           (FT_Byte*)buffer, \
+                                           count ) )
+
+#define FT_STREAM_READ_FIELDS( fields, object )                          \
+          FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) )
+
+
+#define FT_FRAME_ENTER( size )                                       \
+          FT_SET_ERROR(                                              \
+            FT_DEBUG_INNER( FT_Stream_EnterFrame( stream, size ) ) )
+
+#define FT_FRAME_EXIT()                 \
+          FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) )
+
+#define FT_FRAME_EXTRACT( size, bytes )                                       \
+          FT_SET_ERROR(                                                       \
+            FT_DEBUG_INNER( FT_Stream_ExtractFrame( stream, size,             \
+                                                    (FT_Byte**)&(bytes) ) ) )
+
+#define FT_FRAME_RELEASE( bytes )                                         \
+          FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream,                 \
+                                                  (FT_Byte**)&(bytes) ) )
+
+
+FT_END_HEADER
+
+#endif /* __FTSTREAM_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/fttrace.h b/include/freetype/internal/fttrace.h
new file mode 100644 (file)
index 0000000..fbefdbd
--- /dev/null
@@ -0,0 +1,144 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fttrace.h                                                              */
+/*                                                                         */
+/*    Tracing handling (specification only).                               */
+/*                                                                         */
+/*  Copyright 2002, 2004-2007, 2009, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /* definitions of trace levels for FreeType 2 */
+
+  /* the first level must always be `trace_any' */
+FT_TRACE_DEF( any )
+
+  /* base components */
+FT_TRACE_DEF( calc )      /* calculations            (ftcalc.c)   */
+FT_TRACE_DEF( memory )    /* memory manager          (ftobjs.c)   */
+FT_TRACE_DEF( stream )    /* stream manager          (ftstream.c) */
+FT_TRACE_DEF( io )        /* i/o interface           (ftsystem.c) */
+FT_TRACE_DEF( list )      /* list management         (ftlist.c)   */
+FT_TRACE_DEF( init )      /* initialization          (ftinit.c)   */
+FT_TRACE_DEF( objs )      /* base objects            (ftobjs.c)   */
+FT_TRACE_DEF( outline )   /* outline management      (ftoutln.c)  */
+FT_TRACE_DEF( glyph )     /* glyph management        (ftglyph.c)  */
+FT_TRACE_DEF( gloader )   /* glyph loader            (ftgloadr.c) */
+
+FT_TRACE_DEF( raster )    /* monochrome rasterizer   (ftraster.c) */
+FT_TRACE_DEF( smooth )    /* anti-aliasing raster    (ftgrays.c)  */
+FT_TRACE_DEF( mm )        /* MM interface            (ftmm.c)     */
+FT_TRACE_DEF( raccess )   /* resource fork accessor  (ftrfork.c)  */
+FT_TRACE_DEF( synth )     /* bold/slant synthesizer  (ftsynth.c)  */
+
+  /* Cache sub-system */
+FT_TRACE_DEF( cache )     /* cache sub-system        (ftcache.c, etc.) */
+
+  /* SFNT driver components */
+FT_TRACE_DEF( sfdriver )  /* SFNT font driver        (sfdriver.c) */
+FT_TRACE_DEF( sfobjs )    /* SFNT object handler     (sfobjs.c)   */
+FT_TRACE_DEF( ttcmap )    /* charmap handler         (ttcmap.c)   */
+FT_TRACE_DEF( ttkern )    /* kerning handler         (ttkern.c)   */
+FT_TRACE_DEF( ttload )    /* basic TrueType tables   (ttload.c)   */
+FT_TRACE_DEF( ttmtx )     /* metrics-related tables  (ttmtx.c)    */
+FT_TRACE_DEF( ttpost )    /* PS table processing     (ttpost.c)   */
+FT_TRACE_DEF( ttsbit )    /* TrueType sbit handling  (ttsbit.c)   */
+FT_TRACE_DEF( ttbdf )     /* TrueType embedded BDF   (ttbdf.c)    */
+
+  /* TrueType driver components */
+FT_TRACE_DEF( ttdriver )  /* TT font driver          (ttdriver.c) */
+FT_TRACE_DEF( ttgload )   /* TT glyph loader         (ttgload.c)  */
+FT_TRACE_DEF( ttinterp )  /* bytecode interpreter    (ttinterp.c) */
+FT_TRACE_DEF( ttobjs )    /* TT objects manager      (ttobjs.c)   */
+FT_TRACE_DEF( ttpload )   /* TT data/program loader  (ttpload.c)  */
+FT_TRACE_DEF( ttgxvar )   /* TrueType GX var handler (ttgxvar.c)  */
+
+  /* Type 1 driver components */
+FT_TRACE_DEF( t1afm )
+FT_TRACE_DEF( t1driver )
+FT_TRACE_DEF( t1gload )
+FT_TRACE_DEF( t1hint )
+FT_TRACE_DEF( t1load )
+FT_TRACE_DEF( t1objs )
+FT_TRACE_DEF( t1parse )
+
+  /* PostScript helper module `psaux' */
+FT_TRACE_DEF( t1decode )
+FT_TRACE_DEF( psobjs )
+
+  /* PostScript hinting module `pshinter' */
+FT_TRACE_DEF( pshrec )
+FT_TRACE_DEF( pshalgo1 )
+FT_TRACE_DEF( pshalgo2 )
+
+  /* Type 2 driver components */
+FT_TRACE_DEF( cffdriver )
+FT_TRACE_DEF( cffgload )
+FT_TRACE_DEF( cffload )
+FT_TRACE_DEF( cffobjs )
+FT_TRACE_DEF( cffparse )
+
+  /* Type 42 driver component */
+FT_TRACE_DEF( t42 )
+
+  /* CID driver components */
+FT_TRACE_DEF( cidafm )
+FT_TRACE_DEF( ciddriver )
+FT_TRACE_DEF( cidgload )
+FT_TRACE_DEF( cidload )
+FT_TRACE_DEF( cidobjs )
+FT_TRACE_DEF( cidparse )
+
+  /* Windows font component */
+FT_TRACE_DEF( winfnt )
+
+  /* PCF font components */
+FT_TRACE_DEF( pcfdriver )
+FT_TRACE_DEF( pcfread )
+
+  /* BDF font components */
+FT_TRACE_DEF( bdfdriver )
+FT_TRACE_DEF( bdflib )
+
+  /* PFR font component */
+FT_TRACE_DEF( pfr )
+
+  /* OpenType validation components */
+FT_TRACE_DEF( otvmodule )
+FT_TRACE_DEF( otvcommon )
+FT_TRACE_DEF( otvbase )
+FT_TRACE_DEF( otvgdef )
+FT_TRACE_DEF( otvgpos )
+FT_TRACE_DEF( otvgsub )
+FT_TRACE_DEF( otvjstf )
+FT_TRACE_DEF( otvmath )
+
+  /* TrueTypeGX/AAT validation components */
+FT_TRACE_DEF( gxvmodule )
+FT_TRACE_DEF( gxvcommon )
+FT_TRACE_DEF( gxvfeat )
+FT_TRACE_DEF( gxvmort )
+FT_TRACE_DEF( gxvmorx )
+FT_TRACE_DEF( gxvbsln )
+FT_TRACE_DEF( gxvjust )
+FT_TRACE_DEF( gxvkern )
+FT_TRACE_DEF( gxvopbd )
+FT_TRACE_DEF( gxvtrak )
+FT_TRACE_DEF( gxvprop )
+FT_TRACE_DEF( gxvlcar )
+
+  /* autofit components */
+FT_TRACE_DEF( afcjk )
+FT_TRACE_DEF( aflatin )
+FT_TRACE_DEF( aflatin2 )
+FT_TRACE_DEF( afwarp )
+
+/* END */
diff --git a/include/freetype/internal/ftvalid.h b/include/freetype/internal/ftvalid.h
new file mode 100644 (file)
index 0000000..00cd85e
--- /dev/null
@@ -0,0 +1,150 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftvalid.h                                                              */
+/*                                                                         */
+/*    FreeType validation support (specification).                         */
+/*                                                                         */
+/*  Copyright 2004 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTVALID_H__
+#define __FTVALID_H__
+
+#include <ft2build.h>
+#include FT_CONFIG_STANDARD_LIBRARY_H   /* for ft_setjmp and ft_longjmp */
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                    V A L I D A T I O N                          ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* handle to a validation object */
+  typedef struct FT_ValidatorRec_ volatile*  FT_Validator;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* There are three distinct validation levels defined here:              */
+  /*                                                                       */
+  /* FT_VALIDATE_DEFAULT ::                                                */
+  /*   A table that passes this validation level can be used reliably by   */
+  /*   FreeType.  It generally means that all offsets have been checked to */
+  /*   prevent out-of-bound reads, that array counts are correct, etc.     */
+  /*                                                                       */
+  /* FT_VALIDATE_TIGHT ::                                                  */
+  /*   A table that passes this validation level can be used reliably and  */
+  /*   doesn't contain invalid data.  For example, a charmap table that    */
+  /*   returns invalid glyph indices will not pass, even though it can     */
+  /*   be used with FreeType in default mode (the library will simply      */
+  /*   return an error later when trying to load the glyph).               */
+  /*                                                                       */
+  /*   It also checks that fields which must be a multiple of 2, 4, or 8,  */
+  /*   don't have incorrect values, etc.                                   */
+  /*                                                                       */
+  /* FT_VALIDATE_PARANOID ::                                               */
+  /*   Only for font debugging.  Checks that a table follows the           */
+  /*   specification by 100%.  Very few fonts will be able to pass this    */
+  /*   level anyway but it can be useful for certain tools like font       */
+  /*   editors/converters.                                                 */
+  /*                                                                       */
+  typedef enum  FT_ValidationLevel_
+  {
+    FT_VALIDATE_DEFAULT = 0,
+    FT_VALIDATE_TIGHT,
+    FT_VALIDATE_PARANOID
+
+  } FT_ValidationLevel;
+
+
+  /* validator structure */
+  typedef struct  FT_ValidatorRec_
+  {
+    const FT_Byte*      base;        /* address of table in memory       */
+    const FT_Byte*      limit;       /* `base' + sizeof(table) in memory */
+    FT_ValidationLevel  level;       /* validation level                 */
+    FT_Error            error;       /* error returned. 0 means success  */
+
+    ft_jmp_buf          jump_buffer; /* used for exception handling      */
+
+  } FT_ValidatorRec;
+
+
+#define FT_VALIDATOR( x )  ((FT_Validator)( x ))
+
+
+  FT_BASE( void )
+  ft_validator_init( FT_Validator        valid,
+                     const FT_Byte*      base,
+                     const FT_Byte*      limit,
+                     FT_ValidationLevel  level );
+
+  /* Do not use this. It's broken and will cause your validator to crash */
+  /* if you run it on an invalid font.                                   */
+  FT_BASE( FT_Int )
+  ft_validator_run( FT_Validator  valid );
+
+  /* Sets the error field in a validator, then calls `longjmp' to return */
+  /* to high-level caller.  Using `setjmp/longjmp' avoids many stupid    */
+  /* error checks within the validation routines.                        */
+  /*                                                                     */
+  FT_BASE( void )
+  ft_validator_error( FT_Validator  valid,
+                      FT_Error      error );
+
+
+  /* Calls ft_validate_error.  Assumes that the `valid' local variable */
+  /* holds a pointer to the current validator object.                  */
+  /*                                                                   */
+  /* Use preprocessor prescan to pass FT_ERR_PREFIX.                   */
+  /*                                                                   */
+#define FT_INVALID( _prefix, _error )  FT_INVALID_( _prefix, _error )
+#define FT_INVALID_( _prefix, _error ) \
+          ft_validator_error( valid, _prefix ## _error )
+
+  /* called when a broken table is detected */
+#define FT_INVALID_TOO_SHORT \
+          FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
+
+  /* called when an invalid offset is detected */
+#define FT_INVALID_OFFSET \
+          FT_INVALID( FT_ERR_PREFIX, Invalid_Offset )
+
+  /* called when an invalid format/value is detected */
+#define FT_INVALID_FORMAT \
+          FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
+
+  /* called when an invalid glyph index is detected */
+#define FT_INVALID_GLYPH_ID \
+          FT_INVALID( FT_ERR_PREFIX, Invalid_Glyph_Index )
+
+  /* called when an invalid field value is detected */
+#define FT_INVALID_DATA \
+          FT_INVALID( FT_ERR_PREFIX, Invalid_Table )
+
+
+FT_END_HEADER
+
+#endif /* __FTVALID_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/internal.h b/include/freetype/internal/internal.h
new file mode 100644 (file)
index 0000000..f500a65
--- /dev/null
@@ -0,0 +1,51 @@
+/***************************************************************************/
+/*                                                                         */
+/*  internal.h                                                             */
+/*                                                                         */
+/*    Internal header files (specification only).                          */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is automatically included by `ft2build.h'.                  */
+  /* Do not include it manually!                                           */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#define FT_INTERNAL_OBJECTS_H             <freetype/internal/ftobjs.h>
+#define FT_INTERNAL_PIC_H                 <freetype/internal/ftpic.h>
+#define FT_INTERNAL_STREAM_H              <freetype/internal/ftstream.h>
+#define FT_INTERNAL_MEMORY_H              <freetype/internal/ftmemory.h>
+#define FT_INTERNAL_DEBUG_H               <freetype/internal/ftdebug.h>
+#define FT_INTERNAL_CALC_H                <freetype/internal/ftcalc.h>
+#define FT_INTERNAL_DRIVER_H              <freetype/internal/ftdriver.h>
+#define FT_INTERNAL_TRACE_H               <freetype/internal/fttrace.h>
+#define FT_INTERNAL_GLYPH_LOADER_H        <freetype/internal/ftgloadr.h>
+#define FT_INTERNAL_SFNT_H                <freetype/internal/sfnt.h>
+#define FT_INTERNAL_SERVICE_H             <freetype/internal/ftserv.h>
+#define FT_INTERNAL_RFORK_H               <freetype/internal/ftrfork.h>
+#define FT_INTERNAL_VALIDATE_H            <freetype/internal/ftvalid.h>
+
+#define FT_INTERNAL_TRUETYPE_TYPES_H      <freetype/internal/tttypes.h>
+#define FT_INTERNAL_TYPE1_TYPES_H         <freetype/internal/t1types.h>
+
+#define FT_INTERNAL_POSTSCRIPT_AUX_H      <freetype/internal/psaux.h>
+#define FT_INTERNAL_POSTSCRIPT_HINTS_H    <freetype/internal/pshints.h>
+#define FT_INTERNAL_POSTSCRIPT_GLOBALS_H  <freetype/internal/psglobal.h>
+
+#define FT_INTERNAL_AUTOHINT_H            <freetype/internal/autohint.h>
+
+
+/* END */
diff --git a/include/freetype/internal/psaux.h b/include/freetype/internal/psaux.h
new file mode 100644 (file)
index 0000000..a96e0df
--- /dev/null
@@ -0,0 +1,873 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psaux.h                                                                */
+/*                                                                         */
+/*    Auxiliary functions and data structures related to PostScript fonts  */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSAUX_H__
+#define __PSAUX_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_TYPE1_TYPES_H
+#include FT_SERVICE_POSTSCRIPT_CMAPS_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                             T1_TABLE                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  typedef struct PS_TableRec_*              PS_Table;
+  typedef const struct PS_Table_FuncsRec_*  PS_Table_Funcs;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_Table_FuncsRec                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A set of function pointers to manage PS_Table objects.             */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    table_init    :: Used to initialize a table.                       */
+  /*                                                                       */
+  /*    table_done    :: Finalizes resp. destroy a given table.            */
+  /*                                                                       */
+  /*    table_add     :: Adds a new object to a table.                     */
+  /*                                                                       */
+  /*    table_release :: Releases table data, then finalizes it.           */
+  /*                                                                       */
+  typedef struct  PS_Table_FuncsRec_
+  {
+    FT_Error
+    (*init)( PS_Table   table,
+             FT_Int     count,
+             FT_Memory  memory );
+
+    void
+    (*done)( PS_Table  table );
+
+    FT_Error
+    (*add)( PS_Table    table,
+            FT_Int      idx,
+            void*       object,
+            FT_PtrDist  length );
+
+    void
+    (*release)( PS_Table  table );
+
+  } PS_Table_FuncsRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_TableRec                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A PS_Table is a simple object used to store an array of objects in */
+  /*    a single memory block.                                             */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    block     :: The address in memory of the growheap's block.  This  */
+  /*                 can change between two object adds, due to            */
+  /*                 reallocation.                                         */
+  /*                                                                       */
+  /*    cursor    :: The current top of the grow heap within its block.    */
+  /*                                                                       */
+  /*    capacity  :: The current size of the heap block.  Increments by    */
+  /*                 1kByte chunks.                                        */
+  /*                                                                       */
+  /*    max_elems :: The maximum number of elements in table.              */
+  /*                                                                       */
+  /*    num_elems :: The current number of elements in table.              */
+  /*                                                                       */
+  /*    elements  :: A table of element addresses within the block.        */
+  /*                                                                       */
+  /*    lengths   :: A table of element sizes within the block.            */
+  /*                                                                       */
+  /*    memory    :: The object used for memory operations                 */
+  /*                 (alloc/realloc).                                      */
+  /*                                                                       */
+  /*    funcs     :: A table of method pointers for this object.           */
+  /*                                                                       */
+  typedef struct  PS_TableRec_
+  {
+    FT_Byte*           block;          /* current memory block           */
+    FT_Offset          cursor;         /* current cursor in memory block */
+    FT_Offset          capacity;       /* current size of memory block   */
+    FT_Long            init;
+
+    FT_Int             max_elems;
+    FT_Int             num_elems;
+    FT_Byte**          elements;       /* addresses of table elements */
+    FT_PtrDist*        lengths;        /* lengths of table elements   */
+
+    FT_Memory          memory;
+    PS_Table_FuncsRec  funcs;
+
+  } PS_TableRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       T1 FIELDS & TOKENS                      *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct PS_ParserRec_*  PS_Parser;
+
+  typedef struct T1_TokenRec_*   T1_Token;
+
+  typedef struct T1_FieldRec_*   T1_Field;
+
+
+  /* simple enumeration type used to identify token types */
+  typedef enum  T1_TokenType_
+  {
+    T1_TOKEN_TYPE_NONE = 0,
+    T1_TOKEN_TYPE_ANY,
+    T1_TOKEN_TYPE_STRING,
+    T1_TOKEN_TYPE_ARRAY,
+    T1_TOKEN_TYPE_KEY, /* aka `name' */
+
+    /* do not remove */
+    T1_TOKEN_TYPE_MAX
+
+  } T1_TokenType;
+
+
+  /* a simple structure used to identify tokens */
+  typedef struct  T1_TokenRec_
+  {
+    FT_Byte*      start;   /* first character of token in input stream */
+    FT_Byte*      limit;   /* first character after the token          */
+    T1_TokenType  type;    /* type of token                            */
+
+  } T1_TokenRec;
+
+
+  /* enumeration type used to identify object fields */
+  typedef enum  T1_FieldType_
+  {
+    T1_FIELD_TYPE_NONE = 0,
+    T1_FIELD_TYPE_BOOL,
+    T1_FIELD_TYPE_INTEGER,
+    T1_FIELD_TYPE_FIXED,
+    T1_FIELD_TYPE_FIXED_1000,
+    T1_FIELD_TYPE_STRING,
+    T1_FIELD_TYPE_KEY,
+    T1_FIELD_TYPE_BBOX,
+    T1_FIELD_TYPE_INTEGER_ARRAY,
+    T1_FIELD_TYPE_FIXED_ARRAY,
+    T1_FIELD_TYPE_CALLBACK,
+
+    /* do not remove */
+    T1_FIELD_TYPE_MAX
+
+  } T1_FieldType;
+
+
+  typedef enum  T1_FieldLocation_
+  {
+    T1_FIELD_LOCATION_CID_INFO,
+    T1_FIELD_LOCATION_FONT_DICT,
+    T1_FIELD_LOCATION_FONT_EXTRA,
+    T1_FIELD_LOCATION_FONT_INFO,
+    T1_FIELD_LOCATION_PRIVATE,
+    T1_FIELD_LOCATION_BBOX,
+    T1_FIELD_LOCATION_LOADER,
+    T1_FIELD_LOCATION_FACE,
+    T1_FIELD_LOCATION_BLEND,
+
+    /* do not remove */
+    T1_FIELD_LOCATION_MAX
+
+  } T1_FieldLocation;
+
+
+  typedef void
+  (*T1_Field_ParseFunc)( FT_Face     face,
+                         FT_Pointer  parser );
+
+
+  /* structure type used to model object fields */
+  typedef struct  T1_FieldRec_
+  {
+    const char*         ident;        /* field identifier               */
+    T1_FieldLocation    location;
+    T1_FieldType        type;         /* type of field                  */
+    T1_Field_ParseFunc  reader;
+    FT_UInt             offset;       /* offset of field in object      */
+    FT_Byte             size;         /* size of field in bytes         */
+    FT_UInt             array_max;    /* maximal number of elements for */
+                                      /* array                          */
+    FT_UInt             count_offset; /* offset of element count for    */
+                                      /* arrays; must not be zero if in */
+                                      /* use -- in other words, a       */
+                                      /* `num_FOO' element must not     */
+                                      /* start the used structure if we */
+                                      /* parse a `FOO' array            */
+    FT_UInt             dict;         /* where we expect it             */
+  } T1_FieldRec;
+
+#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */
+#define T1_FIELD_DICT_PRIVATE  ( 1 << 1 )
+
+
+
+#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \
+          {                                                 \
+            _ident, T1CODE, _type,                          \
+            0,                                              \
+            FT_FIELD_OFFSET( _fname ),                      \
+            FT_FIELD_SIZE( _fname ),                        \
+            0, 0,                                           \
+            _dict                                           \
+          },
+
+#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \
+          {                                             \
+            _ident, T1CODE, T1_FIELD_TYPE_CALLBACK,     \
+            (T1_Field_ParseFunc)_reader,                \
+            0, 0,                                       \
+            0, 0,                                       \
+            _dict                                       \
+          },
+
+#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \
+          {                                                      \
+            _ident, T1CODE, _type,                               \
+            0,                                                   \
+            FT_FIELD_OFFSET( _fname ),                           \
+            FT_FIELD_SIZE_DELTA( _fname ),                       \
+            _max,                                                \
+            FT_FIELD_OFFSET( num_ ## _fname ),                   \
+            _dict                                                \
+          },
+
+#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \
+          {                                                       \
+            _ident, T1CODE, _type,                                \
+            0,                                                    \
+            FT_FIELD_OFFSET( _fname ),                            \
+            FT_FIELD_SIZE_DELTA( _fname ),                        \
+            _max, 0,                                              \
+            _dict                                                 \
+          },
+
+
+#define T1_FIELD_BOOL( _ident, _fname, _dict )                             \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict )
+
+#define T1_FIELD_NUM( _ident, _fname, _dict )                                 \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict )
+
+#define T1_FIELD_FIXED( _ident, _fname, _dict )                             \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict )
+
+#define T1_FIELD_FIXED_1000( _ident, _fname, _dict )                     \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \
+                               _dict )
+
+#define T1_FIELD_STRING( _ident, _fname, _dict )                             \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict )
+
+#define T1_FIELD_KEY( _ident, _fname, _dict )                             \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict )
+
+#define T1_FIELD_BBOX( _ident, _fname, _dict )                             \
+          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict )
+
+
+#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict )         \
+          T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
+                              _fname, _fmax, _dict )
+
+#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict )     \
+          T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
+                              _fname, _fmax, _dict )
+
+#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict )         \
+          T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
+                               _fname, _fmax, _dict )
+
+#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict )     \
+          T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
+                               _fname, _fmax, _dict )
+
+#define T1_FIELD_CALLBACK( _ident, _name, _dict )       \
+          T1_NEW_CALLBACK_FIELD( _ident, _name, _dict )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            T1 PARSER                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef const struct PS_Parser_FuncsRec_*  PS_Parser_Funcs;
+
+  typedef struct  PS_Parser_FuncsRec_
+  {
+    void
+    (*init)( PS_Parser  parser,
+             FT_Byte*   base,
+             FT_Byte*   limit,
+             FT_Memory  memory );
+
+    void
+    (*done)( PS_Parser  parser );
+
+    void
+    (*skip_spaces)( PS_Parser  parser );
+    void
+    (*skip_PS_token)( PS_Parser  parser );
+
+    FT_Long
+    (*to_int)( PS_Parser  parser );
+    FT_Fixed
+    (*to_fixed)( PS_Parser  parser,
+                 FT_Int     power_ten );
+
+    FT_Error
+    (*to_bytes)( PS_Parser  parser,
+                 FT_Byte*   bytes,
+                 FT_Offset  max_bytes,
+                 FT_Long*   pnum_bytes,
+                 FT_Bool    delimiters );
+
+    FT_Int
+    (*to_coord_array)( PS_Parser  parser,
+                       FT_Int     max_coords,
+                       FT_Short*  coords );
+    FT_Int
+    (*to_fixed_array)( PS_Parser  parser,
+                       FT_Int     max_values,
+                       FT_Fixed*  values,
+                       FT_Int     power_ten );
+
+    void
+    (*to_token)( PS_Parser  parser,
+                 T1_Token   token );
+    void
+    (*to_token_array)( PS_Parser  parser,
+                       T1_Token   tokens,
+                       FT_UInt    max_tokens,
+                       FT_Int*    pnum_tokens );
+
+    FT_Error
+    (*load_field)( PS_Parser       parser,
+                   const T1_Field  field,
+                   void**          objects,
+                   FT_UInt         max_objects,
+                   FT_ULong*       pflags );
+
+    FT_Error
+    (*load_field_table)( PS_Parser       parser,
+                         const T1_Field  field,
+                         void**          objects,
+                         FT_UInt         max_objects,
+                         FT_ULong*       pflags );
+
+  } PS_Parser_FuncsRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_ParserRec                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A PS_Parser is an object used to parse a Type 1 font very quickly. */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    cursor :: The current position in the text.                        */
+  /*                                                                       */
+  /*    base   :: Start of the processed text.                             */
+  /*                                                                       */
+  /*    limit  :: End of the processed text.                               */
+  /*                                                                       */
+  /*    error  :: The last error returned.                                 */
+  /*                                                                       */
+  /*    memory :: The object used for memory operations (alloc/realloc).   */
+  /*                                                                       */
+  /*    funcs  :: A table of functions for the parser.                     */
+  /*                                                                       */
+  typedef struct  PS_ParserRec_
+  {
+    FT_Byte*   cursor;
+    FT_Byte*   base;
+    FT_Byte*   limit;
+    FT_Error   error;
+    FT_Memory  memory;
+
+    PS_Parser_FuncsRec  funcs;
+
+  } PS_ParserRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         T1 BUILDER                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  typedef struct T1_BuilderRec_*  T1_Builder;
+
+
+  typedef FT_Error
+  (*T1_Builder_Check_Points_Func)( T1_Builder  builder,
+                                   FT_Int      count );
+
+  typedef void
+  (*T1_Builder_Add_Point_Func)( T1_Builder  builder,
+                                FT_Pos      x,
+                                FT_Pos      y,
+                                FT_Byte     flag );
+
+  typedef FT_Error
+  (*T1_Builder_Add_Point1_Func)( T1_Builder  builder,
+                                 FT_Pos      x,
+                                 FT_Pos      y );
+
+  typedef FT_Error
+  (*T1_Builder_Add_Contour_Func)( T1_Builder  builder );
+
+  typedef FT_Error
+  (*T1_Builder_Start_Point_Func)( T1_Builder  builder,
+                                  FT_Pos      x,
+                                  FT_Pos      y );
+
+  typedef void
+  (*T1_Builder_Close_Contour_Func)( T1_Builder  builder );
+
+
+  typedef const struct T1_Builder_FuncsRec_*  T1_Builder_Funcs;
+
+  typedef struct  T1_Builder_FuncsRec_
+  {
+    void
+    (*init)( T1_Builder    builder,
+             FT_Face       face,
+             FT_Size       size,
+             FT_GlyphSlot  slot,
+             FT_Bool       hinting );
+
+    void
+    (*done)( T1_Builder   builder );
+
+    T1_Builder_Check_Points_Func   check_points;
+    T1_Builder_Add_Point_Func      add_point;
+    T1_Builder_Add_Point1_Func     add_point1;
+    T1_Builder_Add_Contour_Func    add_contour;
+    T1_Builder_Start_Point_Func    start_point;
+    T1_Builder_Close_Contour_Func  close_contour;
+
+  } T1_Builder_FuncsRec;
+
+
+  /* an enumeration type to handle charstring parsing states */
+  typedef enum  T1_ParseState_
+  {
+    T1_Parse_Start,
+    T1_Parse_Have_Width,
+    T1_Parse_Have_Moveto,
+    T1_Parse_Have_Path
+
+  } T1_ParseState;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Structure>                                                           */
+  /*    T1_BuilderRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*     A structure used during glyph loading to store its outline.       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    memory       :: The current memory object.                         */
+  /*                                                                       */
+  /*    face         :: The current face object.                           */
+  /*                                                                       */
+  /*    glyph        :: The current glyph slot.                            */
+  /*                                                                       */
+  /*    loader       :: XXX                                                */
+  /*                                                                       */
+  /*    base         :: The base glyph outline.                            */
+  /*                                                                       */
+  /*    current      :: The current glyph outline.                         */
+  /*                                                                       */
+  /*    max_points   :: maximum points in builder outline                  */
+  /*                                                                       */
+  /*    max_contours :: Maximal number of contours in builder outline.     */
+  /*                                                                       */
+  /*    pos_x        :: The horizontal translation (if composite glyph).   */
+  /*                                                                       */
+  /*    pos_y        :: The vertical translation (if composite glyph).     */
+  /*                                                                       */
+  /*    left_bearing :: The left side bearing point.                       */
+  /*                                                                       */
+  /*    advance      :: The horizontal advance vector.                     */
+  /*                                                                       */
+  /*    bbox         :: Unused.                                            */
+  /*                                                                       */
+  /*    parse_state  :: An enumeration which controls the charstring       */
+  /*                    parsing state.                                     */
+  /*                                                                       */
+  /*    load_points  :: If this flag is not set, no points are loaded.     */
+  /*                                                                       */
+  /*    no_recurse   :: Set but not used.                                  */
+  /*                                                                       */
+  /*    metrics_only :: A boolean indicating that we only want to compute  */
+  /*                    the metrics of a given glyph, not load all of its  */
+  /*                    points.                                            */
+  /*                                                                       */
+  /*    funcs        :: An array of function pointers for the builder.     */
+  /*                                                                       */
+  typedef struct  T1_BuilderRec_
+  {
+    FT_Memory       memory;
+    FT_Face         face;
+    FT_GlyphSlot    glyph;
+    FT_GlyphLoader  loader;
+    FT_Outline*     base;
+    FT_Outline*     current;
+
+    FT_Pos          pos_x;
+    FT_Pos          pos_y;
+
+    FT_Vector       left_bearing;
+    FT_Vector       advance;
+
+    FT_BBox         bbox;          /* bounding box */
+    T1_ParseState   parse_state;
+    FT_Bool         load_points;
+    FT_Bool         no_recurse;
+
+    FT_Bool         metrics_only;
+
+    void*           hints_funcs;    /* hinter-specific */
+    void*           hints_globals;  /* hinter-specific */
+
+    T1_Builder_FuncsRec  funcs;
+
+  } T1_BuilderRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         T1 DECODER                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#if 0
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine   */
+  /* calls during glyph loading.                                           */
+  /*                                                                       */
+#define T1_MAX_SUBRS_CALLS  8
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A     */
+  /* minimum of 16 is required.                                            */
+  /*                                                                       */
+#define T1_MAX_CHARSTRINGS_OPERANDS  32
+
+#endif /* 0 */
+
+
+  typedef struct  T1_Decoder_ZoneRec_
+  {
+    FT_Byte*  cursor;
+    FT_Byte*  base;
+    FT_Byte*  limit;
+
+  } T1_Decoder_ZoneRec, *T1_Decoder_Zone;
+
+
+  typedef struct T1_DecoderRec_*              T1_Decoder;
+  typedef const struct T1_Decoder_FuncsRec_*  T1_Decoder_Funcs;
+
+
+  typedef FT_Error
+  (*T1_Decoder_Callback)( T1_Decoder  decoder,
+                          FT_UInt     glyph_index );
+
+
+  typedef struct  T1_Decoder_FuncsRec_
+  {
+    FT_Error
+    (*init)( T1_Decoder           decoder,
+             FT_Face              face,
+             FT_Size              size,
+             FT_GlyphSlot         slot,
+             FT_Byte**            glyph_names,
+             PS_Blend             blend,
+             FT_Bool              hinting,
+             FT_Render_Mode       hint_mode,
+             T1_Decoder_Callback  callback );
+
+    void
+    (*done)( T1_Decoder  decoder );
+
+    FT_Error
+    (*parse_charstrings)( T1_Decoder  decoder,
+                          FT_Byte*    base,
+                          FT_UInt     len );
+
+  } T1_Decoder_FuncsRec;
+
+
+  typedef struct  T1_DecoderRec_
+  {
+    T1_BuilderRec        builder;
+
+    FT_Long              stack[T1_MAX_CHARSTRINGS_OPERANDS];
+    FT_Long*             top;
+
+    T1_Decoder_ZoneRec   zones[T1_MAX_SUBRS_CALLS + 1];
+    T1_Decoder_Zone      zone;
+
+    FT_Service_PsCMaps   psnames;      /* for seac */
+    FT_UInt              num_glyphs;
+    FT_Byte**            glyph_names;
+
+    FT_Int               lenIV;        /* internal for sub routine calls */
+    FT_UInt              num_subrs;
+    FT_Byte**            subrs;
+    FT_PtrDist*          subrs_len;    /* array of subrs length (optional) */
+
+    FT_Matrix            font_matrix;
+    FT_Vector            font_offset;
+
+    FT_Int               flex_state;
+    FT_Int               num_flex_vectors;
+    FT_Vector            flex_vectors[7];
+
+    PS_Blend             blend;       /* for multiple master support */
+
+    FT_Render_Mode       hint_mode;
+
+    T1_Decoder_Callback  parse_callback;
+    T1_Decoder_FuncsRec  funcs;
+
+    FT_Long*             buildchar;
+    FT_UInt              len_buildchar;
+
+    FT_Bool              seac;
+
+  } T1_DecoderRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            AFM PARSER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct AFM_ParserRec_*  AFM_Parser;
+
+  typedef struct  AFM_Parser_FuncsRec_
+  {
+    FT_Error
+    (*init)( AFM_Parser  parser,
+             FT_Memory   memory,
+             FT_Byte*    base,
+             FT_Byte*    limit );
+
+    void
+    (*done)( AFM_Parser  parser );
+
+    FT_Error
+    (*parse)( AFM_Parser  parser );
+
+  } AFM_Parser_FuncsRec;
+
+
+  typedef struct AFM_StreamRec_*  AFM_Stream;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    AFM_ParserRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An AFM_Parser is a parser for the AFM files.                       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    memory    :: The object used for memory operations (alloc and      */
+  /*                 realloc).                                             */
+  /*                                                                       */
+  /*    stream    :: This is an opaque object.                             */
+  /*                                                                       */
+  /*    FontInfo  :: The result will be stored here.                       */
+  /*                                                                       */
+  /*    get_index :: A user provided function to get a glyph index by its  */
+  /*                 name.                                                 */
+  /*                                                                       */
+  typedef struct  AFM_ParserRec_
+  {
+    FT_Memory     memory;
+    AFM_Stream    stream;
+
+    AFM_FontInfo  FontInfo;
+
+    FT_Int
+    (*get_index)( const char*  name,
+                  FT_Offset    len,
+                  void*        user_data );
+
+    void*         user_data;
+
+  } AFM_ParserRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     TYPE1 CHARMAPS                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef const struct T1_CMap_ClassesRec_*  T1_CMap_Classes;
+
+  typedef struct T1_CMap_ClassesRec_
+  {
+    FT_CMap_Class  standard;
+    FT_CMap_Class  expert;
+    FT_CMap_Class  custom;
+    FT_CMap_Class  unicode;
+
+  } T1_CMap_ClassesRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                        PSAux Module Interface                 *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct  PSAux_ServiceRec_
+  {
+    /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */
+    const PS_Table_FuncsRec*    ps_table_funcs;
+    const PS_Parser_FuncsRec*   ps_parser_funcs;
+    const T1_Builder_FuncsRec*  t1_builder_funcs;
+    const T1_Decoder_FuncsRec*  t1_decoder_funcs;
+
+    void
+    (*t1_decrypt)( FT_Byte*   buffer,
+                   FT_Offset  length,
+                   FT_UShort  seed );
+
+    T1_CMap_Classes  t1_cmap_classes;
+
+    /* fields after this comment line were added after version 2.1.10 */
+    const AFM_Parser_FuncsRec*  afm_parser_funcs;
+
+  } PSAux_ServiceRec, *PSAux_Service;
+
+  /* backwards-compatible type definition */
+  typedef PSAux_ServiceRec   PSAux_Interface;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                 Some convenience functions                    *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define IS_PS_NEWLINE( ch ) \
+  ( (ch) == '\r' ||         \
+    (ch) == '\n' )
+
+#define IS_PS_SPACE( ch )  \
+  ( (ch) == ' '         || \
+    IS_PS_NEWLINE( ch ) || \
+    (ch) == '\t'        || \
+    (ch) == '\f'        || \
+    (ch) == '\0' )
+
+#define IS_PS_SPECIAL( ch )       \
+  ( (ch) == '/'                || \
+    (ch) == '(' || (ch) == ')' || \
+    (ch) == '<' || (ch) == '>' || \
+    (ch) == '[' || (ch) == ']' || \
+    (ch) == '{' || (ch) == '}' || \
+    (ch) == '%'                )
+
+#define IS_PS_DELIM( ch )  \
+  ( IS_PS_SPACE( ch )   || \
+    IS_PS_SPECIAL( ch ) )
+
+#define IS_PS_DIGIT( ch )        \
+  ( (ch) >= '0' && (ch) <= '9' )
+
+#define IS_PS_XDIGIT( ch )            \
+  ( IS_PS_DIGIT( ch )              || \
+    ( (ch) >= 'A' && (ch) <= 'F' ) || \
+    ( (ch) >= 'a' && (ch) <= 'f' ) )
+
+#define IS_PS_BASE85( ch )       \
+  ( (ch) >= '!' && (ch) <= 'u' )
+
+#define IS_PS_TOKEN( cur, limit, token )                                \
+  ( (char)(cur)[0] == (token)[0]                                     && \
+    ( (cur) + sizeof ( (token) ) == (limit) ||                          \
+      ( (cur) + sizeof( (token) ) < (limit)          &&                 \
+        IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) )             && \
+    ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 )
+
+
+FT_END_HEADER
+
+#endif /* __PSAUX_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/pshints.h b/include/freetype/internal/pshints.h
new file mode 100644 (file)
index 0000000..5b7b698
--- /dev/null
@@ -0,0 +1,712 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshints.h                                                              */
+/*                                                                         */
+/*    Interface to Postscript-specific (Type 1 and Type 2) hints           */
+/*    recorders (specification only).  These are used to support native    */
+/*    T1/T2 hints in the `type1', `cid', and `cff' font drivers.           */
+/*                                                                         */
+/*  Copyright 2001, 2002, 2003, 2005, 2006, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSHINTS_H__
+#define __PSHINTS_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_TYPE1_TABLES_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****               INTERNAL REPRESENTATION OF GLOBALS              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct PSH_GlobalsRec_*  PSH_Globals;
+
+  typedef FT_Error
+  (*PSH_Globals_NewFunc)( FT_Memory     memory,
+                          T1_Private*   private_dict,
+                          PSH_Globals*  aglobals );
+
+  typedef FT_Error
+  (*PSH_Globals_SetScaleFunc)( PSH_Globals  globals,
+                               FT_Fixed     x_scale,
+                               FT_Fixed     y_scale,
+                               FT_Fixed     x_delta,
+                               FT_Fixed     y_delta );
+
+  typedef void
+  (*PSH_Globals_DestroyFunc)( PSH_Globals  globals );
+
+
+  typedef struct  PSH_Globals_FuncsRec_
+  {
+    PSH_Globals_NewFunc       create;
+    PSH_Globals_SetScaleFunc  set_scale;
+    PSH_Globals_DestroyFunc   destroy;
+
+  } PSH_Globals_FuncsRec, *PSH_Globals_Funcs;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                  PUBLIC TYPE 1 HINTS RECORDER                 *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************
+   *
+   * @type:
+   *   T1_Hints
+   *
+   * @description:
+   *   This is a handle to an opaque structure used to record glyph hints
+   *   from a Type 1 character glyph character string.
+   *
+   *   The methods used to operate on this object are defined by the
+   *   @T1_Hints_FuncsRec structure.  Recording glyph hints is normally
+   *   achieved through the following scheme:
+   *
+   *   - Open a new hint recording session by calling the `open' method.
+   *     This rewinds the recorder and prepare it for new input.
+   *
+   *   - For each hint found in the glyph charstring, call the corresponding
+   *     method (`stem', `stem3', or `reset').  Note that these functions do
+   *     not return an error code.
+   *
+   *   - Close the recording session by calling the `close' method.  It
+   *     returns an error code if the hints were invalid or something
+   *     strange happened (e.g., memory shortage).
+   *
+   *   The hints accumulated in the object can later be used by the
+   *   PostScript hinter.
+   *
+   */
+  typedef struct T1_HintsRec_*  T1_Hints;
+
+
+  /*************************************************************************
+   *
+   * @type:
+   *   T1_Hints_Funcs
+   *
+   * @description:
+   *   A pointer to the @T1_Hints_FuncsRec structure that defines the API of
+   *   a given @T1_Hints object.
+   *
+   */
+  typedef const struct T1_Hints_FuncsRec_*  T1_Hints_Funcs;
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T1_Hints_OpenFunc
+   *
+   * @description:
+   *   A method of the @T1_Hints class used to prepare it for a new Type 1
+   *   hints recording session.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 1 hints recorder.
+   *
+   * @note:
+   *   You should always call the @T1_Hints_CloseFunc method in order to
+   *   close an opened recording session.
+   *
+   */
+  typedef void
+  (*T1_Hints_OpenFunc)( T1_Hints  hints );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T1_Hints_SetStemFunc
+   *
+   * @description:
+   *   A method of the @T1_Hints class used to record a new horizontal or
+   *   vertical stem.  This corresponds to the Type 1 `hstem' and `vstem'
+   *   operators.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 1 hints recorder.
+   *
+   *   dimension ::
+   *     0 for horizontal stems (hstem), 1 for vertical ones (vstem).
+   *
+   *   coords ::
+   *     Array of 2 coordinates in 16.16 format, used as (position,length)
+   *     stem descriptor.
+   *
+   * @note:
+   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use
+   *   horizontal coordinates (x) for vertical stems (dim=1).
+   *
+   *   `coords[0]' is the absolute stem position (lowest coordinate);
+   *   `coords[1]' is the length.
+   *
+   *   The length can be negative, in which case it must be either -20 or
+   *   -21.  It is interpreted as a `ghost' stem, according to the Type 1
+   *   specification.
+   *
+   *   If the length is -21 (corresponding to a bottom ghost stem), then
+   *   the real stem position is `coords[0]+coords[1]'.
+   *
+   */
+  typedef void
+  (*T1_Hints_SetStemFunc)( T1_Hints   hints,
+                           FT_UInt    dimension,
+                           FT_Fixed*  coords );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T1_Hints_SetStem3Func
+   *
+   * @description:
+   *   A method of the @T1_Hints class used to record three
+   *   counter-controlled horizontal or vertical stems at once.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 1 hints recorder.
+   *
+   *   dimension ::
+   *     0 for horizontal stems, 1 for vertical ones.
+   *
+   *   coords ::
+   *     An array of 6 values in 16.16 format, holding 3 (position,length)
+   *     pairs for the counter-controlled stems.
+   *
+   * @note:
+   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use
+   *   horizontal coordinates (x) for vertical stems (dim=1).
+   *
+   *   The lengths cannot be negative (ghost stems are never
+   *   counter-controlled).
+   *
+   */
+  typedef void
+  (*T1_Hints_SetStem3Func)( T1_Hints   hints,
+                            FT_UInt    dimension,
+                            FT_Fixed*  coords );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T1_Hints_ResetFunc
+   *
+   * @description:
+   *   A method of the @T1_Hints class used to reset the stems hints in a
+   *   recording session.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 1 hints recorder.
+   *
+   *   end_point ::
+   *     The index of the last point in the input glyph in which the
+   *     previously defined hints apply.
+   *
+   */
+  typedef void
+  (*T1_Hints_ResetFunc)( T1_Hints  hints,
+                         FT_UInt   end_point );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T1_Hints_CloseFunc
+   *
+   * @description:
+   *   A method of the @T1_Hints class used to close a hint recording
+   *   session.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 1 hints recorder.
+   *
+   *   end_point ::
+   *     The index of the last point in the input glyph.
+   *
+   * @return:
+   *   FreeType error code.  0 means success.
+   *
+   * @note:
+   *   The error code is set to indicate that an error occurred during the
+   *   recording session.
+   *
+   */
+  typedef FT_Error
+  (*T1_Hints_CloseFunc)( T1_Hints  hints,
+                         FT_UInt   end_point );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T1_Hints_ApplyFunc
+   *
+   * @description:
+   *   A method of the @T1_Hints class used to apply hints to the
+   *   corresponding glyph outline.  Must be called once all hints have been
+   *   recorded.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 1 hints recorder.
+   *
+   *   outline ::
+   *     A pointer to the target outline descriptor.
+   *
+   *   globals ::
+   *     The hinter globals for this font.
+   *
+   *   hint_mode ::
+   *     Hinting information.
+   *
+   * @return:
+   *   FreeType error code.  0 means success.
+   *
+   * @note:
+   *   On input, all points within the outline are in font coordinates. On
+   *   output, they are in 1/64th of pixels.
+   *
+   *   The scaling transformation is taken from the `globals' object which
+   *   must correspond to the same font as the glyph.
+   *
+   */
+  typedef FT_Error
+  (*T1_Hints_ApplyFunc)( T1_Hints        hints,
+                         FT_Outline*     outline,
+                         PSH_Globals     globals,
+                         FT_Render_Mode  hint_mode );
+
+
+  /*************************************************************************
+   *
+   * @struct:
+   *   T1_Hints_FuncsRec
+   *
+   * @description:
+   *   The structure used to provide the API to @T1_Hints objects.
+   *
+   * @fields:
+   *   hints ::
+   *     A handle to the T1 Hints recorder.
+   *
+   *   open ::
+   *     The function to open a recording session.
+   *
+   *   close ::
+   *     The function to close a recording session.
+   *
+   *   stem ::
+   *     The function to set a simple stem.
+   *
+   *   stem3 ::
+   *     The function to set counter-controlled stems.
+   *
+   *   reset ::
+   *     The function to reset stem hints.
+   *
+   *   apply ::
+   *     The function to apply the hints to the corresponding glyph outline.
+   *
+   */
+  typedef struct  T1_Hints_FuncsRec_
+  {
+    T1_Hints               hints;
+    T1_Hints_OpenFunc      open;
+    T1_Hints_CloseFunc     close;
+    T1_Hints_SetStemFunc   stem;
+    T1_Hints_SetStem3Func  stem3;
+    T1_Hints_ResetFunc     reset;
+    T1_Hints_ApplyFunc     apply;
+
+  } T1_Hints_FuncsRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                  PUBLIC TYPE 2 HINTS RECORDER                 *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************
+   *
+   * @type:
+   *   T2_Hints
+   *
+   * @description:
+   *   This is a handle to an opaque structure used to record glyph hints
+   *   from a Type 2 character glyph character string.
+   *
+   *   The methods used to operate on this object are defined by the
+   *   @T2_Hints_FuncsRec structure.  Recording glyph hints is normally
+   *   achieved through the following scheme:
+   *
+   *   - Open a new hint recording session by calling the `open' method.
+   *     This rewinds the recorder and prepare it for new input.
+   *
+   *   - For each hint found in the glyph charstring, call the corresponding
+   *     method (`stems', `hintmask', `counters').  Note that these
+   *     functions do not return an error code.
+   *
+   *   - Close the recording session by calling the `close' method.  It
+   *     returns an error code if the hints were invalid or something
+   *     strange happened (e.g., memory shortage).
+   *
+   *   The hints accumulated in the object can later be used by the
+   *   Postscript hinter.
+   *
+   */
+  typedef struct T2_HintsRec_*  T2_Hints;
+
+
+  /*************************************************************************
+   *
+   * @type:
+   *   T2_Hints_Funcs
+   *
+   * @description:
+   *   A pointer to the @T2_Hints_FuncsRec structure that defines the API of
+   *   a given @T2_Hints object.
+   *
+   */
+  typedef const struct T2_Hints_FuncsRec_*  T2_Hints_Funcs;
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T2_Hints_OpenFunc
+   *
+   * @description:
+   *   A method of the @T2_Hints class used to prepare it for a new Type 2
+   *   hints recording session.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 2 hints recorder.
+   *
+   * @note:
+   *   You should always call the @T2_Hints_CloseFunc method in order to
+   *   close an opened recording session.
+   *
+   */
+  typedef void
+  (*T2_Hints_OpenFunc)( T2_Hints  hints );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T2_Hints_StemsFunc
+   *
+   * @description:
+   *   A method of the @T2_Hints class used to set the table of stems in
+   *   either the vertical or horizontal dimension.  Equivalent to the
+   *   `hstem', `vstem', `hstemhm', and `vstemhm' Type 2 operators.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 2 hints recorder.
+   *
+   *   dimension ::
+   *     0 for horizontal stems (hstem), 1 for vertical ones (vstem).
+   *
+   *   count ::
+   *     The number of stems.
+   *
+   *   coords ::
+   *     An array of `count' (position,length) pairs in 16.16 format.
+   *
+   * @note:
+   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use
+   *   horizontal coordinates (x) for vertical stems (dim=1).
+   *
+   *   There are `2*count' elements in the `coords' array.  Each even
+   *   element is an absolute position in font units, each odd element is a
+   *   length in font units.
+   *
+   *   A length can be negative, in which case it must be either -20 or
+   *   -21.  It is interpreted as a `ghost' stem, according to the Type 1
+   *   specification.
+   *
+   */
+  typedef void
+  (*T2_Hints_StemsFunc)( T2_Hints   hints,
+                         FT_UInt    dimension,
+                         FT_UInt    count,
+                         FT_Fixed*  coordinates );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T2_Hints_MaskFunc
+   *
+   * @description:
+   *   A method of the @T2_Hints class used to set a given hintmask (this
+   *   corresponds to the `hintmask' Type 2 operator).
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 2 hints recorder.
+   *
+   *   end_point ::
+   *     The glyph index of the last point to which the previously defined
+   *     or activated hints apply.
+   *
+   *   bit_count ::
+   *     The number of bits in the hint mask.
+   *
+   *   bytes ::
+   *     An array of bytes modelling the hint mask.
+   *
+   * @note:
+   *   If the hintmask starts the charstring (before any glyph point
+   *   definition), the value of `end_point' should be 0.
+   *
+   *   `bit_count' is the number of meaningful bits in the `bytes' array; it
+   *   must be equal to the total number of hints defined so far (i.e.,
+   *   horizontal+verticals).
+   *
+   *   The `bytes' array can come directly from the Type 2 charstring and
+   *   respects the same format.
+   *
+   */
+  typedef void
+  (*T2_Hints_MaskFunc)( T2_Hints        hints,
+                        FT_UInt         end_point,
+                        FT_UInt         bit_count,
+                        const FT_Byte*  bytes );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T2_Hints_CounterFunc
+   *
+   * @description:
+   *   A method of the @T2_Hints class used to set a given counter mask
+   *   (this corresponds to the `hintmask' Type 2 operator).
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 2 hints recorder.
+   *
+   *   end_point ::
+   *     A glyph index of the last point to which the previously defined or
+   *     active hints apply.
+   *
+   *   bit_count ::
+   *     The number of bits in the hint mask.
+   *
+   *   bytes ::
+   *     An array of bytes modelling the hint mask.
+   *
+   * @note:
+   *   If the hintmask starts the charstring (before any glyph point
+   *   definition), the value of `end_point' should be 0.
+   *
+   *   `bit_count' is the number of meaningful bits in the `bytes' array; it
+   *   must be equal to the total number of hints defined so far (i.e.,
+   *   horizontal+verticals).
+   *
+   *    The `bytes' array can come directly from the Type 2 charstring and
+   *    respects the same format.
+   *
+   */
+  typedef void
+  (*T2_Hints_CounterFunc)( T2_Hints        hints,
+                           FT_UInt         bit_count,
+                           const FT_Byte*  bytes );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T2_Hints_CloseFunc
+   *
+   * @description:
+   *   A method of the @T2_Hints class used to close a hint recording
+   *   session.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 2 hints recorder.
+   *
+   *   end_point ::
+   *     The index of the last point in the input glyph.
+   *
+   * @return:
+   *   FreeType error code.  0 means success.
+   *
+   * @note:
+   *   The error code is set to indicate that an error occurred during the
+   *   recording session.
+   *
+   */
+  typedef FT_Error
+  (*T2_Hints_CloseFunc)( T2_Hints  hints,
+                         FT_UInt   end_point );
+
+
+  /*************************************************************************
+   *
+   * @functype:
+   *   T2_Hints_ApplyFunc
+   *
+   * @description:
+   *   A method of the @T2_Hints class used to apply hints to the
+   *   corresponding glyph outline.  Must be called after the `close'
+   *   method.
+   *
+   * @input:
+   *   hints ::
+   *     A handle to the Type 2 hints recorder.
+   *
+   *   outline ::
+   *     A pointer to the target outline descriptor.
+   *
+   *   globals ::
+   *     The hinter globals for this font.
+   *
+   *   hint_mode ::
+   *     Hinting information.
+   *
+   * @return:
+   *   FreeType error code.  0 means success.
+   *
+   * @note:
+   *   On input, all points within the outline are in font coordinates. On
+   *   output, they are in 1/64th of pixels.
+   *
+   *   The scaling transformation is taken from the `globals' object which
+   *   must correspond to the same font than the glyph.
+   *
+   */
+  typedef FT_Error
+  (*T2_Hints_ApplyFunc)( T2_Hints        hints,
+                         FT_Outline*     outline,
+                         PSH_Globals     globals,
+                         FT_Render_Mode  hint_mode );
+
+
+  /*************************************************************************
+   *
+   * @struct:
+   *   T2_Hints_FuncsRec
+   *
+   * @description:
+   *   The structure used to provide the API to @T2_Hints objects.
+   *
+   * @fields:
+   *   hints ::
+   *     A handle to the T2 hints recorder object.
+   *
+   *   open ::
+   *     The function to open a recording session.
+   *
+   *   close ::
+   *     The function to close a recording session.
+   *
+   *   stems ::
+   *     The function to set the dimension's stems table.
+   *
+   *   hintmask ::
+   *     The function to set hint masks.
+   *
+   *   counter ::
+   *     The function to set counter masks.
+   *
+   *   apply ::
+   *     The function to apply the hints on the corresponding glyph outline.
+   *
+   */
+  typedef struct  T2_Hints_FuncsRec_
+  {
+    T2_Hints              hints;
+    T2_Hints_OpenFunc     open;
+    T2_Hints_CloseFunc    close;
+    T2_Hints_StemsFunc    stems;
+    T2_Hints_MaskFunc     hintmask;
+    T2_Hints_CounterFunc  counter;
+    T2_Hints_ApplyFunc    apply;
+
+  } T2_Hints_FuncsRec;
+
+
+  /* */
+
+
+  typedef struct  PSHinter_Interface_
+  {
+    PSH_Globals_Funcs  (*get_globals_funcs)( FT_Module  module );
+    T1_Hints_Funcs     (*get_t1_funcs)     ( FT_Module  module );
+    T2_Hints_Funcs     (*get_t2_funcs)     ( FT_Module  module );
+
+  } PSHinter_Interface;
+
+  typedef PSHinter_Interface*  PSHinter_Service;
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_PSHINTER_INTERFACE(class_, get_globals_funcs_,             \
+                                     get_t1_funcs_, get_t2_funcs_)           \
+  static const PSHinter_Interface class_ =                                   \
+  {                                                                          \
+    get_globals_funcs_, get_t1_funcs_, get_t2_funcs_                         \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_PSHINTER_INTERFACE(class_, get_globals_funcs_,             \
+                                     get_t1_funcs_, get_t2_funcs_)           \
+  void                                                                       \
+  FT_Init_Class_##class_( FT_Library library,                                \
+                          PSHinter_Interface*  clazz)                        \
+  {                                                                          \
+    FT_UNUSED(library);                                                      \
+    clazz->get_globals_funcs = get_globals_funcs_;                           \
+    clazz->get_t1_funcs = get_t1_funcs_;                                     \
+    clazz->get_t2_funcs = get_t2_funcs_;                                     \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __PSHINTS_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svbdf.h b/include/freetype/internal/services/svbdf.h
new file mode 100644 (file)
index 0000000..0974752
--- /dev/null
@@ -0,0 +1,82 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svbdf.h                                                                */
+/*                                                                         */
+/*    The FreeType BDF services (specification).                           */
+/*                                                                         */
+/*  Copyright 2003, 2009, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVBDF_H__
+#define __SVBDF_H__
+
+#include FT_BDF_H
+#include FT_INTERNAL_SERVICE_H
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_BDF  "bdf"
+
+  typedef FT_Error
+  (*FT_BDF_GetCharsetIdFunc)( FT_Face       face,
+                              const char*  *acharset_encoding,
+                              const char*  *acharset_registry );
+
+  typedef FT_Error
+  (*FT_BDF_GetPropertyFunc)( FT_Face           face,
+                             const char*       prop_name,
+                             BDF_PropertyRec  *aproperty );
+
+
+  FT_DEFINE_SERVICE( BDF )
+  {
+    FT_BDF_GetCharsetIdFunc  get_charset_id;
+    FT_BDF_GetPropertyFunc   get_property;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_BDFRec( class_,                                \
+                                  get_charset_id_,                       \
+                                  get_property_ )                        \
+  static const FT_Service_BDFRec  class_ =                               \
+  {                                                                      \
+    get_charset_id_, get_property_                                       \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_BDFRec( class_,                                \
+                                  get_charset_id_,                       \
+                                  get_property_ )                        \
+  void                                                                   \
+  FT_Init_Class_ ## class_( FT_Service_BDFRec*  clazz )                  \
+  {                                                                      \
+    clazz->get_charset_id = get_charset_id_;                             \
+    clazz->get_property   = get_property_;                               \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVBDF_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svcid.h b/include/freetype/internal/services/svcid.h
new file mode 100644 (file)
index 0000000..6be3f93
--- /dev/null
@@ -0,0 +1,89 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svcid.h                                                                */
+/*                                                                         */
+/*    The FreeType CID font services (specification).                      */
+/*                                                                         */
+/*  Copyright 2007, 2009, 2012 by Derek Clegg, Michael Toftdal.            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVCID_H__
+#define __SVCID_H__
+
+#include FT_INTERNAL_SERVICE_H
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_CID  "CID"
+
+  typedef FT_Error
+  (*FT_CID_GetRegistryOrderingSupplementFunc)( FT_Face       face,
+                                               const char*  *registry,
+                                               const char*  *ordering,
+                                               FT_Int       *supplement );
+  typedef FT_Error
+  (*FT_CID_GetIsInternallyCIDKeyedFunc)( FT_Face   face,
+                                         FT_Bool  *is_cid );
+  typedef FT_Error
+  (*FT_CID_GetCIDFromGlyphIndexFunc)( FT_Face   face,
+                                      FT_UInt   glyph_index,
+                                      FT_UInt  *cid );
+
+  FT_DEFINE_SERVICE( CID )
+  {
+    FT_CID_GetRegistryOrderingSupplementFunc  get_ros;
+    FT_CID_GetIsInternallyCIDKeyedFunc        get_is_cid;
+    FT_CID_GetCIDFromGlyphIndexFunc           get_cid_from_glyph_index;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_CIDREC( class_,                                   \
+                                  get_ros_,                                 \
+                                  get_is_cid_,                              \
+                                  get_cid_from_glyph_index_ )               \
+  static const FT_Service_CIDRec class_ =                                   \
+  {                                                                         \
+    get_ros_, get_is_cid_, get_cid_from_glyph_index_                        \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_CIDREC( class_,                                   \
+                                  get_ros_,                                 \
+                                  get_is_cid_,                              \
+                                  get_cid_from_glyph_index_ )               \
+  void                                                                      \
+  FT_Init_Class_ ## class_( FT_Library          library,                    \
+                            FT_Service_CIDRec*  clazz )                     \
+  {                                                                         \
+    FT_UNUSED( library );                                                   \
+                                                                            \
+    clazz->get_ros                  = get_ros_;                             \
+    clazz->get_is_cid               = get_is_cid_;                          \
+    clazz->get_cid_from_glyph_index = get_cid_from_glyph_index_;            \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVCID_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svgldict.h b/include/freetype/internal/services/svgldict.h
new file mode 100644 (file)
index 0000000..1d12534
--- /dev/null
@@ -0,0 +1,88 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svgldict.h                                                             */
+/*                                                                         */
+/*    The FreeType glyph dictionary services (specification).              */
+/*                                                                         */
+/*  Copyright 2003, 2009, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVGLDICT_H__
+#define __SVGLDICT_H__
+
+#include FT_INTERNAL_SERVICE_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   *  A service used to retrieve glyph names, as well as to find the
+   *  index of a given glyph name in a font.
+   *
+   */
+
+#define FT_SERVICE_ID_GLYPH_DICT  "glyph-dict"
+
+
+  typedef FT_Error
+  (*FT_GlyphDict_GetNameFunc)( FT_Face     face,
+                               FT_UInt     glyph_index,
+                               FT_Pointer  buffer,
+                               FT_UInt     buffer_max );
+
+  typedef FT_UInt
+  (*FT_GlyphDict_NameIndexFunc)( FT_Face     face,
+                                 FT_String*  glyph_name );
+
+
+  FT_DEFINE_SERVICE( GlyphDict )
+  {
+    FT_GlyphDict_GetNameFunc    get_name;
+    FT_GlyphDict_NameIndexFunc  name_index;  /* optional */
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_,                        \
+                                        get_name_,                     \
+                                        name_index_)                   \
+  static const FT_Service_GlyphDictRec  class_ =                       \
+  {                                                                    \
+    get_name_, name_index_                                             \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_,                        \
+                                        get_name_,                     \
+                                        name_index_)                   \
+  void                                                                 \
+  FT_Init_Class_ ## class_( FT_Library                library,         \
+                            FT_Service_GlyphDictRec*  clazz )          \
+  {                                                                    \
+    FT_UNUSED( library );                                              \
+                                                                       \
+    clazz->get_name   = get_name_;                                     \
+    clazz->name_index = name_index_;                                   \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVGLDICT_H__ */
diff --git a/include/freetype/internal/services/svgxval.h b/include/freetype/internal/services/svgxval.h
new file mode 100644 (file)
index 0000000..2cdab50
--- /dev/null
@@ -0,0 +1,72 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svgxval.h                                                              */
+/*                                                                         */
+/*    FreeType API for validating TrueTypeGX/AAT tables (specification).   */
+/*                                                                         */
+/*  Copyright 2004, 2005 by                                                */
+/*  Masatake YAMATO, Red Hat K.K.,                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVGXVAL_H__
+#define __SVGXVAL_H__
+
+#include FT_GX_VALIDATE_H
+#include FT_INTERNAL_VALIDATE_H
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_GX_VALIDATE           "truetypegx-validate"
+#define FT_SERVICE_ID_CLASSICKERN_VALIDATE  "classickern-validate"
+
+  typedef FT_Error
+  (*gxv_validate_func)( FT_Face   face,
+                        FT_UInt   gx_flags,
+                        FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],
+                        FT_UInt   table_length );
+
+
+  typedef FT_Error
+  (*ckern_validate_func)( FT_Face   face,
+                          FT_UInt   ckern_flags,
+                          FT_Bytes  *ckern_table );
+
+
+  FT_DEFINE_SERVICE( GXvalidate )
+  {
+    gxv_validate_func  validate;
+  };
+
+  FT_DEFINE_SERVICE( CKERNvalidate )
+  {
+    ckern_validate_func  validate;
+  };
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVGXVAL_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svkern.h b/include/freetype/internal/services/svkern.h
new file mode 100644 (file)
index 0000000..1488adf
--- /dev/null
@@ -0,0 +1,51 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svkern.h                                                               */
+/*                                                                         */
+/*    The FreeType Kerning service (specification).                        */
+/*                                                                         */
+/*  Copyright 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVKERN_H__
+#define __SVKERN_H__
+
+#include FT_INTERNAL_SERVICE_H
+#include FT_TRUETYPE_TABLES_H
+
+
+FT_BEGIN_HEADER
+
+#define FT_SERVICE_ID_KERNING  "kerning"
+
+
+  typedef FT_Error
+  (*FT_Kerning_TrackGetFunc)( FT_Face    face,
+                              FT_Fixed   point_size,
+                              FT_Int     degree,
+                              FT_Fixed*  akerning );
+
+  FT_DEFINE_SERVICE( Kerning )
+  {
+    FT_Kerning_TrackGetFunc  get_track;
+  };
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVKERN_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svmm.h b/include/freetype/internal/services/svmm.h
new file mode 100644 (file)
index 0000000..b08a663
--- /dev/null
@@ -0,0 +1,113 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svmm.h                                                                 */
+/*                                                                         */
+/*    The FreeType Multiple Masters and GX var services (specification).   */
+/*                                                                         */
+/*  Copyright 2003, 2004, 2009, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVMM_H__
+#define __SVMM_H__
+
+#include FT_INTERNAL_SERVICE_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   *  A service used to manage multiple-masters data in a given face.
+   *
+   *  See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H).
+   *
+   */
+
+#define FT_SERVICE_ID_MULTI_MASTERS  "multi-masters"
+
+
+  typedef FT_Error
+  (*FT_Get_MM_Func)( FT_Face           face,
+                     FT_Multi_Master*  master );
+
+  typedef FT_Error
+  (*FT_Get_MM_Var_Func)( FT_Face      face,
+                         FT_MM_Var*  *master );
+
+  typedef FT_Error
+  (*FT_Set_MM_Design_Func)( FT_Face   face,
+                            FT_UInt   num_coords,
+                            FT_Long*  coords );
+
+  typedef FT_Error
+  (*FT_Set_Var_Design_Func)( FT_Face    face,
+                             FT_UInt    num_coords,
+                             FT_Fixed*  coords );
+
+  typedef FT_Error
+  (*FT_Set_MM_Blend_Func)( FT_Face   face,
+                           FT_UInt   num_coords,
+                           FT_Long*  coords );
+
+
+  FT_DEFINE_SERVICE( MultiMasters )
+  {
+    FT_Get_MM_Func          get_mm;
+    FT_Set_MM_Design_Func   set_mm_design;
+    FT_Set_MM_Blend_Func    set_mm_blend;
+    FT_Get_MM_Var_Func      get_mm_var;
+    FT_Set_Var_Design_Func  set_var_design;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,                          \
+                                           get_mm_,                         \
+                                           set_mm_design_,                  \
+                                           set_mm_blend_,                   \
+                                           get_mm_var_,                     \
+                                           set_var_design_ )                \
+  static const FT_Service_MultiMastersRec  class_ =                         \
+  {                                                                         \
+    get_mm_, set_mm_design_, set_mm_blend_, get_mm_var_, set_var_design_    \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,                          \
+                                           get_mm_,                         \
+                                           set_mm_design_,                  \
+                                           set_mm_blend_,                   \
+                                           get_mm_var_,                     \
+                                           set_var_design_ )                \
+  void                                                                      \
+  FT_Init_Class_ ## class_( FT_Service_MultiMastersRec*  clazz )            \
+  {                                                                         \
+    clazz->get_mm         = get_mm_;                                        \
+    clazz->set_mm_design  = set_mm_design_;                                 \
+    clazz->set_mm_blend   = set_mm_blend_;                                  \
+    clazz->get_mm_var     = get_mm_var_;                                    \
+    clazz->set_var_design = set_var_design_;                                \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __SVMM_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svotval.h b/include/freetype/internal/services/svotval.h
new file mode 100644 (file)
index 0000000..970bbd5
--- /dev/null
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svotval.h                                                              */
+/*                                                                         */
+/*    The FreeType OpenType validation service (specification).            */
+/*                                                                         */
+/*  Copyright 2004, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVOTVAL_H__
+#define __SVOTVAL_H__
+
+#include FT_OPENTYPE_VALIDATE_H
+#include FT_INTERNAL_VALIDATE_H
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_OPENTYPE_VALIDATE  "opentype-validate"
+
+
+  typedef FT_Error
+  (*otv_validate_func)( FT_Face volatile  face,
+                        FT_UInt           ot_flags,
+                        FT_Bytes         *base,
+                        FT_Bytes         *gdef,
+                        FT_Bytes         *gpos,
+                        FT_Bytes         *gsub,
+                        FT_Bytes         *jstf );
+
+
+  FT_DEFINE_SERVICE( OTvalidate )
+  {
+    otv_validate_func  validate;
+  };
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVOTVAL_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svpfr.h b/include/freetype/internal/services/svpfr.h
new file mode 100644 (file)
index 0000000..462786f
--- /dev/null
@@ -0,0 +1,66 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svpfr.h                                                                */
+/*                                                                         */
+/*    Internal PFR service functions (specification).                      */
+/*                                                                         */
+/*  Copyright 2003, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVPFR_H__
+#define __SVPFR_H__
+
+#include FT_PFR_H
+#include FT_INTERNAL_SERVICE_H
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_PFR_METRICS  "pfr-metrics"
+
+
+  typedef FT_Error
+  (*FT_PFR_GetMetricsFunc)( FT_Face    face,
+                            FT_UInt   *aoutline,
+                            FT_UInt   *ametrics,
+                            FT_Fixed  *ax_scale,
+                            FT_Fixed  *ay_scale );
+
+  typedef FT_Error
+  (*FT_PFR_GetKerningFunc)( FT_Face     face,
+                            FT_UInt     left,
+                            FT_UInt     right,
+                            FT_Vector  *avector );
+
+  typedef FT_Error
+  (*FT_PFR_GetAdvanceFunc)( FT_Face   face,
+                            FT_UInt   gindex,
+                            FT_Pos   *aadvance );
+
+
+  FT_DEFINE_SERVICE( PfrMetrics )
+  {
+    FT_PFR_GetMetricsFunc  get_metrics;
+    FT_PFR_GetKerningFunc  get_kerning;
+    FT_PFR_GetAdvanceFunc  get_advance;
+
+  };
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __SVPFR_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svpostnm.h b/include/freetype/internal/services/svpostnm.h
new file mode 100644 (file)
index 0000000..a76b4fe
--- /dev/null
@@ -0,0 +1,81 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svpostnm.h                                                             */
+/*                                                                         */
+/*    The FreeType PostScript name services (specification).               */
+/*                                                                         */
+/*  Copyright 2003, 2007, 2009, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVPOSTNM_H__
+#define __SVPOSTNM_H__
+
+#include FT_INTERNAL_SERVICE_H
+
+
+FT_BEGIN_HEADER
+
+  /*
+   *  A trivial service used to retrieve the PostScript name of a given
+   *  font when available.  The `get_name' field should never be NULL.
+   *
+   *  The corresponding function can return NULL to indicate that the
+   *  PostScript name is not available.
+   *
+   *  The name is owned by the face and will be destroyed with it.
+   */
+
+#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME  "postscript-font-name"
+
+
+  typedef const char*
+  (*FT_PsName_GetFunc)( FT_Face  face );
+
+
+  FT_DEFINE_SERVICE( PsFontName )
+  {
+    FT_PsName_GetFunc  get_ps_font_name;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \
+  static const FT_Service_PsFontNameRec  class_ =                    \
+  {                                                                  \
+    get_ps_font_name_                                                \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \
+  void                                                               \
+  FT_Init_Class_ ## class_( FT_Library                 library,      \
+                            FT_Service_PsFontNameRec*  clazz )       \
+  {                                                                  \
+    FT_UNUSED( library );                                            \
+                                                                     \
+    clazz->get_ps_font_name = get_ps_font_name_;                     \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPOSTNM_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svpscmap.h b/include/freetype/internal/services/svpscmap.h
new file mode 100644 (file)
index 0000000..030948e
--- /dev/null
@@ -0,0 +1,177 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svpscmap.h                                                             */
+/*                                                                         */
+/*    The FreeType PostScript charmap service (specification).             */
+/*                                                                         */
+/*  Copyright 2003, 2006, 2009, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVPSCMAP_H__
+#define __SVPSCMAP_H__
+
+#include FT_INTERNAL_OBJECTS_H
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_POSTSCRIPT_CMAPS  "postscript-cmaps"
+
+
+  /*
+   *  Adobe glyph name to unicode value.
+   */
+  typedef FT_UInt32
+  (*PS_Unicode_ValueFunc)( const char*  glyph_name );
+
+  /*
+   *  Macintosh name id to glyph name.  NULL if invalid index.
+   */
+  typedef const char*
+  (*PS_Macintosh_NameFunc)( FT_UInt  name_index );
+
+  /*
+   *  Adobe standard string ID to glyph name.  NULL if invalid index.
+   */
+  typedef const char*
+  (*PS_Adobe_Std_StringsFunc)( FT_UInt  string_index );
+
+
+  /*
+   *  Simple unicode -> glyph index charmap built from font glyph names
+   *  table.
+   */
+  typedef struct  PS_UniMap_
+  {
+    FT_UInt32  unicode;      /* bit 31 set: is glyph variant */
+    FT_UInt    glyph_index;
+
+  } PS_UniMap;
+
+
+  typedef struct PS_UnicodesRec_*  PS_Unicodes;
+
+  typedef struct  PS_UnicodesRec_
+  {
+    FT_CMapRec  cmap;
+    FT_UInt     num_maps;
+    PS_UniMap*  maps;
+
+  } PS_UnicodesRec;
+
+
+  /*
+   *  A function which returns a glyph name for a given index.  Returns
+   *  NULL if invalid index.
+   */
+  typedef const char*
+  (*PS_GetGlyphNameFunc)( FT_Pointer  data,
+                          FT_UInt     string_index );
+
+  /*
+   *  A function used to release the glyph name returned by
+   *  PS_GetGlyphNameFunc, when needed
+   */
+  typedef void
+  (*PS_FreeGlyphNameFunc)( FT_Pointer  data,
+                           const char*  name );
+
+  typedef FT_Error
+  (*PS_Unicodes_InitFunc)( FT_Memory             memory,
+                           PS_Unicodes           unicodes,
+                           FT_UInt               num_glyphs,
+                           PS_GetGlyphNameFunc   get_glyph_name,
+                           PS_FreeGlyphNameFunc  free_glyph_name,
+                           FT_Pointer            glyph_data );
+
+  typedef FT_UInt
+  (*PS_Unicodes_CharIndexFunc)( PS_Unicodes  unicodes,
+                                FT_UInt32    unicode );
+
+  typedef FT_UInt32
+  (*PS_Unicodes_CharNextFunc)( PS_Unicodes  unicodes,
+                               FT_UInt32   *unicode );
+
+
+  FT_DEFINE_SERVICE( PsCMaps )
+  {
+    PS_Unicode_ValueFunc       unicode_value;
+
+    PS_Unicodes_InitFunc       unicodes_init;
+    PS_Unicodes_CharIndexFunc  unicodes_char_index;
+    PS_Unicodes_CharNextFunc   unicodes_char_next;
+
+    PS_Macintosh_NameFunc      macintosh_name;
+    PS_Adobe_Std_StringsFunc   adobe_std_strings;
+    const unsigned short*      adobe_std_encoding;
+    const unsigned short*      adobe_expert_encoding;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PSCMAPSREC( class_,                               \
+                                      unicode_value_,                       \
+                                      unicodes_init_,                       \
+                                      unicodes_char_index_,                 \
+                                      unicodes_char_next_,                  \
+                                      macintosh_name_,                      \
+                                      adobe_std_strings_,                   \
+                                      adobe_std_encoding_,                  \
+                                      adobe_expert_encoding_ )              \
+  static const FT_Service_PsCMapsRec  class_ =                              \
+  {                                                                         \
+    unicode_value_, unicodes_init_,                                         \
+    unicodes_char_index_, unicodes_char_next_, macintosh_name_,             \
+    adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_         \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PSCMAPSREC( class_,                               \
+                                      unicode_value_,                       \
+                                      unicodes_init_,                       \
+                                      unicodes_char_index_,                 \
+                                      unicodes_char_next_,                  \
+                                      macintosh_name_,                      \
+                                      adobe_std_strings_,                   \
+                                      adobe_std_encoding_,                  \
+                                      adobe_expert_encoding_ )              \
+  void                                                                      \
+  FT_Init_Class_ ## class_( FT_Library              library,                \
+                            FT_Service_PsCMapsRec*  clazz )                 \
+  {                                                                         \
+    FT_UNUSED( library );                                                   \
+                                                                            \
+    clazz->unicode_value         = unicode_value_;                          \
+    clazz->unicodes_init         = unicodes_init_;                          \
+    clazz->unicodes_char_index   = unicodes_char_index_;                    \
+    clazz->unicodes_char_next    = unicodes_char_next_;                     \
+    clazz->macintosh_name        = macintosh_name_;                         \
+    clazz->adobe_std_strings     = adobe_std_strings_;                      \
+    clazz->adobe_std_encoding    = adobe_std_encoding_;                     \
+    clazz->adobe_expert_encoding = adobe_expert_encoding_;                  \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPSCMAP_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svpsinfo.h b/include/freetype/internal/services/svpsinfo.h
new file mode 100644 (file)
index 0000000..4bfb506
--- /dev/null
@@ -0,0 +1,111 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svpsinfo.h                                                             */
+/*                                                                         */
+/*    The FreeType PostScript info service (specification).                */
+/*                                                                         */
+/*  Copyright 2003, 2004, 2009, 2011, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVPSINFO_H__
+#define __SVPSINFO_H__
+
+#include FT_INTERNAL_SERVICE_H
+#include FT_INTERNAL_TYPE1_TYPES_H
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_POSTSCRIPT_INFO  "postscript-info"
+
+
+  typedef FT_Error
+  (*PS_GetFontInfoFunc)( FT_Face          face,
+                         PS_FontInfoRec*  afont_info );
+
+  typedef FT_Error
+  (*PS_GetFontExtraFunc)( FT_Face           face,
+                          PS_FontExtraRec*  afont_extra );
+
+  typedef FT_Int
+  (*PS_HasGlyphNamesFunc)( FT_Face  face );
+
+  typedef FT_Error
+  (*PS_GetFontPrivateFunc)( FT_Face         face,
+                            PS_PrivateRec*  afont_private );
+
+  typedef FT_Long
+  (*PS_GetFontValueFunc)( FT_Face       face,
+                          PS_Dict_Keys  key,
+                          FT_UInt       idx,
+                          void         *value,
+                          FT_Long       value_len );
+
+
+  FT_DEFINE_SERVICE( PsInfo )
+  {
+    PS_GetFontInfoFunc     ps_get_font_info;
+    PS_GetFontExtraFunc    ps_get_font_extra;
+    PS_HasGlyphNamesFunc   ps_has_glyph_names;
+    PS_GetFontPrivateFunc  ps_get_font_private;
+    PS_GetFontValueFunc    ps_get_font_value;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_PSINFOREC( class_,                     \
+                                     get_font_info_,             \
+                                     ps_get_font_extra_,         \
+                                     has_glyph_names_,           \
+                                     get_font_private_,          \
+                                     get_font_value_ )           \
+  static const FT_Service_PsInfoRec  class_ =                    \
+  {                                                              \
+    get_font_info_, ps_get_font_extra_, has_glyph_names_,        \
+    get_font_private_, get_font_value_                           \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_PSINFOREC( class_,                     \
+                                     get_font_info_,             \
+                                     ps_get_font_extra_,         \
+                                     has_glyph_names_,           \
+                                     get_font_private_,          \
+                                     get_font_value_ )           \
+  void                                                           \
+  FT_Init_Class_ ## class_( FT_Library             library,      \
+                            FT_Service_PsInfoRec*  clazz )       \
+  {                                                              \
+    FT_UNUSED( library );                                        \
+                                                                 \
+    clazz->ps_get_font_info    = get_font_info_;                 \
+    clazz->ps_get_font_extra   = ps_get_font_extra_;             \
+    clazz->ps_has_glyph_names  = has_glyph_names_;               \
+    clazz->ps_get_font_private = get_font_private_;              \
+    clazz->ps_get_font_value   = get_font_value_;                \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVPSINFO_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svsfnt.h b/include/freetype/internal/services/svsfnt.h
new file mode 100644 (file)
index 0000000..d3835aa
--- /dev/null
@@ -0,0 +1,103 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svsfnt.h                                                               */
+/*                                                                         */
+/*    The FreeType SFNT table loading service (specification).             */
+/*                                                                         */
+/*  Copyright 2003, 2004, 2009, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVSFNT_H__
+#define __SVSFNT_H__
+
+#include FT_INTERNAL_SERVICE_H
+#include FT_TRUETYPE_TABLES_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   *  SFNT table loading service.
+   */
+
+#define FT_SERVICE_ID_SFNT_TABLE  "sfnt-table"
+
+
+  /*
+   * Used to implement FT_Load_Sfnt_Table().
+   */
+  typedef FT_Error
+  (*FT_SFNT_TableLoadFunc)( FT_Face    face,
+                            FT_ULong   tag,
+                            FT_Long    offset,
+                            FT_Byte*   buffer,
+                            FT_ULong*  length );
+
+  /*
+   * Used to implement FT_Get_Sfnt_Table().
+   */
+  typedef void*
+  (*FT_SFNT_TableGetFunc)( FT_Face      face,
+                           FT_Sfnt_Tag  tag );
+
+
+  /*
+   * Used to implement FT_Sfnt_Table_Info().
+   */
+  typedef FT_Error
+  (*FT_SFNT_TableInfoFunc)( FT_Face    face,
+                            FT_UInt    idx,
+                            FT_ULong  *tag,
+                            FT_ULong  *offset,
+                            FT_ULong  *length );
+
+
+  FT_DEFINE_SERVICE( SFNT_Table )
+  {
+    FT_SFNT_TableLoadFunc  load_table;
+    FT_SFNT_TableGetFunc   get_table;
+    FT_SFNT_TableInfoFunc  table_info;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ )  \
+  static const FT_Service_SFNT_TableRec  class_ =                      \
+  {                                                                    \
+    load_, get_, info_                                                 \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \
+  void                                                                \
+  FT_Init_Class_ ## class_( FT_Service_SFNT_TableRec*  clazz )        \
+  {                                                                   \
+    clazz->load_table = load_;                                        \
+    clazz->get_table  = get_;                                         \
+    clazz->table_info = info_;                                        \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVSFNT_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svttcmap.h b/include/freetype/internal/services/svttcmap.h
new file mode 100644 (file)
index 0000000..83994aa
--- /dev/null
@@ -0,0 +1,107 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svttcmap.h                                                             */
+/*                                                                         */
+/*    The FreeType TrueType/sfnt cmap extra information service.           */
+/*                                                                         */
+/*  Copyright 2003 by                                                      */
+/*  Masatake YAMATO, Redhat K.K.                                           */
+/*                                                                         */
+/*  Copyright 2003, 2008, 2009, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/* Development of this service is support of
+   Information-technology Promotion Agency, Japan. */
+
+#ifndef __SVTTCMAP_H__
+#define __SVTTCMAP_H__
+
+#include FT_INTERNAL_SERVICE_H
+#include FT_TRUETYPE_TABLES_H
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_TT_CMAP  "tt-cmaps"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_CMapInfo                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to store TrueType/sfnt specific cmap information  */
+  /*    which is not covered by the generic @FT_CharMap structure.  This   */
+  /*    structure can be accessed with the @FT_Get_TT_CMap_Info function.  */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    language ::                                                        */
+  /*      The language ID used in Mac fonts.  Definitions of values are in */
+  /*      freetype/ttnameid.h.                                             */
+  /*                                                                       */
+  /*    format ::                                                          */
+  /*      The cmap format.  OpenType 1.5 defines the formats 0 (byte       */
+  /*      encoding table), 2~(high-byte mapping through table), 4~(segment */
+  /*      mapping to delta values), 6~(trimmed table mapping), 8~(mixed    */
+  /*      16-bit and 32-bit coverage), 10~(trimmed array), 12~(segmented   */
+  /*      coverage), and 14 (Unicode Variation Sequences).                 */
+  /*                                                                       */
+  typedef struct  TT_CMapInfo_
+  {
+    FT_ULong  language;
+    FT_Long   format;
+
+  } TT_CMapInfo;
+
+
+  typedef FT_Error
+  (*TT_CMap_Info_GetFunc)( FT_CharMap    charmap,
+                           TT_CMapInfo  *cmap_info );
+
+
+  FT_DEFINE_SERVICE( TTCMaps )
+  {
+    TT_CMap_Info_GetFunc  get_cmap_info;
+  };
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ )  \
+  static const FT_Service_TTCMapsRec  class_ =                  \
+  {                                                             \
+    get_cmap_info_                                              \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ )  \
+  void                                                          \
+  FT_Init_Class_ ## class_( FT_Library              library,    \
+                            FT_Service_TTCMapsRec*  clazz )     \
+  {                                                             \
+    FT_UNUSED( library );                                       \
+                                                                \
+    clazz->get_cmap_info = get_cmap_info_;                      \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __SVTTCMAP_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svtteng.h b/include/freetype/internal/services/svtteng.h
new file mode 100644 (file)
index 0000000..58e02a6
--- /dev/null
@@ -0,0 +1,53 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svtteng.h                                                              */
+/*                                                                         */
+/*    The FreeType TrueType engine query service (specification).          */
+/*                                                                         */
+/*  Copyright 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVTTENG_H__
+#define __SVTTENG_H__
+
+#include FT_INTERNAL_SERVICE_H
+#include FT_MODULE_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   *  SFNT table loading service.
+   */
+
+#define FT_SERVICE_ID_TRUETYPE_ENGINE  "truetype-engine"
+
+  /*
+   * Used to implement FT_Get_TrueType_Engine_Type
+   */
+
+  FT_DEFINE_SERVICE( TrueTypeEngine )
+  {
+    FT_TrueTypeEngineType  engine_type;
+  };
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVTTENG_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svttglyf.h b/include/freetype/internal/services/svttglyf.h
new file mode 100644 (file)
index 0000000..369eb84
--- /dev/null
@@ -0,0 +1,68 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svttglyf.h                                                             */
+/*                                                                         */
+/*    The FreeType TrueType glyph service.                                 */
+/*                                                                         */
+/*  Copyright 2007, 2009, 2012 by David Turner.                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#ifndef __SVTTGLYF_H__
+#define __SVTTGLYF_H__
+
+#include FT_INTERNAL_SERVICE_H
+#include FT_TRUETYPE_TABLES_H
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_TT_GLYF  "tt-glyf"
+
+
+  typedef FT_ULong
+  (*TT_Glyf_GetLocationFunc)( FT_Face    face,
+                              FT_UInt    gindex,
+                              FT_ULong  *psize );
+
+  FT_DEFINE_SERVICE( TTGlyf )
+  {
+    TT_Glyf_GetLocationFunc  get_location;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ )  \
+  static const FT_Service_TTGlyfRec  class_ =                 \
+  {                                                           \
+    get_location_                                             \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ )  \
+  void                                                        \
+  FT_Init_Class_ ## class_( FT_Service_TTGlyfRec*  clazz )    \
+  {                                                           \
+    clazz->get_location = get_location_;                      \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __SVTTGLYF_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svwinfnt.h b/include/freetype/internal/services/svwinfnt.h
new file mode 100644 (file)
index 0000000..57f7765
--- /dev/null
@@ -0,0 +1,50 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svwinfnt.h                                                             */
+/*                                                                         */
+/*    The FreeType Windows FNT/FONT service (specification).               */
+/*                                                                         */
+/*  Copyright 2003 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVWINFNT_H__
+#define __SVWINFNT_H__
+
+#include FT_INTERNAL_SERVICE_H
+#include FT_WINFONTS_H
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_WINFNT  "winfonts"
+
+  typedef FT_Error
+  (*FT_WinFnt_GetHeaderFunc)( FT_Face               face,
+                              FT_WinFNT_HeaderRec  *aheader );
+
+
+  FT_DEFINE_SERVICE( WinFnt )
+  {
+    FT_WinFnt_GetHeaderFunc  get_header;
+  };
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVWINFNT_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/services/svxf86nm.h b/include/freetype/internal/services/svxf86nm.h
new file mode 100644 (file)
index 0000000..ca5d884
--- /dev/null
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svxf86nm.h                                                             */
+/*                                                                         */
+/*    The FreeType XFree86 services (specification only).                  */
+/*                                                                         */
+/*  Copyright 2003 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SVXF86NM_H__
+#define __SVXF86NM_H__
+
+#include FT_INTERNAL_SERVICE_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*
+   *  A trivial service used to return the name of a face's font driver,
+   *  according to the XFree86 nomenclature.  Note that the service data
+   *  is a simple constant string pointer.
+   */
+
+#define FT_SERVICE_ID_XF86_NAME  "xf86-driver-name"
+
+#define FT_XF86_FORMAT_TRUETYPE  "TrueType"
+#define FT_XF86_FORMAT_TYPE_1    "Type 1"
+#define FT_XF86_FORMAT_BDF       "BDF"
+#define FT_XF86_FORMAT_PCF       "PCF"
+#define FT_XF86_FORMAT_TYPE_42   "Type 42"
+#define FT_XF86_FORMAT_CID       "CID Type 1"
+#define FT_XF86_FORMAT_CFF       "CFF"
+#define FT_XF86_FORMAT_PFR       "PFR"
+#define FT_XF86_FORMAT_WINFNT    "Windows FNT"
+
+  /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __SVXF86NM_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/sfnt.h b/include/freetype/internal/sfnt.h
new file mode 100644 (file)
index 0000000..905ca8c
--- /dev/null
@@ -0,0 +1,897 @@
+/***************************************************************************/
+/*                                                                         */
+/*  sfnt.h                                                                 */
+/*                                                                         */
+/*    High-level `sfnt' driver interface (specification).                  */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SFNT_H__
+#define __SFNT_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DRIVER_H
+#include FT_INTERNAL_TRUETYPE_TYPES_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Init_Face_Func                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    First part of the SFNT face object initialization.  This finds     */
+  /*    the face in a SFNT file or collection, and load its format tag in  */
+  /*    face->format_tag.                                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream     :: The input stream.                                    */
+  /*                                                                       */
+  /*    face       :: A handle to the target face object.                  */
+  /*                                                                       */
+  /*    face_index :: The index of the TrueType font, if we are opening a  */
+  /*                  collection.                                          */
+  /*                                                                       */
+  /*    num_params :: The number of additional parameters.                 */
+  /*                                                                       */
+  /*    params     :: Optional additional parameters.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The stream cursor must be at the font file's origin.               */
+  /*                                                                       */
+  /*    This function recognizes fonts embedded in a `TrueType             */
+  /*    collection'.                                                       */
+  /*                                                                       */
+  /*    Once the format tag has been validated by the font driver, it      */
+  /*    should then call the TT_Load_Face_Func() callback to read the rest */
+  /*    of the SFNT tables in the object.                                  */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Init_Face_Func)( FT_Stream      stream,
+                        TT_Face        face,
+                        FT_Int         face_index,
+                        FT_Int         num_params,
+                        FT_Parameter*  params );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_Face_Func                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Second part of the SFNT face object initialization.  This loads    */
+  /*    the common SFNT tables (head, OS/2, maxp, metrics, etc.) in the    */
+  /*    face object.                                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream     :: The input stream.                                    */
+  /*                                                                       */
+  /*    face       :: A handle to the target face object.                  */
+  /*                                                                       */
+  /*    face_index :: The index of the TrueType font, if we are opening a  */
+  /*                  collection.                                          */
+  /*                                                                       */
+  /*    num_params :: The number of additional parameters.                 */
+  /*                                                                       */
+  /*    params     :: Optional additional parameters.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function must be called after TT_Init_Face_Func().            */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_Face_Func)( FT_Stream      stream,
+                        TT_Face        face,
+                        FT_Int         face_index,
+                        FT_Int         num_params,
+                        FT_Parameter*  params );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Done_Face_Func                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A callback used to delete the common SFNT data from a face.        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the target face object.                        */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function does NOT destroy the face object.                    */
+  /*                                                                       */
+  typedef void
+  (*TT_Done_Face_Func)( TT_Face  face );
+
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_SFNT_HeaderRec_Func                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the header of a SFNT font file.  Supports collections.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face       :: A handle to the target face object.                  */
+  /*                                                                       */
+  /*    stream     :: The input stream.                                    */
+  /*                                                                       */
+  /*    face_index :: The index of the TrueType font, if we are opening a  */
+  /*                  collection.                                          */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    sfnt       :: The SFNT header.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The stream cursor must be at the font file's origin.               */
+  /*                                                                       */
+  /*    This function recognizes fonts embedded in a `TrueType             */
+  /*    collection'.                                                       */
+  /*                                                                       */
+  /*    This function checks that the header is valid by looking at the    */
+  /*    values of `search_range', `entry_selector', and `range_shift'.     */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_SFNT_HeaderRec_Func)( TT_Face      face,
+                                  FT_Stream    stream,
+                                  FT_Long      face_index,
+                                  SFNT_Header  sfnt );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_Directory_Func                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the table directory into a face object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /*    sfnt   :: The SFNT header.                                         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The stream cursor must be on the first byte after the 4-byte font  */
+  /*    format tag.  This is the case just after a call to                 */
+  /*    TT_Load_Format_Tag().                                              */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_Directory_Func)( TT_Face      face,
+                             FT_Stream    stream,
+                             SFNT_Header  sfnt );
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_Any_Func                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load any font table into client memory.                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: The face object to look for.                             */
+  /*                                                                       */
+  /*    tag    :: The tag of table to load.  Use the value 0 if you want   */
+  /*              to access the whole font file, else set this parameter   */
+  /*              to a valid TrueType table tag that you can forge with    */
+  /*              the MAKE_TT_TAG macro.                                   */
+  /*                                                                       */
+  /*    offset :: The starting offset in the table (or the file if         */
+  /*              tag == 0).                                               */
+  /*                                                                       */
+  /*    length :: The address of the decision variable:                    */
+  /*                                                                       */
+  /*                If length == NULL:                                     */
+  /*                  Loads the whole table.  Returns an error if          */
+  /*                  `offset' == 0!                                       */
+  /*                                                                       */
+  /*                If *length == 0:                                       */
+  /*                  Exits immediately; returning the length of the given */
+  /*                  table or of the font file, depending on the value of */
+  /*                  `tag'.                                               */
+  /*                                                                       */
+  /*                If *length != 0:                                       */
+  /*                  Loads the next `length' bytes of table or font,      */
+  /*                  starting at offset `offset' (in table or font too).  */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    buffer :: The address of target buffer.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    TrueType error code.  0 means success.                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_Any_Func)( TT_Face    face,
+                       FT_ULong   tag,
+                       FT_Long    offset,
+                       FT_Byte   *buffer,
+                       FT_ULong*  length );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Find_SBit_Image_Func                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Check whether an embedded bitmap (an `sbit') exists for a given    */
+  /*    glyph, at a given strike.                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face          :: The target face object.                           */
+  /*                                                                       */
+  /*    glyph_index   :: The glyph index.                                  */
+  /*                                                                       */
+  /*    strike_index  :: The current strike index.                         */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    arange        :: The SBit range containing the glyph index.        */
+  /*                                                                       */
+  /*    astrike       :: The SBit strike containing the glyph index.       */
+  /*                                                                       */
+  /*    aglyph_offset :: The offset of the glyph data in `EBDT' table.     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.  Returns                    */
+  /*    SFNT_Err_Invalid_Argument if no sbit exists for the requested      */
+  /*    glyph.                                                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Find_SBit_Image_Func)( TT_Face          face,
+                              FT_UInt          glyph_index,
+                              FT_ULong         strike_index,
+                              TT_SBit_Range   *arange,
+                              TT_SBit_Strike  *astrike,
+                              FT_ULong        *aglyph_offset );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_SBit_Metrics_Func                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the big metrics for a given embedded bitmap.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream      :: The input stream.                                   */
+  /*                                                                       */
+  /*    range       :: The SBit range containing the glyph.                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    big_metrics :: A big SBit metrics structure for the glyph.         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The stream cursor must be positioned at the glyph's offset within  */
+  /*    the `EBDT' table before the call.                                  */
+  /*                                                                       */
+  /*    If the image format uses variable metrics, the stream cursor is    */
+  /*    positioned just after the metrics header in the `EBDT' table on    */
+  /*    function exit.                                                     */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_SBit_Metrics_Func)( FT_Stream        stream,
+                                TT_SBit_Range    range,
+                                TT_SBit_Metrics  metrics );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_SBit_Image_Func                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load a given glyph sbit image from the font resource.  This also   */
+  /*    returns its metrics.                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face ::                                                            */
+  /*      The target face object.                                          */
+  /*                                                                       */
+  /*    strike_index ::                                                    */
+  /*      The strike index.                                                */
+  /*                                                                       */
+  /*    glyph_index ::                                                     */
+  /*      The current glyph index.                                         */
+  /*                                                                       */
+  /*    load_flags ::                                                      */
+  /*      The current load flags.                                          */
+  /*                                                                       */
+  /*    stream ::                                                          */
+  /*      The input stream.                                                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    amap ::                                                            */
+  /*      The target pixmap.                                               */
+  /*                                                                       */
+  /*    ametrics ::                                                        */
+  /*      A big sbit metrics structure for the glyph image.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.  Returns an error if no     */
+  /*    glyph sbit exists for the index.                                   */
+  /*                                                                       */
+  /*  <Note>                                                               */
+  /*    The `map.buffer' field is always freed before the glyph is loaded. */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_SBit_Image_Func)( TT_Face              face,
+                              FT_ULong             strike_index,
+                              FT_UInt              glyph_index,
+                              FT_UInt              load_flags,
+                              FT_Stream            stream,
+                              FT_Bitmap           *amap,
+                              TT_SBit_MetricsRec  *ametrics );
+
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Set_SBit_Strike_OldFunc                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Select an sbit strike for a given size request.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face          :: The target face object.                           */
+  /*                                                                       */
+  /*    req           :: The size request.                                 */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    astrike_index :: The index of the sbit strike.                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.  Returns an error if no     */
+  /*    sbit strike exists for the selected ppem values.                   */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Set_SBit_Strike_OldFunc)( TT_Face    face,
+                                 FT_UInt    x_ppem,
+                                 FT_UInt    y_ppem,
+                                 FT_ULong*  astrike_index );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_CharMap_Load_Func                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads a given TrueType character map into memory.                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the parent face object.                      */
+  /*                                                                       */
+  /*    stream :: A handle to the current stream object.                   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    cmap   :: A pointer to a cmap object.                              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The function assumes that the stream is already in use (i.e.,      */
+  /*    opened).  In case of error, all partially allocated tables are     */
+  /*    released.                                                          */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_CharMap_Load_Func)( TT_Face    face,
+                           void*      cmap,
+                           FT_Stream  input );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_CharMap_Free_Func                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroys a character mapping table.                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the parent face object.                        */
+  /*                                                                       */
+  /*    cmap :: A handle to a cmap object.                                 */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_CharMap_Free_Func)( TT_Face       face,
+                           void*         cmap );
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Set_SBit_Strike_Func                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Select an sbit strike for a given size request.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face          :: The target face object.                           */
+  /*                                                                       */
+  /*    req           :: The size request.                                 */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    astrike_index :: The index of the sbit strike.                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.  Returns an error if no     */
+  /*    sbit strike exists for the selected ppem values.                   */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Set_SBit_Strike_Func)( TT_Face          face,
+                              FT_Size_Request  req,
+                              FT_ULong*        astrike_index );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_Strike_Metrics_Func                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the metrics of a given strike.                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face          :: The target face object.                           */
+  /*                                                                       */
+  /*    strike_index  :: The strike index.                                 */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    metrics       :: the metrics of the strike.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.  Returns an error if no     */
+  /*    such sbit strike exists.                                           */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_Strike_Metrics_Func)( TT_Face           face,
+                                  FT_ULong          strike_index,
+                                  FT_Size_Metrics*  metrics );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Get_PS_Name_Func                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the PostScript glyph name of a glyph.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    idx  :: The glyph index.                                           */
+  /*                                                                       */
+  /*    PSname :: The address of a string pointer.  Will be NULL in case   */
+  /*              of error, otherwise it is a pointer to the glyph name.   */
+  /*                                                                       */
+  /*              You must not modify the returned string!                 */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Get_PS_Name_Func)( TT_Face      face,
+                          FT_UInt      idx,
+                          FT_String**  PSname );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_Metrics_Func                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load a metrics table, which is a table with a horizontal and a     */
+  /*    vertical version.                                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face     :: A handle to the target face object.                    */
+  /*                                                                       */
+  /*    stream   :: The input stream.                                      */
+  /*                                                                       */
+  /*    vertical :: A boolean flag.  If set, load the vertical one.        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_Metrics_Func)( TT_Face    face,
+                           FT_Stream  stream,
+                           FT_Bool    vertical );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Get_Metrics_Func                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the horizontal or vertical header in a face object.           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face     :: A handle to the target face object.                    */
+  /*                                                                       */
+  /*    stream   :: The input stream.                                      */
+  /*                                                                       */
+  /*    vertical :: A boolean flag.  If set, load vertical metrics.        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Get_Metrics_Func)( TT_Face     face,
+                          FT_Bool     vertical,
+                          FT_UInt     gindex,
+                          FT_Short*   abearing,
+                          FT_UShort*  aadvance );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Load_Table_Func                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load a given TrueType table.                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The function uses `face->goto_table' to seek the stream to the     */
+  /*    start of the table, except while loading the font directory.       */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Load_Table_Func)( TT_Face    face,
+                         FT_Stream  stream );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Free_Table_Func                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Free a given TrueType table.                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the target face object.                        */
+  /*                                                                       */
+  typedef void
+  (*TT_Free_Table_Func)( TT_Face  face );
+
+
+  /*
+   * @functype:
+   *    TT_Face_GetKerningFunc
+   *
+   * @description:
+   *    Return the horizontal kerning value between two glyphs.
+   *
+   * @input:
+   *    face        :: A handle to the source face object.
+   *    left_glyph  :: The left glyph index.
+   *    right_glyph :: The right glyph index.
+   *
+   * @return:
+   *    The kerning value in font units.
+   */
+  typedef FT_Int
+  (*TT_Face_GetKerningFunc)( TT_Face  face,
+                             FT_UInt  left_glyph,
+                             FT_UInt  right_glyph );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    SFNT_Interface                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure holds pointers to the functions used to load and    */
+  /*    free the basic tables that are required in a `sfnt' font file.     */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    Check the various xxx_Func() descriptions for details.             */
+  /*                                                                       */
+  typedef struct  SFNT_Interface_
+  {
+    TT_Loader_GotoTableFunc      goto_table;
+
+    TT_Init_Face_Func            init_face;
+    TT_Load_Face_Func            load_face;
+    TT_Done_Face_Func            done_face;
+    FT_Module_Requester          get_interface;
+
+    TT_Load_Any_Func             load_any;
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+    TT_Load_SFNT_HeaderRec_Func  load_sfnt_header;
+    TT_Load_Directory_Func       load_directory;
+#endif
+
+    /* these functions are called by `load_face' but they can also  */
+    /* be called from external modules, if there is a need to do so */
+    TT_Load_Table_Func           load_head;
+    TT_Load_Metrics_Func         load_hhea;
+    TT_Load_Table_Func           load_cmap;
+    TT_Load_Table_Func           load_maxp;
+    TT_Load_Table_Func           load_os2;
+    TT_Load_Table_Func           load_post;
+
+    TT_Load_Table_Func           load_name;
+    TT_Free_Table_Func           free_name;
+
+    /* optional tables */
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+    TT_Load_Table_Func           load_hdmx_stub;
+    TT_Free_Table_Func           free_hdmx_stub;
+#endif
+
+    /* this field was called `load_kerning' up to version 2.1.10 */
+    TT_Load_Table_Func           load_kern;
+
+    TT_Load_Table_Func           load_gasp;
+    TT_Load_Table_Func           load_pclt;
+
+    /* see `ttload.h'; this field was called `load_bitmap_header' up to */
+    /* version 2.1.10                                                   */
+    TT_Load_Table_Func           load_bhed;
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+    /* see `ttsbit.h' */
+    TT_Set_SBit_Strike_OldFunc   set_sbit_strike_stub;
+    TT_Load_Table_Func           load_sbits_stub;
+
+    /*
+     *  The following two fields appeared in version 2.1.8, and were placed
+     *  between `load_sbits' and `load_sbit_image'.  We support them as a
+     *  special exception since they are used by Xfont library within the
+     *  X.Org xserver, and because the probability that other rogue clients
+     *  use the other version 2.1.7 fields below is _extremely_ low.
+     *
+     *  Note that this forces us to disable an interesting memory-saving
+     *  optimization though...
+     */
+
+    TT_Find_SBit_Image_Func      find_sbit_image;
+    TT_Load_SBit_Metrics_Func    load_sbit_metrics;
+
+#endif
+
+    TT_Load_SBit_Image_Func      load_sbit_image;
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+    TT_Free_Table_Func           free_sbits_stub;
+#endif
+
+    /* see `ttpost.h' */
+    TT_Get_PS_Name_Func          get_psname;
+    TT_Free_Table_Func           free_psnames;
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+    TT_CharMap_Load_Func         load_charmap_stub;
+    TT_CharMap_Free_Func         free_charmap_stub;
+#endif
+
+    /* starting here, the structure differs from version 2.1.7 */
+
+    /* this field was introduced in version 2.1.8, named `get_psname' */
+    TT_Face_GetKerningFunc       get_kerning;
+
+    /* new elements introduced after version 2.1.10 */
+
+    /* load the font directory, i.e., the offset table and */
+    /* the table directory                                 */
+    TT_Load_Table_Func           load_font_dir;
+    TT_Load_Metrics_Func         load_hmtx;
+
+    TT_Load_Table_Func           load_eblc;
+    TT_Free_Table_Func           free_eblc;
+
+    TT_Set_SBit_Strike_Func      set_sbit_strike;
+    TT_Load_Strike_Metrics_Func  load_strike_metrics;
+
+    TT_Get_Metrics_Func          get_metrics;
+
+  } SFNT_Interface;
+
+
+  /* transitional */
+  typedef SFNT_Interface*   SFNT_Service;
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+#define FT_DEFINE_DRIVERS_OLD_INTERNAL(a) \
+  a,
+#else
+  #define FT_DEFINE_DRIVERS_OLD_INTERNAL(a)
+#endif
+#define FT_INTERNAL(a) \
+  a,
+
+#define FT_DEFINE_SFNT_INTERFACE(class_,                                     \
+    goto_table_, init_face_, load_face_, done_face_, get_interface_,         \
+    load_any_, load_sfnt_header_, load_directory_, load_head_,               \
+    load_hhea_, load_cmap_, load_maxp_, load_os2_, load_post_,               \
+    load_name_, free_name_, load_hdmx_stub_, free_hdmx_stub_,                \
+    load_kern_, load_gasp_, load_pclt_, load_bhed_,                          \
+    set_sbit_strike_stub_, load_sbits_stub_, find_sbit_image_,               \
+    load_sbit_metrics_, load_sbit_image_, free_sbits_stub_,                  \
+    get_psname_, free_psnames_, load_charmap_stub_, free_charmap_stub_,      \
+    get_kerning_, load_font_dir_, load_hmtx_, load_eblc_, free_eblc_,        \
+    set_sbit_strike_, load_strike_metrics_, get_metrics_ )                   \
+  static const SFNT_Interface class_ =                                       \
+  {                                                                          \
+    FT_INTERNAL(goto_table_) \
+    FT_INTERNAL(init_face_) \
+    FT_INTERNAL(load_face_) \
+    FT_INTERNAL(done_face_) \
+    FT_INTERNAL(get_interface_) \
+    FT_INTERNAL(load_any_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sfnt_header_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(load_directory_) \
+    FT_INTERNAL(load_head_) \
+    FT_INTERNAL(load_hhea_) \
+    FT_INTERNAL(load_cmap_) \
+    FT_INTERNAL(load_maxp_) \
+    FT_INTERNAL(load_os2_) \
+    FT_INTERNAL(load_post_) \
+    FT_INTERNAL(load_name_) \
+    FT_INTERNAL(free_name_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(load_hdmx_stub_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(free_hdmx_stub_) \
+    FT_INTERNAL(load_kern_) \
+    FT_INTERNAL(load_gasp_) \
+    FT_INTERNAL(load_pclt_) \
+    FT_INTERNAL(load_bhed_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(set_sbit_strike_stub_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sbits_stub_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(find_sbit_image_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sbit_metrics_) \
+    FT_INTERNAL(load_sbit_image_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(free_sbits_stub_) \
+    FT_INTERNAL(get_psname_) \
+    FT_INTERNAL(free_psnames_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(load_charmap_stub_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(free_charmap_stub_) \
+    FT_INTERNAL(get_kerning_) \
+    FT_INTERNAL(load_font_dir_) \
+    FT_INTERNAL(load_hmtx_) \
+    FT_INTERNAL(load_eblc_) \
+    FT_INTERNAL(free_eblc_) \
+    FT_INTERNAL(set_sbit_strike_) \
+    FT_INTERNAL(load_strike_metrics_) \
+    FT_INTERNAL(get_metrics_) \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+#define FT_DEFINE_DRIVERS_OLD_INTERNAL(a, a_) \
+  clazz->a = a_;
+#else
+  #define FT_DEFINE_DRIVERS_OLD_INTERNAL(a, a_)
+#endif
+#define FT_INTERNAL(a, a_) \
+  clazz->a = a_;
+
+#define FT_DEFINE_SFNT_INTERFACE(class_,                                     \
+    goto_table_, init_face_, load_face_, done_face_, get_interface_,         \
+    load_any_, load_sfnt_header_, load_directory_, load_head_,               \
+    load_hhea_, load_cmap_, load_maxp_, load_os2_, load_post_,               \
+    load_name_, free_name_, load_hdmx_stub_, free_hdmx_stub_,                \
+    load_kern_, load_gasp_, load_pclt_, load_bhed_,                          \
+    set_sbit_strike_stub_, load_sbits_stub_, find_sbit_image_,               \
+    load_sbit_metrics_, load_sbit_image_, free_sbits_stub_,                  \
+    get_psname_, free_psnames_, load_charmap_stub_, free_charmap_stub_,      \
+    get_kerning_, load_font_dir_, load_hmtx_, load_eblc_, free_eblc_,        \
+    set_sbit_strike_, load_strike_metrics_, get_metrics_ )                   \
+  void                                                                       \
+  FT_Init_Class_##class_( FT_Library library, SFNT_Interface*  clazz )       \
+  {                                                                          \
+    FT_UNUSED(library);                                                      \
+    FT_INTERNAL(goto_table,goto_table_) \
+    FT_INTERNAL(init_face,init_face_) \
+    FT_INTERNAL(load_face,load_face_) \
+    FT_INTERNAL(done_face,done_face_) \
+    FT_INTERNAL(get_interface,get_interface_) \
+    FT_INTERNAL(load_any,load_any_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sfnt_header,load_sfnt_header_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(load_directory,load_directory_) \
+    FT_INTERNAL(load_head,load_head_) \
+    FT_INTERNAL(load_hhea,load_hhea_) \
+    FT_INTERNAL(load_cmap,load_cmap_) \
+    FT_INTERNAL(load_maxp,load_maxp_) \
+    FT_INTERNAL(load_os2,load_os2_) \
+    FT_INTERNAL(load_post,load_post_) \
+    FT_INTERNAL(load_name,load_name_) \
+    FT_INTERNAL(free_name,free_name_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(load_hdmx_stub,load_hdmx_stub_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(free_hdmx_stub,free_hdmx_stub_) \
+    FT_INTERNAL(load_kern,load_kern_) \
+    FT_INTERNAL(load_gasp,load_gasp_) \
+    FT_INTERNAL(load_pclt,load_pclt_) \
+    FT_INTERNAL(load_bhed,load_bhed_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(set_sbit_strike_stub,set_sbit_strike_stub_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sbits_stub,load_sbits_stub_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(find_sbit_image,find_sbit_image_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(load_sbit_metrics,load_sbit_metrics_) \
+    FT_INTERNAL(load_sbit_image,load_sbit_image_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(free_sbits_stub,free_sbits_stub_) \
+    FT_INTERNAL(get_psname,get_psname_) \
+    FT_INTERNAL(free_psnames,free_psnames_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(load_charmap_stub,load_charmap_stub_) \
+    FT_DEFINE_DRIVERS_OLD_INTERNAL(free_charmap_stub,free_charmap_stub_) \
+    FT_INTERNAL(get_kerning,get_kerning_) \
+    FT_INTERNAL(load_font_dir,load_font_dir_) \
+    FT_INTERNAL(load_hmtx,load_hmtx_) \
+    FT_INTERNAL(load_eblc,load_eblc_) \
+    FT_INTERNAL(free_eblc,free_eblc_) \
+    FT_INTERNAL(set_sbit_strike,set_sbit_strike_) \
+    FT_INTERNAL(load_strike_metrics,load_strike_metrics_) \
+    FT_INTERNAL(get_metrics,get_metrics_) \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+FT_END_HEADER
+
+#endif /* __SFNT_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/t1types.h b/include/freetype/internal/t1types.h
new file mode 100644 (file)
index 0000000..f859de2
--- /dev/null
@@ -0,0 +1,259 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1types.h                                                              */
+/*                                                                         */
+/*    Basic Type1/Type2 type definitions and interface (specification      */
+/*    only).                                                               */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006, 2008, 2009, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1TYPES_H__
+#define __T1TYPES_H__
+
+
+#include <ft2build.h>
+#include FT_TYPE1_TABLES_H
+#include FT_INTERNAL_POSTSCRIPT_HINTS_H
+#include FT_INTERNAL_SERVICE_H
+#include FT_SERVICE_POSTSCRIPT_CMAPS_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***              REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS              ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    T1_EncodingRec                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure modeling a custom encoding.                            */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_chars  :: The number of character codes in the encoding.       */
+  /*                  Usually 256.                                         */
+  /*                                                                       */
+  /*    code_first :: The lowest valid character code in the encoding.     */
+  /*                                                                       */
+  /*    code_last  :: The highest valid character code in the encoding     */
+  /*                  + 1. When equal to code_first there are no valid     */
+  /*                  character codes.                                     */
+  /*                                                                       */
+  /*    char_index :: An array of corresponding glyph indices.             */
+  /*                                                                       */
+  /*    char_name  :: An array of corresponding glyph names.               */
+  /*                                                                       */
+  typedef struct  T1_EncodingRecRec_
+  {
+    FT_Int       num_chars;
+    FT_Int       code_first;
+    FT_Int       code_last;
+
+    FT_UShort*   char_index;
+    FT_String**  char_name;
+
+  } T1_EncodingRec, *T1_Encoding;
+
+
+  /* used to hold extra data of PS_FontInfoRec that
+   * cannot be stored in the publicly defined structure.
+   *
+   * Note these can't be blended with multiple-masters.
+   */
+  typedef struct  PS_FontExtraRec_
+  {
+    FT_UShort  fs_type;
+
+  } PS_FontExtraRec;
+
+
+  typedef struct  T1_FontRec_
+  {
+    PS_FontInfoRec   font_info;         /* font info dictionary   */
+    PS_FontExtraRec  font_extra;        /* font info extra fields */
+    PS_PrivateRec    private_dict;      /* private dictionary     */
+    FT_String*       font_name;         /* top-level dictionary   */
+
+    T1_EncodingType  encoding_type;
+    T1_EncodingRec   encoding;
+
+    FT_Byte*         subrs_block;
+    FT_Byte*         charstrings_block;
+    FT_Byte*         glyph_names_block;
+
+    FT_Int           num_subrs;
+    FT_Byte**        subrs;
+    FT_PtrDist*      subrs_len;
+
+    FT_Int           num_glyphs;
+    FT_String**      glyph_names;       /* array of glyph names       */
+    FT_Byte**        charstrings;       /* array of glyph charstrings */
+    FT_PtrDist*      charstrings_len;
+
+    FT_Byte          paint_type;
+    FT_Byte          font_type;
+    FT_Matrix        font_matrix;
+    FT_Vector        font_offset;
+    FT_BBox          font_bbox;
+    FT_Long          font_id;
+
+    FT_Fixed         stroke_width;
+
+  } T1_FontRec, *T1_Font;
+
+
+  typedef struct  CID_SubrsRec_
+  {
+    FT_UInt    num_subrs;
+    FT_Byte**  code;
+
+  } CID_SubrsRec, *CID_Subrs;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***                AFM FONT INFORMATION STRUCTURES                    ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct  AFM_TrackKernRec_
+  {
+    FT_Int    degree;
+    FT_Fixed  min_ptsize;
+    FT_Fixed  min_kern;
+    FT_Fixed  max_ptsize;
+    FT_Fixed  max_kern;
+
+  } AFM_TrackKernRec, *AFM_TrackKern;
+
+  typedef struct  AFM_KernPairRec_
+  {
+    FT_Int  index1;
+    FT_Int  index2;
+    FT_Int  x;
+    FT_Int  y;
+
+  } AFM_KernPairRec, *AFM_KernPair;
+
+  typedef struct  AFM_FontInfoRec_
+  {
+    FT_Bool        IsCIDFont;
+    FT_BBox        FontBBox;
+    FT_Fixed       Ascender;
+    FT_Fixed       Descender;
+    AFM_TrackKern  TrackKerns;   /* free if non-NULL */
+    FT_Int         NumTrackKern;
+    AFM_KernPair   KernPairs;    /* free if non-NULL */
+    FT_Int         NumKernPair;
+
+  } AFM_FontInfoRec, *AFM_FontInfo;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***                ORIGINAL T1_FACE CLASS DEFINITION                  ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  typedef struct T1_FaceRec_*   T1_Face;
+  typedef struct CID_FaceRec_*  CID_Face;
+
+
+  typedef struct  T1_FaceRec_
+  {
+    FT_FaceRec      root;
+    T1_FontRec      type1;
+    const void*     psnames;
+    const void*     psaux;
+    const void*     afm_data;
+    FT_CharMapRec   charmaprecs[2];
+    FT_CharMap      charmaps[2];
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+    PS_Unicodes     unicode_map;
+#endif
+
+    /* support for Multiple Masters fonts */
+    PS_Blend        blend;
+
+    /* undocumented, optional: indices of subroutines that express      */
+    /* the NormalizeDesignVector and the ConvertDesignVector procedure, */
+    /* respectively, as Type 2 charstrings; -1 if keywords not present  */
+    FT_Int           ndv_idx;
+    FT_Int           cdv_idx;
+
+    /* undocumented, optional: has the same meaning as len_buildchar */
+    /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25    */
+    FT_UInt          len_buildchar;
+    FT_Long*         buildchar;
+
+    /* since version 2.1 - interface to PostScript hinter */
+    const void*     pshinter;
+
+  } T1_FaceRec;
+
+
+  typedef struct  CID_FaceRec_
+  {
+    FT_FaceRec       root;
+    void*            psnames;
+    void*            psaux;
+    CID_FaceInfoRec  cid;
+    PS_FontExtraRec  font_extra;
+#if 0
+    void*            afm_data;
+#endif
+    CID_Subrs        subrs;
+
+    /* since version 2.1 - interface to PostScript hinter */
+    void*            pshinter;
+
+    /* since version 2.1.8, but was originally positioned after `afm_data' */
+    FT_Byte*         binary_data; /* used if hex data has been converted */
+    FT_Stream        cid_stream;
+
+  } CID_FaceRec;
+
+
+FT_END_HEADER
+
+#endif /* __T1TYPES_H__ */
+
+
+/* END */
diff --git a/include/freetype/internal/tttypes.h b/include/freetype/internal/tttypes.h
new file mode 100644 (file)
index 0000000..57b1731
--- /dev/null
@@ -0,0 +1,1543 @@
+/***************************************************************************/
+/*                                                                         */
+/*  tttypes.h                                                              */
+/*                                                                         */
+/*    Basic SFNT/TrueType type definitions and interface (specification    */
+/*    only).                                                               */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2004, 2005, 2006, 2007, 2008 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTTYPES_H__
+#define __TTTYPES_H__
+
+
+#include <ft2build.h>
+#include FT_TRUETYPE_TABLES_H
+#include FT_INTERNAL_OBJECTS_H
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include FT_MULTIPLE_MASTERS_H
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***             REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS         ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TTC_HeaderRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    TrueType collection header.  This table contains the offsets of    */
+  /*    the font headers of each distinct TrueType face in the file.       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    tag     :: Must be `ttc ' to indicate a TrueType collection.       */
+  /*                                                                       */
+  /*    version :: The version number.                                     */
+  /*                                                                       */
+  /*    count   :: The number of faces in the collection.  The             */
+  /*               specification says this should be an unsigned long, but */
+  /*               we use a signed long since we need the value -1 for     */
+  /*               specific purposes.                                      */
+  /*                                                                       */
+  /*    offsets :: The offsets of the font headers, one per face.          */
+  /*                                                                       */
+  typedef struct  TTC_HeaderRec_
+  {
+    FT_ULong   tag;
+    FT_Fixed   version;
+    FT_Long    count;
+    FT_ULong*  offsets;
+
+  } TTC_HeaderRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    SFNT_HeaderRec                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    SFNT file format header.                                           */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    format_tag     :: The font format tag.                             */
+  /*                                                                       */
+  /*    num_tables     :: The number of tables in file.                    */
+  /*                                                                       */
+  /*    search_range   :: Must be `16 * (max power of 2 <= num_tables)'.   */
+  /*                                                                       */
+  /*    entry_selector :: Must be log2 of `search_range / 16'.             */
+  /*                                                                       */
+  /*    range_shift    :: Must be `num_tables * 16 - search_range'.        */
+  /*                                                                       */
+  typedef struct  SFNT_HeaderRec_
+  {
+    FT_ULong   format_tag;
+    FT_UShort  num_tables;
+    FT_UShort  search_range;
+    FT_UShort  entry_selector;
+    FT_UShort  range_shift;
+
+    FT_ULong   offset;  /* not in file */
+
+  } SFNT_HeaderRec, *SFNT_Header;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_TableRec                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This structure describes a given table of a TrueType font.         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    Tag      :: A four-bytes tag describing the table.                 */
+  /*                                                                       */
+  /*    CheckSum :: The table checksum.  This value can be ignored.        */
+  /*                                                                       */
+  /*    Offset   :: The offset of the table from the start of the TrueType */
+  /*                font in its resource.                                  */
+  /*                                                                       */
+  /*    Length   :: The table length (in bytes).                           */
+  /*                                                                       */
+  typedef struct  TT_TableRec_
+  {
+    FT_ULong  Tag;        /*        table type */
+    FT_ULong  CheckSum;   /*    table checksum */
+    FT_ULong  Offset;     /* table file offset */
+    FT_ULong  Length;     /*      table length */
+
+  } TT_TableRec, *TT_Table;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_LongMetricsRec                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure modeling the long metrics of the `hmtx' and `vmtx'     */
+  /*    TrueType tables.  The values are expressed in font units.          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    advance :: The advance width or height for the glyph.              */
+  /*                                                                       */
+  /*    bearing :: The left-side or top-side bearing for the glyph.        */
+  /*                                                                       */
+  typedef struct  TT_LongMetricsRec_
+  {
+    FT_UShort  advance;
+    FT_Short   bearing;
+
+  } TT_LongMetricsRec, *TT_LongMetrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    TT_ShortMetrics                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple type to model the short metrics of the `hmtx' and `vmtx'  */
+  /*    tables.                                                            */
+  /*                                                                       */
+  typedef FT_Short  TT_ShortMetrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_NameEntryRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure modeling TrueType name records.  Name records are used */
+  /*    to store important strings like family name, style name,           */
+  /*    copyright, etc. in _localized_ versions (i.e., language, encoding, */
+  /*    etc).                                                              */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    platformID   :: The ID of the name's encoding platform.            */
+  /*                                                                       */
+  /*    encodingID   :: The platform-specific ID for the name's encoding.  */
+  /*                                                                       */
+  /*    languageID   :: The platform-specific ID for the name's language.  */
+  /*                                                                       */
+  /*    nameID       :: The ID specifying what kind of name this is.       */
+  /*                                                                       */
+  /*    stringLength :: The length of the string in bytes.                 */
+  /*                                                                       */
+  /*    stringOffset :: The offset to the string in the `name' table.      */
+  /*                                                                       */
+  /*    string       :: A pointer to the string's bytes.  Note that these  */
+  /*                    are usually UTF-16 encoded characters.             */
+  /*                                                                       */
+  typedef struct  TT_NameEntryRec_
+  {
+    FT_UShort  platformID;
+    FT_UShort  encodingID;
+    FT_UShort  languageID;
+    FT_UShort  nameID;
+    FT_UShort  stringLength;
+    FT_ULong   stringOffset;
+
+    /* this last field is not defined in the spec */
+    /* but used by the FreeType engine            */
+
+    FT_Byte*   string;
+
+  } TT_NameEntryRec, *TT_NameEntry;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_NameTableRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure modeling the TrueType name table.                      */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    format         :: The format of the name table.                    */
+  /*                                                                       */
+  /*    numNameRecords :: The number of names in table.                    */
+  /*                                                                       */
+  /*    storageOffset  :: The offset of the name table in the `name'       */
+  /*                      TrueType table.                                  */
+  /*                                                                       */
+  /*    names          :: An array of name records.                        */
+  /*                                                                       */
+  /*    stream         :: the file's input stream.                         */
+  /*                                                                       */
+  typedef struct  TT_NameTableRec_
+  {
+    FT_UShort         format;
+    FT_UInt           numNameRecords;
+    FT_UInt           storageOffset;
+    TT_NameEntryRec*  names;
+    FT_Stream         stream;
+
+  } TT_NameTableRec, *TT_NameTable;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***             OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS         ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_GaspRangeRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A tiny structure used to model a gasp range according to the       */
+  /*    TrueType specification.                                            */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    maxPPEM  :: The maximum ppem value to which `gaspFlag' applies.    */
+  /*                                                                       */
+  /*    gaspFlag :: A flag describing the grid-fitting and anti-aliasing   */
+  /*                modes to be used.                                      */
+  /*                                                                       */
+  typedef struct  TT_GaspRangeRec_
+  {
+    FT_UShort  maxPPEM;
+    FT_UShort  gaspFlag;
+
+  } TT_GaspRangeRec, *TT_GaspRange;
+
+
+#define TT_GASP_GRIDFIT  0x01
+#define TT_GASP_DOGRAY   0x02
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_GaspRec                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure modeling the TrueType `gasp' table used to specify     */
+  /*    grid-fitting and anti-aliasing behaviour.                          */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    version    :: The version number.                                  */
+  /*                                                                       */
+  /*    numRanges  :: The number of gasp ranges in table.                  */
+  /*                                                                       */
+  /*    gaspRanges :: An array of gasp ranges.                             */
+  /*                                                                       */
+  typedef struct  TT_Gasp_
+  {
+    FT_UShort     version;
+    FT_UShort     numRanges;
+    TT_GaspRange  gaspRanges;
+
+  } TT_GaspRec;
+
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_HdmxEntryRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A small structure used to model the pre-computed widths of a given */
+  /*    size.  They are found in the `hdmx' table.                         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    ppem      :: The pixels per EM value at which these metrics apply. */
+  /*                                                                       */
+  /*    max_width :: The maximum advance width for this metric.            */
+  /*                                                                       */
+  /*    widths    :: An array of widths.  Note: These are 8-bit bytes.     */
+  /*                                                                       */
+  typedef struct  TT_HdmxEntryRec_
+  {
+    FT_Byte   ppem;
+    FT_Byte   max_width;
+    FT_Byte*  widths;
+
+  } TT_HdmxEntryRec, *TT_HdmxEntry;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_HdmxRec                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model the `hdmx' table, which contains         */
+  /*    pre-computed widths for a set of given sizes/dimensions.           */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    version     :: The version number.                                 */
+  /*                                                                       */
+  /*    num_records :: The number of hdmx records.                         */
+  /*                                                                       */
+  /*    records     :: An array of hdmx records.                           */
+  /*                                                                       */
+  typedef struct  TT_HdmxRec_
+  {
+    FT_UShort     version;
+    FT_Short      num_records;
+    TT_HdmxEntry  records;
+
+  } TT_HdmxRec, *TT_Hdmx;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Kern0_PairRec                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a kerning pair for the kerning table     */
+  /*    format 0.  The engine now loads this table if it finds one in the  */
+  /*    font file.                                                         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    left  :: The index of the left glyph in pair.                      */
+  /*                                                                       */
+  /*    right :: The index of the right glyph in pair.                     */
+  /*                                                                       */
+  /*    value :: The kerning distance.  A positive value spaces the        */
+  /*             glyphs, a negative one makes them closer.                 */
+  /*                                                                       */
+  typedef struct  TT_Kern0_PairRec_
+  {
+    FT_UShort  left;   /* index of left  glyph in pair */
+    FT_UShort  right;  /* index of right glyph in pair */
+    FT_FWord   value;  /* kerning value                */
+
+  } TT_Kern0_PairRec, *TT_Kern0_Pair;
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***                    EMBEDDED BITMAPS SUPPORT                       ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_MetricsRec                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to hold the big metrics of a given glyph bitmap   */
+  /*    in a TrueType or OpenType font.  These are usually found in the    */
+  /*    `EBDT' (Microsoft) or `bloc' (Apple) table.                        */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    height       :: The glyph height in pixels.                        */
+  /*                                                                       */
+  /*    width        :: The glyph width in pixels.                         */
+  /*                                                                       */
+  /*    horiBearingX :: The horizontal left bearing.                       */
+  /*                                                                       */
+  /*    horiBearingY :: The horizontal top bearing.                        */
+  /*                                                                       */
+  /*    horiAdvance  :: The horizontal advance.                            */
+  /*                                                                       */
+  /*    vertBearingX :: The vertical left bearing.                         */
+  /*                                                                       */
+  /*    vertBearingY :: The vertical top bearing.                          */
+  /*                                                                       */
+  /*    vertAdvance  :: The vertical advance.                              */
+  /*                                                                       */
+  typedef struct  TT_SBit_MetricsRec_
+  {
+    FT_Byte  height;
+    FT_Byte  width;
+
+    FT_Char  horiBearingX;
+    FT_Char  horiBearingY;
+    FT_Byte  horiAdvance;
+
+    FT_Char  vertBearingX;
+    FT_Char  vertBearingY;
+    FT_Byte  vertAdvance;
+
+  } TT_SBit_MetricsRec, *TT_SBit_Metrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_SmallMetricsRec                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to hold the small metrics of a given glyph bitmap */
+  /*    in a TrueType or OpenType font.  These are usually found in the    */
+  /*    `EBDT' (Microsoft) or the `bdat' (Apple) table.                    */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    height   :: The glyph height in pixels.                            */
+  /*                                                                       */
+  /*    width    :: The glyph width in pixels.                             */
+  /*                                                                       */
+  /*    bearingX :: The left-side bearing.                                 */
+  /*                                                                       */
+  /*    bearingY :: The top-side bearing.                                  */
+  /*                                                                       */
+  /*    advance  :: The advance width or height.                           */
+  /*                                                                       */
+  typedef struct  TT_SBit_Small_Metrics_
+  {
+    FT_Byte  height;
+    FT_Byte  width;
+
+    FT_Char  bearingX;
+    FT_Char  bearingY;
+    FT_Byte  advance;
+
+  } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_LineMetricsRec                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to describe the text line metrics of a given      */
+  /*    bitmap strike, for either a horizontal or vertical layout.         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    ascender                :: The ascender in pixels.                 */
+  /*                                                                       */
+  /*    descender               :: The descender in pixels.                */
+  /*                                                                       */
+  /*    max_width               :: The maximum glyph width in pixels.      */
+  /*                                                                       */
+  /*    caret_slope_enumerator  :: Rise of the caret slope, typically set  */
+  /*                               to 1 for non-italic fonts.              */
+  /*                                                                       */
+  /*    caret_slope_denominator :: Rise of the caret slope, typically set  */
+  /*                               to 0 for non-italic fonts.              */
+  /*                                                                       */
+  /*    caret_offset            :: Offset in pixels to move the caret for  */
+  /*                               proper positioning.                     */
+  /*                                                                       */
+  /*    min_origin_SB           :: Minimum of horiBearingX (resp.          */
+  /*                               vertBearingY).                          */
+  /*    min_advance_SB          :: Minimum of                              */
+  /*                                                                       */
+  /*                                 horizontal advance -                  */
+  /*                                   ( horiBearingX + width )            */
+  /*                                                                       */
+  /*                               resp.                                   */
+  /*                                                                       */
+  /*                                 vertical advance -                    */
+  /*                                   ( vertBearingY + height )           */
+  /*                                                                       */
+  /*    max_before_BL           :: Maximum of horiBearingY (resp.          */
+  /*                               vertBearingY).                          */
+  /*                                                                       */
+  /*    min_after_BL            :: Minimum of                              */
+  /*                                                                       */
+  /*                                 horiBearingY - height                 */
+  /*                                                                       */
+  /*                               resp.                                   */
+  /*                                                                       */
+  /*                                 vertBearingX - width                  */
+  /*                                                                       */
+  /*    pads                    :: Unused (to make the size of the record  */
+  /*                               a multiple of 32 bits.                  */
+  /*                                                                       */
+  typedef struct  TT_SBit_LineMetricsRec_
+  {
+    FT_Char  ascender;
+    FT_Char  descender;
+    FT_Byte  max_width;
+    FT_Char  caret_slope_numerator;
+    FT_Char  caret_slope_denominator;
+    FT_Char  caret_offset;
+    FT_Char  min_origin_SB;
+    FT_Char  min_advance_SB;
+    FT_Char  max_before_BL;
+    FT_Char  min_after_BL;
+    FT_Char  pads[2];
+
+  } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_RangeRec                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A TrueType/OpenType subIndexTable as defined in the `EBLC'         */
+  /*    (Microsoft) or `bloc' (Apple) tables.                              */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    first_glyph   :: The first glyph index in the range.               */
+  /*                                                                       */
+  /*    last_glyph    :: The last glyph index in the range.                */
+  /*                                                                       */
+  /*    index_format  :: The format of index table.  Valid values are 1    */
+  /*                     to 5.                                             */
+  /*                                                                       */
+  /*    image_format  :: The format of `EBDT' image data.                  */
+  /*                                                                       */
+  /*    image_offset  :: The offset to image data in `EBDT'.               */
+  /*                                                                       */
+  /*    image_size    :: For index formats 2 and 5.  This is the size in   */
+  /*                     bytes of each glyph bitmap.                       */
+  /*                                                                       */
+  /*    big_metrics   :: For index formats 2 and 5.  This is the big       */
+  /*                     metrics for each glyph bitmap.                    */
+  /*                                                                       */
+  /*    num_glyphs    :: For index formats 4 and 5.  This is the number of */
+  /*                     glyphs in the code array.                         */
+  /*                                                                       */
+  /*    glyph_offsets :: For index formats 1 and 3.                        */
+  /*                                                                       */
+  /*    glyph_codes   :: For index formats 4 and 5.                        */
+  /*                                                                       */
+  /*    table_offset  :: The offset of the index table in the `EBLC'       */
+  /*                     table.  Only used during strike loading.          */
+  /*                                                                       */
+  typedef struct  TT_SBit_RangeRec_
+  {
+    FT_UShort           first_glyph;
+    FT_UShort           last_glyph;
+
+    FT_UShort           index_format;
+    FT_UShort           image_format;
+    FT_ULong            image_offset;
+
+    FT_ULong            image_size;
+    TT_SBit_MetricsRec  metrics;
+    FT_ULong            num_glyphs;
+
+    FT_ULong*           glyph_offsets;
+    FT_UShort*          glyph_codes;
+
+    FT_ULong            table_offset;
+
+  } TT_SBit_RangeRec, *TT_SBit_Range;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_StrikeRec                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used describe a given bitmap strike in the `EBLC'      */
+  /*    (Microsoft) or `bloc' (Apple) tables.                              */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*   num_index_ranges :: The number of index ranges.                     */
+  /*                                                                       */
+  /*   index_ranges     :: An array of glyph index ranges.                 */
+  /*                                                                       */
+  /*   color_ref        :: Unused.  `color_ref' is put in for future       */
+  /*                       enhancements, but these fields are already      */
+  /*                       in use by other platforms (e.g. Newton).        */
+  /*                       For details, please see                         */
+  /*                                                                       */
+  /*                         http://fonts.apple.com/                       */
+  /*                                TTRefMan/RM06/Chap6bloc.html           */
+  /*                                                                       */
+  /*   hori             :: The line metrics for horizontal layouts.        */
+  /*                                                                       */
+  /*   vert             :: The line metrics for vertical layouts.          */
+  /*                                                                       */
+  /*   start_glyph      :: The lowest glyph index for this strike.         */
+  /*                                                                       */
+  /*   end_glyph        :: The highest glyph index for this strike.        */
+  /*                                                                       */
+  /*   x_ppem           :: The number of horizontal pixels per EM.         */
+  /*                                                                       */
+  /*   y_ppem           :: The number of vertical pixels per EM.           */
+  /*                                                                       */
+  /*   bit_depth        :: The bit depth.  Valid values are 1, 2, 4,       */
+  /*                       and 8.                                          */
+  /*                                                                       */
+  /*   flags            :: Is this a vertical or horizontal strike?  For   */
+  /*                       details, please see                             */
+  /*                                                                       */
+  /*                         http://fonts.apple.com/                       */
+  /*                                TTRefMan/RM06/Chap6bloc.html           */
+  /*                                                                       */
+  typedef struct  TT_SBit_StrikeRec_
+  {
+    FT_Int                  num_ranges;
+    TT_SBit_Range           sbit_ranges;
+    FT_ULong                ranges_offset;
+
+    FT_ULong                color_ref;
+
+    TT_SBit_LineMetricsRec  hori;
+    TT_SBit_LineMetricsRec  vert;
+
+    FT_UShort               start_glyph;
+    FT_UShort               end_glyph;
+
+    FT_Byte                 x_ppem;
+    FT_Byte                 y_ppem;
+
+    FT_Byte                 bit_depth;
+    FT_Char                 flags;
+
+  } TT_SBit_StrikeRec, *TT_SBit_Strike;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_ComponentRec                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A simple structure to describe a compound sbit element.            */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    glyph_code :: The element's glyph index.                           */
+  /*                                                                       */
+  /*    x_offset   :: The element's left bearing.                          */
+  /*                                                                       */
+  /*    y_offset   :: The element's top bearing.                           */
+  /*                                                                       */
+  typedef struct  TT_SBit_ComponentRec_
+  {
+    FT_UShort  glyph_code;
+    FT_Char    x_offset;
+    FT_Char    y_offset;
+
+  } TT_SBit_ComponentRec, *TT_SBit_Component;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_SBit_ScaleRec                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used describe a given bitmap scaling table, as defined */
+  /*    in the `EBSC' table.                                               */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    hori              :: The horizontal line metrics.                  */
+  /*                                                                       */
+  /*    vert              :: The vertical line metrics.                    */
+  /*                                                                       */
+  /*    x_ppem            :: The number of horizontal pixels per EM.       */
+  /*                                                                       */
+  /*    y_ppem            :: The number of vertical pixels per EM.         */
+  /*                                                                       */
+  /*    x_ppem_substitute :: Substitution x_ppem value.                    */
+  /*                                                                       */
+  /*    y_ppem_substitute :: Substitution y_ppem value.                    */
+  /*                                                                       */
+  typedef struct  TT_SBit_ScaleRec_
+  {
+    TT_SBit_LineMetricsRec  hori;
+    TT_SBit_LineMetricsRec  vert;
+
+    FT_Byte                 x_ppem;
+    FT_Byte                 y_ppem;
+
+    FT_Byte                 x_ppem_substitute;
+    FT_Byte                 y_ppem_substitute;
+
+  } TT_SBit_ScaleRec, *TT_SBit_Scale;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***                  POSTSCRIPT GLYPH NAMES SUPPORT                   ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Post_20Rec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Postscript names sub-table, format 2.0.  Stores the PS name of     */
+  /*    each glyph in the font face.                                       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_glyphs    :: The number of named glyphs in the table.          */
+  /*                                                                       */
+  /*    num_names     :: The number of PS names stored in the table.       */
+  /*                                                                       */
+  /*    glyph_indices :: The indices of the glyphs in the names arrays.    */
+  /*                                                                       */
+  /*    glyph_names   :: The PS names not in Mac Encoding.                 */
+  /*                                                                       */
+  typedef struct  TT_Post_20Rec_
+  {
+    FT_UShort   num_glyphs;
+    FT_UShort   num_names;
+    FT_UShort*  glyph_indices;
+    FT_Char**   glyph_names;
+
+  } TT_Post_20Rec, *TT_Post_20;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Post_25Rec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Postscript names sub-table, format 2.5.  Stores the PS name of     */
+  /*    each glyph in the font face.                                       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_glyphs :: The number of glyphs in the table.                   */
+  /*                                                                       */
+  /*    offsets    :: An array of signed offsets in a normal Mac           */
+  /*                  Postscript name encoding.                            */
+  /*                                                                       */
+  typedef struct  TT_Post_25_
+  {
+    FT_UShort  num_glyphs;
+    FT_Char*   offsets;
+
+  } TT_Post_25Rec, *TT_Post_25;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Post_NamesRec                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Postscript names table, either format 2.0 or 2.5.                  */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    loaded    :: A flag to indicate whether the PS names are loaded.   */
+  /*                                                                       */
+  /*    format_20 :: The sub-table used for format 2.0.                    */
+  /*                                                                       */
+  /*    format_25 :: The sub-table used for format 2.5.                    */
+  /*                                                                       */
+  typedef struct  TT_Post_NamesRec_
+  {
+    FT_Bool  loaded;
+
+    union
+    {
+      TT_Post_20Rec  format_20;
+      TT_Post_25Rec  format_25;
+
+    } names;
+
+  } TT_Post_NamesRec, *TT_Post_Names;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***                    GX VARIATION TABLE SUPPORT                     ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+  typedef struct GX_BlendRec_  *GX_Blend;
+#endif
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***              EMBEDDED BDF PROPERTIES TABLE SUPPORT                ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*
+   * These types are used to support a `BDF ' table that isn't part of the
+   * official TrueType specification.  It is mainly used in SFNT-based
+   * bitmap fonts that were generated from a set of BDF fonts.
+   *
+   * The format of the table is as follows.
+   *
+   *   USHORT   version      `BDF ' table version number, should be 0x0001.
+   *   USHORT   strikeCount  Number of strikes (bitmap sizes) in this table.
+   *   ULONG    stringTable  Offset (from start of BDF table) to string
+   *                         table.
+   *
+   * This is followed by an array of `strikeCount' descriptors, having the
+   * following format.
+   *
+   *   USHORT   ppem         Vertical pixels per EM for this strike.
+   *   USHORT   numItems     Number of items for this strike (properties and
+   *                         atoms).  Maximum is 255.
+   *
+   * This array in turn is followed by `strikeCount' value sets.  Each
+   * `value set' is an array of `numItems' items with the following format.
+   *
+   *   ULONG    item_name    Offset in string table to item name.
+   *   USHORT   item_type    The item type.  Possible values are
+   *                            0 => string (e.g., COMMENT)
+   *                            1 => atom   (e.g., FONT or even SIZE)
+   *                            2 => int32
+   *                            3 => uint32
+   *                         0x10 => A flag to indicate a properties.  This
+   *                                 is ORed with the above values.
+   *   ULONG    item_value   For strings  => Offset into string table without
+   *                                         the corresponding double quotes.
+   *                         For atoms    => Offset into string table.
+   *                         For integers => Direct value.
+   *
+   * All strings in the string table consist of bytes and are
+   * zero-terminated.
+   *
+   */
+
+#ifdef TT_CONFIG_OPTION_BDF
+
+  typedef struct  TT_BDFRec_
+  {
+    FT_Byte*   table;
+    FT_Byte*   table_end;
+    FT_Byte*   strings;
+    FT_ULong   strings_size;
+    FT_UInt    num_strikes;
+    FT_Bool    loaded;
+
+  } TT_BDFRec, *TT_BDF;
+
+#endif /* TT_CONFIG_OPTION_BDF */
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /***                  ORIGINAL TT_FACE CLASS DEFINITION                ***/
+  /***                                                                   ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This structure/class is defined here because it is common to the      */
+  /* following formats: TTF, OpenType-TT, and OpenType-CFF.                */
+  /*                                                                       */
+  /* Note, however, that the classes TT_Size and TT_GlyphSlot are not      */
+  /* shared between font drivers, and are thus defined in `ttobjs.h'.      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    TT_Face                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a TrueType face/font object.  A TT_Face encapsulates   */
+  /*    the resolution and scaling independent parts of a TrueType font    */
+  /*    resource.                                                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The TT_Face structure is also used as a `parent class' for the     */
+  /*    OpenType-CFF class (T2_Face).                                      */
+  /*                                                                       */
+  typedef struct TT_FaceRec_*  TT_Face;
+
+
+  /* a function type used for the truetype bytecode interpreter hooks */
+  typedef FT_Error
+  (*TT_Interpreter)( void*  exec_context );
+
+  /* forward declaration */
+  typedef struct TT_LoaderRec_*  TT_Loader;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Loader_GotoTableFunc                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Seeks a stream to the start of a given TrueType table.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    tag    :: A 4-byte tag used to name the table.                     */
+  /*                                                                       */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    length :: The length of the table in bytes.  Set to 0 if not       */
+  /*              needed.                                                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The stream cursor must be at the font file's origin.               */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Loader_GotoTableFunc)( TT_Face    face,
+                              FT_ULong   tag,
+                              FT_Stream  stream,
+                              FT_ULong*  length );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Loader_StartGlyphFunc                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Seeks a stream to the start of a given glyph element, and opens a  */
+  /*    frame for it.                                                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    loader      :: The current TrueType glyph loader object.           */
+  /*                                                                       */
+  /*    glyph index :: The index of the glyph to access.                   */
+  /*                                                                       */
+  /*    offset      :: The offset of the glyph according to the            */
+  /*                   `locations' table.                                  */
+  /*                                                                       */
+  /*    byte_count  :: The size of the frame in bytes.                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function is normally equivalent to FT_STREAM_SEEK(offset)     */
+  /*    followed by FT_FRAME_ENTER(byte_count) with the loader's stream,   */
+  /*    but alternative formats (e.g. compressed ones) might use something */
+  /*    different.                                                         */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Loader_StartGlyphFunc)( TT_Loader  loader,
+                               FT_UInt    glyph_index,
+                               FT_ULong   offset,
+                               FT_UInt    byte_count );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Loader_ReadGlyphFunc                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Reads one glyph element (its header, a simple glyph, or a          */
+  /*    composite) from the loader's current stream frame.                 */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    loader :: The current TrueType glyph loader object.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  typedef FT_Error
+  (*TT_Loader_ReadGlyphFunc)( TT_Loader  loader );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <FuncType>                                                            */
+  /*    TT_Loader_EndGlyphFunc                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Closes the current loader stream frame for the glyph.              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    loader :: The current TrueType glyph loader object.                */
+  /*                                                                       */
+  typedef void
+  (*TT_Loader_EndGlyphFunc)( TT_Loader  loader );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                         TrueType Face Type                            */
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Face                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The TrueType face class.  These objects model the resolution and   */
+  /*    point-size independent data found in a TrueType font file.         */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root                 :: The base FT_Face structure, managed by the */
+  /*                            base layer.                                */
+  /*                                                                       */
+  /*    ttc_header           :: The TrueType collection header, used when  */
+  /*                            the file is a `ttc' rather than a `ttf'.   */
+  /*                            For ordinary font files, the field         */
+  /*                            `ttc_header.count' is set to 0.            */
+  /*                                                                       */
+  /*    format_tag           :: The font format tag.                       */
+  /*                                                                       */
+  /*    num_tables           :: The number of TrueType tables in this font */
+  /*                            file.                                      */
+  /*                                                                       */
+  /*    dir_tables           :: The directory of TrueType tables for this  */
+  /*                            font file.                                 */
+  /*                                                                       */
+  /*    header               :: The font's font header (`head' table).     */
+  /*                            Read on font opening.                      */
+  /*                                                                       */
+  /*    horizontal           :: The font's horizontal header (`hhea'       */
+  /*                            table).  This field also contains the      */
+  /*                            associated horizontal metrics table        */
+  /*                            (`hmtx').                                  */
+  /*                                                                       */
+  /*    max_profile          :: The font's maximum profile table.  Read on */
+  /*                            font opening.  Note that some maximum      */
+  /*                            values cannot be taken directly from this  */
+  /*                            table.  We thus define additional fields   */
+  /*                            below to hold the computed maxima.         */
+  /*                                                                       */
+  /*    vertical_info        :: A boolean which is set when the font file  */
+  /*                            contains vertical metrics.  If not, the    */
+  /*                            value of the `vertical' field is           */
+  /*                            undefined.                                 */
+  /*                                                                       */
+  /*    vertical             :: The font's vertical header (`vhea' table). */
+  /*                            This field also contains the associated    */
+  /*                            vertical metrics table (`vmtx'), if found. */
+  /*                            IMPORTANT: The contents of this field is   */
+  /*                            undefined if the `verticalInfo' field is   */
+  /*                            unset.                                     */
+  /*                                                                       */
+  /*    num_names            :: The number of name records within this     */
+  /*                            TrueType font.                             */
+  /*                                                                       */
+  /*    name_table           :: The table of name records (`name').        */
+  /*                                                                       */
+  /*    os2                  :: The font's OS/2 table (`OS/2').            */
+  /*                                                                       */
+  /*    postscript           :: The font's PostScript table (`post'        */
+  /*                            table).  The PostScript glyph names are    */
+  /*                            not loaded by the driver on face opening.  */
+  /*                            See the `ttpost' module for more details.  */
+  /*                                                                       */
+  /*    cmap_table           :: Address of the face's `cmap' SFNT table    */
+  /*                            in memory (it's an extracted frame).       */
+  /*                                                                       */
+  /*    cmap_size            :: The size in bytes of the `cmap_table'      */
+  /*                            described above.                           */
+  /*                                                                       */
+  /*    goto_table           :: A function called by each TrueType table   */
+  /*                            loader to position a stream's cursor to    */
+  /*                            the start of a given table according to    */
+  /*                            its tag.  It defaults to TT_Goto_Face but  */
+  /*                            can be different for strange formats (e.g. */
+  /*                            Type 42).                                  */
+  /*                                                                       */
+  /*    access_glyph_frame   :: A function used to access the frame of a   */
+  /*                            given glyph within the face's font file.   */
+  /*                                                                       */
+  /*    forget_glyph_frame   :: A function used to forget the frame of a   */
+  /*                            given glyph when all data has been loaded. */
+  /*                                                                       */
+  /*    read_glyph_header    :: A function used to read a glyph header.    */
+  /*                            It must be called between an `access' and  */
+  /*                            `forget'.                                  */
+  /*                                                                       */
+  /*    read_simple_glyph    :: A function used to read a simple glyph.    */
+  /*                            It must be called after the header was     */
+  /*                            read, and before the `forget'.             */
+  /*                                                                       */
+  /*    read_composite_glyph :: A function used to read a composite glyph. */
+  /*                            It must be called after the header was     */
+  /*                            read, and before the `forget'.             */
+  /*                                                                       */
+  /*    sfnt                 :: A pointer to the SFNT service.             */
+  /*                                                                       */
+  /*    psnames              :: A pointer to the PostScript names service. */
+  /*                                                                       */
+  /*    hdmx                 :: The face's horizontal device metrics       */
+  /*                            (`hdmx' table).  This table is optional in */
+  /*                            TrueType/OpenType fonts.                   */
+  /*                                                                       */
+  /*    gasp                 :: The grid-fitting and scaling properties    */
+  /*                            table (`gasp').  This table is optional in */
+  /*                            TrueType/OpenType fonts.                   */
+  /*                                                                       */
+  /*    pclt                 :: The `pclt' SFNT table.                     */
+  /*                                                                       */
+  /*    num_sbit_strikes     :: The number of sbit strikes, i.e., bitmap   */
+  /*                            sizes, embedded in this font.              */
+  /*                                                                       */
+  /*    sbit_strikes         :: An array of sbit strikes embedded in this  */
+  /*                            font.  This table is optional in a         */
+  /*                            TrueType/OpenType font.                    */
+  /*                                                                       */
+  /*    num_sbit_scales      :: The number of sbit scales for this font.   */
+  /*                                                                       */
+  /*    sbit_scales          :: Array of sbit scales embedded in this      */
+  /*                            font.  This table is optional in a         */
+  /*                            TrueType/OpenType font.                    */
+  /*                                                                       */
+  /*    postscript_names     :: A table used to store the Postscript names */
+  /*                            of  the glyphs for this font.  See the     */
+  /*                            file  `ttconfig.h' for comments on the     */
+  /*                            TT_CONFIG_OPTION_POSTSCRIPT_NAMES option.  */
+  /*                                                                       */
+  /*    num_locations        :: The number of glyph locations in this      */
+  /*                            TrueType file.  This should be             */
+  /*                            identical to the number of glyphs.         */
+  /*                            Ignored for Type 2 fonts.                  */
+  /*                                                                       */
+  /*    glyph_locations      :: An array of longs.  These are offsets to   */
+  /*                            glyph data within the `glyf' table.        */
+  /*                            Ignored for Type 2 font faces.             */
+  /*                                                                       */
+  /*    glyf_len             :: The length of the `glyf' table.  Needed    */
+  /*                            for malformed `loca' tables.               */
+  /*                                                                       */
+  /*    font_program_size    :: Size in bytecodes of the face's font       */
+  /*                            program.  0 if none defined.  Ignored for  */
+  /*                            Type 2 fonts.                              */
+  /*                                                                       */
+  /*    font_program         :: The face's font program (bytecode stream)  */
+  /*                            executed at load time, also used during    */
+  /*                            glyph rendering.  Comes from the `fpgm'    */
+  /*                            table.  Ignored for Type 2 font fonts.     */
+  /*                                                                       */
+  /*    cvt_program_size     :: The size in bytecodes of the face's cvt    */
+  /*                            program.  Ignored for Type 2 fonts.        */
+  /*                                                                       */
+  /*    cvt_program          :: The face's cvt program (bytecode stream)   */
+  /*                            executed each time an instance/size is     */
+  /*                            changed/reset.  Comes from the `prep'      */
+  /*                            table.  Ignored for Type 2 fonts.          */
+  /*                                                                       */
+  /*    cvt_size             :: Size of the control value table (in        */
+  /*                            entries).   Ignored for Type 2 fonts.      */
+  /*                                                                       */
+  /*    cvt                  :: The face's original control value table.   */
+  /*                            Coordinates are expressed in unscaled font */
+  /*                            units.  Comes from the `cvt ' table.       */
+  /*                            Ignored for Type 2 fonts.                  */
+  /*                                                                       */
+  /*    num_kern_pairs       :: The number of kerning pairs present in the */
+  /*                            font file.  The engine only loads the      */
+  /*                            first horizontal format 0 kern table it    */
+  /*                            finds in the font file.  Ignored for       */
+  /*                            Type 2 fonts.                              */
+  /*                                                                       */
+  /*    kern_table_index     :: The index of the kerning table in the font */
+  /*                            kerning directory.  Ignored for Type 2     */
+  /*                            fonts.                                     */
+  /*                                                                       */
+  /*    interpreter          :: A pointer to the TrueType bytecode         */
+  /*                            interpreters field is also used to hook    */
+  /*                            the debugger in `ttdebug'.                 */
+  /*                                                                       */
+  /*    unpatented_hinting   :: If true, use only unpatented methods in    */
+  /*                            the bytecode interpreter.                  */
+  /*                                                                       */
+  /*    doblend              :: A boolean which is set if the font should  */
+  /*                            be blended (this is for GX var).           */
+  /*                                                                       */
+  /*    blend                :: Contains the data needed to control GX     */
+  /*                            variation tables (rather like Multiple     */
+  /*                            Master data).                              */
+  /*                                                                       */
+  /*    extra                :: Reserved for third-party font drivers.     */
+  /*                                                                       */
+  /*    postscript_name      :: The PS name of the font.  Used by the      */
+  /*                            postscript name service.                   */
+  /*                                                                       */
+  typedef struct  TT_FaceRec_
+  {
+    FT_FaceRec            root;
+
+    TTC_HeaderRec         ttc_header;
+
+    FT_ULong              format_tag;
+    FT_UShort             num_tables;
+    TT_Table              dir_tables;
+
+    TT_Header             header;       /* TrueType header table          */
+    TT_HoriHeader         horizontal;   /* TrueType horizontal header     */
+
+    TT_MaxProfile         max_profile;
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+    FT_ULong              max_components;  /* stubbed to 0 */
+#endif
+
+    FT_Bool               vertical_info;
+    TT_VertHeader         vertical;     /* TT Vertical header, if present */
+
+    FT_UShort             num_names;    /* number of name records  */
+    TT_NameTableRec       name_table;   /* name table              */
+
+    TT_OS2                os2;          /* TrueType OS/2 table            */
+    TT_Postscript         postscript;   /* TrueType Postscript table      */
+
+    FT_Byte*              cmap_table;   /* extracted `cmap' table */
+    FT_ULong              cmap_size;
+
+    TT_Loader_GotoTableFunc   goto_table;
+
+    TT_Loader_StartGlyphFunc  access_glyph_frame;
+    TT_Loader_EndGlyphFunc    forget_glyph_frame;
+    TT_Loader_ReadGlyphFunc   read_glyph_header;
+    TT_Loader_ReadGlyphFunc   read_simple_glyph;
+    TT_Loader_ReadGlyphFunc   read_composite_glyph;
+
+    /* a typeless pointer to the SFNT_Interface table used to load */
+    /* the basic TrueType tables in the face object                */
+    void*                 sfnt;
+
+    /* a typeless pointer to the FT_Service_PsCMapsRec table used to */
+    /* handle glyph names <-> unicode & Mac values                   */
+    void*                 psnames;
+
+
+    /***********************************************************************/
+    /*                                                                     */
+    /* Optional TrueType/OpenType tables                                   */
+    /*                                                                     */
+    /***********************************************************************/
+
+    /* horizontal device metrics */
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+    TT_HdmxRec            hdmx;
+#endif
+
+    /* grid-fitting and scaling table */
+    TT_GaspRec            gasp;                 /* the `gasp' table */
+
+    /* PCL 5 table */
+    TT_PCLT               pclt;
+
+    /* embedded bitmaps support */
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+    FT_ULong              num_sbit_strikes;
+    TT_SBit_Strike        sbit_strikes;
+#endif
+
+    FT_ULong              num_sbit_scales;
+    TT_SBit_Scale         sbit_scales;
+
+    /* postscript names table */
+    TT_Post_NamesRec      postscript_names;
+
+
+    /***********************************************************************/
+    /*                                                                     */
+    /* TrueType-specific fields (ignored by the OTF-Type2 driver)          */
+    /*                                                                     */
+    /***********************************************************************/
+
+    /* the glyph locations */
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+    FT_UShort             num_locations_stub;
+    FT_Long*              glyph_locations_stub;
+#endif
+
+    /* the font program, if any */
+    FT_ULong              font_program_size;
+    FT_Byte*              font_program;
+
+    /* the cvt program, if any */
+    FT_ULong              cvt_program_size;
+    FT_Byte*              cvt_program;
+
+    /* the original, unscaled, control value table */
+    FT_ULong              cvt_size;
+    FT_Short*             cvt;
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+    /* the format 0 kerning table, if any */
+    FT_Int                num_kern_pairs;
+    FT_Int                kern_table_index;
+    TT_Kern0_Pair         kern_pairs;
+#endif
+
+    /* A pointer to the bytecode interpreter to use.  This is also */
+    /* used to hook the debugger for the `ttdebug' utility.        */
+    TT_Interpreter        interpreter;
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    /* Use unpatented hinting only. */
+    FT_Bool               unpatented_hinting;
+#endif
+
+    /***********************************************************************/
+    /*                                                                     */
+    /* Other tables or fields. This is used by derivative formats like     */
+    /* OpenType.                                                           */
+    /*                                                                     */
+    /***********************************************************************/
+
+    FT_Generic            extra;
+
+    const char*           postscript_name;
+
+    /* since version 2.1.8, but was originally placed after */
+    /* `glyph_locations_stub'                               */
+    FT_ULong              glyf_len;
+
+    /* since version 2.1.8, but was originally placed before `extra' */
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    FT_Bool               doblend;
+    GX_Blend              blend;
+#endif
+
+    /* since version 2.2 */
+
+    FT_Byte*              horz_metrics;
+    FT_ULong              horz_metrics_size;
+
+    FT_Byte*              vert_metrics;
+    FT_ULong              vert_metrics_size;
+
+    FT_ULong              num_locations; /* in broken TTF, gid > 0xFFFF */
+    FT_Byte*              glyph_locations;
+
+    FT_Byte*              hdmx_table;
+    FT_ULong              hdmx_table_size;
+    FT_UInt               hdmx_record_count;
+    FT_ULong              hdmx_record_size;
+    FT_Byte*              hdmx_record_sizes;
+
+    FT_Byte*              sbit_table;
+    FT_ULong              sbit_table_size;
+    FT_UInt               sbit_num_strikes;
+
+    FT_Byte*              kern_table;
+    FT_ULong              kern_table_size;
+    FT_UInt               num_kern_tables;
+    FT_UInt32             kern_avail_bits;
+    FT_UInt32             kern_order_bits;
+
+#ifdef TT_CONFIG_OPTION_BDF
+    TT_BDFRec             bdf;
+#endif /* TT_CONFIG_OPTION_BDF */
+
+    /* since 2.3.0 */
+    FT_ULong              horz_metrics_offset;
+    FT_ULong              vert_metrics_offset;
+
+  } TT_FaceRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  <Struct>                                                             */
+  /*     TT_GlyphZoneRec                                                   */
+  /*                                                                       */
+  /*  <Description>                                                        */
+  /*     A glyph zone is used to load, scale and hint glyph outline        */
+  /*     coordinates.                                                      */
+  /*                                                                       */
+  /*  <Fields>                                                             */
+  /*     memory       :: A handle to the memory manager.                   */
+  /*                                                                       */
+  /*     max_points   :: The maximal size in points of the zone.           */
+  /*                                                                       */
+  /*     max_contours :: Max size in links contours of the zone.           */
+  /*                                                                       */
+  /*     n_points     :: The current number of points in the zone.         */
+  /*                                                                       */
+  /*     n_contours   :: The current number of contours in the zone.       */
+  /*                                                                       */
+  /*     org          :: The original glyph coordinates (font              */
+  /*                     units/scaled).                                    */
+  /*                                                                       */
+  /*     cur          :: The current glyph coordinates (scaled/hinted).    */
+  /*                                                                       */
+  /*     tags         :: The point control tags.                           */
+  /*                                                                       */
+  /*     contours     :: The contours end points.                          */
+  /*                                                                       */
+  /*     first_point  :: Offset of the current subglyph's first point.     */
+  /*                                                                       */
+  typedef struct  TT_GlyphZoneRec_
+  {
+    FT_Memory   memory;
+    FT_UShort   max_points;
+    FT_UShort   max_contours;
+    FT_UShort   n_points;    /* number of points in zone    */
+    FT_Short    n_contours;  /* number of contours          */
+
+    FT_Vector*  org;         /* original point coordinates  */
+    FT_Vector*  cur;         /* current point coordinates   */
+    FT_Vector*  orus;        /* original (unscaled) point coordinates */
+
+    FT_Byte*    tags;        /* current touch flags         */
+    FT_UShort*  contours;    /* contour end points          */
+
+    FT_UShort   first_point; /* offset of first (#0) point  */
+
+  } TT_GlyphZoneRec, *TT_GlyphZone;
+
+
+  /* handle to execution context */
+  typedef struct TT_ExecContextRec_*  TT_ExecContext;
+
+  /* glyph loader structure */
+  typedef struct  TT_LoaderRec_
+  {
+    FT_Face          face;
+    FT_Size          size;
+    FT_GlyphSlot     glyph;
+    FT_GlyphLoader   gloader;
+
+    FT_ULong         load_flags;
+    FT_UInt          glyph_index;
+
+    FT_Stream        stream;
+    FT_Int           byte_len;
+
+    FT_Short         n_contours;
+    FT_BBox          bbox;
+    FT_Int           left_bearing;
+    FT_Int           advance;
+    FT_Int           linear;
+    FT_Bool          linear_def;
+    FT_Bool          preserve_pps;
+    FT_Vector        pp1;
+    FT_Vector        pp2;
+
+    FT_ULong         glyf_offset;
+
+    /* the zone where we load our glyphs */
+    TT_GlyphZoneRec  base;
+    TT_GlyphZoneRec  zone;
+
+    TT_ExecContext   exec;
+    FT_Byte*         instructions;
+    FT_ULong         ins_pos;
+
+    /* for possible extensibility in other formats */
+    void*            other;
+
+    /* since version 2.1.8 */
+    FT_Int           top_bearing;
+    FT_Int           vadvance;
+    FT_Vector        pp3;
+    FT_Vector        pp4;
+
+    /* since version 2.2.1 */
+    FT_Byte*         cursor;
+    FT_Byte*         limit;
+
+  } TT_LoaderRec;
+
+
+FT_END_HEADER
+
+#endif /* __TTTYPES_H__ */
+
+
+/* END */
diff --git a/include/freetype/t1tables.h b/include/freetype/t1tables.h
new file mode 100644 (file)
index 0000000..a14255e
--- /dev/null
@@ -0,0 +1,662 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1tables.h                                                             */
+/*                                                                         */
+/*    Basic Type 1/Type 2 tables definitions and interface (specification  */
+/*    only).                                                               */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006, 2008, 2009, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1TABLES_H__
+#define __T1TABLES_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    type1_tables                                                       */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    Type 1 Tables                                                      */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    Type~1 (PostScript) specific font tables.                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the definition of Type 1-specific tables,    */
+  /*    including structures related to other PostScript font formats.     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */
+  /* structures in order to support Multiple Master fonts.               */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_FontInfoRec                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a Type~1 or Type~2 FontInfo dictionary.  */
+  /*    Note that for Multiple Master fonts, each instance has its own     */
+  /*    FontInfo dictionary.                                               */
+  /*                                                                       */
+  typedef struct  PS_FontInfoRec_
+  {
+    FT_String*  version;
+    FT_String*  notice;
+    FT_String*  full_name;
+    FT_String*  family_name;
+    FT_String*  weight;
+    FT_Long     italic_angle;
+    FT_Bool     is_fixed_pitch;
+    FT_Short    underline_position;
+    FT_UShort   underline_thickness;
+
+  } PS_FontInfoRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_FontInfo                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a @PS_FontInfoRec structure.                           */
+  /*                                                                       */
+  typedef struct PS_FontInfoRec_*  PS_FontInfo;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    T1_FontInfo                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This type is equivalent to @PS_FontInfoRec.  It is deprecated but  */
+  /*    kept to maintain source compatibility between various versions of  */
+  /*    FreeType.                                                          */
+  /*                                                                       */
+  typedef PS_FontInfoRec  T1_FontInfo;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_PrivateRec                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a Type~1 or Type~2 private dictionary.   */
+  /*    Note that for Multiple Master fonts, each instance has its own     */
+  /*    Private dictionary.                                                */
+  /*                                                                       */
+  typedef struct  PS_PrivateRec_
+  {
+    FT_Int     unique_id;
+    FT_Int     lenIV;
+
+    FT_Byte    num_blue_values;
+    FT_Byte    num_other_blues;
+    FT_Byte    num_family_blues;
+    FT_Byte    num_family_other_blues;
+
+    FT_Short   blue_values[14];
+    FT_Short   other_blues[10];
+
+    FT_Short   family_blues      [14];
+    FT_Short   family_other_blues[10];
+
+    FT_Fixed   blue_scale;
+    FT_Int     blue_shift;
+    FT_Int     blue_fuzz;
+
+    FT_UShort  standard_width[1];
+    FT_UShort  standard_height[1];
+
+    FT_Byte    num_snap_widths;
+    FT_Byte    num_snap_heights;
+    FT_Bool    force_bold;
+    FT_Bool    round_stem_up;
+
+    FT_Short   snap_widths [13];  /* including std width  */
+    FT_Short   snap_heights[13];  /* including std height */
+
+    FT_Fixed   expansion_factor;
+
+    FT_Long    language_group;
+    FT_Long    password;
+
+    FT_Short   min_feature[2];
+
+  } PS_PrivateRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    PS_Private                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a @PS_PrivateRec structure.                            */
+  /*                                                                       */
+  typedef struct PS_PrivateRec_*  PS_Private;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    T1_Private                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   This type is equivalent to @PS_PrivateRec.  It is deprecated but    */
+  /*   kept to maintain source compatibility between various versions of   */
+  /*   FreeType.                                                           */
+  /*                                                                       */
+  typedef PS_PrivateRec  T1_Private;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    T1_Blend_Flags                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A set of flags used to indicate which fields are present in a      */
+  /*    given blend dictionary (font info or private).  Used to support    */
+  /*    Multiple Masters fonts.                                            */
+  /*                                                                       */
+  typedef enum  T1_Blend_Flags_
+  {
+    /*# required fields in a FontInfo blend dictionary */
+    T1_BLEND_UNDERLINE_POSITION = 0,
+    T1_BLEND_UNDERLINE_THICKNESS,
+    T1_BLEND_ITALIC_ANGLE,
+
+    /*# required fields in a Private blend dictionary */
+    T1_BLEND_BLUE_VALUES,
+    T1_BLEND_OTHER_BLUES,
+    T1_BLEND_STANDARD_WIDTH,
+    T1_BLEND_STANDARD_HEIGHT,
+    T1_BLEND_STEM_SNAP_WIDTHS,
+    T1_BLEND_STEM_SNAP_HEIGHTS,
+    T1_BLEND_BLUE_SCALE,
+    T1_BLEND_BLUE_SHIFT,
+    T1_BLEND_FAMILY_BLUES,
+    T1_BLEND_FAMILY_OTHER_BLUES,
+    T1_BLEND_FORCE_BOLD,
+
+    /*# never remove */
+    T1_BLEND_MAX
+
+  } T1_Blend_Flags;
+
+  /* */
+
+
+  /*# backwards compatible definitions */
+#define t1_blend_underline_position   T1_BLEND_UNDERLINE_POSITION
+#define t1_blend_underline_thickness  T1_BLEND_UNDERLINE_THICKNESS
+#define t1_blend_italic_angle         T1_BLEND_ITALIC_ANGLE
+#define t1_blend_blue_values          T1_BLEND_BLUE_VALUES
+#define t1_blend_other_blues          T1_BLEND_OTHER_BLUES
+#define t1_blend_standard_widths      T1_BLEND_STANDARD_WIDTH
+#define t1_blend_standard_height      T1_BLEND_STANDARD_HEIGHT
+#define t1_blend_stem_snap_widths     T1_BLEND_STEM_SNAP_WIDTHS
+#define t1_blend_stem_snap_heights    T1_BLEND_STEM_SNAP_HEIGHTS
+#define t1_blend_blue_scale           T1_BLEND_BLUE_SCALE
+#define t1_blend_blue_shift           T1_BLEND_BLUE_SHIFT
+#define t1_blend_family_blues         T1_BLEND_FAMILY_BLUES
+#define t1_blend_family_other_blues   T1_BLEND_FAMILY_OTHER_BLUES
+#define t1_blend_force_bold           T1_BLEND_FORCE_BOLD
+#define t1_blend_max                  T1_BLEND_MAX
+
+
+  /* maximum number of Multiple Masters designs, as defined in the spec */
+#define T1_MAX_MM_DESIGNS     16
+
+  /* maximum number of Multiple Masters axes, as defined in the spec */
+#define T1_MAX_MM_AXIS        4
+
+  /* maximum number of elements in a design map */
+#define T1_MAX_MM_MAP_POINTS  20
+
+
+  /* this structure is used to store the BlendDesignMap entry for an axis */
+  typedef struct  PS_DesignMap_
+  {
+    FT_Byte    num_points;
+    FT_Long*   design_points;
+    FT_Fixed*  blend_points;
+
+  } PS_DesignMapRec, *PS_DesignMap;
+
+  /* backwards-compatible definition */
+  typedef PS_DesignMapRec  T1_DesignMap;
+
+
+  typedef struct  PS_BlendRec_
+  {
+    FT_UInt          num_designs;
+    FT_UInt          num_axis;
+
+    FT_String*       axis_names[T1_MAX_MM_AXIS];
+    FT_Fixed*        design_pos[T1_MAX_MM_DESIGNS];
+    PS_DesignMapRec  design_map[T1_MAX_MM_AXIS];
+
+    FT_Fixed*        weight_vector;
+    FT_Fixed*        default_weight_vector;
+
+    PS_FontInfo      font_infos[T1_MAX_MM_DESIGNS + 1];
+    PS_Private       privates  [T1_MAX_MM_DESIGNS + 1];
+
+    FT_ULong         blend_bitflags;
+
+    FT_BBox*         bboxes    [T1_MAX_MM_DESIGNS + 1];
+
+    /* since 2.3.0 */
+
+    /* undocumented, optional: the default design instance;   */
+    /* corresponds to default_weight_vector --                */
+    /* num_default_design_vector == 0 means it is not present */
+    /* in the font and associated metrics files               */
+    FT_UInt          default_design_vector[T1_MAX_MM_DESIGNS];
+    FT_UInt          num_default_design_vector;
+
+  } PS_BlendRec, *PS_Blend;
+
+
+  /* backwards-compatible definition */
+  typedef PS_BlendRec  T1_Blend;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CID_FaceDictRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to represent data in a CID top-level dictionary.  */
+  /*                                                                       */
+  typedef struct  CID_FaceDictRec_
+  {
+    PS_PrivateRec  private_dict;
+
+    FT_UInt        len_buildchar;
+    FT_Fixed       forcebold_threshold;
+    FT_Pos         stroke_width;
+    FT_Fixed       expansion_factor;
+
+    FT_Byte        paint_type;
+    FT_Byte        font_type;
+    FT_Matrix      font_matrix;
+    FT_Vector      font_offset;
+
+    FT_UInt        num_subrs;
+    FT_ULong       subrmap_offset;
+    FT_Int         sd_bytes;
+
+  } CID_FaceDictRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CID_FaceDict                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a @CID_FaceDictRec structure.                          */
+  /*                                                                       */
+  typedef struct CID_FaceDictRec_*  CID_FaceDict;
+
+  /* */
+
+
+  /* backwards-compatible definition */
+  typedef CID_FaceDictRec  CID_FontDict;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CID_FaceInfoRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to represent CID Face information.                */
+  /*                                                                       */
+  typedef struct  CID_FaceInfoRec_
+  {
+    FT_String*      cid_font_name;
+    FT_Fixed        cid_version;
+    FT_Int          cid_font_type;
+
+    FT_String*      registry;
+    FT_String*      ordering;
+    FT_Int          supplement;
+
+    PS_FontInfoRec  font_info;
+    FT_BBox         font_bbox;
+    FT_ULong        uid_base;
+
+    FT_Int          num_xuid;
+    FT_ULong        xuid[16];
+
+    FT_ULong        cidmap_offset;
+    FT_Int          fd_bytes;
+    FT_Int          gd_bytes;
+    FT_ULong        cid_count;
+
+    FT_Int          num_dicts;
+    CID_FaceDict    font_dicts;
+
+    FT_ULong        data_offset;
+
+  } CID_FaceInfoRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CID_FaceInfo                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a @CID_FaceInfoRec structure.                          */
+  /*                                                                       */
+  typedef struct CID_FaceInfoRec_*  CID_FaceInfo;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CID_Info                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*   This type is equivalent to @CID_FaceInfoRec.  It is deprecated but  */
+  /*   kept to maintain source compatibility between various versions of   */
+  /*   FreeType.                                                           */
+  /*                                                                       */
+  typedef CID_FaceInfoRec  CID_Info;
+
+
+  /************************************************************************
+   *
+   * @function:
+   *    FT_Has_PS_Glyph_Names
+   *
+   * @description:
+   *    Return true if a given face provides reliable PostScript glyph
+   *    names.  This is similar to using the @FT_HAS_GLYPH_NAMES macro,
+   *    except that certain fonts (mostly TrueType) contain incorrect
+   *    glyph name tables.
+   *
+   *    When this function returns true, the caller is sure that the glyph
+   *    names returned by @FT_Get_Glyph_Name are reliable.
+   *
+   * @input:
+   *    face ::
+   *       face handle
+   *
+   * @return:
+   *    Boolean.  True if glyph names are reliable.
+   *
+   */
+  FT_EXPORT( FT_Int )
+  FT_Has_PS_Glyph_Names( FT_Face  face );
+
+
+  /************************************************************************
+   *
+   * @function:
+   *    FT_Get_PS_Font_Info
+   *
+   * @description:
+   *    Retrieve the @PS_FontInfoRec structure corresponding to a given
+   *    PostScript font.
+   *
+   * @input:
+   *    face ::
+   *       PostScript face handle.
+   *
+   * @output:
+   *    afont_info ::
+   *       Output font info structure pointer.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *    The string pointers within the font info structure are owned by
+   *    the face and don't need to be freed by the caller.
+   *
+   *    If the font's format is not PostScript-based, this function will
+   *    return the `FT_Err_Invalid_Argument' error code.
+   *
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_PS_Font_Info( FT_Face      face,
+                       PS_FontInfo  afont_info );
+
+
+  /************************************************************************
+   *
+   * @function:
+   *    FT_Get_PS_Font_Private
+   *
+   * @description:
+   *    Retrieve the @PS_PrivateRec structure corresponding to a given
+   *    PostScript font.
+   *
+   * @input:
+   *    face ::
+   *       PostScript face handle.
+   *
+   * @output:
+   *    afont_private ::
+   *       Output private dictionary structure pointer.
+   *
+   * @return:
+   *    FreeType error code.  0~means success.
+   *
+   * @note:
+   *    The string pointers within the @PS_PrivateRec structure are owned by
+   *    the face and don't need to be freed by the caller.
+   *
+   *    If the font's format is not PostScript-based, this function returns
+   *    the `FT_Err_Invalid_Argument' error code.
+   *
+   */
+  FT_EXPORT( FT_Error )
+  FT_Get_PS_Font_Private( FT_Face     face,
+                          PS_Private  afont_private );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    T1_EncodingType                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration describing the `Encoding' entry in a Type 1         */
+  /*    dictionary.                                                        */
+  /*                                                                       */
+  typedef enum  T1_EncodingType_
+  {
+    T1_ENCODING_TYPE_NONE = 0,
+    T1_ENCODING_TYPE_ARRAY,
+    T1_ENCODING_TYPE_STANDARD,
+    T1_ENCODING_TYPE_ISOLATIN1,
+    T1_ENCODING_TYPE_EXPERT
+
+  } T1_EncodingType;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    PS_Dict_Keys                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration used in calls to @FT_Get_PS_Font_Value to identify  */
+  /*    the Type~1 dictionary entry to retrieve.                           */
+  /*                                                                       */
+  typedef enum  PS_Dict_Keys_
+  {
+    /* conventionally in the font dictionary */
+    PS_DICT_FONT_TYPE,              /* FT_Byte         */
+    PS_DICT_FONT_MATRIX,            /* FT_Fixed        */
+    PS_DICT_FONT_BBOX,              /* FT_Fixed        */
+    PS_DICT_PAINT_TYPE,             /* FT_Byte         */
+    PS_DICT_FONT_NAME,              /* FT_String*      */
+    PS_DICT_UNIQUE_ID,              /* FT_Int          */
+    PS_DICT_NUM_CHAR_STRINGS,       /* FT_Int          */
+    PS_DICT_CHAR_STRING_KEY,        /* FT_String*      */
+    PS_DICT_CHAR_STRING,            /* FT_String*      */
+    PS_DICT_ENCODING_TYPE,          /* T1_EncodingType */
+    PS_DICT_ENCODING_ENTRY,         /* FT_String*      */
+
+    /* conventionally in the font Private dictionary */
+    PS_DICT_NUM_SUBRS,              /* FT_Int     */
+    PS_DICT_SUBR,                   /* FT_String* */
+    PS_DICT_STD_HW,                 /* FT_UShort  */
+    PS_DICT_STD_VW,                 /* FT_UShort  */
+    PS_DICT_NUM_BLUE_VALUES,        /* FT_Byte    */
+    PS_DICT_BLUE_VALUE,             /* FT_Short   */
+    PS_DICT_BLUE_FUZZ,              /* FT_Int     */
+    PS_DICT_NUM_OTHER_BLUES,        /* FT_Byte    */
+    PS_DICT_OTHER_BLUE,             /* FT_Short   */
+    PS_DICT_NUM_FAMILY_BLUES,       /* FT_Byte    */
+    PS_DICT_FAMILY_BLUE,            /* FT_Short   */
+    PS_DICT_NUM_FAMILY_OTHER_BLUES, /* FT_Byte    */
+    PS_DICT_FAMILY_OTHER_BLUE,      /* FT_Short   */
+    PS_DICT_BLUE_SCALE,             /* FT_Fixed   */
+    PS_DICT_BLUE_SHIFT,             /* FT_Int     */
+    PS_DICT_NUM_STEM_SNAP_H,        /* FT_Byte    */
+    PS_DICT_STEM_SNAP_H,            /* FT_Short   */
+    PS_DICT_NUM_STEM_SNAP_V,        /* FT_Byte    */
+    PS_DICT_STEM_SNAP_V,            /* FT_Short   */
+    PS_DICT_FORCE_BOLD,             /* FT_Bool    */
+    PS_DICT_RND_STEM_UP,            /* FT_Bool    */
+    PS_DICT_MIN_FEATURE,            /* FT_Short   */
+    PS_DICT_LEN_IV,                 /* FT_Int     */
+    PS_DICT_PASSWORD,               /* FT_Long    */
+    PS_DICT_LANGUAGE_GROUP,         /* FT_Long    */
+
+    /* conventionally in the font FontInfo dictionary */
+    PS_DICT_VERSION,                /* FT_String* */
+    PS_DICT_NOTICE,                 /* FT_String* */
+    PS_DICT_FULL_NAME,              /* FT_String* */
+    PS_DICT_FAMILY_NAME,            /* FT_String* */
+    PS_DICT_WEIGHT,                 /* FT_String* */
+    PS_DICT_IS_FIXED_PITCH,         /* FT_Bool    */
+    PS_DICT_UNDERLINE_POSITION,     /* FT_Short   */
+    PS_DICT_UNDERLINE_THICKNESS,    /* FT_UShort  */
+    PS_DICT_FS_TYPE,                /* FT_UShort  */
+    PS_DICT_ITALIC_ANGLE,           /* FT_Long    */
+
+    PS_DICT_MAX = PS_DICT_ITALIC_ANGLE
+
+  } PS_Dict_Keys;
+
+
+  /************************************************************************
+   *
+   * @function:
+   *    FT_Get_PS_Font_Value
+   *
+   * @description:
+   *    Retrieve the value for the supplied key from a PostScript font.
+   *
+   * @input:
+   *    face ::
+   *       PostScript face handle.
+   *
+   *    key ::
+   *       An enumeration value representing the dictionary key to retrieve.
+   *
+   *    idx ::
+   *       For array values, this specifies the index to be returned.
+   *
+   *    value ::
+   *       A pointer to memory into which to write the value.
+   *
+   *    valen_len ::
+   *       The size, in bytes, of the memory supplied for the value.
+   *
+   * @output:
+   *    value ::
+   *       The value matching the above key, if it exists.
+   *
+   * @return:
+   *    The amount of memory (in bytes) required to hold the requested
+   *    value (if it exists, -1 otherwise).
+   *
+   * @note:
+   *    The values returned are not pointers into the internal structures of
+   *    the face, but are `fresh' copies, so that the memory containing them
+   *    belongs to the calling application.  This also enforces the
+   *    `read-only' nature of these values, i.e., this function cannot be
+   *    used to manipulate the face.
+   *
+   *    `value' is a void pointer because the values returned can be of
+   *    various types.
+   *
+   *    If either `value' is NULL or `value_len' is too small, just the
+   *    required memory size for the requested entry is returned.
+   *
+   *    The `idx' parameter is used, not only to retrieve elements of, for
+   *    example, the FontMatrix or FontBBox, but also to retrieve name keys
+   *    from the CharStrings dictionary, and the charstrings themselves.  It
+   *    is ignored for atomic values.
+   *
+   *    PS_DICT_BLUE_SCALE returns a value that is scaled up by 1000.  To
+   *    get the value as in the font stream, you need to divide by
+   *    65536000.0 (to remove the FT_Fixed scale, and the x1000 scale).
+   *
+   *    IMPORTANT: Only key/value pairs read by the FreeType interpreter can
+   *    be retrieved.  So, for example, PostScript procedures such as NP,
+   *    ND, and RD are not available.  Arbitrary keys are, obviously, not be
+   *    available either.
+   *
+   *    If the font's format is not PostScript-based, this function returns
+   *    the `FT_Err_Invalid_Argument' error code.
+   *
+   */
+  FT_EXPORT( FT_Long )
+  FT_Get_PS_Font_Value( FT_Face       face,
+                        PS_Dict_Keys  key,
+                        FT_UInt       idx,
+                        void         *value,
+                        FT_Long       value_len );
+
+  /* */
+
+FT_END_HEADER
+
+#endif /* __T1TABLES_H__ */
+
+
+/* END */
diff --git a/include/freetype/ttnameid.h b/include/freetype/ttnameid.h
new file mode 100644 (file)
index 0000000..66aef04
--- /dev/null
@@ -0,0 +1,1247 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttnameid.h                                                             */
+/*                                                                         */
+/*    TrueType name ID definitions (specification only).                   */
+/*                                                                         */
+/*  Copyright 1996-2002, 2003, 2004, 2006, 2007, 2008 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTNAMEID_H__
+#define __TTNAMEID_H__
+
+
+#include <ft2build.h>
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    truetype_tables                                                    */
+  /*                                                                       */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Possible values for the `platform' identifier code in the name        */
+  /* records of the TTF `name' table.                                      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_PLATFORM_XXX
+   *
+   * @description:
+   *   A list of valid values for the `platform_id' identifier code in
+   *   @FT_CharMapRec and @FT_SfntName structures.
+   *
+   * @values:
+   *   TT_PLATFORM_APPLE_UNICODE ::
+   *     Used by Apple to indicate a Unicode character map and/or name entry.
+   *     See @TT_APPLE_ID_XXX for corresponding `encoding_id' values.  Note
+   *     that name entries in this format are coded as big-endian UCS-2
+   *     character codes _only_.
+   *
+   *   TT_PLATFORM_MACINTOSH ::
+   *     Used by Apple to indicate a MacOS-specific charmap and/or name entry.
+   *     See @TT_MAC_ID_XXX for corresponding `encoding_id' values.  Note that
+   *     most TrueType fonts contain an Apple roman charmap to be usable on
+   *     MacOS systems (even if they contain a Microsoft charmap as well).
+   *
+   *   TT_PLATFORM_ISO ::
+   *     This value was used to specify ISO/IEC 10646 charmaps.  It is however
+   *     now deprecated.  See @TT_ISO_ID_XXX for a list of corresponding
+   *     `encoding_id' values.
+   *
+   *   TT_PLATFORM_MICROSOFT ::
+   *     Used by Microsoft to indicate Windows-specific charmaps.  See
+   *     @TT_MS_ID_XXX for a list of corresponding `encoding_id' values.
+   *     Note that most fonts contain a Unicode charmap using
+   *     (TT_PLATFORM_MICROSOFT, @TT_MS_ID_UNICODE_CS).
+   *
+   *   TT_PLATFORM_CUSTOM ::
+   *     Used to indicate application-specific charmaps.
+   *
+   *   TT_PLATFORM_ADOBE ::
+   *     This value isn't part of any font format specification, but is used
+   *     by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec
+   *     structure.  See @TT_ADOBE_ID_XXX.
+   */
+
+#define TT_PLATFORM_APPLE_UNICODE  0
+#define TT_PLATFORM_MACINTOSH      1
+#define TT_PLATFORM_ISO            2 /* deprecated */
+#define TT_PLATFORM_MICROSOFT      3
+#define TT_PLATFORM_CUSTOM         4
+#define TT_PLATFORM_ADOBE          7 /* artificial */
+
+
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_APPLE_ID_XXX
+   *
+   * @description:
+   *   A list of valid values for the `encoding_id' for
+   *   @TT_PLATFORM_APPLE_UNICODE charmaps and name entries.
+   *
+   * @values:
+   *   TT_APPLE_ID_DEFAULT ::
+   *     Unicode version 1.0.
+   *
+   *   TT_APPLE_ID_UNICODE_1_1 ::
+   *     Unicode 1.1; specifies Hangul characters starting at U+34xx.
+   *
+   *   TT_APPLE_ID_ISO_10646 ::
+   *     Deprecated (identical to preceding).
+   *
+   *   TT_APPLE_ID_UNICODE_2_0 ::
+   *     Unicode 2.0 and beyond (UTF-16 BMP only).
+   *
+   *   TT_APPLE_ID_UNICODE_32 ::
+   *     Unicode 3.1 and beyond, using UTF-32.
+   *
+   *   TT_APPLE_ID_VARIANT_SELECTOR ::
+   *     From Adobe, not Apple.  Not a normal cmap.  Specifies variations
+   *     on a real cmap.
+   */
+
+#define TT_APPLE_ID_DEFAULT           0 /* Unicode 1.0 */
+#define TT_APPLE_ID_UNICODE_1_1       1 /* specify Hangul at U+34xx */
+#define TT_APPLE_ID_ISO_10646         2 /* deprecated */
+#define TT_APPLE_ID_UNICODE_2_0       3 /* or later */
+#define TT_APPLE_ID_UNICODE_32        4 /* 2.0 or later, full repertoire */
+#define TT_APPLE_ID_VARIANT_SELECTOR  5 /* variation selector data */
+
+
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_MAC_ID_XXX
+   *
+   * @description:
+   *   A list of valid values for the `encoding_id' for
+   *   @TT_PLATFORM_MACINTOSH charmaps and name entries.
+   *
+   * @values:
+   *   TT_MAC_ID_ROMAN ::
+   *   TT_MAC_ID_JAPANESE ::
+   *   TT_MAC_ID_TRADITIONAL_CHINESE ::
+   *   TT_MAC_ID_KOREAN ::
+   *   TT_MAC_ID_ARABIC ::
+   *   TT_MAC_ID_HEBREW ::
+   *   TT_MAC_ID_GREEK ::
+   *   TT_MAC_ID_RUSSIAN ::
+   *   TT_MAC_ID_RSYMBOL ::
+   *   TT_MAC_ID_DEVANAGARI ::
+   *   TT_MAC_ID_GURMUKHI ::
+   *   TT_MAC_ID_GUJARATI ::
+   *   TT_MAC_ID_ORIYA ::
+   *   TT_MAC_ID_BENGALI ::
+   *   TT_MAC_ID_TAMIL ::
+   *   TT_MAC_ID_TELUGU ::
+   *   TT_MAC_ID_KANNADA ::
+   *   TT_MAC_ID_MALAYALAM ::
+   *   TT_MAC_ID_SINHALESE ::
+   *   TT_MAC_ID_BURMESE ::
+   *   TT_MAC_ID_KHMER ::
+   *   TT_MAC_ID_THAI ::
+   *   TT_MAC_ID_LAOTIAN ::
+   *   TT_MAC_ID_GEORGIAN ::
+   *   TT_MAC_ID_ARMENIAN ::
+   *   TT_MAC_ID_MALDIVIAN ::
+   *   TT_MAC_ID_SIMPLIFIED_CHINESE ::
+   *   TT_MAC_ID_TIBETAN ::
+   *   TT_MAC_ID_MONGOLIAN ::
+   *   TT_MAC_ID_GEEZ ::
+   *   TT_MAC_ID_SLAVIC ::
+   *   TT_MAC_ID_VIETNAMESE ::
+   *   TT_MAC_ID_SINDHI ::
+   *   TT_MAC_ID_UNINTERP ::
+   */
+
+#define TT_MAC_ID_ROMAN                 0
+#define TT_MAC_ID_JAPANESE              1
+#define TT_MAC_ID_TRADITIONAL_CHINESE   2
+#define TT_MAC_ID_KOREAN                3
+#define TT_MAC_ID_ARABIC                4
+#define TT_MAC_ID_HEBREW                5
+#define TT_MAC_ID_GREEK                 6
+#define TT_MAC_ID_RUSSIAN               7
+#define TT_MAC_ID_RSYMBOL               8
+#define TT_MAC_ID_DEVANAGARI            9
+#define TT_MAC_ID_GURMUKHI             10
+#define TT_MAC_ID_GUJARATI             11
+#define TT_MAC_ID_ORIYA                12
+#define TT_MAC_ID_BENGALI              13
+#define TT_MAC_ID_TAMIL                14
+#define TT_MAC_ID_TELUGU               15
+#define TT_MAC_ID_KANNADA              16
+#define TT_MAC_ID_MALAYALAM            17
+#define TT_MAC_ID_SINHALESE            18
+#define TT_MAC_ID_BURMESE              19
+#define TT_MAC_ID_KHMER                20
+#define TT_MAC_ID_THAI                 21
+#define TT_MAC_ID_LAOTIAN              22
+#define TT_MAC_ID_GEORGIAN             23
+#define TT_MAC_ID_ARMENIAN             24
+#define TT_MAC_ID_MALDIVIAN            25
+#define TT_MAC_ID_SIMPLIFIED_CHINESE   25
+#define TT_MAC_ID_TIBETAN              26
+#define TT_MAC_ID_MONGOLIAN            27
+#define TT_MAC_ID_GEEZ                 28
+#define TT_MAC_ID_SLAVIC               29
+#define TT_MAC_ID_VIETNAMESE           30
+#define TT_MAC_ID_SINDHI               31
+#define TT_MAC_ID_UNINTERP             32
+
+
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_ISO_ID_XXX
+   *
+   * @description:
+   *   A list of valid values for the `encoding_id' for
+   *   @TT_PLATFORM_ISO charmaps and name entries.
+   *
+   *   Their use is now deprecated.
+   *
+   * @values:
+   *   TT_ISO_ID_7BIT_ASCII ::
+   *     ASCII.
+   *   TT_ISO_ID_10646 ::
+   *     ISO/10646.
+   *   TT_ISO_ID_8859_1 ::
+   *     Also known as Latin-1.
+   */
+
+#define TT_ISO_ID_7BIT_ASCII  0
+#define TT_ISO_ID_10646       1
+#define TT_ISO_ID_8859_1      2
+
+
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_MS_ID_XXX
+   *
+   * @description:
+   *   A list of valid values for the `encoding_id' for
+   *   @TT_PLATFORM_MICROSOFT charmaps and name entries.
+   *
+   * @values:
+   *   TT_MS_ID_SYMBOL_CS ::
+   *     Corresponds to Microsoft symbol encoding. See
+   *     @FT_ENCODING_MS_SYMBOL.
+   *
+   *   TT_MS_ID_UNICODE_CS ::
+   *     Corresponds to a Microsoft WGL4 charmap, matching Unicode.  See
+   *     @FT_ENCODING_UNICODE.
+   *
+   *   TT_MS_ID_SJIS ::
+   *     Corresponds to SJIS Japanese encoding.  See @FT_ENCODING_SJIS.
+   *
+   *   TT_MS_ID_GB2312 ::
+   *     Corresponds to Simplified Chinese as used in Mainland China.  See
+   *     @FT_ENCODING_GB2312.
+   *
+   *   TT_MS_ID_BIG_5 ::
+   *     Corresponds to Traditional Chinese as used in Taiwan and Hong Kong.
+   *     See @FT_ENCODING_BIG5.
+   *
+   *   TT_MS_ID_WANSUNG ::
+   *     Corresponds to Korean Wansung encoding.  See @FT_ENCODING_WANSUNG.
+   *
+   *   TT_MS_ID_JOHAB ::
+   *     Corresponds to Johab encoding.  See @FT_ENCODING_JOHAB.
+   *
+   *   TT_MS_ID_UCS_4 ::
+   *     Corresponds to UCS-4 or UTF-32 charmaps.  This has been added to
+   *     the OpenType specification version 1.4 (mid-2001.)
+   */
+
+#define TT_MS_ID_SYMBOL_CS    0
+#define TT_MS_ID_UNICODE_CS   1
+#define TT_MS_ID_SJIS         2
+#define TT_MS_ID_GB2312       3
+#define TT_MS_ID_BIG_5        4
+#define TT_MS_ID_WANSUNG      5
+#define TT_MS_ID_JOHAB        6
+#define TT_MS_ID_UCS_4       10
+
+
+  /***********************************************************************
+   *
+   * @enum:
+   *   TT_ADOBE_ID_XXX
+   *
+   * @description:
+   *   A list of valid values for the `encoding_id' for
+   *   @TT_PLATFORM_ADOBE charmaps.  This is a FreeType-specific extension!
+   *
+   * @values:
+   *   TT_ADOBE_ID_STANDARD ::
+   *     Adobe standard encoding.
+   *   TT_ADOBE_ID_EXPERT ::
+   *     Adobe expert encoding.
+   *   TT_ADOBE_ID_CUSTOM ::
+   *     Adobe custom encoding.
+   *   TT_ADOBE_ID_LATIN_1 ::
+   *     Adobe Latin~1 encoding.
+   */
+
+#define TT_ADOBE_ID_STANDARD  0
+#define TT_ADOBE_ID_EXPERT    1
+#define TT_ADOBE_ID_CUSTOM    2
+#define TT_ADOBE_ID_LATIN_1   3
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Possible values of the language identifier field in the name records  */
+  /* of the TTF `name' table if the `platform' identifier code is          */
+  /* TT_PLATFORM_MACINTOSH.                                                */
+  /*                                                                       */
+  /* The canonical source for the Apple assigned Language ID's is at       */
+  /*                                                                       */
+  /*   http://fonts.apple.com/TTRefMan/RM06/Chap6name.html                 */
+  /*                                                                       */
+#define TT_MAC_LANGID_ENGLISH                       0
+#define TT_MAC_LANGID_FRENCH                        1
+#define TT_MAC_LANGID_GERMAN                        2
+#define TT_MAC_LANGID_ITALIAN                       3
+#define TT_MAC_LANGID_DUTCH                         4
+#define TT_MAC_LANGID_SWEDISH                       5
+#define TT_MAC_LANGID_SPANISH                       6
+#define TT_MAC_LANGID_DANISH                        7
+#define TT_MAC_LANGID_PORTUGUESE                    8
+#define TT_MAC_LANGID_NORWEGIAN                     9
+#define TT_MAC_LANGID_HEBREW                       10
+#define TT_MAC_LANGID_JAPANESE                     11
+#define TT_MAC_LANGID_ARABIC                       12
+#define TT_MAC_LANGID_FINNISH                      13
+#define TT_MAC_LANGID_GREEK                        14
+#define TT_MAC_LANGID_ICELANDIC                    15
+#define TT_MAC_LANGID_MALTESE                      16
+#define TT_MAC_LANGID_TURKISH                      17
+#define TT_MAC_LANGID_CROATIAN                     18
+#define TT_MAC_LANGID_CHINESE_TRADITIONAL          19
+#define TT_MAC_LANGID_URDU                         20
+#define TT_MAC_LANGID_HINDI                        21
+#define TT_MAC_LANGID_THAI                         22
+#define TT_MAC_LANGID_KOREAN                       23
+#define TT_MAC_LANGID_LITHUANIAN                   24
+#define TT_MAC_LANGID_POLISH                       25
+#define TT_MAC_LANGID_HUNGARIAN                    26
+#define TT_MAC_LANGID_ESTONIAN                     27
+#define TT_MAC_LANGID_LETTISH                      28
+#define TT_MAC_LANGID_SAAMISK                      29
+#define TT_MAC_LANGID_FAEROESE                     30
+#define TT_MAC_LANGID_FARSI                        31
+#define TT_MAC_LANGID_RUSSIAN                      32
+#define TT_MAC_LANGID_CHINESE_SIMPLIFIED           33
+#define TT_MAC_LANGID_FLEMISH                      34
+#define TT_MAC_LANGID_IRISH                        35
+#define TT_MAC_LANGID_ALBANIAN                     36
+#define TT_MAC_LANGID_ROMANIAN                     37
+#define TT_MAC_LANGID_CZECH                        38
+#define TT_MAC_LANGID_SLOVAK                       39
+#define TT_MAC_LANGID_SLOVENIAN                    40
+#define TT_MAC_LANGID_YIDDISH                      41
+#define TT_MAC_LANGID_SERBIAN                      42
+#define TT_MAC_LANGID_MACEDONIAN                   43
+#define TT_MAC_LANGID_BULGARIAN                    44
+#define TT_MAC_LANGID_UKRAINIAN                    45
+#define TT_MAC_LANGID_BYELORUSSIAN                 46
+#define TT_MAC_LANGID_UZBEK                        47
+#define TT_MAC_LANGID_KAZAKH                       48
+#define TT_MAC_LANGID_AZERBAIJANI                  49
+#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT  49
+#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT    50
+#define TT_MAC_LANGID_ARMENIAN                     51
+#define TT_MAC_LANGID_GEORGIAN                     52
+#define TT_MAC_LANGID_MOLDAVIAN                    53
+#define TT_MAC_LANGID_KIRGHIZ                      54
+#define TT_MAC_LANGID_TAJIKI                       55
+#define TT_MAC_LANGID_TURKMEN                      56
+#define TT_MAC_LANGID_MONGOLIAN                    57
+#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT   57
+#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT    58
+#define TT_MAC_LANGID_PASHTO                       59
+#define TT_MAC_LANGID_KURDISH                      60
+#define TT_MAC_LANGID_KASHMIRI                     61
+#define TT_MAC_LANGID_SINDHI                       62
+#define TT_MAC_LANGID_TIBETAN                      63
+#define TT_MAC_LANGID_NEPALI                       64
+#define TT_MAC_LANGID_SANSKRIT                     65
+#define TT_MAC_LANGID_MARATHI                      66
+#define TT_MAC_LANGID_BENGALI                      67
+#define TT_MAC_LANGID_ASSAMESE                     68
+#define TT_MAC_LANGID_GUJARATI                     69
+#define TT_MAC_LANGID_PUNJABI                      70
+#define TT_MAC_LANGID_ORIYA                        71
+#define TT_MAC_LANGID_MALAYALAM                    72
+#define TT_MAC_LANGID_KANNADA                      73
+#define TT_MAC_LANGID_TAMIL                        74
+#define TT_MAC_LANGID_TELUGU                       75
+#define TT_MAC_LANGID_SINHALESE                    76
+#define TT_MAC_LANGID_BURMESE                      77
+#define TT_MAC_LANGID_KHMER                        78
+#define TT_MAC_LANGID_LAO                          79
+#define TT_MAC_LANGID_VIETNAMESE                   80
+#define TT_MAC_LANGID_INDONESIAN                   81
+#define TT_MAC_LANGID_TAGALOG                      82
+#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT           83
+#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT          84
+#define TT_MAC_LANGID_AMHARIC                      85
+#define TT_MAC_LANGID_TIGRINYA                     86
+#define TT_MAC_LANGID_GALLA                        87
+#define TT_MAC_LANGID_SOMALI                       88
+#define TT_MAC_LANGID_SWAHILI                      89
+#define TT_MAC_LANGID_RUANDA                       90
+#define TT_MAC_LANGID_RUNDI                        91
+#define TT_MAC_LANGID_CHEWA                        92
+#define TT_MAC_LANGID_MALAGASY                     93
+#define TT_MAC_LANGID_ESPERANTO                    94
+#define TT_MAC_LANGID_WELSH                       128
+#define TT_MAC_LANGID_BASQUE                      129
+#define TT_MAC_LANGID_CATALAN                     130
+#define TT_MAC_LANGID_LATIN                       131
+#define TT_MAC_LANGID_QUECHUA                     132
+#define TT_MAC_LANGID_GUARANI                     133
+#define TT_MAC_LANGID_AYMARA                      134
+#define TT_MAC_LANGID_TATAR                       135
+#define TT_MAC_LANGID_UIGHUR                      136
+#define TT_MAC_LANGID_DZONGKHA                    137
+#define TT_MAC_LANGID_JAVANESE                    138
+#define TT_MAC_LANGID_SUNDANESE                   139
+
+
+#if 0  /* these seem to be errors that have been dropped */
+
+#define TT_MAC_LANGID_SCOTTISH_GAELIC             140
+#define TT_MAC_LANGID_IRISH_GAELIC                141
+
+#endif
+
+
+  /* The following codes are new as of 2000-03-10 */
+#define TT_MAC_LANGID_GALICIAN                    140
+#define TT_MAC_LANGID_AFRIKAANS                   141
+#define TT_MAC_LANGID_BRETON                      142
+#define TT_MAC_LANGID_INUKTITUT                   143
+#define TT_MAC_LANGID_SCOTTISH_GAELIC             144
+#define TT_MAC_LANGID_MANX_GAELIC                 145
+#define TT_MAC_LANGID_IRISH_GAELIC                146
+#define TT_MAC_LANGID_TONGAN                      147
+#define TT_MAC_LANGID_GREEK_POLYTONIC             148
+#define TT_MAC_LANGID_GREELANDIC                  149
+#define TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT    150
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Possible values of the language identifier field in the name records  */
+  /* of the TTF `name' table if the `platform' identifier code is          */
+  /* TT_PLATFORM_MICROSOFT.                                                */
+  /*                                                                       */
+  /* The canonical source for the MS assigned LCID's (seems to) be at      */
+  /*                                                                       */
+  /*   http://www.microsoft.com/globaldev/reference/lcid-all.mspx          */
+  /*                                                                       */
+  /* It used to be at various places, among them                           */
+  /*                                                                       */
+  /*   http://www.microsoft.com/typography/OTSPEC/lcid-cp.txt              */
+  /*   http://www.microsoft.com/globaldev/reference/loclanghome.asp        */
+  /*   http://support.microsoft.com/support/kb/articles/Q224/8/04.ASP      */
+  /*   http://msdn.microsoft.com/library/en-us/passport25/                 */
+  /*           NET_Passport_VBScript_Documentation/Single_Sign_In/         */
+  /*           Advanced_Single_Sign_In/Localization_and_LCIDs.asp          */
+  /*                                                                       */
+  /* Hopefully, it seems now that the Globaldev site prevails...           */
+  /*                                   (updated by Antoine, 2004-02-17)    */
+
+#define TT_MS_LANGID_ARABIC_GENERAL                    0x0001
+#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA               0x0401
+#define TT_MS_LANGID_ARABIC_IRAQ                       0x0801
+#define TT_MS_LANGID_ARABIC_EGYPT                      0x0c01
+#define TT_MS_LANGID_ARABIC_LIBYA                      0x1001
+#define TT_MS_LANGID_ARABIC_ALGERIA                    0x1401
+#define TT_MS_LANGID_ARABIC_MOROCCO                    0x1801
+#define TT_MS_LANGID_ARABIC_TUNISIA                    0x1c01
+#define TT_MS_LANGID_ARABIC_OMAN                       0x2001
+#define TT_MS_LANGID_ARABIC_YEMEN                      0x2401
+#define TT_MS_LANGID_ARABIC_SYRIA                      0x2801
+#define TT_MS_LANGID_ARABIC_JORDAN                     0x2c01
+#define TT_MS_LANGID_ARABIC_LEBANON                    0x3001
+#define TT_MS_LANGID_ARABIC_KUWAIT                     0x3401
+#define TT_MS_LANGID_ARABIC_UAE                        0x3801
+#define TT_MS_LANGID_ARABIC_BAHRAIN                    0x3c01
+#define TT_MS_LANGID_ARABIC_QATAR                      0x4001
+#define TT_MS_LANGID_BULGARIAN_BULGARIA                0x0402
+#define TT_MS_LANGID_CATALAN_SPAIN                     0x0403
+#define TT_MS_LANGID_CHINESE_GENERAL                   0x0004
+#define TT_MS_LANGID_CHINESE_TAIWAN                    0x0404
+#define TT_MS_LANGID_CHINESE_PRC                       0x0804
+#define TT_MS_LANGID_CHINESE_HONG_KONG                 0x0c04
+#define TT_MS_LANGID_CHINESE_SINGAPORE                 0x1004
+
+#if 1  /* this looks like the correct value */
+#define TT_MS_LANGID_CHINESE_MACAU                     0x1404
+#else  /* but beware, Microsoft may change its mind...
+          the most recent Word reference has the following: */
+#define TT_MS_LANGID_CHINESE_MACAU  TT_MS_LANGID_CHINESE_HONG_KONG
+#endif
+
+#if 0  /* used only with .NET `cultures'; commented out */
+#define TT_MS_LANGID_CHINESE_TRADITIONAL               0x7C04
+#endif
+
+#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC              0x0405
+#define TT_MS_LANGID_DANISH_DENMARK                    0x0406
+#define TT_MS_LANGID_GERMAN_GERMANY                    0x0407
+#define TT_MS_LANGID_GERMAN_SWITZERLAND                0x0807
+#define TT_MS_LANGID_GERMAN_AUSTRIA                    0x0c07
+#define TT_MS_LANGID_GERMAN_LUXEMBOURG                 0x1007
+#define TT_MS_LANGID_GERMAN_LIECHTENSTEI               0x1407
+#define TT_MS_LANGID_GREEK_GREECE                      0x0408
+
+  /* don't ask what this one means... It is commented out currently. */
+#if 0
+#define TT_MS_LANGID_GREEK_GREECE2                     0x2008
+#endif
+
+#define TT_MS_LANGID_ENGLISH_GENERAL                   0x0009
+#define TT_MS_LANGID_ENGLISH_UNITED_STATES             0x0409
+#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM            0x0809
+#define TT_MS_LANGID_ENGLISH_AUSTRALIA                 0x0c09
+#define TT_MS_LANGID_ENGLISH_CANADA                    0x1009
+#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND               0x1409
+#define TT_MS_LANGID_ENGLISH_IRELAND                   0x1809
+#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA              0x1c09
+#define TT_MS_LANGID_ENGLISH_JAMAICA                   0x2009
+#define TT_MS_LANGID_ENGLISH_CARIBBEAN                 0x2409
+#define TT_MS_LANGID_ENGLISH_BELIZE                    0x2809
+#define TT_MS_LANGID_ENGLISH_TRINIDAD                  0x2c09
+#define TT_MS_LANGID_ENGLISH_ZIMBABWE                  0x3009
+#define TT_MS_LANGID_ENGLISH_PHILIPPINES               0x3409
+#define TT_MS_LANGID_ENGLISH_INDONESIA                 0x3809
+#define TT_MS_LANGID_ENGLISH_HONG_KONG                 0x3c09
+#define TT_MS_LANGID_ENGLISH_INDIA                     0x4009
+#define TT_MS_LANGID_ENGLISH_MALAYSIA                  0x4409
+#define TT_MS_LANGID_ENGLISH_SINGAPORE                 0x4809
+#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT    0x040a
+#define TT_MS_LANGID_SPANISH_MEXICO                    0x080a
+#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT  0x0c0a
+#define TT_MS_LANGID_SPANISH_GUATEMALA                 0x100a
+#define TT_MS_LANGID_SPANISH_COSTA_RICA                0x140a
+#define TT_MS_LANGID_SPANISH_PANAMA                    0x180a
+#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC        0x1c0a
+#define TT_MS_LANGID_SPANISH_VENEZUELA                 0x200a
+#define TT_MS_LANGID_SPANISH_COLOMBIA                  0x240a
+#define TT_MS_LANGID_SPANISH_PERU                      0x280a
+#define TT_MS_LANGID_SPANISH_ARGENTINA                 0x2c0a
+#define TT_MS_LANGID_SPANISH_ECUADOR                   0x300a
+#define TT_MS_LANGID_SPANISH_CHILE                     0x340a
+#define TT_MS_LANGID_SPANISH_URUGUAY                   0x380a
+#define TT_MS_LANGID_SPANISH_PARAGUAY                  0x3c0a
+#define TT_MS_LANGID_SPANISH_BOLIVIA                   0x400a
+#define TT_MS_LANGID_SPANISH_EL_SALVADOR               0x440a
+#define TT_MS_LANGID_SPANISH_HONDURAS                  0x480a
+#define TT_MS_LANGID_SPANISH_NICARAGUA                 0x4c0a
+#define TT_MS_LANGID_SPANISH_PUERTO_RICO               0x500a
+#define TT_MS_LANGID_SPANISH_UNITED_STATES             0x540a
+  /* The following ID blatantly violate MS specs by using a */
+  /* sublanguage > 0x1F.                                    */
+#define TT_MS_LANGID_SPANISH_LATIN_AMERICA             0xE40aU
+#define TT_MS_LANGID_FINNISH_FINLAND                   0x040b
+#define TT_MS_LANGID_FRENCH_FRANCE                     0x040c
+#define TT_MS_LANGID_FRENCH_BELGIUM                    0x080c
+#define TT_MS_LANGID_FRENCH_CANADA                     0x0c0c
+#define TT_MS_LANGID_FRENCH_SWITZERLAND                0x100c
+#define TT_MS_LANGID_FRENCH_LUXEMBOURG                 0x140c
+#define TT_MS_LANGID_FRENCH_MONACO                     0x180c
+#define TT_MS_LANGID_FRENCH_WEST_INDIES                0x1c0c
+#define TT_MS_LANGID_FRENCH_REUNION                    0x200c
+#define TT_MS_LANGID_FRENCH_CONGO                      0x240c
+  /* which was formerly: */
+#define TT_MS_LANGID_FRENCH_ZAIRE  TT_MS_LANGID_FRENCH_CONGO
+#define TT_MS_LANGID_FRENCH_SENEGAL                    0x280c
+#define TT_MS_LANGID_FRENCH_CAMEROON                   0x2c0c
+#define TT_MS_LANGID_FRENCH_COTE_D_IVOIRE              0x300c
+#define TT_MS_LANGID_FRENCH_MALI                       0x340c
+#define TT_MS_LANGID_FRENCH_MOROCCO                    0x380c
+#define TT_MS_LANGID_FRENCH_HAITI                      0x3c0c
+  /* and another violation of the spec (see 0xE40aU) */
+#define TT_MS_LANGID_FRENCH_NORTH_AFRICA               0xE40cU
+#define TT_MS_LANGID_HEBREW_ISRAEL                     0x040d
+#define TT_MS_LANGID_HUNGARIAN_HUNGARY                 0x040e
+#define TT_MS_LANGID_ICELANDIC_ICELAND                 0x040f
+#define TT_MS_LANGID_ITALIAN_ITALY                     0x0410
+#define TT_MS_LANGID_ITALIAN_SWITZERLAND               0x0810
+#define TT_MS_LANGID_JAPANESE_JAPAN                    0x0411
+#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA     0x0412
+#define TT_MS_LANGID_KOREAN_JOHAB_KOREA                0x0812
+#define TT_MS_LANGID_DUTCH_NETHERLANDS                 0x0413
+#define TT_MS_LANGID_DUTCH_BELGIUM                     0x0813
+#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL           0x0414
+#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK          0x0814
+#define TT_MS_LANGID_POLISH_POLAND                     0x0415
+#define TT_MS_LANGID_PORTUGUESE_BRAZIL                 0x0416
+#define TT_MS_LANGID_PORTUGUESE_PORTUGAL               0x0816
+#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND        0x0417
+#define TT_MS_LANGID_ROMANIAN_ROMANIA                  0x0418
+#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA                0x0818
+#define TT_MS_LANGID_RUSSIAN_RUSSIA                    0x0419
+#define TT_MS_LANGID_RUSSIAN_MOLDAVIA                  0x0819
+#define TT_MS_LANGID_CROATIAN_CROATIA                  0x041a
+#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN              0x081a
+#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC           0x0c1a
+
+#if 0  /* this used to be this value, but it looks like we were wrong */
+#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA        0x101a
+#else  /* current sources say */
+#define TT_MS_LANGID_CROATIAN_BOSNIA_HERZEGOVINA       0x101a
+#define TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA        0x141a
+       /* and XPsp2 Platform SDK added (2004-07-26) */
+       /* Names are shortened to be significant within 40 chars. */
+#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_LATIN         0x181a
+#define TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC      0x181a
+#endif
+
+#define TT_MS_LANGID_SLOVAK_SLOVAKIA                   0x041b
+#define TT_MS_LANGID_ALBANIAN_ALBANIA                  0x041c
+#define TT_MS_LANGID_SWEDISH_SWEDEN                    0x041d
+#define TT_MS_LANGID_SWEDISH_FINLAND                   0x081d
+#define TT_MS_LANGID_THAI_THAILAND                     0x041e
+#define TT_MS_LANGID_TURKISH_TURKEY                    0x041f
+#define TT_MS_LANGID_URDU_PAKISTAN                     0x0420
+#define TT_MS_LANGID_URDU_INDIA                        0x0820
+#define TT_MS_LANGID_INDONESIAN_INDONESIA              0x0421
+#define TT_MS_LANGID_UKRAINIAN_UKRAINE                 0x0422
+#define TT_MS_LANGID_BELARUSIAN_BELARUS                0x0423
+#define TT_MS_LANGID_SLOVENE_SLOVENIA                  0x0424
+#define TT_MS_LANGID_ESTONIAN_ESTONIA                  0x0425
+#define TT_MS_LANGID_LATVIAN_LATVIA                    0x0426
+#define TT_MS_LANGID_LITHUANIAN_LITHUANIA              0x0427
+#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA      0x0827
+#define TT_MS_LANGID_TAJIK_TAJIKISTAN                  0x0428
+#define TT_MS_LANGID_FARSI_IRAN                        0x0429
+#define TT_MS_LANGID_VIETNAMESE_VIET_NAM               0x042a
+#define TT_MS_LANGID_ARMENIAN_ARMENIA                  0x042b
+#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN            0x042c
+#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC         0x082c
+#define TT_MS_LANGID_BASQUE_SPAIN                      0x042d
+#define TT_MS_LANGID_SORBIAN_GERMANY                   0x042e
+#define TT_MS_LANGID_MACEDONIAN_MACEDONIA              0x042f
+#define TT_MS_LANGID_SUTU_SOUTH_AFRICA                 0x0430
+#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA               0x0431
+#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA               0x0432
+#define TT_MS_LANGID_VENDA_SOUTH_AFRICA                0x0433
+#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA                0x0434
+#define TT_MS_LANGID_ZULU_SOUTH_AFRICA                 0x0435
+#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA            0x0436
+#define TT_MS_LANGID_GEORGIAN_GEORGIA                  0x0437
+#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS           0x0438
+#define TT_MS_LANGID_HINDI_INDIA                       0x0439
+#define TT_MS_LANGID_MALTESE_MALTA                     0x043a
+  /* Added by XPsp2 Platform SDK (2004-07-26) */
+#define TT_MS_LANGID_SAMI_NORTHERN_NORWAY              0x043b
+#define TT_MS_LANGID_SAMI_NORTHERN_SWEDEN              0x083b
+#define TT_MS_LANGID_SAMI_NORTHERN_FINLAND             0x0C3b
+#define TT_MS_LANGID_SAMI_LULE_NORWAY                  0x103b
+#define TT_MS_LANGID_SAMI_LULE_SWEDEN                  0x143b
+#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY              0x183b
+#define TT_MS_LANGID_SAMI_SOUTHERN_SWEDEN              0x1C3b
+#define TT_MS_LANGID_SAMI_SKOLT_FINLAND                0x203b
+#define TT_MS_LANGID_SAMI_INARI_FINLAND                0x243b
+  /* ... and we also keep our old identifier... */
+#define TT_MS_LANGID_SAAMI_LAPONIA                     0x043b
+
+#if 0 /* this seems to be a previous inversion */
+#define TT_MS_LANGID_IRISH_GAELIC_IRELAND              0x043c
+#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM    0x083c
+#else
+#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM    0x083c
+#define TT_MS_LANGID_IRISH_GAELIC_IRELAND              0x043c
+#endif
+
+#define TT_MS_LANGID_YIDDISH_GERMANY                   0x043d
+#define TT_MS_LANGID_MALAY_MALAYSIA                    0x043e
+#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM           0x083e
+#define TT_MS_LANGID_KAZAK_KAZAKSTAN                   0x043f
+#define TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN /* Cyrillic*/ 0x0440
+  /* alias declared in Windows 2000 */
+#define TT_MS_LANGID_KIRGHIZ_KIRGHIZ_REPUBLIC \
+          TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN
+
+#define TT_MS_LANGID_SWAHILI_KENYA                     0x0441
+#define TT_MS_LANGID_TURKMEN_TURKMENISTAN              0x0442
+#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN            0x0443
+#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC         0x0843
+#define TT_MS_LANGID_TATAR_TATARSTAN                   0x0444
+#define TT_MS_LANGID_BENGALI_INDIA                     0x0445
+#define TT_MS_LANGID_BENGALI_BANGLADESH                0x0845
+#define TT_MS_LANGID_PUNJABI_INDIA                     0x0446
+#define TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN           0x0846
+#define TT_MS_LANGID_GUJARATI_INDIA                    0x0447
+#define TT_MS_LANGID_ORIYA_INDIA                       0x0448
+#define TT_MS_LANGID_TAMIL_INDIA                       0x0449
+#define TT_MS_LANGID_TELUGU_INDIA                      0x044a
+#define TT_MS_LANGID_KANNADA_INDIA                     0x044b
+#define TT_MS_LANGID_MALAYALAM_INDIA                   0x044c
+#define TT_MS_LANGID_ASSAMESE_INDIA                    0x044d
+#define TT_MS_LANGID_MARATHI_INDIA                     0x044e
+#define TT_MS_LANGID_SANSKRIT_INDIA                    0x044f
+#define TT_MS_LANGID_MONGOLIAN_MONGOLIA /* Cyrillic */ 0x0450
+#define TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN      0x0850
+#define TT_MS_LANGID_TIBETAN_CHINA                     0x0451
+  /* Don't use the next constant!  It has            */
+  /*   (1) the wrong spelling (Dzonghka)             */
+  /*   (2) Microsoft doesn't officially define it -- */
+  /*       at least it is not in the List of Local   */
+  /*       ID Values.                                */
+  /*   (3) Dzongkha is not the same language as      */
+  /*       Tibetan, so merging it is wrong anyway.   */
+  /*                                                 */
+  /* TT_MS_LANGID_TIBETAN_BHUTAN is correct, BTW.    */
+#define TT_MS_LANGID_DZONGHKA_BHUTAN                   0x0851
+
+#if 0
+  /* the following used to be defined */
+#define TT_MS_LANGID_TIBETAN_BHUTAN                    0x0451
+  /* ... but it was changed; */
+#else
+  /* So we will continue to #define it, but with the correct value */
+#define TT_MS_LANGID_TIBETAN_BHUTAN   TT_MS_LANGID_DZONGHKA_BHUTAN
+#endif
+
+#define TT_MS_LANGID_WELSH_WALES                       0x0452
+#define TT_MS_LANGID_KHMER_CAMBODIA                    0x0453
+#define TT_MS_LANGID_LAO_LAOS                          0x0454
+#define TT_MS_LANGID_BURMESE_MYANMAR                   0x0455
+#define TT_MS_LANGID_GALICIAN_SPAIN                    0x0456
+#define TT_MS_LANGID_KONKANI_INDIA                     0x0457
+#define TT_MS_LANGID_MANIPURI_INDIA  /* Bengali */     0x0458
+#define TT_MS_LANGID_SINDHI_INDIA /* Arabic */         0x0459
+#define TT_MS_LANGID_SINDHI_PAKISTAN                   0x0859
+  /* Missing a LCID for Sindhi in Devanagari script */
+#define TT_MS_LANGID_SYRIAC_SYRIA                      0x045a
+#define TT_MS_LANGID_SINHALESE_SRI_LANKA               0x045b
+#define TT_MS_LANGID_CHEROKEE_UNITED_STATES            0x045c
+#define TT_MS_LANGID_INUKTITUT_CANADA                  0x045d
+#define TT_MS_LANGID_AMHARIC_ETHIOPIA                  0x045e
+#define TT_MS_LANGID_TAMAZIGHT_MOROCCO /* Arabic */    0x045f
+#define TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN           0x085f
+  /* Missing a LCID for Tifinagh script */
+#define TT_MS_LANGID_KASHMIRI_PAKISTAN /* Arabic */    0x0460
+  /* Spelled this way by XPsp2 Platform SDK (2004-07-26) */
+  /* script is yet unclear... might be Arabic, Nagari or Sharada */
+#define TT_MS_LANGID_KASHMIRI_SASIA                    0x0860
+  /* ... and aliased (by MS) for compatibility reasons. */
+#define TT_MS_LANGID_KASHMIRI_INDIA TT_MS_LANGID_KASHMIRI_SASIA
+#define TT_MS_LANGID_NEPALI_NEPAL                      0x0461
+#define TT_MS_LANGID_NEPALI_INDIA                      0x0861
+#define TT_MS_LANGID_FRISIAN_NETHERLANDS               0x0462
+#define TT_MS_LANGID_PASHTO_AFGHANISTAN                0x0463
+#define TT_MS_LANGID_FILIPINO_PHILIPPINES              0x0464
+#define TT_MS_LANGID_DHIVEHI_MALDIVES                  0x0465
+  /* alias declared in Windows 2000 */
+#define TT_MS_LANGID_DIVEHI_MALDIVES  TT_MS_LANGID_DHIVEHI_MALDIVES
+#define TT_MS_LANGID_EDO_NIGERIA                       0x0466
+#define TT_MS_LANGID_FULFULDE_NIGERIA                  0x0467
+#define TT_MS_LANGID_HAUSA_NIGERIA                     0x0468
+#define TT_MS_LANGID_IBIBIO_NIGERIA                    0x0469
+#define TT_MS_LANGID_YORUBA_NIGERIA                    0x046a
+#define TT_MS_LANGID_QUECHUA_BOLIVIA                   0x046b
+#define TT_MS_LANGID_QUECHUA_ECUADOR                   0x086b
+#define TT_MS_LANGID_QUECHUA_PERU                      0x0c6b
+#define TT_MS_LANGID_SEPEDI_SOUTH_AFRICA               0x046c
+  /* Also spelled by XPsp2 Platform SDK (2004-07-26) */
+#define TT_MS_LANGID_SOTHO_SOUTHERN_SOUTH_AFRICA \
+          TT_MS_LANGID_SEPEDI_SOUTH_AFRICA
+  /* language codes 0x046d, 0x046e and 0x046f are (still) unknown. */
+#define TT_MS_LANGID_IGBO_NIGERIA                      0x0470
+#define TT_MS_LANGID_KANURI_NIGERIA                    0x0471
+#define TT_MS_LANGID_OROMO_ETHIOPIA                    0x0472
+#define TT_MS_LANGID_TIGRIGNA_ETHIOPIA                 0x0473
+#define TT_MS_LANGID_TIGRIGNA_ERYTHREA                 0x0873
+  /* also spelled in the `Passport SDK' list as: */
+#define TT_MS_LANGID_TIGRIGNA_ERYTREA  TT_MS_LANGID_TIGRIGNA_ERYTHREA
+#define TT_MS_LANGID_GUARANI_PARAGUAY                  0x0474
+#define TT_MS_LANGID_HAWAIIAN_UNITED_STATES            0x0475
+#define TT_MS_LANGID_LATIN                             0x0476
+#define TT_MS_LANGID_SOMALI_SOMALIA                    0x0477
+  /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */
+  /*       not written (but OTOH the peculiar writing system is worth     */
+  /*       studying).                                                     */
+#define TT_MS_LANGID_YI_CHINA                          0x0478
+#define TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES   0x0479
+  /* language codes from 0x047a to 0x047f are (still) unknown. */
+#define TT_MS_LANGID_UIGHUR_CHINA                      0x0480
+#define TT_MS_LANGID_MAORI_NEW_ZEALAND                 0x0481
+
+#if 0  /* not deemed useful for fonts */
+#define TT_MS_LANGID_HUMAN_INTERFACE_DEVICE            0x04ff
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Possible values of the `name' identifier field in the name records of */
+  /* the TTF `name' table.  These values are platform independent.         */
+  /*                                                                       */
+#define TT_NAME_ID_COPYRIGHT            0
+#define TT_NAME_ID_FONT_FAMILY          1
+#define TT_NAME_ID_FONT_SUBFAMILY       2
+#define TT_NAME_ID_UNIQUE_ID            3
+#define TT_NAME_ID_FULL_NAME            4
+#define TT_NAME_ID_VERSION_STRING       5
+#define TT_NAME_ID_PS_NAME              6
+#define TT_NAME_ID_TRADEMARK            7
+
+  /* the following values are from the OpenType spec */
+#define TT_NAME_ID_MANUFACTURER         8
+#define TT_NAME_ID_DESIGNER             9
+#define TT_NAME_ID_DESCRIPTION          10
+#define TT_NAME_ID_VENDOR_URL           11
+#define TT_NAME_ID_DESIGNER_URL         12
+#define TT_NAME_ID_LICENSE              13
+#define TT_NAME_ID_LICENSE_URL          14
+  /* number 15 is reserved */
+#define TT_NAME_ID_PREFERRED_FAMILY     16
+#define TT_NAME_ID_PREFERRED_SUBFAMILY  17
+#define TT_NAME_ID_MAC_FULL_NAME        18
+
+  /* The following code is new as of 2000-01-21 */
+#define TT_NAME_ID_SAMPLE_TEXT          19
+
+  /* This is new in OpenType 1.3 */
+#define TT_NAME_ID_CID_FINDFONT_NAME    20
+
+  /* This is new in OpenType 1.5 */
+#define TT_NAME_ID_WWS_FAMILY           21
+#define TT_NAME_ID_WWS_SUBFAMILY        22
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table.     */
+  /*                                                                       */
+  /* Updated 08-Nov-2008.                                                  */
+  /*                                                                       */
+
+  /* Bit  0   Basic Latin */
+#define TT_UCR_BASIC_LATIN                     (1L <<  0) /* U+0020-U+007E */
+  /* Bit  1   C1 Controls and Latin-1 Supplement */
+#define TT_UCR_LATIN1_SUPPLEMENT               (1L <<  1) /* U+0080-U+00FF */
+  /* Bit  2   Latin Extended-A */
+#define TT_UCR_LATIN_EXTENDED_A                (1L <<  2) /* U+0100-U+017F */
+  /* Bit  3   Latin Extended-B */
+#define TT_UCR_LATIN_EXTENDED_B                (1L <<  3) /* U+0180-U+024F */
+  /* Bit  4   IPA Extensions                 */
+  /*          Phonetic Extensions            */
+  /*          Phonetic Extensions Supplement */
+#define TT_UCR_IPA_EXTENSIONS                  (1L <<  4) /* U+0250-U+02AF */
+                                                          /* U+1D00-U+1D7F */
+                                                          /* U+1D80-U+1DBF */
+  /* Bit  5   Spacing Modifier Letters */
+  /*          Modifier Tone Letters    */
+#define TT_UCR_SPACING_MODIFIER                (1L <<  5) /* U+02B0-U+02FF */
+                                                          /* U+A700-U+A71F */
+  /* Bit  6   Combining Diacritical Marks            */
+  /*          Combining Diacritical Marks Supplement */
+#define TT_UCR_COMBINING_DIACRITICS            (1L <<  6) /* U+0300-U+036F */
+                                                          /* U+1DC0-U+1DFF */
+  /* Bit  7   Greek and Coptic */
+#define TT_UCR_GREEK                           (1L <<  7) /* U+0370-U+03FF */
+  /* Bit  8   Coptic */
+#define TT_UCR_COPTIC                          (1L <<  8) /* U+2C80-U+2CFF */
+  /* Bit  9   Cyrillic            */
+  /*          Cyrillic Supplement */
+  /*          Cyrillic Extended-A */
+  /*          Cyrillic Extended-B */
+#define TT_UCR_CYRILLIC                        (1L <<  9) /* U+0400-U+04FF */
+                                                          /* U+0500-U+052F */
+                                                          /* U+2DE0-U+2DFF */
+                                                          /* U+A640-U+A69F */
+  /* Bit 10   Armenian */
+#define TT_UCR_ARMENIAN                        (1L << 10) /* U+0530-U+058F */
+  /* Bit 11   Hebrew */
+#define TT_UCR_HEBREW                          (1L << 11) /* U+0590-U+05FF */
+  /* Bit 12   Vai */
+#define TT_UCR_VAI                             (1L << 12) /* U+A500-U+A63F */
+  /* Bit 13   Arabic            */
+  /*          Arabic Supplement */
+#define TT_UCR_ARABIC                          (1L << 13) /* U+0600-U+06FF */
+                                                          /* U+0750-U+077F */
+  /* Bit 14   NKo */
+#define TT_UCR_NKO                             (1L << 14) /* U+07C0-U+07FF */
+  /* Bit 15   Devanagari */
+#define TT_UCR_DEVANAGARI                      (1L << 15) /* U+0900-U+097F */
+  /* Bit 16   Bengali */
+#define TT_UCR_BENGALI                         (1L << 16) /* U+0980-U+09FF */
+  /* Bit 17   Gurmukhi */
+#define TT_UCR_GURMUKHI                        (1L << 17) /* U+0A00-U+0A7F */
+  /* Bit 18   Gujarati */
+#define TT_UCR_GUJARATI                        (1L << 18) /* U+0A80-U+0AFF */
+  /* Bit 19   Oriya */
+#define TT_UCR_ORIYA                           (1L << 19) /* U+0B00-U+0B7F */
+  /* Bit 20   Tamil */
+#define TT_UCR_TAMIL                           (1L << 20) /* U+0B80-U+0BFF */
+  /* Bit 21   Telugu */
+#define TT_UCR_TELUGU                          (1L << 21) /* U+0C00-U+0C7F */
+  /* Bit 22   Kannada */
+#define TT_UCR_KANNADA                         (1L << 22) /* U+0C80-U+0CFF */
+  /* Bit 23   Malayalam */
+#define TT_UCR_MALAYALAM                       (1L << 23) /* U+0D00-U+0D7F */
+  /* Bit 24   Thai */
+#define TT_UCR_THAI                            (1L << 24) /* U+0E00-U+0E7F */
+  /* Bit 25   Lao */
+#define TT_UCR_LAO                             (1L << 25) /* U+0E80-U+0EFF */
+  /* Bit 26   Georgian            */
+  /*          Georgian Supplement */
+#define TT_UCR_GEORGIAN                        (1L << 26) /* U+10A0-U+10FF */
+                                                          /* U+2D00-U+2D2F */
+  /* Bit 27   Balinese */
+#define TT_UCR_BALINESE                        (1L << 27) /* U+1B00-U+1B7F */
+  /* Bit 28   Hangul Jamo */
+#define TT_UCR_HANGUL_JAMO                     (1L << 28) /* U+1100-U+11FF */
+  /* Bit 29   Latin Extended Additional */
+  /*          Latin Extended-C          */
+  /*          Latin Extended-D          */
+#define TT_UCR_LATIN_EXTENDED_ADDITIONAL       (1L << 29) /* U+1E00-U+1EFF */
+                                                          /* U+2C60-U+2C7F */
+                                                          /* U+A720-U+A7FF */
+  /* Bit 30   Greek Extended */
+#define TT_UCR_GREEK_EXTENDED                  (1L << 30) /* U+1F00-U+1FFF */
+  /* Bit 31   General Punctuation      */
+  /*          Supplemental Punctuation */
+#define TT_UCR_GENERAL_PUNCTUATION             (1L << 31) /* U+2000-U+206F */
+                                                          /* U+2E00-U+2E7F */
+  /* Bit 32   Superscripts And Subscripts */
+#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS         (1L <<  0) /* U+2070-U+209F */
+  /* Bit 33   Currency Symbols */
+#define TT_UCR_CURRENCY_SYMBOLS                (1L <<  1) /* U+20A0-U+20CF */
+  /* Bit 34   Combining Diacritical Marks For Symbols */
+#define TT_UCR_COMBINING_DIACRITICS_SYMB       (1L <<  2) /* U+20D0-U+20FF */
+  /* Bit 35   Letterlike Symbols */
+#define TT_UCR_LETTERLIKE_SYMBOLS              (1L <<  3) /* U+2100-U+214F */
+  /* Bit 36   Number Forms */
+#define TT_UCR_NUMBER_FORMS                    (1L <<  4) /* U+2150-U+218F */
+  /* Bit 37   Arrows                           */
+  /*          Supplemental Arrows-A            */
+  /*          Supplemental Arrows-B            */
+  /*          Miscellaneous Symbols and Arrows */
+#define TT_UCR_ARROWS                          (1L <<  5) /* U+2190-U+21FF */
+                                                          /* U+27F0-U+27FF */
+                                                          /* U+2900-U+297F */
+                                                          /* U+2B00-U+2BFF */
+  /* Bit 38   Mathematical Operators               */
+  /*          Supplemental Mathematical Operators  */
+  /*          Miscellaneous Mathematical Symbols-A */
+  /*          Miscellaneous Mathematical Symbols-B */
+#define TT_UCR_MATHEMATICAL_OPERATORS          (1L <<  6) /* U+2200-U+22FF */
+                                                          /* U+2A00-U+2AFF */
+                                                          /* U+27C0-U+27EF */
+                                                          /* U+2980-U+29FF */
+  /* Bit 39 Miscellaneous Technical */
+#define TT_UCR_MISCELLANEOUS_TECHNICAL         (1L <<  7) /* U+2300-U+23FF */
+  /* Bit 40   Control Pictures */
+#define TT_UCR_CONTROL_PICTURES                (1L <<  8) /* U+2400-U+243F */
+  /* Bit 41   Optical Character Recognition */
+#define TT_UCR_OCR                             (1L <<  9) /* U+2440-U+245F */
+  /* Bit 42   Enclosed Alphanumerics */
+#define TT_UCR_ENCLOSED_ALPHANUMERICS          (1L << 10) /* U+2460-U+24FF */
+  /* Bit 43   Box Drawing */
+#define TT_UCR_BOX_DRAWING                     (1L << 11) /* U+2500-U+257F */
+  /* Bit 44   Block Elements */
+#define TT_UCR_BLOCK_ELEMENTS                  (1L << 12) /* U+2580-U+259F */
+  /* Bit 45   Geometric Shapes */
+#define TT_UCR_GEOMETRIC_SHAPES                (1L << 13) /* U+25A0-U+25FF */
+  /* Bit 46   Miscellaneous Symbols */
+#define TT_UCR_MISCELLANEOUS_SYMBOLS           (1L << 14) /* U+2600-U+26FF */
+  /* Bit 47   Dingbats */
+#define TT_UCR_DINGBATS                        (1L << 15) /* U+2700-U+27BF */
+  /* Bit 48   CJK Symbols and Punctuation */
+#define TT_UCR_CJK_SYMBOLS                     (1L << 16) /* U+3000-U+303F */
+  /* Bit 49   Hiragana */
+#define TT_UCR_HIRAGANA                        (1L << 17) /* U+3040-U+309F */
+  /* Bit 50   Katakana                     */
+  /*          Katakana Phonetic Extensions */
+#define TT_UCR_KATAKANA                        (1L << 18) /* U+30A0-U+30FF */
+                                                          /* U+31F0-U+31FF */
+  /* Bit 51   Bopomofo          */
+  /*          Bopomofo Extended */
+#define TT_UCR_BOPOMOFO                        (1L << 19) /* U+3100-U+312F */
+                                                          /* U+31A0-U+31BF */
+  /* Bit 52   Hangul Compatibility Jamo */
+#define TT_UCR_HANGUL_COMPATIBILITY_JAMO       (1L << 20) /* U+3130-U+318F */
+  /* Bit 53   Phags-Pa */
+#define TT_UCR_CJK_MISC                        (1L << 21) /* U+A840-U+A87F */
+#define TT_UCR_KANBUN  TT_UCR_CJK_MISC /* deprecated */
+#define TT_UCR_PHAGSPA
+  /* Bit 54   Enclosed CJK Letters and Months */
+#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS     (1L << 22) /* U+3200-U+32FF */
+  /* Bit 55   CJK Compatibility */
+#define TT_UCR_CJK_COMPATIBILITY               (1L << 23) /* U+3300-U+33FF */
+  /* Bit 56   Hangul Syllables */
+#define TT_UCR_HANGUL                          (1L << 24) /* U+AC00-U+D7A3 */
+  /* Bit 57   High Surrogates              */
+  /*          High Private Use Surrogates  */
+  /*          Low Surrogates               */
+  /*                                       */
+  /* According to OpenType specs v.1.3+,   */
+  /* setting bit 57 implies that there is  */
+  /* at least one codepoint beyond the     */
+  /* Basic Multilingual Plane that is      */
+  /* supported by this font.  So it really */
+  /* means >= U+10000                      */
+#define TT_UCR_SURROGATES                      (1L << 25) /* U+D800-U+DB7F */
+                                                          /* U+DB80-U+DBFF */
+                                                          /* U+DC00-U+DFFF */
+#define TT_UCR_NON_PLANE_0  TT_UCR_SURROGATES
+  /* Bit 58  Phoenician */
+#define TT_UCR_PHOENICIAN                      (1L << 26) /*U+10900-U+1091F*/
+  /* Bit 59   CJK Unified Ideographs             */
+  /*          CJK Radicals Supplement            */
+  /*          Kangxi Radicals                    */
+  /*          Ideographic Description Characters */
+  /*          CJK Unified Ideographs Extension A */
+  /*          CJK Unified Ideographs Extension B */
+  /*          Kanbun                             */
+#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS          (1L << 27) /* U+4E00-U+9FFF */
+                                                          /* U+2E80-U+2EFF */
+                                                          /* U+2F00-U+2FDF */
+                                                          /* U+2FF0-U+2FFF */
+                                                          /* U+3400-U+4DB5 */
+                                                          /*U+20000-U+2A6DF*/
+                                                          /* U+3190-U+319F */
+  /* Bit 60   Private Use */
+#define TT_UCR_PRIVATE_USE                     (1L << 28) /* U+E000-U+F8FF */
+  /* Bit 61   CJK Strokes                             */
+  /*          CJK Compatibility Ideographs            */
+  /*          CJK Compatibility Ideographs Supplement */
+#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS    (1L << 29) /* U+31C0-U+31EF */
+                                                          /* U+F900-U+FAFF */
+                                                          /*U+2F800-U+2FA1F*/
+  /* Bit 62   Alphabetic Presentation Forms */
+#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS   (1L << 30) /* U+FB00-U+FB4F */
+  /* Bit 63   Arabic Presentation Forms-A */
+#define TT_UCR_ARABIC_PRESENTATIONS_A          (1L << 31) /* U+FB50-U+FDFF */
+  /* Bit 64   Combining Half Marks */
+#define TT_UCR_COMBINING_HALF_MARKS            (1L <<  0) /* U+FE20-U+FE2F */
+  /* Bit 65   Vertical forms          */
+  /*          CJK Compatibility Forms */
+#define TT_UCR_CJK_COMPATIBILITY_FORMS         (1L <<  1) /* U+FE10-U+FE1F */
+                                                          /* U+FE30-U+FE4F */
+  /* Bit 66   Small Form Variants */
+#define TT_UCR_SMALL_FORM_VARIANTS             (1L <<  2) /* U+FE50-U+FE6F */
+  /* Bit 67   Arabic Presentation Forms-B */
+#define TT_UCR_ARABIC_PRESENTATIONS_B          (1L <<  3) /* U+FE70-U+FEFE */
+  /* Bit 68   Halfwidth and Fullwidth Forms */
+#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS       (1L <<  4) /* U+FF00-U+FFEF */
+  /* Bit 69   Specials */
+#define TT_UCR_SPECIALS                        (1L <<  5) /* U+FFF0-U+FFFD */
+  /* Bit 70   Tibetan */
+#define TT_UCR_TIBETAN                         (1L <<  6) /* U+0F00-U+0FFF */
+  /* Bit 71   Syriac */
+#define TT_UCR_SYRIAC                          (1L <<  7) /* U+0700-U+074F */
+  /* Bit 72   Thaana */
+#define TT_UCR_THAANA                          (1L <<  8) /* U+0780-U+07BF */
+  /* Bit 73   Sinhala */
+#define TT_UCR_SINHALA                         (1L <<  9) /* U+0D80-U+0DFF */
+  /* Bit 74   Myanmar */
+#define TT_UCR_MYANMAR                         (1L << 10) /* U+1000-U+109F */
+  /* Bit 75   Ethiopic            */
+  /*          Ethiopic Supplement */
+  /*          Ethiopic Extended   */
+#define TT_UCR_ETHIOPIC                        (1L << 11) /* U+1200-U+137F */
+                                                          /* U+1380-U+139F */
+                                                          /* U+2D80-U+2DDF */
+  /* Bit 76   Cherokee */
+#define TT_UCR_CHEROKEE                        (1L << 12) /* U+13A0-U+13FF */
+  /* Bit 77   Unified Canadian Aboriginal Syllabics */
+#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS   (1L << 13) /* U+1400-U+167F */
+  /* Bit 78   Ogham */
+#define TT_UCR_OGHAM                           (1L << 14) /* U+1680-U+169F */
+  /* Bit 79   Runic */
+#define TT_UCR_RUNIC                           (1L << 15) /* U+16A0-U+16FF */
+  /* Bit 80   Khmer         */
+  /*          Khmer Symbols */
+#define TT_UCR_KHMER                           (1L << 16) /* U+1780-U+17FF */
+                                                          /* U+19E0-U+19FF */
+  /* Bit 81   Mongolian */
+#define TT_UCR_MONGOLIAN                       (1L << 17) /* U+1800-U+18AF */
+  /* Bit 82   Braille Patterns */
+#define TT_UCR_BRAILLE                         (1L << 18) /* U+2800-U+28FF */
+  /* Bit 83   Yi Syllables */
+  /*          Yi Radicals  */
+#define TT_UCR_YI                              (1L << 19) /* U+A000-U+A48F */
+                                                          /* U+A490-U+A4CF */
+  /* Bit 84   Tagalog  */
+  /*          Hanunoo  */
+  /*          Buhid    */
+  /*          Tagbanwa */
+#define TT_UCR_PHILIPPINE                      (1L << 20) /* U+1700-U+171F */
+                                                          /* U+1720-U+173F */
+                                                          /* U+1740-U+175F */
+                                                          /* U+1760-U+177F */
+  /* Bit 85   Old Italic */
+#define TT_UCR_OLD_ITALIC                      (1L << 21) /*U+10300-U+1032F*/
+  /* Bit 86   Gothic */
+#define TT_UCR_GOTHIC                          (1L << 22) /*U+10330-U+1034F*/
+  /* Bit 87   Deseret */
+#define TT_UCR_DESERET                         (1L << 23) /*U+10400-U+1044F*/
+  /* Bit 88   Byzantine Musical Symbols      */
+  /*          Musical Symbols                */
+  /*          Ancient Greek Musical Notation */
+#define TT_UCR_MUSICAL_SYMBOLS                 (1L << 24) /*U+1D000-U+1D0FF*/
+                                                          /*U+1D100-U+1D1FF*/
+                                                          /*U+1D200-U+1D24F*/
+  /* Bit 89   Mathematical Alphanumeric Symbols */
+#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS       (1L << 25) /*U+1D400-U+1D7FF*/
+  /* Bit 90   Private Use (plane 15) */
+  /*          Private Use (plane 16) */
+#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY       (1L << 26) /*U+F0000-U+FFFFD*/
+                                                        /*U+100000-U+10FFFD*/
+  /* Bit 91   Variation Selectors            */
+  /*          Variation Selectors Supplement */
+#define TT_UCR_VARIATION_SELECTORS             (1L << 27) /* U+FE00-U+FE0F */
+                                                          /*U+E0100-U+E01EF*/
+  /* Bit 92   Tags */
+#define TT_UCR_TAGS                            (1L << 28) /*U+E0000-U+E007F*/
+  /* Bit 93   Limbu */
+#define TT_UCR_LIMBU                           (1L << 29) /* U+1900-U+194F */
+  /* Bit 94   Tai Le */
+#define TT_UCR_TAI_LE                          (1L << 30) /* U+1950-U+197F */
+  /* Bit 95   New Tai Lue */
+#define TT_UCR_NEW_TAI_LUE                     (1L << 31) /* U+1980-U+19DF */
+  /* Bit 96   Buginese */
+#define TT_UCR_BUGINESE                        (1L <<  0) /* U+1A00-U+1A1F */
+  /* Bit 97   Glagolitic */
+#define TT_UCR_GLAGOLITIC                      (1L <<  1) /* U+2C00-U+2C5F */
+  /* Bit 98   Tifinagh */
+#define TT_UCR_TIFINAGH                        (1L <<  2) /* U+2D30-U+2D7F */
+  /* Bit 99   Yijing Hexagram Symbols */
+#define TT_UCR_YIJING                          (1L <<  3) /* U+4DC0-U+4DFF */
+  /* Bit 100  Syloti Nagri */
+#define TT_UCR_SYLOTI_NAGRI                    (1L <<  4) /* U+A800-U+A82F */
+  /* Bit 101  Linear B Syllabary */
+  /*          Linear B Ideograms */
+  /*          Aegean Numbers     */
+#define TT_UCR_LINEAR_B                        (1L <<  5) /*U+10000-U+1007F*/
+                                                          /*U+10080-U+100FF*/
+                                                          /*U+10100-U+1013F*/
+  /* Bit 102  Ancient Greek Numbers */
+#define TT_UCR_ANCIENT_GREEK_NUMBERS           (1L <<  6) /*U+10140-U+1018F*/
+  /* Bit 103  Ugaritic */
+#define TT_UCR_UGARITIC                        (1L <<  7) /*U+10380-U+1039F*/
+  /* Bit 104  Old Persian */
+#define TT_UCR_OLD_PERSIAN                     (1L <<  8) /*U+103A0-U+103DF*/
+  /* Bit 105  Shavian */
+#define TT_UCR_SHAVIAN                         (1L <<  9) /*U+10450-U+1047F*/
+  /* Bit 106  Osmanya */
+#define TT_UCR_OSMANYA                         (1L << 10) /*U+10480-U+104AF*/
+  /* Bit 107  Cypriot Syllabary */
+#define TT_UCR_CYPRIOT_SYLLABARY               (1L << 11) /*U+10800-U+1083F*/
+  /* Bit 108  Kharoshthi */
+#define TT_UCR_KHAROSHTHI                      (1L << 12) /*U+10A00-U+10A5F*/
+  /* Bit 109  Tai Xuan Jing Symbols */
+#define TT_UCR_TAI_XUAN_JING                   (1L << 13) /*U+1D300-U+1D35F*/
+  /* Bit 110  Cuneiform                         */
+  /*          Cuneiform Numbers and Punctuation */
+#define TT_UCR_CUNEIFORM                       (1L << 14) /*U+12000-U+123FF*/
+                                                          /*U+12400-U+1247F*/
+  /* Bit 111  Counting Rod Numerals */
+#define TT_UCR_COUNTING_ROD_NUMERALS           (1L << 15) /*U+1D360-U+1D37F*/
+  /* Bit 112  Sundanese */
+#define TT_UCR_SUNDANESE                       (1L << 16) /* U+1B80-U+1BBF */
+  /* Bit 113  Lepcha */
+#define TT_UCR_LEPCHA                          (1L << 17) /* U+1C00-U+1C4F */
+  /* Bit 114  Ol Chiki */
+#define TT_UCR_OL_CHIKI                        (1L << 18) /* U+1C50-U+1C7F */
+  /* Bit 115  Saurashtra */
+#define TT_UCR_SAURASHTRA                      (1L << 19) /* U+A880-U+A8DF */
+  /* Bit 116  Kayah Li */
+#define TT_UCR_KAYAH_LI                        (1L << 20) /* U+A900-U+A92F */
+  /* Bit 117  Rejang */
+#define TT_UCR_REJANG                          (1L << 21) /* U+A930-U+A95F */
+  /* Bit 118  Cham */
+#define TT_UCR_CHAM                            (1L << 22) /* U+AA00-U+AA5F */
+  /* Bit 119  Ancient Symbols */
+#define TT_UCR_ANCIENT_SYMBOLS                 (1L << 23) /*U+10190-U+101CF*/
+  /* Bit 120  Phaistos Disc */
+#define TT_UCR_PHAISTOS_DISC                   (1L << 24) /*U+101D0-U+101FF*/
+  /* Bit 121  Carian */
+  /*          Lycian */
+  /*          Lydian */
+#define TT_UCR_OLD_ANATOLIAN                   (1L << 25) /*U+102A0-U+102DF*/
+                                                          /*U+10280-U+1029F*/
+                                                          /*U+10920-U+1093F*/
+  /* Bit 122  Domino Tiles  */
+  /*          Mahjong Tiles */
+#define TT_UCR_GAME_TILES                      (1L << 26) /*U+1F030-U+1F09F*/
+                                                          /*U+1F000-U+1F02F*/
+  /* Bit 123-127 Reserved for process-internal usage */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Some compilers have a very limited length of identifiers.             */
+  /*                                                                       */
+#if defined( __TURBOC__ ) && __TURBOC__ < 0x0410 || defined( __PACIFIC__ )
+#define HAVE_LIMIT_ON_IDENTS
+#endif
+
+
+#ifndef HAVE_LIMIT_ON_IDENTS
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Here some alias #defines in order to be clearer.                      */
+  /*                                                                       */
+  /* These are not always #defined to stay within the 31~character limit   */
+  /* which some compilers have.                                            */
+  /*                                                                       */
+  /* Credits go to Dave Hoo <dhoo@flash.net> for pointing out that modern  */
+  /* Borland compilers (read: from BC++ 3.1 on) can increase this limit.   */
+  /* If you get a warning with such a compiler, use the -i40 switch.       */
+  /*                                                                       */
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_A      \
+         TT_UCR_ARABIC_PRESENTATIONS_A
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_B      \
+         TT_UCR_ARABIC_PRESENTATIONS_B
+
+#define TT_UCR_COMBINING_DIACRITICAL_MARKS      \
+         TT_UCR_COMBINING_DIACRITICS
+#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB \
+         TT_UCR_COMBINING_DIACRITICS_SYMB
+
+
+#endif /* !HAVE_LIMIT_ON_IDENTS */
+
+
+FT_END_HEADER
+
+#endif /* __TTNAMEID_H__ */
+
+
+/* END */
diff --git a/include/freetype/tttables.h b/include/freetype/tttables.h
new file mode 100644 (file)
index 0000000..02236c2
--- /dev/null
@@ -0,0 +1,763 @@
+/***************************************************************************/
+/*                                                                         */
+/*  tttables.h                                                             */
+/*                                                                         */
+/*    Basic SFNT/TrueType tables definitions and interface                 */
+/*    (specification only).                                                */
+/*                                                                         */
+/*  Copyright 1996-2005, 2008-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTTABLES_H__
+#define __TTTABLES_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    truetype_tables                                                    */
+  /*                                                                       */
+  /* <Title>                                                               */
+  /*    TrueType Tables                                                    */
+  /*                                                                       */
+  /* <Abstract>                                                            */
+  /*    TrueType specific table types and functions.                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This section contains the definition of TrueType-specific tables   */
+  /*    as well as some routines used to access and process them.          */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Header                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a TrueType font header table.  All       */
+  /*    fields follow the TrueType specification.                          */
+  /*                                                                       */
+  typedef struct  TT_Header_
+  {
+    FT_Fixed   Table_Version;
+    FT_Fixed   Font_Revision;
+
+    FT_Long    CheckSum_Adjust;
+    FT_Long    Magic_Number;
+
+    FT_UShort  Flags;
+    FT_UShort  Units_Per_EM;
+
+    FT_Long    Created [2];
+    FT_Long    Modified[2];
+
+    FT_Short   xMin;
+    FT_Short   yMin;
+    FT_Short   xMax;
+    FT_Short   yMax;
+
+    FT_UShort  Mac_Style;
+    FT_UShort  Lowest_Rec_PPEM;
+
+    FT_Short   Font_Direction;
+    FT_Short   Index_To_Loc_Format;
+    FT_Short   Glyph_Data_Format;
+
+  } TT_Header;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_HoriHeader                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a TrueType horizontal header, the `hhea' */
+  /*    table, as well as the corresponding horizontal metrics table,      */
+  /*    i.e., the `hmtx' table.                                            */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    Version                :: The table version.                       */
+  /*                                                                       */
+  /*    Ascender               :: The font's ascender, i.e., the distance  */
+  /*                              from the baseline to the top-most of all */
+  /*                              glyph points found in the font.          */
+  /*                                                                       */
+  /*                              This value is invalid in many fonts, as  */
+  /*                              it is usually set by the font designer,  */
+  /*                              and often reflects only a portion of the */
+  /*                              glyphs found in the font (maybe ASCII).  */
+  /*                                                                       */
+  /*                              You should use the `sTypoAscender' field */
+  /*                              of the OS/2 table instead if you want    */
+  /*                              the correct one.                         */
+  /*                                                                       */
+  /*    Descender              :: The font's descender, i.e., the distance */
+  /*                              from the baseline to the bottom-most of  */
+  /*                              all glyph points found in the font.  It  */
+  /*                              is negative.                             */
+  /*                                                                       */
+  /*                              This value is invalid in many fonts, as  */
+  /*                              it is usually set by the font designer,  */
+  /*                              and often reflects only a portion of the */
+  /*                              glyphs found in the font (maybe ASCII).  */
+  /*                                                                       */
+  /*                              You should use the `sTypoDescender'      */
+  /*                              field of the OS/2 table instead if you   */
+  /*                              want the correct one.                    */
+  /*                                                                       */
+  /*    Line_Gap               :: The font's line gap, i.e., the distance  */
+  /*                              to add to the ascender and descender to  */
+  /*                              get the BTB, i.e., the                   */
+  /*                              baseline-to-baseline distance for the    */
+  /*                              font.                                    */
+  /*                                                                       */
+  /*    advance_Width_Max      :: This field is the maximum of all advance */
+  /*                              widths found in the font.  It can be     */
+  /*                              used to compute the maximum width of an  */
+  /*                              arbitrary string of text.                */
+  /*                                                                       */
+  /*    min_Left_Side_Bearing  :: The minimum left side bearing of all     */
+  /*                              glyphs within the font.                  */
+  /*                                                                       */
+  /*    min_Right_Side_Bearing :: The minimum right side bearing of all    */
+  /*                              glyphs within the font.                  */
+  /*                                                                       */
+  /*    xMax_Extent            :: The maximum horizontal extent (i.e., the */
+  /*                              `width' of a glyph's bounding box) for   */
+  /*                              all glyphs in the font.                  */
+  /*                                                                       */
+  /*    caret_Slope_Rise       :: The rise coefficient of the cursor's     */
+  /*                              slope of the cursor (slope=rise/run).    */
+  /*                                                                       */
+  /*    caret_Slope_Run        :: The run coefficient of the cursor's      */
+  /*                              slope.                                   */
+  /*                                                                       */
+  /*    Reserved               :: 8~reserved bytes.                        */
+  /*                                                                       */
+  /*    metric_Data_Format     :: Always~0.                                */
+  /*                                                                       */
+  /*    number_Of_HMetrics     :: Number of HMetrics entries in the `hmtx' */
+  /*                              table -- this value can be smaller than  */
+  /*                              the total number of glyphs in the font.  */
+  /*                                                                       */
+  /*    long_metrics           :: A pointer into the `hmtx' table.         */
+  /*                                                                       */
+  /*    short_metrics          :: A pointer into the `hmtx' table.         */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should   */
+  /*               be identical except for the names of their fields which */
+  /*               are different.                                          */
+  /*                                                                       */
+  /*               This ensures that a single function in the `ttload'     */
+  /*               module is able to read both the horizontal and vertical */
+  /*               headers.                                                */
+  /*                                                                       */
+  typedef struct  TT_HoriHeader_
+  {
+    FT_Fixed   Version;
+    FT_Short   Ascender;
+    FT_Short   Descender;
+    FT_Short   Line_Gap;
+
+    FT_UShort  advance_Width_Max;      /* advance width maximum */
+
+    FT_Short   min_Left_Side_Bearing;  /* minimum left-sb       */
+    FT_Short   min_Right_Side_Bearing; /* minimum right-sb      */
+    FT_Short   xMax_Extent;            /* xmax extents          */
+    FT_Short   caret_Slope_Rise;
+    FT_Short   caret_Slope_Run;
+    FT_Short   caret_Offset;
+
+    FT_Short   Reserved[4];
+
+    FT_Short   metric_Data_Format;
+    FT_UShort  number_Of_HMetrics;
+
+    /* The following fields are not defined by the TrueType specification */
+    /* but they are used to connect the metrics header to the relevant    */
+    /* `HMTX' table.                                                      */
+
+    void*      long_metrics;
+    void*      short_metrics;
+
+  } TT_HoriHeader;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_VertHeader                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a TrueType vertical header, the `vhea'   */
+  /*    table, as well as the corresponding vertical metrics table, i.e.,  */
+  /*    the `vmtx' table.                                                  */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    Version                 :: The table version.                      */
+  /*                                                                       */
+  /*    Ascender                :: The font's ascender, i.e., the distance */
+  /*                               from the baseline to the top-most of    */
+  /*                               all glyph points found in the font.     */
+  /*                                                                       */
+  /*                               This value is invalid in many fonts, as */
+  /*                               it is usually set by the font designer, */
+  /*                               and often reflects only a portion of    */
+  /*                               the glyphs found in the font (maybe     */
+  /*                               ASCII).                                 */
+  /*                                                                       */
+  /*                               You should use the `sTypoAscender'      */
+  /*                               field of the OS/2 table instead if you  */
+  /*                               want the correct one.                   */
+  /*                                                                       */
+  /*    Descender               :: The font's descender, i.e., the         */
+  /*                               distance from the baseline to the       */
+  /*                               bottom-most of all glyph points found   */
+  /*                               in the font.  It is negative.           */
+  /*                                                                       */
+  /*                               This value is invalid in many fonts, as */
+  /*                               it is usually set by the font designer, */
+  /*                               and often reflects only a portion of    */
+  /*                               the glyphs found in the font (maybe     */
+  /*                               ASCII).                                 */
+  /*                                                                       */
+  /*                               You should use the `sTypoDescender'     */
+  /*                               field of the OS/2 table instead if you  */
+  /*                               want the correct one.                   */
+  /*                                                                       */
+  /*    Line_Gap                :: The font's line gap, i.e., the distance */
+  /*                               to add to the ascender and descender to */
+  /*                               get the BTB, i.e., the                  */
+  /*                               baseline-to-baseline distance for the   */
+  /*                               font.                                   */
+  /*                                                                       */
+  /*    advance_Height_Max      :: This field is the maximum of all        */
+  /*                               advance heights found in the font.  It  */
+  /*                               can be used to compute the maximum      */
+  /*                               height of an arbitrary string of text.  */
+  /*                                                                       */
+  /*    min_Top_Side_Bearing    :: The minimum top side bearing of all     */
+  /*                               glyphs within the font.                 */
+  /*                                                                       */
+  /*    min_Bottom_Side_Bearing :: The minimum bottom side bearing of all  */
+  /*                               glyphs within the font.                 */
+  /*                                                                       */
+  /*    yMax_Extent             :: The maximum vertical extent (i.e., the  */
+  /*                               `height' of a glyph's bounding box) for */
+  /*                               all glyphs in the font.                 */
+  /*                                                                       */
+  /*    caret_Slope_Rise        :: The rise coefficient of the cursor's    */
+  /*                               slope of the cursor (slope=rise/run).   */
+  /*                                                                       */
+  /*    caret_Slope_Run         :: The run coefficient of the cursor's     */
+  /*                               slope.                                  */
+  /*                                                                       */
+  /*    caret_Offset            :: The cursor's offset for slanted fonts.  */
+  /*                               This value is `reserved' in vmtx        */
+  /*                               version 1.0.                            */
+  /*                                                                       */
+  /*    Reserved                :: 8~reserved bytes.                       */
+  /*                                                                       */
+  /*    metric_Data_Format      :: Always~0.                               */
+  /*                                                                       */
+  /*    number_Of_HMetrics      :: Number of VMetrics entries in the       */
+  /*                               `vmtx' table -- this value can be       */
+  /*                               smaller than the total number of glyphs */
+  /*                               in the font.                            */
+  /*                                                                       */
+  /*    long_metrics           :: A pointer into the `vmtx' table.         */
+  /*                                                                       */
+  /*    short_metrics          :: A pointer into the `vmtx' table.         */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should   */
+  /*               be identical except for the names of their fields which */
+  /*               are different.                                          */
+  /*                                                                       */
+  /*               This ensures that a single function in the `ttload'     */
+  /*               module is able to read both the horizontal and vertical */
+  /*               headers.                                                */
+  /*                                                                       */
+  typedef struct  TT_VertHeader_
+  {
+    FT_Fixed   Version;
+    FT_Short   Ascender;
+    FT_Short   Descender;
+    FT_Short   Line_Gap;
+
+    FT_UShort  advance_Height_Max;      /* advance height maximum */
+
+    FT_Short   min_Top_Side_Bearing;    /* minimum left-sb or top-sb       */
+    FT_Short   min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb   */
+    FT_Short   yMax_Extent;             /* xmax or ymax extents            */
+    FT_Short   caret_Slope_Rise;
+    FT_Short   caret_Slope_Run;
+    FT_Short   caret_Offset;
+
+    FT_Short   Reserved[4];
+
+    FT_Short   metric_Data_Format;
+    FT_UShort  number_Of_VMetrics;
+
+    /* The following fields are not defined by the TrueType specification */
+    /* but they're used to connect the metrics header to the relevant     */
+    /* `HMTX' or `VMTX' table.                                            */
+
+    void*      long_metrics;
+    void*      short_metrics;
+
+  } TT_VertHeader;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_OS2                                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a TrueType OS/2 table. This is the long  */
+  /*    table version.  All fields comply to the TrueType specification.   */
+  /*                                                                       */
+  /*    Note that we now support old Mac fonts which do not include an     */
+  /*    OS/2 table.  In this case, the `version' field is always set to    */
+  /*    0xFFFF.                                                            */
+  /*                                                                       */
+  typedef struct  TT_OS2_
+  {
+    FT_UShort  version;                /* 0x0001 - more or 0xFFFF */
+    FT_Short   xAvgCharWidth;
+    FT_UShort  usWeightClass;
+    FT_UShort  usWidthClass;
+    FT_Short   fsType;
+    FT_Short   ySubscriptXSize;
+    FT_Short   ySubscriptYSize;
+    FT_Short   ySubscriptXOffset;
+    FT_Short   ySubscriptYOffset;
+    FT_Short   ySuperscriptXSize;
+    FT_Short   ySuperscriptYSize;
+    FT_Short   ySuperscriptXOffset;
+    FT_Short   ySuperscriptYOffset;
+    FT_Short   yStrikeoutSize;
+    FT_Short   yStrikeoutPosition;
+    FT_Short   sFamilyClass;
+
+    FT_Byte    panose[10];
+
+    FT_ULong   ulUnicodeRange1;        /* Bits 0-31   */
+    FT_ULong   ulUnicodeRange2;        /* Bits 32-63  */
+    FT_ULong   ulUnicodeRange3;        /* Bits 64-95  */
+    FT_ULong   ulUnicodeRange4;        /* Bits 96-127 */
+
+    FT_Char    achVendID[4];
+
+    FT_UShort  fsSelection;
+    FT_UShort  usFirstCharIndex;
+    FT_UShort  usLastCharIndex;
+    FT_Short   sTypoAscender;
+    FT_Short   sTypoDescender;
+    FT_Short   sTypoLineGap;
+    FT_UShort  usWinAscent;
+    FT_UShort  usWinDescent;
+
+    /* only version 1 tables: */
+
+    FT_ULong   ulCodePageRange1;       /* Bits 0-31   */
+    FT_ULong   ulCodePageRange2;       /* Bits 32-63  */
+
+    /* only version 2 tables: */
+
+    FT_Short   sxHeight;
+    FT_Short   sCapHeight;
+    FT_UShort  usDefaultChar;
+    FT_UShort  usBreakChar;
+    FT_UShort  usMaxContext;
+
+  } TT_OS2;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_Postscript                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a TrueType PostScript table.  All fields */
+  /*    comply to the TrueType specification.  This structure does not     */
+  /*    reference the PostScript glyph names, which can be nevertheless    */
+  /*    accessed with the `ttpost' module.                                 */
+  /*                                                                       */
+  typedef struct  TT_Postscript_
+  {
+    FT_Fixed  FormatType;
+    FT_Fixed  italicAngle;
+    FT_Short  underlinePosition;
+    FT_Short  underlineThickness;
+    FT_ULong  isFixedPitch;
+    FT_ULong  minMemType42;
+    FT_ULong  maxMemType42;
+    FT_ULong  minMemType1;
+    FT_ULong  maxMemType1;
+
+    /* Glyph names follow in the file, but we don't   */
+    /* load them by default.  See the ttpost.c file.  */
+
+  } TT_Postscript;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_PCLT                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a TrueType PCLT table.  All fields       */
+  /*    comply to the TrueType specification.                              */
+  /*                                                                       */
+  typedef struct  TT_PCLT_
+  {
+    FT_Fixed   Version;
+    FT_ULong   FontNumber;
+    FT_UShort  Pitch;
+    FT_UShort  xHeight;
+    FT_UShort  Style;
+    FT_UShort  TypeFamily;
+    FT_UShort  CapHeight;
+    FT_UShort  SymbolSet;
+    FT_Char    TypeFace[16];
+    FT_Char    CharacterComplement[8];
+    FT_Char    FileName[6];
+    FT_Char    StrokeWeight;
+    FT_Char    WidthType;
+    FT_Byte    SerifStyle;
+    FT_Byte    Reserved;
+
+  } TT_PCLT;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_MaxProfile                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The maximum profile is a table containing many max values which    */
+  /*    can be used to pre-allocate arrays.  This ensures that no memory   */
+  /*    allocation occurs during a glyph load.                             */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    version               :: The version number.                       */
+  /*                                                                       */
+  /*    numGlyphs             :: The number of glyphs in this TrueType     */
+  /*                             font.                                     */
+  /*                                                                       */
+  /*    maxPoints             :: The maximum number of points in a         */
+  /*                             non-composite TrueType glyph.  See also   */
+  /*                             the structure element                     */
+  /*                             `maxCompositePoints'.                     */
+  /*                                                                       */
+  /*    maxContours           :: The maximum number of contours in a       */
+  /*                             non-composite TrueType glyph.  See also   */
+  /*                             the structure element                     */
+  /*                             `maxCompositeContours'.                   */
+  /*                                                                       */
+  /*    maxCompositePoints    :: The maximum number of points in a         */
+  /*                             composite TrueType glyph.  See also the   */
+  /*                             structure element `maxPoints'.            */
+  /*                                                                       */
+  /*    maxCompositeContours  :: The maximum number of contours in a       */
+  /*                             composite TrueType glyph.  See also the   */
+  /*                             structure element `maxContours'.          */
+  /*                                                                       */
+  /*    maxZones              :: The maximum number of zones used for      */
+  /*                             glyph hinting.                            */
+  /*                                                                       */
+  /*    maxTwilightPoints     :: The maximum number of points in the       */
+  /*                             twilight zone used for glyph hinting.     */
+  /*                                                                       */
+  /*    maxStorage            :: The maximum number of elements in the     */
+  /*                             storage area used for glyph hinting.      */
+  /*                                                                       */
+  /*    maxFunctionDefs       :: The maximum number of function            */
+  /*                             definitions in the TrueType bytecode for  */
+  /*                             this font.                                */
+  /*                                                                       */
+  /*    maxInstructionDefs    :: The maximum number of instruction         */
+  /*                             definitions in the TrueType bytecode for  */
+  /*                             this font.                                */
+  /*                                                                       */
+  /*    maxStackElements      :: The maximum number of stack elements used */
+  /*                             during bytecode interpretation.           */
+  /*                                                                       */
+  /*    maxSizeOfInstructions :: The maximum number of TrueType opcodes    */
+  /*                             used for glyph hinting.                   */
+  /*                                                                       */
+  /*    maxComponentElements  :: The maximum number of simple (i.e., non-  */
+  /*                             composite) glyphs in a composite glyph.   */
+  /*                                                                       */
+  /*    maxComponentDepth     :: The maximum nesting depth of composite    */
+  /*                             glyphs.                                   */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This structure is only used during font loading.                   */
+  /*                                                                       */
+  typedef struct  TT_MaxProfile_
+  {
+    FT_Fixed   version;
+    FT_UShort  numGlyphs;
+    FT_UShort  maxPoints;
+    FT_UShort  maxContours;
+    FT_UShort  maxCompositePoints;
+    FT_UShort  maxCompositeContours;
+    FT_UShort  maxZones;
+    FT_UShort  maxTwilightPoints;
+    FT_UShort  maxStorage;
+    FT_UShort  maxFunctionDefs;
+    FT_UShort  maxInstructionDefs;
+    FT_UShort  maxStackElements;
+    FT_UShort  maxSizeOfInstructions;
+    FT_UShort  maxComponentElements;
+    FT_UShort  maxComponentDepth;
+
+  } TT_MaxProfile;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_Sfnt_Tag                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    An enumeration used to specify the index of an SFNT table.         */
+  /*    Used in the @FT_Get_Sfnt_Table API function.                       */
+  /*                                                                       */
+  typedef enum  FT_Sfnt_Tag_
+  {
+    ft_sfnt_head = 0,    /* TT_Header     */
+    ft_sfnt_maxp = 1,    /* TT_MaxProfile */
+    ft_sfnt_os2  = 2,    /* TT_OS2        */
+    ft_sfnt_hhea = 3,    /* TT_HoriHeader */
+    ft_sfnt_vhea = 4,    /* TT_VertHeader */
+    ft_sfnt_post = 5,    /* TT_Postscript */
+    ft_sfnt_pclt = 6,    /* TT_PCLT       */
+
+    sfnt_max   /* internal end mark */
+
+  } FT_Sfnt_Tag;
+
+  /* */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Sfnt_Table                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return a pointer to a given SFNT table within a face.              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the source.                                    */
+  /*                                                                       */
+  /*    tag  :: The index of the SFNT table.                               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A type-less pointer to the table.  This will be~0 in case of       */
+  /*    error, or if the corresponding table was not found *OR* loaded     */
+  /*    from the file.                                                     */
+  /*                                                                       */
+  /*    Use a typecast according to `tag' to access the structure          */
+  /*    elements.                                                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The table is owned by the face object and disappears with it.      */
+  /*                                                                       */
+  /*    This function is only useful to access SFNT tables that are loaded */
+  /*    by the sfnt, truetype, and opentype drivers.  See @FT_Sfnt_Tag for */
+  /*    a list.                                                            */
+  /*                                                                       */
+  FT_EXPORT( void* )
+  FT_Get_Sfnt_Table( FT_Face      face,
+                     FT_Sfnt_Tag  tag );
+
+
+ /**************************************************************************
+  *
+  * @function:
+  *   FT_Load_Sfnt_Table
+  *
+  * @description:
+  *   Load any font table into client memory.
+  *
+  * @input:
+  *   face ::
+  *     A handle to the source face.
+  *
+  *   tag ::
+  *     The four-byte tag of the table to load.  Use the value~0 if you want
+  *     to access the whole font file.  Otherwise, you can use one of the
+  *     definitions found in the @FT_TRUETYPE_TAGS_H file, or forge a new
+  *     one with @FT_MAKE_TAG.
+  *
+  *   offset ::
+  *     The starting offset in the table (or file if tag == 0).
+  *
+  * @output:
+  *   buffer ::
+  *     The target buffer address.  The client must ensure that the memory
+  *     array is big enough to hold the data.
+  *
+  * @inout:
+  *   length ::
+  *     If the `length' parameter is NULL, then try to load the whole table.
+  *     Return an error code if it fails.
+  *
+  *     Else, if `*length' is~0, exit immediately while returning the
+  *     table's (or file) full size in it.
+  *
+  *     Else the number of bytes to read from the table or file, from the
+  *     starting offset.
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   If you need to determine the table's length you should first call this
+  *   function with `*length' set to~0, as in the following example:
+  *
+  *     {
+  *       FT_ULong  length = 0;
+  *
+  *
+  *       error = FT_Load_Sfnt_Table( face, tag, 0, NULL, &length );
+  *       if ( error ) { ... table does not exist ... }
+  *
+  *       buffer = malloc( length );
+  *       if ( buffer == NULL ) { ... not enough memory ... }
+  *
+  *       error = FT_Load_Sfnt_Table( face, tag, 0, buffer, &length );
+  *       if ( error ) { ... could not load table ... }
+  *     }
+  */
+  FT_EXPORT( FT_Error )
+  FT_Load_Sfnt_Table( FT_Face    face,
+                      FT_ULong   tag,
+                      FT_Long    offset,
+                      FT_Byte*   buffer,
+                      FT_ULong*  length );
+
+
+ /**************************************************************************
+  *
+  * @function:
+  *   FT_Sfnt_Table_Info
+  *
+  * @description:
+  *   Return information on an SFNT table.
+  *
+  * @input:
+  *   face ::
+  *     A handle to the source face.
+  *
+  *   table_index ::
+  *     The index of an SFNT table.  The function returns
+  *     FT_Err_Table_Missing for an invalid value.
+  *
+  * @inout:
+  *   tag ::
+  *     The name tag of the SFNT table.  If the value is NULL, `table_index'
+  *     is ignored, and `length' returns the number of SFNT tables in the
+  *     font.
+  *
+  * @output:
+  *   length ::
+  *     The length of the SFNT table (or the number of SFNT tables, depending
+  *     on `tag').
+  *
+  * @return:
+  *   FreeType error code.  0~means success.
+  *
+  * @note:
+  *   SFNT tables with length zero are treated as missing.
+  *
+  */
+  FT_EXPORT( FT_Error )
+  FT_Sfnt_Table_Info( FT_Face    face,
+                      FT_UInt    table_index,
+                      FT_ULong  *tag,
+                      FT_ULong  *length );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_CMap_Language_ID                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return TrueType/sfnt specific cmap language ID.  Definitions of    */
+  /*    language ID values are in `freetype/ttnameid.h'.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    charmap ::                                                         */
+  /*      The target charmap.                                              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The language ID of `charmap'.  If `charmap' doesn't belong to a    */
+  /*    TrueType/sfnt face, just return~0 as the default value.            */
+  /*                                                                       */
+  FT_EXPORT( FT_ULong )
+  FT_Get_CMap_Language_ID( FT_CharMap  charmap );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_CMap_Format                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Return TrueType/sfnt specific cmap format.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    charmap ::                                                         */
+  /*      The target charmap.                                              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The format of `charmap'.  If `charmap' doesn't belong to a         */
+  /*    TrueType/sfnt face, return -1.                                     */
+  /*                                                                       */
+  FT_EXPORT( FT_Long )
+  FT_Get_CMap_Format( FT_CharMap  charmap );
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __TTTABLES_H__ */
+
+
+/* END */
diff --git a/include/freetype/tttags.h b/include/freetype/tttags.h
new file mode 100644 (file)
index 0000000..307ce4b
--- /dev/null
@@ -0,0 +1,107 @@
+/***************************************************************************/
+/*                                                                         */
+/*  tttags.h                                                               */
+/*                                                                         */
+/*    Tags for TrueType and OpenType tables (specification only).          */
+/*                                                                         */
+/*  Copyright 1996-2001, 2004, 2005, 2007, 2008 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTAGS_H__
+#define __TTAGS_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+#define TTAG_avar  FT_MAKE_TAG( 'a', 'v', 'a', 'r' )
+#define TTAG_BASE  FT_MAKE_TAG( 'B', 'A', 'S', 'E' )
+#define TTAG_bdat  FT_MAKE_TAG( 'b', 'd', 'a', 't' )
+#define TTAG_BDF   FT_MAKE_TAG( 'B', 'D', 'F', ' ' )
+#define TTAG_bhed  FT_MAKE_TAG( 'b', 'h', 'e', 'd' )
+#define TTAG_bloc  FT_MAKE_TAG( 'b', 'l', 'o', 'c' )
+#define TTAG_bsln  FT_MAKE_TAG( 'b', 's', 'l', 'n' )
+#define TTAG_CFF   FT_MAKE_TAG( 'C', 'F', 'F', ' ' )
+#define TTAG_CID   FT_MAKE_TAG( 'C', 'I', 'D', ' ' )
+#define TTAG_cmap  FT_MAKE_TAG( 'c', 'm', 'a', 'p' )
+#define TTAG_cvar  FT_MAKE_TAG( 'c', 'v', 'a', 'r' )
+#define TTAG_cvt   FT_MAKE_TAG( 'c', 'v', 't', ' ' )
+#define TTAG_DSIG  FT_MAKE_TAG( 'D', 'S', 'I', 'G' )
+#define TTAG_EBDT  FT_MAKE_TAG( 'E', 'B', 'D', 'T' )
+#define TTAG_EBLC  FT_MAKE_TAG( 'E', 'B', 'L', 'C' )
+#define TTAG_EBSC  FT_MAKE_TAG( 'E', 'B', 'S', 'C' )
+#define TTAG_feat  FT_MAKE_TAG( 'f', 'e', 'a', 't' )
+#define TTAG_FOND  FT_MAKE_TAG( 'F', 'O', 'N', 'D' )
+#define TTAG_fpgm  FT_MAKE_TAG( 'f', 'p', 'g', 'm' )
+#define TTAG_fvar  FT_MAKE_TAG( 'f', 'v', 'a', 'r' )
+#define TTAG_gasp  FT_MAKE_TAG( 'g', 'a', 's', 'p' )
+#define TTAG_GDEF  FT_MAKE_TAG( 'G', 'D', 'E', 'F' )
+#define TTAG_glyf  FT_MAKE_TAG( 'g', 'l', 'y', 'f' )
+#define TTAG_GPOS  FT_MAKE_TAG( 'G', 'P', 'O', 'S' )
+#define TTAG_GSUB  FT_MAKE_TAG( 'G', 'S', 'U', 'B' )
+#define TTAG_gvar  FT_MAKE_TAG( 'g', 'v', 'a', 'r' )
+#define TTAG_hdmx  FT_MAKE_TAG( 'h', 'd', 'm', 'x' )
+#define TTAG_head  FT_MAKE_TAG( 'h', 'e', 'a', 'd' )
+#define TTAG_hhea  FT_MAKE_TAG( 'h', 'h', 'e', 'a' )
+#define TTAG_hmtx  FT_MAKE_TAG( 'h', 'm', 't', 'x' )
+#define TTAG_JSTF  FT_MAKE_TAG( 'J', 'S', 'T', 'F' )
+#define TTAG_just  FT_MAKE_TAG( 'j', 'u', 's', 't' )
+#define TTAG_kern  FT_MAKE_TAG( 'k', 'e', 'r', 'n' )
+#define TTAG_lcar  FT_MAKE_TAG( 'l', 'c', 'a', 'r' )
+#define TTAG_loca  FT_MAKE_TAG( 'l', 'o', 'c', 'a' )
+#define TTAG_LTSH  FT_MAKE_TAG( 'L', 'T', 'S', 'H' )
+#define TTAG_LWFN  FT_MAKE_TAG( 'L', 'W', 'F', 'N' )
+#define TTAG_MATH  FT_MAKE_TAG( 'M', 'A', 'T', 'H' )
+#define TTAG_maxp  FT_MAKE_TAG( 'm', 'a', 'x', 'p' )
+#define TTAG_META  FT_MAKE_TAG( 'M', 'E', 'T', 'A' )
+#define TTAG_MMFX  FT_MAKE_TAG( 'M', 'M', 'F', 'X' )
+#define TTAG_MMSD  FT_MAKE_TAG( 'M', 'M', 'S', 'D' )
+#define TTAG_mort  FT_MAKE_TAG( 'm', 'o', 'r', 't' )
+#define TTAG_morx  FT_MAKE_TAG( 'm', 'o', 'r', 'x' )
+#define TTAG_name  FT_MAKE_TAG( 'n', 'a', 'm', 'e' )
+#define TTAG_opbd  FT_MAKE_TAG( 'o', 'p', 'b', 'd' )
+#define TTAG_OS2   FT_MAKE_TAG( 'O', 'S', '/', '2' )
+#define TTAG_OTTO  FT_MAKE_TAG( 'O', 'T', 'T', 'O' )
+#define TTAG_PCLT  FT_MAKE_TAG( 'P', 'C', 'L', 'T' )
+#define TTAG_POST  FT_MAKE_TAG( 'P', 'O', 'S', 'T' )
+#define TTAG_post  FT_MAKE_TAG( 'p', 'o', 's', 't' )
+#define TTAG_prep  FT_MAKE_TAG( 'p', 'r', 'e', 'p' )
+#define TTAG_prop  FT_MAKE_TAG( 'p', 'r', 'o', 'p' )
+#define TTAG_sfnt  FT_MAKE_TAG( 's', 'f', 'n', 't' )
+#define TTAG_SING  FT_MAKE_TAG( 'S', 'I', 'N', 'G' )
+#define TTAG_trak  FT_MAKE_TAG( 't', 'r', 'a', 'k' )
+#define TTAG_true  FT_MAKE_TAG( 't', 'r', 'u', 'e' )
+#define TTAG_ttc   FT_MAKE_TAG( 't', 't', 'c', ' ' )
+#define TTAG_ttcf  FT_MAKE_TAG( 't', 't', 'c', 'f' )
+#define TTAG_TYP1  FT_MAKE_TAG( 'T', 'Y', 'P', '1' )
+#define TTAG_typ1  FT_MAKE_TAG( 't', 'y', 'p', '1' )
+#define TTAG_VDMX  FT_MAKE_TAG( 'V', 'D', 'M', 'X' )
+#define TTAG_vhea  FT_MAKE_TAG( 'v', 'h', 'e', 'a' )
+#define TTAG_vmtx  FT_MAKE_TAG( 'v', 'm', 't', 'x' )
+
+
+FT_END_HEADER
+
+#endif /* __TTAGS_H__ */
+
+
+/* END */
diff --git a/include/freetype/ttunpat.h b/include/freetype/ttunpat.h
new file mode 100644 (file)
index 0000000..a016275
--- /dev/null
@@ -0,0 +1,59 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttunpat.h                                                              */
+/*                                                                         */
+/*    Definitions for the unpatented TrueType hinting system               */
+/*                                                                         */
+/*  Copyright 2003, 2006 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  Written by Graham Asher <graham.asher@btinternet.com>                  */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTUNPAT_H__
+#define __TTUNPAT_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+ /***************************************************************************
+  *
+  * @constant:
+  *   FT_PARAM_TAG_UNPATENTED_HINTING
+  *
+  * @description:
+  *   A constant used as the tag of an @FT_Parameter structure to indicate
+  *   that unpatented methods only should be used by the TrueType bytecode
+  *   interpreter for a typeface opened by @FT_Open_Face.
+  *
+  */
+#define FT_PARAM_TAG_UNPATENTED_HINTING  FT_MAKE_TAG( 'u', 'n', 'p', 'a' )
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __TTUNPAT_H__ */
+
+
+/* END */
diff --git a/include/ft2build.h b/include/ft2build.h
new file mode 100644 (file)
index 0000000..923d887
--- /dev/null
@@ -0,0 +1,39 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ft2build.h                                                             */
+/*                                                                         */
+/*    FreeType 2 build and setup macros.                                   */
+/*    (Generic version)                                                    */
+/*                                                                         */
+/*  Copyright 1996-2001, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file corresponds to the default `ft2build.h' file for            */
+  /* FreeType 2.  It uses the `freetype' include root.                     */
+  /*                                                                       */
+  /* Note that specific platforms might use a different configuration.     */
+  /* See builds/unix/ft2unix.h for an example.                             */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FT2_BUILD_GENERIC_H__
+#define __FT2_BUILD_GENERIC_H__
+
+#include <freetype/config/ftheader.h>
+
+#endif /* __FT2_BUILD_GENERIC_H__ */
+
+
+/* END */
diff --git a/modules.cfg b/modules.cfg
new file mode 100644 (file)
index 0000000..a85378e
--- /dev/null
@@ -0,0 +1,255 @@
+# modules.cfg
+#
+# Copyright 2005-2007, 2009-2011 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.
+#
+#
+# In case you compile the FreeType library with GNU make or makepp, this
+# file controls which components are built into the library.  Otherwise,
+# please read this file for information on the various modules and its
+# dependencies, then follow the instructions in the file `docs/INSTALL.ANY'.
+#
+# To deactivate a module, simply comment out the corresponding line.  To
+# activate a module, remove the comment character.
+#
+# Note that many modules and components are further controlled with macros
+# in the file `include/freetype/config/ftoption.h'.
+
+
+####
+#### font modules -- at least one is required
+####
+####   The order given here (from top to down) is the order used for testing
+####   font formats in the compiled library.
+####
+
+# TrueType font driver.
+#
+# This driver needs the `sfnt' module.
+FONT_MODULES += truetype
+
+# PostScript Type 1 font driver.
+#
+# This driver needs the `psaux', `pshinter', and `psnames' modules.
+FONT_MODULES += type1
+
+# CFF/OpenType font driver.
+#
+# This driver needs the `sfnt', `pshinter', and `psnames' modules.
+FONT_MODULES += cff
+
+# Type 1 CID-keyed font driver.
+#
+# This driver needs the `psaux', `pshinter', and `psnames' modules.
+FONT_MODULES += cid
+
+# PFR/TrueDoc font driver.  See optional extension ftpfr.c below also.
+FONT_MODULES += pfr
+
+# PostScript Type 42 font driver.
+#
+# This driver needs the `truetype' and `psaux' modules.
+FONT_MODULES += type42
+
+# Windows FONT/FNT font driver.  See optional extension ftwinfnt.c below
+# also.
+FONT_MODULES += winfonts
+
+# PCF font driver.
+FONT_MODULES += pcf
+
+# BDF font driver.  See optional extension ftbdf.c below also.
+FONT_MODULES += bdf
+
+# SFNT files support.  If used without `truetype' or `cff', it supports
+# bitmap-only fonts within an SFNT wrapper.
+#
+# This driver needs the `psnames' module.
+FONT_MODULES += sfnt
+
+
+####
+#### hinting modules
+####
+
+# FreeType's auto hinter.
+HINTING_MODULES += autofit
+
+# PostScript hinter.
+HINTING_MODULES += pshinter
+
+# The TrueType hinting engine doesn't have a module of its own but is
+# controlled in file include/freetype/config/ftoption.h
+# (TT_CONFIG_OPTION_BYTECODE_INTERPRETER and friends).
+
+
+####
+#### raster modules -- at least one is required for vector font formats
+####
+
+# Monochrome rasterizer.
+RASTER_MODULES += raster
+
+# Anti-aliasing rasterizer.
+RASTER_MODULES += smooth
+
+
+####
+#### auxiliary modules
+####
+
+# FreeType's cache sub-system (quite stable but still in beta -- this means
+# that its public API is subject to change if necessary).  See
+# include/freetype/ftcache.h.  Needs ftglyph.c.
+AUX_MODULES += cache
+
+# TrueType GX/AAT table validation.  Needs ftgxval.c below.
+# AUX_MODULES += gxvalid
+
+# Support for streams compressed with gzip (files with suffix .gz).
+#
+# See include/freetype/ftgzip.h for the API.
+AUX_MODULES += gzip
+
+# Support for streams compressed with LZW (files with suffix .Z).
+#
+# See include/freetype/ftlzw.h for the API.
+AUX_MODULES += lzw
+
+# Support for streams compressed with bzip2 (files with suffix .bz2).
+#
+# See include/freetype/ftbzip2.h for the API.
+AUX_MODULES += bzip2
+
+# OpenType table validation.  Needs ftotval.c below.
+#
+# AUX_MODULES += otvalid
+
+# Auxiliary PostScript driver component to share common code.
+#
+# This module depends on `psnames'.
+AUX_MODULES += psaux
+
+# Support for PostScript glyph names.
+#
+# This module can be controlled in ftconfig.h
+# (FT_CONFIG_OPTION_POSTSCRIPT_NAMES).
+AUX_MODULES += psnames
+
+
+####
+#### base module extensions
+####
+
+# Exact bounding box calculation.
+#
+# See include/freetype/ftbbox.h for the API.
+BASE_EXTENSIONS += ftbbox.c
+
+# Access BDF-specific strings.  Needs BDF font driver.
+#
+# See include/freetype/ftbdf.h for the API.
+BASE_EXTENSIONS += ftbdf.c
+
+# Utility functions for converting 1bpp, 2bpp, 4bpp, and 8bpp bitmaps into
+# 8bpp format, and for emboldening of bitmap glyphs.
+#
+# See include/freetype/ftbitmap.h for the API.
+BASE_EXTENSIONS += ftbitmap.c
+
+# Access CID font information.
+#
+# See include/freetype/ftcid.h for the API.
+BASE_EXTENSIONS += ftcid.c
+
+# Access FSType information.  Needs fttype1.c.
+#
+# See include/freetype/freetype.h for the API.
+BASE_EXTENSIONS += ftfstype.c
+
+# Support for GASP table queries.
+#
+# See include/freetype/ftgasp.h for the API.
+BASE_EXTENSIONS += ftgasp.c
+
+# Convenience functions to handle glyphs.  Needs ftbitmap.c.
+#
+# See include/freetype/ftglyph.h for the API.
+BASE_EXTENSIONS += ftglyph.c
+
+# Interface for gxvalid module.
+#
+# See include/freetype/ftgxval.h for the API.
+BASE_EXTENSIONS += ftgxval.c
+
+# Support for LCD color filtering of subpixel bitmaps.
+#
+# See include/freetype/ftlcdfil.h for the API.
+BASE_EXTENSIONS += ftlcdfil.c
+
+# Multiple Master font interface.
+#
+# See include/freetype/ftmm.h for the API.
+BASE_EXTENSIONS += ftmm.c
+
+# Interface for otvalid module.
+#
+# See include/freetype/ftotval.h for the API.
+BASE_EXTENSIONS += ftotval.c
+
+# Support for FT_Face_CheckTrueTypePatents.
+#
+# See include/freetype/freetype.h for the API.
+BASE_EXTENSIONS += ftpatent.c
+
+# Interface for accessing PFR-specific data.  Needs PFR font driver.
+#
+# See include/freetype/ftpfr.h for the API.
+BASE_EXTENSIONS += ftpfr.c
+
+# Path stroker.  Needs ftglyph.c.
+#
+# See include/freetype/ftstroke.h for the API.
+BASE_EXTENSIONS += ftstroke.c
+
+# Support for synthetic embolding and slanting of fonts.  Needs ftbitmap.c.
+#
+# See include/freetype/ftsynth.h for the API.
+BASE_EXTENSIONS += ftsynth.c
+
+# Interface to access data specific to PostScript Type 1 and Type 2 (CFF)
+# fonts.
+#
+# See include/freetype/t1tables.h for the API.
+BASE_EXTENSIONS += fttype1.c
+
+# Interface for accessing data specific to Windows FNT files.  Needs winfnt
+# driver.
+#
+# See include/freetype/ftwinfnt.h for the API.
+BASE_EXTENSIONS += ftwinfnt.c
+
+# Support functions for X11.
+#
+# See include/freetype/ftxf86.h for the API.
+BASE_EXTENSIONS += ftxf86.c
+
+####
+#### The components `ftsystem.c' (for memory allocation and stream I/O
+#### management) and `ftdebug.c' (for emitting debug messages to the user)
+#### are controlled with the following variables.
+####
+####   ftsystem.c:  $(FTSYS_SRC)
+####   ftdebug.c:   $(FTDEBUG_SRC)
+####
+#### Please refer to docs/CUSTOMIZE for details.
+####
+
+
+# EOF
diff --git a/objs/.gitignore b/objs/.gitignore
new file mode 100644 (file)
index 0000000..ad264ce
--- /dev/null
@@ -0,0 +1,9 @@
+apinames
+freetype.def
+freetype.lib
+ftexport.sym
+ftmodule.h
+ftoption.h
+libfreetype.la
+.libs
+*.lo
diff --git a/objs/README b/objs/README
new file mode 100644 (file)
index 0000000..befb63e
--- /dev/null
@@ -0,0 +1,2 @@
+This directory contains all the object files created when building the
+library.
diff --git a/packaging/freetype.manifest b/packaging/freetype.manifest
new file mode 100644 (file)
index 0000000..97e8c31
--- /dev/null
@@ -0,0 +1,5 @@
+<manifest>
+       <request>
+               <domain name="_"/>
+       </request>
+</manifest>
diff --git a/packaging/freetype.spec b/packaging/freetype.spec
new file mode 100644 (file)
index 0000000..675e916
--- /dev/null
@@ -0,0 +1,106 @@
+Name:       freetype
+Summary:    A free and portable font rendering engine
+Version:    2.4.9
+Release:    1
+Group:      System/Libraries
+License:    FTL or GPLv2+
+URL:        http://www.freetype.org
+Source0:    http://download.savannah.gnu.org/releases-noredirect/freetype/freetype-%{version}.tar.gz
+Source1001: packaging/freetype.manifest
+Requires(post): /sbin/ldconfig
+Requires(postun): /sbin/ldconfig
+Provides:   %{name}-bytecode
+
+
+%description
+The FreeType engine is a free and portable font rendering
+engine, developed to provide advanced font support for a variety of
+platforms and environments. FreeType is a library which can open and
+manages font files as well as efficiently load, hint and render
+individual glyphs. FreeType is not a font server or a complete
+text-rendering library.
+
+
+
+%package devel
+Summary:    FreeType development libraries and header files
+Group:      Development/Libraries
+Requires:   %{name} = %{version}-%{release}
+Requires:   zlib-devel
+Requires:   pkgconfig
+
+%description devel
+The freetype-devel package includes the static libraries and header files
+for the FreeType font rendering engine.
+
+Install freetype-devel if you want to develop programs which will use
+FreeType.
+
+
+
+%prep
+%setup -q
+
+%build
+cp %{SOURCE1001} .
+
+%configure --disable-static
+sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' builds/unix/libtool
+sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' builds/unix/libtool
+make %{?_smp_mflags}
+
+%install
+rm -rf %{buildroot}
+
+%makeinstall gnulocaledir=$RPM_BUILD_ROOT%{_datadir}/locale
+
+
+# fix multilib issues
+%ifarch x86_64 s390x ia64 ppc64 alpha sparc64
+%define wordsize 64
+%else
+%define wordsize 32
+%endif
+
+mv $RPM_BUILD_ROOT%{_includedir}/freetype2/freetype/config/ftconfig.h \
+$RPM_BUILD_ROOT%{_includedir}/freetype2/freetype/config/ftconfig-%{wordsize}.h
+cat >$RPM_BUILD_ROOT%{_includedir}/freetype2/freetype/config/ftconfig.h <<EOF
+#ifndef __FTCONFIG_H__MULTILIB
+#define __FTCONFIG_H__MULTILIB
+
+#include <bits/wordsize.h>
+
+#if __WORDSIZE == 32
+# include "ftconfig-32.h"
+#elif __WORDSIZE == 64
+# include "ftconfig-64.h"
+#else
+# error "unexpected value for __WORDSIZE macro"
+#endif
+
+#endif
+EOF
+
+# Don't package static a or .la files
+rm -f $RPM_BUILD_ROOT%{_libdir}/*.{a,la}
+
+
+%post -p /sbin/ldconfig
+
+%postun -p /sbin/ldconfig
+
+%files
+%manifest freetype.manifest
+%defattr(-,root,root,-)
+%{_libdir}/libfreetype.so.*
+
+%files devel
+%defattr(-,root,root,-)
+%dir %{_includedir}/freetype2
+%{_datadir}/aclocal/freetype2.m4
+%{_includedir}/freetype2/*
+%{_includedir}/*.h
+%{_libdir}/libfreetype.so
+%{_bindir}/freetype-config
+%{_libdir}/pkgconfig/*.pc
+
diff --git a/src/Jamfile b/src/Jamfile
new file mode 100644 (file)
index 0000000..76ee0f4
--- /dev/null
@@ -0,0 +1,25 @@
+# FreeType 2 src Jamfile
+#
+# Copyright 2001, 2002 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) ;
+
+# The file <freetype/internal/internal.h> is used to define macros that are
+# later used in #include statements.  It needs to be parsed in order to
+# record these definitions.
+#
+HDRMACRO  [ FT2_SubDir $(FT2_INCLUDE_DIR) internal internal.h ] ;
+
+for xx in $(FT2_COMPONENTS)
+{
+  SubInclude FT2_TOP $(FT2_SRC_DIR) $(xx) ;
+}
+
+# end of src Jamfile
diff --git a/src/autofit/Jamfile b/src/autofit/Jamfile
new file mode 100644 (file)
index 0000000..2714765
--- /dev/null
@@ -0,0 +1,39 @@
+# FreeType 2 src/autofit Jamfile
+#
+# Copyright 2003, 2004, 2005, 2006, 2007, 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.
+
+SubDir FT2_TOP src autofit ;
+
+{
+  local  _sources ;
+
+  # define FT2_AUTOFIT2 to enable experimental latin hinter replacement
+  if $(FT2_AUTOFIT2)
+  {
+    DEFINES += FT_OPTION_AUTOFIT2 ;
+  }
+  if $(FT2_MULTI)
+  {
+    _sources = afangles afglobal afhints aflatin afcjk afindic afloader afmodule afdummy afwarp afpic ;
+
+    if $(FT2_AUTOFIT2)
+    {
+      _sources += aflatin2 ;
+    }
+  }
+  else
+  {
+    _sources = autofit ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/autofit Jamfile
diff --git a/src/autofit/afangles.c b/src/autofit/afangles.c
new file mode 100644 (file)
index 0000000..790af17
--- /dev/null
@@ -0,0 +1,292 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afangles.c                                                             */
+/*                                                                         */
+/*    Routines used to compute vector angles with limited accuracy         */
+/*    and very high speed.  It also contains sorting routines (body).      */
+/*                                                                         */
+/*  Copyright 2003-2006, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "aftypes.h"
+
+
+#if 0
+
+  FT_LOCAL_DEF( FT_Int )
+  af_corner_is_flat( FT_Pos  x_in,
+                     FT_Pos  y_in,
+                     FT_Pos  x_out,
+                     FT_Pos  y_out )
+  {
+    FT_Pos  ax = x_in;
+    FT_Pos  ay = y_in;
+
+    FT_Pos  d_in, d_out, d_corner;
+
+
+    if ( ax < 0 )
+      ax = -ax;
+    if ( ay < 0 )
+      ay = -ay;
+    d_in = ax + ay;
+
+    ax = x_out;
+    if ( ax < 0 )
+      ax = -ax;
+    ay = y_out;
+    if ( ay < 0 )
+      ay = -ay;
+    d_out = ax + ay;
+
+    ax = x_out + x_in;
+    if ( ax < 0 )
+      ax = -ax;
+    ay = y_out + y_in;
+    if ( ay < 0 )
+      ay = -ay;
+    d_corner = ax + ay;
+
+    return ( d_in + d_out - d_corner ) < ( d_corner >> 4 );
+  }
+
+
+  FT_LOCAL_DEF( FT_Int )
+  af_corner_orientation( FT_Pos  x_in,
+                         FT_Pos  y_in,
+                         FT_Pos  x_out,
+                         FT_Pos  y_out )
+  {
+    FT_Pos  delta;
+
+
+    delta = x_in * y_out - y_in * x_out;
+
+    if ( delta == 0 )
+      return 0;
+    else
+      return 1 - 2 * ( delta < 0 );
+  }
+
+#endif /* 0 */
+
+
+  /*
+   *  We are not using `af_angle_atan' anymore, but we keep the source
+   *  code below just in case...
+   */
+
+
+#if 0
+
+
+  /*
+   *  The trick here is to realize that we don't need a very accurate angle
+   *  approximation.  We are going to use the result of `af_angle_atan' to
+   *  only compare the sign of angle differences, or check whether its
+   *  magnitude is very small.
+   *
+   *  The approximation
+   *
+   *    dy * PI / (|dx|+|dy|)
+   *
+   *  should be enough, and much faster to compute.
+   */
+  FT_LOCAL_DEF( AF_Angle )
+  af_angle_atan( FT_Fixed  dx,
+                 FT_Fixed  dy )
+  {
+    AF_Angle  angle;
+    FT_Fixed  ax = dx;
+    FT_Fixed  ay = dy;
+
+
+    if ( ax < 0 )
+      ax = -ax;
+    if ( ay < 0 )
+      ay = -ay;
+
+    ax += ay;
+
+    if ( ax == 0 )
+      angle = 0;
+    else
+    {
+      angle = ( AF_ANGLE_PI2 * dy ) / ( ax + ay );
+      if ( dx < 0 )
+      {
+        if ( angle >= 0 )
+          angle = AF_ANGLE_PI - angle;
+        else
+          angle = -AF_ANGLE_PI - angle;
+      }
+    }
+
+    return angle;
+  }
+
+
+#elif 0
+
+
+  /* the following table has been automatically generated with */
+  /* the `mather.py' Python script                             */
+
+#define AF_ATAN_BITS  8
+
+  static const FT_Byte  af_arctan[1L << AF_ATAN_BITS] =
+  {
+     0,  0,  1,  1,  1,  2,  2,  2,
+     3,  3,  3,  3,  4,  4,  4,  5,
+     5,  5,  6,  6,  6,  7,  7,  7,
+     8,  8,  8,  9,  9,  9, 10, 10,
+    10, 10, 11, 11, 11, 12, 12, 12,
+    13, 13, 13, 14, 14, 14, 14, 15,
+    15, 15, 16, 16, 16, 17, 17, 17,
+    18, 18, 18, 18, 19, 19, 19, 20,
+    20, 20, 21, 21, 21, 21, 22, 22,
+    22, 23, 23, 23, 24, 24, 24, 24,
+    25, 25, 25, 26, 26, 26, 26, 27,
+    27, 27, 28, 28, 28, 28, 29, 29,
+    29, 30, 30, 30, 30, 31, 31, 31,
+    31, 32, 32, 32, 33, 33, 33, 33,
+    34, 34, 34, 34, 35, 35, 35, 35,
+    36, 36, 36, 36, 37, 37, 37, 38,
+    38, 38, 38, 39, 39, 39, 39, 40,
+    40, 40, 40, 41, 41, 41, 41, 42,
+    42, 42, 42, 42, 43, 43, 43, 43,
+    44, 44, 44, 44, 45, 45, 45, 45,
+    46, 46, 46, 46, 46, 47, 47, 47,
+    47, 48, 48, 48, 48, 48, 49, 49,
+    49, 49, 50, 50, 50, 50, 50, 51,
+    51, 51, 51, 51, 52, 52, 52, 52,
+    52, 53, 53, 53, 53, 53, 54, 54,
+    54, 54, 54, 55, 55, 55, 55, 55,
+    56, 56, 56, 56, 56, 57, 57, 57,
+    57, 57, 57, 58, 58, 58, 58, 58,
+    59, 59, 59, 59, 59, 59, 60, 60,
+    60, 60, 60, 61, 61, 61, 61, 61,
+    61, 62, 62, 62, 62, 62, 62, 63,
+    63, 63, 63, 63, 63, 64, 64, 64
+  };
+
+
+  FT_LOCAL_DEF( AF_Angle )
+  af_angle_atan( FT_Fixed  dx,
+                 FT_Fixed  dy )
+  {
+    AF_Angle  angle;
+
+
+    /* check trivial cases */
+    if ( dy == 0 )
+    {
+      angle = 0;
+      if ( dx < 0 )
+        angle = AF_ANGLE_PI;
+      return angle;
+    }
+    else if ( dx == 0 )
+    {
+      angle = AF_ANGLE_PI2;
+      if ( dy < 0 )
+        angle = -AF_ANGLE_PI2;
+      return angle;
+    }
+
+    angle = 0;
+    if ( dx < 0 )
+    {
+      dx = -dx;
+      dy = -dy;
+      angle = AF_ANGLE_PI;
+    }
+
+    if ( dy < 0 )
+    {
+      FT_Pos  tmp;
+
+
+      tmp = dx;
+      dx  = -dy;
+      dy  = tmp;
+      angle -= AF_ANGLE_PI2;
+    }
+
+    if ( dx == 0 && dy == 0 )
+      return 0;
+
+    if ( dx == dy )
+      angle += AF_ANGLE_PI4;
+    else if ( dx > dy )
+      angle += af_arctan[FT_DivFix( dy, dx ) >> ( 16 - AF_ATAN_BITS )];
+    else
+      angle += AF_ANGLE_PI2 -
+               af_arctan[FT_DivFix( dx, dy ) >> ( 16 - AF_ATAN_BITS )];
+
+    if ( angle > AF_ANGLE_PI )
+      angle -= AF_ANGLE_2PI;
+
+    return angle;
+  }
+
+
+#endif /* 0 */
+
+
+  FT_LOCAL_DEF( void )
+  af_sort_pos( FT_UInt  count,
+               FT_Pos*  table )
+  {
+    FT_UInt  i, j;
+    FT_Pos   swap;
+
+
+    for ( i = 1; i < count; i++ )
+    {
+      for ( j = i; j > 0; j-- )
+      {
+        if ( table[j] > table[j - 1] )
+          break;
+
+        swap         = table[j];
+        table[j]     = table[j - 1];
+        table[j - 1] = swap;
+      }
+    }
+  }
+
+
+  FT_LOCAL_DEF( void )
+  af_sort_widths( FT_UInt   count,
+                  AF_Width  table )
+  {
+    FT_UInt      i, j;
+    AF_WidthRec  swap;
+
+
+    for ( i = 1; i < count; i++ )
+    {
+      for ( j = i; j > 0; j-- )
+      {
+        if ( table[j].org > table[j - 1].org )
+          break;
+
+        swap         = table[j];
+        table[j]     = table[j - 1];
+        table[j - 1] = swap;
+      }
+    }
+  }
+
+
+/* END */
diff --git a/src/autofit/afangles.h b/src/autofit/afangles.h
new file mode 100644 (file)
index 0000000..f33f9e1
--- /dev/null
@@ -0,0 +1,7 @@
+/*
+ *  afangles.h
+ *
+ *  This is a dummy file, used to please the build system.  It is never
+ *  included by the auto-fitter sources.
+ *
+ */
diff --git a/src/autofit/afcjk.c b/src/autofit/afcjk.c
new file mode 100644 (file)
index 0000000..8e407c8
--- /dev/null
@@ -0,0 +1,2267 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afcjk.c                                                                */
+/*                                                                         */
+/*    Auto-fitter hinting routines for CJK script (body).                  */
+/*                                                                         */
+/*  Copyright 2006-2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*
+   *  The algorithm is based on akito's autohint patch, available here:
+   *
+   *  http://www.kde.gr.jp/~akito/patch/freetype2/
+   *
+   */
+
+#include <ft2build.h>
+#include FT_ADVANCES_H
+#include FT_INTERNAL_DEBUG_H
+
+#include "aftypes.h"
+#include "aflatin.h"
+
+
+#ifdef AF_CONFIG_OPTION_CJK
+
+#undef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
+
+#include "afcjk.h"
+#include "aferrors.h"
+
+
+#ifdef AF_CONFIG_OPTION_USE_WARPER
+#include "afwarp.h"
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_afcjk
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****              C J K   G L O B A L   M E T R I C S              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* Basically the Latin version with AF_CJKMetrics */
+  /* to replace AF_LatinMetrics.                    */
+
+  FT_LOCAL_DEF( void )
+  af_cjk_metrics_init_widths( AF_CJKMetrics  metrics,
+                              FT_Face        face,
+                              FT_ULong       charcode )
+  {
+    /* scan the array of segments in each direction */
+    AF_GlyphHintsRec  hints[1];
+
+
+    af_glyph_hints_init( hints, face->memory );
+
+    metrics->axis[AF_DIMENSION_HORZ].width_count = 0;
+    metrics->axis[AF_DIMENSION_VERT].width_count = 0;
+
+    {
+      FT_Error          error;
+      FT_UInt           glyph_index;
+      int               dim;
+      AF_CJKMetricsRec  dummy[1];
+      AF_Scaler         scaler = &dummy->root.scaler;
+
+
+      glyph_index = FT_Get_Char_Index( face, charcode );
+      if ( glyph_index == 0 )
+        goto Exit;
+
+      error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
+      if ( error || face->glyph->outline.n_points <= 0 )
+        goto Exit;
+
+      FT_ZERO( dummy );
+
+      dummy->units_per_em = metrics->units_per_em;
+
+      scaler->x_scale = 0x10000L;
+      scaler->y_scale = 0x10000L;
+      scaler->x_delta = 0;
+      scaler->y_delta = 0;
+
+      scaler->face        = face;
+      scaler->render_mode = FT_RENDER_MODE_NORMAL;
+      scaler->flags       = 0;
+
+      af_glyph_hints_rescale( hints, (AF_ScriptMetrics)dummy );
+
+      error = af_glyph_hints_reload( hints, &face->glyph->outline );
+      if ( error )
+        goto Exit;
+
+      for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )
+      {
+        AF_CJKAxis    axis    = &metrics->axis[dim];
+        AF_AxisHints  axhints = &hints->axis[dim];
+        AF_Segment    seg, limit, link;
+        FT_UInt       num_widths = 0;
+
+
+        error = af_latin_hints_compute_segments( hints, (AF_Dimension)dim );
+        if ( error )
+          goto Exit;
+
+        af_latin_hints_link_segments( hints, (AF_Dimension)dim );
+
+        seg   = axhints->segments;
+        limit = seg + axhints->num_segments;
+
+        for ( ; seg < limit; seg++ )
+        {
+          link = seg->link;
+
+          /* we only consider stem segments there! */
+          if ( link && link->link == seg && link > seg )
+          {
+            FT_Pos  dist;
+
+
+            dist = seg->pos - link->pos;
+            if ( dist < 0 )
+              dist = -dist;
+
+            if ( num_widths < AF_CJK_MAX_WIDTHS )
+              axis->widths[num_widths++].org = dist;
+          }
+        }
+
+        af_sort_widths( num_widths, axis->widths );
+        axis->width_count = num_widths;
+      }
+
+    Exit:
+      for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )
+      {
+        AF_CJKAxis  axis = &metrics->axis[dim];
+        FT_Pos      stdw;
+
+
+        stdw = ( axis->width_count > 0 ) ? axis->widths[0].org
+                                         : AF_LATIN_CONSTANT( metrics, 50 );
+
+        /* let's try 20% of the smallest width */
+        axis->edge_distance_threshold = stdw / 5;
+        axis->standard_width          = stdw;
+        axis->extra_light             = 0;
+      }
+    }
+
+    af_glyph_hints_done( hints );
+  }
+
+
+#define AF_CJK_MAX_TEST_CHARACTERS  32
+
+
+  /* Each blue zone has two types of fill and unfill, this is, */
+  /* filling the entire glyph square or not.                   */
+
+  enum
+  {
+    AF_CJK_BLUE_TYPE_FILL,
+    AF_CJK_BLUE_TYPE_UNFILL,
+    AF_CJK_BLUE_TYPE_MAX
+  };
+
+
+  /* Put some common and representative Han Ideographs characters here. */
+  static const FT_ULong af_cjk_hani_blue_chars[AF_CJK_BLUE_MAX]
+                                              [AF_CJK_BLUE_TYPE_MAX]
+                                              [AF_CJK_MAX_TEST_CHARACTERS] =
+  {
+    {
+      {
+        0x4ED6, 0x4EEC, 0x4F60, 0x4F86, 0x5011, 0x5230, 0x548C, 0x5730,
+        0x5BF9, 0x5C0D, 0x5C31, 0x5E2D, 0x6211, 0x65F6, 0x6642, 0x6703,
+        0x6765, 0x70BA, 0x80FD, 0x8230, 0x8AAA, 0x8BF4, 0x8FD9, 0x9019,
+        0x9F4A /* top fill */
+      },
+      {
+        0x519B, 0x540C, 0x5DF2, 0x613F, 0x65E2, 0x661F, 0x662F, 0x666F,
+        0x6C11, 0x7167, 0x73B0, 0x73FE, 0x7406, 0x7528, 0x7F6E, 0x8981,
+        0x8ECD, 0x90A3, 0x914D, 0x91CC, 0x958B, 0x96F7, 0x9732, 0x9762,
+        0x987E /* top unfill */
+      }
+    },
+    {
+      {
+        0x4E2A, 0x4E3A, 0x4EBA, 0x4ED6, 0x4EE5, 0x4EEC, 0x4F60, 0x4F86,
+        0x500B, 0x5011, 0x5230, 0x548C, 0x5927, 0x5BF9, 0x5C0D, 0x5C31,
+        0x6211, 0x65F6, 0x6642, 0x6709, 0x6765, 0x70BA, 0x8981, 0x8AAA,
+        0x8BF4 /* bottom fill */
+      },
+      {
+        0x4E3B, 0x4E9B, 0x56E0, 0x5B83, 0x60F3, 0x610F, 0x7406, 0x751F,
+        0x7576, 0x770B, 0x7740, 0x7F6E, 0x8005, 0x81EA, 0x8457, 0x88E1,
+        0x8FC7, 0x8FD8, 0x8FDB, 0x9032, 0x904E, 0x9053, 0x9084, 0x91CC,
+        0x9762 /* bottom unfill */
+      }
+    },
+#ifndef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT
+      { {0x0000}, {0x0000} },
+      { {0x0000}, {0x0000} }
+#else
+    {
+      {
+        0x4E9B, 0x4EEC, 0x4F60, 0x4F86, 0x5011, 0x5230, 0x548C, 0x5730,
+        0x5979, 0x5C06, 0x5C07, 0x5C31, 0x5E74, 0x5F97, 0x60C5, 0x6700,
+        0x6837, 0x6A23, 0x7406, 0x80FD, 0x8AAA, 0x8BF4, 0x8FD9, 0x9019,
+        0x901A /* left fill */
+      },
+      {
+        0x5373, 0x5417, 0x5427, 0x542C, 0x5462, 0x54C1, 0x54CD, 0x55CE,
+        0x5E08, 0x5E2B, 0x6536, 0x65AD, 0x65B7, 0x660E, 0x773C, 0x9593,
+        0x95F4, 0x9645, 0x9648, 0x9650, 0x9664, 0x9673, 0x968F, 0x969B,
+        0x96A8 /* left unfill */
+      }
+    },
+    {
+      {
+        0x4E8B, 0x524D, 0x5B78, 0x5C06, 0x5C07, 0x60C5, 0x60F3, 0x6216,
+        0x653F, 0x65AF, 0x65B0, 0x6837, 0x6A23, 0x6C11, 0x6C92, 0x6CA1,
+        0x7136, 0x7279, 0x73B0, 0x73FE, 0x7403, 0x7B2C, 0x7D93, 0x8C01,
+        0x8D77 /* right fill */
+      },
+      {
+        0x4F8B, 0x5225, 0x522B, 0x5236, 0x52A8, 0x52D5, 0x5417, 0x55CE,
+        0x589E, 0x6307, 0x660E, 0x671D, 0x671F, 0x6784, 0x7269, 0x786E,
+        0x79CD, 0x8ABF, 0x8C03, 0x8CBB, 0x8D39, 0x90A3, 0x90FD, 0x9593,
+        0x95F4 /* right unfill */
+      }
+    }
+#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */
+  };
+
+
+  /* Calculate blue zones for all the CJK_BLUE_XXX's. */
+
+  static void
+  af_cjk_metrics_init_blues( AF_CJKMetrics   metrics,
+                             FT_Face         face,
+                             const FT_ULong  blue_chars
+                                               [AF_CJK_BLUE_MAX]
+                                               [AF_CJK_BLUE_TYPE_MAX]
+                                               [AF_CJK_MAX_TEST_CHARACTERS] )
+  {
+    FT_Pos        fills[AF_CJK_MAX_TEST_CHARACTERS];
+    FT_Pos        flats[AF_CJK_MAX_TEST_CHARACTERS];
+
+    FT_Int        num_fills;
+    FT_Int        num_flats;
+
+    FT_Int        bb;
+    AF_CJKBlue    blue;
+    FT_Error      error;
+    AF_CJKAxis    axis;
+    FT_GlyphSlot  glyph = face->glyph;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+    FT_String*  cjk_blue_name[AF_CJK_BLUE_MAX] = {
+      (FT_String*)"top",
+      (FT_String*)"bottom",
+      (FT_String*)"left",
+      (FT_String*)"right"
+    };
+    FT_String*  cjk_blue_type_name[AF_CJK_BLUE_TYPE_MAX] = {
+      (FT_String*)"filled",
+      (FT_String*)"unfilled"
+    };
+#endif
+
+
+    /* We compute the blues simply by loading each character from the */
+    /* `blue_chars[blues]' string, then computing its extreme points  */
+    /* (depending blue zone type etc.).                               */
+
+    FT_TRACE5(( "cjk blue zones computation\n" ));
+    FT_TRACE5(( "------------------------------------------------\n" ));
+
+    for ( bb = 0; bb < AF_CJK_BLUE_MAX; bb++ )
+    {
+      FT_Int   fill_type;
+      FT_Pos*  blue_ref;
+      FT_Pos*  blue_shoot;
+
+
+      num_fills = 0;
+      num_flats = 0;
+
+      for ( fill_type = 0; fill_type < AF_CJK_BLUE_TYPE_MAX; fill_type++ )
+      {
+        const FT_ULong*  p     = blue_chars[bb][fill_type];
+        const FT_ULong*  limit = p + AF_CJK_MAX_TEST_CHARACTERS;
+        FT_Bool          fill  = FT_BOOL(
+                                   fill_type == AF_CJK_BLUE_TYPE_FILL );
+
+
+        FT_TRACE5(( "cjk blue %s/%s\n", cjk_blue_name[bb],
+                                        cjk_blue_type_name[fill_type] ));
+
+
+        for ( ; p < limit && *p; p++ )
+        {
+          FT_UInt     glyph_index;
+          FT_Pos      best_pos; /* same as points.y */
+          FT_Int      best_point;
+          FT_Vector*  points;
+
+
+          FT_TRACE5(( "  U+%lX...", *p ));
+
+          /* load the character in the face -- skip unknown or empty ones */
+          glyph_index = FT_Get_Char_Index( face, *p );
+          if ( glyph_index == 0 )
+          {
+            FT_TRACE5(( "unavailable\n" ));
+            continue;
+          }
+
+          error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
+          if ( error || glyph->outline.n_points <= 0 )
+          {
+            FT_TRACE5(( "no outline\n" ));
+            continue;
+          }
+
+          /* now compute min or max point indices and coordinates */
+          points     = glyph->outline.points;
+          best_point = -1;
+          best_pos   = 0;  /* make compiler happy */
+
+          {
+            FT_Int  nn;
+            FT_Int  first = 0;
+            FT_Int  last  = -1;
+
+
+            for ( nn = 0;
+                  nn < glyph->outline.n_contours;
+                  first = last + 1, nn++ )
+            {
+              FT_Int  pp;
+
+
+              last = glyph->outline.contours[nn];
+
+              /* Avoid single-point contours since they are never       */
+              /* rasterized.  In some fonts, they correspond to mark    */
+              /* attachment points which are way outside of the glyph's */
+              /* real outline.                                          */
+              if ( last <= first )
+                continue;
+
+              switch ( bb )
+              {
+              case AF_CJK_BLUE_TOP:
+                for ( pp = first; pp <= last; pp++ )
+                  if ( best_point < 0 || points[pp].y > best_pos )
+                  {
+                    best_point = pp;
+                    best_pos   = points[pp].y;
+                  }
+                break;
+
+              case AF_CJK_BLUE_BOTTOM:
+                for ( pp = first; pp <= last; pp++ )
+                  if ( best_point < 0 || points[pp].y < best_pos )
+                  {
+                    best_point = pp;
+                    best_pos   = points[pp].y;
+                  }
+                break;
+
+              case AF_CJK_BLUE_LEFT:
+                for ( pp = first; pp <= last; pp++ )
+                  if ( best_point < 0 || points[pp].x < best_pos )
+                  {
+                    best_point = pp;
+                    best_pos   = points[pp].x;
+                  }
+                break;
+
+              case AF_CJK_BLUE_RIGHT:
+                for ( pp = first; pp <= last; pp++ )
+                  if ( best_point < 0 || points[pp].x > best_pos )
+                  {
+                    best_point = pp;
+                    best_pos   = points[pp].x;
+                  }
+                break;
+
+              default:
+                ;
+              }
+            }
+            FT_TRACE5(( "best_pos=%5ld\n", best_pos ));
+          }
+
+          if ( fill )
+            fills[num_fills++] = best_pos;
+          else
+            flats[num_flats++] = best_pos;
+        }
+      }
+
+      if ( num_flats == 0 && num_fills == 0 )
+      {
+        /*
+         *  we couldn't find a single glyph to compute this blue zone,
+         *  we will simply ignore it then
+         */
+        FT_TRACE5(( "empty\n" ));
+        continue;
+      }
+
+      /* we have computed the contents of the `fill' and `flats' tables, */
+      /* now determine the reference position of the blue --             */
+      /* we simply take the median value after a simple sort             */
+      af_sort_pos( num_flats, flats );
+      af_sort_pos( num_fills, fills );
+
+      if ( AF_CJK_BLUE_TOP == bb || AF_CJK_BLUE_BOTTOM == bb )
+        axis = &metrics->axis[AF_DIMENSION_VERT];
+      else
+        axis = &metrics->axis[AF_DIMENSION_HORZ];
+
+      blue       = & axis->blues[axis->blue_count];
+      blue_ref   = & blue->ref.org;
+      blue_shoot = & blue->shoot.org;
+
+      axis->blue_count++;
+      if ( num_flats == 0 )
+      {
+        *blue_ref   = fills[num_fills / 2];
+        *blue_shoot = fills[num_fills / 2];
+      }
+      else if ( num_fills == 0 )
+      {
+        *blue_ref   = flats[num_flats / 2];
+        *blue_shoot = flats[num_flats / 2];
+      }
+      else
+      {
+        *blue_ref   = fills[num_fills / 2];
+        *blue_shoot = flats[num_flats / 2];
+      }
+
+      /* make sure blue_ref >= blue_shoot for top/right or */
+      /* vice versa for bottom/left                        */
+      if ( *blue_shoot != *blue_ref )
+      {
+        FT_Pos   ref       = *blue_ref;
+        FT_Pos   shoot     = *blue_shoot;
+        FT_Bool  under_ref = FT_BOOL( shoot < ref );
+
+
+        if ( (AF_CJK_BLUE_TOP == bb || AF_CJK_BLUE_RIGHT == bb) ^ under_ref )
+          *blue_shoot = *blue_ref = ( shoot + ref ) / 2;
+      }
+
+      blue->flags = 0;
+      if ( AF_CJK_BLUE_TOP == bb )
+        blue->flags |= AF_CJK_BLUE_IS_TOP;
+      else if ( AF_CJK_BLUE_RIGHT == bb )
+        blue->flags |= AF_CJK_BLUE_IS_RIGHT;
+
+      FT_TRACE5(( "-- cjk %s bluezone ref = %ld shoot = %ld\n",
+                  cjk_blue_name[bb], *blue_ref, *blue_shoot ));
+    }
+
+    return;
+  }
+
+
+  /* Basically the Latin version with type AF_CJKMetrics for metrics. */
+  FT_LOCAL_DEF( void )
+  af_cjk_metrics_check_digits( AF_CJKMetrics  metrics,
+                               FT_Face        face )
+  {
+    FT_UInt   i;
+    FT_Bool   started = 0, same_width = 1;
+    FT_Fixed  advance, old_advance = 0;
+
+
+    /* check whether all ASCII digits have the same advance width; */
+    /* digit `0' is 0x30 in all supported charmaps                 */
+    for ( i = 0x30; i <= 0x39; i++ )
+    {
+      FT_UInt  glyph_index;
+
+
+      glyph_index = FT_Get_Char_Index( face, i );
+      if ( glyph_index == 0 )
+        continue;
+
+      if ( FT_Get_Advance( face, glyph_index,
+                           FT_LOAD_NO_SCALE         |
+                           FT_LOAD_NO_HINTING       |
+                           FT_LOAD_IGNORE_TRANSFORM,
+                           &advance ) )
+        continue;
+
+      if ( started )
+      {
+        if ( advance != old_advance )
+        {
+          same_width = 0;
+          break;
+        }
+      }
+      else
+      {
+        old_advance = advance;
+        started     = 1;
+      }
+    }
+
+    metrics->root.digits_have_same_width = same_width;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  af_cjk_metrics_init( AF_CJKMetrics  metrics,
+                       FT_Face        face )
+  {
+    FT_CharMap  oldmap = face->charmap;
+
+
+    metrics->units_per_em = face->units_per_EM;
+
+    if ( FT_Select_Charmap( face, FT_ENCODING_UNICODE ) )
+      face->charmap = NULL;
+    else
+    {
+      af_cjk_metrics_init_widths( metrics, face, 0x7530 );
+      af_cjk_metrics_init_blues( metrics, face, af_cjk_hani_blue_chars );
+      af_cjk_metrics_check_digits( metrics, face );
+    }
+
+    FT_Set_Charmap( face, oldmap );
+
+    return AF_Err_Ok;
+  }
+
+
+  static void
+  af_cjk_metrics_scale_dim( AF_CJKMetrics  metrics,
+                            AF_Scaler      scaler,
+                            AF_Dimension   dim )
+  {
+    FT_Fixed    scale;
+    FT_Pos      delta;
+    AF_CJKAxis  axis;
+    FT_UInt     nn;
+
+
+    axis = &metrics->axis[dim];
+
+    if ( dim == AF_DIMENSION_HORZ )
+    {
+      scale = scaler->x_scale;
+      delta = scaler->x_delta;
+    }
+    else
+    {
+      scale = scaler->y_scale;
+      delta = scaler->y_delta;
+    }
+
+    if ( axis->org_scale == scale && axis->org_delta == delta )
+      return;
+
+    axis->org_scale = scale;
+    axis->org_delta = delta;
+
+    axis->scale = scale;
+    axis->delta = delta;
+
+    /* scale the blue zones */
+    for ( nn = 0; nn < axis->blue_count; nn++ )
+    {
+      AF_CJKBlue  blue = &axis->blues[nn];
+      FT_Pos      dist;
+
+
+      blue->ref.cur   = FT_MulFix( blue->ref.org, scale ) + delta;
+      blue->ref.fit   = blue->ref.cur;
+      blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta;
+      blue->shoot.fit = blue->shoot.cur;
+      blue->flags    &= ~AF_CJK_BLUE_ACTIVE;
+
+      /* a blue zone is only active if it is less than 3/4 pixels tall */
+      dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale );
+      if ( dist <= 48 && dist >= -48 )
+      {
+        FT_Pos  delta1, delta2;
+
+
+        blue->ref.fit  = FT_PIX_ROUND( blue->ref.cur );
+
+        /* shoot is under shoot for cjk */
+        delta1 = FT_DivFix( blue->ref.fit, scale ) - blue->shoot.org;
+        delta2 = delta1;
+        if ( delta1 < 0 )
+          delta2 = -delta2;
+
+        delta2 = FT_MulFix( delta2, scale );
+
+        FT_TRACE5(( "delta: %d", delta1 ));
+        if ( delta2 < 32 )
+          delta2 = 0;
+#if 0
+        else if ( delta2 < 64 )
+          delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 );
+#endif
+        else
+          delta2 = FT_PIX_ROUND( delta2 );
+        FT_TRACE5(( "/%d\n", delta2 ));
+
+        if ( delta1 < 0 )
+          delta2 = -delta2;
+
+        blue->shoot.fit = blue->ref.fit - delta2;
+
+        FT_TRACE5(( ">> active cjk blue zone %c%d[%ld/%ld]: "
+                     "ref: cur=%.2f fit=%.2f shoot: cur=%.2f fit=%.2f\n",
+                       ( dim == AF_DIMENSION_HORZ ) ? 'H' : 'V',
+                       nn, blue->ref.org, blue->shoot.org,
+                       blue->ref.cur / 64.0, blue->ref.fit / 64.0,
+                       blue->shoot.cur / 64.0, blue->shoot.fit / 64.0 ));
+
+        blue->flags |= AF_CJK_BLUE_ACTIVE;
+      }
+    }
+  }
+
+
+  FT_LOCAL_DEF( void )
+  af_cjk_metrics_scale( AF_CJKMetrics  metrics,
+                        AF_Scaler      scaler )
+  {
+    metrics->root.scaler = *scaler;
+
+    af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ );
+    af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****              C J K   G L Y P H   A N A L Y S I S              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static FT_Error
+  af_cjk_hints_compute_segments( AF_GlyphHints  hints,
+                                 AF_Dimension   dim )
+  {
+    AF_AxisHints  axis          = &hints->axis[dim];
+    AF_Segment    segments      = axis->segments;
+    AF_Segment    segment_limit = segments + axis->num_segments;
+    FT_Error      error;
+    AF_Segment    seg;
+
+
+    error = af_latin_hints_compute_segments( hints, dim );
+    if ( error )
+      return error;
+
+    /* a segment is round if it doesn't have successive */
+    /* on-curve points.                                 */
+    for ( seg = segments; seg < segment_limit; seg++ )
+    {
+      AF_Point  pt   = seg->first;
+      AF_Point  last = seg->last;
+      AF_Flags  f0   = (AF_Flags)(pt->flags & AF_FLAG_CONTROL);
+      AF_Flags  f1;
+
+
+      seg->flags &= ~AF_EDGE_ROUND;
+
+      for ( ; pt != last; f0 = f1 )
+      {
+        pt = pt->next;
+        f1 = (AF_Flags)(pt->flags & AF_FLAG_CONTROL);
+
+        if ( !f0 && !f1 )
+          break;
+
+        if ( pt == last )
+          seg->flags |= AF_EDGE_ROUND;
+      }
+    }
+
+    return AF_Err_Ok;
+  }
+
+
+  static void
+  af_cjk_hints_link_segments( AF_GlyphHints  hints,
+                              AF_Dimension   dim )
+  {
+    AF_AxisHints  axis          = &hints->axis[dim];
+    AF_Segment    segments      = axis->segments;
+    AF_Segment    segment_limit = segments + axis->num_segments;
+    AF_Direction  major_dir     = axis->major_dir;
+    AF_Segment    seg1, seg2;
+    FT_Pos        len_threshold;
+    FT_Pos        dist_threshold;
+
+
+    len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 );
+
+    dist_threshold = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale
+                                                  : hints->y_scale;
+    dist_threshold = FT_DivFix( 64 * 3, dist_threshold );
+
+    /* now compare each segment to the others */
+    for ( seg1 = segments; seg1 < segment_limit; seg1++ )
+    {
+      /* the fake segments are for metrics hinting only */
+      if ( seg1->first == seg1->last )
+        continue;
+
+      if ( seg1->dir != major_dir )
+        continue;
+
+      for ( seg2 = segments; seg2 < segment_limit; seg2++ )
+        if ( seg2 != seg1 && seg1->dir + seg2->dir == 0 )
+        {
+          FT_Pos  dist = seg2->pos - seg1->pos;
+
+
+          if ( dist < 0 )
+            continue;
+
+          {
+            FT_Pos  min = seg1->min_coord;
+            FT_Pos  max = seg1->max_coord;
+            FT_Pos  len;
+
+
+            if ( min < seg2->min_coord )
+              min = seg2->min_coord;
+
+            if ( max > seg2->max_coord )
+              max = seg2->max_coord;
+
+            len = max - min;
+            if ( len >= len_threshold )
+            {
+              if ( dist * 8 < seg1->score * 9                        &&
+                   ( dist * 8 < seg1->score * 7 || seg1->len < len ) )
+              {
+                seg1->score = dist;
+                seg1->len   = len;
+                seg1->link  = seg2;
+              }
+
+              if ( dist * 8 < seg2->score * 9                        &&
+                   ( dist * 8 < seg2->score * 7 || seg2->len < len ) )
+              {
+                seg2->score = dist;
+                seg2->len   = len;
+                seg2->link  = seg1;
+              }
+            }
+          }
+        }
+    }
+
+    /*
+     *  now compute the `serif' segments
+     *
+     *  In Hanzi, some strokes are wider on one or both of the ends.
+     *  We either identify the stems on the ends as serifs or remove
+     *  the linkage, depending on the length of the stems.
+     *
+     */
+
+    {
+      AF_Segment  link1, link2;
+
+
+      for ( seg1 = segments; seg1 < segment_limit; seg1++ )
+      {
+        link1 = seg1->link;
+        if ( !link1 || link1->link != seg1 || link1->pos <= seg1->pos )
+          continue;
+
+        if ( seg1->score >= dist_threshold )
+          continue;
+
+        for ( seg2 = segments; seg2 < segment_limit; seg2++ )
+        {
+          if ( seg2->pos > seg1->pos || seg1 == seg2 )
+            continue;
+
+          link2 = seg2->link;
+          if ( !link2 || link2->link != seg2 || link2->pos < link1->pos )
+            continue;
+
+          if ( seg1->pos == seg2->pos && link1->pos == link2->pos )
+            continue;
+
+          if ( seg2->score <= seg1->score || seg1->score * 4 <= seg2->score )
+            continue;
+
+          /* seg2 < seg1 < link1 < link2 */
+
+          if ( seg1->len >= seg2->len * 3 )
+          {
+            AF_Segment  seg;
+
+
+            for ( seg = segments; seg < segment_limit; seg++ )
+            {
+              AF_Segment  link = seg->link;
+
+
+              if ( link == seg2 )
+              {
+                seg->link  = 0;
+                seg->serif = link1;
+              }
+              else if ( link == link2 )
+              {
+                seg->link  = 0;
+                seg->serif = seg1;
+              }
+            }
+          }
+          else
+          {
+            seg1->link = link1->link = 0;
+
+            break;
+          }
+        }
+      }
+    }
+
+    for ( seg1 = segments; seg1 < segment_limit; seg1++ )
+    {
+      seg2 = seg1->link;
+
+      if ( seg2 )
+      {
+        seg2->num_linked++;
+        if ( seg2->link != seg1 )
+        {
+          seg1->link = 0;
+
+          if ( seg2->score < dist_threshold || seg1->score < seg2->score * 4 )
+            seg1->serif = seg2->link;
+          else
+            seg2->num_linked--;
+        }
+      }
+    }
+  }
+
+
+  static FT_Error
+  af_cjk_hints_compute_edges( AF_GlyphHints  hints,
+                              AF_Dimension   dim )
+  {
+    AF_AxisHints  axis   = &hints->axis[dim];
+    FT_Error      error  = AF_Err_Ok;
+    FT_Memory     memory = hints->memory;
+    AF_CJKAxis    laxis  = &((AF_CJKMetrics)hints->metrics)->axis[dim];
+
+    AF_Segment    segments      = axis->segments;
+    AF_Segment    segment_limit = segments + axis->num_segments;
+    AF_Segment    seg;
+
+    FT_Fixed      scale;
+    FT_Pos        edge_distance_threshold;
+
+
+    axis->num_edges = 0;
+
+    scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale
+                                         : hints->y_scale;
+
+    /*********************************************************************/
+    /*                                                                   */
+    /* We begin by generating a sorted table of edges for the current    */
+    /* direction.  To do so, we simply scan each segment and try to find */
+    /* an edge in our table that corresponds to its position.            */
+    /*                                                                   */
+    /* If no edge is found, we create and insert a new edge in the       */
+    /* sorted table.  Otherwise, we simply add the segment to the edge's */
+    /* list which is then processed in the second step to compute the    */
+    /* edge's properties.                                                */
+    /*                                                                   */
+    /* Note that the edges table is sorted along the segment/edge        */
+    /* position.                                                         */
+    /*                                                                   */
+    /*********************************************************************/
+
+    edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold,
+                                         scale );
+    if ( edge_distance_threshold > 64 / 4 )
+      edge_distance_threshold = FT_DivFix( 64 / 4, scale );
+    else
+      edge_distance_threshold = laxis->edge_distance_threshold;
+
+    for ( seg = segments; seg < segment_limit; seg++ )
+    {
+      AF_Edge  found = 0;
+      FT_Pos   best  = 0xFFFFU;
+      FT_Int   ee;
+
+
+      /* look for an edge corresponding to the segment */
+      for ( ee = 0; ee < axis->num_edges; ee++ )
+      {
+        AF_Edge  edge = axis->edges + ee;
+        FT_Pos   dist;
+
+
+        if ( edge->dir != seg->dir )
+          continue;
+
+        dist = seg->pos - edge->fpos;
+        if ( dist < 0 )
+          dist = -dist;
+
+        if ( dist < edge_distance_threshold && dist < best )
+        {
+          AF_Segment  link = seg->link;
+
+
+          /* check whether all linked segments of the candidate edge */
+          /* can make a single edge.                                 */
+          if ( link )
+          {
+            AF_Segment  seg1 = edge->first;
+            AF_Segment  link1;
+            FT_Pos      dist2 = 0;
+
+
+            do
+            {
+              link1 = seg1->link;
+              if ( link1 )
+              {
+                dist2 = AF_SEGMENT_DIST( link, link1 );
+                if ( dist2 >= edge_distance_threshold )
+                  break;
+              }
+
+            } while ( ( seg1 = seg1->edge_next ) != edge->first );
+
+            if ( dist2 >= edge_distance_threshold )
+              continue;
+          }
+
+          best  = dist;
+          found = edge;
+        }
+      }
+
+      if ( !found )
+      {
+        AF_Edge  edge;
+
+
+        /* insert a new edge in the list and */
+        /* sort according to the position    */
+        error = af_axis_hints_new_edge( axis, seg->pos,
+                                        (AF_Direction)seg->dir,
+                                        memory, &edge );
+        if ( error )
+          goto Exit;
+
+        /* add the segment to the new edge's list */
+        FT_ZERO( edge );
+
+        edge->first    = seg;
+        edge->last     = seg;
+        edge->fpos     = seg->pos;
+        edge->opos     = edge->pos = FT_MulFix( seg->pos, scale );
+        seg->edge_next = seg;
+        edge->dir      = seg->dir;
+      }
+      else
+      {
+        /* if an edge was found, simply add the segment to the edge's */
+        /* list                                                       */
+        seg->edge_next         = found->first;
+        found->last->edge_next = seg;
+        found->last            = seg;
+      }
+    }
+
+    /*********************************************************************/
+    /*                                                                   */
+    /* Good, we now compute each edge's properties according to segments */
+    /* found on its position.  Basically, these are as follows.          */
+    /*                                                                   */
+    /*  - edge's main direction                                          */
+    /*  - stem edge, serif edge or both (which defaults to stem then)    */
+    /*  - rounded edge, straight or both (which defaults to straight)    */
+    /*  - link for edge                                                  */
+    /*                                                                   */
+    /*********************************************************************/
+
+    /* first of all, set the `edge' field in each segment -- this is     */
+    /* required in order to compute edge links                           */
+    /*                                                                   */
+    /* Note that removing this loop and setting the `edge' field of each */
+    /* segment directly in the code above slows down execution speed for */
+    /* some reasons on platforms like the Sun.                           */
+
+    {
+      AF_Edge  edges      = axis->edges;
+      AF_Edge  edge_limit = edges + axis->num_edges;
+      AF_Edge  edge;
+
+
+      for ( edge = edges; edge < edge_limit; edge++ )
+      {
+        seg = edge->first;
+        if ( seg )
+          do
+          {
+            seg->edge = edge;
+            seg       = seg->edge_next;
+
+          } while ( seg != edge->first );
+      }
+
+      /* now compute each edge properties */
+      for ( edge = edges; edge < edge_limit; edge++ )
+      {
+        FT_Int  is_round    = 0;  /* does it contain round segments?    */
+        FT_Int  is_straight = 0;  /* does it contain straight segments? */
+
+
+        seg = edge->first;
+
+        do
+        {
+          FT_Bool  is_serif;
+
+
+          /* check for roundness of segment */
+          if ( seg->flags & AF_EDGE_ROUND )
+            is_round++;
+          else
+            is_straight++;
+
+          /* check for links -- if seg->serif is set, then seg->link must */
+          /* be ignored                                                   */
+          is_serif = (FT_Bool)( seg->serif && seg->serif->edge != edge );
+
+          if ( seg->link || is_serif )
+          {
+            AF_Edge     edge2;
+            AF_Segment  seg2;
+
+
+            edge2 = edge->link;
+            seg2  = seg->link;
+
+            if ( is_serif )
+            {
+              seg2  = seg->serif;
+              edge2 = edge->serif;
+            }
+
+            if ( edge2 )
+            {
+              FT_Pos  edge_delta;
+              FT_Pos  seg_delta;
+
+
+              edge_delta = edge->fpos - edge2->fpos;
+              if ( edge_delta < 0 )
+                edge_delta = -edge_delta;
+
+              seg_delta = AF_SEGMENT_DIST( seg, seg2 );
+
+              if ( seg_delta < edge_delta )
+                edge2 = seg2->edge;
+            }
+            else
+              edge2 = seg2->edge;
+
+            if ( is_serif )
+            {
+              edge->serif   = edge2;
+              edge2->flags |= AF_EDGE_SERIF;
+            }
+            else
+              edge->link  = edge2;
+          }
+
+          seg = seg->edge_next;
+
+        } while ( seg != edge->first );
+
+        /* set the round/straight flags */
+        edge->flags = AF_EDGE_NORMAL;
+
+        if ( is_round > 0 && is_round >= is_straight )
+          edge->flags |= AF_EDGE_ROUND;
+
+        /* get rid of serifs if link is set                 */
+        /* XXX: This gets rid of many unpleasant artefacts! */
+        /*      Example: the `c' in cour.pfa at size 13     */
+
+        if ( edge->serif && edge->link )
+          edge->serif = 0;
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  af_cjk_hints_detect_features( AF_GlyphHints  hints,
+                                AF_Dimension   dim )
+  {
+    FT_Error  error;
+
+
+    error = af_cjk_hints_compute_segments( hints, dim );
+    if ( !error )
+    {
+      af_cjk_hints_link_segments( hints, dim );
+
+      error = af_cjk_hints_compute_edges( hints, dim );
+    }
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  af_cjk_hints_compute_blue_edges( AF_GlyphHints  hints,
+                                   AF_CJKMetrics  metrics,
+                                   AF_Dimension   dim )
+  {
+    AF_AxisHints  axis       = &hints->axis[dim];
+    AF_Edge       edge       = axis->edges;
+    AF_Edge       edge_limit = edge + axis->num_edges;
+    AF_CJKAxis    cjk        = &metrics->axis[dim];
+    FT_Fixed      scale      = cjk->scale;
+    FT_Pos        best_dist0;  /* initial threshold */
+
+
+    /* compute the initial threshold as a fraction of the EM size */
+    best_dist0 = FT_MulFix( metrics->units_per_em / 40, scale );
+
+    if ( best_dist0 > 64 / 2 ) /* maximum 1/2 pixel */
+      best_dist0 = 64 / 2;
+
+    /* compute which blue zones are active, i.e. have their scaled */
+    /* size < 3/4 pixels                                           */
+
+    /* If the distant between an edge and a blue zone is shorter than */
+    /* best_dist0, set the blue zone for the edge.  Then search for   */
+    /* the blue zone with the smallest best_dist to the edge.         */
+
+    for ( ; edge < edge_limit; edge++ )
+    {
+      FT_UInt   bb;
+      AF_Width  best_blue = NULL;
+      FT_Pos    best_dist = best_dist0;
+
+
+      for ( bb = 0; bb < cjk->blue_count; bb++ )
+      {
+        AF_CJKBlue  blue = cjk->blues + bb;
+        FT_Bool     is_top_right_blue, is_major_dir;
+
+
+        /* skip inactive blue zones (i.e., those that are too small) */
+        if ( !( blue->flags & AF_CJK_BLUE_ACTIVE ) )
+          continue;
+
+        /* if it is a top zone, check for right edges -- if it is a bottom */
+        /* zone, check for left edges                                      */
+        /*                                                                 */
+        /* of course, that's for TrueType                                  */
+        is_top_right_blue  =
+          FT_BOOL( ( ( blue->flags & AF_CJK_BLUE_IS_TOP )   != 0 ) ||
+                   ( ( blue->flags & AF_CJK_BLUE_IS_RIGHT ) != 0 ) );
+        is_major_dir = FT_BOOL( edge->dir == axis->major_dir );
+
+        /* if it is a top zone, the edge must be against the major    */
+        /* direction; if it is a bottom zone, it must be in the major */
+        /* direction                                                  */
+        if ( is_top_right_blue ^ is_major_dir )
+        {
+          FT_Pos    dist;
+          AF_Width  compare;
+
+
+          /* Compare the edge to the closest blue zone type */
+          if ( FT_ABS( edge->fpos - blue->ref.org ) >
+               FT_ABS( edge->fpos - blue->shoot.org ) )
+            compare = &blue->shoot;
+          else
+            compare = &blue->ref;
+
+          dist = edge->fpos - compare->org;
+          if ( dist < 0 )
+            dist = -dist;
+
+          dist = FT_MulFix( dist, scale );
+          if ( dist < best_dist )
+          {
+            best_dist = dist;
+            best_blue = compare;
+          }
+        }
+      }
+
+      if ( best_blue )
+        edge->blue_edge = best_blue;
+    }
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  af_cjk_hints_init( AF_GlyphHints  hints,
+                     AF_CJKMetrics  metrics )
+  {
+    FT_Render_Mode  mode;
+    FT_UInt32       scaler_flags, other_flags;
+
+
+    af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics );
+
+    /*
+     *  correct x_scale and y_scale when needed, since they may have
+     *  been modified af_cjk_scale_dim above
+     */
+    hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale;
+    hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta;
+    hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale;
+    hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta;
+
+    /* compute flags depending on render mode, etc. */
+    mode = metrics->root.scaler.render_mode;
+
+#ifdef AF_CONFIG_OPTION_USE_WARPER
+    if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V )
+      metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL;
+#endif
+
+    scaler_flags = hints->scaler_flags;
+    other_flags  = 0;
+
+    /*
+     *  We snap the width of vertical stems for the monochrome and
+     *  horizontal LCD rendering targets only.
+     */
+    if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD )
+      other_flags |= AF_LATIN_HINTS_HORZ_SNAP;
+
+    /*
+     *  We snap the width of horizontal stems for the monochrome and
+     *  vertical LCD rendering targets only.
+     */
+    if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V )
+      other_flags |= AF_LATIN_HINTS_VERT_SNAP;
+
+    /*
+     *  We adjust stems to full pixels only if we don't use the `light' mode.
+     */
+    if ( mode != FT_RENDER_MODE_LIGHT )
+      other_flags |= AF_LATIN_HINTS_STEM_ADJUST;
+
+    if ( mode == FT_RENDER_MODE_MONO )
+      other_flags |= AF_LATIN_HINTS_MONO;
+
+    scaler_flags |= AF_SCALER_FLAG_NO_ADVANCE;
+
+    hints->scaler_flags = scaler_flags;
+    hints->other_flags  = other_flags;
+
+    return 0;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****          C J K   G L Y P H   G R I D - F I T T I N G          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* snap a given width in scaled coordinates to one of the */
+  /* current standard widths                                */
+
+  static FT_Pos
+  af_cjk_snap_width( AF_Width  widths,
+                     FT_Int    count,
+                     FT_Pos    width )
+  {
+    int     n;
+    FT_Pos  best      = 64 + 32 + 2;
+    FT_Pos  reference = width;
+    FT_Pos  scaled;
+
+
+    for ( n = 0; n < count; n++ )
+    {
+      FT_Pos  w;
+      FT_Pos  dist;
+
+
+      w = widths[n].cur;
+      dist = width - w;
+      if ( dist < 0 )
+        dist = -dist;
+      if ( dist < best )
+      {
+        best      = dist;
+        reference = w;
+      }
+    }
+
+    scaled = FT_PIX_ROUND( reference );
+
+    if ( width >= reference )
+    {
+      if ( width < scaled + 48 )
+        width = reference;
+    }
+    else
+    {
+      if ( width > scaled - 48 )
+        width = reference;
+    }
+
+    return width;
+  }
+
+
+  /* compute the snapped width of a given stem */
+
+  static FT_Pos
+  af_cjk_compute_stem_width( AF_GlyphHints  hints,
+                             AF_Dimension   dim,
+                             FT_Pos         width,
+                             AF_Edge_Flags  base_flags,
+                             AF_Edge_Flags  stem_flags )
+  {
+    AF_CJKMetrics  metrics  = (AF_CJKMetrics) hints->metrics;
+    AF_CJKAxis     axis     = & metrics->axis[dim];
+    FT_Pos         dist     = width;
+    FT_Int         sign     = 0;
+    FT_Bool        vertical = FT_BOOL( dim == AF_DIMENSION_VERT );
+
+    FT_UNUSED( base_flags );
+    FT_UNUSED( stem_flags );
+
+
+    if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) )
+      return width;
+
+    if ( dist < 0 )
+    {
+      dist = -width;
+      sign = 1;
+    }
+
+    if ( (  vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ||
+         ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) )
+    {
+      /* smooth hinting process: very lightly quantize the stem width */
+
+      if ( axis->width_count > 0 )
+      {
+        if ( FT_ABS( dist - axis->widths[0].cur ) < 40 )
+        {
+          dist = axis->widths[0].cur;
+          if ( dist < 48 )
+            dist = 48;
+
+          goto Done_Width;
+        }
+      }
+
+      if ( dist < 54 )
+        dist += ( 54 - dist ) / 2 ;
+      else if ( dist < 3 * 64 )
+      {
+        FT_Pos  delta;
+
+
+        delta  = dist & 63;
+        dist  &= -64;
+
+        if ( delta < 10 )
+          dist += delta;
+        else if ( delta < 22 )
+          dist += 10;
+        else if ( delta < 42 )
+          dist += delta;
+        else if ( delta < 54 )
+          dist += 54;
+        else
+          dist += delta;
+      }
+    }
+    else
+    {
+      /* strong hinting process: snap the stem width to integer pixels */
+
+      dist = af_cjk_snap_width( axis->widths, axis->width_count, dist );
+
+      if ( vertical )
+      {
+        /* in the case of vertical hinting, always round */
+        /* the stem heights to integer pixels            */
+
+        if ( dist >= 64 )
+          dist = ( dist + 16 ) & ~63;
+        else
+          dist = 64;
+      }
+      else
+      {
+        if ( AF_LATIN_HINTS_DO_MONO( hints ) )
+        {
+          /* monochrome horizontal hinting: snap widths to integer pixels */
+          /* with a different threshold                                   */
+
+          if ( dist < 64 )
+            dist = 64;
+          else
+            dist = ( dist + 32 ) & ~63;
+        }
+        else
+        {
+          /* for horizontal anti-aliased hinting, we adopt a more subtle */
+          /* approach: we strengthen small stems, round stems whose size */
+          /* is between 1 and 2 pixels to an integer, otherwise nothing  */
+
+          if ( dist < 48 )
+            dist = ( dist + 64 ) >> 1;
+
+          else if ( dist < 128 )
+            dist = ( dist + 22 ) & ~63;
+          else
+            /* round otherwise to prevent color fringes in LCD mode */
+            dist = ( dist + 32 ) & ~63;
+        }
+      }
+    }
+
+  Done_Width:
+    if ( sign )
+      dist = -dist;
+
+    return dist;
+  }
+
+
+  /* align one stem edge relative to the previous stem edge */
+
+  static void
+  af_cjk_align_linked_edge( AF_GlyphHints  hints,
+                            AF_Dimension   dim,
+                            AF_Edge        base_edge,
+                            AF_Edge        stem_edge )
+  {
+    FT_Pos  dist = stem_edge->opos - base_edge->opos;
+
+    FT_Pos  fitted_width = af_cjk_compute_stem_width(
+                             hints, dim, dist,
+                             (AF_Edge_Flags)base_edge->flags,
+                             (AF_Edge_Flags)stem_edge->flags );
+
+
+    stem_edge->pos = base_edge->pos + fitted_width;
+  }
+
+
+  static void
+  af_cjk_align_serif_edge( AF_GlyphHints  hints,
+                           AF_Edge        base,
+                           AF_Edge        serif )
+  {
+    FT_UNUSED( hints );
+
+    serif->pos = base->pos + ( serif->opos - base->opos );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                    E D G E   H I N T I N G                      ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#define AF_LIGHT_MODE_MAX_HORZ_GAP    9
+#define AF_LIGHT_MODE_MAX_VERT_GAP   15
+#define AF_LIGHT_MODE_MAX_DELTA_ABS  14
+
+
+  static FT_Pos
+  af_hint_normal_stem( AF_GlyphHints  hints,
+                       AF_Edge        edge,
+                       AF_Edge        edge2,
+                       FT_Pos         anchor,
+                       AF_Dimension   dim )
+  {
+    FT_Pos  org_len, cur_len, org_center;
+    FT_Pos  cur_pos1, cur_pos2;
+    FT_Pos  d_off1, u_off1, d_off2, u_off2, delta;
+    FT_Pos  offset;
+    FT_Pos  threshold = 64;
+
+
+    if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) )
+    {
+      if ( ( edge->flags  & AF_EDGE_ROUND ) &&
+           ( edge2->flags & AF_EDGE_ROUND ) )
+      {
+        if ( dim == AF_DIMENSION_VERT )
+          threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP;
+        else
+          threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP;
+      }
+      else
+      {
+        if ( dim == AF_DIMENSION_VERT )
+          threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP / 3;
+        else
+          threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP / 3;
+      }
+    }
+
+    org_len    = edge2->opos - edge->opos;
+    cur_len    = af_cjk_compute_stem_width( hints, dim, org_len,
+                                            (AF_Edge_Flags)edge->flags,
+                                            (AF_Edge_Flags)edge2->flags );
+
+    org_center = ( edge->opos + edge2->opos ) / 2 + anchor;
+    cur_pos1   = org_center - cur_len / 2;
+    cur_pos2   = cur_pos1 + cur_len;
+    d_off1     = cur_pos1 - FT_PIX_FLOOR( cur_pos1 );
+    d_off2     = cur_pos2 - FT_PIX_FLOOR( cur_pos2 );
+    u_off1     = 64 - d_off1;
+    u_off2     = 64 - d_off2;
+    delta      = 0;
+
+
+    if ( d_off1 == 0 || d_off2 == 0 )
+      goto Exit;
+
+    if ( cur_len <= threshold )
+    {
+      if ( d_off2 < cur_len )
+      {
+        if ( u_off1 <= d_off2 )
+          delta =  u_off1;
+        else
+          delta = -d_off2;
+      }
+
+      goto Exit;
+    }
+
+    if ( threshold < 64 )
+    {
+      if ( d_off1 >= threshold || u_off1 >= threshold ||
+           d_off2 >= threshold || u_off2 >= threshold )
+        goto Exit;
+    }
+
+    offset = cur_len & 63;
+
+    if ( offset < 32 )
+    {
+      if ( u_off1 <= offset || d_off2 <= offset )
+        goto Exit;
+    }
+    else
+      offset = 64 - threshold;
+
+    d_off1 = threshold - u_off1;
+    u_off1 = u_off1    - offset;
+    u_off2 = threshold - d_off2;
+    d_off2 = d_off2    - offset;
+
+    if ( d_off1 <= u_off1 )
+      u_off1 = -d_off1;
+
+    if ( d_off2 <= u_off2 )
+      u_off2 = -d_off2;
+
+    if ( FT_ABS( u_off1 ) <= FT_ABS( u_off2 ) )
+      delta = u_off1;
+    else
+      delta = u_off2;
+
+  Exit:
+
+#if 1
+    if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) )
+    {
+      if ( delta > AF_LIGHT_MODE_MAX_DELTA_ABS )
+        delta = AF_LIGHT_MODE_MAX_DELTA_ABS;
+      else if ( delta < -AF_LIGHT_MODE_MAX_DELTA_ABS )
+        delta = -AF_LIGHT_MODE_MAX_DELTA_ABS;
+    }
+#endif
+
+    cur_pos1 += delta;
+
+    if ( edge->opos < edge2->opos )
+    {
+      edge->pos  = cur_pos1;
+      edge2->pos = cur_pos1 + cur_len;
+    }
+    else
+    {
+      edge->pos  = cur_pos1 + cur_len;
+      edge2->pos = cur_pos1;
+    }
+
+    return delta;
+  }
+
+
+  static void
+  af_cjk_hint_edges( AF_GlyphHints  hints,
+                     AF_Dimension   dim )
+  {
+    AF_AxisHints  axis       = &hints->axis[dim];
+    AF_Edge       edges      = axis->edges;
+    AF_Edge       edge_limit = edges + axis->num_edges;
+    FT_PtrDist    n_edges;
+    AF_Edge       edge;
+    AF_Edge       anchor   = 0;
+    FT_Pos        delta    = 0;
+    FT_Int        skipped  = 0;
+    FT_Bool       has_last_stem = FALSE;
+    FT_Pos        last_stem_pos = 0;
+
+
+    /* we begin by aligning all stems relative to the blue zone */
+    FT_TRACE5(( "==== cjk hinting %s edges =====\n",
+          dim == AF_DIMENSION_HORZ ? "vertical" : "horizontal" ));
+
+    if ( AF_HINTS_DO_BLUES( hints ) )
+    {
+      for ( edge = edges; edge < edge_limit; edge++ )
+      {
+        AF_Width  blue;
+        AF_Edge   edge1, edge2;
+
+
+        if ( edge->flags & AF_EDGE_DONE )
+          continue;
+
+        blue  = edge->blue_edge;
+        edge1 = NULL;
+        edge2 = edge->link;
+
+        if ( blue )
+        {
+          edge1 = edge;
+        }
+        else if ( edge2 && edge2->blue_edge )
+        {
+          blue  = edge2->blue_edge;
+          edge1 = edge2;
+          edge2 = edge;
+        }
+
+        if ( !edge1 )
+          continue;
+
+        FT_TRACE5(( "CJKBLUE: edge %d @%d (opos=%.2f) snapped to (%.2f), "
+                 "was (%.2f)\n",
+                 edge1-edges, edge1->fpos, edge1->opos / 64.0, blue->fit / 64.0,
+                 edge1->pos / 64.0 ));
+
+        edge1->pos    = blue->fit;
+        edge1->flags |= AF_EDGE_DONE;
+
+        if ( edge2 && !edge2->blue_edge )
+        {
+          af_cjk_align_linked_edge( hints, dim, edge1, edge2 );
+          edge2->flags |= AF_EDGE_DONE;
+        }
+
+        if ( !anchor )
+          anchor = edge;
+      }
+    }
+
+    /* now we align all stem edges. */
+    for ( edge = edges; edge < edge_limit; edge++ )
+    {
+      AF_Edge  edge2;
+
+
+      if ( edge->flags & AF_EDGE_DONE )
+        continue;
+
+      /* skip all non-stem edges */
+      edge2 = edge->link;
+      if ( !edge2 )
+      {
+        skipped++;
+        continue;
+      }
+
+      /* Some CJK characters have so many stems that
+       * the hinter is likely to merge two adjacent ones.
+       * To solve this problem, if either edge of a stem
+       * is too close to the previous one, we avoid
+       * aligning the two edges, but rather interpolate
+       * their locations at the end of this function in
+       * order to preserve the space between the stems.
+       */
+      if ( has_last_stem                       &&
+           ( edge->pos  < last_stem_pos + 64 ||
+             edge2->pos < last_stem_pos + 64 ) )
+      {
+        skipped++;
+        continue;
+      }
+
+      /* now align the stem */
+      /* this should not happen, but it's better to be safe */
+      if ( edge2->blue_edge )
+      {
+        FT_TRACE5(( "ASSERTION FAILED for edge %d\n", edge2-edges ));
+
+        af_cjk_align_linked_edge( hints, dim, edge2, edge );
+        edge->flags |= AF_EDGE_DONE;
+        continue;
+      }
+
+      if ( edge2 < edge )
+      {
+        af_cjk_align_linked_edge( hints, dim, edge2, edge );
+        edge->flags |= AF_EDGE_DONE;
+        /* We rarely reaches here it seems;
+         * usually the two edges belonging
+         * to one stem are marked as DONE together
+         */
+        has_last_stem = TRUE;
+        last_stem_pos = edge->pos;
+        continue;
+      }
+
+      if ( dim != AF_DIMENSION_VERT && !anchor )
+      {
+
+#if 0
+        if ( fixedpitch )
+        {
+          AF_Edge     left  = edge;
+          AF_Edge     right = edge_limit - 1;
+          AF_EdgeRec  left1, left2, right1, right2;
+          FT_Pos      target, center1, center2;
+          FT_Pos      delta1, delta2, d1, d2;
+
+
+          while ( right > left && !right->link )
+            right--;
+
+          left1  = *left;
+          left2  = *left->link;
+          right1 = *right->link;
+          right2 = *right;
+
+          delta  = ( ( ( hinter->pp2.x + 32 ) & -64 ) - hinter->pp2.x ) / 2;
+          target = left->opos + ( right->opos - left->opos ) / 2 + delta - 16;
+
+          delta1  = delta;
+          delta1 += af_hint_normal_stem( hints, left, left->link,
+                                         delta1, 0 );
+
+          if ( left->link != right )
+            af_hint_normal_stem( hints, right->link, right, delta1, 0 );
+
+          center1 = left->pos + ( right->pos - left->pos ) / 2;
+
+          if ( center1 >= target )
+            delta2 = delta - 32;
+          else
+            delta2 = delta + 32;
+
+          delta2 += af_hint_normal_stem( hints, &left1, &left2, delta2, 0 );
+
+          if ( delta1 != delta2 )
+          {
+            if ( left->link != right )
+              af_hint_normal_stem( hints, &right1, &right2, delta2, 0 );
+
+            center2 = left1.pos + ( right2.pos - left1.pos ) / 2;
+
+            d1 = center1 - target;
+            d2 = center2 - target;
+
+            if ( FT_ABS( d2 ) < FT_ABS( d1 ) )
+            {
+              left->pos       = left1.pos;
+              left->link->pos = left2.pos;
+
+              if ( left->link != right )
+              {
+                right->link->pos = right1.pos;
+                right->pos       = right2.pos;
+              }
+
+              delta1 = delta2;
+            }
+          }
+
+          delta               = delta1;
+          right->link->flags |= AF_EDGE_DONE;
+          right->flags       |= AF_EDGE_DONE;
+        }
+        else
+
+#endif /* 0 */
+
+          delta = af_hint_normal_stem( hints, edge, edge2, 0,
+                                       AF_DIMENSION_HORZ );
+      }
+      else
+        af_hint_normal_stem( hints, edge, edge2, delta, dim );
+
+#if 0
+      printf( "stem (%d,%d) adjusted (%.1f,%.1f)\n",
+               edge - edges, edge2 - edges,
+               ( edge->pos - edge->opos ) / 64.0,
+               ( edge2->pos - edge2->opos ) / 64.0 );
+#endif
+
+      anchor = edge;
+      edge->flags  |= AF_EDGE_DONE;
+      edge2->flags |= AF_EDGE_DONE;
+      has_last_stem = TRUE;
+      last_stem_pos = edge2->pos;
+    }
+
+    /* make sure that lowercase m's maintain their symmetry */
+
+    /* In general, lowercase m's have six vertical edges if they are sans */
+    /* serif, or twelve if they are with serifs.  This implementation is  */
+    /* based on that assumption, and seems to work very well with most    */
+    /* faces.  However, if for a certain face this assumption is not      */
+    /* true, the m is just rendered like before.  In addition, any stem   */
+    /* correction will only be applied to symmetrical glyphs (even if the */
+    /* glyph is not an m), so the potential for unwanted distortion is    */
+    /* relatively low.                                                    */
+
+    /* We don't handle horizontal edges since we can't easily assure that */
+    /* the third (lowest) stem aligns with the base line; it might end up */
+    /* one pixel higher or lower.                                         */
+
+    n_edges = edge_limit - edges;
+    if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) )
+    {
+      AF_Edge  edge1, edge2, edge3;
+      FT_Pos   dist1, dist2, span;
+
+
+      if ( n_edges == 6 )
+      {
+        edge1 = edges;
+        edge2 = edges + 2;
+        edge3 = edges + 4;
+      }
+      else
+      {
+        edge1 = edges + 1;
+        edge2 = edges + 5;
+        edge3 = edges + 9;
+      }
+
+      dist1 = edge2->opos - edge1->opos;
+      dist2 = edge3->opos - edge2->opos;
+
+      span = dist1 - dist2;
+      if ( span < 0 )
+        span = -span;
+
+      if ( edge1->link == edge1 + 1 &&
+           edge2->link == edge2 + 1 &&
+           edge3->link == edge3 + 1 && span < 8 )
+      {
+        delta = edge3->pos - ( 2 * edge2->pos - edge1->pos );
+        edge3->pos -= delta;
+        if ( edge3->link )
+          edge3->link->pos -= delta;
+
+        /* move the serifs along with the stem */
+        if ( n_edges == 12 )
+        {
+          ( edges + 8 )->pos -= delta;
+          ( edges + 11 )->pos -= delta;
+        }
+
+        edge3->flags |= AF_EDGE_DONE;
+        if ( edge3->link )
+          edge3->link->flags |= AF_EDGE_DONE;
+      }
+    }
+
+    if ( !skipped )
+      return;
+
+    /*
+     *  now hint the remaining edges (serifs and single) in order
+     *  to complete our processing
+     */
+    for ( edge = edges; edge < edge_limit; edge++ )
+    {
+      if ( edge->flags & AF_EDGE_DONE )
+        continue;
+
+      if ( edge->serif )
+      {
+        af_cjk_align_serif_edge( hints, edge->serif, edge );
+        edge->flags |= AF_EDGE_DONE;
+        skipped--;
+      }
+    }
+
+    if ( !skipped )
+      return;
+
+    for ( edge = edges; edge < edge_limit; edge++ )
+    {
+      AF_Edge  before, after;
+
+
+      if ( edge->flags & AF_EDGE_DONE )
+        continue;
+
+      before = after = edge;
+
+      while ( --before >= edges )
+        if ( before->flags & AF_EDGE_DONE )
+          break;
+
+      while ( ++after < edge_limit )
+        if ( after->flags & AF_EDGE_DONE )
+          break;
+
+      if ( before >= edges || after < edge_limit )
+      {
+        if ( before < edges )
+          af_cjk_align_serif_edge( hints, after, edge );
+        else if ( after >= edge_limit )
+          af_cjk_align_serif_edge( hints, before, edge );
+        else
+        {
+          if ( after->fpos == before->fpos )
+            edge->pos = before->pos;
+          else
+            edge->pos = before->pos +
+                        FT_MulDiv( edge->fpos - before->fpos,
+                                   after->pos - before->pos,
+                                   after->fpos - before->fpos );
+        }
+      }
+    }
+  }
+
+
+  static void
+  af_cjk_align_edge_points( AF_GlyphHints  hints,
+                            AF_Dimension   dim )
+  {
+    AF_AxisHints  axis       = & hints->axis[dim];
+    AF_Edge       edges      = axis->edges;
+    AF_Edge       edge_limit = edges + axis->num_edges;
+    AF_Edge       edge;
+    FT_Bool       snapping;
+
+
+    snapping = FT_BOOL( ( dim == AF_DIMENSION_HORZ             &&
+                          AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) )  ||
+                        ( dim == AF_DIMENSION_VERT             &&
+                          AF_LATIN_HINTS_DO_VERT_SNAP( hints ) )  );
+
+    for ( edge = edges; edge < edge_limit; edge++ )
+    {
+      /* move the points of each segment     */
+      /* in each edge to the edge's position */
+      AF_Segment  seg = edge->first;
+
+
+      if ( snapping )
+      {
+        do
+        {
+          AF_Point  point = seg->first;
+
+
+          for (;;)
+          {
+            if ( dim == AF_DIMENSION_HORZ )
+            {
+              point->x      = edge->pos;
+              point->flags |= AF_FLAG_TOUCH_X;
+            }
+            else
+            {
+              point->y      = edge->pos;
+              point->flags |= AF_FLAG_TOUCH_Y;
+            }
+
+            if ( point == seg->last )
+              break;
+
+            point = point->next;
+          }
+
+          seg = seg->edge_next;
+
+        } while ( seg != edge->first );
+      }
+      else
+      {
+        FT_Pos  delta = edge->pos - edge->opos;
+
+
+        do
+        {
+          AF_Point  point = seg->first;
+
+
+          for (;;)
+          {
+            if ( dim == AF_DIMENSION_HORZ )
+            {
+              point->x     += delta;
+              point->flags |= AF_FLAG_TOUCH_X;
+            }
+            else
+            {
+              point->y     += delta;
+              point->flags |= AF_FLAG_TOUCH_Y;
+            }
+
+            if ( point == seg->last )
+              break;
+
+            point = point->next;
+          }
+
+          seg = seg->edge_next;
+
+        } while ( seg != edge->first );
+      }
+    }
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  af_cjk_hints_apply( AF_GlyphHints  hints,
+                      FT_Outline*    outline,
+                      AF_CJKMetrics  metrics )
+  {
+    FT_Error  error;
+    int       dim;
+
+    FT_UNUSED( metrics );
+
+
+    error = af_glyph_hints_reload( hints, outline );
+    if ( error )
+      goto Exit;
+
+    /* analyze glyph outline */
+    if ( AF_HINTS_DO_HORIZONTAL( hints ) )
+    {
+      error = af_cjk_hints_detect_features( hints, AF_DIMENSION_HORZ );
+      if ( error )
+        goto Exit;
+
+      af_cjk_hints_compute_blue_edges( hints, metrics, AF_DIMENSION_HORZ );
+    }
+
+    if ( AF_HINTS_DO_VERTICAL( hints ) )
+    {
+      error = af_cjk_hints_detect_features( hints, AF_DIMENSION_VERT );
+      if ( error )
+        goto Exit;
+
+      af_cjk_hints_compute_blue_edges( hints, metrics, AF_DIMENSION_VERT );
+    }
+
+    /* grid-fit the outline */
+    for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )
+    {
+      if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) ||
+           ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) )   )
+      {
+
+#ifdef AF_CONFIG_OPTION_USE_WARPER
+        if ( dim == AF_DIMENSION_HORZ                                  &&
+             metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL )
+        {
+          AF_WarperRec  warper;
+          FT_Fixed      scale;
+          FT_Pos        delta;
+
+
+          af_warper_compute( &warper, hints, (AF_Dimension)dim,
+                             &scale, &delta );
+          af_glyph_hints_scale_dim( hints, (AF_Dimension)dim,
+                                    scale, delta );
+          continue;
+        }
+#endif /* AF_CONFIG_OPTION_USE_WARPER */
+
+        af_cjk_hint_edges( hints, (AF_Dimension)dim );
+        af_cjk_align_edge_points( hints, (AF_Dimension)dim );
+        af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim );
+        af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim );
+      }
+    }
+
+#if 0
+    af_glyph_hints_dump_points( hints );
+    af_glyph_hints_dump_segments( hints );
+    af_glyph_hints_dump_edges( hints );
+#endif
+
+    af_glyph_hints_save( hints, outline );
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                C J K   S C R I P T   C L A S S                *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* this corresponds to Unicode 6.0 */
+
+  static const AF_Script_UniRangeRec  af_cjk_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x2E80UL,  0x2EFFUL ),  /* CJK Radicals Supplement                 */
+    AF_UNIRANGE_REC(  0x2F00UL,  0x2FDFUL ),  /* Kangxi Radicals                         */
+    AF_UNIRANGE_REC(  0x2FF0UL,  0x2FFFUL ),  /* Ideographic Description Characters      */
+    AF_UNIRANGE_REC(  0x3000UL,  0x303FUL ),  /* CJK Symbols and Punctuation             */
+    AF_UNIRANGE_REC(  0x3040UL,  0x309FUL ),  /* Hiragana                                */
+    AF_UNIRANGE_REC(  0x30A0UL,  0x30FFUL ),  /* Katakana                                */
+    AF_UNIRANGE_REC(  0x3100UL,  0x312FUL ),  /* Bopomofo                                */
+    AF_UNIRANGE_REC(  0x3130UL,  0x318FUL ),  /* Hangul Compatibility Jamo               */
+    AF_UNIRANGE_REC(  0x3190UL,  0x319FUL ),  /* Kanbun                                  */
+    AF_UNIRANGE_REC(  0x31A0UL,  0x31BFUL ),  /* Bopomofo Extended                       */
+    AF_UNIRANGE_REC(  0x31C0UL,  0x31EFUL ),  /* CJK Strokes                             */
+    AF_UNIRANGE_REC(  0x31F0UL,  0x31FFUL ),  /* Katakana Phonetic Extensions            */
+    AF_UNIRANGE_REC(  0x3200UL,  0x32FFUL ),  /* Enclosed CJK Letters and Months         */
+    AF_UNIRANGE_REC(  0x3300UL,  0x33FFUL ),  /* CJK Compatibility                       */
+    AF_UNIRANGE_REC(  0x3400UL,  0x4DBFUL ),  /* CJK Unified Ideographs Extension A      */
+    AF_UNIRANGE_REC(  0x4DC0UL,  0x4DFFUL ),  /* Yijing Hexagram Symbols                 */
+    AF_UNIRANGE_REC(  0x4E00UL,  0x9FFFUL ),  /* CJK Unified Ideographs                  */
+    AF_UNIRANGE_REC(  0xA960UL,  0xA97FUL ),  /* Hangul Jamo Extended-A                  */
+    AF_UNIRANGE_REC(  0xAC00UL,  0xD7AFUL ),  /* Hangul Syllables                        */
+    AF_UNIRANGE_REC(  0xD7B0UL,  0xD7FFUL ),  /* Hangul Jamo Extended-B                  */
+    AF_UNIRANGE_REC(  0xF900UL,  0xFAFFUL ),  /* CJK Compatibility Ideographs            */
+    AF_UNIRANGE_REC(  0xFE10UL,  0xFE1FUL ),  /* Vertical forms                          */
+    AF_UNIRANGE_REC(  0xFE30UL,  0xFE4FUL ),  /* CJK Compatibility Forms                 */
+    AF_UNIRANGE_REC(  0xFF00UL,  0xFFEFUL ),  /* Halfwidth and Fullwidth Forms           */
+    AF_UNIRANGE_REC( 0x1B000UL, 0x1B0FFUL ),  /* Kana Supplement                         */
+    AF_UNIRANGE_REC( 0x1D300UL, 0x1D35FUL ),  /* Tai Xuan Hing Symbols                   */
+    AF_UNIRANGE_REC( 0x1F200UL, 0x1F2FFUL ),  /* Enclosed Ideographic Supplement         */
+    AF_UNIRANGE_REC( 0x20000UL, 0x2A6DFUL ),  /* CJK Unified Ideographs Extension B      */
+    AF_UNIRANGE_REC( 0x2A700UL, 0x2B73FUL ),  /* CJK Unified Ideographs Extension C      */
+    AF_UNIRANGE_REC( 0x2B740UL, 0x2B81FUL ),  /* CJK Unified Ideographs Extension D      */
+    AF_UNIRANGE_REC( 0x2F800UL, 0x2FA1FUL ),  /* CJK Compatibility Ideographs Supplement */
+    AF_UNIRANGE_REC(       0UL,       0UL )
+  };
+
+
+  AF_DEFINE_SCRIPT_CLASS( af_cjk_script_class,
+    AF_SCRIPT_CJK,
+    af_cjk_uniranges,
+
+    sizeof ( AF_CJKMetricsRec ),
+
+    (AF_Script_InitMetricsFunc) af_cjk_metrics_init,
+    (AF_Script_ScaleMetricsFunc)af_cjk_metrics_scale,
+    (AF_Script_DoneMetricsFunc) NULL,
+
+    (AF_Script_InitHintsFunc)   af_cjk_hints_init,
+    (AF_Script_ApplyHintsFunc)  af_cjk_hints_apply
+  )
+
+#else /* !AF_CONFIG_OPTION_CJK */
+
+  static const AF_Script_UniRangeRec  af_cjk_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 0UL, 0UL )
+  };
+
+
+  AF_DEFINE_SCRIPT_CLASS( af_cjk_script_class,
+    AF_SCRIPT_CJK,
+    af_cjk_uniranges,
+
+    sizeof ( AF_CJKMetricsRec ),
+
+    (AF_Script_InitMetricsFunc) NULL,
+    (AF_Script_ScaleMetricsFunc)NULL,
+    (AF_Script_DoneMetricsFunc) NULL,
+
+    (AF_Script_InitHintsFunc)   NULL,
+    (AF_Script_ApplyHintsFunc)  NULL
+  )
+
+#endif /* !AF_CONFIG_OPTION_CJK */
+
+
+/* END */
diff --git a/src/autofit/afcjk.h b/src/autofit/afcjk.h
new file mode 100644 (file)
index 0000000..8416c0d
--- /dev/null
@@ -0,0 +1,141 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afcjk.h                                                                */
+/*                                                                         */
+/*    Auto-fitter hinting routines for CJK script (specification).         */
+/*                                                                         */
+/*  Copyright 2006, 2007, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __AFCJK_H__
+#define __AFCJK_H__
+
+#include "afhints.h"
+#include "aflatin.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /* the CJK-specific script class */
+
+  AF_DECLARE_SCRIPT_CLASS(af_cjk_script_class)
+
+  /* CJK (global) metrics management */
+
+  /*
+   *  CJK glyphs tend to fill the square.  So we have both vertical and
+   *  horizontal blue zones.  But some glyphs have flat bounding strokes that
+   *  leave some space between neighbour glyphs.
+   */
+  enum
+  {
+    AF_CJK_BLUE_TOP,
+    AF_CJK_BLUE_BOTTOM,
+    AF_CJK_BLUE_LEFT,
+    AF_CJK_BLUE_RIGHT,
+
+    AF_CJK_BLUE_MAX
+  };
+
+
+#define AF_CJK_MAX_WIDTHS  16
+#define AF_CJK_MAX_BLUES   AF_CJK_BLUE_MAX
+
+
+  enum
+  {
+    AF_CJK_BLUE_ACTIVE     = 1 << 0,
+    AF_CJK_BLUE_IS_TOP     = 1 << 1,
+    AF_CJK_BLUE_IS_RIGHT   = 1 << 2,
+    AF_CJK_BLUE_ADJUSTMENT = 1 << 3,  /* used for scale adjustment */
+                                      /* optimization              */
+    AF_CJK_BLUE_FLAG_MAX
+  };
+
+
+  typedef struct  AF_CJKBlueRec_
+  {
+    AF_WidthRec  ref;
+    AF_WidthRec  shoot; /* undershoot */
+    FT_UInt      flags;
+
+  } AF_CJKBlueRec, *AF_CJKBlue;
+
+
+  typedef struct  AF_CJKAxisRec_
+  {
+    FT_Fixed       scale;
+    FT_Pos         delta;
+
+    FT_UInt        width_count;
+    AF_WidthRec    widths[AF_CJK_MAX_WIDTHS];
+    FT_Pos         edge_distance_threshold;
+    FT_Pos         standard_width;
+    FT_Bool        extra_light;
+
+    /* used for horizontal metrics too for CJK */
+    FT_Bool        control_overshoot;
+    FT_UInt        blue_count;
+    AF_CJKBlueRec  blues[AF_CJK_BLUE_MAX];
+
+    FT_Fixed       org_scale;
+    FT_Pos         org_delta;
+
+  } AF_CJKAxisRec, *AF_CJKAxis;
+
+
+  typedef struct  AF_CJKMetricsRec_
+  {
+    AF_ScriptMetricsRec  root;
+    FT_UInt              units_per_em;
+    AF_CJKAxisRec        axis[AF_DIMENSION_MAX];
+
+  } AF_CJKMetricsRec, *AF_CJKMetrics;
+
+
+  FT_LOCAL( FT_Error )
+  af_cjk_metrics_init( AF_CJKMetrics  metrics,
+                       FT_Face        face );
+
+  FT_LOCAL( void )
+  af_cjk_metrics_scale( AF_CJKMetrics  metrics,
+                        AF_Scaler      scaler );
+
+  FT_LOCAL( FT_Error )
+  af_cjk_hints_init( AF_GlyphHints  hints,
+                     AF_CJKMetrics  metrics );
+
+  FT_LOCAL( FT_Error )
+  af_cjk_hints_apply( AF_GlyphHints  hints,
+                      FT_Outline*    outline,
+                      AF_CJKMetrics  metrics );
+
+  /* Shared. called from afindic.c */
+  FT_LOCAL( void )
+  af_cjk_metrics_check_digits( AF_CJKMetrics  metrics,
+                               FT_Face        face );
+
+  FT_LOCAL( void )
+  af_cjk_metrics_init_widths( AF_CJKMetrics  metrics,
+                              FT_Face        face,
+                              FT_ULong       charcode );
+
+
+/* */
+
+FT_END_HEADER
+
+#endif /* __AFCJK_H__ */
+
+
+/* END */
diff --git a/src/autofit/afdummy.c b/src/autofit/afdummy.c
new file mode 100644 (file)
index 0000000..4bf278c
--- /dev/null
@@ -0,0 +1,61 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afdummy.c                                                              */
+/*                                                                         */
+/*    Auto-fitter dummy routines to be used if no hinting should be        */
+/*    performed (body).                                                    */
+/*                                                                         */
+/*  Copyright 2003-2005, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "afdummy.h"
+#include "afhints.h"
+#include "aferrors.h"
+
+
+  static FT_Error
+  af_dummy_hints_init( AF_GlyphHints     hints,
+                       AF_ScriptMetrics  metrics )
+  {
+    af_glyph_hints_rescale( hints,
+                            metrics );
+    return AF_Err_Ok;
+  }
+
+
+  static FT_Error
+  af_dummy_hints_apply( AF_GlyphHints  hints,
+                        FT_Outline*    outline )
+  {
+    FT_UNUSED( hints );
+    FT_UNUSED( outline );
+
+    return AF_Err_Ok;
+  }
+
+
+  AF_DEFINE_SCRIPT_CLASS( af_dummy_script_class,
+    AF_SCRIPT_NONE,
+    NULL,
+
+    sizeof ( AF_ScriptMetricsRec ),
+
+    (AF_Script_InitMetricsFunc) NULL,
+    (AF_Script_ScaleMetricsFunc)NULL,
+    (AF_Script_DoneMetricsFunc) NULL,
+
+    (AF_Script_InitHintsFunc)   af_dummy_hints_init,
+    (AF_Script_ApplyHintsFunc)  af_dummy_hints_apply
+  )
+
+
+/* END */
diff --git a/src/autofit/afdummy.h b/src/autofit/afdummy.h
new file mode 100644 (file)
index 0000000..95d8f8c
--- /dev/null
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afdummy.h                                                              */
+/*                                                                         */
+/*    Auto-fitter dummy routines to be used if no hinting should be        */
+/*    performed (specification).                                           */
+/*                                                                         */
+/*  Copyright 2003-2005, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __AFDUMMY_H__
+#define __AFDUMMY_H__
+
+#include "aftypes.h"
+
+
+FT_BEGIN_HEADER
+
+ /*  A dummy script metrics class used when no hinting should
+  *  be performed.  This is the default for non-latin glyphs!
+  */
+
+  AF_DECLARE_SCRIPT_CLASS( af_dummy_script_class )
+
+/* */
+
+FT_END_HEADER
+
+
+#endif /* __AFDUMMY_H__ */
+
+
+/* END */
diff --git a/src/autofit/aferrors.h b/src/autofit/aferrors.h
new file mode 100644 (file)
index 0000000..50e1a22
--- /dev/null
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/*                                                                         */
+/*  aferrors.h                                                             */
+/*                                                                         */
+/*    Autofitter error codes (specification only).                         */
+/*                                                                         */
+/*  Copyright 2005, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the Autofitter error enumeration          */
+  /* constants.                                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __AFERRORS_H__
+#define __AFERRORS_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  AF_Err_
+#define FT_ERR_BASE    FT_Mod_Err_Autofit
+
+#include FT_ERRORS_H
+
+#endif /* __AFERRORS_H__ */
+
+/* END */
diff --git a/src/autofit/afglobal.c b/src/autofit/afglobal.c
new file mode 100644 (file)
index 0000000..3e0c02d
--- /dev/null
@@ -0,0 +1,319 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afglobal.c                                                             */
+/*                                                                         */
+/*    Auto-fitter routines to compute global hinting values (body).        */
+/*                                                                         */
+/*  Copyright 2003-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "afglobal.h"
+#include "afdummy.h"
+#include "aflatin.h"
+#include "afcjk.h"
+#include "afindic.h"
+#include "afpic.h"
+
+#include "aferrors.h"
+
+#ifdef FT_OPTION_AUTOFIT2
+#include "aflatin2.h"
+#endif
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+  /* when updating this table, don't forget to update          */
+  /* AF_SCRIPT_CLASSES_COUNT and autofit_module_class_pic_init */
+
+  /* populate this list when you add new scripts */
+  static AF_ScriptClass const  af_script_classes[] =
+  {
+    &af_dummy_script_class,
+#ifdef FT_OPTION_AUTOFIT2
+    &af_latin2_script_class,
+#endif
+    &af_latin_script_class,
+    &af_cjk_script_class,
+    &af_indic_script_class,
+    NULL  /* do not remove */
+  };
+
+#endif /* !FT_CONFIG_OPTION_PIC */
+
+  /* index of default script in `af_script_classes' */
+#define AF_SCRIPT_LIST_DEFAULT  2
+  /* a bit mask indicating an uncovered glyph       */
+#define AF_SCRIPT_LIST_NONE     0x7F
+  /* if this flag is set, we have an ASCII digit    */
+#define AF_DIGIT                0x80
+
+
+  /*
+   *  Note that glyph_scripts[] is used to map each glyph into
+   *  an index into the `af_script_classes' array.
+   *
+   */
+  typedef struct  AF_FaceGlobalsRec_
+  {
+    FT_Face           face;
+    FT_Long           glyph_count;    /* same as face->num_glyphs */
+    FT_Byte*          glyph_scripts;
+
+    AF_ScriptMetrics  metrics[AF_SCRIPT_MAX];
+
+  } AF_FaceGlobalsRec;
+
+
+  /* Compute the script index of each glyph within a given face. */
+
+  static FT_Error
+  af_face_globals_compute_script_coverage( AF_FaceGlobals  globals )
+  {
+    FT_Error    error       = AF_Err_Ok;
+    FT_Face     face        = globals->face;
+    FT_CharMap  old_charmap = face->charmap;
+    FT_Byte*    gscripts    = globals->glyph_scripts;
+    FT_UInt     ss, i;
+
+
+    /* the value AF_SCRIPT_LIST_NONE means `uncovered glyph' */
+    FT_MEM_SET( globals->glyph_scripts,
+                AF_SCRIPT_LIST_NONE,
+                globals->glyph_count );
+
+    error = FT_Select_Charmap( face, FT_ENCODING_UNICODE );
+    if ( error )
+    {
+     /*
+      *  Ignore this error; we simply use the default script.
+      *  XXX: Shouldn't we rather disable hinting?
+      */
+      error = AF_Err_Ok;
+      goto Exit;
+    }
+
+    /* scan each script in a Unicode charmap */
+    for ( ss = 0; AF_SCRIPT_CLASSES_GET[ss]; ss++ )
+    {
+      AF_ScriptClass      clazz = AF_SCRIPT_CLASSES_GET[ss];
+      AF_Script_UniRange  range;
+
+
+      if ( clazz->script_uni_ranges == NULL )
+        continue;
+
+      /*
+       *  Scan all unicode points in the range and set the corresponding
+       *  glyph script index.
+       */
+      for ( range = clazz->script_uni_ranges; range->first != 0; range++ )
+      {
+        FT_ULong  charcode = range->first;
+        FT_UInt   gindex;
+
+
+        gindex = FT_Get_Char_Index( face, charcode );
+
+        if ( gindex != 0                             &&
+             gindex < (FT_ULong)globals->glyph_count &&
+             gscripts[gindex] == AF_SCRIPT_LIST_NONE )
+          gscripts[gindex] = (FT_Byte)ss;
+
+        for (;;)
+        {
+          charcode = FT_Get_Next_Char( face, charcode, &gindex );
+
+          if ( gindex == 0 || charcode > range->last )
+            break;
+
+          if ( gindex < (FT_ULong)globals->glyph_count &&
+               gscripts[gindex] == AF_SCRIPT_LIST_NONE )
+            gscripts[gindex] = (FT_Byte)ss;
+        }
+      }
+    }
+
+    /* mark ASCII digits */
+    for ( i = 0x30; i <= 0x39; i++ )
+    {
+      FT_UInt  gindex = FT_Get_Char_Index( face, i );
+
+
+      if ( gindex != 0 && gindex < (FT_ULong)globals->glyph_count )
+        gscripts[gindex] |= AF_DIGIT;
+    }
+
+  Exit:
+    /*
+     *  By default, all uncovered glyphs are set to the latin script.
+     *  XXX: Shouldn't we disable hinting or do something similar?
+     */
+    {
+      FT_Long  nn;
+
+
+      for ( nn = 0; nn < globals->glyph_count; nn++ )
+      {
+        if ( ( gscripts[nn] & ~AF_DIGIT ) == AF_SCRIPT_LIST_NONE )
+        {
+          gscripts[nn] &= ~AF_SCRIPT_LIST_NONE;
+          gscripts[nn] |= AF_SCRIPT_LIST_DEFAULT;
+        }
+      }
+    }
+
+    FT_Set_Charmap( face, old_charmap );
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  af_face_globals_new( FT_Face          face,
+                       AF_FaceGlobals  *aglobals )
+  {
+    FT_Error        error;
+    FT_Memory       memory;
+    AF_FaceGlobals  globals = NULL;
+
+
+    memory = face->memory;
+
+    if ( !FT_ALLOC( globals, sizeof ( *globals ) +
+                             face->num_glyphs * sizeof ( FT_Byte ) ) )
+    {
+      globals->face          = face;
+      globals->glyph_count   = face->num_glyphs;
+      globals->glyph_scripts = (FT_Byte*)( globals + 1 );
+
+      error = af_face_globals_compute_script_coverage( globals );
+      if ( error )
+      {
+        af_face_globals_free( globals );
+        globals = NULL;
+      }
+    }
+
+    *aglobals = globals;
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  af_face_globals_free( AF_FaceGlobals  globals )
+  {
+    if ( globals )
+    {
+      FT_Memory  memory = globals->face->memory;
+      FT_UInt    nn;
+
+
+      for ( nn = 0; nn < AF_SCRIPT_MAX; nn++ )
+      {
+        if ( globals->metrics[nn] )
+        {
+          AF_ScriptClass  clazz = AF_SCRIPT_CLASSES_GET[nn];
+
+
+          FT_ASSERT( globals->metrics[nn]->clazz == clazz );
+
+          if ( clazz->script_metrics_done )
+            clazz->script_metrics_done( globals->metrics[nn] );
+
+          FT_FREE( globals->metrics[nn] );
+        }
+      }
+
+      globals->glyph_count   = 0;
+      globals->glyph_scripts = NULL;  /* no need to free this one! */
+      globals->face          = NULL;
+
+      FT_FREE( globals );
+    }
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  af_face_globals_get_metrics( AF_FaceGlobals     globals,
+                               FT_UInt            gindex,
+                               FT_UInt            options,
+                               AF_ScriptMetrics  *ametrics )
+  {
+    AF_ScriptMetrics  metrics = NULL;
+    FT_UInt           gidx;
+    AF_ScriptClass    clazz;
+    FT_UInt           script     = options & 15;
+    const FT_Offset   script_max = sizeof ( AF_SCRIPT_CLASSES_GET ) /
+                                     sizeof ( AF_SCRIPT_CLASSES_GET[0] );
+    FT_Error          error      = AF_Err_Ok;
+
+
+    if ( gindex >= (FT_ULong)globals->glyph_count )
+    {
+      error = AF_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    gidx = script;
+    if ( gidx == 0 || gidx + 1 >= script_max )
+      gidx = globals->glyph_scripts[gindex] & AF_SCRIPT_LIST_NONE;
+
+    clazz = AF_SCRIPT_CLASSES_GET[gidx];
+    if ( script == 0 )
+      script = clazz->script;
+
+    metrics = globals->metrics[clazz->script];
+    if ( metrics == NULL )
+    {
+      /* create the global metrics object when needed */
+      FT_Memory  memory = globals->face->memory;
+
+
+      if ( FT_ALLOC( metrics, clazz->script_metrics_size ) )
+        goto Exit;
+
+      metrics->clazz = clazz;
+
+      if ( clazz->script_metrics_init )
+      {
+        error = clazz->script_metrics_init( metrics, globals->face );
+        if ( error )
+        {
+          if ( clazz->script_metrics_done )
+            clazz->script_metrics_done( metrics );
+
+          FT_FREE( metrics );
+          goto Exit;
+        }
+      }
+
+      globals->metrics[clazz->script] = metrics;
+    }
+
+  Exit:
+    *ametrics = metrics;
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  af_face_globals_is_digit( AF_FaceGlobals  globals,
+                            FT_UInt         gindex )
+  {
+    if ( gindex < (FT_ULong)globals->glyph_count )
+      return (FT_Bool)( globals->glyph_scripts[gindex] & AF_DIGIT );
+
+    return (FT_Bool)0;
+  }
+
+
+/* END */
diff --git a/src/autofit/afglobal.h b/src/autofit/afglobal.h
new file mode 100644 (file)
index 0000000..cc6860b
--- /dev/null
@@ -0,0 +1,71 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afglobal.h                                                             */
+/*                                                                         */
+/*    Auto-fitter routines to compute global hinting values                */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 2003-2005, 2007, 2009, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __AFGLOBAL_H__
+#define __AFGLOBAL_H__
+
+
+#include "aftypes.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /************************************************************************/
+  /************************************************************************/
+  /*****                                                              *****/
+  /*****                  F A C E   G L O B A L S                     *****/
+  /*****                                                              *****/
+  /************************************************************************/
+  /************************************************************************/
+
+
+  /*
+   *  model the global hints data for a given face, decomposed into
+   *  script-specific items
+   */
+  typedef struct AF_FaceGlobalsRec_*   AF_FaceGlobals;
+
+
+  FT_LOCAL( FT_Error )
+  af_face_globals_new( FT_Face          face,
+                       AF_FaceGlobals  *aglobals );
+
+  FT_LOCAL( FT_Error )
+  af_face_globals_get_metrics( AF_FaceGlobals     globals,
+                               FT_UInt            gindex,
+                               FT_UInt            options,
+                               AF_ScriptMetrics  *ametrics );
+
+  FT_LOCAL( void )
+  af_face_globals_free( AF_FaceGlobals  globals );
+
+  FT_LOCAL_DEF( FT_Bool )
+  af_face_globals_is_digit( AF_FaceGlobals  globals,
+                            FT_UInt         gindex );
+
+  /* */
+
+
+FT_END_HEADER
+
+#endif /* __AFGLOBAL_H__ */
+
+
+/* END */
diff --git a/src/autofit/afhints.c b/src/autofit/afhints.c
new file mode 100644 (file)
index 0000000..f51066f
--- /dev/null
@@ -0,0 +1,1299 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afhints.c                                                              */
+/*                                                                         */
+/*    Auto-fitter hinting routines (body).                                 */
+/*                                                                         */
+/*  Copyright 2003-2007, 2009-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "afhints.h"
+#include "aferrors.h"
+#include FT_INTERNAL_CALC_H
+
+
+  /* Get new segment for given axis. */
+
+  FT_LOCAL_DEF( FT_Error )
+  af_axis_hints_new_segment( AF_AxisHints  axis,
+                             FT_Memory     memory,
+                             AF_Segment   *asegment )
+  {
+    FT_Error    error   = AF_Err_Ok;
+    AF_Segment  segment = NULL;
+
+
+    if ( axis->num_segments >= axis->max_segments )
+    {
+      FT_Int  old_max = axis->max_segments;
+      FT_Int  new_max = old_max;
+      FT_Int  big_max = (FT_Int)( FT_INT_MAX / sizeof ( *segment ) );
+
+
+      if ( old_max >= big_max )
+      {
+        error = AF_Err_Out_Of_Memory;
+        goto Exit;
+      }
+
+      new_max += ( new_max >> 2 ) + 4;
+      if ( new_max < old_max || new_max > big_max )
+        new_max = big_max;
+
+      if ( FT_RENEW_ARRAY( axis->segments, old_max, new_max ) )
+        goto Exit;
+
+      axis->max_segments = new_max;
+    }
+
+    segment = axis->segments + axis->num_segments++;
+
+  Exit:
+    *asegment = segment;
+    return error;
+  }
+
+
+  /* Get new edge for given axis, direction, and position. */
+
+  FT_LOCAL( FT_Error )
+  af_axis_hints_new_edge( AF_AxisHints  axis,
+                          FT_Int        fpos,
+                          AF_Direction  dir,
+                          FT_Memory     memory,
+                          AF_Edge      *aedge )
+  {
+    FT_Error  error = AF_Err_Ok;
+    AF_Edge   edge  = NULL;
+    AF_Edge   edges;
+
+
+    if ( axis->num_edges >= axis->max_edges )
+    {
+      FT_Int  old_max = axis->max_edges;
+      FT_Int  new_max = old_max;
+      FT_Int  big_max = (FT_Int)( FT_INT_MAX / sizeof ( *edge ) );
+
+
+      if ( old_max >= big_max )
+      {
+        error = AF_Err_Out_Of_Memory;
+        goto Exit;
+      }
+
+      new_max += ( new_max >> 2 ) + 4;
+      if ( new_max < old_max || new_max > big_max )
+        new_max = big_max;
+
+      if ( FT_RENEW_ARRAY( axis->edges, old_max, new_max ) )
+        goto Exit;
+
+      axis->max_edges = new_max;
+    }
+
+    edges = axis->edges;
+    edge  = edges + axis->num_edges;
+
+    while ( edge > edges )
+    {
+      if ( edge[-1].fpos < fpos )
+        break;
+
+      /* we want the edge with same position and minor direction */
+      /* to appear before those in the major one in the list     */
+      if ( edge[-1].fpos == fpos && dir == axis->major_dir )
+        break;
+
+      edge[0] = edge[-1];
+      edge--;
+    }
+
+    axis->num_edges++;
+
+    FT_ZERO( edge );
+    edge->fpos = (FT_Short)fpos;
+    edge->dir  = (FT_Char)dir;
+
+  Exit:
+    *aedge = edge;
+    return error;
+  }
+
+
+#ifdef FT_DEBUG_AUTOFIT
+
+#include FT_CONFIG_STANDARD_LIBRARY_H
+
+  static const char*
+  af_dir_str( AF_Direction  dir )
+  {
+    const char*  result;
+
+
+    switch ( dir )
+    {
+    case AF_DIR_UP:
+      result = "up";
+      break;
+    case AF_DIR_DOWN:
+      result = "down";
+      break;
+    case AF_DIR_LEFT:
+      result = "left";
+      break;
+    case AF_DIR_RIGHT:
+      result = "right";
+      break;
+    default:
+      result = "none";
+    }
+
+    return result;
+  }
+
+
+#define AF_INDEX_NUM( ptr, base )  ( (ptr) ? ( (ptr) - (base) ) : -1 )
+
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+  void
+  af_glyph_hints_dump_points( AF_GlyphHints  hints )
+  {
+    AF_Point  points = hints->points;
+    AF_Point  limit  = points + hints->num_points;
+    AF_Point  point;
+
+
+    printf( "Table of points:\n" );
+    printf(   "  [ index |  xorg |  yorg | xscale | yscale"
+              " |  xfit |  yfit |  flags ]\n" );
+
+    for ( point = points; point < limit; point++ )
+    {
+      printf( "  [ %5d | %5d | %5d | %6.2f | %6.2f"
+              " | %5.2f | %5.2f | %c%c%c%c%c%c ]\n",
+              point - points,
+              point->fx,
+              point->fy,
+              point->ox / 64.0,
+              point->oy / 64.0,
+              point->x / 64.0,
+              point->y / 64.0,
+              ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) ? 'w' : ' ',
+              ( point->flags & AF_FLAG_INFLECTION )         ? 'i' : ' ',
+              ( point->flags & AF_FLAG_EXTREMA_X )          ? '<' : ' ',
+              ( point->flags & AF_FLAG_EXTREMA_Y )          ? 'v' : ' ',
+              ( point->flags & AF_FLAG_ROUND_X )            ? '(' : ' ',
+              ( point->flags & AF_FLAG_ROUND_Y )            ? 'u' : ' ');
+    }
+    printf( "\n" );
+  }
+#ifdef __cplusplus
+  }
+#endif
+
+
+  static const char*
+  af_edge_flags_to_string( AF_Edge_Flags  flags )
+  {
+    static char  temp[32];
+    int          pos = 0;
+
+
+    if ( flags & AF_EDGE_ROUND )
+    {
+      ft_memcpy( temp + pos, "round", 5 );
+      pos += 5;
+    }
+    if ( flags & AF_EDGE_SERIF )
+    {
+      if ( pos > 0 )
+        temp[pos++] = ' ';
+      ft_memcpy( temp + pos, "serif", 5 );
+      pos += 5;
+    }
+    if ( pos == 0 )
+      return "normal";
+
+    temp[pos] = 0;
+
+    return temp;
+  }
+
+
+  /* Dump the array of linked segments. */
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+  void
+  af_glyph_hints_dump_segments( AF_GlyphHints  hints )
+  {
+    FT_Int  dimension;
+
+
+    for ( dimension = 1; dimension >= 0; dimension-- )
+    {
+      AF_AxisHints  axis     = &hints->axis[dimension];
+      AF_Segment    segments = axis->segments;
+      AF_Segment    limit    = segments + axis->num_segments;
+      AF_Segment    seg;
+
+
+      printf ( "Table of %s segments:\n",
+               dimension == AF_DIMENSION_HORZ ? "vertical" : "horizontal" );
+      printf ( "  [ index |  pos  |  dir  | link | serif |"
+               " height | extra |    flags    ]\n" );
+
+      for ( seg = segments; seg < limit; seg++ )
+      {
+        printf ( "  [ %5d | %5.2g | %5s | %4d | %5d | %6d | %5d | %11s ]\n",
+                 seg - segments,
+                 dimension == AF_DIMENSION_HORZ ? (int)seg->first->ox / 64.0
+                                                : (int)seg->first->oy / 64.0,
+                 af_dir_str( (AF_Direction)seg->dir ),
+                 AF_INDEX_NUM( seg->link, segments ),
+                 AF_INDEX_NUM( seg->serif, segments ),
+                 seg->height,
+                 seg->height - ( seg->max_coord - seg->min_coord ),
+                 af_edge_flags_to_string( (AF_Edge_Flags)seg->flags ) );
+      }
+      printf( "\n" );
+    }
+  }
+#ifdef __cplusplus
+  }
+#endif
+
+
+  /* Fetch number of segments. */
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+  FT_Error
+  af_glyph_hints_get_num_segments( AF_GlyphHints  hints,
+                                   FT_Int         dimension,
+                                   FT_Int*        num_segments )
+  {
+    AF_Dimension  dim;
+    AF_AxisHints  axis;
+
+
+    dim = ( dimension == 0 ) ? AF_DIMENSION_HORZ : AF_DIMENSION_VERT;
+
+    axis          = &hints->axis[dim];
+    *num_segments = axis->num_segments;
+
+    return AF_Err_Ok;
+  }
+#ifdef __cplusplus
+  }
+#endif
+
+
+  /* Fetch offset of segments into user supplied offset array. */
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+  FT_Error
+  af_glyph_hints_get_segment_offset( AF_GlyphHints  hints,
+                                     FT_Int         dimension,
+                                     FT_Int         idx,
+                                     FT_Pos*        offset )
+  {
+    AF_Dimension  dim;
+    AF_AxisHints  axis;
+    AF_Segment    seg;
+
+
+    if ( !offset )
+      return AF_Err_Invalid_Argument;
+
+    dim = ( dimension == 0 ) ? AF_DIMENSION_HORZ : AF_DIMENSION_VERT;
+
+    axis = &hints->axis[dim];
+
+    if ( idx < 0 || idx >= axis->num_segments )
+      return AF_Err_Invalid_Argument;
+
+    seg     = &axis->segments[idx];
+    *offset = (dim == AF_DIMENSION_HORZ) ? seg->first->ox
+                                         : seg->first->oy;
+
+    return AF_Err_Ok;
+  }
+#ifdef __cplusplus
+  }
+#endif
+
+
+  /* Dump the array of linked edges. */
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+  void
+  af_glyph_hints_dump_edges( AF_GlyphHints  hints )
+  {
+    FT_Int  dimension;
+
+
+    for ( dimension = 1; dimension >= 0; dimension-- )
+    {
+      AF_AxisHints  axis  = &hints->axis[dimension];
+      AF_Edge       edges = axis->edges;
+      AF_Edge       limit = edges + axis->num_edges;
+      AF_Edge       edge;
+
+
+      /*
+       *  note: AF_DIMENSION_HORZ corresponds to _vertical_ edges
+       *        since they have a constant X coordinate.
+       */
+      printf ( "Table of %s edges:\n",
+               dimension == AF_DIMENSION_HORZ ? "vertical" : "horizontal" );
+      printf ( "  [ index |  pos  |  dir  | link |"
+               " serif | blue | opos  |  pos  |    flags    ]\n" );
+
+      for ( edge = edges; edge < limit; edge++ )
+      {
+        printf ( "  [ %5d | %5.2g | %5s | %4d |"
+                 " %5d |   %c  | %5.2f | %5.2f | %11s ]\n",
+                 edge - edges,
+                 (int)edge->opos / 64.0,
+                 af_dir_str( (AF_Direction)edge->dir ),
+                 AF_INDEX_NUM( edge->link, edges ),
+                 AF_INDEX_NUM( edge->serif, edges ),
+                 edge->blue_edge ? 'y' : 'n',
+                 edge->opos / 64.0,
+                 edge->pos / 64.0,
+                 af_edge_flags_to_string( (AF_Edge_Flags)edge->flags ) );
+      }
+      printf( "\n" );
+    }
+  }
+#ifdef __cplusplus
+  }
+#endif
+
+#else /* !FT_DEBUG_AUTOFIT */
+
+  /* these empty stubs are only used to link the `ftgrid' test program */
+  /* if debugging is disabled                                          */
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+
+  void
+  af_glyph_hints_dump_points( AF_GlyphHints  hints )
+  {
+    FT_UNUSED( hints );
+  }
+
+
+  void
+  af_glyph_hints_dump_segments( AF_GlyphHints  hints )
+  {
+    FT_UNUSED( hints );
+  }
+
+
+  FT_Error
+  af_glyph_hints_get_num_segments( AF_GlyphHints  hints,
+                                   FT_Int         dimension,
+                                   FT_Int*        num_segments )
+  {
+    FT_UNUSED( hints );
+    FT_UNUSED( dimension );
+    FT_UNUSED( num_segments );
+
+    return 0;
+  }
+
+
+  FT_Error
+  af_glyph_hints_get_segment_offset( AF_GlyphHints  hints,
+                                     FT_Int         dimension,
+                                     FT_Int         idx,
+                                     FT_Pos*        offset )
+  {
+    FT_UNUSED( hints );
+    FT_UNUSED( dimension );
+    FT_UNUSED( idx );
+    FT_UNUSED( offset );
+
+    return 0;
+  }
+
+
+  void
+  af_glyph_hints_dump_edges( AF_GlyphHints  hints )
+  {
+    FT_UNUSED( hints );
+  }
+
+#ifdef __cplusplus
+  }
+#endif
+
+#endif /* !FT_DEBUG_AUTOFIT */
+
+
+  /* Compute the direction value of a given vector. */
+
+  FT_LOCAL_DEF( AF_Direction )
+  af_direction_compute( FT_Pos  dx,
+                        FT_Pos  dy )
+  {
+    FT_Pos        ll, ss;  /* long and short arm lengths */
+    AF_Direction  dir;     /* candidate direction        */
+
+
+    if ( dy >= dx )
+    {
+      if ( dy >= -dx )
+      {
+        dir = AF_DIR_UP;
+        ll  = dy;
+        ss  = dx;
+      }
+      else
+      {
+        dir = AF_DIR_LEFT;
+        ll  = -dx;
+        ss  = dy;
+      }
+    }
+    else /* dy < dx */
+    {
+      if ( dy >= -dx )
+      {
+        dir = AF_DIR_RIGHT;
+        ll  = dx;
+        ss  = dy;
+      }
+      else
+      {
+        dir = AF_DIR_DOWN;
+        ll  = dy;
+        ss  = dx;
+      }
+    }
+
+    /* return no direction if arm lengths differ too much */
+    /* (value 14 is heuristic)                            */
+    ss *= 14;
+    if ( FT_ABS( ll ) <= FT_ABS( ss ) )
+      dir = AF_DIR_NONE;
+
+    return dir;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  af_glyph_hints_init( AF_GlyphHints  hints,
+                       FT_Memory      memory )
+  {
+    FT_ZERO( hints );
+    hints->memory = memory;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  af_glyph_hints_done( AF_GlyphHints  hints )
+  {
+    if ( hints && hints->memory )
+    {
+      FT_Memory  memory = hints->memory;
+      int        dim;
+
+
+      /*
+       *  note that we don't need to free the segment and edge
+       *  buffers since they are really within the hints->points array
+       */
+      for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )
+      {
+        AF_AxisHints  axis = &hints->axis[dim];
+
+
+        axis->num_segments = 0;
+        axis->max_segments = 0;
+        FT_FREE( axis->segments );
+
+        axis->num_edges = 0;
+        axis->max_edges = 0;
+        FT_FREE( axis->edges );
+      }
+
+      FT_FREE( hints->contours );
+      hints->max_contours = 0;
+      hints->num_contours = 0;
+
+      FT_FREE( hints->points );
+      hints->num_points = 0;
+      hints->max_points = 0;
+
+      hints->memory = NULL;
+    }
+  }
+
+
+  /* Reset metrics. */
+
+  FT_LOCAL_DEF( void )
+  af_glyph_hints_rescale( AF_GlyphHints     hints,
+                          AF_ScriptMetrics  metrics )
+  {
+    hints->metrics      = metrics;
+    hints->scaler_flags = metrics->scaler.flags;
+  }
+
+
+  /* Recompute all AF_Point in AF_GlyphHints from the definitions */
+  /* in a source outline.                                         */
+
+  FT_LOCAL_DEF( FT_Error )
+  af_glyph_hints_reload( AF_GlyphHints  hints,
+                         FT_Outline*    outline )
+  {
+    FT_Error   error   = AF_Err_Ok;
+    AF_Point   points;
+    FT_UInt    old_max, new_max;
+    FT_Fixed   x_scale = hints->x_scale;
+    FT_Fixed   y_scale = hints->y_scale;
+    FT_Pos     x_delta = hints->x_delta;
+    FT_Pos     y_delta = hints->y_delta;
+    FT_Memory  memory  = hints->memory;
+
+
+    hints->num_points   = 0;
+    hints->num_contours = 0;
+
+    hints->axis[0].num_segments = 0;
+    hints->axis[0].num_edges    = 0;
+    hints->axis[1].num_segments = 0;
+    hints->axis[1].num_edges    = 0;
+
+    /* first of all, reallocate the contours array if necessary */
+    new_max = (FT_UInt)outline->n_contours;
+    old_max = hints->max_contours;
+    if ( new_max > old_max )
+    {
+      new_max = ( new_max + 3 ) & ~3; /* round up to a multiple of 4 */
+
+      if ( FT_RENEW_ARRAY( hints->contours, old_max, new_max ) )
+        goto Exit;
+
+      hints->max_contours = new_max;
+    }
+
+    /*
+     *  then reallocate the points arrays if necessary --
+     *  note that we reserve two additional point positions, used to
+     *  hint metrics appropriately
+     */
+    new_max = (FT_UInt)( outline->n_points + 2 );
+    old_max = hints->max_points;
+    if ( new_max > old_max )
+    {
+      new_max = ( new_max + 2 + 7 ) & ~7; /* round up to a multiple of 8 */
+
+      if ( FT_RENEW_ARRAY( hints->points, old_max, new_max ) )
+        goto Exit;
+
+      hints->max_points = new_max;
+    }
+
+    hints->num_points   = outline->n_points;
+    hints->num_contours = outline->n_contours;
+
+    /* We can't rely on the value of `FT_Outline.flags' to know the fill   */
+    /* direction used for a glyph, given that some fonts are broken (e.g., */
+    /* the Arphic ones).  We thus recompute it each time we need to.       */
+    /*                                                                     */
+    hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_UP;
+    hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_LEFT;
+
+    if ( FT_Outline_Get_Orientation( outline ) == FT_ORIENTATION_POSTSCRIPT )
+    {
+      hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_DOWN;
+      hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_RIGHT;
+    }
+
+    hints->x_scale = x_scale;
+    hints->y_scale = y_scale;
+    hints->x_delta = x_delta;
+    hints->y_delta = y_delta;
+
+    hints->xmin_delta = 0;
+    hints->xmax_delta = 0;
+
+    points = hints->points;
+    if ( hints->num_points == 0 )
+      goto Exit;
+
+    {
+      AF_Point  point;
+      AF_Point  point_limit = points + hints->num_points;
+
+
+      /* compute coordinates & Bezier flags, next and prev */
+      {
+        FT_Vector*  vec           = outline->points;
+        char*       tag           = outline->tags;
+        AF_Point    end           = points + outline->contours[0];
+        AF_Point    prev          = end;
+        FT_Int      contour_index = 0;
+
+
+        for ( point = points; point < point_limit; point++, vec++, tag++ )
+        {
+          point->fx = (FT_Short)vec->x;
+          point->fy = (FT_Short)vec->y;
+          point->ox = point->x = FT_MulFix( vec->x, x_scale ) + x_delta;
+          point->oy = point->y = FT_MulFix( vec->y, y_scale ) + y_delta;
+
+          switch ( FT_CURVE_TAG( *tag ) )
+          {
+          case FT_CURVE_TAG_CONIC:
+            point->flags = AF_FLAG_CONIC;
+            break;
+          case FT_CURVE_TAG_CUBIC:
+            point->flags = AF_FLAG_CUBIC;
+            break;
+          default:
+            point->flags = AF_FLAG_NONE;
+          }
+
+          point->prev = prev;
+          prev->next  = point;
+          prev        = point;
+
+          if ( point == end )
+          {
+            if ( ++contour_index < outline->n_contours )
+            {
+              end  = points + outline->contours[contour_index];
+              prev = end;
+            }
+          }
+        }
+      }
+
+      /* set up the contours array */
+      {
+        AF_Point*  contour       = hints->contours;
+        AF_Point*  contour_limit = contour + hints->num_contours;
+        short*     end           = outline->contours;
+        short      idx           = 0;
+
+
+        for ( ; contour < contour_limit; contour++, end++ )
+        {
+          contour[0] = points + idx;
+          idx        = (short)( end[0] + 1 );
+        }
+      }
+
+      /* compute directions of in & out vectors */
+      {
+        AF_Point      first  = points;
+        AF_Point      prev   = NULL;
+        FT_Pos        in_x   = 0;
+        FT_Pos        in_y   = 0;
+        AF_Direction  in_dir = AF_DIR_NONE;
+
+
+        for ( point = points; point < point_limit; point++ )
+        {
+          AF_Point  next;
+          FT_Pos    out_x, out_y;
+
+
+          if ( point == first )
+          {
+            prev   = first->prev;
+            in_x   = first->fx - prev->fx;
+            in_y   = first->fy - prev->fy;
+            in_dir = af_direction_compute( in_x, in_y );
+            first  = prev + 1;
+          }
+
+          point->in_dir = (FT_Char)in_dir;
+
+          next  = point->next;
+          out_x = next->fx - point->fx;
+          out_y = next->fy - point->fy;
+
+          in_dir         = af_direction_compute( out_x, out_y );
+          point->out_dir = (FT_Char)in_dir;
+
+          /* check for weak points */
+
+          if ( point->flags & ( AF_FLAG_CONIC | AF_FLAG_CUBIC ) )
+          {
+          Is_Weak_Point:
+            point->flags |= AF_FLAG_WEAK_INTERPOLATION;
+          }
+          else if ( point->out_dir == point->in_dir )
+          {
+            if ( point->out_dir != AF_DIR_NONE )
+              goto Is_Weak_Point;
+
+            if ( ft_corner_is_flat( in_x, in_y, out_x, out_y ) )
+              goto Is_Weak_Point;
+          }
+          else if ( point->in_dir == -point->out_dir )
+            goto Is_Weak_Point;
+
+          in_x = out_x;
+          in_y = out_y;
+          prev = point;
+        }
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* Store the hinted outline in an FT_Outline structure. */
+
+  FT_LOCAL_DEF( void )
+  af_glyph_hints_save( AF_GlyphHints  hints,
+                       FT_Outline*    outline )
+  {
+    AF_Point    point = hints->points;
+    AF_Point    limit = point + hints->num_points;
+    FT_Vector*  vec   = outline->points;
+    char*       tag   = outline->tags;
+
+
+    for ( ; point < limit; point++, vec++, tag++ )
+    {
+      vec->x = point->x;
+      vec->y = point->y;
+
+      if ( point->flags & AF_FLAG_CONIC )
+        tag[0] = FT_CURVE_TAG_CONIC;
+      else if ( point->flags & AF_FLAG_CUBIC )
+        tag[0] = FT_CURVE_TAG_CUBIC;
+      else
+        tag[0] = FT_CURVE_TAG_ON;
+    }
+  }
+
+
+  /****************************************************************
+   *
+   *                     EDGE POINT GRID-FITTING
+   *
+   ****************************************************************/
+
+
+  /* Align all points of an edge to the same coordinate value, */
+  /* either horizontally or vertically.                        */
+
+  FT_LOCAL_DEF( void )
+  af_glyph_hints_align_edge_points( AF_GlyphHints  hints,
+                                    AF_Dimension   dim )
+  {
+    AF_AxisHints  axis          = & hints->axis[dim];
+    AF_Segment    segments      = axis->segments;
+    AF_Segment    segment_limit = segments + axis->num_segments;
+    AF_Segment    seg;
+
+
+    if ( dim == AF_DIMENSION_HORZ )
+    {
+      for ( seg = segments; seg < segment_limit; seg++ )
+      {
+        AF_Edge   edge = seg->edge;
+        AF_Point  point, first, last;
+
+
+        if ( edge == NULL )
+          continue;
+
+        first = seg->first;
+        last  = seg->last;
+        point = first;
+        for (;;)
+        {
+          point->x      = edge->pos;
+          point->flags |= AF_FLAG_TOUCH_X;
+
+          if ( point == last )
+            break;
+
+          point = point->next;
+        }
+      }
+    }
+    else
+    {
+      for ( seg = segments; seg < segment_limit; seg++ )
+      {
+        AF_Edge   edge = seg->edge;
+        AF_Point  point, first, last;
+
+
+        if ( edge == NULL )
+          continue;
+
+        first = seg->first;
+        last  = seg->last;
+        point = first;
+        for (;;)
+        {
+          point->y      = edge->pos;
+          point->flags |= AF_FLAG_TOUCH_Y;
+
+          if ( point == last )
+            break;
+
+          point = point->next;
+        }
+      }
+    }
+  }
+
+
+  /****************************************************************
+   *
+   *                    STRONG POINT INTERPOLATION
+   *
+   ****************************************************************/
+
+
+  /* Hint the strong points -- this is equivalent to the TrueType `IP' */
+  /* hinting instruction.                                              */
+
+  FT_LOCAL_DEF( void )
+  af_glyph_hints_align_strong_points( AF_GlyphHints  hints,
+                                      AF_Dimension   dim )
+  {
+    AF_Point      points      = hints->points;
+    AF_Point      point_limit = points + hints->num_points;
+    AF_AxisHints  axis        = &hints->axis[dim];
+    AF_Edge       edges       = axis->edges;
+    AF_Edge       edge_limit  = edges + axis->num_edges;
+    AF_Flags      touch_flag;
+
+
+    if ( dim == AF_DIMENSION_HORZ )
+      touch_flag = AF_FLAG_TOUCH_X;
+    else
+      touch_flag  = AF_FLAG_TOUCH_Y;
+
+    if ( edges < edge_limit )
+    {
+      AF_Point  point;
+      AF_Edge   edge;
+
+
+      for ( point = points; point < point_limit; point++ )
+      {
+        FT_Pos  u, ou, fu;  /* point position */
+        FT_Pos  delta;
+
+
+        if ( point->flags & touch_flag )
+          continue;
+
+        /* if this point is candidate to weak interpolation, we       */
+        /* interpolate it after all strong points have been processed */
+
+        if (  ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) &&
+             !( point->flags & AF_FLAG_INFLECTION )         )
+          continue;
+
+        if ( dim == AF_DIMENSION_VERT )
+        {
+          u  = point->fy;
+          ou = point->oy;
+        }
+        else
+        {
+          u  = point->fx;
+          ou = point->ox;
+        }
+
+        fu = u;
+
+        /* is the point before the first edge? */
+        edge  = edges;
+        delta = edge->fpos - u;
+        if ( delta >= 0 )
+        {
+          u = edge->pos - ( edge->opos - ou );
+          goto Store_Point;
+        }
+
+        /* is the point after the last edge? */
+        edge  = edge_limit - 1;
+        delta = u - edge->fpos;
+        if ( delta >= 0 )
+        {
+          u = edge->pos + ( ou - edge->opos );
+          goto Store_Point;
+        }
+
+        {
+          FT_PtrDist  min, max, mid;
+          FT_Pos      fpos;
+
+
+          /* find enclosing edges */
+          min = 0;
+          max = edge_limit - edges;
+
+#if 1
+          /* for a small number of edges, a linear search is better */
+          if ( max <= 8 )
+          {
+            FT_PtrDist  nn;
+
+
+            for ( nn = 0; nn < max; nn++ )
+              if ( edges[nn].fpos >= u )
+                break;
+
+            if ( edges[nn].fpos == u )
+            {
+              u = edges[nn].pos;
+              goto Store_Point;
+            }
+            min = nn;
+          }
+          else
+#endif
+          while ( min < max )
+          {
+            mid  = ( max + min ) >> 1;
+            edge = edges + mid;
+            fpos = edge->fpos;
+
+            if ( u < fpos )
+              max = mid;
+            else if ( u > fpos )
+              min = mid + 1;
+            else
+            {
+              /* we are on the edge */
+              u = edge->pos;
+              goto Store_Point;
+            }
+          }
+
+          /* point is not on an edge */
+          {
+            AF_Edge  before = edges + min - 1;
+            AF_Edge  after  = edges + min + 0;
+
+
+            /* assert( before && after && before != after ) */
+            if ( before->scale == 0 )
+              before->scale = FT_DivFix( after->pos - before->pos,
+                                         after->fpos - before->fpos );
+
+            u = before->pos + FT_MulFix( fu - before->fpos,
+                                         before->scale );
+          }
+        }
+
+      Store_Point:
+        /* save the point position */
+        if ( dim == AF_DIMENSION_HORZ )
+          point->x = u;
+        else
+          point->y = u;
+
+        point->flags |= touch_flag;
+      }
+    }
+  }
+
+
+  /****************************************************************
+   *
+   *                    WEAK POINT INTERPOLATION
+   *
+   ****************************************************************/
+
+
+  /* Shift the original coordinates of all points between `p1' and */
+  /* `p2' to get hinted coordinates, using the same difference as  */
+  /* given by `ref'.                                               */
+
+  static void
+  af_iup_shift( AF_Point  p1,
+                AF_Point  p2,
+                AF_Point  ref )
+  {
+    AF_Point  p;
+    FT_Pos    delta = ref->u - ref->v;
+
+
+    if ( delta == 0 )
+      return;
+
+    for ( p = p1; p < ref; p++ )
+      p->u = p->v + delta;
+
+    for ( p = ref + 1; p <= p2; p++ )
+      p->u = p->v + delta;
+  }
+
+
+  /* Interpolate the original coordinates of all points between `p1' and  */
+  /* `p2' to get hinted coordinates, using `ref1' and `ref2' as the       */
+  /* reference points.  The `u' and `v' members are the current and       */
+  /* original coordinate values, respectively.                            */
+  /*                                                                      */
+  /* Details can be found in the TrueType bytecode specification.         */
+
+  static void
+  af_iup_interp( AF_Point  p1,
+                 AF_Point  p2,
+                 AF_Point  ref1,
+                 AF_Point  ref2 )
+  {
+    AF_Point  p;
+    FT_Pos    u;
+    FT_Pos    v1 = ref1->v;
+    FT_Pos    v2 = ref2->v;
+    FT_Pos    d1 = ref1->u - v1;
+    FT_Pos    d2 = ref2->u - v2;
+
+
+    if ( p1 > p2 )
+      return;
+
+    if ( v1 == v2 )
+    {
+      for ( p = p1; p <= p2; p++ )
+      {
+        u = p->v;
+
+        if ( u <= v1 )
+          u += d1;
+        else
+          u += d2;
+
+        p->u = u;
+      }
+      return;
+    }
+
+    if ( v1 < v2 )
+    {
+      for ( p = p1; p <= p2; p++ )
+      {
+        u = p->v;
+
+        if ( u <= v1 )
+          u += d1;
+        else if ( u >= v2 )
+          u += d2;
+        else
+          u = ref1->u + FT_MulDiv( u - v1, ref2->u - ref1->u, v2 - v1 );
+
+        p->u = u;
+      }
+    }
+    else
+    {
+      for ( p = p1; p <= p2; p++ )
+      {
+        u = p->v;
+
+        if ( u <= v2 )
+          u += d2;
+        else if ( u >= v1 )
+          u += d1;
+        else
+          u = ref1->u + FT_MulDiv( u - v1, ref2->u - ref1->u, v2 - v1 );
+
+        p->u = u;
+      }
+    }
+  }
+
+
+  /* Hint the weak points -- this is equivalent to the TrueType `IUP' */
+  /* hinting instruction.                                             */
+
+  FT_LOCAL_DEF( void )
+  af_glyph_hints_align_weak_points( AF_GlyphHints  hints,
+                                    AF_Dimension   dim )
+  {
+    AF_Point   points        = hints->points;
+    AF_Point   point_limit   = points + hints->num_points;
+    AF_Point*  contour       = hints->contours;
+    AF_Point*  contour_limit = contour + hints->num_contours;
+    AF_Flags   touch_flag;
+    AF_Point   point;
+    AF_Point   end_point;
+    AF_Point   first_point;
+
+
+    /* PASS 1: Move segment points to edge positions */
+
+    if ( dim == AF_DIMENSION_HORZ )
+    {
+      touch_flag = AF_FLAG_TOUCH_X;
+
+      for ( point = points; point < point_limit; point++ )
+      {
+        point->u = point->x;
+        point->v = point->ox;
+      }
+    }
+    else
+    {
+      touch_flag = AF_FLAG_TOUCH_Y;
+
+      for ( point = points; point < point_limit; point++ )
+      {
+        point->u = point->y;
+        point->v = point->oy;
+      }
+    }
+
+    point = points;
+
+    for ( ; contour < contour_limit; contour++ )
+    {
+      AF_Point  first_touched, last_touched;
+
+
+      point       = *contour;
+      end_point   = point->prev;
+      first_point = point;
+
+      /* find first touched point */
+      for (;;)
+      {
+        if ( point > end_point )  /* no touched point in contour */
+          goto NextContour;
+
+        if ( point->flags & touch_flag )
+          break;
+
+        point++;
+      }
+
+      first_touched = point;
+      last_touched  = point;
+
+      for (;;)
+      {
+        FT_ASSERT( point <= end_point                 &&
+                   ( point->flags & touch_flag ) != 0 );
+
+        /* skip any touched neighbours */
+        while ( point < end_point                    &&
+                ( point[1].flags & touch_flag ) != 0 )
+          point++;
+
+        last_touched = point;
+
+        /* find the next touched point, if any */
+        point++;
+        for (;;)
+        {
+          if ( point > end_point )
+            goto EndContour;
+
+          if ( ( point->flags & touch_flag ) != 0 )
+            break;
+
+          point++;
+        }
+
+        /* interpolate between last_touched and point */
+        af_iup_interp( last_touched + 1, point - 1,
+                       last_touched, point );
+      }
+
+    EndContour:
+      /* special case: only one point was touched */
+      if ( last_touched == first_touched )
+        af_iup_shift( first_point, end_point, first_touched );
+
+      else /* interpolate the last part */
+      {
+        if ( last_touched < end_point )
+          af_iup_interp( last_touched + 1, end_point,
+                         last_touched, first_touched );
+
+        if ( first_touched > points )
+          af_iup_interp( first_point, first_touched - 1,
+                         last_touched, first_touched );
+      }
+
+    NextContour:
+      ;
+    }
+
+    /* now save the interpolated values back to x/y */
+    if ( dim == AF_DIMENSION_HORZ )
+    {
+      for ( point = points; point < point_limit; point++ )
+        point->x = point->u;
+    }
+    else
+    {
+      for ( point = points; point < point_limit; point++ )
+        point->y = point->u;
+    }
+  }
+
+
+#ifdef AF_CONFIG_OPTION_USE_WARPER
+
+  /* Apply (small) warp scale and warp delta for given dimension. */
+
+  FT_LOCAL_DEF( void )
+  af_glyph_hints_scale_dim( AF_GlyphHints  hints,
+                            AF_Dimension   dim,
+                            FT_Fixed       scale,
+                            FT_Pos         delta )
+  {
+    AF_Point  points       = hints->points;
+    AF_Point  points_limit = points + hints->num_points;
+    AF_Point  point;
+
+
+    if ( dim == AF_DIMENSION_HORZ )
+    {
+      for ( point = points; point < points_limit; point++ )
+        point->x = FT_MulFix( point->fx, scale ) + delta;
+    }
+    else
+    {
+      for ( point = points; point < points_limit; point++ )
+        point->y = FT_MulFix( point->fy, scale ) + delta;
+    }
+  }
+
+#endif /* AF_CONFIG_OPTION_USE_WARPER */
+
+/* END */
diff --git a/src/autofit/afhints.h b/src/autofit/afhints.h
new file mode 100644 (file)
index 0000000..1c52e0d
--- /dev/null
@@ -0,0 +1,467 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afhints.h                                                              */
+/*                                                                         */
+/*    Auto-fitter hinting routines (specification).                        */
+/*                                                                         */
+/*  Copyright 2003-2008, 2010-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __AFHINTS_H__
+#define __AFHINTS_H__
+
+#include "aftypes.h"
+
+#define xxAF_SORT_SEGMENTS
+
+FT_BEGIN_HEADER
+
+  /*
+   *  The definition of outline glyph hints.  These are shared by all
+   *  script analysis routines (until now).
+   */
+
+  typedef enum  AF_Dimension_
+  {
+    AF_DIMENSION_HORZ = 0,  /* x coordinates,                    */
+                            /* i.e., vertical segments & edges   */
+    AF_DIMENSION_VERT = 1,  /* y coordinates,                    */
+                            /* i.e., horizontal segments & edges */
+
+    AF_DIMENSION_MAX  /* do not remove */
+
+  } AF_Dimension;
+
+
+  /* hint directions -- the values are computed so that two vectors are */
+  /* in opposite directions iff `dir1 + dir2 == 0'                      */
+  typedef enum  AF_Direction_
+  {
+    AF_DIR_NONE  =  4,
+    AF_DIR_RIGHT =  1,
+    AF_DIR_LEFT  = -1,
+    AF_DIR_UP    =  2,
+    AF_DIR_DOWN  = -2
+
+  } AF_Direction;
+
+
+  /*
+   *  The following explanations are mostly taken from the article
+   *
+   *    Real-Time Grid Fitting of Typographic Outlines
+   *
+   *  by David Turner and Werner Lemberg
+   *
+   *   http://www.tug.org/TUGboat/Articles/tb24-3/lemberg.pdf
+   *
+   *
+   *  Segments
+   *
+   *    `af_{cjk,latin,...}_hints_compute_segments' are the functions to
+   *    find segments in an outline.  A segment is a series of consecutive
+   *    points that are approximately aligned along a coordinate axis.  The
+   *    analysis to do so is specific to a script.
+   *
+   *    A segment must have at least two points, except in the case of
+   *    `fake' segments that are generated to hint metrics appropriately,
+   *    and which consist of a single point.
+   *
+   *
+   *  Edges
+   *
+   *    As soon as segments are defined, the auto-hinter groups them into
+   *    edges.  An edge corresponds to a single position on the main
+   *    dimension that collects one or more segments (allowing for a small
+   *    threshold).
+   *
+   *    The auto-hinter first tries to grid fit edges, then to align
+   *    segments on the edges unless it detects that they form a serif.
+   *
+   *    `af_{cjk,latin,...}_hints_compute_edges' are the functions to find
+   *    edges; they are specific to a script.
+   *
+   *
+   *                      A          H
+   *                       |        |
+   *                       |        |
+   *                       |        |
+   *                       |        |
+   *         C             |        |             F
+   *          +------<-----+        +-----<------+
+   *          |             B      G             |
+   *          |                                  |
+   *          |                                  |
+   *          +--------------->------------------+
+   *         D                                    E
+   *
+   *
+   *  Stems
+   *
+   *    Segments need to be `linked' to other ones in order to detect stems.
+   *    A stem is made of two segments that face each other in opposite
+   *    directions and that are sufficiently close to each other.  Using
+   *    vocabulary from the TrueType specification, stem segments form a
+   *    `black distance'.
+   *
+   *    In the above ASCII drawing, the horizontal segments are BC, DE, and
+   *    FG; the vertical segments are AB, CD, EF, and GH.
+   *
+   *    Each segment has at most one `best' candidate to form a black
+   *    distance, or no candidate at all.  Notice that two distinct segments
+   *    can have the same candidate, which frequently means a serif.
+   *
+   *    A stem is recognized by the following condition:
+   *
+   *      best segment_1 = segment_2 && best segment_2 = segment_1
+   *
+   *    The best candidate is stored in field `link' in structure
+   *    `AF_Segment'.
+   *
+   *    Stems are detected by `af_{cjk,latin,...}_hint_edges'.
+   *
+   *    In the above ASCII drawing, the best candidate for both AB and CD is
+   *    GH, while the best candidate for GH is AB.  Similarly, the best
+   *    candidate for EF and GH is AB, while the best candidate for AB is
+   *    GH.
+   *
+   *
+   *  Serifs
+   *
+   *    On the opposite, a serif has
+   *
+   *      best segment_1 = segment_2 && best segment_2 != segment_1
+   *
+   *    where segment_1 corresponds to the serif segment (CD and EF in the
+   *    above ASCII drawing).
+   *
+   *    The best candidate is stored in field `serif' in structure
+   *    `AF_Segment' (and `link' is set to NULL).
+   *
+   *    Serifs are detected by `af_{cjk,latin,...}_hint_edges'.
+   *
+   *
+   *  Touched points
+   *
+   *    A point is called `touched' if it has been processed somehow by the
+   *    auto-hinter.  It basically means that it shouldn't be moved again
+   *    (or moved only under certain constraints to preserve the already
+   *    applied processing).
+   *
+   *
+   *  Flat and round segments
+   *
+   *    Segments are `round' or `flat', depending on the series of points
+   *    that define them.  A segment is round if the next and previous point
+   *    of an extremum (which can be either a single point or sequence of
+   *    points) are both conic or cubic control points.  Otherwise, a
+   *    segment with an extremum is flat.
+   *
+   *
+   *  Strong Points
+   *
+   *    Experience has shown that points which are not part of an edge need
+   *    to be interpolated linearly between their two closest edges, even if
+   *    these are not part of the contour of those particular points.
+   *    Typical candidates for this are
+   *
+   *    - angle points (i.e., points where the `in' and `out' direction
+   *      differ greatly)
+   *
+   *    - inflection points (i.e., where the `in' and `out' angles are the
+   *      same, but the curvature changes sign)
+   *
+   *    `af_glyph_hints_align_strong_points' is the function which takes
+   *    care of such situations; it is equivalent to the TrueType `IP'
+   *    hinting instruction.
+   *
+   *
+   *  Weak Points
+   *
+   *    Other points in the outline must be interpolated using the
+   *    coordinates of their previous and next unfitted contour neighbours.
+   *    These are called `weak points' and are touched by the function
+   *    `af_glyph_hints_align_weak_points', equivalent to the TrueType `IUP'
+   *    hinting instruction.  Typical candidates are control points and
+   *    points on the contour without a major direction.
+   *
+   *    The major effect is to reduce possible distortion caused by
+   *    alignment of edges and strong points, thus weak points are processed
+   *    after strong points.
+   */
+
+
+  /* point hint flags */
+  typedef enum  AF_Flags_
+  {
+    AF_FLAG_NONE = 0,
+
+    /* point type flags */
+    AF_FLAG_CONIC   = 1 << 0,
+    AF_FLAG_CUBIC   = 1 << 1,
+    AF_FLAG_CONTROL = AF_FLAG_CONIC | AF_FLAG_CUBIC,
+
+    /* point extremum flags */
+    AF_FLAG_EXTREMA_X = 1 << 2,
+    AF_FLAG_EXTREMA_Y = 1 << 3,
+
+    /* point roundness flags */
+    AF_FLAG_ROUND_X = 1 << 4,
+    AF_FLAG_ROUND_Y = 1 << 5,
+
+    /* point touch flags */
+    AF_FLAG_TOUCH_X = 1 << 6,
+    AF_FLAG_TOUCH_Y = 1 << 7,
+
+    /* candidates for weak interpolation have this flag set */
+    AF_FLAG_WEAK_INTERPOLATION = 1 << 8,
+
+    /* all inflection points in the outline have this flag set */
+    AF_FLAG_INFLECTION = 1 << 9
+
+  } AF_Flags;
+
+
+  /* edge hint flags */
+  typedef enum  AF_Edge_Flags_
+  {
+    AF_EDGE_NORMAL = 0,
+    AF_EDGE_ROUND  = 1 << 0,
+    AF_EDGE_SERIF  = 1 << 1,
+    AF_EDGE_DONE   = 1 << 2
+
+  } AF_Edge_Flags;
+
+
+  typedef struct AF_PointRec_*    AF_Point;
+  typedef struct AF_SegmentRec_*  AF_Segment;
+  typedef struct AF_EdgeRec_*     AF_Edge;
+
+
+  typedef struct  AF_PointRec_
+  {
+    FT_UShort  flags;    /* point flags used by hinter   */
+    FT_Char    in_dir;   /* direction of inwards vector  */
+    FT_Char    out_dir;  /* direction of outwards vector */
+
+    FT_Pos     ox, oy;   /* original, scaled position                   */
+    FT_Short   fx, fy;   /* original, unscaled position (font units)    */
+    FT_Pos     x, y;     /* current position                            */
+    FT_Pos     u, v;     /* current (x,y) or (y,x) depending on context */
+
+    AF_Point   next;     /* next point in contour     */
+    AF_Point   prev;     /* previous point in contour */
+
+  } AF_PointRec;
+
+
+  typedef struct  AF_SegmentRec_
+  {
+    FT_Byte     flags;       /* edge/segment flags for this segment */
+    FT_Char     dir;         /* segment direction                   */
+    FT_Short    pos;         /* position of segment                 */
+    FT_Short    min_coord;   /* minimum coordinate of segment       */
+    FT_Short    max_coord;   /* maximum coordinate of segment       */
+    FT_Short    height;      /* the hinted segment height           */
+
+    AF_Edge     edge;        /* the segment's parent edge           */
+    AF_Segment  edge_next;   /* link to next segment in parent edge */
+
+    AF_Segment  link;        /* (stem) link segment        */
+    AF_Segment  serif;       /* primary segment for serifs */
+    FT_Pos      num_linked;  /* number of linked segments  */
+    FT_Pos      score;       /* used during stem matching  */
+    FT_Pos      len;         /* used during stem matching  */
+
+    AF_Point    first;       /* first point in edge segment */
+    AF_Point    last;        /* last point in edge segment  */
+
+  } AF_SegmentRec;
+
+
+  typedef struct  AF_EdgeRec_
+  {
+    FT_Short    fpos;       /* original, unscaled position (font units) */
+    FT_Pos      opos;       /* original, scaled position                */
+    FT_Pos      pos;        /* current position                         */
+
+    FT_Byte     flags;      /* edge flags                                   */
+    FT_Char     dir;        /* edge direction                               */
+    FT_Fixed    scale;      /* used to speed up interpolation between edges */
+    AF_Width    blue_edge;  /* non-NULL if this is a blue edge              */
+
+    AF_Edge     link;       /* link edge                 */
+    AF_Edge     serif;      /* primary edge for serifs   */
+    FT_Short    num_linked; /* number of linked edges    */
+    FT_Int      score;      /* used during stem matching */
+
+    AF_Segment  first;      /* first segment in edge */
+    AF_Segment  last;       /* last segment in edge  */
+
+  } AF_EdgeRec;
+
+
+  typedef struct  AF_AxisHintsRec_
+  {
+    FT_Int        num_segments; /* number of used segments      */
+    FT_Int        max_segments; /* number of allocated segments */
+    AF_Segment    segments;     /* segments array               */
+#ifdef AF_SORT_SEGMENTS
+    FT_Int        mid_segments;
+#endif
+
+    FT_Int        num_edges;    /* number of used edges      */
+    FT_Int        max_edges;    /* number of allocated edges */
+    AF_Edge       edges;        /* edges array               */
+
+    AF_Direction  major_dir;    /* either vertical or horizontal */
+
+  } AF_AxisHintsRec, *AF_AxisHints;
+
+
+  typedef struct  AF_GlyphHintsRec_
+  {
+    FT_Memory         memory;
+
+    FT_Fixed          x_scale;
+    FT_Pos            x_delta;
+
+    FT_Fixed          y_scale;
+    FT_Pos            y_delta;
+
+    FT_Int            max_points;    /* number of allocated points */
+    FT_Int            num_points;    /* number of used points      */
+    AF_Point          points;        /* points array               */
+
+    FT_Int            max_contours;  /* number of allocated contours */
+    FT_Int            num_contours;  /* number of used contours      */
+    AF_Point*         contours;      /* contours array               */
+
+    AF_AxisHintsRec   axis[AF_DIMENSION_MAX];
+
+    FT_UInt32         scaler_flags;  /* copy of scaler flags     */
+    FT_UInt32         other_flags;   /* free for script-specific */
+                                     /* implementations          */
+    AF_ScriptMetrics  metrics;
+
+    FT_Pos            xmin_delta;    /* used for warping */
+    FT_Pos            xmax_delta;
+
+  } AF_GlyphHintsRec;
+
+
+#define AF_HINTS_TEST_SCALER( h, f )  ( (h)->scaler_flags & (f) )
+#define AF_HINTS_TEST_OTHER( h, f )   ( (h)->other_flags  & (f) )
+
+
+#ifdef FT_DEBUG_AUTOFIT
+
+#define AF_HINTS_DO_HORIZONTAL( h )                                     \
+          ( !_af_debug_disable_horz_hints                            && \
+            !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) )
+
+#define AF_HINTS_DO_VERTICAL( h )                                     \
+          ( !_af_debug_disable_vert_hints                          && \
+            !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) )
+
+#define AF_HINTS_DO_ADVANCE( h )                                \
+          !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE )
+
+#define AF_HINTS_DO_BLUES( h )  ( !_af_debug_disable_blue_hints )
+
+#else /* !FT_DEBUG_AUTOFIT */
+
+#define AF_HINTS_DO_HORIZONTAL( h )                                \
+          !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL )
+
+#define AF_HINTS_DO_VERTICAL( h )                                \
+          !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL )
+
+#define AF_HINTS_DO_ADVANCE( h )                                \
+          !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE )
+
+#define AF_HINTS_DO_BLUES( h )  1
+
+#endif /* !FT_DEBUG_AUTOFIT */
+
+
+  FT_LOCAL( AF_Direction )
+  af_direction_compute( FT_Pos  dx,
+                        FT_Pos  dy );
+
+
+  FT_LOCAL( FT_Error )
+  af_axis_hints_new_segment( AF_AxisHints  axis,
+                             FT_Memory     memory,
+                             AF_Segment   *asegment );
+
+  FT_LOCAL( FT_Error)
+  af_axis_hints_new_edge( AF_AxisHints  axis,
+                          FT_Int        fpos,
+                          AF_Direction  dir,
+                          FT_Memory     memory,
+                          AF_Edge      *edge );
+
+  FT_LOCAL( void )
+  af_glyph_hints_init( AF_GlyphHints  hints,
+                       FT_Memory      memory );
+
+  FT_LOCAL( void )
+  af_glyph_hints_rescale( AF_GlyphHints     hints,
+                          AF_ScriptMetrics  metrics );
+
+  FT_LOCAL( FT_Error )
+  af_glyph_hints_reload( AF_GlyphHints  hints,
+                         FT_Outline*    outline );
+
+  FT_LOCAL( void )
+  af_glyph_hints_save( AF_GlyphHints  hints,
+                       FT_Outline*    outline );
+
+  FT_LOCAL( void )
+  af_glyph_hints_align_edge_points( AF_GlyphHints  hints,
+                                    AF_Dimension   dim );
+
+  FT_LOCAL( void )
+  af_glyph_hints_align_strong_points( AF_GlyphHints  hints,
+                                      AF_Dimension   dim );
+
+  FT_LOCAL( void )
+  af_glyph_hints_align_weak_points( AF_GlyphHints  hints,
+                                    AF_Dimension   dim );
+
+#ifdef AF_CONFIG_OPTION_USE_WARPER
+  FT_LOCAL( void )
+  af_glyph_hints_scale_dim( AF_GlyphHints  hints,
+                            AF_Dimension   dim,
+                            FT_Fixed       scale,
+                            FT_Pos         delta );
+#endif
+
+  FT_LOCAL( void )
+  af_glyph_hints_done( AF_GlyphHints  hints );
+
+/* */
+
+#define AF_SEGMENT_LEN( seg )          ( (seg)->max_coord - (seg)->min_coord )
+
+#define AF_SEGMENT_DIST( seg1, seg2 )  ( ( (seg1)->pos > (seg2)->pos )   \
+                                           ? (seg1)->pos - (seg2)->pos   \
+                                           : (seg2)->pos - (seg1)->pos )
+
+
+FT_END_HEADER
+
+#endif /* __AFHINTS_H__ */
+
+
+/* END */
diff --git a/src/autofit/afindic.c b/src/autofit/afindic.c
new file mode 100644 (file)
index 0000000..9c74838
--- /dev/null
@@ -0,0 +1,155 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afindic.c                                                              */
+/*                                                                         */
+/*    Auto-fitter hinting routines for Indic scripts (body).               */
+/*                                                                         */
+/*  Copyright 2007, 2011 by                                                */
+/*  Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>.    */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "aftypes.h"
+#include "aflatin.h"
+
+
+#ifdef AF_CONFIG_OPTION_INDIC
+
+#include "afindic.h"
+#include "aferrors.h"
+#include "afcjk.h"
+
+
+#ifdef AF_CONFIG_OPTION_USE_WARPER
+#include "afwarp.h"
+#endif
+
+
+  static FT_Error
+  af_indic_metrics_init( AF_CJKMetrics  metrics,
+                         FT_Face        face )
+  {
+    /* skip blue zone init in CJK routines */
+    FT_CharMap  oldmap = face->charmap;
+
+
+    metrics->units_per_em = face->units_per_EM;
+
+    if ( FT_Select_Charmap( face, FT_ENCODING_UNICODE ) )
+      face->charmap = NULL;
+    else
+    {
+      af_cjk_metrics_init_widths( metrics, face, 0x7530 );
+#if 0
+      /* either need indic specific blue_chars[] or just skip blue zones */
+      af_cjk_metrics_init_blues( metrics, face, af_cjk_blue_chars );
+#endif
+      af_cjk_metrics_check_digits( metrics, face );
+    }
+
+    FT_Set_Charmap( face, oldmap );
+
+    return AF_Err_Ok;
+  }
+
+
+  static void
+  af_indic_metrics_scale( AF_CJKMetrics  metrics,
+                          AF_Scaler      scaler )
+  {
+    /* use CJK routines */
+    af_cjk_metrics_scale( metrics, scaler );
+  }
+
+
+  static FT_Error
+  af_indic_hints_init( AF_GlyphHints  hints,
+                       AF_CJKMetrics  metrics )
+  {
+    /* use CJK routines */
+    return af_cjk_hints_init( hints, metrics );
+  }
+
+
+  static FT_Error
+  af_indic_hints_apply( AF_GlyphHints  hints,
+                        FT_Outline*    outline,
+                        AF_CJKMetrics  metrics )
+  {
+    /* use CJK routines */
+    return af_cjk_hints_apply( hints, outline, metrics );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                I N D I C   S C R I P T   C L A S S            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  static const AF_Script_UniRangeRec  af_indic_uniranges[] =
+  {
+#if 0
+    AF_UNIRANGE_REC( 0x0100UL, 0xFFFFUL ),  /* why this? */
+#endif
+    AF_UNIRANGE_REC( 0x0900UL, 0x0DFFUL),    /* Indic Range */
+    AF_UNIRANGE_REC( 0x0F00UL, 0x0FFFUL),    /* Tibetan */
+    AF_UNIRANGE_REC( 0x1900UL, 0x194FUL),    /* Limbu */
+    AF_UNIRANGE_REC( 0x1B80UL, 0x1BBFUL),    /* Sundanese */
+    AF_UNIRANGE_REC( 0x1C80UL, 0x1CDFUL),    /* Meetei Mayak */
+    AF_UNIRANGE_REC( 0xA800UL, 0xA82FUL),    /* Syloti Nagri */
+    AF_UNIRANGE_REC( 0x11800UL, 0x118DFUL),  /* Sharada */
+    AF_UNIRANGE_REC(      0UL,      0UL)
+  };
+
+
+  AF_DEFINE_SCRIPT_CLASS( af_indic_script_class,
+    AF_SCRIPT_INDIC,
+    af_indic_uniranges,
+
+    sizeof ( AF_CJKMetricsRec ),
+
+    (AF_Script_InitMetricsFunc) af_indic_metrics_init,
+    (AF_Script_ScaleMetricsFunc)af_indic_metrics_scale,
+    (AF_Script_DoneMetricsFunc) NULL,
+
+    (AF_Script_InitHintsFunc)   af_indic_hints_init,
+    (AF_Script_ApplyHintsFunc)  af_indic_hints_apply
+  )
+
+#else /* !AF_CONFIG_OPTION_INDIC */
+
+  static const AF_Script_UniRangeRec  af_indic_uniranges[] =
+  {
+    { 0, 0 }
+  };
+
+
+  AF_DEFINE_SCRIPT_CLASS( af_indic_script_class,
+    AF_SCRIPT_INDIC,
+    af_indic_uniranges,
+
+    sizeof ( AF_CJKMetricsRec ),
+
+    (AF_Script_InitMetricsFunc) NULL,
+    (AF_Script_ScaleMetricsFunc)NULL,
+    (AF_Script_DoneMetricsFunc) NULL,
+
+    (AF_Script_InitHintsFunc)   NULL,
+    (AF_Script_ApplyHintsFunc)  NULL
+  )
+
+#endif /* !AF_CONFIG_OPTION_INDIC */
+
+
+/* END */
diff --git a/src/autofit/afindic.h b/src/autofit/afindic.h
new file mode 100644 (file)
index 0000000..662a982
--- /dev/null
@@ -0,0 +1,40 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afindic.h                                                              */
+/*                                                                         */
+/*    Auto-fitter hinting routines for Indic scripts (specification).      */
+/*                                                                         */
+/*  Copyright 2007 by                                                      */
+/*  Rahul Bhalerao <rahul.bhalerao@redhat.com>, <b.rahul.pm@gmail.com>.    */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __AFINDIC_H__
+#define __AFINDIC_H__
+
+#include "afhints.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /* the Indic-specific script class */
+
+  AF_DECLARE_SCRIPT_CLASS(af_indic_script_class)
+
+
+/* */
+
+FT_END_HEADER
+
+#endif /* __AFINDIC_H__ */
+
+
+/* END */
diff --git a/src/autofit/aflatin.c b/src/autofit/aflatin.c
new file mode 100644 (file)
index 0000000..30145a2
--- /dev/null
@@ -0,0 +1,2359 @@
+/***************************************************************************/
+/*                                                                         */
+/*  aflatin.c                                                              */
+/*                                                                         */
+/*    Auto-fitter hinting routines for latin script (body).                */
+/*                                                                         */
+/*  Copyright 2003-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_ADVANCES_H
+#include FT_INTERNAL_DEBUG_H
+
+#include "aflatin.h"
+#include "aferrors.h"
+
+
+#ifdef AF_CONFIG_OPTION_USE_WARPER
+#include "afwarp.h"
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_aflatin
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****            L A T I N   G L O B A L   M E T R I C S            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* Find segments and links, compute all stem widths, and initialize */
+  /* standard width and height for the glyph with given charcode.     */
+
+  FT_LOCAL_DEF( void )
+  af_latin_metrics_init_widths( AF_LatinMetrics  metrics,
+                                FT_Face          face,
+                                FT_ULong         charcode )
+  {
+    /* scan the array of segments in each direction */
+    AF_GlyphHintsRec  hints[1];
+
+
+    af_glyph_hints_init( hints, face->memory );
+
+    metrics->axis[AF_DIMENSION_HORZ].width_count = 0;
+    metrics->axis[AF_DIMENSION_VERT].width_count = 0;
+
+    {
+      FT_Error             error;
+      FT_UInt              glyph_index;
+      int                  dim;
+      AF_LatinMetricsRec   dummy[1];
+      AF_Scaler            scaler = &dummy->root.scaler;
+
+
+      glyph_index = FT_Get_Char_Index( face, charcode );
+      if ( glyph_index == 0 )
+        goto Exit;
+
+      error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
+      if ( error || face->glyph->outline.n_points <= 0 )
+        goto Exit;
+
+      FT_ZERO( dummy );
+
+      dummy->units_per_em = metrics->units_per_em;
+
+      scaler->x_scale = 0x10000L;
+      scaler->y_scale = 0x10000L;
+      scaler->x_delta = 0;
+      scaler->y_delta = 0;
+
+      scaler->face        = face;
+      scaler->render_mode = FT_RENDER_MODE_NORMAL;
+      scaler->flags       = 0;
+
+      af_glyph_hints_rescale( hints, (AF_ScriptMetrics)dummy );
+
+      error = af_glyph_hints_reload( hints, &face->glyph->outline );
+      if ( error )
+        goto Exit;
+
+      for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )
+      {
+        AF_LatinAxis  axis    = &metrics->axis[dim];
+        AF_AxisHints  axhints = &hints->axis[dim];
+        AF_Segment    seg, limit, link;
+        FT_UInt       num_widths = 0;
+
+
+        error = af_latin_hints_compute_segments( hints,
+                                                 (AF_Dimension)dim );
+        if ( error )
+          goto Exit;
+
+        af_latin_hints_link_segments( hints,
+                                      (AF_Dimension)dim );
+
+        seg   = axhints->segments;
+        limit = seg + axhints->num_segments;
+
+        for ( ; seg < limit; seg++ )
+        {
+          link = seg->link;
+
+          /* we only consider stem segments there! */
+          if ( link && link->link == seg && link > seg )
+          {
+            FT_Pos  dist;
+
+
+            dist = seg->pos - link->pos;
+            if ( dist < 0 )
+              dist = -dist;
+
+            if ( num_widths < AF_LATIN_MAX_WIDTHS )
+              axis->widths[num_widths++].org = dist;
+          }
+        }
+
+        af_sort_widths( num_widths, axis->widths );
+        axis->width_count = num_widths;
+      }
+
+  Exit:
+      for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )
+      {
+        AF_LatinAxis  axis = &metrics->axis[dim];
+        FT_Pos        stdw;
+
+
+        stdw = ( axis->width_count > 0 )
+                 ? axis->widths[0].org
+                 : AF_LATIN_CONSTANT( metrics, 50 );
+
+        /* let's try 20% of the smallest width */
+        axis->edge_distance_threshold = stdw / 5;
+        axis->standard_width          = stdw;
+        axis->extra_light             = 0;
+      }
+    }
+
+    af_glyph_hints_done( hints );
+  }
+
+
+
+#define AF_LATIN_MAX_TEST_CHARACTERS  12
+
+
+  static const char af_latin_blue_chars[AF_LATIN_MAX_BLUES]
+                                       [AF_LATIN_MAX_TEST_CHARACTERS + 1] =
+  {
+    "THEZOCQS",
+    "HEZLOCUS",
+    "fijkdbh",
+    "xzroesc",
+    "xzroesc",
+    "pqgjy"
+  };
+
+
+  /* Find all blue zones.  Flat segments give the reference points, */
+  /* round segments the overshoot positions.                        */
+
+  static void
+  af_latin_metrics_init_blues( AF_LatinMetrics  metrics,
+                               FT_Face          face )
+  {
+    FT_Pos        flats [AF_LATIN_MAX_TEST_CHARACTERS];
+    FT_Pos        rounds[AF_LATIN_MAX_TEST_CHARACTERS];
+    FT_Int        num_flats;
+    FT_Int        num_rounds;
+    FT_Int        bb;
+    AF_LatinBlue  blue;
+    FT_Error      error;
+    AF_LatinAxis  axis  = &metrics->axis[AF_DIMENSION_VERT];
+    FT_GlyphSlot  glyph = face->glyph;
+
+
+    /* we compute the blues simply by loading each character from the    */
+    /* `af_latin_blue_chars[blues]' string, then finding its top-most or */
+    /* bottom-most points (depending on `AF_IS_TOP_BLUE')                */
+
+    FT_TRACE5(( "blue zones computation\n" ));
+    FT_TRACE5(( "------------------------------------------------\n" ));
+
+    for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ )
+    {
+      const char*  p     = af_latin_blue_chars[bb];
+      const char*  limit = p + AF_LATIN_MAX_TEST_CHARACTERS;
+      FT_Pos*      blue_ref;
+      FT_Pos*      blue_shoot;
+
+
+      FT_TRACE5(( "blue %3d: ", bb ));
+
+      num_flats  = 0;
+      num_rounds = 0;
+
+      for ( ; p < limit && *p; p++ )
+      {
+        FT_UInt     glyph_index;
+        FT_Pos      best_y;                            /* same as points.y */
+        FT_Int      best_point, best_first, best_last;
+        FT_Vector*  points;
+        FT_Bool     round = 0;
+
+
+        FT_TRACE5(( "'%c'", *p ));
+
+        /* load the character in the face -- skip unknown or empty ones */
+        glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p );
+        if ( glyph_index == 0 )
+          continue;
+
+        error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
+        if ( error || glyph->outline.n_points <= 0 )
+          continue;
+
+        /* now compute min or max point indices and coordinates */
+        points      = glyph->outline.points;
+        best_point  = -1;
+        best_y      = 0;  /* make compiler happy */
+        best_first  = 0;  /* ditto */
+        best_last   = 0;  /* ditto */
+
+        {
+          FT_Int  nn;
+          FT_Int  first = 0;
+          FT_Int  last  = -1;
+
+
+          for ( nn = 0;
+                nn < glyph->outline.n_contours;
+                first = last + 1, nn++ )
+          {
+            FT_Int  old_best_point = best_point;
+            FT_Int  pp;
+
+
+            last = glyph->outline.contours[nn];
+
+            /* Avoid single-point contours since they are never rasterized. */
+            /* In some fonts, they correspond to mark attachment points     */
+            /* which are way outside of the glyph's real outline.           */
+            if ( last <= first )
+              continue;
+
+            if ( AF_LATIN_IS_TOP_BLUE( bb ) )
+            {
+              for ( pp = first; pp <= last; pp++ )
+                if ( best_point < 0 || points[pp].y > best_y )
+                {
+                  best_point = pp;
+                  best_y     = points[pp].y;
+                }
+            }
+            else
+            {
+              for ( pp = first; pp <= last; pp++ )
+                if ( best_point < 0 || points[pp].y < best_y )
+                {
+                  best_point = pp;
+                  best_y     = points[pp].y;
+                }
+            }
+
+            if ( best_point != old_best_point )
+            {
+              best_first = first;
+              best_last  = last;
+            }
+          }
+          FT_TRACE5(( "%5d", best_y ));
+        }
+
+        /* now check whether the point belongs to a straight or round   */
+        /* segment; we first need to find in which contour the extremum */
+        /* lies, then inspect its previous and next points              */
+        if ( best_point >= 0 )
+        {
+          FT_Int  prev, next;
+          FT_Pos  dist;
+
+
+          /* now look for the previous and next points that are not on the */
+          /* same Y coordinate.  Threshold the `closeness'...              */
+          prev = best_point;
+          next = prev;
+
+          do
+          {
+            if ( prev > best_first )
+              prev--;
+            else
+              prev = best_last;
+
+            dist = points[prev].y - best_y;
+            if ( dist < -5 || dist > 5 )
+              break;
+
+          } while ( prev != best_point );
+
+          do
+          {
+            if ( next < best_last )
+              next++;
+            else
+              next = best_first;
+
+            dist = points[next].y - best_y;
+            if ( dist < -5 || dist > 5 )
+              break;
+
+          } while ( next != best_point );
+
+          /* now set the `round' flag depending on the segment's kind */
+          round = FT_BOOL(
+            FT_CURVE_TAG( glyph->outline.tags[prev] ) != FT_CURVE_TAG_ON ||
+            FT_CURVE_TAG( glyph->outline.tags[next] ) != FT_CURVE_TAG_ON );
+
+          FT_TRACE5(( "%c ", round ? 'r' : 'f' ));
+        }
+
+        if ( round )
+          rounds[num_rounds++] = best_y;
+        else
+          flats[num_flats++]   = best_y;
+      }
+
+      FT_TRACE5(( "\n" ));
+
+      if ( num_flats == 0 && num_rounds == 0 )
+      {
+        /*
+         *  we couldn't find a single glyph to compute this blue zone,
+         *  we will simply ignore it then
+         */
+        FT_TRACE5(( "empty\n" ));
+        continue;
+      }
+
+      /* we have computed the contents of the `rounds' and `flats' tables, */
+      /* now determine the reference and overshoot position of the blue -- */
+      /* we simply take the median value after a simple sort               */
+      af_sort_pos( num_rounds, rounds );
+      af_sort_pos( num_flats,  flats );
+
+      blue       = &axis->blues[axis->blue_count];
+      blue_ref   = &blue->ref.org;
+      blue_shoot = &blue->shoot.org;
+
+      axis->blue_count++;
+
+      if ( num_flats == 0 )
+      {
+        *blue_ref   =
+        *blue_shoot = rounds[num_rounds / 2];
+      }
+      else if ( num_rounds == 0 )
+      {
+        *blue_ref   =
+        *blue_shoot = flats[num_flats / 2];
+      }
+      else
+      {
+        *blue_ref   = flats[num_flats / 2];
+        *blue_shoot = rounds[num_rounds / 2];
+      }
+
+      /* there are sometimes problems: if the overshoot position of top     */
+      /* zones is under its reference position, or the opposite for bottom  */
+      /* zones.  We must thus check everything there and correct the errors */
+      if ( *blue_shoot != *blue_ref )
+      {
+        FT_Pos   ref      = *blue_ref;
+        FT_Pos   shoot    = *blue_shoot;
+        FT_Bool  over_ref = FT_BOOL( shoot > ref );
+
+
+        if ( AF_LATIN_IS_TOP_BLUE( bb ) ^ over_ref )
+          *blue_ref   =
+          *blue_shoot = ( shoot + ref ) / 2;
+      }
+
+      blue->flags = 0;
+      if ( AF_LATIN_IS_TOP_BLUE( bb ) )
+        blue->flags |= AF_LATIN_BLUE_TOP;
+
+      /*
+       * The following flag is used later to adjust the y and x scales
+       * in order to optimize the pixel grid alignment of the top of small
+       * letters.
+       */
+      if ( bb == AF_LATIN_BLUE_SMALL_TOP )
+        blue->flags |= AF_LATIN_BLUE_ADJUSTMENT;
+
+      FT_TRACE5(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot ));
+    }
+
+    FT_TRACE5(( "\n" ));
+
+    return;
+  }
+
+
+  /* Check whether all ASCII digits have the same advance width. */
+
+  FT_LOCAL_DEF( void )
+  af_latin_metrics_check_digits( AF_LatinMetrics  metrics,
+                                 FT_Face          face )
+  {
+    FT_UInt   i;
+    FT_Bool   started = 0, same_width = 1;
+    FT_Fixed  advance, old_advance = 0;
+
+
+    /* digit `0' is 0x30 in all supported charmaps */
+    for ( i = 0x30; i <= 0x39; i++ )
+    {
+      FT_UInt  glyph_index;
+
+
+      glyph_index = FT_Get_Char_Index( face, i );
+      if ( glyph_index == 0 )
+        continue;
+
+      if ( FT_Get_Advance( face, glyph_index,
+                           FT_LOAD_NO_SCALE         |
+                           FT_LOAD_NO_HINTING       |
+                           FT_LOAD_IGNORE_TRANSFORM,
+                           &advance ) )
+        continue;
+
+      if ( started )
+      {
+        if ( advance != old_advance )
+        {
+          same_width = 0;
+          break;
+        }
+      }
+      else
+      {
+        old_advance = advance;
+        started     = 1;
+      }
+    }
+
+    metrics->root.digits_have_same_width = same_width;
+  }
+
+
+  /* Initialize global metrics. */
+
+  FT_LOCAL_DEF( FT_Error )
+  af_latin_metrics_init( AF_LatinMetrics  metrics,
+                         FT_Face          face )
+  {
+    FT_Error    error = AF_Err_Ok;
+    FT_CharMap  oldmap = face->charmap;
+    FT_UInt     ee;
+
+    static const FT_Encoding  latin_encodings[] =
+    {
+      FT_ENCODING_UNICODE,
+      FT_ENCODING_APPLE_ROMAN,
+      FT_ENCODING_ADOBE_STANDARD,
+      FT_ENCODING_ADOBE_LATIN_1,
+
+      FT_ENCODING_NONE  /* end of list */
+    };
+
+
+    metrics->units_per_em = face->units_per_EM;
+
+    /* do we have a latin charmap in there? */
+    for ( ee = 0; latin_encodings[ee] != FT_ENCODING_NONE; ee++ )
+    {
+      error = FT_Select_Charmap( face, latin_encodings[ee] );
+      if ( !error )
+        break;
+    }
+
+    if ( !error )
+    {
+      /* For now, compute the standard width and height from the `o'. */
+      af_latin_metrics_init_widths( metrics, face, 'o' );
+      af_latin_metrics_init_blues( metrics, face );
+      af_latin_metrics_check_digits( metrics, face );
+    }
+
+    FT_Set_Charmap( face, oldmap );
+    return AF_Err_Ok;
+  }
+
+
+  /* Adjust scaling value, then scale and shift widths   */
+  /* and blue zones (if applicable) for given dimension. */
+
+  static void
+  af_latin_metrics_scale_dim( AF_LatinMetrics  metrics,
+                              AF_Scaler        scaler,
+                              AF_Dimension     dim )
+  {
+    FT_Fixed      scale;
+    FT_Pos        delta;
+    AF_LatinAxis  axis;
+    FT_UInt       nn;
+
+
+    if ( dim == AF_DIMENSION_HORZ )
+    {
+      scale = scaler->x_scale;
+      delta = scaler->x_delta;
+    }
+    else
+    {
+      scale = scaler->y_scale;
+      delta = scaler->y_delta;
+    }
+
+    axis = &metrics->axis[dim];
+
+    if ( axis->org_scale == scale && axis->org_delta == delta )
+      return;
+
+    axis->org_scale = scale;
+    axis->org_delta = delta;
+
+    /*
+     * correct X and Y scale to optimize the alignment of the top of small
+     * letters to the pixel grid
+     */
+    {
+      AF_LatinAxis  Axis = &metrics->axis[AF_DIMENSION_VERT];
+      AF_LatinBlue  blue = NULL;
+
+
+      for ( nn = 0; nn < Axis->blue_count; nn++ )
+      {
+        if ( Axis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT )
+        {
+          blue = &Axis->blues[nn];
+          break;
+        }
+      }
+
+      if ( blue )
+      {
+        FT_Pos  scaled = FT_MulFix( blue->shoot.org, scaler->y_scale );
+        FT_Pos  fitted = ( scaled + 40 ) & ~63;
+
+
+        if ( scaled != fitted )
+        {
+#if 0
+          if ( dim == AF_DIMENSION_HORZ )
+          {
+            if ( fitted < scaled )
+              scale -= scale / 50;  /* scale *= 0.98 */
+          }
+          else
+#endif
+          if ( dim == AF_DIMENSION_VERT )
+            scale = FT_MulDiv( scale, fitted, scaled );
+        }
+      }
+    }
+
+    axis->scale = scale;
+    axis->delta = delta;
+
+    if ( dim == AF_DIMENSION_HORZ )
+    {
+      metrics->root.scaler.x_scale = scale;
+      metrics->root.scaler.x_delta = delta;
+    }
+    else
+    {
+      metrics->root.scaler.y_scale = scale;
+      metrics->root.scaler.y_delta = delta;
+    }
+
+    /* scale the widths */
+    for ( nn = 0; nn < axis->width_count; nn++ )
+    {
+      AF_Width  width = axis->widths + nn;
+
+
+      width->cur = FT_MulFix( width->org, scale );
+      width->fit = width->cur;
+    }
+
+    /* an extra-light axis corresponds to a standard width that is */
+    /* smaller than 5/8 pixels                                     */
+    axis->extra_light =
+      (FT_Bool)( FT_MulFix( axis->standard_width, scale ) < 32 + 8 );
+
+    if ( dim == AF_DIMENSION_VERT )
+    {
+      /* scale the blue zones */
+      for ( nn = 0; nn < axis->blue_count; nn++ )
+      {
+        AF_LatinBlue  blue = &axis->blues[nn];
+        FT_Pos        dist;
+
+
+        blue->ref.cur   = FT_MulFix( blue->ref.org, scale ) + delta;
+        blue->ref.fit   = blue->ref.cur;
+        blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta;
+        blue->shoot.fit = blue->shoot.cur;
+        blue->flags    &= ~AF_LATIN_BLUE_ACTIVE;
+
+        /* a blue zone is only active if it is less than 3/4 pixels tall */
+        dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale );
+        if ( dist <= 48 && dist >= -48 )
+        {
+#if 0
+          FT_Pos  delta1;
+#endif
+          FT_Pos  delta2;
+
+
+          /* use discrete values for blue zone widths */
+
+#if 0
+
+          /* generic, original code */
+          delta1 = blue->shoot.org - blue->ref.org;
+          delta2 = delta1;
+          if ( delta1 < 0 )
+            delta2 = -delta2;
+
+          delta2 = FT_MulFix( delta2, scale );
+
+          if ( delta2 < 32 )
+            delta2 = 0;
+          else if ( delta2 < 64 )
+            delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 );
+          else
+            delta2 = FT_PIX_ROUND( delta2 );
+
+          if ( delta1 < 0 )
+            delta2 = -delta2;
+
+          blue->ref.fit   = FT_PIX_ROUND( blue->ref.cur );
+          blue->shoot.fit = blue->ref.fit + delta2;
+
+#else
+
+          /* simplified version due to abs(dist) <= 48 */
+          delta2 = dist;
+          if ( dist < 0 )
+            delta2 = -delta2;
+
+          if ( delta2 < 32 )
+            delta2 = 0;
+          else if ( delta < 48 )
+            delta2 = 32;
+          else
+            delta2 = 64;
+
+          if ( dist < 0 )
+            delta2 = -delta2;
+
+          blue->ref.fit   = FT_PIX_ROUND( blue->ref.cur );
+          blue->shoot.fit = blue->ref.fit - delta2;
+
+#endif
+
+          blue->flags |= AF_LATIN_BLUE_ACTIVE;
+        }
+      }
+    }
+  }
+
+
+  /* Scale global values in both directions. */
+
+  FT_LOCAL_DEF( void )
+  af_latin_metrics_scale( AF_LatinMetrics  metrics,
+                          AF_Scaler        scaler )
+  {
+    metrics->root.scaler.render_mode = scaler->render_mode;
+    metrics->root.scaler.face        = scaler->face;
+
+    af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ );
+    af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****           L A T I N   G L Y P H   A N A L Y S I S             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* Walk over all contours and compute its segments. */
+
+  FT_LOCAL_DEF( FT_Error )
+  af_latin_hints_compute_segments( AF_GlyphHints  hints,
+                                   AF_Dimension   dim )
+  {
+    AF_AxisHints   axis          = &hints->axis[dim];
+    FT_Memory      memory        = hints->memory;
+    FT_Error       error         = AF_Err_Ok;
+    AF_Segment     segment       = NULL;
+    AF_SegmentRec  seg0;
+    AF_Point*      contour       = hints->contours;
+    AF_Point*      contour_limit = contour + hints->num_contours;
+    AF_Direction   major_dir, segment_dir;
+
+
+    FT_ZERO( &seg0 );
+    seg0.score = 32000;
+    seg0.flags = AF_EDGE_NORMAL;
+
+    major_dir   = (AF_Direction)FT_ABS( axis->major_dir );
+    segment_dir = major_dir;
+
+    axis->num_segments = 0;
+
+    /* set up (u,v) in each point */
+    if ( dim == AF_DIMENSION_HORZ )
+    {
+      AF_Point  point = hints->points;
+      AF_Point  limit = point + hints->num_points;
+
+
+      for ( ; point < limit; point++ )
+      {
+        point->u = point->fx;
+        point->v = point->fy;
+      }
+    }
+    else
+    {
+      AF_Point  point = hints->points;
+      AF_Point  limit = point + hints->num_points;
+
+
+      for ( ; point < limit; point++ )
+      {
+        point->u = point->fy;
+        point->v = point->fx;
+      }
+    }
+
+    /* do each contour separately */
+    for ( ; contour < contour_limit; contour++ )
+    {
+      AF_Point  point   =  contour[0];
+      AF_Point  last    =  point->prev;
+      int       on_edge =  0;
+      FT_Pos    min_pos =  32000;  /* minimum segment pos != min_coord */
+      FT_Pos    max_pos = -32000;  /* maximum segment pos != max_coord */
+      FT_Bool   passed;
+
+
+      if ( point == last )  /* skip singletons -- just in case */
+        continue;
+
+      if ( FT_ABS( last->out_dir )  == major_dir &&
+           FT_ABS( point->out_dir ) == major_dir )
+      {
+        /* we are already on an edge, try to locate its start */
+        last = point;
+
+        for (;;)
+        {
+          point = point->prev;
+          if ( FT_ABS( point->out_dir ) != major_dir )
+          {
+            point = point->next;
+            break;
+          }
+          if ( point == last )
+            break;
+        }
+      }
+
+      last   = point;
+      passed = 0;
+
+      for (;;)
+      {
+        FT_Pos  u, v;
+
+
+        if ( on_edge )
+        {
+          u = point->u;
+          if ( u < min_pos )
+            min_pos = u;
+          if ( u > max_pos )
+            max_pos = u;
+
+          if ( point->out_dir != segment_dir || point == last )
+          {
+            /* we are just leaving an edge; record a new segment! */
+            segment->last = point;
+            segment->pos  = (FT_Short)( ( min_pos + max_pos ) >> 1 );
+
+            /* a segment is round if either its first or last point */
+            /* is a control point                                   */
+            if ( ( segment->first->flags | point->flags ) &
+                 AF_FLAG_CONTROL                          )
+              segment->flags |= AF_EDGE_ROUND;
+
+            /* compute segment size */
+            min_pos = max_pos = point->v;
+
+            v = segment->first->v;
+            if ( v < min_pos )
+              min_pos = v;
+            if ( v > max_pos )
+              max_pos = v;
+
+            segment->min_coord = (FT_Short)min_pos;
+            segment->max_coord = (FT_Short)max_pos;
+            segment->height    = (FT_Short)( segment->max_coord -
+                                             segment->min_coord );
+
+            on_edge = 0;
+            segment = NULL;
+            /* fallthrough */
+          }
+        }
+
+        /* now exit if we are at the start/end point */
+        if ( point == last )
+        {
+          if ( passed )
+            break;
+          passed = 1;
+        }
+
+        if ( !on_edge && FT_ABS( point->out_dir ) == major_dir )
+        {
+          /* this is the start of a new segment! */
+          segment_dir = (AF_Direction)point->out_dir;
+
+          /* clear all segment fields */
+          error = af_axis_hints_new_segment( axis, memory, &segment );
+          if ( error )
+            goto Exit;
+
+          segment[0]        = seg0;
+          segment->dir      = (FT_Char)segment_dir;
+          min_pos = max_pos = point->u;
+          segment->first    = point;
+          segment->last     = point;
+          on_edge           = 1;
+        }
+
+        point = point->next;
+      }
+
+    } /* contours */
+
+
+    /* now slightly increase the height of segments when this makes */
+    /* sense -- this is used to better detect and ignore serifs     */
+    {
+      AF_Segment  segments     = axis->segments;
+      AF_Segment  segments_end = segments + axis->num_segments;
+
+
+      for ( segment = segments; segment < segments_end; segment++ )
+      {
+        AF_Point  first   = segment->first;
+        AF_Point  last    = segment->last;
+        FT_Pos    first_v = first->v;
+        FT_Pos    last_v  = last->v;
+
+
+        if ( first == last )
+          continue;
+
+        if ( first_v < last_v )
+        {
+          AF_Point  p;
+
+
+          p = first->prev;
+          if ( p->v < first_v )
+            segment->height = (FT_Short)( segment->height +
+                                          ( ( first_v - p->v ) >> 1 ) );
+
+          p = last->next;
+          if ( p->v > last_v )
+            segment->height = (FT_Short)( segment->height +
+                                          ( ( p->v - last_v ) >> 1 ) );
+        }
+        else
+        {
+          AF_Point  p;
+
+
+          p = first->prev;
+          if ( p->v > first_v )
+            segment->height = (FT_Short)( segment->height +
+                                          ( ( p->v - first_v ) >> 1 ) );
+
+          p = last->next;
+          if ( p->v < last_v )
+            segment->height = (FT_Short)( segment->height +
+                                          ( ( last_v - p->v ) >> 1 ) );
+        }
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* Link segments to form stems and serifs. */
+
+  FT_LOCAL_DEF( void )
+  af_latin_hints_link_segments( AF_GlyphHints  hints,
+                                AF_Dimension   dim )
+  {
+    AF_AxisHints  axis          = &hints->axis[dim];
+    AF_Segment    segments      = axis->segments;
+    AF_Segment    segment_limit = segments + axis->num_segments;
+    FT_Pos        len_threshold, len_score;
+    AF_Segment    seg1, seg2;
+
+
+    len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 );
+    if ( len_threshold == 0 )
+      len_threshold = 1;
+
+    len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 );
+
+    /* now compare each segment to the others */
+    for ( seg1 = segments; seg1 < segment_limit; seg1++ )
+    {
+      /* the fake segments are introduced to hint the metrics -- */
+      /* we must never link them to anything                     */
+      if ( seg1->dir != axis->major_dir || seg1->first == seg1->last )
+        continue;
+
+      /* search for stems having opposite directions, */
+      /* with seg1 to the `left' of seg2              */
+      for ( seg2 = segments; seg2 < segment_limit; seg2++ )
+      {
+        FT_Pos  pos1 = seg1->pos;
+        FT_Pos  pos2 = seg2->pos;
+
+
+        if ( seg1->dir + seg2->dir == 0 && pos2 > pos1 )
+        {
+          /* compute distance between the two segments */
+          FT_Pos  dist = pos2 - pos1;
+          FT_Pos  min  = seg1->min_coord;
+          FT_Pos  max  = seg1->max_coord;
+          FT_Pos  len, score;
+
+
+          if ( min < seg2->min_coord )
+            min = seg2->min_coord;
+
+          if ( max > seg2->max_coord )
+            max = seg2->max_coord;
+
+          /* compute maximum coordinate difference of the two segments */
+          len = max - min;
+          if ( len >= len_threshold )
+          {
+            /* small coordinate differences cause a higher score, and     */
+            /* segments with a greater distance cause a higher score also */
+            score = dist + len_score / len;
+
+            /* and we search for the smallest score */
+            /* of the sum of the two values         */
+            if ( score < seg1->score )
+            {
+              seg1->score = score;
+              seg1->link  = seg2;
+            }
+
+            if ( score < seg2->score )
+            {
+              seg2->score = score;
+              seg2->link  = seg1;
+            }
+          }
+        }
+      }
+    }
+
+    /* now compute the `serif' segments, cf. explanations in `afhints.h' */
+    for ( seg1 = segments; seg1 < segment_limit; seg1++ )
+    {
+      seg2 = seg1->link;
+
+      if ( seg2 )
+      {
+        if ( seg2->link != seg1 )
+        {
+          seg1->link  = 0;
+          seg1->serif = seg2->link;
+        }
+      }
+    }
+  }
+
+
+  /* Link segments to edges, using feature analysis for selection. */
+
+  FT_LOCAL_DEF( FT_Error )
+  af_latin_hints_compute_edges( AF_GlyphHints  hints,
+                                AF_Dimension   dim )
+  {
+    AF_AxisHints  axis   = &hints->axis[dim];
+    FT_Error      error  = AF_Err_Ok;
+    FT_Memory     memory = hints->memory;
+    AF_LatinAxis  laxis  = &((AF_LatinMetrics)hints->metrics)->axis[dim];
+
+    AF_Segment    segments      = axis->segments;
+    AF_Segment    segment_limit = segments + axis->num_segments;
+    AF_Segment    seg;
+
+#if 0
+    AF_Direction  up_dir;
+#endif
+    FT_Fixed      scale;
+    FT_Pos        edge_distance_threshold;
+    FT_Pos        segment_length_threshold;
+
+
+    axis->num_edges = 0;
+
+    scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale
+                                         : hints->y_scale;
+
+#if 0
+    up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP
+                                          : AF_DIR_RIGHT;
+#endif
+
+    /*
+     *  We ignore all segments that are less than 1 pixel in length
+     *  to avoid many problems with serif fonts.  We compute the
+     *  corresponding threshold in font units.
+     */
+    if ( dim == AF_DIMENSION_HORZ )
+        segment_length_threshold = FT_DivFix( 64, hints->y_scale );
+    else
+        segment_length_threshold = 0;
+
+    /*********************************************************************/
+    /*                                                                   */
+    /* We begin by generating a sorted table of edges for the current    */
+    /* direction.  To do so, we simply scan each segment and try to find */
+    /* an edge in our table that corresponds to its position.            */
+    /*                                                                   */
+    /* If no edge is found, we create and insert a new edge in the       */
+    /* sorted table.  Otherwise, we simply add the segment to the edge's */
+    /* list which gets processed in the second step to compute the       */
+    /* edge's properties.                                                */
+    /*                                                                   */
+    /* Note that the table of edges is sorted along the segment/edge     */
+    /* position.                                                         */
+    /*                                                                   */
+    /*********************************************************************/
+
+    /* assure that edge distance threshold is at most 0.25px */
+    edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold,
+                                         scale );
+    if ( edge_distance_threshold > 64 / 4 )
+      edge_distance_threshold = 64 / 4;
+
+    edge_distance_threshold = FT_DivFix( edge_distance_threshold,
+                                         scale );
+
+    for ( seg = segments; seg < segment_limit; seg++ )
+    {
+      AF_Edge  found = NULL;
+      FT_Int   ee;
+
+
+      if ( seg->height < segment_length_threshold )
+        continue;
+
+      /* A special case for serif edges: If they are smaller than */
+      /* 1.5 pixels we ignore them.                               */
+      if ( seg->serif                                     &&
+           2 * seg->height < 3 * segment_length_threshold )
+        continue;
+
+      /* look for an edge corresponding to the segment */
+      for ( ee = 0; ee < axis->num_edges; ee++ )
+      {
+        AF_Edge  edge = axis->edges + ee;
+        FT_Pos   dist;
+
+
+        dist = seg->pos - edge->fpos;
+        if ( dist < 0 )
+          dist = -dist;
+
+        if ( dist < edge_distance_threshold && edge->dir == seg->dir )
+        {
+          found = edge;
+          break;
+        }
+      }
+
+      if ( !found )
+      {
+        AF_Edge  edge;
+
+
+        /* insert a new edge in the list and */
+        /* sort according to the position    */
+        error = af_axis_hints_new_edge( axis, seg->pos,
+                                        (AF_Direction)seg->dir,
+                                        memory, &edge );
+        if ( error )
+          goto Exit;
+
+        /* add the segment to the new edge's list */
+        FT_ZERO( edge );
+
+        edge->first    = seg;
+        edge->last     = seg;
+        edge->dir      = seg->dir;
+        edge->fpos     = seg->pos;
+        edge->opos     = FT_MulFix( seg->pos, scale );
+        edge->pos      = edge->opos;
+        seg->edge_next = seg;
+      }
+      else
+      {
+        /* if an edge was found, simply add the segment to the edge's */
+        /* list                                                       */
+        seg->edge_next         = found->first;
+        found->last->edge_next = seg;
+        found->last            = seg;
+      }
+    }
+
+
+    /*********************************************************************/
+    /*                                                                   */
+    /* Good, we will now compute each edge's properties according to     */
+    /* the segments found on its position.  Basically, these are         */
+    /*                                                                   */
+    /*  - the edge's main direction                                      */
+    /*  - stem edge, serif edge or both (which defaults to stem then)    */
+    /*  - rounded edge, straight or both (which defaults to straight)    */
+    /*  - link for edge                                                  */
+    /*                                                                   */
+    /*********************************************************************/
+
+    /* first of all, set the `edge' field in each segment -- this is */
+    /* required in order to compute edge links                       */
+
+    /*
+     * Note that removing this loop and setting the `edge' field of each
+     * segment directly in the code above slows down execution speed for
+     * some reasons on platforms like the Sun.
+     */
+    {
+      AF_Edge  edges      = axis->edges;
+      AF_Edge  edge_limit = edges + axis->num_edges;
+      AF_Edge  edge;
+
+
+      for ( edge = edges; edge < edge_limit; edge++ )
+      {
+        seg = edge->first;
+        if ( seg )
+          do
+          {
+            seg->edge = edge;
+            seg       = seg->edge_next;
+
+          } while ( seg != edge->first );
+      }
+
+      /* now compute each edge properties */
+      for ( edge = edges; edge < edge_limit; edge++ )
+      {
+        FT_Int  is_round    = 0;  /* does it contain round segments?    */
+        FT_Int  is_straight = 0;  /* does it contain straight segments? */
+#if 0
+        FT_Pos  ups         = 0;  /* number of upwards segments         */
+        FT_Pos  downs       = 0;  /* number of downwards segments       */
+#endif
+
+
+        seg = edge->first;
+
+        do
+        {
+          FT_Bool  is_serif;
+
+
+          /* check for roundness of segment */
+          if ( seg->flags & AF_EDGE_ROUND )
+            is_round++;
+          else
+            is_straight++;
+
+#if 0
+          /* check for segment direction */
+          if ( seg->dir == up_dir )
+            ups   += seg->max_coord - seg->min_coord;
+          else
+            downs += seg->max_coord - seg->min_coord;
+#endif
+
+          /* check for links -- if seg->serif is set, then seg->link must */
+          /* be ignored                                                   */
+          is_serif = (FT_Bool)( seg->serif               &&
+                                seg->serif->edge         &&
+                                seg->serif->edge != edge );
+
+          if ( ( seg->link && seg->link->edge != NULL ) || is_serif )
+          {
+            AF_Edge     edge2;
+            AF_Segment  seg2;
+
+
+            edge2 = edge->link;
+            seg2  = seg->link;
+
+            if ( is_serif )
+            {
+              seg2  = seg->serif;
+              edge2 = edge->serif;
+            }
+
+            if ( edge2 )
+            {
+              FT_Pos  edge_delta;
+              FT_Pos  seg_delta;
+
+
+              edge_delta = edge->fpos - edge2->fpos;
+              if ( edge_delta < 0 )
+                edge_delta = -edge_delta;
+
+              seg_delta = seg->pos - seg2->pos;
+              if ( seg_delta < 0 )
+                seg_delta = -seg_delta;
+
+              if ( seg_delta < edge_delta )
+                edge2 = seg2->edge;
+            }
+            else
+              edge2 = seg2->edge;
+
+            if ( is_serif )
+            {
+              edge->serif   = edge2;
+              edge2->flags |= AF_EDGE_SERIF;
+            }
+            else
+              edge->link  = edge2;
+          }
+
+          seg = seg->edge_next;
+
+        } while ( seg != edge->first );
+
+        /* set the round/straight flags */
+        edge->flags = AF_EDGE_NORMAL;
+
+        if ( is_round > 0 && is_round >= is_straight )
+          edge->flags |= AF_EDGE_ROUND;
+
+#if 0
+        /* set the edge's main direction */
+        edge->dir = AF_DIR_NONE;
+
+        if ( ups > downs )
+          edge->dir = (FT_Char)up_dir;
+
+        else if ( ups < downs )
+          edge->dir = (FT_Char)-up_dir;
+
+        else if ( ups == downs )
+          edge->dir = 0;  /* both up and down! */
+#endif
+
+        /* get rid of serifs if link is set                 */
+        /* XXX: This gets rid of many unpleasant artefacts! */
+        /*      Example: the `c' in cour.pfa at size 13     */
+
+        if ( edge->serif && edge->link )
+          edge->serif = 0;
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* Detect segments and edges for given dimension. */
+
+  FT_LOCAL_DEF( FT_Error )
+  af_latin_hints_detect_features( AF_GlyphHints  hints,
+                                  AF_Dimension   dim )
+  {
+    FT_Error  error;
+
+
+    error = af_latin_hints_compute_segments( hints, dim );
+    if ( !error )
+    {
+      af_latin_hints_link_segments( hints, dim );
+
+      error = af_latin_hints_compute_edges( hints, dim );
+    }
+
+    return error;
+  }
+
+
+  /* Compute all edges which lie within blue zones. */
+
+  FT_LOCAL_DEF( void )
+  af_latin_hints_compute_blue_edges( AF_GlyphHints    hints,
+                                     AF_LatinMetrics  metrics )
+  {
+    AF_AxisHints  axis       = &hints->axis[AF_DIMENSION_VERT];
+    AF_Edge       edge       = axis->edges;
+    AF_Edge       edge_limit = edge + axis->num_edges;
+    AF_LatinAxis  latin      = &metrics->axis[AF_DIMENSION_VERT];
+    FT_Fixed      scale      = latin->scale;
+
+
+    /* compute which blue zones are active, i.e. have their scaled */
+    /* size < 3/4 pixels                                           */
+
+    /* for each horizontal edge search the blue zone which is closest */
+    for ( ; edge < edge_limit; edge++ )
+    {
+      FT_Int    bb;
+      AF_Width  best_blue = NULL;
+      FT_Pos    best_dist;  /* initial threshold */
+
+
+      /* compute the initial threshold as a fraction of the EM size */
+      /* (the value 40 is heuristic)                                */
+      best_dist = FT_MulFix( metrics->units_per_em / 40, scale );
+
+      /* assure a minimum distance of 0.5px */
+      if ( best_dist > 64 / 2 )
+        best_dist = 64 / 2;
+
+      for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ )
+      {
+        AF_LatinBlue  blue = latin->blues + bb;
+        FT_Bool       is_top_blue, is_major_dir;
+
+
+        /* skip inactive blue zones (i.e., those that are too large) */
+        if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) )
+          continue;
+
+        /* if it is a top zone, check for right edges -- if it is a bottom */
+        /* zone, check for left edges                                      */
+        /*                                                                 */
+        /* of course, that's for TrueType                                  */
+        is_top_blue  = (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_TOP ) != 0 );
+        is_major_dir = FT_BOOL( edge->dir == axis->major_dir );
+
+        /* if it is a top zone, the edge must be against the major    */
+        /* direction; if it is a bottom zone, it must be in the major */
+        /* direction                                                  */
+        if ( is_top_blue ^ is_major_dir )
+        {
+          FT_Pos  dist;
+
+
+          /* first of all, compare it to the reference position */
+          dist = edge->fpos - blue->ref.org;
+          if ( dist < 0 )
+            dist = -dist;
+
+          dist = FT_MulFix( dist, scale );
+          if ( dist < best_dist )
+          {
+            best_dist = dist;
+            best_blue = &blue->ref;
+          }
+
+          /* now compare it to the overshoot position and check whether */
+          /* the edge is rounded, and whether the edge is over the      */
+          /* reference position of a top zone, or under the reference   */
+          /* position of a bottom zone                                  */
+          if ( edge->flags & AF_EDGE_ROUND && dist != 0 )
+          {
+            FT_Bool  is_under_ref = FT_BOOL( edge->fpos < blue->ref.org );
+
+
+            if ( is_top_blue ^ is_under_ref )
+            {
+              dist = edge->fpos - blue->shoot.org;
+              if ( dist < 0 )
+                dist = -dist;
+
+              dist = FT_MulFix( dist, scale );
+              if ( dist < best_dist )
+              {
+                best_dist = dist;
+                best_blue = &blue->shoot;
+              }
+            }
+          }
+        }
+      }
+
+      if ( best_blue )
+        edge->blue_edge = best_blue;
+    }
+  }
+
+
+  /* Initalize hinting engine. */
+
+  static FT_Error
+  af_latin_hints_init( AF_GlyphHints    hints,
+                       AF_LatinMetrics  metrics )
+  {
+    FT_Render_Mode  mode;
+    FT_UInt32       scaler_flags, other_flags;
+    FT_Face         face = metrics->root.scaler.face;
+
+
+    af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics );
+
+    /*
+     *  correct x_scale and y_scale if needed, since they may have
+     *  been modified by `af_latin_metrics_scale_dim' above
+     */
+    hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale;
+    hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta;
+    hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale;
+    hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta;
+
+    /* compute flags depending on render mode, etc. */
+    mode = metrics->root.scaler.render_mode;
+
+#if 0 /* #ifdef AF_CONFIG_OPTION_USE_WARPER */
+    if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V )
+    {
+      metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL;
+    }
+#endif
+
+    scaler_flags = hints->scaler_flags;
+    other_flags  = 0;
+
+    /*
+     *  We snap the width of vertical stems for the monochrome and
+     *  horizontal LCD rendering targets only.
+     */
+    if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD )
+      other_flags |= AF_LATIN_HINTS_HORZ_SNAP;
+
+    /*
+     *  We snap the width of horizontal stems for the monochrome and
+     *  vertical LCD rendering targets only.
+     */
+    if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V )
+      other_flags |= AF_LATIN_HINTS_VERT_SNAP;
+
+    /*
+     *  We adjust stems to full pixels only if we don't use the `light' mode.
+     */
+    if ( mode != FT_RENDER_MODE_LIGHT )
+      other_flags |= AF_LATIN_HINTS_STEM_ADJUST;
+
+    if ( mode == FT_RENDER_MODE_MONO )
+      other_flags |= AF_LATIN_HINTS_MONO;
+
+    /*
+     *  In `light' hinting mode we disable horizontal hinting completely.
+     *  We also do it if the face is italic.
+     */
+    if ( mode == FT_RENDER_MODE_LIGHT                      ||
+         ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 )
+      scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL;
+
+    hints->scaler_flags = scaler_flags;
+    hints->other_flags  = other_flags;
+
+    return AF_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****        L A T I N   G L Y P H   G R I D - F I T T I N G        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* Snap a given width in scaled coordinates to one of the */
+  /* current standard widths.                               */
+
+  static FT_Pos
+  af_latin_snap_width( AF_Width  widths,
+                       FT_Int    count,
+                       FT_Pos    width )
+  {
+    int     n;
+    FT_Pos  best      = 64 + 32 + 2;
+    FT_Pos  reference = width;
+    FT_Pos  scaled;
+
+
+    for ( n = 0; n < count; n++ )
+    {
+      FT_Pos  w;
+      FT_Pos  dist;
+
+
+      w = widths[n].cur;
+      dist = width - w;
+      if ( dist < 0 )
+        dist = -dist;
+      if ( dist < best )
+      {
+        best      = dist;
+        reference = w;
+      }
+    }
+
+    scaled = FT_PIX_ROUND( reference );
+
+    if ( width >= reference )
+    {
+      if ( width < scaled + 48 )
+        width = reference;
+    }
+    else
+    {
+      if ( width > scaled - 48 )
+        width = reference;
+    }
+
+    return width;
+  }
+
+
+  /* Compute the snapped width of a given stem, ignoring very thin ones. */
+  /* There is a lot of voodoo in this function; changing the hard-coded  */
+  /* parameters influence the whole hinting process.                     */
+
+  static FT_Pos
+  af_latin_compute_stem_width( AF_GlyphHints  hints,
+                               AF_Dimension   dim,
+                               FT_Pos         width,
+                               AF_Edge_Flags  base_flags,
+                               AF_Edge_Flags  stem_flags )
+  {
+    AF_LatinMetrics  metrics  = (AF_LatinMetrics) hints->metrics;
+    AF_LatinAxis     axis     = & metrics->axis[dim];
+    FT_Pos           dist     = width;
+    FT_Int           sign     = 0;
+    FT_Int           vertical = ( dim == AF_DIMENSION_VERT );
+
+
+    if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ||
+         axis->extra_light                       )
+      return width;
+
+    if ( dist < 0 )
+    {
+      dist = -width;
+      sign = 1;
+    }
+
+    if ( (  vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ||
+         ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) )
+    {
+      /* smooth hinting process: very lightly quantize the stem width */
+
+      /* leave the widths of serifs alone */
+      if ( ( stem_flags & AF_EDGE_SERIF ) &&
+           vertical                       &&
+           ( dist < 3 * 64 )              )
+        goto Done_Width;
+
+      else if ( base_flags & AF_EDGE_ROUND )
+      {
+        if ( dist < 80 )
+          dist = 64;
+      }
+      else if ( dist < 56 )
+        dist = 56;
+
+      if ( axis->width_count > 0 )
+      {
+        FT_Pos  delta;
+
+
+        /* compare to standard width */
+        delta = dist - axis->widths[0].cur;
+
+        if ( delta < 0 )
+          delta = -delta;
+
+        if ( delta < 40 )
+        {
+          dist = axis->widths[0].cur;
+          if ( dist < 48 )
+            dist = 48;
+
+          goto Done_Width;
+        }
+
+        if ( dist < 3 * 64 )
+        {
+          delta  = dist & 63;
+          dist  &= -64;
+
+          if ( delta < 10 )
+            dist += delta;
+
+          else if ( delta < 32 )
+            dist += 10;
+
+          else if ( delta < 54 )
+            dist += 54;
+
+          else
+            dist += delta;
+        }
+        else
+          dist = ( dist + 32 ) & ~63;
+      }
+    }
+    else
+    {
+      /* strong hinting process: snap the stem width to integer pixels */
+
+      FT_Pos  org_dist = dist;
+
+
+      dist = af_latin_snap_width( axis->widths, axis->width_count, dist );
+
+      if ( vertical )
+      {
+        /* in the case of vertical hinting, always round */
+        /* the stem heights to integer pixels            */
+
+        if ( dist >= 64 )
+          dist = ( dist + 16 ) & ~63;
+        else
+          dist = 64;
+      }
+      else
+      {
+        if ( AF_LATIN_HINTS_DO_MONO( hints ) )
+        {
+          /* monochrome horizontal hinting: snap widths to integer pixels */
+          /* with a different threshold                                   */
+
+          if ( dist < 64 )
+            dist = 64;
+          else
+            dist = ( dist + 32 ) & ~63;
+        }
+        else
+        {
+          /* for horizontal anti-aliased hinting, we adopt a more subtle */
+          /* approach: we strengthen small stems, round stems whose size */
+          /* is between 1 and 2 pixels to an integer, otherwise nothing  */
+
+          if ( dist < 48 )
+            dist = ( dist + 64 ) >> 1;
+
+          else if ( dist < 128 )
+          {
+            /* We only round to an integer width if the corresponding */
+            /* distortion is less than 1/4 pixel.  Otherwise this     */
+            /* makes everything worse since the diagonals, which are  */
+            /* not hinted, appear a lot bolder or thinner than the    */
+            /* vertical stems.                                        */
+
+            FT_Pos  delta;
+
+
+            dist = ( dist + 22 ) & ~63;
+            delta = dist - org_dist;
+            if ( delta < 0 )
+              delta = -delta;
+
+            if (delta >= 16)
+            {
+              dist = org_dist;
+              if ( dist < 48 )
+                dist = ( dist + 64 ) >> 1;
+            }
+          }
+          else
+            /* round otherwise to prevent color fringes in LCD mode */
+            dist = ( dist + 32 ) & ~63;
+        }
+      }
+    }
+
+  Done_Width:
+    if ( sign )
+      dist = -dist;
+
+    return dist;
+  }
+
+
+  /* Align one stem edge relative to the previous stem edge. */
+
+  static void
+  af_latin_align_linked_edge( AF_GlyphHints  hints,
+                              AF_Dimension   dim,
+                              AF_Edge        base_edge,
+                              AF_Edge        stem_edge )
+  {
+    FT_Pos  dist = stem_edge->opos - base_edge->opos;
+
+    FT_Pos  fitted_width = af_latin_compute_stem_width(
+                             hints, dim, dist,
+                             (AF_Edge_Flags)base_edge->flags,
+                             (AF_Edge_Flags)stem_edge->flags );
+
+
+    stem_edge->pos = base_edge->pos + fitted_width;
+
+    FT_TRACE5(( "  LINK: edge %d (opos=%.2f) linked to (%.2f),"
+                " dist was %.2f, now %.2f\n",
+                stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0,
+                stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 ));
+  }
+
+
+  /* Shift the coordinates of the `serif' edge by the same amount */
+  /* as the corresponding `base' edge has been moved already.     */
+
+  static void
+  af_latin_align_serif_edge( AF_GlyphHints  hints,
+                             AF_Edge        base,
+                             AF_Edge        serif )
+  {
+    FT_UNUSED( hints );
+
+    serif->pos = base->pos + ( serif->opos - base->opos );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                    E D G E   H I N T I N G                      ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* The main grid-fitting routine. */
+
+  FT_LOCAL_DEF( void )
+  af_latin_hint_edges( AF_GlyphHints  hints,
+                       AF_Dimension   dim )
+  {
+    AF_AxisHints  axis       = &hints->axis[dim];
+    AF_Edge       edges      = axis->edges;
+    AF_Edge       edge_limit = edges + axis->num_edges;
+    FT_PtrDist    n_edges;
+    AF_Edge       edge;
+    AF_Edge       anchor     = NULL;
+    FT_Int        has_serifs = 0;
+
+
+    FT_TRACE5(("%s edge hinting\n", dim == AF_DIMENSION_VERT ? "horizontal"
+                                                             : "vertical"));
+
+    /* we begin by aligning all stems relative to the blue zone */
+    /* if needed -- that's only for horizontal edges            */
+
+    if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) )
+    {
+      for ( edge = edges; edge < edge_limit; edge++ )
+      {
+        AF_Width  blue;
+        AF_Edge   edge1, edge2; /* these edges form the stem to check */
+
+
+        if ( edge->flags & AF_EDGE_DONE )
+          continue;
+
+        blue  = edge->blue_edge;
+        edge1 = NULL;
+        edge2 = edge->link;
+
+        if ( blue )
+          edge1 = edge;
+
+        /* flip edges if the other stem is aligned to a blue zone */
+        else if ( edge2 && edge2->blue_edge )
+        {
+          blue  = edge2->blue_edge;
+          edge1 = edge2;
+          edge2 = edge;
+        }
+
+        if ( !edge1 )
+          continue;
+
+        FT_TRACE5(( "  BLUE: edge %d (opos=%.2f) snapped to (%.2f),"
+                    " was (%.2f)\n",
+                    edge1 - edges, edge1->opos / 64.0, blue->fit / 64.0,
+                    edge1->pos / 64.0 ));
+
+        edge1->pos    = blue->fit;
+        edge1->flags |= AF_EDGE_DONE;
+
+        if ( edge2 && !edge2->blue_edge )
+        {
+          af_latin_align_linked_edge( hints, dim, edge1, edge2 );
+          edge2->flags |= AF_EDGE_DONE;
+        }
+
+        if ( !anchor )
+          anchor = edge;
+      }
+    }
+
+    /* now we align all other stem edges, trying to maintain the */
+    /* relative order of stems in the glyph                      */
+    for ( edge = edges; edge < edge_limit; edge++ )
+    {
+      AF_Edge  edge2;
+
+
+      if ( edge->flags & AF_EDGE_DONE )
+        continue;
+
+      /* skip all non-stem edges */
+      edge2 = edge->link;
+      if ( !edge2 )
+      {
+        has_serifs++;
+        continue;
+      }
+
+      /* now align the stem */
+
+      /* this should not happen, but it's better to be safe */
+      if ( edge2->blue_edge )
+      {
+        FT_TRACE5(( "  ASSERTION FAILED for edge %d\n", edge2-edges ));
+
+        af_latin_align_linked_edge( hints, dim, edge2, edge );
+        edge->flags |= AF_EDGE_DONE;
+        continue;
+      }
+
+      if ( !anchor )
+      {
+        /* if we reach this if clause, no stem has been aligned yet */
+
+        FT_Pos  org_len, org_center, cur_len;
+        FT_Pos  cur_pos1, error1, error2, u_off, d_off;
+
+
+        org_len = edge2->opos - edge->opos;
+        cur_len = af_latin_compute_stem_width(
+                    hints, dim, org_len,
+                    (AF_Edge_Flags)edge->flags,
+                    (AF_Edge_Flags)edge2->flags );
+
+        /* some voodoo to specially round edges for small stem widths; */
+        /* the idea is to align the center of a stem, then shifting    */
+        /* the stem edges to suitable positions                        */
+        if ( cur_len <= 64 )
+        {
+          /* width <= 1px */
+          u_off = 32;
+          d_off = 32;
+        }
+        else
+        {
+          /* 1px < width < 1.5px */
+          u_off = 38;
+          d_off = 26;
+        }
+
+        if ( cur_len < 96 )
+        {
+          org_center = edge->opos + ( org_len >> 1 );
+          cur_pos1   = FT_PIX_ROUND( org_center );
+
+          error1 = org_center - ( cur_pos1 - u_off );
+          if ( error1 < 0 )
+            error1 = -error1;
+
+          error2 = org_center - ( cur_pos1 + d_off );
+          if ( error2 < 0 )
+            error2 = -error2;
+
+          if ( error1 < error2 )
+            cur_pos1 -= u_off;
+          else
+            cur_pos1 += d_off;
+
+          edge->pos  = cur_pos1 - cur_len / 2;
+          edge2->pos = edge->pos + cur_len;
+        }
+        else
+          edge->pos = FT_PIX_ROUND( edge->opos );
+
+        FT_TRACE5(( "  ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f)"
+                    " snapped to (%.2f) (%.2f)\n",
+                    edge - edges, edge->opos / 64.0,
+                    edge2 - edges, edge2->opos / 64.0,
+                    edge->pos / 64.0, edge2->pos / 64.0 ));
+        anchor = edge;
+
+        edge->flags |= AF_EDGE_DONE;
+
+        af_latin_align_linked_edge( hints, dim, edge, edge2 );
+      }
+      else
+      {
+        FT_Pos  org_pos, org_len, org_center, cur_len;
+        FT_Pos  cur_pos1, cur_pos2, delta1, delta2;
+
+
+        org_pos    = anchor->pos + ( edge->opos - anchor->opos );
+        org_len    = edge2->opos - edge->opos;
+        org_center = org_pos + ( org_len >> 1 );
+
+        cur_len = af_latin_compute_stem_width(
+                    hints, dim, org_len,
+                    (AF_Edge_Flags)edge->flags,
+                    (AF_Edge_Flags)edge2->flags );
+
+        if ( edge2->flags & AF_EDGE_DONE )
+        {
+          FT_TRACE5(( "  ADJUST: edge %d (pos=%.2f) moved to %.2f\n",
+                      edge - edges, edge->pos / 64.0,
+                      ( edge2->pos - cur_len ) / 64.0 ));
+
+          edge->pos = edge2->pos - cur_len;
+        }
+
+        else if ( cur_len < 96 )
+        {
+          FT_Pos  u_off, d_off;
+
+
+          cur_pos1 = FT_PIX_ROUND( org_center );
+
+          if (cur_len <= 64 )
+          {
+            u_off = 32;
+            d_off = 32;
+          }
+          else
+          {
+            u_off = 38;
+            d_off = 26;
+          }
+
+          delta1 = org_center - ( cur_pos1 - u_off );
+          if ( delta1 < 0 )
+            delta1 = -delta1;
+
+          delta2 = org_center - ( cur_pos1 + d_off );
+          if ( delta2 < 0 )
+            delta2 = -delta2;
+
+          if ( delta1 < delta2 )
+            cur_pos1 -= u_off;
+          else
+            cur_pos1 += d_off;
+
+          edge->pos  = cur_pos1 - cur_len / 2;
+          edge2->pos = cur_pos1 + cur_len / 2;
+
+          FT_TRACE5(( "  STEM: %d (opos=%.2f) to %d (opos=%.2f)"
+                      " snapped to (%.2f) and (%.2f)\n",
+                      edge - edges, edge->opos / 64.0,
+                      edge2 - edges, edge2->opos / 64.0,
+                      edge->pos / 64.0, edge2->pos / 64.0 ));
+        }
+        else
+        {
+          org_pos    = anchor->pos + ( edge->opos - anchor->opos );
+          org_len    = edge2->opos - edge->opos;
+          org_center = org_pos + ( org_len >> 1 );
+
+          cur_len    = af_latin_compute_stem_width(
+                         hints, dim, org_len,
+                         (AF_Edge_Flags)edge->flags,
+                         (AF_Edge_Flags)edge2->flags );
+
+          cur_pos1 = FT_PIX_ROUND( org_pos );
+          delta1   = cur_pos1 + ( cur_len >> 1 ) - org_center;
+          if ( delta1 < 0 )
+            delta1 = -delta1;
+
+          cur_pos2 = FT_PIX_ROUND( org_pos + org_len ) - cur_len;
+          delta2   = cur_pos2 + ( cur_len >> 1 ) - org_center;
+          if ( delta2 < 0 )
+            delta2 = -delta2;
+
+          edge->pos  = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2;
+          edge2->pos = edge->pos + cur_len;
+
+          FT_TRACE5(( "  STEM: %d (opos=%.2f) to %d (opos=%.2f)"
+                      " snapped to (%.2f) and (%.2f)\n",
+                      edge - edges, edge->opos / 64.0,
+                      edge2 - edges, edge2->opos / 64.0,
+                      edge->pos / 64.0, edge2->pos / 64.0 ));
+        }
+
+        edge->flags  |= AF_EDGE_DONE;
+        edge2->flags |= AF_EDGE_DONE;
+
+        if ( edge > edges && edge->pos < edge[-1].pos )
+        {
+          FT_TRACE5(( "  BOUND: %d (pos=%.2f) to (%.2f)\n",
+                      edge - edges, edge->pos / 64.0, edge[-1].pos / 64.0 ));
+          edge->pos = edge[-1].pos;
+        }
+      }
+    }
+
+    /* make sure that lowercase m's maintain their symmetry */
+
+    /* In general, lowercase m's have six vertical edges if they are sans */
+    /* serif, or twelve if they are with serifs.  This implementation is  */
+    /* based on that assumption, and seems to work very well with most    */
+    /* faces.  However, if for a certain face this assumption is not      */
+    /* true, the m is just rendered like before.  In addition, any stem   */
+    /* correction will only be applied to symmetrical glyphs (even if the */
+    /* glyph is not an m), so the potential for unwanted distortion is    */
+    /* relatively low.                                                    */
+
+    /* We don't handle horizontal edges since we can't easily assure that */
+    /* the third (lowest) stem aligns with the base line; it might end up */
+    /* one pixel higher or lower.                                         */
+
+    n_edges = edge_limit - edges;
+    if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) )
+    {
+      AF_Edge  edge1, edge2, edge3;
+      FT_Pos   dist1, dist2, span, delta;
+
+
+      if ( n_edges == 6 )
+      {
+        edge1 = edges;
+        edge2 = edges + 2;
+        edge3 = edges + 4;
+      }
+      else
+      {
+        edge1 = edges + 1;
+        edge2 = edges + 5;
+        edge3 = edges + 9;
+      }
+
+      dist1 = edge2->opos - edge1->opos;
+      dist2 = edge3->opos - edge2->opos;
+
+      span = dist1 - dist2;
+      if ( span < 0 )
+        span = -span;
+
+      if ( span < 8 )
+      {
+        delta = edge3->pos - ( 2 * edge2->pos - edge1->pos );
+        edge3->pos -= delta;
+        if ( edge3->link )
+          edge3->link->pos -= delta;
+
+        /* move the serifs along with the stem */
+        if ( n_edges == 12 )
+        {
+          ( edges + 8 )->pos -= delta;
+          ( edges + 11 )->pos -= delta;
+        }
+
+        edge3->flags |= AF_EDGE_DONE;
+        if ( edge3->link )
+          edge3->link->flags |= AF_EDGE_DONE;
+      }
+    }
+
+    if ( has_serifs || !anchor )
+    {
+      /*
+       *  now hint the remaining edges (serifs and single) in order
+       *  to complete our processing
+       */
+      for ( edge = edges; edge < edge_limit; edge++ )
+      {
+        FT_Pos  delta;
+
+
+        if ( edge->flags & AF_EDGE_DONE )
+          continue;
+
+        delta = 1000;
+
+        if ( edge->serif )
+        {
+          delta = edge->serif->opos - edge->opos;
+          if ( delta < 0 )
+            delta = -delta;
+        }
+
+        if ( delta < 64 + 16 )
+        {
+          af_latin_align_serif_edge( hints, edge->serif, edge );
+          FT_TRACE5(( "  SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f)"
+                      " aligned to (%.2f)\n",
+                      edge - edges, edge->opos / 64.0,
+                      edge->serif - edges, edge->serif->opos / 64.0,
+                      edge->pos / 64.0 ));
+        }
+        else if ( !anchor )
+        {
+          edge->pos = FT_PIX_ROUND( edge->opos );
+          anchor    = edge;
+          FT_TRACE5(( "  SERIF_ANCHOR: edge %d (opos=%.2f)"
+                      " snapped to (%.2f)\n",
+                      edge-edges, edge->opos / 64.0, edge->pos / 64.0 ));
+        }
+        else
+        {
+          AF_Edge  before, after;
+
+
+          for ( before = edge - 1; before >= edges; before-- )
+            if ( before->flags & AF_EDGE_DONE )
+              break;
+
+          for ( after = edge + 1; after < edge_limit; after++ )
+            if ( after->flags & AF_EDGE_DONE )
+              break;
+
+          if ( before >= edges && before < edge   &&
+               after < edge_limit && after > edge )
+          {
+            if ( after->opos == before->opos )
+              edge->pos = before->pos;
+            else
+              edge->pos = before->pos +
+                          FT_MulDiv( edge->opos - before->opos,
+                                     after->pos - before->pos,
+                                     after->opos - before->opos );
+
+            FT_TRACE5(( "  SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f)"
+                        " from %d (opos=%.2f)\n",
+                        edge - edges, edge->opos / 64.0,
+                        edge->pos / 64.0,
+                        before - edges, before->opos / 64.0 ));
+          }
+          else
+          {
+            edge->pos = anchor->pos +
+                        ( ( edge->opos - anchor->opos + 16 ) & ~31 );
+
+            FT_TRACE5(( "  SERIF_LINK2: edge %d (opos=%.2f)"
+                        " snapped to (%.2f)\n",
+                        edge - edges, edge->opos / 64.0, edge->pos / 64.0 ));
+          }
+        }
+
+        edge->flags |= AF_EDGE_DONE;
+
+        if ( edge > edges && edge->pos < edge[-1].pos )
+          edge->pos = edge[-1].pos;
+
+        if ( edge + 1 < edge_limit        &&
+             edge[1].flags & AF_EDGE_DONE &&
+             edge->pos > edge[1].pos      )
+          edge->pos = edge[1].pos;
+      }
+    }
+
+    FT_TRACE5(( "\n" ));
+  }
+
+
+  /* Apply the complete hinting algorithm to a latin glyph. */
+
+  static FT_Error
+  af_latin_hints_apply( AF_GlyphHints    hints,
+                        FT_Outline*      outline,
+                        AF_LatinMetrics  metrics )
+  {
+    FT_Error  error;
+    int       dim;
+
+
+    error = af_glyph_hints_reload( hints, outline );
+    if ( error )
+      goto Exit;
+
+    /* analyze glyph outline */
+#ifdef AF_CONFIG_OPTION_USE_WARPER
+    if ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT ||
+         AF_HINTS_DO_HORIZONTAL( hints )                          )
+#else
+    if ( AF_HINTS_DO_HORIZONTAL( hints ) )
+#endif
+    {
+      error = af_latin_hints_detect_features( hints, AF_DIMENSION_HORZ );
+      if ( error )
+        goto Exit;
+    }
+
+    if ( AF_HINTS_DO_VERTICAL( hints ) )
+    {
+      error = af_latin_hints_detect_features( hints, AF_DIMENSION_VERT );
+      if ( error )
+        goto Exit;
+
+      af_latin_hints_compute_blue_edges( hints, metrics );
+    }
+
+    /* grid-fit the outline */
+    for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )
+    {
+#ifdef AF_CONFIG_OPTION_USE_WARPER
+      if ( dim == AF_DIMENSION_HORZ                                 &&
+           metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT )
+      {
+        AF_WarperRec  warper;
+        FT_Fixed      scale;
+        FT_Pos        delta;
+
+
+        af_warper_compute( &warper, hints, (AF_Dimension)dim,
+                           &scale, &delta );
+        af_glyph_hints_scale_dim( hints, (AF_Dimension)dim,
+                                  scale, delta );
+        continue;
+      }
+#endif
+
+      if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) ||
+           ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) )   )
+      {
+        af_latin_hint_edges( hints, (AF_Dimension)dim );
+        af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim );
+        af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim );
+        af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim );
+      }
+    }
+    af_glyph_hints_save( hints, outline );
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****              L A T I N   S C R I P T   C L A S S              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* XXX: this should probably fine tuned to differentiate better between */
+  /*      scripts...                                                      */
+
+  static const AF_Script_UniRangeRec  af_latin_uniranges[] =
+  {
+    AF_UNIRANGE_REC(  0x0020UL,  0x007FUL ),  /* Basic Latin (no control chars) */
+    AF_UNIRANGE_REC(  0x00A0UL,  0x00FFUL ),  /* Latin-1 Supplement (no control chars) */
+    AF_UNIRANGE_REC(  0x0100UL,  0x017FUL ),  /* Latin Extended-A */
+    AF_UNIRANGE_REC(  0x0180UL,  0x024FUL ),  /* Latin Extended-B */
+    AF_UNIRANGE_REC(  0x0250UL,  0x02AFUL ),  /* IPA Extensions */
+    AF_UNIRANGE_REC(  0x02B0UL,  0x02FFUL ),  /* Spacing Modifier Letters */
+    AF_UNIRANGE_REC(  0x0300UL,  0x036FUL ),  /* Combining Diacritical Marks */
+    AF_UNIRANGE_REC(  0x0370UL,  0x03FFUL ),  /* Greek and Coptic */
+    AF_UNIRANGE_REC(  0x0400UL,  0x04FFUL ),  /* Cyrillic */
+    AF_UNIRANGE_REC(  0x0500UL,  0x052FUL ),  /* Cyrillic Supplement */
+    AF_UNIRANGE_REC(  0x1D00UL,  0x1D7FUL ),  /* Phonetic Extensions */
+    AF_UNIRANGE_REC(  0x1D80UL,  0x1DBFUL ),  /* Phonetic Extensions Supplement */
+    AF_UNIRANGE_REC(  0x1DC0UL,  0x1DFFUL ),  /* Combining Diacritical Marks Supplement */
+    AF_UNIRANGE_REC(  0x1E00UL,  0x1EFFUL ),  /* Latin Extended Additional */
+    AF_UNIRANGE_REC(  0x1F00UL,  0x1FFFUL ),  /* Greek Extended */
+    AF_UNIRANGE_REC(  0x2000UL,  0x206FUL ),  /* General Punctuation */
+    AF_UNIRANGE_REC(  0x2070UL,  0x209FUL ),  /* Superscripts and Subscripts */
+    AF_UNIRANGE_REC(  0x20A0UL,  0x20CFUL ),  /* Currency Symbols */
+    AF_UNIRANGE_REC(  0x2150UL,  0x218FUL ),  /* Number Forms */
+    AF_UNIRANGE_REC(  0x2460UL,  0x24FFUL ),  /* Enclosed Alphanumerics */
+    AF_UNIRANGE_REC(  0x2C60UL,  0x2C7FUL ),  /* Latin Extended-C */
+    AF_UNIRANGE_REC(  0x2DE0UL,  0x2DFFUL ),  /* Cyrillic Extended-A */
+    AF_UNIRANGE_REC(  0xA640UL,  0xA69FUL ),  /* Cyrillic Extended-B */
+    AF_UNIRANGE_REC(  0xA720UL,  0xA7FFUL ),  /* Latin Extended-D */
+    AF_UNIRANGE_REC(  0xFB00UL,  0xFB06UL ),  /* Alphab. Present. Forms (Latin Ligs) */
+    AF_UNIRANGE_REC( 0x1D400UL, 0x1D7FFUL ),  /* Mathematical Alphanumeric Symbols */
+    AF_UNIRANGE_REC(       0UL,       0UL )
+  };
+
+
+  AF_DEFINE_SCRIPT_CLASS( af_latin_script_class,
+    AF_SCRIPT_LATIN,
+    af_latin_uniranges,
+
+    sizeof ( AF_LatinMetricsRec ),
+
+    (AF_Script_InitMetricsFunc) af_latin_metrics_init,
+    (AF_Script_ScaleMetricsFunc)af_latin_metrics_scale,
+    (AF_Script_DoneMetricsFunc) NULL,
+
+    (AF_Script_InitHintsFunc)   af_latin_hints_init,
+    (AF_Script_ApplyHintsFunc)  af_latin_hints_apply
+  )
+
+
+/* END */
diff --git a/src/autofit/aflatin.h b/src/autofit/aflatin.h
new file mode 100644 (file)
index 0000000..c5c2d13
--- /dev/null
@@ -0,0 +1,211 @@
+/***************************************************************************/
+/*                                                                         */
+/*  aflatin.h                                                              */
+/*                                                                         */
+/*    Auto-fitter hinting routines for latin script (specification).       */
+/*                                                                         */
+/*  Copyright 2003-2007, 2009, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __AFLATIN_H__
+#define __AFLATIN_H__
+
+#include "afhints.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /* the latin-specific script class */
+
+  AF_DECLARE_SCRIPT_CLASS(af_latin_script_class)
+
+
+  /* constants are given with units_per_em == 2048 in mind */
+#define AF_LATIN_CONSTANT( metrics, c )                                      \
+  ( ( (c) * (FT_Long)( (AF_LatinMetrics)(metrics) )->units_per_em ) / 2048 )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****            L A T I N   G L O B A L   M E T R I C S            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*
+   *  The following declarations could be embedded in the file `aflatin.c';
+   *  they have been made semi-public to allow alternate script hinters to
+   *  re-use some of them.
+   */
+
+
+  /* Latin (global) metrics management */
+
+  enum
+  {
+    AF_LATIN_BLUE_CAPITAL_TOP,
+    AF_LATIN_BLUE_CAPITAL_BOTTOM,
+    AF_LATIN_BLUE_SMALL_F_TOP,
+    AF_LATIN_BLUE_SMALL_TOP,
+    AF_LATIN_BLUE_SMALL_BOTTOM,
+    AF_LATIN_BLUE_SMALL_MINOR,
+
+    AF_LATIN_BLUE_MAX
+  };
+
+
+#define AF_LATIN_IS_TOP_BLUE( b )  ( (b) == AF_LATIN_BLUE_CAPITAL_TOP || \
+                                     (b) == AF_LATIN_BLUE_SMALL_F_TOP || \
+                                     (b) == AF_LATIN_BLUE_SMALL_TOP   )
+
+#define AF_LATIN_MAX_WIDTHS  16
+#define AF_LATIN_MAX_BLUES   AF_LATIN_BLUE_MAX
+
+
+  enum
+  {
+    AF_LATIN_BLUE_ACTIVE     = 1 << 0,  /* set if zone height is <= 3/4px */
+    AF_LATIN_BLUE_TOP        = 1 << 1,  /* result of AF_LATIN_IS_TOP_BLUE */
+    AF_LATIN_BLUE_ADJUSTMENT = 1 << 2,  /* used for scale adjustment      */
+                                        /* optimization                   */
+    AF_LATIN_BLUE_FLAG_MAX
+  };
+
+
+  typedef struct  AF_LatinBlueRec_
+  {
+    AF_WidthRec  ref;
+    AF_WidthRec  shoot;
+    FT_UInt      flags;
+
+  } AF_LatinBlueRec, *AF_LatinBlue;
+
+
+  typedef struct  AF_LatinAxisRec_
+  {
+    FT_Fixed         scale;
+    FT_Pos           delta;
+
+    FT_UInt          width_count;                 /* number of used widths */
+    AF_WidthRec      widths[AF_LATIN_MAX_WIDTHS]; /* widths array          */
+    FT_Pos           edge_distance_threshold;   /* used for creating edges */
+    FT_Pos           standard_width;         /* the default stem thickness */
+    FT_Bool          extra_light;         /* is standard width very light? */
+
+    /* ignored for horizontal metrics */
+    FT_UInt          blue_count;
+    AF_LatinBlueRec  blues[AF_LATIN_BLUE_MAX];
+
+    FT_Fixed         org_scale;
+    FT_Pos           org_delta;
+
+  } AF_LatinAxisRec, *AF_LatinAxis;
+
+
+  typedef struct  AF_LatinMetricsRec_
+  {
+    AF_ScriptMetricsRec  root;
+    FT_UInt              units_per_em;
+    AF_LatinAxisRec      axis[AF_DIMENSION_MAX];
+
+  } AF_LatinMetricsRec, *AF_LatinMetrics;
+
+
+  FT_LOCAL( FT_Error )
+  af_latin_metrics_init( AF_LatinMetrics  metrics,
+                         FT_Face          face );
+
+  FT_LOCAL( void )
+  af_latin_metrics_scale( AF_LatinMetrics  metrics,
+                          AF_Scaler        scaler );
+
+  FT_LOCAL( void )
+  af_latin_metrics_init_widths( AF_LatinMetrics  metrics,
+                                FT_Face          face,
+                                FT_ULong         charcode );
+
+  FT_LOCAL( void )
+  af_latin_metrics_check_digits( AF_LatinMetrics  metrics,
+                                 FT_Face          face );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****           L A T I N   G L Y P H   A N A L Y S I S             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  enum
+  {
+    AF_LATIN_HINTS_HORZ_SNAP   = 1 << 0, /* enable stem width snapping  */
+    AF_LATIN_HINTS_VERT_SNAP   = 1 << 1, /* enable stem height snapping */
+    AF_LATIN_HINTS_STEM_ADJUST = 1 << 2, /* enable stem width/height    */
+                                         /* adjustment                  */
+    AF_LATIN_HINTS_MONO        = 1 << 3  /* indicate monochrome         */
+                                         /* rendering                   */
+  };
+
+
+#define AF_LATIN_HINTS_DO_HORZ_SNAP( h )             \
+  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP )
+
+#define AF_LATIN_HINTS_DO_VERT_SNAP( h )             \
+  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP )
+
+#define AF_LATIN_HINTS_DO_STEM_ADJUST( h )             \
+  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST )
+
+#define AF_LATIN_HINTS_DO_MONO( h )             \
+  AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO )
+
+
+  /*
+   *  This shouldn't normally be exported.  However, other scripts might
+   *  like to use this function as-is.
+   */
+  FT_LOCAL( FT_Error )
+  af_latin_hints_compute_segments( AF_GlyphHints  hints,
+                                   AF_Dimension   dim );
+
+  /*
+   *  This shouldn't normally be exported.  However, other scripts might
+   *  want to use this function as-is.
+   */
+  FT_LOCAL( void )
+  af_latin_hints_link_segments( AF_GlyphHints  hints,
+                                AF_Dimension   dim );
+
+  /*
+   *  This shouldn't normally be exported.  However, other scripts might
+   *  want to use this function as-is.
+   */
+  FT_LOCAL( FT_Error )
+  af_latin_hints_compute_edges( AF_GlyphHints  hints,
+                                AF_Dimension   dim );
+
+  FT_LOCAL( FT_Error )
+  af_latin_hints_detect_features( AF_GlyphHints  hints,
+                                  AF_Dimension   dim );
+
+/* */
+
+FT_END_HEADER
+
+#endif /* __AFLATIN_H__ */
+
+
+/* END */
diff --git a/src/autofit/aflatin2.c b/src/autofit/aflatin2.c
new file mode 100644 (file)
index 0000000..ea6af8d
--- /dev/null
@@ -0,0 +1,2374 @@
+/***************************************************************************/
+/*                                                                         */
+/*  aflatin2.c                                                             */
+/*                                                                         */
+/*    Auto-fitter hinting routines for latin script (body).                */
+/*                                                                         */
+/*  Copyright 2003-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include FT_ADVANCES_H
+
+#include "aflatin.h"
+#include "aflatin2.h"
+#include "aferrors.h"
+
+
+#ifdef AF_CONFIG_OPTION_USE_WARPER
+#include "afwarp.h"
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_aflatin2
+
+
+  FT_LOCAL_DEF( FT_Error )
+  af_latin2_hints_compute_segments( AF_GlyphHints  hints,
+                                    AF_Dimension   dim );
+
+  FT_LOCAL_DEF( void )
+  af_latin2_hints_link_segments( AF_GlyphHints  hints,
+                                 AF_Dimension   dim );
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****            L A T I N   G L O B A L   M E T R I C S            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  af_latin2_metrics_init_widths( AF_LatinMetrics  metrics,
+                                 FT_Face          face,
+                                 FT_ULong         charcode )
+  {
+    /* scan the array of segments in each direction */
+    AF_GlyphHintsRec  hints[1];
+
+
+    af_glyph_hints_init( hints, face->memory );
+
+    metrics->axis[AF_DIMENSION_HORZ].width_count = 0;
+    metrics->axis[AF_DIMENSION_VERT].width_count = 0;
+
+    {
+      FT_Error             error;
+      FT_UInt              glyph_index;
+      int                  dim;
+      AF_LatinMetricsRec   dummy[1];
+      AF_Scaler            scaler = &dummy->root.scaler;
+
+
+      glyph_index = FT_Get_Char_Index( face, charcode );
+      if ( glyph_index == 0 )
+        goto Exit;
+
+      error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
+      if ( error || face->glyph->outline.n_points <= 0 )
+        goto Exit;
+
+      FT_ZERO( dummy );
+
+      dummy->units_per_em = metrics->units_per_em;
+      scaler->x_scale     = scaler->y_scale = 0x10000L;
+      scaler->x_delta     = scaler->y_delta = 0;
+      scaler->face        = face;
+      scaler->render_mode = FT_RENDER_MODE_NORMAL;
+      scaler->flags       = 0;
+
+      af_glyph_hints_rescale( hints, (AF_ScriptMetrics)dummy );
+
+      error = af_glyph_hints_reload( hints, &face->glyph->outline );
+      if ( error )
+        goto Exit;
+
+      for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )
+      {
+        AF_LatinAxis  axis    = &metrics->axis[dim];
+        AF_AxisHints  axhints = &hints->axis[dim];
+        AF_Segment    seg, limit, link;
+        FT_UInt       num_widths = 0;
+
+
+        error = af_latin2_hints_compute_segments( hints,
+                                                 (AF_Dimension)dim );
+        if ( error )
+          goto Exit;
+
+        af_latin2_hints_link_segments( hints,
+                                      (AF_Dimension)dim );
+
+        seg   = axhints->segments;
+        limit = seg + axhints->num_segments;
+
+        for ( ; seg < limit; seg++ )
+        {
+          link = seg->link;
+
+          /* we only consider stem segments there! */
+          if ( link && link->link == seg && link > seg )
+          {
+            FT_Pos  dist;
+
+
+            dist = seg->pos - link->pos;
+            if ( dist < 0 )
+              dist = -dist;
+
+            if ( num_widths < AF_LATIN_MAX_WIDTHS )
+              axis->widths[num_widths++].org = dist;
+          }
+        }
+
+        af_sort_widths( num_widths, axis->widths );
+        axis->width_count = num_widths;
+      }
+
+  Exit:
+      for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )
+      {
+        AF_LatinAxis  axis = &metrics->axis[dim];
+        FT_Pos        stdw;
+
+
+        stdw = ( axis->width_count > 0 )
+                 ? axis->widths[0].org
+                 : AF_LATIN_CONSTANT( metrics, 50 );
+
+        /* let's try 20% of the smallest width */
+        axis->edge_distance_threshold = stdw / 5;
+        axis->standard_width          = stdw;
+        axis->extra_light             = 0;
+      }
+    }
+
+    af_glyph_hints_done( hints );
+  }
+
+
+
+#define AF_LATIN_MAX_TEST_CHARACTERS  12
+
+
+  static const char af_latin2_blue_chars[AF_LATIN_MAX_BLUES]
+                                        [AF_LATIN_MAX_TEST_CHARACTERS+1] =
+  {
+    "THEZOCQS",
+    "HEZLOCUS",
+    "fijkdbh",
+    "xzroesc",
+    "xzroesc",
+    "pqgjy"
+  };
+
+
+  static void
+  af_latin2_metrics_init_blues( AF_LatinMetrics  metrics,
+                                FT_Face          face )
+  {
+    FT_Pos        flats [AF_LATIN_MAX_TEST_CHARACTERS];
+    FT_Pos        rounds[AF_LATIN_MAX_TEST_CHARACTERS];
+    FT_Int        num_flats;
+    FT_Int        num_rounds;
+    FT_Int        bb;
+    AF_LatinBlue  blue;
+    FT_Error      error;
+    AF_LatinAxis  axis  = &metrics->axis[AF_DIMENSION_VERT];
+    FT_GlyphSlot  glyph = face->glyph;
+
+
+    /* we compute the blues simply by loading each character from the     */
+    /* 'af_latin2_blue_chars[blues]' string, then compute its top-most or */
+    /* bottom-most points (depending on `AF_IS_TOP_BLUE')                 */
+
+    FT_TRACE5(( "blue zones computation\n" ));
+    FT_TRACE5(( "------------------------------------------------\n" ));
+
+    for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ )
+    {
+      const char*  p     = af_latin2_blue_chars[bb];
+      const char*  limit = p + AF_LATIN_MAX_TEST_CHARACTERS;
+      FT_Pos*      blue_ref;
+      FT_Pos*      blue_shoot;
+
+
+      FT_TRACE5(( "blue %3d: ", bb ));
+
+      num_flats  = 0;
+      num_rounds = 0;
+
+      for ( ; p < limit && *p; p++ )
+      {
+        FT_UInt     glyph_index;
+        FT_Int      best_point, best_y, best_first, best_last;
+        FT_Vector*  points;
+        FT_Bool     round;
+
+
+        FT_TRACE5(( "'%c'", *p ));
+
+        /* load the character in the face -- skip unknown or empty ones */
+        glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p );
+        if ( glyph_index == 0 )
+          continue;
+
+        error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE );
+        if ( error || glyph->outline.n_points <= 0 )
+          continue;
+
+        /* now compute min or max point indices and coordinates */
+        points      = glyph->outline.points;
+        best_point  = -1;
+        best_y      = 0;  /* make compiler happy */
+        best_first  = 0;  /* ditto */
+        best_last   = 0;  /* ditto */
+
+        {
+          FT_Int  nn;
+          FT_Int  first = 0;
+          FT_Int  last  = -1;
+
+
+          for ( nn = 0; nn < glyph->outline.n_contours; first = last+1, nn++ )
+          {
+            FT_Int  old_best_point = best_point;
+            FT_Int  pp;
+
+
+            last = glyph->outline.contours[nn];
+
+            /* Avoid single-point contours since they are never rasterized. */
+            /* In some fonts, they correspond to mark attachment points     */
+            /* which are way outside of the glyph's real outline.           */
+            if ( last == first )
+                continue;
+
+            if ( AF_LATIN_IS_TOP_BLUE( bb ) )
+            {
+              for ( pp = first; pp <= last; pp++ )
+                if ( best_point < 0 || points[pp].y > best_y )
+                {
+                  best_point = pp;
+                  best_y     = points[pp].y;
+                }
+            }
+            else
+            {
+              for ( pp = first; pp <= last; pp++ )
+                if ( best_point < 0 || points[pp].y < best_y )
+                {
+                  best_point = pp;
+                  best_y     = points[pp].y;
+                }
+            }
+
+            if ( best_point != old_best_point )
+            {
+              best_first = first;
+              best_last  = last;
+            }
+          }
+          FT_TRACE5(( "%5d", best_y ));
+        }
+
+        /* now check whether the point belongs to a straight or round   */
+        /* segment; we first need to find in which contour the extremum */
+        /* lies, then inspect its previous and next points              */
+        {
+          FT_Int  start, end, prev, next;
+          FT_Pos  dist;
+
+
+          /* now look for the previous and next points that are not on the */
+          /* same Y coordinate.  Threshold the `closeness'...              */
+          start = end = best_point;
+
+          do
+          {
+            prev = start-1;
+            if ( prev < best_first )
+              prev = best_last;
+
+            dist = points[prev].y - best_y;
+            if ( dist < -5 || dist > 5 )
+              break;
+
+            start = prev;
+
+          } while ( start != best_point );
+
+          do
+          {
+            next = end+1;
+            if ( next > best_last )
+              next = best_first;
+
+            dist = points[next].y - best_y;
+            if ( dist < -5 || dist > 5 )
+              break;
+
+            end = next;
+
+          } while ( end != best_point );
+
+          /* now, set the `round' flag depending on the segment's kind */
+          round = FT_BOOL(
+            FT_CURVE_TAG( glyph->outline.tags[start] ) != FT_CURVE_TAG_ON ||
+            FT_CURVE_TAG( glyph->outline.tags[ end ] ) != FT_CURVE_TAG_ON );
+
+          FT_TRACE5(( "%c ", round ? 'r' : 'f' ));
+        }
+
+        if ( round )
+          rounds[num_rounds++] = best_y;
+        else
+          flats[num_flats++]   = best_y;
+      }
+
+      FT_TRACE5(( "\n" ));
+
+      if ( num_flats == 0 && num_rounds == 0 )
+      {
+        /*
+         *  we couldn't find a single glyph to compute this blue zone,
+         *  we will simply ignore it then
+         */
+        FT_TRACE5(( "empty\n" ));
+        continue;
+      }
+
+      /* we have computed the contents of the `rounds' and `flats' tables, */
+      /* now determine the reference and overshoot position of the blue -- */
+      /* we simply take the median value after a simple sort               */
+      af_sort_pos( num_rounds, rounds );
+      af_sort_pos( num_flats,  flats );
+
+      blue       = & axis->blues[axis->blue_count];
+      blue_ref   = & blue->ref.org;
+      blue_shoot = & blue->shoot.org;
+
+      axis->blue_count++;
+
+      if ( num_flats == 0 )
+      {
+        *blue_ref   =
+        *blue_shoot = rounds[num_rounds / 2];
+      }
+      else if ( num_rounds == 0 )
+      {
+        *blue_ref   =
+        *blue_shoot = flats[num_flats / 2];
+      }
+      else
+      {
+        *blue_ref   = flats[num_flats / 2];
+        *blue_shoot = rounds[num_rounds / 2];
+      }
+
+      /* there are sometimes problems: if the overshoot position of top     */
+      /* zones is under its reference position, or the opposite for bottom  */
+      /* zones.  We must thus check everything there and correct the errors */
+      if ( *blue_shoot != *blue_ref )
+      {
+        FT_Pos   ref      = *blue_ref;
+        FT_Pos   shoot    = *blue_shoot;
+        FT_Bool  over_ref = FT_BOOL( shoot > ref );
+
+
+        if ( AF_LATIN_IS_TOP_BLUE( bb ) ^ over_ref )
+          *blue_shoot = *blue_ref = ( shoot + ref ) / 2;
+      }
+
+      blue->flags = 0;
+      if ( AF_LATIN_IS_TOP_BLUE( bb ) )
+        blue->flags |= AF_LATIN_BLUE_TOP;
+
+      /*
+       * The following flags is used later to adjust the y and x scales
+       * in order to optimize the pixel grid alignment of the top of small
+       * letters.
+       */
+      if ( bb == AF_LATIN_BLUE_SMALL_TOP )
+        blue->flags |= AF_LATIN_BLUE_ADJUSTMENT;
+
+      FT_TRACE5(( "-- ref = %ld, shoot = %ld\n", *blue_ref, *blue_shoot ));
+    }
+
+    return;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  af_latin2_metrics_check_digits( AF_LatinMetrics  metrics,
+                                  FT_Face          face )
+  {
+    FT_UInt   i;
+    FT_Bool   started = 0, same_width = 1;
+    FT_Fixed  advance, old_advance = 0;
+
+
+    /* check whether all ASCII digits have the same advance width; */
+    /* digit `0' is 0x30 in all supported charmaps                 */
+    for ( i = 0x30; i <= 0x39; i++ )
+    {
+      FT_UInt  glyph_index;
+
+
+      glyph_index = FT_Get_Char_Index( face, i );
+      if ( glyph_index == 0 )
+        continue;
+
+      if ( FT_Get_Advance( face, glyph_index,
+                           FT_LOAD_NO_SCALE         |
+                           FT_LOAD_NO_HINTING       |
+                           FT_LOAD_IGNORE_TRANSFORM,
+                           &advance ) )
+        continue;
+
+      if ( started )
+      {
+        if ( advance != old_advance )
+        {
+          same_width = 0;
+          break;
+        }
+      }
+      else
+      {
+        old_advance = advance;
+        started     = 1;
+      }
+    }
+
+    metrics->root.digits_have_same_width = same_width;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  af_latin2_metrics_init( AF_LatinMetrics  metrics,
+                          FT_Face          face )
+  {
+    FT_Error    error = AF_Err_Ok;
+    FT_CharMap  oldmap = face->charmap;
+    FT_UInt     ee;
+
+    static const FT_Encoding  latin_encodings[] =
+    {
+      FT_ENCODING_UNICODE,
+      FT_ENCODING_APPLE_ROMAN,
+      FT_ENCODING_ADOBE_STANDARD,
+      FT_ENCODING_ADOBE_LATIN_1,
+      FT_ENCODING_NONE  /* end of list */
+    };
+
+
+    metrics->units_per_em = face->units_per_EM;
+
+    /* do we have a latin charmap in there? */
+    for ( ee = 0; latin_encodings[ee] != FT_ENCODING_NONE; ee++ )
+    {
+      error = FT_Select_Charmap( face, latin_encodings[ee] );
+      if ( !error )
+        break;
+    }
+
+    if ( !error )
+    {
+      /* For now, compute the standard width and height from the `o'. */
+      af_latin2_metrics_init_widths( metrics, face, 'o' );
+      af_latin2_metrics_init_blues( metrics, face );
+      af_latin2_metrics_check_digits( metrics, face );
+    }
+
+    FT_Set_Charmap( face, oldmap );
+    return AF_Err_Ok;
+  }
+
+
+  static void
+  af_latin2_metrics_scale_dim( AF_LatinMetrics  metrics,
+                               AF_Scaler        scaler,
+                               AF_Dimension     dim )
+  {
+    FT_Fixed      scale;
+    FT_Pos        delta;
+    AF_LatinAxis  axis;
+    FT_UInt       nn;
+
+
+    if ( dim == AF_DIMENSION_HORZ )
+    {
+      scale = scaler->x_scale;
+      delta = scaler->x_delta;
+    }
+    else
+    {
+      scale = scaler->y_scale;
+      delta = scaler->y_delta;
+    }
+
+    axis = &metrics->axis[dim];
+
+    if ( axis->org_scale == scale && axis->org_delta == delta )
+      return;
+
+    axis->org_scale = scale;
+    axis->org_delta = delta;
+
+    /*
+     * correct Y scale to optimize the alignment of the top of small
+     * letters to the pixel grid
+     */
+    if ( dim == AF_DIMENSION_VERT )
+    {
+      AF_LatinAxis  vaxis = &metrics->axis[AF_DIMENSION_VERT];
+      AF_LatinBlue  blue = NULL;
+
+
+      for ( nn = 0; nn < vaxis->blue_count; nn++ )
+      {
+        if ( vaxis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT )
+        {
+          blue = &vaxis->blues[nn];
+          break;
+        }
+      }
+
+      if ( blue )
+      {
+        FT_Pos  scaled = FT_MulFix( blue->shoot.org, scaler->y_scale );
+        FT_Pos  fitted = ( scaled + 40 ) & ~63;
+
+#if 1
+        if ( scaled != fitted )
+        {
+          scale = FT_MulDiv( scale, fitted, scaled );
+          FT_TRACE5(( "== scaled x-top = %.2g"
+                      "  fitted = %.2g, scaling = %.4g\n",
+                      scaled / 64.0, fitted / 64.0,
+                      ( fitted * 1.0 ) / scaled ));
+        }
+#endif
+      }
+    }
+
+    axis->scale = scale;
+    axis->delta = delta;
+
+    if ( dim == AF_DIMENSION_HORZ )
+    {
+      metrics->root.scaler.x_scale = scale;
+      metrics->root.scaler.x_delta = delta;
+    }
+    else
+    {
+      metrics->root.scaler.y_scale = scale;
+      metrics->root.scaler.y_delta = delta;
+    }
+
+    /* scale the standard widths */
+    for ( nn = 0; nn < axis->width_count; nn++ )
+    {
+      AF_Width  width = axis->widths + nn;
+
+
+      width->cur = FT_MulFix( width->org, scale );
+      width->fit = width->cur;
+    }
+
+    /* an extra-light axis corresponds to a standard width that is */
+    /* smaller than 5/8 pixels                                     */
+    axis->extra_light =
+      (FT_Bool)( FT_MulFix( axis->standard_width, scale ) < 32 + 8 );
+
+    if ( dim == AF_DIMENSION_VERT )
+    {
+      /* scale the blue zones */
+      for ( nn = 0; nn < axis->blue_count; nn++ )
+      {
+        AF_LatinBlue  blue = &axis->blues[nn];
+        FT_Pos        dist;
+
+
+        blue->ref.cur   = FT_MulFix( blue->ref.org, scale ) + delta;
+        blue->ref.fit   = blue->ref.cur;
+        blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta;
+        blue->shoot.fit = blue->shoot.cur;
+        blue->flags    &= ~AF_LATIN_BLUE_ACTIVE;
+
+        /* a blue zone is only active if it is less than 3/4 pixels tall */
+        dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale );
+        if ( dist <= 48 && dist >= -48 )
+        {
+          FT_Pos  delta1, delta2;
+
+          delta1 = blue->shoot.org - blue->ref.org;
+          delta2 = delta1;
+          if ( delta1 < 0 )
+            delta2 = -delta2;
+
+          delta2 = FT_MulFix( delta2, scale );
+
+          if ( delta2 < 32 )
+            delta2 = 0;
+          else if ( delta2 < 64 )
+            delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 );
+          else
+            delta2 = FT_PIX_ROUND( delta2 );
+
+          if ( delta1 < 0 )
+            delta2 = -delta2;
+
+          blue->ref.fit   = FT_PIX_ROUND( blue->ref.cur );
+          blue->shoot.fit = blue->ref.fit + delta2;
+
+          FT_TRACE5(( ">> activating blue zone %d:"
+                      "  ref.cur=%.2g ref.fit=%.2g"
+                      "  shoot.cur=%.2g shoot.fit=%.2g\n",
+                      nn, blue->ref.cur / 64.0, blue->ref.fit / 64.0,
+                      blue->shoot.cur / 64.0, blue->shoot.fit / 64.0 ));
+
+          blue->flags |= AF_LATIN_BLUE_ACTIVE;
+        }
+      }
+    }
+  }
+
+
+  FT_LOCAL_DEF( void )
+  af_latin2_metrics_scale( AF_LatinMetrics  metrics,
+                           AF_Scaler        scaler )
+  {
+    metrics->root.scaler.render_mode = scaler->render_mode;
+    metrics->root.scaler.face        = scaler->face;
+
+    af_latin2_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ );
+    af_latin2_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****           L A T I N   G L Y P H   A N A L Y S I S             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define  SORT_SEGMENTS
+
+  FT_LOCAL_DEF( FT_Error )
+  af_latin2_hints_compute_segments( AF_GlyphHints  hints,
+                                    AF_Dimension   dim )
+  {
+    AF_AxisHints  axis          = &hints->axis[dim];
+    FT_Memory     memory        = hints->memory;
+    FT_Error      error         = AF_Err_Ok;
+    AF_Segment    segment       = NULL;
+    AF_SegmentRec seg0;
+    AF_Point*     contour       = hints->contours;
+    AF_Point*     contour_limit = contour + hints->num_contours;
+    AF_Direction  major_dir, segment_dir;
+
+
+    FT_ZERO( &seg0 );
+    seg0.score = 32000;
+    seg0.flags = AF_EDGE_NORMAL;
+
+    major_dir   = (AF_Direction)FT_ABS( axis->major_dir );
+    segment_dir = major_dir;
+
+    axis->num_segments = 0;
+
+    /* set up (u,v) in each point */
+    if ( dim == AF_DIMENSION_HORZ )
+    {
+      AF_Point  point = hints->points;
+      AF_Point  limit = point + hints->num_points;
+
+
+      for ( ; point < limit; point++ )
+      {
+        point->u = point->fx;
+        point->v = point->fy;
+      }
+    }
+    else
+    {
+      AF_Point  point = hints->points;
+      AF_Point  limit = point + hints->num_points;
+
+
+      for ( ; point < limit; point++ )
+      {
+        point->u = point->fy;
+        point->v = point->fx;
+      }
+    }
+
+    /* do each contour separately */
+    for ( ; contour < contour_limit; contour++ )
+    {
+      AF_Point  point   =  contour[0];
+      AF_Point  start   =  point;
+      AF_Point  last    =  point->prev;
+
+
+      if ( point == last )  /* skip singletons -- just in case */
+        continue;
+
+      /* already on an edge ?, backtrack to find its start */
+      if ( FT_ABS( point->in_dir ) == major_dir )
+      {
+        point = point->prev;
+
+        while ( point->in_dir == start->in_dir )
+          point = point->prev;
+      }
+      else  /* otherwise, find first segment start, if any */
+      {
+        while ( FT_ABS( point->out_dir ) != major_dir )
+        {
+          point = point->next;
+
+          if ( point == start )
+            goto NextContour;
+        }
+      }
+
+      start = point;
+
+      for  (;;)
+      {
+        AF_Point  first;
+        FT_Pos    min_u, min_v, max_u, max_v;
+
+        /* we're at the start of a new segment */
+        FT_ASSERT( FT_ABS( point->out_dir ) == major_dir &&
+                           point->in_dir != point->out_dir );
+        first = point;
+
+        min_u = max_u = point->u;
+        min_v = max_v = point->v;
+
+        point = point->next;
+
+        while ( point->out_dir == first->out_dir )
+        {
+          point = point->next;
+
+          if ( point->u < min_u )
+            min_u = point->u;
+
+          if ( point->u > max_u )
+            max_u = point->u;
+        }
+
+        if ( point->v < min_v )
+          min_v = point->v;
+
+        if ( point->v > max_v )
+          max_v = point->v;
+
+        /* record new segment */
+        error = af_axis_hints_new_segment( axis, memory, &segment );
+        if ( error )
+          goto Exit;
+
+        segment[0]         = seg0;
+        segment->dir       = first->out_dir;
+        segment->first     = first;
+        segment->last      = point;
+        segment->pos       = (FT_Short)(( min_u + max_u ) >> 1);
+        segment->min_coord = (FT_Short) min_v;
+        segment->max_coord = (FT_Short) max_v;
+        segment->height    = (FT_Short)(max_v - min_v);
+
+        /* a segment is round if it doesn't have successive */
+        /* on-curve points.                                 */
+        {
+          AF_Point  pt   = first;
+          AF_Point  last = point;
+          AF_Flags  f0   = (AF_Flags)(pt->flags & AF_FLAG_CONTROL);
+          AF_Flags  f1;
+
+
+          segment->flags &= ~AF_EDGE_ROUND;
+
+          for ( ; pt != last; f0 = f1 )
+          {
+            pt = pt->next;
+            f1 = (AF_Flags)(pt->flags & AF_FLAG_CONTROL);
+
+            if ( !f0 && !f1 )
+              break;
+
+            if ( pt == last )
+              segment->flags |= AF_EDGE_ROUND;
+          }
+        }
+
+       /* this can happen in the case of a degenerate contour
+        * e.g. a 2-point vertical contour
+        */
+        if ( point == start )
+          break;
+
+        /* jump to the start of the next segment, if any */
+        while ( FT_ABS(point->out_dir) != major_dir )
+        {
+          point = point->next;
+
+          if ( point == start )
+            goto NextContour;
+        }
+      }
+
+    NextContour:
+      ;
+    } /* contours */
+
+    /* now slightly increase the height of segments when this makes */
+    /* sense -- this is used to better detect and ignore serifs     */
+    {
+      AF_Segment  segments     = axis->segments;
+      AF_Segment  segments_end = segments + axis->num_segments;
+
+
+      for ( segment = segments; segment < segments_end; segment++ )
+      {
+        AF_Point  first   = segment->first;
+        AF_Point  last    = segment->last;
+        AF_Point  p;
+        FT_Pos    first_v = first->v;
+        FT_Pos    last_v  = last->v;
+
+
+        if ( first == last )
+          continue;
+
+        if ( first_v < last_v )
+        {
+          p = first->prev;
+          if ( p->v < first_v )
+            segment->height = (FT_Short)( segment->height +
+                                          ( ( first_v - p->v ) >> 1 ) );
+
+          p = last->next;
+          if ( p->v > last_v )
+            segment->height = (FT_Short)( segment->height +
+                                          ( ( p->v - last_v ) >> 1 ) );
+        }
+        else
+        {
+          p = first->prev;
+          if ( p->v > first_v )
+            segment->height = (FT_Short)( segment->height +
+                                          ( ( p->v - first_v ) >> 1 ) );
+
+          p = last->next;
+          if ( p->v < last_v )
+            segment->height = (FT_Short)( segment->height +
+                                          ( ( last_v - p->v ) >> 1 ) );
+        }
+      }
+    }
+
+#ifdef AF_SORT_SEGMENTS
+   /* place all segments with a negative direction to the start
+    * of the array, used to speed up segment linking later...
+    */
+    {
+      AF_Segment  segments = axis->segments;
+      FT_UInt     count    = axis->num_segments;
+      FT_UInt     ii, jj;
+
+      for (ii = 0; ii < count; ii++)
+      {
+        if ( segments[ii].dir > 0 )
+        {
+          for (jj = ii+1; jj < count; jj++)
+          {
+            if ( segments[jj].dir < 0 )
+            {
+              AF_SegmentRec  tmp;
+
+              tmp          = segments[ii];
+              segments[ii] = segments[jj];
+              segments[jj] = tmp;
+
+              break;
+            }
+          }
+
+          if ( jj == count )
+            break;
+        }
+      }
+      axis->mid_segments = ii;
+    }
+#endif
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  af_latin2_hints_link_segments( AF_GlyphHints  hints,
+                                 AF_Dimension   dim )
+  {
+    AF_AxisHints  axis          = &hints->axis[dim];
+    AF_Segment    segments      = axis->segments;
+    AF_Segment    segment_limit = segments + axis->num_segments;
+#ifdef AF_SORT_SEGMENTS
+    AF_Segment    segment_mid   = segments + axis->mid_segments;
+#endif
+    FT_Pos        len_threshold, len_score;
+    AF_Segment    seg1, seg2;
+
+
+    len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 );
+    if ( len_threshold == 0 )
+      len_threshold = 1;
+
+    len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 );
+
+#ifdef AF_SORT_SEGMENTS
+    for ( seg1 = segments; seg1 < segment_mid; seg1++ )
+    {
+      if ( seg1->dir != axis->major_dir || seg1->first == seg1->last )
+        continue;
+
+      for ( seg2 = segment_mid; seg2 < segment_limit; seg2++ )
+#else
+    /* now compare each segment to the others */
+    for ( seg1 = segments; seg1 < segment_limit; seg1++ )
+    {
+      /* the fake segments are introduced to hint the metrics -- */
+      /* we must never link them to anything                     */
+      if ( seg1->dir != axis->major_dir || seg1->first == seg1->last )
+        continue;
+
+      for ( seg2 = segments; seg2 < segment_limit; seg2++ )
+        if ( seg1->dir + seg2->dir == 0 && seg2->pos > seg1->pos )
+#endif
+        {
+          FT_Pos  pos1 = seg1->pos;
+          FT_Pos  pos2 = seg2->pos;
+          FT_Pos  dist = pos2 - pos1;
+
+
+          if ( dist < 0 )
+            continue;
+
+          {
+            FT_Pos  min = seg1->min_coord;
+            FT_Pos  max = seg1->max_coord;
+            FT_Pos  len, score;
+
+
+            if ( min < seg2->min_coord )
+              min = seg2->min_coord;
+
+            if ( max > seg2->max_coord )
+              max = seg2->max_coord;
+
+            len = max - min;
+            if ( len >= len_threshold )
+            {
+              score = dist + len_score / len;
+              if ( score < seg1->score )
+              {
+                seg1->score = score;
+                seg1->link  = seg2;
+              }
+
+              if ( score < seg2->score )
+              {
+                seg2->score = score;
+                seg2->link  = seg1;
+              }
+            }
+          }
+        }
+    }
+#if 0
+    }
+#endif
+
+    /* now, compute the `serif' segments */
+    for ( seg1 = segments; seg1 < segment_limit; seg1++ )
+    {
+      seg2 = seg1->link;
+
+      if ( seg2 )
+      {
+        if ( seg2->link != seg1 )
+        {
+          seg1->link  = 0;
+          seg1->serif = seg2->link;
+        }
+      }
+    }
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  af_latin2_hints_compute_edges( AF_GlyphHints  hints,
+                                 AF_Dimension   dim )
+  {
+    AF_AxisHints  axis   = &hints->axis[dim];
+    FT_Error      error  = AF_Err_Ok;
+    FT_Memory     memory = hints->memory;
+    AF_LatinAxis  laxis  = &((AF_LatinMetrics)hints->metrics)->axis[dim];
+
+    AF_Segment    segments      = axis->segments;
+    AF_Segment    segment_limit = segments + axis->num_segments;
+    AF_Segment    seg;
+
+    AF_Direction  up_dir;
+    FT_Fixed      scale;
+    FT_Pos        edge_distance_threshold;
+    FT_Pos        segment_length_threshold;
+
+
+    axis->num_edges = 0;
+
+    scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale
+                                         : hints->y_scale;
+
+    up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP
+                                          : AF_DIR_RIGHT;
+
+    /*
+     *  We want to ignore very small (mostly serif) segments, we do that
+     *  by ignoring those that whose length is less than a given fraction
+     *  of the standard width. If there is no standard width, we ignore
+     *  those that are less than a given size in pixels
+     *
+     *  also, unlink serif segments that are linked to segments farther
+     *  than 50% of the standard width
+     */
+    if ( dim == AF_DIMENSION_HORZ )
+    {
+      if ( laxis->width_count > 0 )
+        segment_length_threshold = (laxis->standard_width * 10 ) >> 4;
+      else
+        segment_length_threshold = FT_DivFix( 64, hints->y_scale );
+    }
+    else
+      segment_length_threshold = 0;
+
+    /*********************************************************************/
+    /*                                                                   */
+    /* We will begin by generating a sorted table of edges for the       */
+    /* current direction.  To do so, we simply scan each segment and try */
+    /* to find an edge in our table that corresponds to its position.    */
+    /*                                                                   */
+    /* If no edge is found, we create and insert a new edge in the       */
+    /* sorted table.  Otherwise, we simply add the segment to the edge's */
+    /* list which will be processed in the second step to compute the    */
+    /* edge's properties.                                                */
+    /*                                                                   */
+    /* Note that the edges table is sorted along the segment/edge        */
+    /* position.                                                         */
+    /*                                                                   */
+    /*********************************************************************/
+
+    edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold,
+                                         scale );
+    if ( edge_distance_threshold > 64 / 4 )
+      edge_distance_threshold = 64 / 4;
+
+    edge_distance_threshold = FT_DivFix( edge_distance_threshold,
+                                         scale );
+
+    for ( seg = segments; seg < segment_limit; seg++ )
+    {
+      AF_Edge  found = 0;
+      FT_Int   ee;
+
+
+      if ( seg->height < segment_length_threshold )
+        continue;
+
+      /* A special case for serif edges: If they are smaller than */
+      /* 1.5 pixels we ignore them.                               */
+      if ( seg->serif )
+      {
+        FT_Pos  dist = seg->serif->pos - seg->pos;
+
+        if (dist < 0)
+          dist = -dist;
+
+        if (dist >= laxis->standard_width >> 1)
+        {
+          /* unlink this serif, it is too distant from its reference stem */
+          seg->serif = NULL;
+        }
+        else if ( 2*seg->height < 3 * segment_length_threshold )
+          continue;
+      }
+
+      /* look for an edge corresponding to the segment */
+      for ( ee = 0; ee < axis->num_edges; ee++ )
+      {
+        AF_Edge  edge = axis->edges + ee;
+        FT_Pos   dist;
+
+
+        dist = seg->pos - edge->fpos;
+        if ( dist < 0 )
+          dist = -dist;
+
+        if ( dist < edge_distance_threshold && edge->dir == seg->dir )
+        {
+          found = edge;
+          break;
+        }
+      }
+
+      if ( !found )
+      {
+        AF_Edge   edge;
+
+
+        /* insert a new edge in the list and */
+        /* sort according to the position    */
+        error = af_axis_hints_new_edge( axis, seg->pos, seg->dir,
+                                        memory, &edge );
+        if ( error )
+          goto Exit;
+
+        /* add the segment to the new edge's list */
+        FT_ZERO( edge );
+
+        edge->first    = seg;
+        edge->last     = seg;
+        edge->fpos     = seg->pos;
+        edge->dir      = seg->dir;
+        edge->opos     = edge->pos = FT_MulFix( seg->pos, scale );
+        seg->edge_next = seg;
+      }
+      else
+      {
+        /* if an edge was found, simply add the segment to the edge's */
+        /* list                                                       */
+        seg->edge_next         = found->first;
+        found->last->edge_next = seg;
+        found->last            = seg;
+      }
+    }
+
+
+    /*********************************************************************/
+    /*                                                                   */
+    /* Good, we will now compute each edge's properties according to     */
+    /* segments found on its position.  Basically, these are:            */
+    /*                                                                   */
+    /*  - edge's main direction                                          */
+    /*  - stem edge, serif edge or both (which defaults to stem then)    */
+    /*  - rounded edge, straight or both (which defaults to straight)    */
+    /*  - link for edge                                                  */
+    /*                                                                   */
+    /*********************************************************************/
+
+    /* first of all, set the `edge' field in each segment -- this is */
+    /* required in order to compute edge links                       */
+
+    /*
+     * Note that removing this loop and setting the `edge' field of each
+     * segment directly in the code above slows down execution speed for
+     * some reasons on platforms like the Sun.
+     */
+    {
+      AF_Edge  edges      = axis->edges;
+      AF_Edge  edge_limit = edges + axis->num_edges;
+      AF_Edge  edge;
+
+
+      for ( edge = edges; edge < edge_limit; edge++ )
+      {
+        seg = edge->first;
+        if ( seg )
+          do
+          {
+            seg->edge = edge;
+            seg       = seg->edge_next;
+
+          } while ( seg != edge->first );
+      }
+
+      /* now, compute each edge properties */
+      for ( edge = edges; edge < edge_limit; edge++ )
+      {
+        FT_Int  is_round    = 0;  /* does it contain round segments?    */
+        FT_Int  is_straight = 0;  /* does it contain straight segments? */
+#if 0
+        FT_Pos  ups         = 0;  /* number of upwards segments         */
+        FT_Pos  downs       = 0;  /* number of downwards segments       */
+#endif
+
+
+        seg = edge->first;
+
+        do
+        {
+          FT_Bool  is_serif;
+
+
+          /* check for roundness of segment */
+          if ( seg->flags & AF_EDGE_ROUND )
+            is_round++;
+          else
+            is_straight++;
+
+#if 0
+          /* check for segment direction */
+          if ( seg->dir == up_dir )
+            ups   += seg->max_coord-seg->min_coord;
+          else
+            downs += seg->max_coord-seg->min_coord;
+#endif
+
+          /* check for links -- if seg->serif is set, then seg->link must */
+          /* be ignored                                                   */
+          is_serif = (FT_Bool)( seg->serif               &&
+                                seg->serif->edge         &&
+                                seg->serif->edge != edge );
+
+          if ( ( seg->link && seg->link->edge != NULL ) || is_serif )
+          {
+            AF_Edge     edge2;
+            AF_Segment  seg2;
+
+
+            edge2 = edge->link;
+            seg2  = seg->link;
+
+            if ( is_serif )
+            {
+              seg2  = seg->serif;
+              edge2 = edge->serif;
+            }
+
+            if ( edge2 )
+            {
+              FT_Pos  edge_delta;
+              FT_Pos  seg_delta;
+
+
+              edge_delta = edge->fpos - edge2->fpos;
+              if ( edge_delta < 0 )
+                edge_delta = -edge_delta;
+
+              seg_delta = seg->pos - seg2->pos;
+              if ( seg_delta < 0 )
+                seg_delta = -seg_delta;
+
+              if ( seg_delta < edge_delta )
+                edge2 = seg2->edge;
+            }
+            else
+              edge2 = seg2->edge;
+
+            if ( is_serif )
+            {
+              edge->serif   = edge2;
+              edge2->flags |= AF_EDGE_SERIF;
+            }
+            else
+              edge->link  = edge2;
+          }
+
+          seg = seg->edge_next;
+
+        } while ( seg != edge->first );
+
+        /* set the round/straight flags */
+        edge->flags = AF_EDGE_NORMAL;
+
+        if ( is_round > 0 && is_round >= is_straight )
+          edge->flags |= AF_EDGE_ROUND;
+
+#if 0
+        /* set the edge's main direction */
+        edge->dir = AF_DIR_NONE;
+
+        if ( ups > downs )
+          edge->dir = (FT_Char)up_dir;
+
+        else if ( ups < downs )
+          edge->dir = (FT_Char)-up_dir;
+
+        else if ( ups == downs )
+          edge->dir = 0;  /* both up and down! */
+#endif
+
+        /* gets rid of serifs if link is set                */
+        /* XXX: This gets rid of many unpleasant artefacts! */
+        /*      Example: the `c' in cour.pfa at size 13     */
+
+        if ( edge->serif && edge->link )
+          edge->serif = 0;
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  af_latin2_hints_detect_features( AF_GlyphHints  hints,
+                                   AF_Dimension   dim )
+  {
+    FT_Error  error;
+
+
+    error = af_latin2_hints_compute_segments( hints, dim );
+    if ( !error )
+    {
+      af_latin2_hints_link_segments( hints, dim );
+
+      error = af_latin2_hints_compute_edges( hints, dim );
+    }
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  af_latin2_hints_compute_blue_edges( AF_GlyphHints    hints,
+                                      AF_LatinMetrics  metrics )
+  {
+    AF_AxisHints  axis       = &hints->axis[AF_DIMENSION_VERT];
+    AF_Edge       edge       = axis->edges;
+    AF_Edge       edge_limit = edge + axis->num_edges;
+    AF_LatinAxis  latin      = &metrics->axis[AF_DIMENSION_VERT];
+    FT_Fixed      scale      = latin->scale;
+    FT_Pos        best_dist0;  /* initial threshold */
+
+
+    /* compute the initial threshold as a fraction of the EM size */
+    best_dist0 = FT_MulFix( metrics->units_per_em / 40, scale );
+
+    if ( best_dist0 > 64 / 2 )
+      best_dist0 = 64 / 2;
+
+    /* compute which blue zones are active, i.e. have their scaled */
+    /* size < 3/4 pixels                                           */
+
+    /* for each horizontal edge search the blue zone which is closest */
+    for ( ; edge < edge_limit; edge++ )
+    {
+      FT_Int    bb;
+      AF_Width  best_blue = NULL;
+      FT_Pos    best_dist = best_dist0;
+
+      for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ )
+      {
+        AF_LatinBlue  blue = latin->blues + bb;
+        FT_Bool       is_top_blue, is_major_dir;
+
+
+        /* skip inactive blue zones (i.e., those that are too small) */
+        if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) )
+          continue;
+
+        /* if it is a top zone, check for right edges -- if it is a bottom */
+        /* zone, check for left edges                                      */
+        /*                                                                 */
+        /* of course, that's for TrueType                                  */
+        is_top_blue  = (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_TOP ) != 0 );
+        is_major_dir = FT_BOOL( edge->dir == axis->major_dir );
+
+        /* if it is a top zone, the edge must be against the major    */
+        /* direction; if it is a bottom zone, it must be in the major */
+        /* direction                                                  */
+        if ( is_top_blue ^ is_major_dir )
+        {
+          FT_Pos     dist;
+          AF_Width   compare;
+
+
+          /* if it's a rounded edge, compare it to the overshoot position */
+          /* if it's a flat edge, compare it to the reference position    */
+          if ( edge->flags & AF_EDGE_ROUND )
+            compare = &blue->shoot;
+          else
+            compare = &blue->ref;
+
+          dist = edge->fpos - compare->org;
+          if (dist < 0)
+            dist = -dist;
+
+          dist = FT_MulFix( dist, scale );
+          if ( dist < best_dist )
+          {
+            best_dist = dist;
+            best_blue = compare;
+          }
+
+#if 0
+          /* now, compare it to the overshoot position if the edge is     */
+          /* rounded, and if the edge is over the reference position of a */
+          /* top zone, or under the reference position of a bottom zone   */
+          if ( edge->flags & AF_EDGE_ROUND && dist != 0 )
+          {
+            FT_Bool  is_under_ref = FT_BOOL( edge->fpos < blue->ref.org );
+
+
+            if ( is_top_blue ^ is_under_ref )
+            {
+              blue = latin->blues + bb;
+              dist = edge->fpos - blue->shoot.org;
+              if ( dist < 0 )
+                dist = -dist;
+
+              dist = FT_MulFix( dist, scale );
+              if ( dist < best_dist )
+              {
+                best_dist = dist;
+                best_blue = & blue->shoot;
+              }
+            }
+          }
+#endif
+        }
+      }
+
+      if ( best_blue )
+        edge->blue_edge = best_blue;
+    }
+  }
+
+
+  static FT_Error
+  af_latin2_hints_init( AF_GlyphHints    hints,
+                        AF_LatinMetrics  metrics )
+  {
+    FT_Render_Mode  mode;
+    FT_UInt32       scaler_flags, other_flags;
+    FT_Face         face = metrics->root.scaler.face;
+
+
+    af_glyph_hints_rescale( hints, (AF_ScriptMetrics)metrics );
+
+    /*
+     *  correct x_scale and y_scale if needed, since they may have
+     *  been modified `af_latin2_metrics_scale_dim' above
+     */
+    hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale;
+    hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta;
+    hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale;
+    hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta;
+
+    /* compute flags depending on render mode, etc. */
+    mode = metrics->root.scaler.render_mode;
+
+#if 0 /* #ifdef AF_CONFIG_OPTION_USE_WARPER */
+    if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V )
+    {
+      metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL;
+    }
+#endif
+
+    scaler_flags = hints->scaler_flags;
+    other_flags  = 0;
+
+    /*
+     *  We snap the width of vertical stems for the monochrome and
+     *  horizontal LCD rendering targets only.
+     */
+    if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD )
+      other_flags |= AF_LATIN_HINTS_HORZ_SNAP;
+
+    /*
+     *  We snap the width of horizontal stems for the monochrome and
+     *  vertical LCD rendering targets only.
+     */
+    if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V )
+      other_flags |= AF_LATIN_HINTS_VERT_SNAP;
+
+    /*
+     *  We adjust stems to full pixels only if we don't use the `light' mode.
+     */
+    if ( mode != FT_RENDER_MODE_LIGHT )
+      other_flags |= AF_LATIN_HINTS_STEM_ADJUST;
+
+    if ( mode == FT_RENDER_MODE_MONO )
+      other_flags |= AF_LATIN_HINTS_MONO;
+
+    /*
+     *  In `light' hinting mode we disable horizontal hinting completely.
+     *  We also do it if the face is italic.
+     */
+    if ( mode == FT_RENDER_MODE_LIGHT                    ||
+         (face->style_flags & FT_STYLE_FLAG_ITALIC) != 0 )
+      scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL;
+
+    hints->scaler_flags = scaler_flags;
+    hints->other_flags  = other_flags;
+
+    return 0;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****        L A T I N   G L Y P H   G R I D - F I T T I N G        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* snap a given width in scaled coordinates to one of the */
+  /* current standard widths                                */
+
+  static FT_Pos
+  af_latin2_snap_width( AF_Width  widths,
+                        FT_Int    count,
+                        FT_Pos    width )
+  {
+    int     n;
+    FT_Pos  best      = 64 + 32 + 2;
+    FT_Pos  reference = width;
+    FT_Pos  scaled;
+
+
+    for ( n = 0; n < count; n++ )
+    {
+      FT_Pos  w;
+      FT_Pos  dist;
+
+
+      w = widths[n].cur;
+      dist = width - w;
+      if ( dist < 0 )
+        dist = -dist;
+      if ( dist < best )
+      {
+        best      = dist;
+        reference = w;
+      }
+    }
+
+    scaled = FT_PIX_ROUND( reference );
+
+    if ( width >= reference )
+    {
+      if ( width < scaled + 48 )
+        width = reference;
+    }
+    else
+    {
+      if ( width > scaled - 48 )
+        width = reference;
+    }
+
+    return width;
+  }
+
+
+  /* compute the snapped width of a given stem */
+
+  static FT_Pos
+  af_latin2_compute_stem_width( AF_GlyphHints  hints,
+                                AF_Dimension   dim,
+                                FT_Pos         width,
+                                AF_Edge_Flags  base_flags,
+                                AF_Edge_Flags  stem_flags )
+  {
+    AF_LatinMetrics  metrics  = (AF_LatinMetrics) hints->metrics;
+    AF_LatinAxis     axis     = & metrics->axis[dim];
+    FT_Pos           dist     = width;
+    FT_Int           sign     = 0;
+    FT_Int           vertical = ( dim == AF_DIMENSION_VERT );
+
+
+    FT_UNUSED(base_flags);
+
+    if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ||
+          axis->extra_light                      )
+      return width;
+
+    if ( dist < 0 )
+    {
+      dist = -width;
+      sign = 1;
+    }
+
+    if ( (  vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ||
+         ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) )
+    {
+      /* smooth hinting process: very lightly quantize the stem width */
+
+      /* leave the widths of serifs alone */
+
+      if ( ( stem_flags & AF_EDGE_SERIF ) && vertical && ( dist < 3 * 64 ) )
+        goto Done_Width;
+
+#if 0
+      else if ( ( base_flags & AF_EDGE_ROUND ) )
+      {
+        if ( dist < 80 )
+          dist = 64;
+      }
+      else if ( dist < 56 )
+        dist = 56;
+#endif
+      if ( axis->width_count > 0 )
+      {
+        FT_Pos  delta;
+
+
+        /* compare to standard width */
+        if ( axis->width_count > 0 )
+        {
+          delta = dist - axis->widths[0].cur;
+
+          if ( delta < 0 )
+            delta = -delta;
+
+          if ( delta < 40 )
+          {
+            dist = axis->widths[0].cur;
+            if ( dist < 48 )
+              dist = 48;
+
+            goto Done_Width;
+          }
+        }
+
+        if ( dist < 3 * 64 )
+        {
+          delta  = dist & 63;
+          dist  &= -64;
+
+          if ( delta < 10 )
+            dist += delta;
+
+          else if ( delta < 32 )
+            dist += 10;
+
+          else if ( delta < 54 )
+            dist += 54;
+
+          else
+            dist += delta;
+        }
+        else
+          dist = ( dist + 32 ) & ~63;
+      }
+    }
+    else
+    {
+      /* strong hinting process: snap the stem width to integer pixels */
+      FT_Pos  org_dist = dist;
+
+
+      dist = af_latin2_snap_width( axis->widths, axis->width_count, dist );
+
+      if ( vertical )
+      {
+        /* in the case of vertical hinting, always round */
+        /* the stem heights to integer pixels            */
+
+        if ( dist >= 64 )
+          dist = ( dist + 16 ) & ~63;
+        else
+          dist = 64;
+      }
+      else
+      {
+        if ( AF_LATIN_HINTS_DO_MONO( hints ) )
+        {
+          /* monochrome horizontal hinting: snap widths to integer pixels */
+          /* with a different threshold                                   */
+
+          if ( dist < 64 )
+            dist = 64;
+          else
+            dist = ( dist + 32 ) & ~63;
+        }
+        else
+        {
+          /* for horizontal anti-aliased hinting, we adopt a more subtle */
+          /* approach: we strengthen small stems, round stems whose size */
+          /* is between 1 and 2 pixels to an integer, otherwise nothing  */
+
+          if ( dist < 48 )
+            dist = ( dist + 64 ) >> 1;
+
+          else if ( dist < 128 )
+          {
+            /* We only round to an integer width if the corresponding */
+            /* distortion is less than 1/4 pixel.  Otherwise this     */
+            /* makes everything worse since the diagonals, which are  */
+            /* not hinted, appear a lot bolder or thinner than the    */
+            /* vertical stems.                                        */
+
+            FT_Int  delta;
+
+
+            dist = ( dist + 22 ) & ~63;
+            delta = dist - org_dist;
+            if ( delta < 0 )
+              delta = -delta;
+
+            if (delta >= 16)
+            {
+              dist = org_dist;
+              if ( dist < 48 )
+                dist = ( dist + 64 ) >> 1;
+            }
+          }
+          else
+            /* round otherwise to prevent color fringes in LCD mode */
+            dist = ( dist + 32 ) & ~63;
+        }
+      }
+    }
+
+  Done_Width:
+    if ( sign )
+      dist = -dist;
+
+    return dist;
+  }
+
+
+  /* align one stem edge relative to the previous stem edge */
+
+  static void
+  af_latin2_align_linked_edge( AF_GlyphHints  hints,
+                               AF_Dimension   dim,
+                               AF_Edge        base_edge,
+                               AF_Edge        stem_edge )
+  {
+    FT_Pos  dist = stem_edge->opos - base_edge->opos;
+
+    FT_Pos  fitted_width = af_latin2_compute_stem_width(
+                             hints, dim, dist,
+                             (AF_Edge_Flags)base_edge->flags,
+                             (AF_Edge_Flags)stem_edge->flags );
+
+
+    stem_edge->pos = base_edge->pos + fitted_width;
+
+    FT_TRACE5(( "LINK: edge %d (opos=%.2f) linked to (%.2f), "
+                "dist was %.2f, now %.2f\n",
+                stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0,
+                stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 ));
+  }
+
+
+  static void
+  af_latin2_align_serif_edge( AF_GlyphHints  hints,
+                              AF_Edge        base,
+                              AF_Edge        serif )
+  {
+    FT_UNUSED( hints );
+
+    serif->pos = base->pos + (serif->opos - base->opos);
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                    E D G E   H I N T I N G                      ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_LOCAL_DEF( void )
+  af_latin2_hint_edges( AF_GlyphHints  hints,
+                        AF_Dimension   dim )
+  {
+    AF_AxisHints  axis       = &hints->axis[dim];
+    AF_Edge       edges      = axis->edges;
+    AF_Edge       edge_limit = edges + axis->num_edges;
+    AF_Edge       edge;
+    AF_Edge       anchor     = 0;
+    FT_Int        has_serifs = 0;
+    FT_Pos        anchor_drift = 0;
+
+
+
+    FT_TRACE5(( "==== hinting %s edges =====\n",
+                dim == AF_DIMENSION_HORZ ? "vertical" : "horizontal" ));
+
+    /* we begin by aligning all stems relative to the blue zone */
+    /* if needed -- that's only for horizontal edges            */
+
+    if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) )
+    {
+      for ( edge = edges; edge < edge_limit; edge++ )
+      {
+        AF_Width  blue;
+        AF_Edge   edge1, edge2;
+
+
+        if ( edge->flags & AF_EDGE_DONE )
+          continue;
+
+        blue  = edge->blue_edge;
+        edge1 = NULL;
+        edge2 = edge->link;
+
+        if ( blue )
+        {
+          edge1 = edge;
+        }
+        else if ( edge2 && edge2->blue_edge )
+        {
+          blue  = edge2->blue_edge;
+          edge1 = edge2;
+          edge2 = edge;
+        }
+
+        if ( !edge1 )
+          continue;
+
+        FT_TRACE5(( "BLUE: edge %d (opos=%.2f) snapped to (%.2f), "
+                    "was (%.2f)\n",
+                    edge1-edges, edge1->opos / 64.0, blue->fit / 64.0,
+                    edge1->pos / 64.0 ));
+
+        edge1->pos    = blue->fit;
+        edge1->flags |= AF_EDGE_DONE;
+
+        if ( edge2 && !edge2->blue_edge )
+        {
+          af_latin2_align_linked_edge( hints, dim, edge1, edge2 );
+          edge2->flags |= AF_EDGE_DONE;
+        }
+
+        if ( !anchor )
+        {
+          anchor = edge;
+
+          anchor_drift = (anchor->pos - anchor->opos);
+          if (edge2)
+            anchor_drift = (anchor_drift + (edge2->pos - edge2->opos)) >> 1;
+        }
+      }
+    }
+
+    /* now we will align all stem edges, trying to maintain the */
+    /* relative order of stems in the glyph                     */
+    for ( edge = edges; edge < edge_limit; edge++ )
+    {
+      AF_Edge  edge2;
+
+
+      if ( edge->flags & AF_EDGE_DONE )
+        continue;
+
+      /* skip all non-stem edges */
+      edge2 = edge->link;
+      if ( !edge2 )
+      {
+        has_serifs++;
+        continue;
+      }
+
+      /* now align the stem */
+
+      /* this should not happen, but it's better to be safe */
+      if ( edge2->blue_edge )
+      {
+        FT_TRACE5(( "ASSERTION FAILED for edge %d\n", edge2-edges ));
+
+        af_latin2_align_linked_edge( hints, dim, edge2, edge );
+        edge->flags |= AF_EDGE_DONE;
+        continue;
+      }
+
+      if ( !anchor )
+      {
+        FT_Pos  org_len, org_center, cur_len;
+        FT_Pos  cur_pos1, error1, error2, u_off, d_off;
+
+
+        org_len = edge2->opos - edge->opos;
+        cur_len = af_latin2_compute_stem_width(
+                    hints, dim, org_len,
+                    (AF_Edge_Flags)edge->flags,
+                    (AF_Edge_Flags)edge2->flags );
+        if ( cur_len <= 64 )
+          u_off = d_off = 32;
+        else
+        {
+          u_off = 38;
+          d_off = 26;
+        }
+
+        if ( cur_len < 96 )
+        {
+          org_center = edge->opos + ( org_len >> 1 );
+
+          cur_pos1   = FT_PIX_ROUND( org_center );
+
+          error1 = org_center - ( cur_pos1 - u_off );
+          if ( error1 < 0 )
+            error1 = -error1;
+
+          error2 = org_center - ( cur_pos1 + d_off );
+          if ( error2 < 0 )
+            error2 = -error2;
+
+          if ( error1 < error2 )
+            cur_pos1 -= u_off;
+          else
+            cur_pos1 += d_off;
+
+          edge->pos  = cur_pos1 - cur_len / 2;
+          edge2->pos = edge->pos + cur_len;
+        }
+        else
+          edge->pos = FT_PIX_ROUND( edge->opos );
+
+        FT_TRACE5(( "ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f)"
+                    " snapped to (%.2f) (%.2f)\n",
+                    edge-edges, edge->opos / 64.0,
+                    edge2-edges, edge2->opos / 64.0,
+                    edge->pos / 64.0, edge2->pos / 64.0 ));
+        anchor = edge;
+
+        edge->flags |= AF_EDGE_DONE;
+
+        af_latin2_align_linked_edge( hints, dim, edge, edge2 );
+
+        edge2->flags |= AF_EDGE_DONE;
+
+        anchor_drift = ( (anchor->pos - anchor->opos) +
+                         (edge2->pos - edge2->opos)) >> 1;
+
+        FT_TRACE5(( "DRIFT: %.2f\n", anchor_drift/64.0 ));
+      }
+      else
+      {
+        FT_Pos   org_pos, org_len, org_center, cur_center, cur_len;
+        FT_Pos   org_left, org_right;
+
+
+        org_pos    = edge->opos + anchor_drift;
+        org_len    = edge2->opos - edge->opos;
+        org_center = org_pos + ( org_len >> 1 );
+
+        cur_len = af_latin2_compute_stem_width(
+                   hints, dim, org_len,
+                   (AF_Edge_Flags)edge->flags,
+                   (AF_Edge_Flags)edge2->flags );
+
+        org_left  = org_pos + ((org_len - cur_len) >> 1);
+        org_right = org_pos + ((org_len + cur_len) >> 1);
+
+        FT_TRACE5(( "ALIGN: left=%.2f right=%.2f ",
+                    org_left / 64.0, org_right / 64.0 ));
+        cur_center = org_center;
+
+        if ( edge2->flags & AF_EDGE_DONE )
+        {
+          FT_TRACE5(( "\n" ));
+          edge->pos = edge2->pos - cur_len;
+        }
+        else
+        {
+         /* we want to compare several displacement, and choose
+          * the one that increases fitness while minimizing
+          * distortion as well
+          */
+          FT_Pos   displacements[6], scores[6], org, fit, delta;
+          FT_UInt  count = 0;
+
+          /* note: don't even try to fit tiny stems */
+          if ( cur_len < 32 )
+          {
+            FT_TRACE5(( "tiny stem\n" ));
+            goto AlignStem;
+          }
+
+          /* if the span is within a single pixel, don't touch it */
+          if ( FT_PIX_FLOOR(org_left) == FT_PIX_CEIL(org_right) )
+          {
+            FT_TRACE5(( "single pixel stem\n" ));
+            goto AlignStem;
+          }
+
+          if (cur_len <= 96)
+          {
+           /* we want to avoid the absolute worst case which is
+            * when the left and right edges of the span each represent
+            * about 50% of the gray. we'd better want to change this
+            * to 25/75%, since this is much more pleasant to the eye with
+            * very acceptable distortion
+            */
+            FT_Pos  frac_left  = (org_left) & 63;
+            FT_Pos  frac_right = (org_right) & 63;
+
+            if ( frac_left  >= 22 && frac_left  <= 42 &&
+                 frac_right >= 22 && frac_right <= 42 )
+            {
+              org = frac_left;
+              fit = (org <= 32) ? 16 : 48;
+              delta = FT_ABS(fit - org);
+              displacements[count] = fit - org;
+              scores[count++]      = delta;
+              FT_TRACE5(( "dispA=%.2f (%d) ", (fit - org) / 64.0, delta ));
+
+              org = frac_right;
+              fit = (org <= 32) ? 16 : 48;
+              delta = FT_ABS(fit - org);
+              displacements[count] = fit - org;
+              scores[count++]     = delta;
+              FT_TRACE5(( "dispB=%.2f (%d) ", (fit - org) / 64.0, delta ));
+            }
+          }
+
+          /* snapping the left edge to the grid */
+          org   = org_left;
+          fit   = FT_PIX_ROUND(org);
+          delta = FT_ABS(fit - org);
+          displacements[count] = fit - org;
+          scores[count++]      = delta;
+          FT_TRACE5(( "dispC=%.2f (%d) ", (fit - org) / 64.0, delta ));
+
+          /* snapping the right edge to the grid */
+          org   = org_right;
+          fit   = FT_PIX_ROUND(org);
+          delta = FT_ABS(fit - org);
+          displacements[count] = fit - org;
+          scores[count++]      = delta;
+          FT_TRACE5(( "dispD=%.2f (%d) ", (fit - org) / 64.0, delta ));
+
+          /* now find the best displacement */
+          {
+            FT_Pos  best_score = scores[0];
+            FT_Pos  best_disp  = displacements[0];
+            FT_UInt nn;
+
+            for (nn = 1; nn < count; nn++)
+            {
+              if (scores[nn] < best_score)
+              {
+                best_score = scores[nn];
+                best_disp  = displacements[nn];
+              }
+            }
+
+            cur_center = org_center + best_disp;
+          }
+          FT_TRACE5(( "\n" ));
+        }
+
+      AlignStem:
+        edge->pos  = cur_center - (cur_len >> 1);
+        edge2->pos = edge->pos + cur_len;
+
+        FT_TRACE5(( "STEM1: %d (opos=%.2f) to %d (opos=%.2f)"
+                    " snapped to (%.2f) and (%.2f),"
+                    " org_len=%.2f cur_len=%.2f\n",
+                    edge-edges, edge->opos / 64.0,
+                    edge2-edges, edge2->opos / 64.0,
+                    edge->pos / 64.0, edge2->pos / 64.0,
+                    org_len / 64.0, cur_len / 64.0 ));
+
+        edge->flags  |= AF_EDGE_DONE;
+        edge2->flags |= AF_EDGE_DONE;
+
+        if ( edge > edges && edge->pos < edge[-1].pos )
+        {
+          FT_TRACE5(( "BOUND: %d (pos=%.2f) to (%.2f)\n",
+                      edge-edges, edge->pos / 64.0, edge[-1].pos / 64.0 ));
+          edge->pos = edge[-1].pos;
+        }
+      }
+    }
+
+    /* make sure that lowercase m's maintain their symmetry */
+
+    /* In general, lowercase m's have six vertical edges if they are sans */
+    /* serif, or twelve if they are with serifs.  This implementation is  */
+    /* based on that assumption, and seems to work very well with most    */
+    /* faces.  However, if for a certain face this assumption is not      */
+    /* true, the m is just rendered like before.  In addition, any stem   */
+    /* correction will only be applied to symmetrical glyphs (even if the */
+    /* glyph is not an m), so the potential for unwanted distortion is    */
+    /* relatively low.                                                    */
+
+    /* We don't handle horizontal edges since we can't easily assure that */
+    /* the third (lowest) stem aligns with the base line; it might end up */
+    /* one pixel higher or lower.                                         */
+
+#if 0
+    {
+      FT_Int  n_edges = edge_limit - edges;
+
+
+      if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) )
+      {
+        AF_Edge  edge1, edge2, edge3;
+        FT_Pos   dist1, dist2, span, delta;
+
+
+        if ( n_edges == 6 )
+        {
+          edge1 = edges;
+          edge2 = edges + 2;
+          edge3 = edges + 4;
+        }
+        else
+        {
+          edge1 = edges + 1;
+          edge2 = edges + 5;
+          edge3 = edges + 9;
+        }
+
+        dist1 = edge2->opos - edge1->opos;
+        dist2 = edge3->opos - edge2->opos;
+
+        span = dist1 - dist2;
+        if ( span < 0 )
+          span = -span;
+
+        if ( span < 8 )
+        {
+          delta = edge3->pos - ( 2 * edge2->pos - edge1->pos );
+          edge3->pos -= delta;
+          if ( edge3->link )
+            edge3->link->pos -= delta;
+
+          /* move the serifs along with the stem */
+          if ( n_edges == 12 )
+          {
+            ( edges + 8 )->pos -= delta;
+            ( edges + 11 )->pos -= delta;
+          }
+
+          edge3->flags |= AF_EDGE_DONE;
+          if ( edge3->link )
+            edge3->link->flags |= AF_EDGE_DONE;
+        }
+      }
+    }
+#endif
+
+    if ( has_serifs || !anchor )
+    {
+      /*
+       *  now hint the remaining edges (serifs and single) in order
+       *  to complete our processing
+       */
+      for ( edge = edges; edge < edge_limit; edge++ )
+      {
+        FT_Pos  delta;
+
+
+        if ( edge->flags & AF_EDGE_DONE )
+          continue;
+
+        delta = 1000;
+
+        if ( edge->serif )
+        {
+          delta = edge->serif->opos - edge->opos;
+          if ( delta < 0 )
+            delta = -delta;
+        }
+
+        if ( delta < 64 + 16 )
+        {
+          af_latin2_align_serif_edge( hints, edge->serif, edge );
+          FT_TRACE5(( "SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f)"
+                      " aligned to (%.2f)\n",
+                      edge-edges, edge->opos / 64.0,
+                      edge->serif - edges, edge->serif->opos / 64.0,
+                      edge->pos / 64.0 ));
+        }
+        else if ( !anchor )
+        {
+          FT_TRACE5(( "SERIF_ANCHOR: edge %d (opos=%.2f)"
+                      " snapped to (%.2f)\n",
+                      edge-edges, edge->opos / 64.0, edge->pos / 64.0 ));
+          edge->pos = FT_PIX_ROUND( edge->opos );
+          anchor    = edge;
+        }
+        else
+        {
+          AF_Edge  before, after;
+
+
+          for ( before = edge - 1; before >= edges; before-- )
+            if ( before->flags & AF_EDGE_DONE )
+              break;
+
+          for ( after = edge + 1; after < edge_limit; after++ )
+            if ( after->flags & AF_EDGE_DONE )
+              break;
+
+          if ( before >= edges && before < edge   &&
+               after < edge_limit && after > edge )
+          {
+            if ( after->opos == before->opos )
+              edge->pos = before->pos;
+            else
+              edge->pos = before->pos +
+                          FT_MulDiv( edge->opos - before->opos,
+                                     after->pos - before->pos,
+                                     after->opos - before->opos );
+            FT_TRACE5(( "SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f)"
+                        " from %d (opos=%.2f)\n",
+                        edge-edges, edge->opos / 64.0, edge->pos / 64.0,
+                        before - edges, before->opos / 64.0 ));
+          }
+          else
+          {
+            edge->pos = anchor->pos +
+                        ( ( edge->opos - anchor->opos + 16 ) & ~31 );
+
+            FT_TRACE5(( "SERIF_LINK2: edge %d (opos=%.2f)"
+                        " snapped to (%.2f)\n",
+                        edge-edges, edge->opos / 64.0, edge->pos / 64.0 ));
+          }
+        }
+
+        edge->flags |= AF_EDGE_DONE;
+
+        if ( edge > edges && edge->pos < edge[-1].pos )
+          edge->pos = edge[-1].pos;
+
+        if ( edge + 1 < edge_limit        &&
+             edge[1].flags & AF_EDGE_DONE &&
+             edge->pos > edge[1].pos      )
+          edge->pos = edge[1].pos;
+      }
+    }
+  }
+
+
+  static FT_Error
+  af_latin2_hints_apply( AF_GlyphHints    hints,
+                         FT_Outline*      outline,
+                         AF_LatinMetrics  metrics )
+  {
+    FT_Error  error;
+    int       dim;
+
+
+    error = af_glyph_hints_reload( hints, outline );
+    if ( error )
+      goto Exit;
+
+    /* analyze glyph outline */
+#ifdef AF_CONFIG_OPTION_USE_WARPER
+    if ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT ||
+         AF_HINTS_DO_HORIZONTAL( hints ) )
+#else
+    if ( AF_HINTS_DO_HORIZONTAL( hints ) )
+#endif
+    {
+      error = af_latin2_hints_detect_features( hints, AF_DIMENSION_HORZ );
+      if ( error )
+        goto Exit;
+    }
+
+    if ( AF_HINTS_DO_VERTICAL( hints ) )
+    {
+      error = af_latin2_hints_detect_features( hints, AF_DIMENSION_VERT );
+      if ( error )
+        goto Exit;
+
+      af_latin2_hints_compute_blue_edges( hints, metrics );
+    }
+
+    /* grid-fit the outline */
+    for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ )
+    {
+#ifdef AF_CONFIG_OPTION_USE_WARPER
+      if ( ( dim == AF_DIMENSION_HORZ &&
+             metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT ) )
+      {
+        AF_WarperRec  warper;
+        FT_Fixed      scale;
+        FT_Pos        delta;
+
+
+        af_warper_compute( &warper, hints, dim, &scale, &delta );
+        af_glyph_hints_scale_dim( hints, dim, scale, delta );
+        continue;
+      }
+#endif
+
+      if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) ||
+           ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) )   )
+      {
+        af_latin2_hint_edges( hints, (AF_Dimension)dim );
+        af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim );
+        af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim );
+        af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim );
+      }
+    }
+    af_glyph_hints_save( hints, outline );
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****              L A T I N   S C R I P T   C L A S S              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  static const AF_Script_UniRangeRec  af_latin2_uniranges[] =
+  {
+    AF_UNIRANGE_REC( 32UL,  127UL ),    /* TODO: Add new Unicode ranges here! */
+    AF_UNIRANGE_REC( 160UL, 255UL ),
+    AF_UNIRANGE_REC( 0UL,   0UL )
+  };
+
+
+  AF_DEFINE_SCRIPT_CLASS( af_latin2_script_class,
+    AF_SCRIPT_LATIN2,
+    af_latin2_uniranges,
+
+    sizeof ( AF_LatinMetricsRec ),
+
+    (AF_Script_InitMetricsFunc) af_latin2_metrics_init,
+    (AF_Script_ScaleMetricsFunc)af_latin2_metrics_scale,
+    (AF_Script_DoneMetricsFunc) NULL,
+
+    (AF_Script_InitHintsFunc)   af_latin2_hints_init,
+    (AF_Script_ApplyHintsFunc)  af_latin2_hints_apply
+  )
+
+
+/* END */
diff --git a/src/autofit/aflatin2.h b/src/autofit/aflatin2.h
new file mode 100644 (file)
index 0000000..925c621
--- /dev/null
@@ -0,0 +1,39 @@
+/***************************************************************************/
+/*                                                                         */
+/*  aflatin2.h                                                             */
+/*                                                                         */
+/*    Auto-fitter hinting routines for latin script (specification).       */
+/*                                                                         */
+/*  Copyright 2003, 2004, 2005, 2006, 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __AFLATIN2_H__
+#define __AFLATIN2_H__
+
+#include "afhints.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /* the latin-specific script class */
+
+  AF_DECLARE_SCRIPT_CLASS(af_latin2_script_class)
+
+/* */
+
+FT_END_HEADER
+
+#endif /* __AFLATIN_H__ */
+
+
+/* END */
diff --git a/src/autofit/afloader.c b/src/autofit/afloader.c
new file mode 100644 (file)
index 0000000..34ef9d8
--- /dev/null
@@ -0,0 +1,554 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afloader.c                                                             */
+/*                                                                         */
+/*    Auto-fitter glyph loading routines (body).                           */
+/*                                                                         */
+/*  Copyright 2003-2009, 2011-2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "afloader.h"
+#include "afhints.h"
+#include "afglobal.h"
+#include "aferrors.h"
+
+
+  /* Initialize glyph loader. */
+
+  FT_LOCAL_DEF( FT_Error )
+  af_loader_init( AF_Loader  loader,
+                  FT_Memory  memory )
+  {
+    FT_ZERO( loader );
+
+    af_glyph_hints_init( &loader->hints, memory );
+#ifdef FT_DEBUG_AUTOFIT
+    _af_debug_hints = &loader->hints;
+#endif
+    return FT_GlyphLoader_New( memory, &loader->gloader );
+  }
+
+
+  /* Reset glyph loader and compute globals if necessary. */
+
+  FT_LOCAL_DEF( FT_Error )
+  af_loader_reset( AF_Loader  loader,
+                   FT_Face    face )
+  {
+    FT_Error  error = AF_Err_Ok;
+
+
+    loader->face    = face;
+    loader->globals = (AF_FaceGlobals)face->autohint.data;
+
+    FT_GlyphLoader_Rewind( loader->gloader );
+
+    if ( loader->globals == NULL )
+    {
+      error = af_face_globals_new( face, &loader->globals );
+      if ( !error )
+      {
+        face->autohint.data =
+          (FT_Pointer)loader->globals;
+        face->autohint.finalizer =
+          (FT_Generic_Finalizer)af_face_globals_free;
+      }
+    }
+
+    return error;
+  }
+
+
+  /* Finalize glyph loader. */
+
+  FT_LOCAL_DEF( void )
+  af_loader_done( AF_Loader  loader )
+  {
+    af_glyph_hints_done( &loader->hints );
+
+    loader->face    = NULL;
+    loader->globals = NULL;
+
+#ifdef FT_DEBUG_AUTOFIT
+    _af_debug_hints = NULL;
+#endif
+    FT_GlyphLoader_Done( loader->gloader );
+    loader->gloader = NULL;
+  }
+
+
+  /* Load a single glyph component.  This routine calls itself */
+  /* recursively, if necessary, and does the main work of      */
+  /* `af_loader_load_glyph.'                                   */
+
+  static FT_Error
+  af_loader_load_g( AF_Loader  loader,
+                    AF_Scaler  scaler,
+                    FT_UInt    glyph_index,
+                    FT_Int32   load_flags,
+                    FT_UInt    depth )
+  {
+    FT_Error          error;
+    FT_Face           face     = loader->face;
+    FT_GlyphLoader    gloader  = loader->gloader;
+    AF_ScriptMetrics  metrics  = loader->metrics;
+    AF_GlyphHints     hints    = &loader->hints;
+    FT_GlyphSlot      slot     = face->glyph;
+    FT_Slot_Internal  internal = slot->internal;
+
+
+    error = FT_Load_Glyph( face, glyph_index, load_flags );
+    if ( error )
+      goto Exit;
+
+    loader->transformed = internal->glyph_transformed;
+    if ( loader->transformed )
+    {
+      FT_Matrix  inverse;
+
+
+      loader->trans_matrix = internal->glyph_matrix;
+      loader->trans_delta  = internal->glyph_delta;
+
+      inverse = loader->trans_matrix;
+      FT_Matrix_Invert( &inverse );
+      FT_Vector_Transform( &loader->trans_delta, &inverse );
+    }
+
+    /* set linear metrics */
+    slot->linearHoriAdvance = slot->metrics.horiAdvance;
+    slot->linearVertAdvance = slot->metrics.vertAdvance;
+
+    switch ( slot->format )
+    {
+    case FT_GLYPH_FORMAT_OUTLINE:
+      /* translate the loaded glyph when an internal transform is needed */
+      if ( loader->transformed )
+        FT_Outline_Translate( &slot->outline,
+                              loader->trans_delta.x,
+                              loader->trans_delta.y );
+
+      /* copy the outline points in the loader's current               */
+      /* extra points which is used to keep original glyph coordinates */
+      error = FT_GLYPHLOADER_CHECK_POINTS( gloader,
+                                           slot->outline.n_points + 4,
+                                           slot->outline.n_contours );
+      if ( error )
+        goto Exit;
+
+      FT_ARRAY_COPY( gloader->current.outline.points,
+                     slot->outline.points,
+                     slot->outline.n_points );
+
+      FT_ARRAY_COPY( gloader->current.outline.contours,
+                     slot->outline.contours,
+                     slot->outline.n_contours );
+
+      FT_ARRAY_COPY( gloader->current.outline.tags,
+                     slot->outline.tags,
+                     slot->outline.n_points );
+
+      gloader->current.outline.n_points   = slot->outline.n_points;
+      gloader->current.outline.n_contours = slot->outline.n_contours;
+
+      /* compute original horizontal phantom points (and ignore */
+      /* vertical ones)                                         */
+      loader->pp1.x = hints->x_delta;
+      loader->pp1.y = hints->y_delta;
+      loader->pp2.x = FT_MulFix( slot->metrics.horiAdvance,
+                                 hints->x_scale ) + hints->x_delta;
+      loader->pp2.y = hints->y_delta;
+
+      /* be sure to check for spacing glyphs */
+      if ( slot->outline.n_points == 0 )
+        goto Hint_Metrics;
+
+      /* now load the slot image into the auto-outline and run the */
+      /* automatic hinting process                                 */
+      if ( metrics->clazz->script_hints_apply )
+        metrics->clazz->script_hints_apply( hints,
+                                            &gloader->current.outline,
+                                            metrics );
+
+      /* we now need to adjust the metrics according to the change in */
+      /* width/positioning that occurred during the hinting process   */
+      if ( scaler->render_mode != FT_RENDER_MODE_LIGHT )
+      {
+        FT_Pos        old_rsb, old_lsb, new_lsb;
+        FT_Pos        pp1x_uh, pp2x_uh;
+        AF_AxisHints  axis  = &hints->axis[AF_DIMENSION_HORZ];
+        AF_Edge       edge1 = axis->edges;         /* leftmost edge  */
+        AF_Edge       edge2 = edge1 +
+                              axis->num_edges - 1; /* rightmost edge */
+
+
+        if ( axis->num_edges > 1 && AF_HINTS_DO_ADVANCE( hints ) )
+        {
+          old_rsb = loader->pp2.x - edge2->opos;
+          old_lsb = edge1->opos;
+          new_lsb = edge1->pos;
+
+          /* remember unhinted values to later account */
+          /* for rounding errors                       */
+
+          pp1x_uh = new_lsb    - old_lsb;
+          pp2x_uh = edge2->pos + old_rsb;
+
+          /* prefer too much space over too little space */
+          /* for very small sizes                        */
+
+          if ( old_lsb < 24 )
+            pp1x_uh -= 8;
+
+          if ( old_rsb < 24 )
+            pp2x_uh += 8;
+
+          loader->pp1.x = FT_PIX_ROUND( pp1x_uh );
+          loader->pp2.x = FT_PIX_ROUND( pp2x_uh );
+
+          if ( loader->pp1.x >= new_lsb && old_lsb > 0 )
+            loader->pp1.x -= 64;
+
+          if ( loader->pp2.x <= edge2->pos && old_rsb > 0 )
+            loader->pp2.x += 64;
+
+          slot->lsb_delta = loader->pp1.x - pp1x_uh;
+          slot->rsb_delta = loader->pp2.x - pp2x_uh;
+        }
+        else
+        {
+          FT_Pos  pp1x = loader->pp1.x;
+          FT_Pos  pp2x = loader->pp2.x;
+
+
+          loader->pp1.x = FT_PIX_ROUND( pp1x );
+          loader->pp2.x = FT_PIX_ROUND( pp2x );
+
+          slot->lsb_delta = loader->pp1.x - pp1x;
+          slot->rsb_delta = loader->pp2.x - pp2x;
+        }
+      }
+      else
+      {
+        FT_Pos  pp1x = loader->pp1.x;
+        FT_Pos  pp2x = loader->pp2.x;
+
+
+        loader->pp1.x = FT_PIX_ROUND( pp1x + hints->xmin_delta );
+        loader->pp2.x = FT_PIX_ROUND( pp2x + hints->xmax_delta );
+
+        slot->lsb_delta = loader->pp1.x - pp1x;
+        slot->rsb_delta = loader->pp2.x - pp2x;
+      }
+
+      /* good, we simply add the glyph to our loader's base */
+      FT_GlyphLoader_Add( gloader );
+      break;
+
+    case FT_GLYPH_FORMAT_COMPOSITE:
+      {
+        FT_UInt      nn, num_subglyphs = slot->num_subglyphs;
+        FT_UInt      num_base_subgs, start_point;
+        FT_SubGlyph  subglyph;
+
+
+        start_point = gloader->base.outline.n_points;
+
+        /* first of all, copy the subglyph descriptors in the glyph loader */
+        error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs );
+        if ( error )
+          goto Exit;
+
+        FT_ARRAY_COPY( gloader->current.subglyphs,
+                       slot->subglyphs,
+                       num_subglyphs );
+
+        gloader->current.num_subglyphs = num_subglyphs;
+        num_base_subgs                 = gloader->base.num_subglyphs;
+
+        /* now read each subglyph independently */
+        for ( nn = 0; nn < num_subglyphs; nn++ )
+        {
+          FT_Vector  pp1, pp2;
+          FT_Pos     x, y;
+          FT_UInt    num_points, num_new_points, num_base_points;
+
+
+          /* gloader.current.subglyphs can change during glyph loading due */
+          /* to re-allocation -- we must recompute the current subglyph on */
+          /* each iteration                                                */
+          subglyph = gloader->base.subglyphs + num_base_subgs + nn;
+
+          pp1 = loader->pp1;
+          pp2 = loader->pp2;
+
+          num_base_points = gloader->base.outline.n_points;
+
+          error = af_loader_load_g( loader, scaler, subglyph->index,
+                                    load_flags, depth + 1 );
+          if ( error )
+            goto Exit;
+
+          /* recompute subglyph pointer */
+          subglyph = gloader->base.subglyphs + num_base_subgs + nn;
+
+          if ( subglyph->flags & FT_SUBGLYPH_FLAG_USE_MY_METRICS )
+          {
+            pp1 = loader->pp1;
+            pp2 = loader->pp2;
+          }
+          else
+          {
+            loader->pp1 = pp1;
+            loader->pp2 = pp2;
+          }
+
+          num_points     = gloader->base.outline.n_points;
+          num_new_points = num_points - num_base_points;
+
+          /* now perform the transformation required for this subglyph */
+
+          if ( subglyph->flags & ( FT_SUBGLYPH_FLAG_SCALE    |
+                                   FT_SUBGLYPH_FLAG_XY_SCALE |
+                                   FT_SUBGLYPH_FLAG_2X2      ) )
+          {
+            FT_Vector*  cur   = gloader->base.outline.points +
+                                num_base_points;
+            FT_Vector*  limit = cur + num_new_points;
+
+
+            for ( ; cur < limit; cur++ )
+              FT_Vector_Transform( cur, &subglyph->transform );
+          }
+
+          /* apply offset */
+
+          if ( !( subglyph->flags & FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ) )
+          {
+            FT_Int      k = subglyph->arg1;
+            FT_UInt     l = subglyph->arg2;
+            FT_Vector*  p1;
+            FT_Vector*  p2;
+
+
+            if ( start_point + k >= num_base_points         ||
+                               l >= (FT_UInt)num_new_points )
+            {
+              error = AF_Err_Invalid_Composite;
+              goto Exit;
+            }
+
+            l += num_base_points;
+
+            /* for now, only use the current point coordinates;    */
+            /* we may consider another approach in the near future */
+            p1 = gloader->base.outline.points + start_point + k;
+            p2 = gloader->base.outline.points + start_point + l;
+
+            x = p1->x - p2->x;
+            y = p1->y - p2->y;
+          }
+          else
+          {
+            x = FT_MulFix( subglyph->arg1, hints->x_scale ) + hints->x_delta;
+            y = FT_MulFix( subglyph->arg2, hints->y_scale ) + hints->y_delta;
+
+            x = FT_PIX_ROUND( x );
+            y = FT_PIX_ROUND( y );
+          }
+
+          {
+            FT_Outline  dummy = gloader->base.outline;
+
+
+            dummy.points  += num_base_points;
+            dummy.n_points = (short)num_new_points;
+
+            FT_Outline_Translate( &dummy, x, y );
+          }
+        }
+      }
+      break;
+
+    default:
+      /* we don't support other formats (yet?) */
+      error = AF_Err_Unimplemented_Feature;
+    }
+
+  Hint_Metrics:
+    if ( depth == 0 )
+    {
+      FT_BBox    bbox;
+      FT_Vector  vvector;
+
+
+      vvector.x = slot->metrics.vertBearingX - slot->metrics.horiBearingX;
+      vvector.y = slot->metrics.vertBearingY - slot->metrics.horiBearingY;
+      vvector.x = FT_MulFix( vvector.x, metrics->scaler.x_scale );
+      vvector.y = FT_MulFix( vvector.y, metrics->scaler.y_scale );
+
+      /* transform the hinted outline if needed */
+      if ( loader->transformed )
+      {
+        FT_Outline_Transform( &gloader->base.outline, &loader->trans_matrix );
+        FT_Vector_Transform( &vvector, &loader->trans_matrix );
+      }
+#if 1
+      /* we must translate our final outline by -pp1.x and compute */
+      /* the new metrics                                           */
+      if ( loader->pp1.x )
+        FT_Outline_Translate( &gloader->base.outline, -loader->pp1.x, 0 );
+#endif
+      FT_Outline_Get_CBox( &gloader->base.outline, &bbox );
+
+      bbox.xMin = FT_PIX_FLOOR( bbox.xMin );
+      bbox.yMin = FT_PIX_FLOOR( bbox.yMin );
+      bbox.xMax = FT_PIX_CEIL(  bbox.xMax );
+      bbox.yMax = FT_PIX_CEIL(  bbox.yMax );
+
+      slot->metrics.width        = bbox.xMax - bbox.xMin;
+      slot->metrics.height       = bbox.yMax - bbox.yMin;
+      slot->metrics.horiBearingX = bbox.xMin;
+      slot->metrics.horiBearingY = bbox.yMax;
+
+      slot->metrics.vertBearingX = FT_PIX_FLOOR( bbox.xMin + vvector.x );
+      slot->metrics.vertBearingY = FT_PIX_FLOOR( bbox.yMax + vvector.y );
+
+      /* for mono-width fonts (like Andale, Courier, etc.) we need */
+      /* to keep the original rounded advance width; ditto for     */
+      /* digits if all have the same advance width                 */
+#if 0
+      if ( !FT_IS_FIXED_WIDTH( slot->face ) )
+        slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x;
+      else
+        slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance,
+                                               x_scale );
+#else
+      if ( scaler->render_mode != FT_RENDER_MODE_LIGHT                      &&
+           ( FT_IS_FIXED_WIDTH( slot->face )                              ||
+             ( af_face_globals_is_digit( loader->globals, glyph_index ) &&
+               metrics->digits_have_same_width                          ) ) )
+      {
+        slot->metrics.horiAdvance = FT_MulFix( slot->metrics.horiAdvance,
+                                               metrics->scaler.x_scale );
+
+        /* Set delta values to 0.  Otherwise code that uses them is */
+        /* going to ruin the fixed advance width.                   */
+        slot->lsb_delta = 0;
+        slot->rsb_delta = 0;
+      }
+      else
+      {
+        /* non-spacing glyphs must stay as-is */
+        if ( slot->metrics.horiAdvance )
+          slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x;
+      }
+#endif
+
+      slot->metrics.vertAdvance = FT_MulFix( slot->metrics.vertAdvance,
+                                             metrics->scaler.y_scale );
+
+      slot->metrics.horiAdvance = FT_PIX_ROUND( slot->metrics.horiAdvance );
+      slot->metrics.vertAdvance = FT_PIX_ROUND( slot->metrics.vertAdvance );
+
+      /* now copy outline into glyph slot */
+      FT_GlyphLoader_Rewind( internal->loader );
+      error = FT_GlyphLoader_CopyPoints( internal->loader, gloader );
+      if ( error )
+        goto Exit;
+
+      /* reassign all outline fields except flags to protect them */
+      slot->outline.n_contours = internal->loader->base.outline.n_contours;
+      slot->outline.n_points   = internal->loader->base.outline.n_points;
+      slot->outline.points     = internal->loader->base.outline.points;
+      slot->outline.tags       = internal->loader->base.outline.tags;
+      slot->outline.contours   = internal->loader->base.outline.contours;
+
+      slot->format  = FT_GLYPH_FORMAT_OUTLINE;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* Load a glyph. */
+
+  FT_LOCAL_DEF( FT_Error )
+  af_loader_load_glyph( AF_Loader  loader,
+                        FT_Face    face,
+                        FT_UInt    gindex,
+                        FT_Int32   load_flags )
+  {
+    FT_Error      error;
+    FT_Size       size = face->size;
+    AF_ScalerRec  scaler;
+
+
+    if ( !size )
+      return AF_Err_Invalid_Argument;
+
+    FT_ZERO( &scaler );
+
+    scaler.face    = face;
+    scaler.x_scale = size->metrics.x_scale;
+    scaler.x_delta = 0;  /* XXX: TODO: add support for sub-pixel hinting */
+    scaler.y_scale = size->metrics.y_scale;
+    scaler.y_delta = 0;  /* XXX: TODO: add support for sub-pixel hinting */
+
+    scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags );
+    scaler.flags       = 0;  /* XXX: fix this */
+
+    error = af_loader_reset( loader, face );
+    if ( !error )
+    {
+      AF_ScriptMetrics  metrics;
+      FT_UInt           options = 0;
+
+
+#ifdef FT_OPTION_AUTOFIT2
+      /* XXX: undocumented hook to activate the latin2 hinter */
+      if ( load_flags & ( 1UL << 20 ) )
+        options = 2;
+#endif
+
+      error = af_face_globals_get_metrics( loader->globals, gindex,
+                                           options, &metrics );
+      if ( !error )
+      {
+        loader->metrics = metrics;
+
+        if ( metrics->clazz->script_metrics_scale )
+          metrics->clazz->script_metrics_scale( metrics, &scaler );
+        else
+          metrics->scaler = scaler;
+
+        load_flags |=  FT_LOAD_NO_SCALE | FT_LOAD_IGNORE_TRANSFORM;
+        load_flags &= ~FT_LOAD_RENDER;
+
+        if ( metrics->clazz->script_hints_init )
+        {
+          error = metrics->clazz->script_hints_init( &loader->hints,
+                                                     metrics );
+          if ( error )
+            goto Exit;
+        }
+
+        error = af_loader_load_g( loader, &scaler, gindex, load_flags, 0 );
+      }
+    }
+  Exit:
+    return error;
+  }
+
+
+/* END */
diff --git a/src/autofit/afloader.h b/src/autofit/afloader.h
new file mode 100644 (file)
index 0000000..eec0e92
--- /dev/null
@@ -0,0 +1,73 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afloader.h                                                             */
+/*                                                                         */
+/*    Auto-fitter glyph loading routines (specification).                  */
+/*                                                                         */
+/*  Copyright 2003-2005, 2011-2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __AFLOADER_H__
+#define __AFLOADER_H__
+
+#include "afhints.h"
+#include "afglobal.h"
+
+
+FT_BEGIN_HEADER
+
+  typedef struct AF_LoaderRec_
+  {
+    FT_Face           face;           /* current face */
+    AF_FaceGlobals    globals;        /* current face globals */
+    FT_GlyphLoader    gloader;        /* glyph loader */
+    AF_GlyphHintsRec  hints;
+    AF_ScriptMetrics  metrics;
+    FT_Bool           transformed;
+    FT_Matrix         trans_matrix;
+    FT_Vector         trans_delta;
+    FT_Vector         pp1;
+    FT_Vector         pp2;
+    /* we don't handle vertical phantom points */
+
+  } AF_LoaderRec, *AF_Loader;
+
+
+  FT_LOCAL( FT_Error )
+  af_loader_init( AF_Loader  loader,
+                  FT_Memory  memory );
+
+
+  FT_LOCAL( FT_Error )
+  af_loader_reset( AF_Loader  loader,
+                   FT_Face    face );
+
+
+  FT_LOCAL( void )
+  af_loader_done( AF_Loader  loader );
+
+
+  FT_LOCAL( FT_Error )
+  af_loader_load_glyph( AF_Loader  loader,
+                        FT_Face    face,
+                        FT_UInt    gindex,
+                        FT_Int32   load_flags );
+
+/* */
+
+
+FT_END_HEADER
+
+#endif /* __AFLOADER_H__ */
+
+
+/* END */
diff --git a/src/autofit/afmodule.c b/src/autofit/afmodule.c
new file mode 100644 (file)
index 0000000..20b6218
--- /dev/null
@@ -0,0 +1,93 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afmodule.c                                                             */
+/*                                                                         */
+/*    Auto-fitter module implementation (body).                            */
+/*                                                                         */
+/*  Copyright 2003-2006, 2009, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "afmodule.h"
+#include "afloader.h"
+#include "afpic.h"
+
+#ifdef FT_DEBUG_AUTOFIT
+  int    _af_debug_disable_horz_hints;
+  int    _af_debug_disable_vert_hints;
+  int    _af_debug_disable_blue_hints;
+  void*  _af_debug_hints;
+#endif
+
+#include FT_INTERNAL_OBJECTS_H
+
+
+  typedef struct  FT_AutofitterRec_
+  {
+    FT_ModuleRec  root;
+    AF_LoaderRec  loader[1];
+
+  } FT_AutofitterRec, *FT_Autofitter;
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  af_autofitter_init( FT_Autofitter  module )
+  {
+    return af_loader_init( module->loader, module->root.library->memory );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  af_autofitter_done( FT_Autofitter  module )
+  {
+    af_loader_done( module->loader );
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  af_autofitter_load_glyph( FT_Autofitter  module,
+                            FT_GlyphSlot   slot,
+                            FT_Size        size,
+                            FT_UInt        glyph_index,
+                            FT_Int32       load_flags )
+  {
+    FT_UNUSED( size );
+
+    return af_loader_load_glyph( module->loader, slot->face,
+                                 glyph_index, load_flags );
+  }
+
+
+  FT_DEFINE_AUTOHINTER_SERVICE(
+    af_autofitter_service,
+    NULL,
+    NULL,
+    NULL,
+    (FT_AutoHinter_GlyphLoadFunc)af_autofitter_load_glyph )
+
+  FT_DEFINE_MODULE(
+    autofit_module_class,
+
+    FT_MODULE_HINTER,
+    sizeof ( FT_AutofitterRec ),
+
+    "autofitter",
+    0x10000L,   /* version 1.0 of the autofitter  */
+    0x20000L,   /* requires FreeType 2.0 or above */
+
+    (const void*)&AF_AF_AUTOFITTER_SERVICE_GET,
+
+    (FT_Module_Constructor)af_autofitter_init,
+    (FT_Module_Destructor) af_autofitter_done,
+    (FT_Module_Requester)  NULL )
+
+
+/* END */
diff --git a/src/autofit/afmodule.h b/src/autofit/afmodule.h
new file mode 100644 (file)
index 0000000..d979239
--- /dev/null
@@ -0,0 +1,37 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afmodule.h                                                             */
+/*                                                                         */
+/*    Auto-fitter module implementation (specification).                   */
+/*                                                                         */
+/*  Copyright 2003, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __AFMODULE_H__
+#define __AFMODULE_H__
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_MODULE_H
+
+
+FT_BEGIN_HEADER
+
+FT_DECLARE_MODULE(autofit_module_class)
+
+
+FT_END_HEADER
+
+#endif /* __AFMODULE_H__ */
+
+
+/* END */
diff --git a/src/autofit/afpic.c b/src/autofit/afpic.c
new file mode 100644 (file)
index 0000000..87074af
--- /dev/null
@@ -0,0 +1,110 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afpic.c                                                                */
+/*                                                                         */
+/*    The FreeType position independent code services for autofit module.  */
+/*                                                                         */
+/*  Copyright 2009, 2010, 2011 by                                          */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_INTERNAL_OBJECTS_H
+#include "afpic.h"
+#include "aferrors.h"
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* forward declaration of PIC init functions from afmodule.c */
+  void FT_Init_Class_af_autofitter_service(
+    FT_Library                 library,
+    FT_AutoHinter_ServiceRec*  clazz );
+
+  /* forward declaration of PIC init functions from script classes */
+#include "aflatin.h"
+#ifdef FT_OPTION_AUTOFIT2
+#include "aflatin2.h"
+#endif
+#include "afcjk.h"
+#include "afdummy.h"
+#include "afindic.h"
+
+  void
+  autofit_module_class_pic_free( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Memory          memory        = library->memory;
+
+
+    if ( pic_container->autofit )
+    {
+      FT_FREE( pic_container->autofit );
+      pic_container->autofit = NULL;
+    }
+  }
+
+
+  FT_Error
+  autofit_module_class_pic_init( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_UInt            ss;
+    FT_Error           error         = AF_Err_Ok;
+    AFModulePIC*       container;
+    FT_Memory          memory        = library->memory;
+
+
+    /* allocate pointer, clear and set global container pointer */
+    if ( FT_ALLOC ( container, sizeof ( *container ) ) )
+      return error;
+    FT_MEM_SET( container, 0, sizeof ( *container ) );
+    pic_container->autofit = container;
+
+    /* initialize pointer table -                       */
+    /* this is how the module usually expects this data */
+    for ( ss = 0 ; ss < AF_SCRIPT_CLASSES_REC_COUNT ; ss++ )
+    {
+      container->af_script_classes[ss] =
+        &container->af_script_classes_rec[ss];
+    }
+    container->af_script_classes[AF_SCRIPT_CLASSES_COUNT - 1] = NULL;
+
+    /* add call to initialization function when you add new scripts */
+    ss = 0;
+    FT_Init_Class_af_dummy_script_class(
+      &container->af_script_classes_rec[ss++] );
+#ifdef FT_OPTION_AUTOFIT2
+    FT_Init_Class_af_latin2_script_class(
+      &container->af_script_classes_rec[ss++] );
+#endif
+    FT_Init_Class_af_latin_script_class(
+      &container->af_script_classes_rec[ss++] );
+    FT_Init_Class_af_cjk_script_class(
+      &container->af_script_classes_rec[ss++] );
+    FT_Init_Class_af_indic_script_class(
+      &container->af_script_classes_rec[ss++] );
+
+    FT_Init_Class_af_autofitter_service(
+      library, &container->af_autofitter_service );
+
+/* Exit: */
+
+    if ( error )
+      autofit_module_class_pic_free( library );
+    return error;
+  }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/src/autofit/afpic.h b/src/autofit/afpic.h
new file mode 100644 (file)
index 0000000..21b0ff9
--- /dev/null
@@ -0,0 +1,76 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afpic.h                                                                */
+/*                                                                         */
+/*    The FreeType position independent code services for autofit module.  */
+/*                                                                         */
+/*  Copyright 2009, 2011 by                                                */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __AFPIC_H__
+#define __AFPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include FT_INTERNAL_PIC_H
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define AF_SCRIPT_CLASSES_GET         af_script_classes
+#define AF_AF_AUTOFITTER_SERVICE_GET  af_autofitter_service
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include "aftypes.h"
+
+  /* increase these when you add new scripts, */
+  /* and update autofit_module_class_pic_init */
+#ifdef FT_OPTION_AUTOFIT2
+#define AF_SCRIPT_CLASSES_COUNT     6
+#else
+#define AF_SCRIPT_CLASSES_COUNT     5
+#endif
+#define AF_SCRIPT_CLASSES_REC_COUNT  ( AF_SCRIPT_CLASSES_COUNT - 1 )
+
+  typedef struct AFModulePIC_
+  {
+    AF_ScriptClass            af_script_classes[AF_SCRIPT_CLASSES_COUNT];
+    AF_ScriptClassRec         af_script_classes_rec[AF_SCRIPT_CLASSES_REC_COUNT];
+    FT_AutoHinter_ServiceRec  af_autofitter_service;
+
+  } AFModulePIC;
+
+#define GET_PIC( lib )                                                     \
+          ( (AFModulePIC*)((lib)->pic_container.autofit) )
+#define AF_SCRIPT_CLASSES_GET                                              \
+          ( GET_PIC( FT_FACE_LIBRARY(globals->face) )->af_script_classes )
+#define AF_AF_AUTOFITTER_SERVICE_GET                                       \
+          ( GET_PIC( library )->af_autofitter_service )
+
+  /* see afpic.c for the implementation */
+  void
+  autofit_module_class_pic_free( FT_Library  library );
+
+  FT_Error
+  autofit_module_class_pic_init( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __AFPIC_H__ */
+
+
+/* END */
diff --git a/src/autofit/aftypes.h b/src/autofit/aftypes.h
new file mode 100644 (file)
index 0000000..21e442c
--- /dev/null
@@ -0,0 +1,370 @@
+/***************************************************************************/
+/*                                                                         */
+/*  aftypes.h                                                              */
+/*                                                                         */
+/*    Auto-fitter types (specification only).                              */
+/*                                                                         */
+/*  Copyright 2003-2009, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************
+   *
+   *  The auto-fitter is a complete rewrite of the old auto-hinter.
+   *  Its main feature is the ability to differentiate between different
+   *  scripts in order to apply language-specific rules.
+   *
+   *  The code has also been compartmentized into several entities that
+   *  should make algorithmic experimentation easier than with the old
+   *  code.
+   *
+   *  Finally, we get rid of the Catharon license, since this code is
+   *  released under the FreeType one.
+   *
+   *************************************************************************/
+
+
+#ifndef __AFTYPES_H__
+#define __AFTYPES_H__
+
+#include <ft2build.h>
+
+#include FT_FREETYPE_H
+#include FT_OUTLINE_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_DEBUG_H
+
+
+FT_BEGIN_HEADER
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    D E B U G G I N G                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#ifdef FT_DEBUG_AUTOFIT
+
+#include FT_CONFIG_STANDARD_LIBRARY_H
+
+extern int    _af_debug_disable_horz_hints;
+extern int    _af_debug_disable_vert_hints;
+extern int    _af_debug_disable_blue_hints;
+extern void*  _af_debug_hints;
+
+#endif /* FT_DEBUG_AUTOFIT */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                 U T I L I T Y   S T U F F                     *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct  AF_WidthRec_
+  {
+    FT_Pos  org;  /* original position/width in font units              */
+    FT_Pos  cur;  /* current/scaled position/width in device sub-pixels */
+    FT_Pos  fit;  /* current/fitted position/width in device sub-pixels */
+
+  } AF_WidthRec, *AF_Width;
+
+
+  FT_LOCAL( void )
+  af_sort_pos( FT_UInt  count,
+               FT_Pos*  table );
+
+  FT_LOCAL( void )
+  af_sort_widths( FT_UInt   count,
+                  AF_Width  widths );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                   A N G L E   T Y P E S                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*
+   *  The auto-fitter doesn't need a very high angular accuracy;
+   *  this allows us to speed up some computations considerably with a
+   *  light Cordic algorithm (see afangles.c).
+   */
+
+  typedef FT_Int  AF_Angle;
+
+
+#define AF_ANGLE_PI   256
+#define AF_ANGLE_2PI  ( AF_ANGLE_PI * 2 )
+#define AF_ANGLE_PI2  ( AF_ANGLE_PI / 2 )
+#define AF_ANGLE_PI4  ( AF_ANGLE_PI / 4 )
+
+
+#if 0
+  /*
+   *  compute the angle of a given 2-D vector
+   */
+  FT_LOCAL( AF_Angle )
+  af_angle_atan( FT_Pos  dx,
+                 FT_Pos  dy );
+
+
+  /*
+   *  compute `angle2 - angle1'; the result is always within
+   *  the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1]
+   */
+  FT_LOCAL( AF_Angle )
+  af_angle_diff( AF_Angle  angle1,
+                 AF_Angle  angle2 );
+#endif /* 0 */
+
+
+#define AF_ANGLE_DIFF( result, angle1, angle2 ) \
+  FT_BEGIN_STMNT                                \
+    AF_Angle  _delta = (angle2) - (angle1);     \
+                                                \
+                                                \
+    _delta %= AF_ANGLE_2PI;                     \
+    if ( _delta < 0 )                           \
+      _delta += AF_ANGLE_2PI;                   \
+                                                \
+    if ( _delta > AF_ANGLE_PI )                 \
+      _delta -= AF_ANGLE_2PI;                   \
+                                                \
+    result = _delta;                            \
+  FT_END_STMNT
+
+
+  /*  opaque handle to glyph-specific hints -- see `afhints.h' for more
+   *  details
+   */
+  typedef struct AF_GlyphHintsRec_*  AF_GlyphHints;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       S C A L E R S                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*
+   *  A scaler models the target pixel device that will receive the
+   *  auto-hinted glyph image.
+   */
+
+  typedef enum  AF_ScalerFlags_
+  {
+    AF_SCALER_FLAG_NO_HORIZONTAL = 1,  /* disable horizontal hinting */
+    AF_SCALER_FLAG_NO_VERTICAL   = 2,  /* disable vertical hinting   */
+    AF_SCALER_FLAG_NO_ADVANCE    = 4   /* disable advance hinting    */
+
+  } AF_ScalerFlags;
+
+
+  typedef struct  AF_ScalerRec_
+  {
+    FT_Face         face;        /* source font face                        */
+    FT_Fixed        x_scale;     /* from font units to 1/64th device pixels */
+    FT_Fixed        y_scale;     /* from font units to 1/64th device pixels */
+    FT_Pos          x_delta;     /* in 1/64th device pixels                 */
+    FT_Pos          y_delta;     /* in 1/64th device pixels                 */
+    FT_Render_Mode  render_mode; /* monochrome, anti-aliased, LCD, etc.     */
+    FT_UInt32       flags;       /* additional control flags, see above     */
+
+  } AF_ScalerRec, *AF_Scaler;
+
+
+#define AF_SCALER_EQUAL_SCALES( a, b )      \
+          ( (a)->x_scale == (b)->x_scale && \
+            (a)->y_scale == (b)->y_scale && \
+            (a)->x_delta == (b)->x_delta && \
+            (a)->y_delta == (b)->y_delta )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       S C R I P T S                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*
+   *  The list of known scripts.  Each different script corresponds to the
+   *  following information:
+   *
+   *   - A set of Unicode ranges to test whether the face supports the
+   *     script.
+   *
+   *   - A specific global analyzer that will compute global metrics
+   *     specific to the script.
+   *
+   *   - A specific glyph analyzer that will compute segments and
+   *     edges for each glyph covered by the script.
+   *
+   *   - A specific grid-fitting algorithm that will distort the
+   *     scaled glyph outline according to the results of the glyph
+   *     analyzer.
+   *
+   *  Note that a given analyzer and/or grid-fitting algorithm can be
+   *  used by more than one script.
+   */
+
+  typedef enum  AF_Script_
+  {
+    AF_SCRIPT_NONE  = 0,
+    AF_SCRIPT_LATIN = 1,
+    AF_SCRIPT_CJK   = 2,
+    AF_SCRIPT_INDIC = 3,
+#ifdef FT_OPTION_AUTOFIT2
+    AF_SCRIPT_LATIN2,
+#endif
+
+    /* add new scripts here.  Don't forget to update the list in */
+    /* `afglobal.c'.                                             */
+
+    AF_SCRIPT_MAX   /* do not remove */
+
+  } AF_Script;
+
+
+  typedef struct AF_ScriptClassRec_ const*  AF_ScriptClass;
+
+  typedef struct  AF_ScriptMetricsRec_
+  {
+    AF_ScriptClass  clazz;
+    AF_ScalerRec    scaler;
+    FT_Bool         digits_have_same_width;
+
+  } AF_ScriptMetricsRec, *AF_ScriptMetrics;
+
+
+  /*  This function parses an FT_Face to compute global metrics for
+   *  a specific script.
+   */
+  typedef FT_Error
+  (*AF_Script_InitMetricsFunc)( AF_ScriptMetrics  metrics,
+                                FT_Face           face );
+
+  typedef void
+  (*AF_Script_ScaleMetricsFunc)( AF_ScriptMetrics  metrics,
+                                 AF_Scaler         scaler );
+
+  typedef void
+  (*AF_Script_DoneMetricsFunc)( AF_ScriptMetrics  metrics );
+
+
+  typedef FT_Error
+  (*AF_Script_InitHintsFunc)( AF_GlyphHints     hints,
+                              AF_ScriptMetrics  metrics );
+
+  typedef void
+  (*AF_Script_ApplyHintsFunc)( AF_GlyphHints     hints,
+                               FT_Outline*       outline,
+                               AF_ScriptMetrics  metrics );
+
+
+  typedef struct  AF_Script_UniRangeRec_
+  {
+    FT_UInt32  first;
+    FT_UInt32  last;
+
+  } AF_Script_UniRangeRec;
+
+#define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) }
+
+  typedef const AF_Script_UniRangeRec  *AF_Script_UniRange;
+
+
+  typedef struct  AF_ScriptClassRec_
+  {
+    AF_Script                   script;
+    AF_Script_UniRange          script_uni_ranges; /* last must be { 0, 0 } */
+
+    FT_Offset                   script_metrics_size;
+    AF_Script_InitMetricsFunc   script_metrics_init;
+    AF_Script_ScaleMetricsFunc  script_metrics_scale;
+    AF_Script_DoneMetricsFunc   script_metrics_done;
+
+    AF_Script_InitHintsFunc     script_hints_init;
+    AF_Script_ApplyHintsFunc    script_hints_apply;
+
+  } AF_ScriptClassRec;
+
+
+  /* Declare and define vtables for classes */
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define AF_DECLARE_SCRIPT_CLASS( script_class ) \
+  FT_CALLBACK_TABLE const AF_ScriptClassRec     \
+  script_class;
+
+#define AF_DEFINE_SCRIPT_CLASS( script_class, script_, ranges, m_size,     \
+                                m_init, m_scale, m_done, h_init, h_apply ) \
+  FT_CALLBACK_TABLE_DEF const AF_ScriptClassRec                            \
+  script_class =                                                           \
+  {                                                                        \
+    script_,                                                               \
+    ranges,                                                                \
+                                                                           \
+    m_size,                                                                \
+                                                                           \
+    m_init,                                                                \
+    m_scale,                                                               \
+    m_done,                                                                \
+                                                                           \
+    h_init,                                                                \
+    h_apply                                                                \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define AF_DECLARE_SCRIPT_CLASS( script_class )          \
+  FT_LOCAL( void )                                       \
+  FT_Init_Class_##script_class( AF_ScriptClassRec* ac );
+
+#define AF_DEFINE_SCRIPT_CLASS( script_class, script_, ranges, m_size,     \
+                                m_init, m_scale, m_done, h_init, h_apply ) \
+  FT_LOCAL_DEF( void )                                                     \
+  FT_Init_Class_##script_class( AF_ScriptClassRec* ac )                    \
+  {                                                                        \
+    ac->script               = script_;                                    \
+    ac->script_uni_ranges    = ranges;                                     \
+                                                                           \
+    ac->script_metrics_size  = m_size;                                     \
+                                                                           \
+    ac->script_metrics_init  = m_init;                                     \
+    ac->script_metrics_scale = m_scale;                                    \
+    ac->script_metrics_done  = m_done;                                     \
+                                                                           \
+    ac->script_hints_init    = h_init;                                     \
+    ac->script_hints_apply   = h_apply;                                    \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* */
+
+FT_END_HEADER
+
+#endif /* __AFTYPES_H__ */
+
+
+/* END */
diff --git a/src/autofit/afwarp.c b/src/autofit/afwarp.c
new file mode 100644 (file)
index 0000000..34a97ff
--- /dev/null
@@ -0,0 +1,374 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afwarp.c                                                               */
+/*                                                                         */
+/*    Auto-fitter warping algorithm (body).                                */
+/*                                                                         */
+/*  Copyright 2006, 2007, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*
+   *  The idea of the warping code is to slightly scale and shift a glyph
+   *  within a single dimension so that as much of its segments are aligned
+   *  (more or less) on the grid.  To find out the optimal scaling and
+   *  shifting value, various parameter combinations are tried and scored.
+   */
+
+#include "afwarp.h"
+
+#ifdef AF_CONFIG_OPTION_USE_WARPER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_afwarp
+
+
+  /* The weights cover the range 0/64 - 63/64 of a pixel.  Obviously, */
+  /* values around a half pixel (which means exactly between two grid */
+  /* lines) gets the worst weight.                                    */
+#if 1
+  static const AF_WarpScore
+  af_warper_weights[64] =
+  {
+    35, 32, 30, 25, 20, 15, 12, 10,  5,  1,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0, -1, -2, -5, -8,-10,-10,-20,-20,-30,-30,
+
+   -30,-30,-20,-20,-10,-10, -8, -5, -2, -1,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  1,  5, 10, 12, 15, 20, 25, 30, 32,
+  };
+#else
+  static const AF_WarpScore
+  af_warper_weights[64] =
+  {
+    30, 20, 10,  5,  4,  4,  3,  2,  1,  0,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0, -1, -2, -2, -5, -5,-10,-10,-15,-20,
+
+   -20,-15,-15,-10,-10, -5, -5, -2, -2, -1,  0,  0,  0,  0,  0,  0,
+     0,  0,  0,  0,  0,  0,  0,  0,  1,  2,  3,  4,  4,  5, 10, 20,
+  };
+#endif
+
+
+  /* Score segments for a given `scale' and `delta' in the range */
+  /* `xx1' to `xx2', and store the best result in `warper'.  If  */
+  /* the new best score is equal to the old one, prefer the      */
+  /* value with a smaller distortion (around `base_distort').    */
+
+  static void
+  af_warper_compute_line_best( AF_Warper     warper,
+                               FT_Fixed      scale,
+                               FT_Pos        delta,
+                               FT_Pos        xx1,
+                               FT_Pos        xx2,
+                               AF_WarpScore  base_distort,
+                               AF_Segment    segments,
+                               FT_UInt       num_segments )
+  {
+    FT_Int        idx_min, idx_max, idx0;
+    FT_UInt       nn;
+    AF_WarpScore  scores[65];
+
+
+    for ( nn = 0; nn < 65; nn++ )
+      scores[nn] = 0;
+
+    idx0 = xx1 - warper->t1;
+
+    /* compute minimum and maximum indices */
+    {
+      FT_Pos  xx1min = warper->x1min;
+      FT_Pos  xx1max = warper->x1max;
+      FT_Pos  w      = xx2 - xx1;
+
+
+      if ( xx1min + w < warper->x2min )
+        xx1min = warper->x2min - w;
+
+      xx1max = warper->x1max;
+      if ( xx1max + w > warper->x2max )
+        xx1max = warper->x2max - w;
+
+      idx_min = xx1min - warper->t1;
+      idx_max = xx1max - warper->t1;
+
+      if ( idx_min < 0 || idx_min > idx_max || idx_max > 64 )
+      {
+        FT_TRACE5(( "invalid indices:\n"
+                    "  min=%d max=%d, xx1=%ld xx2=%ld,\n"
+                    "  x1min=%ld x1max=%ld, x2min=%ld x2max=%ld\n",
+                    idx_min, idx_max, xx1, xx2,
+                    warper->x1min, warper->x1max,
+                    warper->x2min, warper->x2max ));
+        return;
+      }
+    }
+
+    for ( nn = 0; nn < num_segments; nn++ )
+    {
+      FT_Pos  len = segments[nn].max_coord - segments[nn].min_coord;
+      FT_Pos  y0  = FT_MulFix( segments[nn].pos, scale ) + delta;
+      FT_Pos  y   = y0 + ( idx_min - idx0 );
+      FT_Int  idx;
+
+
+      /* score the length of the segments for the given range */
+      for ( idx = idx_min; idx <= idx_max; idx++, y++ )
+        scores[idx] += af_warper_weights[y & 63] * len;
+    }
+
+    /* find best score */
+    {
+      FT_Int  idx;
+
+
+      for ( idx = idx_min; idx <= idx_max; idx++ )
+      {
+        AF_WarpScore  score = scores[idx];
+        AF_WarpScore  distort = base_distort + ( idx - idx0 );
+
+
+        if ( score > warper->best_score         ||
+             ( score == warper->best_score    &&
+               distort < warper->best_distort ) )
+        {
+          warper->best_score   = score;
+          warper->best_distort = distort;
+          warper->best_scale   = scale;
+          warper->best_delta   = delta + ( idx - idx0 );
+        }
+      }
+    }
+  }
+
+
+  /* Compute optimal scaling and delta values for a given glyph and */
+  /* dimension.                                                     */
+
+  FT_LOCAL_DEF( void )
+  af_warper_compute( AF_Warper      warper,
+                     AF_GlyphHints  hints,
+                     AF_Dimension   dim,
+                     FT_Fixed      *a_scale,
+                     FT_Pos        *a_delta )
+  {
+    AF_AxisHints  axis;
+    AF_Point      points;
+
+    FT_Fixed      org_scale;
+    FT_Pos        org_delta;
+
+    FT_UInt       nn, num_points, num_segments;
+    FT_Int        X1, X2;
+    FT_Int        w;
+
+    AF_WarpScore  base_distort;
+    AF_Segment    segments;
+
+
+    /* get original scaling transformation */
+    if ( dim == AF_DIMENSION_VERT )
+    {
+      org_scale = hints->y_scale;
+      org_delta = hints->y_delta;
+    }
+    else
+    {
+      org_scale = hints->x_scale;
+      org_delta = hints->x_delta;
+    }
+
+    warper->best_scale   = org_scale;
+    warper->best_delta   = org_delta;
+    warper->best_score   = INT_MIN;
+    warper->best_distort = 0;
+
+    axis         = &hints->axis[dim];
+    segments     = axis->segments;
+    num_segments = axis->num_segments;
+    points       = hints->points;
+    num_points   = hints->num_points;
+
+    *a_scale = org_scale;
+    *a_delta = org_delta;
+
+    /* get X1 and X2, minimum and maximum in original coordinates */
+    if ( num_segments < 1 )
+      return;
+
+#if 1
+    X1 = X2 = points[0].fx;
+    for ( nn = 1; nn < num_points; nn++ )
+    {
+      FT_Int  X = points[nn].fx;
+
+
+      if ( X < X1 )
+        X1 = X;
+      if ( X > X2 )
+        X2 = X;
+    }
+#else
+    X1 = X2 = segments[0].pos;
+    for ( nn = 1; nn < num_segments; nn++ )
+    {
+      FT_Int  X = segments[nn].pos;
+
+
+      if ( X < X1 )
+        X1 = X;
+      if ( X > X2 )
+        X2 = X;
+    }
+#endif
+
+    if ( X1 >= X2 )
+      return;
+
+    warper->x1 = FT_MulFix( X1, org_scale ) + org_delta;
+    warper->x2 = FT_MulFix( X2, org_scale ) + org_delta;
+
+    warper->t1 = AF_WARPER_FLOOR( warper->x1 );
+    warper->t2 = AF_WARPER_CEIL( warper->x2 );
+
+    /* examine a half pixel wide range around the maximum coordinates */
+    warper->x1min = warper->x1 & ~31;
+    warper->x1max = warper->x1min + 32;
+    warper->x2min = warper->x2 & ~31;
+    warper->x2max = warper->x2min + 32;
+
+    if ( warper->x1max > warper->x2 )
+      warper->x1max = warper->x2;
+
+    if ( warper->x2min < warper->x1 )
+      warper->x2min = warper->x1;
+
+    warper->w0 = warper->x2 - warper->x1;
+
+    if ( warper->w0 <= 64 )
+    {
+      warper->x1max = warper->x1;
+      warper->x2min = warper->x2;
+    }
+
+    /* examine (at most) a pixel wide range around the natural width */
+    warper->wmin = warper->x2min - warper->x1max;
+    warper->wmax = warper->x2max - warper->x1min;
+
+#if 1
+    /* some heuristics to reduce the number of widths to be examined */
+    {
+      int  margin = 16;
+
+
+      if ( warper->w0 <= 128 )
+      {
+         margin = 8;
+         if ( warper->w0 <= 96 )
+           margin = 4;
+      }
+
+      if ( warper->wmin < warper->w0 - margin )
+        warper->wmin = warper->w0 - margin;
+
+      if ( warper->wmax > warper->w0 + margin )
+        warper->wmax = warper->w0 + margin;
+    }
+
+    if ( warper->wmin < warper->w0 * 3 / 4 )
+      warper->wmin = warper->w0 * 3 / 4;
+
+    if ( warper->wmax > warper->w0 * 5 / 4 )
+      warper->wmax = warper->w0 * 5 / 4;
+#else
+    /* no scaling, just translation */
+    warper->wmin = warper->wmax = warper->w0;
+#endif
+
+    for ( w = warper->wmin; w <= warper->wmax; w++ )
+    {
+      FT_Fixed  new_scale;
+      FT_Pos    new_delta;
+      FT_Pos    xx1, xx2;
+
+
+      /* compute min and max positions for given width,       */
+      /* assuring that they stay within the coordinate ranges */
+      xx1 = warper->x1;
+      xx2 = warper->x2;
+      if ( w >= warper->w0 )
+      {
+        xx1 -= w - warper->w0;
+        if ( xx1 < warper->x1min )
+        {
+          xx2 += warper->x1min - xx1;
+          xx1  = warper->x1min;
+        }
+      }
+      else
+      {
+        xx1 -= w - warper->w0;
+        if ( xx1 > warper->x1max )
+        {
+          xx2 -= xx1 - warper->x1max;
+          xx1  = warper->x1max;
+        }
+      }
+
+      if ( xx1 < warper->x1 )
+        base_distort = warper->x1 - xx1;
+      else
+        base_distort = xx1 - warper->x1;
+
+      if ( xx2 < warper->x2 )
+        base_distort += warper->x2 - xx2;
+      else
+        base_distort += xx2 - warper->x2;
+
+      /* give base distortion a greater weight while scoring */
+      base_distort *= 10;
+
+      new_scale = org_scale + FT_DivFix( w - warper->w0, X2 - X1 );
+      new_delta = xx1 - FT_MulFix( X1, new_scale );
+
+      af_warper_compute_line_best( warper, new_scale, new_delta, xx1, xx2,
+                                   base_distort,
+                                   segments, num_segments );
+    }
+
+    {
+      FT_Fixed  best_scale = warper->best_scale;
+      FT_Pos    best_delta = warper->best_delta;
+
+
+      hints->xmin_delta = FT_MulFix( X1, best_scale - org_scale )
+                          + best_delta;
+      hints->xmax_delta = FT_MulFix( X2, best_scale - org_scale )
+                          + best_delta;
+
+      *a_scale = best_scale;
+      *a_delta = best_delta;
+    }
+  }
+
+#else /* !AF_CONFIG_OPTION_USE_WARPER */
+
+  /* ANSI C doesn't like empty source files */
+  typedef int  _af_warp_dummy;
+
+#endif /* !AF_CONFIG_OPTION_USE_WARPER */
+
+/* END */
diff --git a/src/autofit/afwarp.h b/src/autofit/afwarp.h
new file mode 100644 (file)
index 0000000..7343fdd
--- /dev/null
@@ -0,0 +1,64 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afwarp.h                                                               */
+/*                                                                         */
+/*    Auto-fitter warping algorithm (specification).                       */
+/*                                                                         */
+/*  Copyright 2006, 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __AFWARP_H__
+#define __AFWARP_H__
+
+#include "afhints.h"
+
+FT_BEGIN_HEADER
+
+#define AF_WARPER_SCALE
+
+#define AF_WARPER_FLOOR( x )  ( (x) & ~63 )
+#define AF_WARPER_CEIL( x )   AF_WARPER_FLOOR( (x) + 63 )
+
+
+  typedef FT_Int32  AF_WarpScore;
+
+  typedef struct  AF_WarperRec_
+  {
+    FT_Pos        x1, x2;
+    FT_Pos        t1, t2;
+    FT_Pos        x1min, x1max;
+    FT_Pos        x2min, x2max;
+    FT_Pos        w0, wmin, wmax;
+
+    FT_Fixed      best_scale;
+    FT_Pos        best_delta;
+    AF_WarpScore  best_score;
+    AF_WarpScore  best_distort;
+
+  } AF_WarperRec, *AF_Warper;
+
+
+  FT_LOCAL( void )
+  af_warper_compute( AF_Warper      warper,
+                     AF_GlyphHints  hints,
+                     AF_Dimension   dim,
+                     FT_Fixed      *a_scale,
+                     FT_Fixed      *a_delta );
+
+
+FT_END_HEADER
+
+
+#endif /* __AFWARP_H__ */
+
+
+/* END */
diff --git a/src/autofit/autofit.c b/src/autofit/autofit.c
new file mode 100644 (file)
index 0000000..3883a0a
--- /dev/null
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/*                                                                         */
+/*  autofit.c                                                              */
+/*                                                                         */
+/*    Auto-fitter module (body).                                           */
+/*                                                                         */
+/*  Copyright 2003-2007, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+#include <ft2build.h>
+#include "afpic.c"
+#include "afangles.c"
+#include "afglobal.c"
+#include "afhints.c"
+
+#include "afdummy.c"
+#include "aflatin.c"
+#ifdef FT_OPTION_AUTOFIT2
+#include "aflatin2.c"
+#endif
+#include "afcjk.c"
+#include "afindic.c"
+
+#include "afloader.c"
+#include "afmodule.c"
+
+#ifdef AF_CONFIG_OPTION_USE_WARPER
+#include "afwarp.c"
+#endif
+
+/* END */
diff --git a/src/autofit/module.mk b/src/autofit/module.mk
new file mode 100644 (file)
index 0000000..6ec6091
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# FreeType 2 auto-fitter module definition
+#
+
+
+# Copyright 2003, 2004, 2005, 2006 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.
+
+
+FTMODULE_H_COMMANDS += AUTOFIT_MODULE
+
+define AUTOFIT_MODULE
+$(OPEN_DRIVER) FT_Module_Class, autofit_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)autofit   $(ECHO_DRIVER_DESC)automatic hinting module$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/src/autofit/rules.mk b/src/autofit/rules.mk
new file mode 100644 (file)
index 0000000..b76bb79
--- /dev/null
@@ -0,0 +1,79 @@
+#
+# FreeType 2 auto-fitter module configuration rules
+#
+
+
+# Copyright 2003, 2004, 2005, 2006, 2007, 2011 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.
+
+
+# AUTOF driver directory
+#
+AUTOF_DIR := $(SRC_DIR)/autofit
+
+
+# compilation flags for the driver
+#
+AUTOF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(AUTOF_DIR))
+
+
+# AUTOF driver sources (i.e., C files)
+#
+AUTOF_DRV_SRC := $(AUTOF_DIR)/afangles.c \
+                 $(AUTOF_DIR)/afcjk.c    \
+                 $(AUTOF_DIR)/afdummy.c  \
+                 $(AUTOF_DIR)/afglobal.c \
+                 $(AUTOF_DIR)/afhints.c  \
+                 $(AUTOF_DIR)/afindic.c  \
+                 $(AUTOF_DIR)/aflatin.c  \
+                 $(AUTOF_DIR)/afloader.c \
+                 $(AUTOF_DIR)/afmodule.c \
+                 $(AUTOF_DIR)/afpic.c    \
+                 $(AUTOF_DIR)/afwarp.c
+
+# AUTOF driver headers
+#
+AUTOF_DRV_H := $(AUTOF_DRV_SRC:%c=%h)  \
+               $(AUTOF_DIR)/aferrors.h \
+               $(AUTOF_DIR)/aftypes.h
+
+
+# AUTOF driver object(s)
+#
+#   AUTOF_DRV_OBJ_M is used during `multi' builds.
+#   AUTOF_DRV_OBJ_S is used during `single' builds.
+#
+AUTOF_DRV_OBJ_M := $(AUTOF_DRV_SRC:$(AUTOF_DIR)/%.c=$(OBJ_DIR)/%.$O)
+AUTOF_DRV_OBJ_S := $(OBJ_DIR)/autofit.$O
+
+# AUTOF driver source file for single build
+#
+AUTOF_DRV_SRC_S := $(AUTOF_DIR)/autofit.c
+
+
+# AUTOF driver - single object
+#
+$(AUTOF_DRV_OBJ_S): $(AUTOF_DRV_SRC_S) $(AUTOF_DRV_SRC) \
+                   $(FREETYPE_H) $(AUTOF_DRV_H)
+       $(AUTOF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(AUTOF_DRV_SRC_S))
+
+
+# AUTOF driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(AUTOF_DIR)/%.c $(FREETYPE_H) $(AUTOF_DRV_H)
+       $(AUTOF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(AUTOF_DRV_OBJ_S)
+DRV_OBJS_M += $(AUTOF_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/base/Jamfile b/src/base/Jamfile
new file mode 100644 (file)
index 0000000..832e8b8
--- /dev/null
@@ -0,0 +1,60 @@
+# FreeType 2 src/base Jamfile
+#
+# Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) base ;
+
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = ftadvanc ftcalc   ftdbgmem ftgloadr
+               ftobjs   ftoutln  ftrfork  ftsnames
+               ftstream fttrigon ftutil
+               basepic  ftpic
+               ;
+  }
+  else
+  {
+    _sources = ftbase ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# Add the optional/replaceable files.
+#
+{
+  local  _sources = bbox   bdf    bitmap debug  gasp
+                    glyph  gxval  init   lcdfil mm
+                    otval  pfr    stroke synth  system
+                    type1  winfnt xf86   patent
+                    ;
+
+  Library  $(FT2_LIB) : ft$(_sources).c ;
+}
+
+# Add Macintosh-specific file to the library when necessary.
+#
+if $(MAC)
+{
+  Library  $(FT2_LIB) : ftmac.c ;
+}
+else if $(OS) = MACOSX
+{
+  if $(FT2_MULTI)
+  {
+    Library  $(FT2_LIB) : ftmac.c ;
+  }
+}
+
+# end of src/base Jamfile
diff --git a/src/base/basepic.c b/src/base/basepic.c
new file mode 100644 (file)
index 0000000..d754eb1
--- /dev/null
@@ -0,0 +1,93 @@
+/***************************************************************************/
+/*                                                                         */
+/*  basepic.c                                                              */
+/*                                                                         */
+/*    The FreeType position independent code services for base.            */
+/*                                                                         */
+/*  Copyright 2009 by                                                      */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_INTERNAL_OBJECTS_H
+#include "basepic.h"
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* forward declaration of PIC init functions from ftglyph.c */
+  void FT_Init_Class_ft_outline_glyph_class( FT_Glyph_Class*  clazz );
+  void FT_Init_Class_ft_bitmap_glyph_class( FT_Glyph_Class*  clazz );
+
+  /* forward declaration of PIC init function from ftrfork.c (not modularized) */
+  void FT_Init_Table_raccess_guess_table( ft_raccess_guess_rec*  record );
+
+  /* forward declaration of PIC init functions from ftinit.c */
+  FT_Error
+  ft_create_default_module_classes( FT_Library  library );
+
+  void
+  ft_destroy_default_module_classes( FT_Library  library );
+
+  void
+  ft_base_pic_free( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Memory          memory = library->memory;
+    if ( pic_container->base )
+    {
+      /* Destroy default module classes (in case FT_Add_Default_Modules was used) */
+      ft_destroy_default_module_classes( library );
+
+      FT_FREE( pic_container->base );
+      pic_container->base = NULL;
+    }
+  }
+
+
+  FT_Error
+  ft_base_pic_init( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Error           error = FT_Err_Ok;
+    BasePIC*           container;
+    FT_Memory          memory = library->memory;
+
+    /* allocate pointer, clear and set global container pointer */
+    if ( FT_ALLOC ( container, sizeof ( *container ) ) )
+      return error;
+    FT_MEM_SET( container, 0, sizeof ( *container ) );
+    pic_container->base = container;
+
+    /* initialize default modules list and pointers */
+    error = ft_create_default_module_classes( library );
+    if ( error )
+      goto Exit;
+
+    /* initialize pointer table - this is how the module usually expects this data */
+    FT_Init_Class_ft_outline_glyph_class(
+      &container->ft_outline_glyph_class );
+    FT_Init_Class_ft_bitmap_glyph_class(
+      &container->ft_bitmap_glyph_class );
+    FT_Init_Table_raccess_guess_table(
+      (ft_raccess_guess_rec*)&container->ft_raccess_guess_table);
+
+Exit:
+    if( error )
+      ft_base_pic_free( library );
+    return error;
+  }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/src/base/basepic.h b/src/base/basepic.h
new file mode 100644 (file)
index 0000000..bf90bef
--- /dev/null
@@ -0,0 +1,77 @@
+/***************************************************************************/
+/*                                                                         */
+/*  basepic.h                                                              */
+/*                                                                         */
+/*    The FreeType position independent code services for base.            */
+/*                                                                         */
+/*  Copyright 2009 by                                                      */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __BASEPIC_H__
+#define __BASEPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include FT_INTERNAL_PIC_H
+
+#ifndef FT_CONFIG_OPTION_PIC
+#define FT_OUTLINE_GLYPH_CLASS_GET &ft_outline_glyph_class
+#define FT_BITMAP_GLYPH_CLASS_GET  &ft_bitmap_glyph_class
+#define FT_DEFAULT_MODULES_GET     ft_default_modules
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#define FT_RACCESS_GUESS_TABLE_GET ft_raccess_guess_table
+#endif
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include FT_GLYPH_H
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#include FT_INTERNAL_RFORK_H
+#endif
+
+
+  typedef struct BasePIC_
+  {
+    FT_Module_Class** default_module_classes;
+    FT_Glyph_Class ft_outline_glyph_class;
+    FT_Glyph_Class ft_bitmap_glyph_class;
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+    ft_raccess_guess_rec ft_raccess_guess_table[FT_RACCESS_N_RULES];
+#endif
+  } BasePIC;
+
+#define GET_PIC(lib)                  ((BasePIC*)((lib)->pic_container.base))
+#define FT_OUTLINE_GLYPH_CLASS_GET    (&GET_PIC(library)->ft_outline_glyph_class)
+#define FT_BITMAP_GLYPH_CLASS_GET     (&GET_PIC(library)->ft_bitmap_glyph_class)
+#define FT_DEFAULT_MODULES_GET        (GET_PIC(library)->default_module_classes)
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+#define FT_RACCESS_GUESS_TABLE_GET    (GET_PIC(library)->ft_raccess_guess_table)
+#endif
+
+  /* see basepic.c for the implementation. */
+  void
+  ft_base_pic_free( FT_Library  library );
+
+  FT_Error
+  ft_base_pic_init( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+ /* */
+
+FT_END_HEADER
+
+#endif /* __BASEPIC_H__ */
+
+
+/* END */
diff --git a/src/base/ftadvanc.c b/src/base/ftadvanc.c
new file mode 100644 (file)
index 0000000..a8bb43d
--- /dev/null
@@ -0,0 +1,160 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftadvanc.c                                                             */
+/*                                                                         */
+/*    Quick computation of advance widths (body).                          */
+/*                                                                         */
+/*  Copyright 2008, 2009, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_ADVANCES_H
+#include FT_INTERNAL_OBJECTS_H
+
+
+  static FT_Error
+  _ft_face_scale_advances( FT_Face    face,
+                           FT_Fixed*  advances,
+                           FT_UInt    count,
+                           FT_Int32   flags )
+  {
+    FT_Fixed  scale;
+    FT_UInt   nn;
+
+
+    if ( flags & FT_LOAD_NO_SCALE )
+      return FT_Err_Ok;
+
+    if ( face->size == NULL )
+      return FT_Err_Invalid_Size_Handle;
+
+    if ( flags & FT_LOAD_VERTICAL_LAYOUT )
+      scale = face->size->metrics.y_scale;
+    else
+      scale = face->size->metrics.x_scale;
+
+    /* this must be the same scaling as to get linear{Hori,Vert}Advance */
+    /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c)        */
+
+    for ( nn = 0; nn < count; nn++ )
+      advances[nn] = FT_MulDiv( advances[nn], scale, 64 );
+
+    return FT_Err_Ok;
+  }
+
+
+   /* at the moment, we can perform fast advance retrieval only in */
+   /* the following cases:                                         */
+   /*                                                              */
+   /*  - unscaled load                                             */
+   /*  - unhinted load                                             */
+   /*  - light-hinted load                                         */
+
+#define LOAD_ADVANCE_FAST_CHECK( flags )                            \
+          ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING )    || \
+            FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT )
+
+
+  /* documentation is in ftadvanc.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Advance( FT_Face    face,
+                  FT_UInt    gindex,
+                  FT_Int32   flags,
+                  FT_Fixed  *padvance )
+  {
+    FT_Face_GetAdvancesFunc  func;
+
+
+    if ( !face )
+      return FT_Err_Invalid_Face_Handle;
+
+    if ( gindex >= (FT_UInt)face->num_glyphs )
+      return FT_Err_Invalid_Glyph_Index;
+
+    func = face->driver->clazz->get_advances;
+    if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) )
+    {
+      FT_Error  error;
+
+
+      error = func( face, gindex, 1, flags, padvance );
+      if ( !error )
+        return _ft_face_scale_advances( face, padvance, 1, flags );
+
+      if ( error != FT_ERROR_BASE( FT_Err_Unimplemented_Feature ) )
+        return error;
+    }
+
+    return FT_Get_Advances( face, gindex, 1, flags, padvance );
+  }
+
+
+  /* documentation is in ftadvanc.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Advances( FT_Face    face,
+                   FT_UInt    start,
+                   FT_UInt    count,
+                   FT_Int32   flags,
+                   FT_Fixed  *padvances )
+  {
+    FT_Face_GetAdvancesFunc  func;
+    FT_UInt                  num, end, nn;
+    FT_Error                 error = FT_Err_Ok;
+
+
+    if ( !face )
+      return FT_Err_Invalid_Face_Handle;
+
+    num = (FT_UInt)face->num_glyphs;
+    end = start + count;
+    if ( start >= num || end < start || end > num )
+      return FT_Err_Invalid_Glyph_Index;
+
+    if ( count == 0 )
+      return FT_Err_Ok;
+
+    func = face->driver->clazz->get_advances;
+    if ( func && LOAD_ADVANCE_FAST_CHECK( flags ) )
+    {
+      error = func( face, start, count, flags, padvances );
+      if ( !error )
+        return _ft_face_scale_advances( face, padvances, count, flags );
+
+      if ( error != FT_ERROR_BASE( FT_Err_Unimplemented_Feature ) )
+        return error;
+    }
+
+    error = FT_Err_Ok;
+
+    if ( flags & FT_ADVANCE_FLAG_FAST_ONLY )
+      return FT_Err_Unimplemented_Feature;
+
+    flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
+    for ( nn = 0; nn < count; nn++ )
+    {
+      error = FT_Load_Glyph( face, start + nn, flags );
+      if ( error )
+        break;
+
+      /* scale from 26.6 to 16.16 */
+      padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
+                      ? face->glyph->advance.y << 10
+                      : face->glyph->advance.x << 10;
+    }
+
+    return error;
+  }
+
+
+/* END */
diff --git a/src/base/ftapi.c b/src/base/ftapi.c
new file mode 100644 (file)
index 0000000..8914d1f
--- /dev/null
@@ -0,0 +1,121 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftapi.c                                                                */
+/*                                                                         */
+/*    The FreeType compatibility functions (body).                         */
+/*                                                                         */
+/*  Copyright 2002 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_LIST_H
+#include FT_OUTLINE_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_TRUETYPE_TABLES_H
+#include FT_OUTLINE_H
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                 C O M P A T I B I L I T Y                       ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* backwards compatibility API */
+
+  FT_BASE_DEF( void )
+  FT_New_Memory_Stream( FT_Library  library,
+                        FT_Byte*    base,
+                        FT_ULong    size,
+                        FT_Stream   stream )
+  {
+    FT_UNUSED( library );
+
+    FT_Stream_OpenMemory( stream, base, size );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Seek_Stream( FT_Stream  stream,
+                  FT_ULong   pos )
+  {
+    return FT_Stream_Seek( stream, pos );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Skip_Stream( FT_Stream  stream,
+                  FT_Long    distance )
+  {
+    return FT_Stream_Skip( stream, distance );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Read_Stream( FT_Stream  stream,
+                  FT_Byte*   buffer,
+                  FT_ULong   count )
+  {
+    return FT_Stream_Read( stream, buffer, count );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Read_Stream_At( FT_Stream  stream,
+                     FT_ULong   pos,
+                     FT_Byte*   buffer,
+                     FT_ULong   count )
+  {
+    return FT_Stream_ReadAt( stream, pos, buffer, count );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Extract_Frame( FT_Stream  stream,
+                    FT_ULong   count,
+                    FT_Byte**  pbytes )
+  {
+    return FT_Stream_ExtractFrame( stream, count, pbytes );
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Release_Frame( FT_Stream  stream,
+                    FT_Byte**  pbytes )
+  {
+    FT_Stream_ReleaseFrame( stream, pbytes );
+  }
+
+  FT_BASE_DEF( FT_Error )
+  FT_Access_Frame( FT_Stream  stream,
+                   FT_ULong   count )
+  {
+    return FT_Stream_EnterFrame( stream, count );
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Forget_Frame( FT_Stream  stream )
+  {
+    FT_Stream_ExitFrame( stream );
+  }
+
+
+/* END */
diff --git a/src/base/ftbase.c b/src/base/ftbase.c
new file mode 100644 (file)
index 0000000..5e5d70e
--- /dev/null
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbase.c                                                               */
+/*                                                                         */
+/*    Single object library component (body only).                         */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+
+#define  FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include "ftpic.c"
+#include "basepic.c"
+#include "ftadvanc.c"
+#include "ftcalc.c"
+#include "ftdbgmem.c"
+#include "ftgloadr.c"
+#include "ftobjs.c"
+#include "ftoutln.c"
+#include "ftrfork.c"
+#include "ftsnames.c"
+#include "ftstream.c"
+#include "fttrigon.c"
+#include "ftutil.c"
+
+#ifdef FT_MACINTOSH
+#include "ftmac.c"
+#endif
+
+/* END */
diff --git a/src/base/ftbase.h b/src/base/ftbase.h
new file mode 100644 (file)
index 0000000..51a1db1
--- /dev/null
@@ -0,0 +1,69 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbase.h                                                               */
+/*                                                                         */
+/*    The FreeType private functions used in base module (specification).  */
+/*                                                                         */
+/*  Copyright 2008, 2010 by                                                */
+/*  David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya.      */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTBASE_H__
+#define __FTBASE_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+
+
+FT_BEGIN_HEADER
+
+
+  /* Assume the stream is sfnt-wrapped PS Type1 or sfnt-wrapped CID-keyed */
+  /* font, and try to load a face specified by the face_index.            */
+  FT_LOCAL( FT_Error )
+  open_face_PS_from_sfnt_stream( FT_Library     library,
+                                 FT_Stream      stream,
+                                 FT_Long        face_index,
+                                 FT_Int         num_params,
+                                 FT_Parameter  *params,
+                                 FT_Face       *aface );
+
+
+  /* Create a new FT_Face given a buffer and a driver name. */
+  /* From ftmac.c.                                          */
+  FT_LOCAL( FT_Error )
+  open_face_from_buffer( FT_Library   library,
+                         FT_Byte*     base,
+                         FT_ULong     size,
+                         FT_Long      face_index,
+                         const char*  driver_name,
+                         FT_Face     *aface );
+
+
+#if  defined( FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK ) && \
+    !defined( FT_MACINTOSH )
+  /* Mac OS X/Darwin kernel often changes recommended method to access */
+  /* the resource fork and older methods makes the kernel issue the    */
+  /* warning of deprecated method.  To calm it down, the methods based */
+  /* on Darwin VFS should be grouped and skip the rest methods after   */
+  /* the case the resource is opened but found to lack a font in it.   */
+  FT_LOCAL( FT_Bool )
+  ft_raccess_rule_by_darwin_vfs( FT_Library library, FT_UInt  rule_index );
+#endif
+
+
+FT_END_HEADER
+
+#endif /* __FTBASE_H__ */
+
+
+/* END */
diff --git a/src/base/ftbbox.c b/src/base/ftbbox.c
new file mode 100644 (file)
index 0000000..4b8e911
--- /dev/null
@@ -0,0 +1,662 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbbox.c                                                               */
+/*                                                                         */
+/*    FreeType bbox computation (body).                                    */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2004, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This component has a _single_ role: to compute exact outline bounding */
+  /* boxes.                                                                */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_BBOX_H
+#include FT_IMAGE_H
+#include FT_OUTLINE_H
+#include FT_INTERNAL_CALC_H
+#include FT_INTERNAL_OBJECTS_H
+
+
+  typedef struct  TBBox_Rec_
+  {
+    FT_Vector  last;
+    FT_BBox    bbox;
+
+  } TBBox_Rec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    BBox_Move_To                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used as a `move_to' and `line_to' emitter during  */
+  /*    FT_Outline_Decompose().  It simply records the destination point   */
+  /*    in `user->last'; no further computations are necessary since we    */
+  /*    use the cbox as the starting bbox which must be refined.           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    to   :: A pointer to the destination vector.                       */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    user :: A pointer to the current walk context.                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Always 0.  Needed for the interface only.                          */
+  /*                                                                       */
+  static int
+  BBox_Move_To( FT_Vector*  to,
+                TBBox_Rec*  user )
+  {
+    user->last = *to;
+
+    return 0;
+  }
+
+
+#define CHECK_X( p, bbox )  \
+          ( p->x < bbox.xMin || p->x > bbox.xMax )
+
+#define CHECK_Y( p, bbox )  \
+          ( p->y < bbox.yMin || p->y > bbox.yMax )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    BBox_Conic_Check                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finds the extrema of a 1-dimensional conic Bezier curve and update */
+  /*    a bounding range.  This version uses direct computation, as it     */
+  /*    doesn't need square roots.                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    y1  :: The start coordinate.                                       */
+  /*                                                                       */
+  /*    y2  :: The coordinate of the control point.                        */
+  /*                                                                       */
+  /*    y3  :: The end coordinate.                                         */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    min :: The address of the current minimum.                         */
+  /*                                                                       */
+  /*    max :: The address of the current maximum.                         */
+  /*                                                                       */
+  static void
+  BBox_Conic_Check( FT_Pos   y1,
+                    FT_Pos   y2,
+                    FT_Pos   y3,
+                    FT_Pos*  min,
+                    FT_Pos*  max )
+  {
+    if ( y1 <= y3 && y2 == y1 )     /* flat arc */
+      goto Suite;
+
+    if ( y1 < y3 )
+    {
+      if ( y2 >= y1 && y2 <= y3 )   /* ascending arc */
+        goto Suite;
+    }
+    else
+    {
+      if ( y2 >= y3 && y2 <= y1 )   /* descending arc */
+      {
+        y2 = y1;
+        y1 = y3;
+        y3 = y2;
+        goto Suite;
+      }
+    }
+
+    y1 = y3 = y1 - FT_MulDiv( y2 - y1, y2 - y1, y1 - 2*y2 + y3 );
+
+  Suite:
+    if ( y1 < *min ) *min = y1;
+    if ( y3 > *max ) *max = y3;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    BBox_Conic_To                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used as a `conic_to' emitter during               */
+  /*    FT_Outline_Decompose().  It checks a conic Bezier curve with the   */
+  /*    current bounding box, and computes its extrema if necessary to     */
+  /*    update it.                                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    control :: A pointer to a control point.                           */
+  /*                                                                       */
+  /*    to      :: A pointer to the destination vector.                    */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    user    :: The address of the current walk context.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Always 0.  Needed for the interface only.                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    In the case of a non-monotonous arc, we compute directly the       */
+  /*    extremum coordinates, as it is sufficiently fast.                  */
+  /*                                                                       */
+  static int
+  BBox_Conic_To( FT_Vector*  control,
+                 FT_Vector*  to,
+                 TBBox_Rec*  user )
+  {
+    /* we don't need to check `to' since it is always an `on' point, thus */
+    /* within the bbox                                                    */
+
+    if ( CHECK_X( control, user->bbox ) )
+      BBox_Conic_Check( user->last.x,
+                        control->x,
+                        to->x,
+                        &user->bbox.xMin,
+                        &user->bbox.xMax );
+
+    if ( CHECK_Y( control, user->bbox ) )
+      BBox_Conic_Check( user->last.y,
+                        control->y,
+                        to->y,
+                        &user->bbox.yMin,
+                        &user->bbox.yMax );
+
+    user->last = *to;
+
+    return 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    BBox_Cubic_Check                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finds the extrema of a 1-dimensional cubic Bezier curve and        */
+  /*    updates a bounding range.  This version uses splitting because we  */
+  /*    don't want to use square roots and extra accuracy.                 */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    p1  :: The start coordinate.                                       */
+  /*                                                                       */
+  /*    p2  :: The coordinate of the first control point.                  */
+  /*                                                                       */
+  /*    p3  :: The coordinate of the second control point.                 */
+  /*                                                                       */
+  /*    p4  :: The end coordinate.                                         */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    min :: The address of the current minimum.                         */
+  /*                                                                       */
+  /*    max :: The address of the current maximum.                         */
+  /*                                                                       */
+
+#if 0
+
+  static void
+  BBox_Cubic_Check( FT_Pos   p1,
+                    FT_Pos   p2,
+                    FT_Pos   p3,
+                    FT_Pos   p4,
+                    FT_Pos*  min,
+                    FT_Pos*  max )
+  {
+    FT_Pos  stack[32*3 + 1], *arc;
+
+
+    arc = stack;
+
+    arc[0] = p1;
+    arc[1] = p2;
+    arc[2] = p3;
+    arc[3] = p4;
+
+    do
+    {
+      FT_Pos  y1 = arc[0];
+      FT_Pos  y2 = arc[1];
+      FT_Pos  y3 = arc[2];
+      FT_Pos  y4 = arc[3];
+
+
+      if ( y1 == y4 )
+      {
+        if ( y1 == y2 && y1 == y3 )                         /* flat */
+          goto Test;
+      }
+      else if ( y1 < y4 )
+      {
+        if ( y2 >= y1 && y2 <= y4 && y3 >= y1 && y3 <= y4 ) /* ascending */
+          goto Test;
+      }
+      else
+      {
+        if ( y2 >= y4 && y2 <= y1 && y3 >= y4 && y3 <= y1 ) /* descending */
+        {
+          y2 = y1;
+          y1 = y4;
+          y4 = y2;
+          goto Test;
+        }
+      }
+
+      /* unknown direction -- split the arc in two */
+      arc[6] = y4;
+      arc[1] = y1 = ( y1 + y2 ) / 2;
+      arc[5] = y4 = ( y4 + y3 ) / 2;
+      y2 = ( y2 + y3 ) / 2;
+      arc[2] = y1 = ( y1 + y2 ) / 2;
+      arc[4] = y4 = ( y4 + y2 ) / 2;
+      arc[3] = ( y1 + y4 ) / 2;
+
+      arc += 3;
+      goto Suite;
+
+   Test:
+      if ( y1 < *min ) *min = y1;
+      if ( y4 > *max ) *max = y4;
+      arc -= 3;
+
+    Suite:
+      ;
+    } while ( arc >= stack );
+  }
+
+#else
+
+  static void
+  test_cubic_extrema( FT_Pos    y1,
+                      FT_Pos    y2,
+                      FT_Pos    y3,
+                      FT_Pos    y4,
+                      FT_Fixed  u,
+                      FT_Pos*   min,
+                      FT_Pos*   max )
+  {
+ /* FT_Pos    a = y4 - 3*y3 + 3*y2 - y1; */
+    FT_Pos    b = y3 - 2*y2 + y1;
+    FT_Pos    c = y2 - y1;
+    FT_Pos    d = y1;
+    FT_Pos    y;
+    FT_Fixed  uu;
+
+    FT_UNUSED ( y4 );
+
+
+    /* The polynomial is                      */
+    /*                                        */
+    /*    P(x) = a*x^3 + 3b*x^2 + 3c*x + d  , */
+    /*                                        */
+    /*   dP/dx = 3a*x^2 + 6b*x + 3c         . */
+    /*                                        */
+    /* However, we also have                  */
+    /*                                        */
+    /*   dP/dx(u) = 0                       , */
+    /*                                        */
+    /* which implies by subtraction that      */
+    /*                                        */
+    /*   P(u) = b*u^2 + 2c*u + d            . */
+
+    if ( u > 0 && u < 0x10000L )
+    {
+      uu = FT_MulFix( u, u );
+      y  = d + FT_MulFix( c, 2*u ) + FT_MulFix( b, uu );
+
+      if ( y < *min ) *min = y;
+      if ( y > *max ) *max = y;
+    }
+  }
+
+
+  static void
+  BBox_Cubic_Check( FT_Pos   y1,
+                    FT_Pos   y2,
+                    FT_Pos   y3,
+                    FT_Pos   y4,
+                    FT_Pos*  min,
+                    FT_Pos*  max )
+  {
+    /* always compare first and last points */
+    if      ( y1 < *min )  *min = y1;
+    else if ( y1 > *max )  *max = y1;
+
+    if      ( y4 < *min )  *min = y4;
+    else if ( y4 > *max )  *max = y4;
+
+    /* now, try to see if there are split points here */
+    if ( y1 <= y4 )
+    {
+      /* flat or ascending arc test */
+      if ( y1 <= y2 && y2 <= y4 && y1 <= y3 && y3 <= y4 )
+        return;
+    }
+    else /* y1 > y4 */
+    {
+      /* descending arc test */
+      if ( y1 >= y2 && y2 >= y4 && y1 >= y3 && y3 >= y4 )
+        return;
+    }
+
+    /* There are some split points.  Find them. */
+    {
+      FT_Pos    a = y4 - 3*y3 + 3*y2 - y1;
+      FT_Pos    b = y3 - 2*y2 + y1;
+      FT_Pos    c = y2 - y1;
+      FT_Pos    d;
+      FT_Fixed  t;
+
+
+      /* We need to solve `ax^2+2bx+c' here, without floating points!      */
+      /* The trick is to normalize to a different representation in order  */
+      /* to use our 16.16 fixed point routines.                            */
+      /*                                                                   */
+      /* We compute FT_MulFix(b,b) and FT_MulFix(a,c) after normalization. */
+      /* These values must fit into a single 16.16 value.                  */
+      /*                                                                   */
+      /* We normalize a, b, and c to `8.16' fixed float values to ensure   */
+      /* that its product is held in a `16.16' value.                      */
+
+      {
+        FT_ULong  t1, t2;
+        int       shift = 0;
+
+
+        /* The following computation is based on the fact that for   */
+        /* any value `y', if `n' is the position of the most         */
+        /* significant bit of `abs(y)' (starting from 0 for the      */
+        /* least significant bit), then `y' is in the range          */
+        /*                                                           */
+        /*   -2^n..2^n-1                                             */
+        /*                                                           */
+        /* We want to shift `a', `b', and `c' concurrently in order  */
+        /* to ensure that they all fit in 8.16 values, which maps    */
+        /* to the integer range `-2^23..2^23-1'.                     */
+        /*                                                           */
+        /* Necessarily, we need to shift `a', `b', and `c' so that   */
+        /* the most significant bit of its absolute values is at     */
+        /* _most_ at position 23.                                    */
+        /*                                                           */
+        /* We begin by computing `t1' as the bitwise `OR' of the     */
+        /* absolute values of `a', `b', `c'.                         */
+
+        t1  = (FT_ULong)( ( a >= 0 ) ? a : -a );
+        t2  = (FT_ULong)( ( b >= 0 ) ? b : -b );
+        t1 |= t2;
+        t2  = (FT_ULong)( ( c >= 0 ) ? c : -c );
+        t1 |= t2;
+
+        /* Now we can be sure that the most significant bit of `t1'  */
+        /* is the most significant bit of either `a', `b', or `c',   */
+        /* depending on the greatest integer range of the particular */
+        /* variable.                                                 */
+        /*                                                           */
+        /* Next, we compute the `shift', by shifting `t1' as many    */
+        /* times as necessary to move its MSB to position 23.  This  */
+        /* corresponds to a value of `t1' that is in the range       */
+        /* 0x40_0000..0x7F_FFFF.                                     */
+        /*                                                           */
+        /* Finally, we shift `a', `b', and `c' by the same amount.   */
+        /* This ensures that all values are now in the range         */
+        /* -2^23..2^23, i.e., they are now expressed as 8.16         */
+        /* fixed-float numbers.  This also means that we are using   */
+        /* 24 bits of precision to compute the zeros, independently  */
+        /* of the range of the original polynomial coefficients.     */
+        /*                                                           */
+        /* This algorithm should ensure reasonably accurate values   */
+        /* for the zeros.  Note that they are only expressed with    */
+        /* 16 bits when computing the extrema (the zeros need to     */
+        /* be in 0..1 exclusive to be considered part of the arc).   */
+
+        if ( t1 == 0 )  /* all coefficients are 0! */
+          return;
+
+        if ( t1 > 0x7FFFFFUL )
+        {
+          do
+          {
+            shift++;
+            t1 >>= 1;
+
+          } while ( t1 > 0x7FFFFFUL );
+
+          /* this loses some bits of precision, but we use 24 of them */
+          /* for the computation anyway                               */
+          a >>= shift;
+          b >>= shift;
+          c >>= shift;
+        }
+        else if ( t1 < 0x400000UL )
+        {
+          do
+          {
+            shift++;
+            t1 <<= 1;
+
+          } while ( t1 < 0x400000UL );
+
+          a <<= shift;
+          b <<= shift;
+          c <<= shift;
+        }
+      }
+
+      /* handle a == 0 */
+      if ( a == 0 )
+      {
+        if ( b != 0 )
+        {
+          t = - FT_DivFix( c, b ) / 2;
+          test_cubic_extrema( y1, y2, y3, y4, t, min, max );
+        }
+      }
+      else
+      {
+        /* solve the equation now */
+        d = FT_MulFix( b, b ) - FT_MulFix( a, c );
+        if ( d < 0 )
+          return;
+
+        if ( d == 0 )
+        {
+          /* there is a single split point at -b/a */
+          t = - FT_DivFix( b, a );
+          test_cubic_extrema( y1, y2, y3, y4, t, min, max );
+        }
+        else
+        {
+          /* there are two solutions; we need to filter them */
+          d = FT_SqrtFixed( (FT_Int32)d );
+          t = - FT_DivFix( b - d, a );
+          test_cubic_extrema( y1, y2, y3, y4, t, min, max );
+
+          t = - FT_DivFix( b + d, a );
+          test_cubic_extrema( y1, y2, y3, y4, t, min, max );
+        }
+      }
+    }
+  }
+
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    BBox_Cubic_To                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used as a `cubic_to' emitter during               */
+  /*    FT_Outline_Decompose().  It checks a cubic Bezier curve with the   */
+  /*    current bounding box, and computes its extrema if necessary to     */
+  /*    update it.                                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    control1 :: A pointer to the first control point.                  */
+  /*                                                                       */
+  /*    control2 :: A pointer to the second control point.                 */
+  /*                                                                       */
+  /*    to       :: A pointer to the destination vector.                   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    user     :: The address of the current walk context.               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Always 0.  Needed for the interface only.                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    In the case of a non-monotonous arc, we don't compute directly     */
+  /*    extremum coordinates, we subdivide instead.                        */
+  /*                                                                       */
+  static int
+  BBox_Cubic_To( FT_Vector*  control1,
+                 FT_Vector*  control2,
+                 FT_Vector*  to,
+                 TBBox_Rec*  user )
+  {
+    /* we don't need to check `to' since it is always an `on' point, thus */
+    /* within the bbox                                                    */
+
+    if ( CHECK_X( control1, user->bbox ) ||
+         CHECK_X( control2, user->bbox ) )
+      BBox_Cubic_Check( user->last.x,
+                        control1->x,
+                        control2->x,
+                        to->x,
+                        &user->bbox.xMin,
+                        &user->bbox.xMax );
+
+    if ( CHECK_Y( control1, user->bbox ) ||
+         CHECK_Y( control2, user->bbox ) )
+      BBox_Cubic_Check( user->last.y,
+                        control1->y,
+                        control2->y,
+                        to->y,
+                        &user->bbox.yMin,
+                        &user->bbox.yMax );
+
+    user->last = *to;
+
+    return 0;
+  }
+
+FT_DEFINE_OUTLINE_FUNCS(bbox_interface,
+    (FT_Outline_MoveTo_Func) BBox_Move_To,
+    (FT_Outline_LineTo_Func) BBox_Move_To,
+    (FT_Outline_ConicTo_Func)BBox_Conic_To,
+    (FT_Outline_CubicTo_Func)BBox_Cubic_To,
+    0, 0
+  )
+
+  /* documentation is in ftbbox.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_Get_BBox( FT_Outline*  outline,
+                       FT_BBox     *abbox )
+  {
+    FT_BBox     cbox;
+    FT_BBox     bbox;
+    FT_Vector*  vec;
+    FT_UShort   n;
+
+
+    if ( !abbox )
+      return FT_Err_Invalid_Argument;
+
+    if ( !outline )
+      return FT_Err_Invalid_Outline;
+
+    /* if outline is empty, return (0,0,0,0) */
+    if ( outline->n_points == 0 || outline->n_contours <= 0 )
+    {
+      abbox->xMin = abbox->xMax = 0;
+      abbox->yMin = abbox->yMax = 0;
+      return 0;
+    }
+
+    /* We compute the control box as well as the bounding box of  */
+    /* all `on' points in the outline.  Then, if the two boxes    */
+    /* coincide, we exit immediately.                             */
+
+    vec = outline->points;
+    bbox.xMin = bbox.xMax = cbox.xMin = cbox.xMax = vec->x;
+    bbox.yMin = bbox.yMax = cbox.yMin = cbox.yMax = vec->y;
+    vec++;
+
+    for ( n = 1; n < outline->n_points; n++ )
+    {
+      FT_Pos  x = vec->x;
+      FT_Pos  y = vec->y;
+
+
+      /* update control box */
+      if ( x < cbox.xMin ) cbox.xMin = x;
+      if ( x > cbox.xMax ) cbox.xMax = x;
+
+      if ( y < cbox.yMin ) cbox.yMin = y;
+      if ( y > cbox.yMax ) cbox.yMax = y;
+
+      if ( FT_CURVE_TAG( outline->tags[n] ) == FT_CURVE_TAG_ON )
+      {
+        /* update bbox for `on' points only */
+        if ( x < bbox.xMin ) bbox.xMin = x;
+        if ( x > bbox.xMax ) bbox.xMax = x;
+
+        if ( y < bbox.yMin ) bbox.yMin = y;
+        if ( y > bbox.yMax ) bbox.yMax = y;
+      }
+
+      vec++;
+    }
+
+    /* test two boxes for equality */
+    if ( cbox.xMin < bbox.xMin || cbox.xMax > bbox.xMax ||
+         cbox.yMin < bbox.yMin || cbox.yMax > bbox.yMax )
+    {
+      /* the two boxes are different, now walk over the outline to */
+      /* get the Bezier arc extrema.                               */
+
+      FT_Error   error;
+      TBBox_Rec  user;
+
+#ifdef FT_CONFIG_OPTION_PIC
+      FT_Outline_Funcs bbox_interface;
+      Init_Class_bbox_interface(&bbox_interface);
+#endif
+
+      user.bbox = bbox;
+
+      error = FT_Outline_Decompose( outline, &bbox_interface, &user );
+      if ( error )
+        return error;
+
+      *abbox = user.bbox;
+    }
+    else
+      *abbox = bbox;
+
+    return FT_Err_Ok;
+  }
+
+
+/* END */
diff --git a/src/base/ftbdf.c b/src/base/ftbdf.c
new file mode 100644 (file)
index 0000000..d29adf0
--- /dev/null
@@ -0,0 +1,88 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbdf.c                                                                */
+/*                                                                         */
+/*    FreeType API for accessing BDF-specific strings (body).              */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_SERVICE_BDF_H
+
+
+  /* documentation is in ftbdf.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_BDF_Charset_ID( FT_Face       face,
+                         const char*  *acharset_encoding,
+                         const char*  *acharset_registry )
+  {
+    FT_Error     error;
+    const char*  encoding = NULL;
+    const char*  registry = NULL;
+
+
+    error = FT_Err_Invalid_Argument;
+
+    if ( face )
+    {
+      FT_Service_BDF  service;
+
+
+      FT_FACE_FIND_SERVICE( face, service, BDF );
+
+      if ( service && service->get_charset_id )
+        error = service->get_charset_id( face, &encoding, &registry );
+    }
+
+    if ( acharset_encoding )
+      *acharset_encoding = encoding;
+
+    if ( acharset_registry )
+      *acharset_registry = registry;
+
+    return error;
+  }
+
+
+  /* documentation is in ftbdf.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_BDF_Property( FT_Face           face,
+                       const char*       prop_name,
+                       BDF_PropertyRec  *aproperty )
+  {
+    FT_Error  error;
+
+
+    error = FT_Err_Invalid_Argument;
+
+    aproperty->type = BDF_PROPERTY_TYPE_NONE;
+
+    if ( face )
+    {
+      FT_Service_BDF  service;
+
+
+      FT_FACE_FIND_SERVICE( face, service, BDF );
+
+      if ( service && service->get_property )
+        error = service->get_property( face, prop_name, aproperty );
+    }
+
+    return  error;
+  }
+
+
+/* END */
diff --git a/src/base/ftbitmap.c b/src/base/ftbitmap.c
new file mode 100644 (file)
index 0000000..84fa322
--- /dev/null
@@ -0,0 +1,667 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbitmap.c                                                             */
+/*                                                                         */
+/*    FreeType utility functions for bitmaps (body).                       */
+/*                                                                         */
+/*  Copyright 2004-2009, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_BITMAP_H
+#include FT_IMAGE_H
+#include FT_INTERNAL_OBJECTS_H
+
+
+  static
+  const FT_Bitmap  null_bitmap = { 0, 0, 0, 0, 0, 0, 0, 0 };
+
+
+  /* documentation is in ftbitmap.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Bitmap_New( FT_Bitmap  *abitmap )
+  {
+    *abitmap = null_bitmap;
+  }
+
+
+  /* documentation is in ftbitmap.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Bitmap_Copy( FT_Library        library,
+                  const FT_Bitmap  *source,
+                  FT_Bitmap        *target)
+  {
+    FT_Memory  memory = library->memory;
+    FT_Error   error  = FT_Err_Ok;
+    FT_Int     pitch  = source->pitch;
+    FT_ULong   size;
+
+
+    if ( source == target )
+      return FT_Err_Ok;
+
+    if ( source->buffer == NULL )
+    {
+      *target = *source;
+
+      return FT_Err_Ok;
+    }
+
+    if ( pitch < 0 )
+      pitch = -pitch;
+    size = (FT_ULong)( pitch * source->rows );
+
+    if ( target->buffer )
+    {
+      FT_Int    target_pitch = target->pitch;
+      FT_ULong  target_size;
+
+
+      if ( target_pitch < 0  )
+        target_pitch = -target_pitch;
+      target_size = (FT_ULong)( target_pitch * target->rows );
+
+      if ( target_size != size )
+        (void)FT_QREALLOC( target->buffer, target_size, size );
+    }
+    else
+      (void)FT_QALLOC( target->buffer, size );
+
+    if ( !error )
+    {
+      unsigned char *p;
+
+
+      p = target->buffer;
+      *target = *source;
+      target->buffer = p;
+
+      FT_MEM_COPY( target->buffer, source->buffer, size );
+    }
+
+    return error;
+  }
+
+
+  static FT_Error
+  ft_bitmap_assure_buffer( FT_Memory   memory,
+                           FT_Bitmap*  bitmap,
+                           FT_UInt     xpixels,
+                           FT_UInt     ypixels )
+  {
+    FT_Error        error;
+    int             pitch;
+    int             new_pitch;
+    FT_UInt         bpp;
+    FT_Int          i, width, height;
+    unsigned char*  buffer = NULL;
+
+
+    width  = bitmap->width;
+    height = bitmap->rows;
+    pitch  = bitmap->pitch;
+    if ( pitch < 0 )
+      pitch = -pitch;
+
+    switch ( bitmap->pixel_mode )
+    {
+    case FT_PIXEL_MODE_MONO:
+      bpp       = 1;
+      new_pitch = ( width + xpixels + 7 ) >> 3;
+      break;
+    case FT_PIXEL_MODE_GRAY2:
+      bpp       = 2;
+      new_pitch = ( width + xpixels + 3 ) >> 2;
+      break;
+    case FT_PIXEL_MODE_GRAY4:
+      bpp       = 4;
+      new_pitch = ( width + xpixels + 1 ) >> 1;
+      break;
+    case FT_PIXEL_MODE_GRAY:
+    case FT_PIXEL_MODE_LCD:
+    case FT_PIXEL_MODE_LCD_V:
+      bpp       = 8;
+      new_pitch = ( width + xpixels );
+      break;
+    default:
+      return FT_Err_Invalid_Glyph_Format;
+    }
+
+    /* if no need to allocate memory */
+    if ( ypixels == 0 && new_pitch <= pitch )
+    {
+      /* zero the padding */
+      FT_Int  bit_width = pitch * 8;
+      FT_Int  bit_last  = ( width + xpixels ) * bpp;
+
+
+      if ( bit_last < bit_width )
+      {
+        FT_Byte*  line  = bitmap->buffer + ( bit_last >> 3 );
+        FT_Byte*  end   = bitmap->buffer + pitch;
+        FT_Int    shift = bit_last & 7;
+        FT_UInt   mask  = 0xFF00U >> shift;
+        FT_Int    count = height;
+
+
+        for ( ; count > 0; count--, line += pitch, end += pitch )
+        {
+          FT_Byte*  write = line;
+
+
+          if ( shift > 0 )
+          {
+            write[0] = (FT_Byte)( write[0] & mask );
+            write++;
+          }
+          if ( write < end )
+            FT_MEM_ZERO( write, end-write );
+        }
+      }
+
+      return FT_Err_Ok;
+    }
+
+    if ( FT_QALLOC_MULT( buffer, new_pitch, bitmap->rows + ypixels ) )
+      return error;
+
+    if ( bitmap->pitch > 0 )
+    {
+      FT_Int  len = ( width * bpp + 7 ) >> 3;
+
+
+      for ( i = 0; i < bitmap->rows; i++ )
+        FT_MEM_COPY( buffer + new_pitch * ( ypixels + i ),
+                     bitmap->buffer + pitch * i, len );
+    }
+    else
+    {
+      FT_Int  len = ( width * bpp + 7 ) >> 3;
+
+
+      for ( i = 0; i < bitmap->rows; i++ )
+        FT_MEM_COPY( buffer + new_pitch * i,
+                     bitmap->buffer + pitch * i, len );
+    }
+
+    FT_FREE( bitmap->buffer );
+    bitmap->buffer = buffer;
+
+    if ( bitmap->pitch < 0 )
+      new_pitch = -new_pitch;
+
+    /* set pitch only, width and height are left untouched */
+    bitmap->pitch = new_pitch;
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftbitmap.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Bitmap_Embolden( FT_Library  library,
+                      FT_Bitmap*  bitmap,
+                      FT_Pos      xStrength,
+                      FT_Pos      yStrength )
+  {
+    FT_Error        error;
+    unsigned char*  p;
+    FT_Int          i, x, y, pitch;
+    FT_Int          xstr, ystr;
+
+
+    if ( !library )
+      return FT_Err_Invalid_Library_Handle;
+
+    if ( !bitmap || !bitmap->buffer )
+      return FT_Err_Invalid_Argument;
+
+    if ( ( ( FT_PIX_ROUND( xStrength ) >> 6 ) > FT_INT_MAX ) ||
+         ( ( FT_PIX_ROUND( yStrength ) >> 6 ) > FT_INT_MAX ) )
+      return FT_Err_Invalid_Argument;
+
+    xstr = (FT_Int)FT_PIX_ROUND( xStrength ) >> 6;
+    ystr = (FT_Int)FT_PIX_ROUND( yStrength ) >> 6;
+
+    if ( xstr == 0 && ystr == 0 )
+      return FT_Err_Ok;
+    else if ( xstr < 0 || ystr < 0 )
+      return FT_Err_Invalid_Argument;
+
+    switch ( bitmap->pixel_mode )
+    {
+    case FT_PIXEL_MODE_GRAY2:
+    case FT_PIXEL_MODE_GRAY4:
+      {
+        FT_Bitmap  tmp;
+        FT_Int     align;
+
+
+        if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY2 )
+          align = ( bitmap->width + xstr + 3 ) / 4;
+        else
+          align = ( bitmap->width + xstr + 1 ) / 2;
+
+        FT_Bitmap_New( &tmp );
+
+        error = FT_Bitmap_Convert( library, bitmap, &tmp, align );
+        if ( error )
+          return error;
+
+        FT_Bitmap_Done( library, bitmap );
+        *bitmap = tmp;
+      }
+      break;
+
+    case FT_PIXEL_MODE_MONO:
+      if ( xstr > 8 )
+        xstr = 8;
+      break;
+
+    case FT_PIXEL_MODE_LCD:
+      xstr *= 3;
+      break;
+
+    case FT_PIXEL_MODE_LCD_V:
+      ystr *= 3;
+      break;
+    }
+
+    error = ft_bitmap_assure_buffer( library->memory, bitmap, xstr, ystr );
+    if ( error )
+      return error;
+
+    pitch = bitmap->pitch;
+    if ( pitch > 0 )
+      p = bitmap->buffer + pitch * ystr;
+    else
+    {
+      pitch = -pitch;
+      p = bitmap->buffer + pitch * ( bitmap->rows - 1 );
+    }
+
+    /* for each row */
+    for ( y = 0; y < bitmap->rows ; y++ )
+    {
+      /*
+       * Horizontally:
+       *
+       * From the last pixel on, make each pixel or'ed with the
+       * `xstr' pixels before it.
+       */
+      for ( x = pitch - 1; x >= 0; x-- )
+      {
+        unsigned char tmp;
+
+
+        tmp = p[x];
+        for ( i = 1; i <= xstr; i++ )
+        {
+          if ( bitmap->pixel_mode == FT_PIXEL_MODE_MONO )
+          {
+            p[x] |= tmp >> i;
+
+            /* the maximum value of 8 for `xstr' comes from here */
+            if ( x > 0 )
+              p[x] |= p[x - 1] << ( 8 - i );
+
+#if 0
+            if ( p[x] == 0xff )
+              break;
+#endif
+          }
+          else
+          {
+            if ( x - i >= 0 )
+            {
+              if ( p[x] + p[x - i] > bitmap->num_grays - 1 )
+              {
+                p[x] = (unsigned char)(bitmap->num_grays - 1);
+                break;
+              }
+              else
+              {
+                p[x] = (unsigned char)(p[x] + p[x-i]);
+                if ( p[x] == bitmap->num_grays - 1 )
+                  break;
+              }
+            }
+            else
+              break;
+          }
+        }
+      }
+
+      /*
+       * Vertically:
+       *
+       * Make the above `ystr' rows or'ed with it.
+       */
+      for ( x = 1; x <= ystr; x++ )
+      {
+        unsigned char*  q;
+
+
+        q = p - bitmap->pitch * x;
+        for ( i = 0; i < pitch; i++ )
+          q[i] |= p[i];
+      }
+
+      p += bitmap->pitch;
+    }
+
+    bitmap->width += xstr;
+    bitmap->rows += ystr;
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftbitmap.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Bitmap_Convert( FT_Library        library,
+                     const FT_Bitmap  *source,
+                     FT_Bitmap        *target,
+                     FT_Int            alignment )
+  {
+    FT_Error   error = FT_Err_Ok;
+    FT_Memory  memory;
+
+
+    if ( !library )
+      return FT_Err_Invalid_Library_Handle;
+
+    memory = library->memory;
+
+    switch ( source->pixel_mode )
+    {
+    case FT_PIXEL_MODE_MONO:
+    case FT_PIXEL_MODE_GRAY:
+    case FT_PIXEL_MODE_GRAY2:
+    case FT_PIXEL_MODE_GRAY4:
+    case FT_PIXEL_MODE_LCD:
+    case FT_PIXEL_MODE_LCD_V:
+      {
+        FT_Int   pad;
+        FT_Long  old_size;
+
+
+        old_size = target->rows * target->pitch;
+        if ( old_size < 0 )
+          old_size = -old_size;
+
+        target->pixel_mode = FT_PIXEL_MODE_GRAY;
+        target->rows       = source->rows;
+        target->width      = source->width;
+
+        pad = 0;
+        if ( alignment > 0 )
+        {
+          pad = source->width % alignment;
+          if ( pad != 0 )
+            pad = alignment - pad;
+        }
+
+        target->pitch = source->width + pad;
+
+        if ( target->pitch > 0                                     &&
+             (FT_ULong)target->rows > FT_ULONG_MAX / target->pitch )
+          return FT_Err_Invalid_Argument;
+
+        if ( target->rows * target->pitch > old_size             &&
+             FT_QREALLOC( target->buffer,
+                          old_size, target->rows * target->pitch ) )
+          return error;
+      }
+      break;
+
+    default:
+      error = FT_Err_Invalid_Argument;
+    }
+
+    switch ( source->pixel_mode )
+    {
+    case FT_PIXEL_MODE_MONO:
+      {
+        FT_Byte*  s = source->buffer;
+        FT_Byte*  t = target->buffer;
+        FT_Int    i;
+
+
+        target->num_grays = 2;
+
+        for ( i = source->rows; i > 0; i-- )
+        {
+          FT_Byte*  ss = s;
+          FT_Byte*  tt = t;
+          FT_Int    j;
+
+
+          /* get the full bytes */
+          for ( j = source->width >> 3; j > 0; j-- )
+          {
+            FT_Int  val = ss[0]; /* avoid a byte->int cast on each line */
+
+
+            tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 );
+            tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 );
+            tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 );
+            tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 );
+            tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 );
+            tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 );
+            tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 );
+            tt[7] = (FT_Byte)(   val & 0x01 );
+
+            tt += 8;
+            ss += 1;
+          }
+
+          /* get remaining pixels (if any) */
+          j = source->width & 7;
+          if ( j > 0 )
+          {
+            FT_Int  val = *ss;
+
+
+            for ( ; j > 0; j-- )
+            {
+              tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7);
+              val <<= 1;
+              tt   += 1;
+            }
+          }
+
+          s += source->pitch;
+          t += target->pitch;
+        }
+      }
+      break;
+
+
+    case FT_PIXEL_MODE_GRAY:
+    case FT_PIXEL_MODE_LCD:
+    case FT_PIXEL_MODE_LCD_V:
+      {
+        FT_Int    width   = source->width;
+        FT_Byte*  s       = source->buffer;
+        FT_Byte*  t       = target->buffer;
+        FT_Int    s_pitch = source->pitch;
+        FT_Int    t_pitch = target->pitch;
+        FT_Int    i;
+
+
+        target->num_grays = 256;
+
+        for ( i = source->rows; i > 0; i-- )
+        {
+          FT_ARRAY_COPY( t, s, width );
+
+          s += s_pitch;
+          t += t_pitch;
+        }
+      }
+      break;
+
+
+    case FT_PIXEL_MODE_GRAY2:
+      {
+        FT_Byte*  s = source->buffer;
+        FT_Byte*  t = target->buffer;
+        FT_Int    i;
+
+
+        target->num_grays = 4;
+
+        for ( i = source->rows; i > 0; i-- )
+        {
+          FT_Byte*  ss = s;
+          FT_Byte*  tt = t;
+          FT_Int    j;
+
+
+          /* get the full bytes */
+          for ( j = source->width >> 2; j > 0; j-- )
+          {
+            FT_Int  val = ss[0];
+
+
+            tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 );
+            tt[1] = (FT_Byte)( ( val & 0x30 ) >> 4 );
+            tt[2] = (FT_Byte)( ( val & 0x0C ) >> 2 );
+            tt[3] = (FT_Byte)( ( val & 0x03 ) );
+
+            ss += 1;
+            tt += 4;
+          }
+
+          j = source->width & 3;
+          if ( j > 0 )
+          {
+            FT_Int  val = ss[0];
+
+
+            for ( ; j > 0; j-- )
+            {
+              tt[0]  = (FT_Byte)( ( val & 0xC0 ) >> 6 );
+              val  <<= 2;
+              tt    += 1;
+            }
+          }
+
+          s += source->pitch;
+          t += target->pitch;
+        }
+      }
+      break;
+
+
+    case FT_PIXEL_MODE_GRAY4:
+      {
+        FT_Byte*  s = source->buffer;
+        FT_Byte*  t = target->buffer;
+        FT_Int    i;
+
+
+        target->num_grays = 16;
+
+        for ( i = source->rows; i > 0; i-- )
+        {
+          FT_Byte*  ss = s;
+          FT_Byte*  tt = t;
+          FT_Int    j;
+
+
+          /* get the full bytes */
+          for ( j = source->width >> 1; j > 0; j-- )
+          {
+            FT_Int  val = ss[0];
+
+
+            tt[0] = (FT_Byte)( ( val & 0xF0 ) >> 4 );
+            tt[1] = (FT_Byte)( ( val & 0x0F ) );
+
+            ss += 1;
+            tt += 2;
+          }
+
+          if ( source->width & 1 )
+            tt[0] = (FT_Byte)( ( ss[0] & 0xF0 ) >> 4 );
+
+          s += source->pitch;
+          t += target->pitch;
+        }
+      }
+      break;
+
+
+    default:
+      ;
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftbitmap.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot  slot )
+  {
+    if ( slot && slot->format == FT_GLYPH_FORMAT_BITMAP   &&
+         !( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) )
+    {
+      FT_Bitmap  bitmap;
+      FT_Error   error;
+
+
+      FT_Bitmap_New( &bitmap );
+      error = FT_Bitmap_Copy( slot->library, &slot->bitmap, &bitmap );
+      if ( error )
+        return error;
+
+      slot->bitmap = bitmap;
+      slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftbitmap.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Bitmap_Done( FT_Library  library,
+                  FT_Bitmap  *bitmap )
+  {
+    FT_Memory  memory;
+
+
+    if ( !library )
+      return FT_Err_Invalid_Library_Handle;
+
+    if ( !bitmap )
+      return FT_Err_Invalid_Argument;
+
+    memory = library->memory;
+
+    FT_FREE( bitmap->buffer );
+    *bitmap = null_bitmap;
+
+    return FT_Err_Ok;
+  }
+
+
+/* END */
diff --git a/src/base/ftcalc.c b/src/base/ftcalc.c
new file mode 100644 (file)
index 0000000..2aeea04
--- /dev/null
@@ -0,0 +1,958 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcalc.c                                                               */
+/*                                                                         */
+/*    Arithmetic computations (body).                                      */
+/*                                                                         */
+/*  Copyright 1996-2006, 2008, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Support for 1-complement arithmetic has been totally dropped in this  */
+  /* release.  You can still write your own code if you need it.           */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Implementing basic computation routines.                              */
+  /*                                                                       */
+  /* FT_MulDiv(), FT_MulFix(), FT_DivFix(), FT_RoundFix(), FT_CeilFix(),   */
+  /* and FT_FloorFix() are declared in freetype.h.                         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_GLYPH_H
+#include FT_INTERNAL_CALC_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_OBJECTS_H
+
+#ifdef FT_MULFIX_INLINED
+#undef FT_MulFix
+#endif
+
+/* we need to define a 64-bits data type here */
+
+#ifdef FT_LONG64
+
+  typedef FT_INT64  FT_Int64;
+
+#else
+
+  typedef struct  FT_Int64_
+  {
+    FT_UInt32  lo;
+    FT_UInt32  hi;
+
+  } FT_Int64;
+
+#endif /* FT_LONG64 */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_calc
+
+
+  /* The following three functions are available regardless of whether */
+  /* FT_LONG64 is defined.                                             */
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Fixed )
+  FT_RoundFix( FT_Fixed  a )
+  {
+    return ( a >= 0 ) ?   ( a + 0x8000L ) & ~0xFFFFL
+                      : -((-a + 0x8000L ) & ~0xFFFFL );
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Fixed )
+  FT_CeilFix( FT_Fixed  a )
+  {
+    return ( a >= 0 ) ?   ( a + 0xFFFFL ) & ~0xFFFFL
+                      : -((-a + 0xFFFFL ) & ~0xFFFFL );
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Fixed )
+  FT_FloorFix( FT_Fixed  a )
+  {
+    return ( a >= 0 ) ?   a & ~0xFFFFL
+                      : -((-a) & ~0xFFFFL );
+  }
+
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  /* documentation is in ftcalc.h */
+
+  FT_EXPORT_DEF( FT_Int32 )
+  FT_Sqrt32( FT_Int32  x )
+  {
+    FT_UInt32  val, root, newroot, mask;
+
+
+    root = 0;
+    mask = (FT_UInt32)0x40000000UL;
+    val  = (FT_UInt32)x;
+
+    do
+    {
+      newroot = root + mask;
+      if ( newroot <= val )
+      {
+        val -= newroot;
+        root = newroot + mask;
+      }
+
+      root >>= 1;
+      mask >>= 2;
+
+    } while ( mask != 0 );
+
+    return root;
+  }
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+#ifdef FT_LONG64
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Long )
+  FT_MulDiv( FT_Long  a,
+             FT_Long  b,
+             FT_Long  c )
+  {
+    FT_Int   s;
+    FT_Long  d;
+
+
+    s = 1;
+    if ( a < 0 ) { a = -a; s = -1; }
+    if ( b < 0 ) { b = -b; s = -s; }
+    if ( c < 0 ) { c = -c; s = -s; }
+
+    d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c
+                         : 0x7FFFFFFFL );
+
+    return ( s > 0 ) ? d : -d;
+  }
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+  /* documentation is in ftcalc.h */
+
+  FT_BASE_DEF( FT_Long )
+  FT_MulDiv_No_Round( FT_Long  a,
+                      FT_Long  b,
+                      FT_Long  c )
+  {
+    FT_Int   s;
+    FT_Long  d;
+
+
+    s = 1;
+    if ( a < 0 ) { a = -a; s = -1; }
+    if ( b < 0 ) { b = -b; s = -s; }
+    if ( c < 0 ) { c = -c; s = -s; }
+
+    d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c
+                         : 0x7FFFFFFFL );
+
+    return ( s > 0 ) ? d : -d;
+  }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Long )
+  FT_MulFix( FT_Long  a,
+             FT_Long  b )
+  {
+#ifdef FT_MULFIX_ASSEMBLER
+
+    return FT_MULFIX_ASSEMBLER( a, b );
+
+#else
+
+    FT_Int   s = 1;
+    FT_Long  c;
+
+
+    if ( a < 0 )
+    {
+      a = -a;
+      s = -1;
+    }
+
+    if ( b < 0 )
+    {
+      b = -b;
+      s = -s;
+    }
+
+    c = (FT_Long)( ( (FT_Int64)a * b + 0x8000L ) >> 16 );
+
+    return ( s > 0 ) ? c : -c;
+
+#endif /* FT_MULFIX_ASSEMBLER */
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Long )
+  FT_DivFix( FT_Long  a,
+             FT_Long  b )
+  {
+    FT_Int32   s;
+    FT_UInt32  q;
+
+    s = 1;
+    if ( a < 0 ) { a = -a; s = -1; }
+    if ( b < 0 ) { b = -b; s = -s; }
+
+    if ( b == 0 )
+      /* check for division by 0 */
+      q = 0x7FFFFFFFL;
+    else
+      /* compute result directly */
+      q = (FT_UInt32)( ( ( (FT_Int64)a << 16 ) + ( b >> 1 ) ) / b );
+
+    return ( s < 0 ? -(FT_Long)q : (FT_Long)q );
+  }
+
+
+#else /* !FT_LONG64 */
+
+
+  static void
+  ft_multo64( FT_UInt32  x,
+              FT_UInt32  y,
+              FT_Int64  *z )
+  {
+    FT_UInt32  lo1, hi1, lo2, hi2, lo, hi, i1, i2;
+
+
+    lo1 = x & 0x0000FFFFU;  hi1 = x >> 16;
+    lo2 = y & 0x0000FFFFU;  hi2 = y >> 16;
+
+    lo = lo1 * lo2;
+    i1 = lo1 * hi2;
+    i2 = lo2 * hi1;
+    hi = hi1 * hi2;
+
+    /* Check carry overflow of i1 + i2 */
+    i1 += i2;
+    hi += (FT_UInt32)( i1 < i2 ) << 16;
+
+    hi += i1 >> 16;
+    i1  = i1 << 16;
+
+    /* Check carry overflow of i1 + lo */
+    lo += i1;
+    hi += ( lo < i1 );
+
+    z->lo = lo;
+    z->hi = hi;
+  }
+
+
+  static FT_UInt32
+  ft_div64by32( FT_UInt32  hi,
+                FT_UInt32  lo,
+                FT_UInt32  y )
+  {
+    FT_UInt32  r, q;
+    FT_Int     i;
+
+
+    q = 0;
+    r = hi;
+
+    if ( r >= y )
+      return (FT_UInt32)0x7FFFFFFFL;
+
+    i = 32;
+    do
+    {
+      r <<= 1;
+      q <<= 1;
+      r  |= lo >> 31;
+
+      if ( r >= y )
+      {
+        r -= y;
+        q |= 1;
+      }
+      lo <<= 1;
+    } while ( --i );
+
+    return q;
+  }
+
+
+  static void
+  FT_Add64( FT_Int64*  x,
+            FT_Int64*  y,
+            FT_Int64  *z )
+  {
+    register FT_UInt32  lo, hi;
+
+
+    lo = x->lo + y->lo;
+    hi = x->hi + y->hi + ( lo < x->lo );
+
+    z->lo = lo;
+    z->hi = hi;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  /* The FT_MulDiv function has been optimized thanks to ideas from      */
+  /* Graham Asher.  The trick is to optimize computation when everything */
+  /* fits within 32-bits (a rather common case).                         */
+  /*                                                                     */
+  /*  we compute 'a*b+c/2', then divide it by 'c'. (positive values)     */
+  /*                                                                     */
+  /*  46340 is FLOOR(SQRT(2^31-1)).                                      */
+  /*                                                                     */
+  /*  if ( a <= 46340 && b <= 46340 ) then ( a*b <= 0x7FFEA810 )         */
+  /*                                                                     */
+  /*  0x7FFFFFFF - 0x7FFEA810 = 0x157F0                                  */
+  /*                                                                     */
+  /*  if ( c < 0x157F0*2 ) then ( a*b+c/2 <= 0x7FFFFFFF )                */
+  /*                                                                     */
+  /*  and 2*0x157F0 = 176096                                             */
+  /*                                                                     */
+
+  FT_EXPORT_DEF( FT_Long )
+  FT_MulDiv( FT_Long  a,
+             FT_Long  b,
+             FT_Long  c )
+  {
+    long  s;
+
+
+    /* XXX: this function does not allow 64-bit arguments */
+    if ( a == 0 || b == c )
+      return a;
+
+    s  = a; a = FT_ABS( a );
+    s ^= b; b = FT_ABS( b );
+    s ^= c; c = FT_ABS( c );
+
+    if ( a <= 46340L && b <= 46340L && c <= 176095L && c > 0 )
+      a = ( a * b + ( c >> 1 ) ) / c;
+
+    else if ( (FT_Int32)c > 0 )
+    {
+      FT_Int64  temp, temp2;
+
+
+      ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp );
+
+      temp2.hi = 0;
+      temp2.lo = (FT_UInt32)(c >> 1);
+      FT_Add64( &temp, &temp2, &temp );
+      a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c );
+    }
+    else
+      a = 0x7FFFFFFFL;
+
+    return ( s < 0 ? -a : a );
+  }
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+  FT_BASE_DEF( FT_Long )
+  FT_MulDiv_No_Round( FT_Long  a,
+                      FT_Long  b,
+                      FT_Long  c )
+  {
+    long  s;
+
+
+    if ( a == 0 || b == c )
+      return a;
+
+    s  = a; a = FT_ABS( a );
+    s ^= b; b = FT_ABS( b );
+    s ^= c; c = FT_ABS( c );
+
+    if ( a <= 46340L && b <= 46340L && c > 0 )
+      a = a * b / c;
+
+    else if ( (FT_Int32)c > 0 )
+    {
+      FT_Int64  temp;
+
+
+      ft_multo64( (FT_Int32)a, (FT_Int32)b, &temp );
+      a = ft_div64by32( temp.hi, temp.lo, (FT_Int32)c );
+    }
+    else
+      a = 0x7FFFFFFFL;
+
+    return ( s < 0 ? -a : a );
+  }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Long )
+  FT_MulFix( FT_Long  a,
+             FT_Long  b )
+  {
+#ifdef FT_MULFIX_ASSEMBLER
+
+    return FT_MULFIX_ASSEMBLER( a, b );
+
+#elif 0
+
+    /*
+     *  This code is nonportable.  See comment below.
+     *
+     *  However, on a platform where right-shift of a signed quantity fills
+     *  the leftmost bits by copying the sign bit, it might be faster.
+     */
+
+    FT_Long   sa, sb;
+    FT_ULong  ua, ub;
+
+
+    if ( a == 0 || b == 0x10000L )
+      return a;
+
+    /*
+     *  This is a clever way of converting a signed number `a' into its
+     *  absolute value (stored back into `a') and its sign.  The sign is
+     *  stored in `sa'; 0 means `a' was positive or zero, and -1 means `a'
+     *  was negative.  (Similarly for `b' and `sb').
+     *
+     *  Unfortunately, it doesn't work (at least not portably).
+     *
+     *  It makes the assumption that right-shift on a negative signed value
+     *  fills the leftmost bits by copying the sign bit.  This is wrong.
+     *  According to K&R 2nd ed, section `A7.8 Shift Operators' on page 206,
+     *  the result of right-shift of a negative signed value is
+     *  implementation-defined.  At least one implementation fills the
+     *  leftmost bits with 0s (i.e., it is exactly the same as an unsigned
+     *  right shift).  This means that when `a' is negative, `sa' ends up
+     *  with the value 1 rather than -1.  After that, everything else goes
+     *  wrong.
+     */
+    sa = ( a >> ( sizeof ( a ) * 8 - 1 ) );
+    a  = ( a ^ sa ) - sa;
+    sb = ( b >> ( sizeof ( b ) * 8 - 1 ) );
+    b  = ( b ^ sb ) - sb;
+
+    ua = (FT_ULong)a;
+    ub = (FT_ULong)b;
+
+    if ( ua <= 2048 && ub <= 1048576L )
+      ua = ( ua * ub + 0x8000U ) >> 16;
+    else
+    {
+      FT_ULong  al = ua & 0xFFFFU;
+
+
+      ua = ( ua >> 16 ) * ub +  al * ( ub >> 16 ) +
+           ( ( al * ( ub & 0xFFFFU ) + 0x8000U ) >> 16 );
+    }
+
+    sa ^= sb,
+    ua  = (FT_ULong)(( ua ^ sa ) - sa);
+
+    return (FT_Long)ua;
+
+#else /* 0 */
+
+    FT_Long   s;
+    FT_ULong  ua, ub;
+
+
+    if ( a == 0 || b == 0x10000L )
+      return a;
+
+    s  = a; a = FT_ABS( a );
+    s ^= b; b = FT_ABS( b );
+
+    ua = (FT_ULong)a;
+    ub = (FT_ULong)b;
+
+    if ( ua <= 2048 && ub <= 1048576L )
+      ua = ( ua * ub + 0x8000UL ) >> 16;
+    else
+    {
+      FT_ULong  al = ua & 0xFFFFUL;
+
+
+      ua = ( ua >> 16 ) * ub +  al * ( ub >> 16 ) +
+           ( ( al * ( ub & 0xFFFFUL ) + 0x8000UL ) >> 16 );
+    }
+
+    return ( s < 0 ? -(FT_Long)ua : (FT_Long)ua );
+
+#endif /* 0 */
+
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Long )
+  FT_DivFix( FT_Long  a,
+             FT_Long  b )
+  {
+    FT_Int32   s;
+    FT_UInt32  q;
+
+
+    /* XXX: this function does not allow 64-bit arguments */
+    s  = (FT_Int32)a; a = FT_ABS( a );
+    s ^= (FT_Int32)b; b = FT_ABS( b );
+
+    if ( (FT_UInt32)b == 0 )
+    {
+      /* check for division by 0 */
+      q = (FT_UInt32)0x7FFFFFFFL;
+    }
+    else if ( ( a >> 16 ) == 0 )
+    {
+      /* compute result directly */
+      q = (FT_UInt32)( ( a << 16 ) + ( b >> 1 ) ) / (FT_UInt32)b;
+    }
+    else
+    {
+      /* we need more bits; we have to do it by hand */
+      FT_Int64  temp, temp2;
+
+
+      temp.hi  = (FT_Int32) ( a >> 16 );
+      temp.lo  = (FT_UInt32)( a << 16 );
+      temp2.hi = 0;
+      temp2.lo = (FT_UInt32)( b >> 1 );
+      FT_Add64( &temp, &temp2, &temp );
+      q = ft_div64by32( temp.hi, temp.lo, (FT_Int32)b );
+    }
+
+    return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+  }
+
+
+#if 0
+
+  /* documentation is in ftcalc.h */
+
+  FT_EXPORT_DEF( void )
+  FT_MulTo64( FT_Int32   x,
+              FT_Int32   y,
+              FT_Int64  *z )
+  {
+    FT_Int32  s;
+
+
+    s  = x; x = FT_ABS( x );
+    s ^= y; y = FT_ABS( y );
+
+    ft_multo64( x, y, z );
+
+    if ( s < 0 )
+    {
+      z->lo = (FT_UInt32)-(FT_Int32)z->lo;
+      z->hi = ~z->hi + !( z->lo );
+    }
+  }
+
+
+  /* apparently, the second version of this code is not compiled correctly */
+  /* on Mac machines with the MPW C compiler..  tsk, tsk, tsk...           */
+
+#if 1
+
+  FT_EXPORT_DEF( FT_Int32 )
+  FT_Div64by32( FT_Int64*  x,
+                FT_Int32   y )
+  {
+    FT_Int32   s;
+    FT_UInt32  q, r, i, lo;
+
+
+    s  = x->hi;
+    if ( s < 0 )
+    {
+      x->lo = (FT_UInt32)-(FT_Int32)x->lo;
+      x->hi = ~x->hi + !x->lo;
+    }
+    s ^= y;  y = FT_ABS( y );
+
+    /* Shortcut */
+    if ( x->hi == 0 )
+    {
+      if ( y > 0 )
+        q = x->lo / y;
+      else
+        q = 0x7FFFFFFFL;
+
+      return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+    }
+
+    r  = x->hi;
+    lo = x->lo;
+
+    if ( r >= (FT_UInt32)y ) /* we know y is to be treated as unsigned here */
+      return ( s < 0 ? 0x80000001UL : 0x7FFFFFFFUL );
+                             /* Return Max/Min Int32 if division overflow. */
+                             /* This includes division by zero!            */
+    q = 0;
+    for ( i = 0; i < 32; i++ )
+    {
+      r <<= 1;
+      q <<= 1;
+      r  |= lo >> 31;
+
+      if ( r >= (FT_UInt32)y )
+      {
+        r -= y;
+        q |= 1;
+      }
+      lo <<= 1;
+    }
+
+    return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+  }
+
+#else /* 0 */
+
+  FT_EXPORT_DEF( FT_Int32 )
+  FT_Div64by32( FT_Int64*  x,
+                FT_Int32   y )
+  {
+    FT_Int32   s;
+    FT_UInt32  q;
+
+
+    s  = x->hi;
+    if ( s < 0 )
+    {
+      x->lo = (FT_UInt32)-(FT_Int32)x->lo;
+      x->hi = ~x->hi + !x->lo;
+    }
+    s ^= y;  y = FT_ABS( y );
+
+    /* Shortcut */
+    if ( x->hi == 0 )
+    {
+      if ( y > 0 )
+        q = ( x->lo + ( y >> 1 ) ) / y;
+      else
+        q = 0x7FFFFFFFL;
+
+      return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+    }
+
+    q = ft_div64by32( x->hi, x->lo, y );
+
+    return ( s < 0 ? -(FT_Int32)q : (FT_Int32)q );
+  }
+
+#endif /* 0 */
+
+#endif /* 0 */
+
+
+#endif /* FT_LONG64 */
+
+
+  /* documentation is in ftglyph.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Matrix_Multiply( const FT_Matrix*  a,
+                      FT_Matrix        *b )
+  {
+    FT_Fixed  xx, xy, yx, yy;
+
+
+    if ( !a || !b )
+      return;
+
+    xx = FT_MulFix( a->xx, b->xx ) + FT_MulFix( a->xy, b->yx );
+    xy = FT_MulFix( a->xx, b->xy ) + FT_MulFix( a->xy, b->yy );
+    yx = FT_MulFix( a->yx, b->xx ) + FT_MulFix( a->yy, b->yx );
+    yy = FT_MulFix( a->yx, b->xy ) + FT_MulFix( a->yy, b->yy );
+
+    b->xx = xx;  b->xy = xy;
+    b->yx = yx;  b->yy = yy;
+  }
+
+
+  /* documentation is in ftglyph.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Matrix_Invert( FT_Matrix*  matrix )
+  {
+    FT_Pos  delta, xx, yy;
+
+
+    if ( !matrix )
+      return FT_Err_Invalid_Argument;
+
+    /* compute discriminant */
+    delta = FT_MulFix( matrix->xx, matrix->yy ) -
+            FT_MulFix( matrix->xy, matrix->yx );
+
+    if ( !delta )
+      return FT_Err_Invalid_Argument;  /* matrix can't be inverted */
+
+    matrix->xy = - FT_DivFix( matrix->xy, delta );
+    matrix->yx = - FT_DivFix( matrix->yx, delta );
+
+    xx = matrix->xx;
+    yy = matrix->yy;
+
+    matrix->xx = FT_DivFix( yy, delta );
+    matrix->yy = FT_DivFix( xx, delta );
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftcalc.h */
+
+  FT_BASE_DEF( void )
+  FT_Matrix_Multiply_Scaled( const FT_Matrix*  a,
+                             FT_Matrix        *b,
+                             FT_Long           scaling )
+  {
+    FT_Fixed  xx, xy, yx, yy;
+
+    FT_Long   val = 0x10000L * scaling;
+
+
+    if ( !a || !b )
+      return;
+
+    xx = FT_MulDiv( a->xx, b->xx, val ) + FT_MulDiv( a->xy, b->yx, val );
+    xy = FT_MulDiv( a->xx, b->xy, val ) + FT_MulDiv( a->xy, b->yy, val );
+    yx = FT_MulDiv( a->yx, b->xx, val ) + FT_MulDiv( a->yy, b->yx, val );
+    yy = FT_MulDiv( a->yx, b->xy, val ) + FT_MulDiv( a->yy, b->yy, val );
+
+    b->xx = xx;  b->xy = xy;
+    b->yx = yx;  b->yy = yy;
+  }
+
+
+  /* documentation is in ftcalc.h */
+
+  FT_BASE_DEF( void )
+  FT_Vector_Transform_Scaled( FT_Vector*        vector,
+                              const FT_Matrix*  matrix,
+                              FT_Long           scaling )
+  {
+    FT_Pos   xz, yz;
+
+    FT_Long  val = 0x10000L * scaling;
+
+
+    if ( !vector || !matrix )
+      return;
+
+    xz = FT_MulDiv( vector->x, matrix->xx, val ) +
+         FT_MulDiv( vector->y, matrix->xy, val );
+
+    yz = FT_MulDiv( vector->x, matrix->yx, val ) +
+         FT_MulDiv( vector->y, matrix->yy, val );
+
+    vector->x = xz;
+    vector->y = yz;
+  }
+
+
+  /* documentation is in ftcalc.h */
+
+  FT_BASE_DEF( FT_Int32 )
+  FT_SqrtFixed( FT_Int32  x )
+  {
+    FT_UInt32  root, rem_hi, rem_lo, test_div;
+    FT_Int     count;
+
+
+    root = 0;
+
+    if ( x > 0 )
+    {
+      rem_hi = 0;
+      rem_lo = x;
+      count  = 24;
+      do
+      {
+        rem_hi   = ( rem_hi << 2 ) | ( rem_lo >> 30 );
+        rem_lo <<= 2;
+        root   <<= 1;
+        test_div = ( root << 1 ) + 1;
+
+        if ( rem_hi >= test_div )
+        {
+          rem_hi -= test_div;
+          root   += 1;
+        }
+      } while ( --count );
+    }
+
+    return (FT_Int32)root;
+  }
+
+
+  /* documentation is in ftcalc.h */
+
+  FT_BASE_DEF( FT_Int )
+  ft_corner_orientation( FT_Pos  in_x,
+                         FT_Pos  in_y,
+                         FT_Pos  out_x,
+                         FT_Pos  out_y )
+  {
+    FT_Long  result; /* avoid overflow on 16-bit system */
+
+
+    /* deal with the trivial cases quickly */
+    if ( in_y == 0 )
+    {
+      if ( in_x >= 0 )
+        result = out_y;
+      else
+        result = -out_y;
+    }
+    else if ( in_x == 0 )
+    {
+      if ( in_y >= 0 )
+        result = -out_x;
+      else
+        result = out_x;
+    }
+    else if ( out_y == 0 )
+    {
+      if ( out_x >= 0 )
+        result = in_y;
+      else
+        result = -in_y;
+    }
+    else if ( out_x == 0 )
+    {
+      if ( out_y >= 0 )
+        result = -in_x;
+      else
+        result =  in_x;
+    }
+    else /* general case */
+    {
+#ifdef FT_LONG64
+
+      FT_Int64  delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x;
+
+
+      if ( delta == 0 )
+        result = 0;
+      else
+        result = 1 - 2 * ( delta < 0 );
+
+#else
+
+      FT_Int64  z1, z2;
+
+
+      /* XXX: this function does not allow 64-bit arguments */
+      ft_multo64( (FT_Int32)in_x, (FT_Int32)out_y, &z1 );
+      ft_multo64( (FT_Int32)in_y, (FT_Int32)out_x, &z2 );
+
+      if ( z1.hi > z2.hi )
+        result = +1;
+      else if ( z1.hi < z2.hi )
+        result = -1;
+      else if ( z1.lo > z2.lo )
+        result = +1;
+      else if ( z1.lo < z2.lo )
+        result = -1;
+      else
+        result = 0;
+
+#endif
+    }
+
+    /* XXX: only the sign of return value, +1/0/-1 must be used */
+    return (FT_Int)result;
+  }
+
+
+  /* documentation is in ftcalc.h */
+
+  FT_BASE_DEF( FT_Int )
+  ft_corner_is_flat( FT_Pos  in_x,
+                     FT_Pos  in_y,
+                     FT_Pos  out_x,
+                     FT_Pos  out_y )
+  {
+    FT_Pos  ax = in_x;
+    FT_Pos  ay = in_y;
+
+    FT_Pos  d_in, d_out, d_corner;
+
+
+    if ( ax < 0 )
+      ax = -ax;
+    if ( ay < 0 )
+      ay = -ay;
+    d_in = ax + ay;
+
+    ax = out_x;
+    if ( ax < 0 )
+      ax = -ax;
+    ay = out_y;
+    if ( ay < 0 )
+      ay = -ay;
+    d_out = ax + ay;
+
+    ax = out_x + in_x;
+    if ( ax < 0 )
+      ax = -ax;
+    ay = out_y + in_y;
+    if ( ay < 0 )
+      ay = -ay;
+    d_corner = ax + ay;
+
+    return ( d_in + d_out - d_corner ) < ( d_corner >> 4 );
+  }
+
+
+/* END */
diff --git a/src/base/ftcid.c b/src/base/ftcid.c
new file mode 100644 (file)
index 0000000..733aae1
--- /dev/null
@@ -0,0 +1,117 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcid.c                                                                */
+/*                                                                         */
+/*    FreeType API for accessing CID font information.                     */
+/*                                                                         */
+/*  Copyright 2007, 2009 by Derek Clegg, Michael Toftdal.                  */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_CID_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_SERVICE_CID_H
+
+
+  /* documentation is in ftcid.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_CID_Registry_Ordering_Supplement( FT_Face       face,
+                                           const char*  *registry,
+                                           const char*  *ordering,
+                                           FT_Int       *supplement)
+  {
+    FT_Error     error;
+    const char*  r = NULL;
+    const char*  o = NULL;
+    FT_Int       s = 0;
+
+
+    error = FT_Err_Invalid_Argument;
+
+    if ( face )
+    {
+      FT_Service_CID  service;
+
+
+      FT_FACE_FIND_SERVICE( face, service, CID );
+
+      if ( service && service->get_ros )
+        error = service->get_ros( face, &r, &o, &s );
+    }
+
+    if ( registry )
+      *registry = r;
+
+    if ( ordering )
+      *ordering = o;
+
+    if ( supplement )
+      *supplement = s;
+
+    return error;
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_CID_Is_Internally_CID_Keyed( FT_Face   face,
+                                      FT_Bool  *is_cid )
+  {
+    FT_Error  error = FT_Err_Invalid_Argument;
+    FT_Bool   ic = 0;
+
+
+    if ( face )
+    {
+      FT_Service_CID  service;
+
+
+      FT_FACE_FIND_SERVICE( face, service, CID );
+
+      if ( service && service->get_is_cid )
+        error = service->get_is_cid( face, &ic);
+    }
+
+    if ( is_cid )
+      *is_cid = ic;
+
+    return error;
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_CID_From_Glyph_Index( FT_Face   face,
+                               FT_UInt   glyph_index,
+                               FT_UInt  *cid )
+  {
+    FT_Error  error = FT_Err_Invalid_Argument;
+    FT_UInt   c = 0;
+
+
+    if ( face )
+    {
+      FT_Service_CID  service;
+
+
+      FT_FACE_FIND_SERVICE( face, service, CID );
+
+      if ( service && service->get_cid_from_glyph_index )
+        error = service->get_cid_from_glyph_index( face, glyph_index, &c);
+    }
+
+    if ( cid )
+      *cid = c;
+
+    return error;
+  }
+
+
+/* END */
diff --git a/src/base/ftdbgmem.c b/src/base/ftdbgmem.c
new file mode 100644 (file)
index 0000000..12fed04
--- /dev/null
@@ -0,0 +1,997 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftdbgmem.c                                                             */
+/*                                                                         */
+/*    Memory debugger (body).                                              */
+/*                                                                         */
+/*  Copyright 2001, 2002, 2003, 2004, 2005, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_CONFIG_CONFIG_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_MEMORY_H
+#include FT_SYSTEM_H
+#include FT_ERRORS_H
+#include FT_TYPES_H
+
+
+#ifdef FT_DEBUG_MEMORY
+
+#define  KEEPALIVE /* `Keep alive' means that freed blocks aren't released
+                    * to the heap.  This is useful to detect double-frees
+                    * or weird heap corruption, but it uses large amounts of
+                    * memory, however.
+                    */
+
+#include FT_CONFIG_STANDARD_LIBRARY_H
+
+  FT_BASE_DEF( const char* )  _ft_debug_file   = 0;
+  FT_BASE_DEF( long )         _ft_debug_lineno = 0;
+
+  extern void
+  FT_DumpMemory( FT_Memory  memory );
+
+
+  typedef struct FT_MemSourceRec_*  FT_MemSource;
+  typedef struct FT_MemNodeRec_*    FT_MemNode;
+  typedef struct FT_MemTableRec_*   FT_MemTable;
+
+
+#define FT_MEM_VAL( addr )  ((FT_PtrDist)(FT_Pointer)( addr ))
+
+  /*
+   *  This structure holds statistics for a single allocation/release
+   *  site.  This is useful to know where memory operations happen the
+   *  most.
+   */
+  typedef struct  FT_MemSourceRec_
+  {
+    const char*   file_name;
+    long          line_no;
+
+    FT_Long       cur_blocks;   /* current number of allocated blocks */
+    FT_Long       max_blocks;   /* max. number of allocated blocks    */
+    FT_Long       all_blocks;   /* total number of blocks allocated   */
+
+    FT_Long       cur_size;     /* current cumulative allocated size */
+    FT_Long       max_size;     /* maximum cumulative allocated size */
+    FT_Long       all_size;     /* total cumulative allocated size   */
+
+    FT_Long       cur_max;      /* current maximum allocated size */
+
+    FT_UInt32     hash;
+    FT_MemSource  link;
+
+  } FT_MemSourceRec;
+
+
+  /*
+   *  We don't need a resizable array for the memory sources, because
+   *  their number is pretty limited within FreeType.
+   */
+#define FT_MEM_SOURCE_BUCKETS  128
+
+  /*
+   *  This structure holds information related to a single allocated
+   *  memory block.  If KEEPALIVE is defined, blocks that are freed by
+   *  FreeType are never released to the system.  Instead, their `size'
+   *  field is set to -size.  This is mainly useful to detect double frees,
+   *  at the price of large memory footprint during execution.
+   */
+  typedef struct  FT_MemNodeRec_
+  {
+    FT_Byte*      address;
+    FT_Long       size;     /* < 0 if the block was freed */
+
+    FT_MemSource  source;
+
+#ifdef KEEPALIVE
+    const char*   free_file_name;
+    FT_Long       free_line_no;
+#endif
+
+    FT_MemNode    link;
+
+  } FT_MemNodeRec;
+
+
+  /*
+   *  The global structure, containing compound statistics and all hash
+   *  tables.
+   */
+  typedef struct  FT_MemTableRec_
+  {
+    FT_ULong         size;
+    FT_ULong         nodes;
+    FT_MemNode*      buckets;
+
+    FT_ULong         alloc_total;
+    FT_ULong         alloc_current;
+    FT_ULong         alloc_max;
+    FT_ULong         alloc_count;
+
+    FT_Bool          bound_total;
+    FT_ULong         alloc_total_max;
+
+    FT_Bool          bound_count;
+    FT_ULong         alloc_count_max;
+
+    FT_MemSource     sources[FT_MEM_SOURCE_BUCKETS];
+
+    FT_Bool          keep_alive;
+
+    FT_Memory        memory;
+    FT_Pointer       memory_user;
+    FT_Alloc_Func    alloc;
+    FT_Free_Func     free;
+    FT_Realloc_Func  realloc;
+
+  } FT_MemTableRec;
+
+
+#define FT_MEM_SIZE_MIN  7
+#define FT_MEM_SIZE_MAX  13845163
+
+#define FT_FILENAME( x )  ((x) ? (x) : "unknown file")
+
+
+  /*
+   *  Prime numbers are ugly to handle.  It would be better to implement
+   *  L-Hashing, which is 10% faster and doesn't require divisions.
+   */
+  static const FT_UInt  ft_mem_primes[] =
+  {
+    7,
+    11,
+    19,
+    37,
+    73,
+    109,
+    163,
+    251,
+    367,
+    557,
+    823,
+    1237,
+    1861,
+    2777,
+    4177,
+    6247,
+    9371,
+    14057,
+    21089,
+    31627,
+    47431,
+    71143,
+    106721,
+    160073,
+    240101,
+    360163,
+    540217,
+    810343,
+    1215497,
+    1823231,
+    2734867,
+    4102283,
+    6153409,
+    9230113,
+    13845163,
+  };
+
+
+  static FT_ULong
+  ft_mem_closest_prime( FT_ULong  num )
+  {
+    FT_UInt  i;
+
+
+    for ( i = 0;
+          i < sizeof ( ft_mem_primes ) / sizeof ( ft_mem_primes[0] ); i++ )
+      if ( ft_mem_primes[i] > num )
+        return ft_mem_primes[i];
+
+    return FT_MEM_SIZE_MAX;
+  }
+
+
+  extern void
+  ft_mem_debug_panic( const char*  fmt,
+                      ... )
+  {
+    va_list  ap;
+
+
+    printf( "FreeType.Debug: " );
+
+    va_start( ap, fmt );
+    vprintf( fmt, ap );
+    va_end( ap );
+
+    printf( "\n" );
+    exit( EXIT_FAILURE );
+  }
+
+
+  static FT_Pointer
+  ft_mem_table_alloc( FT_MemTable  table,
+                      FT_Long      size )
+  {
+    FT_Memory   memory = table->memory;
+    FT_Pointer  block;
+
+
+    memory->user = table->memory_user;
+    block = table->alloc( memory, size );
+    memory->user = table;
+
+    return block;
+  }
+
+
+  static void
+  ft_mem_table_free( FT_MemTable  table,
+                     FT_Pointer   block )
+  {
+    FT_Memory  memory = table->memory;
+
+
+    memory->user = table->memory_user;
+    table->free( memory, block );
+    memory->user = table;
+  }
+
+
+  static void
+  ft_mem_table_resize( FT_MemTable  table )
+  {
+    FT_ULong  new_size;
+
+
+    new_size = ft_mem_closest_prime( table->nodes );
+    if ( new_size != table->size )
+    {
+      FT_MemNode*  new_buckets;
+      FT_ULong     i;
+
+
+      new_buckets = (FT_MemNode *)
+                      ft_mem_table_alloc( table,
+                                          new_size * sizeof ( FT_MemNode ) );
+      if ( new_buckets == NULL )
+        return;
+
+      FT_ARRAY_ZERO( new_buckets, new_size );
+
+      for ( i = 0; i < table->size; i++ )
+      {
+        FT_MemNode  node, next, *pnode;
+        FT_PtrDist  hash;
+
+
+        node = table->buckets[i];
+        while ( node )
+        {
+          next  = node->link;
+          hash  = FT_MEM_VAL( node->address ) % new_size;
+          pnode = new_buckets + hash;
+
+          node->link = pnode[0];
+          pnode[0]   = node;
+
+          node = next;
+        }
+      }
+
+      if ( table->buckets )
+        ft_mem_table_free( table, table->buckets );
+
+      table->buckets = new_buckets;
+      table->size    = new_size;
+    }
+  }
+
+
+  static FT_MemTable
+  ft_mem_table_new( FT_Memory  memory )
+  {
+    FT_MemTable  table;
+
+
+    table = (FT_MemTable)memory->alloc( memory, sizeof ( *table ) );
+    if ( table == NULL )
+      goto Exit;
+
+    FT_ZERO( table );
+
+    table->size  = FT_MEM_SIZE_MIN;
+    table->nodes = 0;
+
+    table->memory = memory;
+
+    table->memory_user = memory->user;
+
+    table->alloc   = memory->alloc;
+    table->realloc = memory->realloc;
+    table->free    = memory->free;
+
+    table->buckets = (FT_MemNode *)
+                       memory->alloc( memory,
+                                      table->size * sizeof ( FT_MemNode ) );
+    if ( table->buckets )
+      FT_ARRAY_ZERO( table->buckets, table->size );
+    else
+    {
+      memory->free( memory, table );
+      table = NULL;
+    }
+
+  Exit:
+    return table;
+  }
+
+
+  static void
+  ft_mem_table_destroy( FT_MemTable  table )
+  {
+    FT_ULong  i;
+
+
+    FT_DumpMemory( table->memory );
+
+    if ( table )
+    {
+      FT_Long   leak_count = 0;
+      FT_ULong  leaks      = 0;
+
+
+      /* remove all blocks from the table, revealing leaked ones */
+      for ( i = 0; i < table->size; i++ )
+      {
+        FT_MemNode  *pnode = table->buckets + i, next, node = *pnode;
+
+
+        while ( node )
+        {
+          next       = node->link;
+          node->link = 0;
+
+          if ( node->size > 0 )
+          {
+            printf(
+              "leaked memory block at address %p, size %8ld in (%s:%ld)\n",
+              node->address, node->size,
+              FT_FILENAME( node->source->file_name ),
+              node->source->line_no );
+
+            leak_count++;
+            leaks += node->size;
+
+            ft_mem_table_free( table, node->address );
+          }
+
+          node->address = NULL;
+          node->size    = 0;
+
+          ft_mem_table_free( table, node );
+          node = next;
+        }
+        table->buckets[i] = 0;
+      }
+
+      ft_mem_table_free( table, table->buckets );
+      table->buckets = NULL;
+
+      table->size  = 0;
+      table->nodes = 0;
+
+      /* remove all sources */
+      for ( i = 0; i < FT_MEM_SOURCE_BUCKETS; i++ )
+      {
+        FT_MemSource  source, next;
+
+
+        for ( source = table->sources[i]; source != NULL; source = next )
+        {
+          next = source->link;
+          ft_mem_table_free( table, source );
+        }
+
+        table->sources[i] = NULL;
+      }
+
+      printf(
+        "FreeType: total memory allocations = %ld\n", table->alloc_total );
+      printf(
+        "FreeType: maximum memory footprint = %ld\n", table->alloc_max );
+
+      ft_mem_table_free( table, table );
+
+      if ( leak_count > 0 )
+        ft_mem_debug_panic(
+          "FreeType: %ld bytes of memory leaked in %ld blocks\n",
+          leaks, leak_count );
+
+      printf( "FreeType: no memory leaks detected\n" );
+    }
+  }
+
+
+  static FT_MemNode*
+  ft_mem_table_get_nodep( FT_MemTable  table,
+                          FT_Byte*     address )
+  {
+    FT_PtrDist   hash;
+    FT_MemNode  *pnode, node;
+
+
+    hash  = FT_MEM_VAL( address );
+    pnode = table->buckets + ( hash % table->size );
+
+    for (;;)
+    {
+      node = pnode[0];
+      if ( !node )
+        break;
+
+      if ( node->address == address )
+        break;
+
+      pnode = &node->link;
+    }
+    return pnode;
+  }
+
+
+  static FT_MemSource
+  ft_mem_table_get_source( FT_MemTable  table )
+  {
+    FT_UInt32     hash;
+    FT_MemSource  node, *pnode;
+
+
+    /* cast to FT_PtrDist first since void* can be larger */
+    /* than FT_UInt32 and GCC 4.1.1 emits a warning       */
+    hash  = (FT_UInt32)(FT_PtrDist)(void*)_ft_debug_file +
+              (FT_UInt32)( 5 * _ft_debug_lineno );
+    pnode = &table->sources[hash % FT_MEM_SOURCE_BUCKETS];
+
+    for ( ;; )
+    {
+      node = *pnode;
+      if ( node == NULL )
+        break;
+
+      if ( node->file_name == _ft_debug_file &&
+           node->line_no   == _ft_debug_lineno   )
+        goto Exit;
+
+      pnode = &node->link;
+    }
+
+    node = (FT_MemSource)ft_mem_table_alloc( table, sizeof ( *node ) );
+    if ( node == NULL )
+      ft_mem_debug_panic(
+        "not enough memory to perform memory debugging\n" );
+
+    node->file_name = _ft_debug_file;
+    node->line_no   = _ft_debug_lineno;
+
+    node->cur_blocks = 0;
+    node->max_blocks = 0;
+    node->all_blocks = 0;
+
+    node->cur_size   = 0;
+    node->max_size   = 0;
+    node->all_size   = 0;
+
+    node->cur_max    = 0;
+
+    node->link = NULL;
+    node->hash = hash;
+    *pnode     = node;
+
+  Exit:
+    return node;
+  }
+
+
+  static void
+  ft_mem_table_set( FT_MemTable  table,
+                    FT_Byte*     address,
+                    FT_ULong     size,
+                    FT_Long      delta )
+  {
+    FT_MemNode  *pnode, node;
+
+
+    if ( table )
+    {
+      FT_MemSource  source;
+
+
+      pnode = ft_mem_table_get_nodep( table, address );
+      node  = *pnode;
+      if ( node )
+      {
+        if ( node->size < 0 )
+        {
+          /* This block was already freed.  Our memory is now completely */
+          /* corrupted!                                                  */
+          /* This can only happen in keep-alive mode.                    */
+          ft_mem_debug_panic(
+            "memory heap corrupted (allocating freed block)" );
+        }
+        else
+        {
+          /* This block was already allocated.  This means that our memory */
+          /* is also corrupted!                                            */
+          ft_mem_debug_panic(
+            "memory heap corrupted (re-allocating allocated block at"
+            " %p, of size %ld)\n"
+            "org=%s:%d new=%s:%d\n",
+            node->address, node->size,
+            FT_FILENAME( node->source->file_name ), node->source->line_no,
+            FT_FILENAME( _ft_debug_file ), _ft_debug_lineno );
+        }
+      }
+
+      /* we need to create a new node in this table */
+      node = (FT_MemNode)ft_mem_table_alloc( table, sizeof ( *node ) );
+      if ( node == NULL )
+        ft_mem_debug_panic( "not enough memory to run memory tests" );
+
+      node->address = address;
+      node->size    = size;
+      node->source  = source = ft_mem_table_get_source( table );
+
+      if ( delta == 0 )
+      {
+        /* this is an allocation */
+        source->all_blocks++;
+        source->cur_blocks++;
+        if ( source->cur_blocks > source->max_blocks )
+          source->max_blocks = source->cur_blocks;
+      }
+
+      if ( size > (FT_ULong)source->cur_max )
+        source->cur_max = size;
+
+      if ( delta != 0 )
+      {
+        /* we are growing or shrinking a reallocated block */
+        source->cur_size     += delta;
+        table->alloc_current += delta;
+      }
+      else
+      {
+        /* we are allocating a new block */
+        source->cur_size     += size;
+        table->alloc_current += size;
+      }
+
+      source->all_size += size;
+
+      if ( source->cur_size > source->max_size )
+        source->max_size = source->cur_size;
+
+      node->free_file_name = NULL;
+      node->free_line_no   = 0;
+
+      node->link = pnode[0];
+
+      pnode[0] = node;
+      table->nodes++;
+
+      table->alloc_total += size;
+
+      if ( table->alloc_current > table->alloc_max )
+        table->alloc_max = table->alloc_current;
+
+      if ( table->nodes * 3 < table->size  ||
+           table->size  * 3 < table->nodes )
+        ft_mem_table_resize( table );
+    }
+  }
+
+
+  static void
+  ft_mem_table_remove( FT_MemTable  table,
+                       FT_Byte*     address,
+                       FT_Long      delta )
+  {
+    if ( table )
+    {
+      FT_MemNode  *pnode, node;
+
+
+      pnode = ft_mem_table_get_nodep( table, address );
+      node  = *pnode;
+      if ( node )
+      {
+        FT_MemSource  source;
+
+
+        if ( node->size < 0 )
+          ft_mem_debug_panic(
+            "freeing memory block at %p more than once at (%s:%ld)\n"
+            "block allocated at (%s:%ld) and released at (%s:%ld)",
+            address,
+            FT_FILENAME( _ft_debug_file ), _ft_debug_lineno,
+            FT_FILENAME( node->source->file_name ), node->source->line_no,
+            FT_FILENAME( node->free_file_name ), node->free_line_no );
+
+        /* scramble the node's content for additional safety */
+        FT_MEM_SET( address, 0xF3, node->size );
+
+        if ( delta == 0 )
+        {
+          source = node->source;
+
+          source->cur_blocks--;
+          source->cur_size -= node->size;
+
+          table->alloc_current -= node->size;
+        }
+
+        if ( table->keep_alive )
+        {
+          /* we simply invert the node's size to indicate that the node */
+          /* was freed.                                                 */
+          node->size           = -node->size;
+          node->free_file_name = _ft_debug_file;
+          node->free_line_no   = _ft_debug_lineno;
+        }
+        else
+        {
+          table->nodes--;
+
+          *pnode = node->link;
+
+          node->size   = 0;
+          node->source = NULL;
+
+          ft_mem_table_free( table, node );
+
+          if ( table->nodes * 3 < table->size  ||
+               table->size  * 3 < table->nodes )
+            ft_mem_table_resize( table );
+        }
+      }
+      else
+        ft_mem_debug_panic(
+          "trying to free unknown block at %p in (%s:%ld)\n",
+          address,
+          FT_FILENAME( _ft_debug_file ), _ft_debug_lineno );
+    }
+  }
+
+
+  extern FT_Pointer
+  ft_mem_debug_alloc( FT_Memory  memory,
+                      FT_Long    size )
+  {
+    FT_MemTable  table = (FT_MemTable)memory->user;
+    FT_Byte*     block;
+
+
+    if ( size <= 0 )
+      ft_mem_debug_panic( "negative block size allocation (%ld)", size );
+
+    /* return NULL if the maximum number of allocations was reached */
+    if ( table->bound_count                           &&
+         table->alloc_count >= table->alloc_count_max )
+      return NULL;
+
+    /* return NULL if this allocation would overflow the maximum heap size */
+    if ( table->bound_total                                             &&
+         table->alloc_total_max - table->alloc_current > (FT_ULong)size )
+      return NULL;
+
+    block = (FT_Byte *)ft_mem_table_alloc( table, size );
+    if ( block )
+    {
+      ft_mem_table_set( table, block, (FT_ULong)size, 0 );
+
+      table->alloc_count++;
+    }
+
+    _ft_debug_file   = "<unknown>";
+    _ft_debug_lineno = 0;
+
+    return (FT_Pointer)block;
+  }
+
+
+  extern void
+  ft_mem_debug_free( FT_Memory   memory,
+                     FT_Pointer  block )
+  {
+    FT_MemTable  table = (FT_MemTable)memory->user;
+
+
+    if ( block == NULL )
+      ft_mem_debug_panic( "trying to free NULL in (%s:%ld)",
+                          FT_FILENAME( _ft_debug_file ),
+                          _ft_debug_lineno );
+
+    ft_mem_table_remove( table, (FT_Byte*)block, 0 );
+
+    if ( !table->keep_alive )
+      ft_mem_table_free( table, block );
+
+    table->alloc_count--;
+
+    _ft_debug_file   = "<unknown>";
+    _ft_debug_lineno = 0;
+  }
+
+
+  extern FT_Pointer
+  ft_mem_debug_realloc( FT_Memory   memory,
+                        FT_Long     cur_size,
+                        FT_Long     new_size,
+                        FT_Pointer  block )
+  {
+    FT_MemTable  table = (FT_MemTable)memory->user;
+    FT_MemNode   node, *pnode;
+    FT_Pointer   new_block;
+    FT_Long      delta;
+
+    const char*  file_name = FT_FILENAME( _ft_debug_file );
+    FT_Long      line_no   = _ft_debug_lineno;
+
+
+    /* unlikely, but possible */
+    if ( new_size == cur_size )
+      return block;
+
+    /* the following is valid according to ANSI C */
+#if 0
+    if ( block == NULL || cur_size == 0 )
+      ft_mem_debug_panic( "trying to reallocate NULL in (%s:%ld)",
+                          file_name, line_no );
+#endif
+
+    /* while the following is allowed in ANSI C also, we abort since */
+    /* such case should be handled by FreeType.                      */
+    if ( new_size <= 0 )
+      ft_mem_debug_panic(
+        "trying to reallocate %p to size 0 (current is %ld) in (%s:%ld)",
+        block, cur_size, file_name, line_no );
+
+    /* check `cur_size' value */
+    pnode = ft_mem_table_get_nodep( table, (FT_Byte*)block );
+    node  = *pnode;
+    if ( !node )
+      ft_mem_debug_panic(
+        "trying to reallocate unknown block at %p in (%s:%ld)",
+        block, file_name, line_no );
+
+    if ( node->size <= 0 )
+      ft_mem_debug_panic(
+        "trying to reallocate freed block at %p in (%s:%ld)",
+        block, file_name, line_no );
+
+    if ( node->size != cur_size )
+      ft_mem_debug_panic( "invalid ft_realloc request for %p. cur_size is "
+                          "%ld instead of %ld in (%s:%ld)",
+                          block, cur_size, node->size, file_name, line_no );
+
+    /* return NULL if the maximum number of allocations was reached */
+    if ( table->bound_count                           &&
+         table->alloc_count >= table->alloc_count_max )
+      return NULL;
+
+    delta = (FT_Long)( new_size - cur_size );
+
+    /* return NULL if this allocation would overflow the maximum heap size */
+    if ( delta > 0                                                       &&
+         table->bound_total                                              &&
+         table->alloc_current + (FT_ULong)delta > table->alloc_total_max )
+      return NULL;
+
+    new_block = (FT_Byte *)ft_mem_table_alloc( table, new_size );
+    if ( new_block == NULL )
+      return NULL;
+
+    ft_mem_table_set( table, (FT_Byte*)new_block, new_size, delta );
+
+    ft_memcpy( new_block, block, cur_size < new_size ? cur_size : new_size );
+
+    ft_mem_table_remove( table, (FT_Byte*)block, delta );
+
+    _ft_debug_file   = "<unknown>";
+    _ft_debug_lineno = 0;
+
+    if ( !table->keep_alive )
+      ft_mem_table_free( table, block );
+
+    return new_block;
+  }
+
+
+  extern FT_Int
+  ft_mem_debug_init( FT_Memory  memory )
+  {
+    FT_MemTable  table;
+    FT_Int       result = 0;
+
+
+    if ( getenv( "FT2_DEBUG_MEMORY" ) )
+    {
+      table = ft_mem_table_new( memory );
+      if ( table )
+      {
+        const char*  p;
+
+
+        memory->user    = table;
+        memory->alloc   = ft_mem_debug_alloc;
+        memory->realloc = ft_mem_debug_realloc;
+        memory->free    = ft_mem_debug_free;
+
+        p = getenv( "FT2_ALLOC_TOTAL_MAX" );
+        if ( p != NULL )
+        {
+          FT_Long   total_max = ft_atol( p );
+
+
+          if ( total_max > 0 )
+          {
+            table->bound_total     = 1;
+            table->alloc_total_max = (FT_ULong)total_max;
+          }
+        }
+
+        p = getenv( "FT2_ALLOC_COUNT_MAX" );
+        if ( p != NULL )
+        {
+          FT_Long  total_count = ft_atol( p );
+
+
+          if ( total_count > 0 )
+          {
+            table->bound_count     = 1;
+            table->alloc_count_max = (FT_ULong)total_count;
+          }
+        }
+
+        p = getenv( "FT2_KEEP_ALIVE" );
+        if ( p != NULL )
+        {
+          FT_Long  keep_alive = ft_atol( p );
+
+
+          if ( keep_alive > 0 )
+            table->keep_alive = 1;
+        }
+
+        result = 1;
+      }
+    }
+    return result;
+  }
+
+
+  extern void
+  ft_mem_debug_done( FT_Memory  memory )
+  {
+    FT_MemTable  table = (FT_MemTable)memory->user;
+
+
+    if ( table )
+    {
+      memory->free    = table->free;
+      memory->realloc = table->realloc;
+      memory->alloc   = table->alloc;
+
+      ft_mem_table_destroy( table );
+      memory->user = NULL;
+    }
+  }
+
+
+
+  static int
+  ft_mem_source_compare( const void*  p1,
+                         const void*  p2 )
+  {
+    FT_MemSource  s1 = *(FT_MemSource*)p1;
+    FT_MemSource  s2 = *(FT_MemSource*)p2;
+
+
+    if ( s2->max_size > s1->max_size )
+      return 1;
+    else if ( s2->max_size < s1->max_size )
+      return -1;
+    else
+      return 0;
+  }
+
+
+  extern void
+  FT_DumpMemory( FT_Memory  memory )
+  {
+    FT_MemTable  table = (FT_MemTable)memory->user;
+
+
+    if ( table )
+    {
+      FT_MemSource*  bucket = table->sources;
+      FT_MemSource*  limit  = bucket + FT_MEM_SOURCE_BUCKETS;
+      FT_MemSource*  sources;
+      FT_UInt        nn, count;
+      const char*    fmt;
+
+
+      count = 0;
+      for ( ; bucket < limit; bucket++ )
+      {
+        FT_MemSource  source = *bucket;
+
+
+        for ( ; source; source = source->link )
+          count++;
+      }
+
+      sources = (FT_MemSource*)ft_mem_table_alloc(
+                                 table, sizeof ( *sources ) * count );
+
+      count = 0;
+      for ( bucket = table->sources; bucket < limit; bucket++ )
+      {
+        FT_MemSource  source = *bucket;
+
+
+        for ( ; source; source = source->link )
+          sources[count++] = source;
+      }
+
+      ft_qsort( sources, count, sizeof ( *sources ), ft_mem_source_compare );
+
+      printf( "FreeType Memory Dump: "
+              "current=%ld max=%ld total=%ld count=%ld\n",
+              table->alloc_current, table->alloc_max,
+              table->alloc_total, table->alloc_count );
+      printf( " block  block    sizes    sizes    sizes   source\n" );
+      printf( " count   high      sum  highsum      max   location\n" );
+      printf( "-------------------------------------------------\n" );
+
+      fmt = "%6ld %6ld %8ld %8ld %8ld %s:%d\n";
+
+      for ( nn = 0; nn < count; nn++ )
+      {
+        FT_MemSource  source = sources[nn];
+
+
+        printf( fmt,
+                source->cur_blocks, source->max_blocks,
+                source->cur_size, source->max_size, source->cur_max,
+                FT_FILENAME( source->file_name ),
+                source->line_no );
+      }
+      printf( "------------------------------------------------\n" );
+
+      ft_mem_table_free( table, sources );
+    }
+  }
+
+#else  /* !FT_DEBUG_MEMORY */
+
+  /* ANSI C doesn't like empty source files */
+  typedef int  _debug_mem_dummy;
+
+#endif /* !FT_DEBUG_MEMORY */
+
+
+/* END */
diff --git a/src/base/ftdebug.c b/src/base/ftdebug.c
new file mode 100644 (file)
index 0000000..2adbeab
--- /dev/null
@@ -0,0 +1,246 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftdebug.c                                                              */
+/*                                                                         */
+/*    Debugging and logging component (body).                              */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2004, 2008 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This component contains various macros and functions used to ease the */
+  /* debugging of the FreeType engine.  Its main purpose is in assertion   */
+  /* checking, tracing, and error detection.                               */
+  /*                                                                       */
+  /* There are now three debugging modes:                                  */
+  /*                                                                       */
+  /* - trace mode                                                          */
+  /*                                                                       */
+  /*   Error and trace messages are sent to the log file (which can be the */
+  /*   standard error output).                                             */
+  /*                                                                       */
+  /* - error mode                                                          */
+  /*                                                                       */
+  /*   Only error messages are generated.                                  */
+  /*                                                                       */
+  /* - release mode:                                                       */
+  /*                                                                       */
+  /*   No error message is sent or generated.  The code is free from any   */
+  /*   debugging parts.                                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_INTERNAL_DEBUG_H
+
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+
+  /* documentation is in ftdebug.h */
+
+  FT_BASE_DEF( void )
+  FT_Message( const char*  fmt, ... )
+  {
+    va_list  ap;
+
+
+    va_start( ap, fmt );
+    vfprintf( stderr, fmt, ap );
+    va_end( ap );
+  }
+
+
+  /* documentation is in ftdebug.h */
+
+  FT_BASE_DEF( void )
+  FT_Panic( const char*  fmt, ... )
+  {
+    va_list  ap;
+
+
+    va_start( ap, fmt );
+    vfprintf( stderr, fmt, ap );
+    va_end( ap );
+
+    exit( EXIT_FAILURE );
+  }
+
+#endif /* FT_DEBUG_LEVEL_ERROR */
+
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+  /* array of trace levels, initialized to 0 */
+  int  ft_trace_levels[trace_count];
+
+
+  /* define array of trace toggle names */
+#define FT_TRACE_DEF( x )  #x ,
+
+  static const char*  ft_trace_toggles[trace_count + 1] =
+  {
+#include FT_INTERNAL_TRACE_H
+    NULL
+  };
+
+#undef FT_TRACE_DEF
+
+
+  /* documentation is in ftdebug.h */
+
+  FT_BASE_DEF( FT_Int )
+  FT_Trace_Get_Count( void )
+  {
+    return trace_count;
+  }
+
+
+  /* documentation is in ftdebug.h */
+
+  FT_BASE_DEF( const char * )
+  FT_Trace_Get_Name( FT_Int  idx )
+  {
+    int  max = FT_Trace_Get_Count();
+
+
+    if ( idx < max )
+      return ft_trace_toggles[idx];
+    else
+      return NULL;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Initialize the tracing sub-system.  This is done by retrieving the    */
+  /* value of the `FT2_DEBUG' environment variable.  It must be a list of  */
+  /* toggles, separated by spaces, `;', or `,'.  Example:                  */
+  /*                                                                       */
+  /*    export FT2_DEBUG="any:3 memory:7 stream:5"                         */
+  /*                                                                       */
+  /* This requests that all levels be set to 3, except the trace level for */
+  /* the memory and stream components which are set to 7 and 5,            */
+  /* respectively.                                                         */
+  /*                                                                       */
+  /* See the file <include/freetype/internal/fttrace.h> for details of the */
+  /* available toggle names.                                               */
+  /*                                                                       */
+  /* The level must be between 0 and 7; 0 means quiet (except for serious  */
+  /* runtime errors), and 7 means _very_ verbose.                          */
+  /*                                                                       */
+  FT_BASE_DEF( void )
+  ft_debug_init( void )
+  {
+    const char*  ft2_debug = getenv( "FT2_DEBUG" );
+
+
+    if ( ft2_debug )
+    {
+      const char*  p = ft2_debug;
+      const char*  q;
+
+
+      for ( ; *p; p++ )
+      {
+        /* skip leading whitespace and separators */
+        if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' )
+          continue;
+
+        /* read toggle name, followed by ':' */
+        q = p;
+        while ( *p && *p != ':' )
+          p++;
+
+        if ( *p == ':' && p > q )
+        {
+          FT_Int  n, i, len = (FT_Int)( p - q );
+          FT_Int  level = -1, found = -1;
+
+
+          for ( n = 0; n < trace_count; n++ )
+          {
+            const char*  toggle = ft_trace_toggles[n];
+
+
+            for ( i = 0; i < len; i++ )
+            {
+              if ( toggle[i] != q[i] )
+                break;
+            }
+
+            if ( i == len && toggle[i] == 0 )
+            {
+              found = n;
+              break;
+            }
+          }
+
+          /* read level */
+          p++;
+          if ( *p )
+          {
+            level = *p++ - '0';
+            if ( level < 0 || level > 7 )
+              level = -1;
+          }
+
+          if ( found >= 0 && level >= 0 )
+          {
+            if ( found == trace_any )
+            {
+              /* special case for `any' */
+              for ( n = 0; n < trace_count; n++ )
+                ft_trace_levels[n] = level;
+            }
+            else
+              ft_trace_levels[found] = level;
+          }
+        }
+      }
+    }
+  }
+
+
+#else  /* !FT_DEBUG_LEVEL_TRACE */
+
+
+  FT_BASE_DEF( void )
+  ft_debug_init( void )
+  {
+    /* nothing */
+  }
+
+
+  FT_BASE_DEF( FT_Int )
+  FT_Trace_Get_Count( void )
+  {
+    return 0;
+  }
+
+
+  FT_BASE_DEF( const char * )
+  FT_Trace_Get_Name( FT_Int  idx )
+  {
+    FT_UNUSED( idx );
+
+    return NULL;
+  }
+
+
+#endif /* !FT_DEBUG_LEVEL_TRACE */
+
+
+/* END */
diff --git a/src/base/ftfstype.c b/src/base/ftfstype.c
new file mode 100644 (file)
index 0000000..d0ef7b7
--- /dev/null
@@ -0,0 +1,62 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftfstype.c                                                             */
+/*                                                                         */
+/*    FreeType utility file to access FSType data (body).                  */
+/*                                                                         */
+/*  Copyright 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#include <ft2build.h>
+#include FT_TYPE1_TABLES_H
+#include FT_TRUETYPE_TABLES_H
+#include FT_INTERNAL_SERVICE_H
+#include FT_SERVICE_POSTSCRIPT_INFO_H
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_UShort )
+  FT_Get_FSType_Flags( FT_Face  face )
+  {
+    TT_OS2*  os2;
+
+
+    /* first, try to get the fs_type directly from the font */
+    if ( face )
+    {
+      FT_Service_PsInfo  service = NULL;
+
+
+      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+      if ( service && service->ps_get_font_extra )
+      {
+        PS_FontExtraRec  extra;
+
+
+        if ( !service->ps_get_font_extra( face, &extra ) &&
+             extra.fs_type != 0                          )
+          return extra.fs_type;
+      }
+    }
+
+    /* look at FSType before fsType for Type42 */
+
+    if ( ( os2 = (TT_OS2*)FT_Get_Sfnt_Table( face, ft_sfnt_os2 ) ) != NULL &&
+         os2->version != 0xFFFFU                                           )
+      return os2->fsType;
+
+    return 0;
+  }
+
+
+/* END */
diff --git a/src/base/ftgasp.c b/src/base/ftgasp.c
new file mode 100644 (file)
index 0000000..8485d29
--- /dev/null
@@ -0,0 +1,61 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgasp.c                                                               */
+/*                                                                         */
+/*    Access of TrueType's `gasp' table (body).                            */
+/*                                                                         */
+/*  Copyright 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_GASP_H
+#include FT_INTERNAL_TRUETYPE_TYPES_H
+
+
+  FT_EXPORT_DEF( FT_Int )
+  FT_Get_Gasp( FT_Face  face,
+               FT_UInt  ppem )
+  {
+    FT_Int  result = FT_GASP_NO_TABLE;
+
+
+    if ( face && FT_IS_SFNT( face ) )
+    {
+      TT_Face  ttface = (TT_Face)face;
+
+
+      if ( ttface->gasp.numRanges > 0 )
+      {
+        TT_GaspRange  range     = ttface->gasp.gaspRanges;
+        TT_GaspRange  range_end = range + ttface->gasp.numRanges;
+
+
+        while ( ppem > range->maxPPEM )
+        {
+          range++;
+          if ( range >= range_end )
+            goto Exit;
+        }
+
+        result = range->gaspFlag;
+
+        /* ensure that we don't have spurious bits */
+        if ( ttface->gasp.version == 0 )
+          result &= 3;
+      }
+    }
+  Exit:
+    return result;
+  }
+
+
+/* END */
diff --git a/src/base/ftgloadr.c b/src/base/ftgloadr.c
new file mode 100644 (file)
index 0000000..8483450
--- /dev/null
@@ -0,0 +1,401 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgloadr.c                                                             */
+/*                                                                         */
+/*    The FreeType glyph loader (body).                                    */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004, 2005, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_GLYPH_LOADER_H
+#include FT_INTERNAL_MEMORY_H
+#include FT_INTERNAL_OBJECTS_H
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gloader
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                                                               *****/
+  /*****                    G L Y P H   L O A D E R                    *****/
+  /*****                                                               *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The glyph loader is a simple object which is used to load a set of    */
+  /* glyphs easily.  It is critical for the correct loading of composites. */
+  /*                                                                       */
+  /* Ideally, one can see it as a stack of abstract `glyph' objects.       */
+  /*                                                                       */
+  /*   loader.base     Is really the bottom of the stack.  It describes a  */
+  /*                   single glyph image made of the juxtaposition of     */
+  /*                   several glyphs (those `in the stack').              */
+  /*                                                                       */
+  /*   loader.current  Describes the top of the stack, on which a new      */
+  /*                   glyph can be loaded.                                */
+  /*                                                                       */
+  /*   Rewind          Clears the stack.                                   */
+  /*   Prepare         Set up `loader.current' for addition of a new glyph */
+  /*                   image.                                              */
+  /*   Add             Add the `current' glyph image to the `base' one,    */
+  /*                   and prepare for another one.                        */
+  /*                                                                       */
+  /* The glyph loader is now a base object.  Each driver used to           */
+  /* re-implement it in one way or the other, which wasted code and        */
+  /* energy.                                                               */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* create a new glyph loader */
+  FT_BASE_DEF( FT_Error )
+  FT_GlyphLoader_New( FT_Memory        memory,
+                      FT_GlyphLoader  *aloader )
+  {
+    FT_GlyphLoader  loader = NULL;
+    FT_Error        error;
+
+
+    if ( !FT_NEW( loader ) )
+    {
+      loader->memory = memory;
+      *aloader       = loader;
+    }
+    return error;
+  }
+
+
+  /* rewind the glyph loader - reset counters to 0 */
+  FT_BASE_DEF( void )
+  FT_GlyphLoader_Rewind( FT_GlyphLoader  loader )
+  {
+    FT_GlyphLoad  base    = &loader->base;
+    FT_GlyphLoad  current = &loader->current;
+
+
+    base->outline.n_points   = 0;
+    base->outline.n_contours = 0;
+    base->num_subglyphs      = 0;
+
+    *current = *base;
+  }
+
+
+  /* reset the glyph loader, frees all allocated tables */
+  /* and starts from zero                               */
+  FT_BASE_DEF( void )
+  FT_GlyphLoader_Reset( FT_GlyphLoader  loader )
+  {
+    FT_Memory memory = loader->memory;
+
+
+    FT_FREE( loader->base.outline.points );
+    FT_FREE( loader->base.outline.tags );
+    FT_FREE( loader->base.outline.contours );
+    FT_FREE( loader->base.extra_points );
+    FT_FREE( loader->base.subglyphs );
+
+    loader->base.extra_points2 = NULL;
+
+    loader->max_points    = 0;
+    loader->max_contours  = 0;
+    loader->max_subglyphs = 0;
+
+    FT_GlyphLoader_Rewind( loader );
+  }
+
+
+  /* delete a glyph loader */
+  FT_BASE_DEF( void )
+  FT_GlyphLoader_Done( FT_GlyphLoader  loader )
+  {
+    if ( loader )
+    {
+      FT_Memory memory = loader->memory;
+
+
+      FT_GlyphLoader_Reset( loader );
+      FT_FREE( loader );
+    }
+  }
+
+
+  /* re-adjust the `current' outline fields */
+  static void
+  FT_GlyphLoader_Adjust_Points( FT_GlyphLoader  loader )
+  {
+    FT_Outline*  base    = &loader->base.outline;
+    FT_Outline*  current = &loader->current.outline;
+
+
+    current->points   = base->points   + base->n_points;
+    current->tags     = base->tags     + base->n_points;
+    current->contours = base->contours + base->n_contours;
+
+    /* handle extra points table - if any */
+    if ( loader->use_extra )
+    {
+      loader->current.extra_points  = loader->base.extra_points +
+                                      base->n_points;
+
+      loader->current.extra_points2 = loader->base.extra_points2 +
+                                      base->n_points;
+    }
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_GlyphLoader_CreateExtra( FT_GlyphLoader  loader )
+  {
+    FT_Error   error;
+    FT_Memory  memory = loader->memory;
+
+
+    if ( !FT_NEW_ARRAY( loader->base.extra_points, 2 * loader->max_points ) )
+    {
+      loader->use_extra          = 1;
+      loader->base.extra_points2 = loader->base.extra_points +
+                                   loader->max_points;
+
+      FT_GlyphLoader_Adjust_Points( loader );
+    }
+    return error;
+  }
+
+
+  /* re-adjust the `current' subglyphs field */
+  static void
+  FT_GlyphLoader_Adjust_Subglyphs( FT_GlyphLoader  loader )
+  {
+    FT_GlyphLoad  base    = &loader->base;
+    FT_GlyphLoad  current = &loader->current;
+
+
+    current->subglyphs = base->subglyphs + base->num_subglyphs;
+  }
+
+
+  /* Ensure that we can add `n_points' and `n_contours' to our glyph.      */
+  /* This function reallocates its outline tables if necessary.  Note that */
+  /* it DOESN'T change the number of points within the loader!             */
+  /*                                                                       */
+  FT_BASE_DEF( FT_Error )
+  FT_GlyphLoader_CheckPoints( FT_GlyphLoader  loader,
+                              FT_UInt         n_points,
+                              FT_UInt         n_contours )
+  {
+    FT_Memory    memory  = loader->memory;
+    FT_Error     error   = FT_Err_Ok;
+    FT_Outline*  base    = &loader->base.outline;
+    FT_Outline*  current = &loader->current.outline;
+    FT_Bool      adjust  = 0;
+
+    FT_UInt      new_max, old_max;
+
+
+    /* check points & tags */
+    new_max = base->n_points + current->n_points + n_points;
+    old_max = loader->max_points;
+
+    if ( new_max > old_max )
+    {
+      new_max = FT_PAD_CEIL( new_max, 8 );
+
+      if ( new_max > FT_OUTLINE_POINTS_MAX )
+        return FT_Err_Array_Too_Large;
+
+      if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) ||
+           FT_RENEW_ARRAY( base->tags,   old_max, new_max ) )
+        goto Exit;
+
+      if ( loader->use_extra )
+      {
+        if ( FT_RENEW_ARRAY( loader->base.extra_points,
+                             old_max * 2, new_max * 2 ) )
+          goto Exit;
+
+        FT_ARRAY_MOVE( loader->base.extra_points + new_max,
+                       loader->base.extra_points + old_max,
+                       old_max );
+
+        loader->base.extra_points2 = loader->base.extra_points + new_max;
+      }
+
+      adjust = 1;
+      loader->max_points = new_max;
+    }
+
+    /* check contours */
+    old_max = loader->max_contours;
+    new_max = base->n_contours + current->n_contours +
+              n_contours;
+    if ( new_max > old_max )
+    {
+      new_max = FT_PAD_CEIL( new_max, 4 );
+
+      if ( new_max > FT_OUTLINE_CONTOURS_MAX )
+        return FT_Err_Array_Too_Large;
+
+      if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) )
+        goto Exit;
+
+      adjust = 1;
+      loader->max_contours = new_max;
+    }
+
+    if ( adjust )
+      FT_GlyphLoader_Adjust_Points( loader );
+
+  Exit:
+    return error;
+  }
+
+
+  /* Ensure that we can add `n_subglyphs' to our glyph. this function */
+  /* reallocates its subglyphs table if necessary.  Note that it DOES */
+  /* NOT change the number of subglyphs within the loader!            */
+  /*                                                                  */
+  FT_BASE_DEF( FT_Error )
+  FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader  loader,
+                                 FT_UInt         n_subs )
+  {
+    FT_Memory     memory = loader->memory;
+    FT_Error      error  = FT_Err_Ok;
+    FT_UInt       new_max, old_max;
+
+    FT_GlyphLoad  base    = &loader->base;
+    FT_GlyphLoad  current = &loader->current;
+
+
+    new_max = base->num_subglyphs + current->num_subglyphs + n_subs;
+    old_max = loader->max_subglyphs;
+    if ( new_max > old_max )
+    {
+      new_max = FT_PAD_CEIL( new_max, 2 );
+      if ( FT_RENEW_ARRAY( base->subglyphs, old_max, new_max ) )
+        goto Exit;
+
+      loader->max_subglyphs = new_max;
+
+      FT_GlyphLoader_Adjust_Subglyphs( loader );
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* prepare loader for the addition of a new glyph on top of the base one */
+  FT_BASE_DEF( void )
+  FT_GlyphLoader_Prepare( FT_GlyphLoader  loader )
+  {
+    FT_GlyphLoad  current = &loader->current;
+
+
+    current->outline.n_points   = 0;
+    current->outline.n_contours = 0;
+    current->num_subglyphs      = 0;
+
+    FT_GlyphLoader_Adjust_Points   ( loader );
+    FT_GlyphLoader_Adjust_Subglyphs( loader );
+  }
+
+
+  /* add current glyph to the base image - and prepare for another */
+  FT_BASE_DEF( void )
+  FT_GlyphLoader_Add( FT_GlyphLoader  loader )
+  {
+    FT_GlyphLoad  base;
+    FT_GlyphLoad  current;
+
+    FT_UInt       n_curr_contours;
+    FT_UInt       n_base_points;
+    FT_UInt       n;
+
+
+    if ( !loader )
+      return;
+
+    base    = &loader->base;
+    current = &loader->current;
+
+    n_curr_contours = current->outline.n_contours;
+    n_base_points   = base->outline.n_points;
+
+    base->outline.n_points =
+      (short)( base->outline.n_points + current->outline.n_points );
+    base->outline.n_contours =
+      (short)( base->outline.n_contours + current->outline.n_contours );
+
+    base->num_subglyphs += current->num_subglyphs;
+
+    /* adjust contours count in newest outline */
+    for ( n = 0; n < n_curr_contours; n++ )
+      current->outline.contours[n] =
+        (short)( current->outline.contours[n] + n_base_points );
+
+    /* prepare for another new glyph image */
+    FT_GlyphLoader_Prepare( loader );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_GlyphLoader_CopyPoints( FT_GlyphLoader  target,
+                             FT_GlyphLoader  source )
+  {
+    FT_Error  error;
+    FT_UInt   num_points   = source->base.outline.n_points;
+    FT_UInt   num_contours = source->base.outline.n_contours;
+
+
+    error = FT_GlyphLoader_CheckPoints( target, num_points, num_contours );
+    if ( !error )
+    {
+      FT_Outline*  out = &target->base.outline;
+      FT_Outline*  in  = &source->base.outline;
+
+
+      FT_ARRAY_COPY( out->points, in->points,
+                     num_points );
+      FT_ARRAY_COPY( out->tags, in->tags,
+                     num_points );
+      FT_ARRAY_COPY( out->contours, in->contours,
+                     num_contours );
+
+      /* do we need to copy the extra points? */
+      if ( target->use_extra && source->use_extra )
+      {
+        FT_ARRAY_COPY( target->base.extra_points, source->base.extra_points,
+                       num_points );
+        FT_ARRAY_COPY( target->base.extra_points2, source->base.extra_points2,
+                       num_points );
+      }
+
+      out->n_points   = (short)num_points;
+      out->n_contours = (short)num_contours;
+
+      FT_GlyphLoader_Adjust_Points( target );
+    }
+
+    return error;
+  }
+
+
+/* END */
diff --git a/src/base/ftglyph.c b/src/base/ftglyph.c
new file mode 100644 (file)
index 0000000..591b57a
--- /dev/null
@@ -0,0 +1,627 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftglyph.c                                                              */
+/*                                                                         */
+/*    FreeType convenience functions to handle glyphs (body).              */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2007, 2008, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  This file contains the definition of several convenience functions   */
+  /*  that can be used by client applications to easily retrieve glyph     */
+  /*  bitmaps and outlines from a given face.                              */
+  /*                                                                       */
+  /*  These functions should be optional if you are writing a font server  */
+  /*  or text layout engine on top of FreeType.  However, they are pretty  */
+  /*  handy for many other simple uses of the library.                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_GLYPH_H
+#include FT_OUTLINE_H
+#include FT_BITMAP_H
+#include FT_INTERNAL_OBJECTS_H
+
+#include "basepic.h"
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_glyph
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****   FT_BitmapGlyph support                                        ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_CALLBACK_DEF( FT_Error )
+  ft_bitmap_glyph_init( FT_Glyph      bitmap_glyph,
+                        FT_GlyphSlot  slot )
+  {
+    FT_BitmapGlyph  glyph   = (FT_BitmapGlyph)bitmap_glyph;
+    FT_Error        error   = FT_Err_Ok;
+    FT_Library      library = FT_GLYPH( glyph )->library;
+
+
+    if ( slot->format != FT_GLYPH_FORMAT_BITMAP )
+    {
+      error = FT_Err_Invalid_Glyph_Format;
+      goto Exit;
+    }
+
+    glyph->left = slot->bitmap_left;
+    glyph->top  = slot->bitmap_top;
+
+    /* do lazy copying whenever possible */
+    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+    {
+      glyph->bitmap = slot->bitmap;
+      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+    }
+    else
+    {
+      FT_Bitmap_New( &glyph->bitmap );
+      error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap );
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  ft_bitmap_glyph_copy( FT_Glyph  bitmap_source,
+                        FT_Glyph  bitmap_target )
+  {
+    FT_Library      library = bitmap_source->library;
+    FT_BitmapGlyph  source  = (FT_BitmapGlyph)bitmap_source;
+    FT_BitmapGlyph  target  = (FT_BitmapGlyph)bitmap_target;
+
+
+    target->left = source->left;
+    target->top  = source->top;
+
+    return FT_Bitmap_Copy( library, &source->bitmap, &target->bitmap );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  ft_bitmap_glyph_done( FT_Glyph  bitmap_glyph )
+  {
+    FT_BitmapGlyph  glyph   = (FT_BitmapGlyph)bitmap_glyph;
+    FT_Library      library = FT_GLYPH( glyph )->library;
+
+
+    FT_Bitmap_Done( library, &glyph->bitmap );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  ft_bitmap_glyph_bbox( FT_Glyph  bitmap_glyph,
+                        FT_BBox*  cbox )
+  {
+    FT_BitmapGlyph  glyph = (FT_BitmapGlyph)bitmap_glyph;
+
+
+    cbox->xMin = glyph->left << 6;
+    cbox->xMax = cbox->xMin + ( glyph->bitmap.width << 6 );
+    cbox->yMax = glyph->top << 6;
+    cbox->yMin = cbox->yMax - ( glyph->bitmap.rows << 6 );
+  }
+
+
+  FT_DEFINE_GLYPH(ft_bitmap_glyph_class,
+    sizeof ( FT_BitmapGlyphRec ),
+    FT_GLYPH_FORMAT_BITMAP,
+
+    ft_bitmap_glyph_init,
+    ft_bitmap_glyph_done,
+    ft_bitmap_glyph_copy,
+    0,                          /* FT_Glyph_TransformFunc */
+    ft_bitmap_glyph_bbox,
+    0                           /* FT_Glyph_PrepareFunc   */
+  )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****   FT_OutlineGlyph support                                       ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  ft_outline_glyph_init( FT_Glyph      outline_glyph,
+                         FT_GlyphSlot  slot )
+  {
+    FT_OutlineGlyph  glyph   = (FT_OutlineGlyph)outline_glyph;
+    FT_Error         error   = FT_Err_Ok;
+    FT_Library       library = FT_GLYPH( glyph )->library;
+    FT_Outline*      source  = &slot->outline;
+    FT_Outline*      target  = &glyph->outline;
+
+
+    /* check format in glyph slot */
+    if ( slot->format != FT_GLYPH_FORMAT_OUTLINE )
+    {
+      error = FT_Err_Invalid_Glyph_Format;
+      goto Exit;
+    }
+
+    /* allocate new outline */
+    error = FT_Outline_New( library, source->n_points, source->n_contours,
+                            &glyph->outline );
+    if ( error )
+      goto Exit;
+
+    FT_Outline_Copy( source, target );
+
+  Exit:
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  ft_outline_glyph_done( FT_Glyph  outline_glyph )
+  {
+    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;
+
+
+    FT_Outline_Done( FT_GLYPH( glyph )->library, &glyph->outline );
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  ft_outline_glyph_copy( FT_Glyph  outline_source,
+                         FT_Glyph  outline_target )
+  {
+    FT_OutlineGlyph  source  = (FT_OutlineGlyph)outline_source;
+    FT_OutlineGlyph  target  = (FT_OutlineGlyph)outline_target;
+    FT_Error         error;
+    FT_Library       library = FT_GLYPH( source )->library;
+
+
+    error = FT_Outline_New( library, source->outline.n_points,
+                            source->outline.n_contours, &target->outline );
+    if ( !error )
+      FT_Outline_Copy( &source->outline, &target->outline );
+
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  ft_outline_glyph_transform( FT_Glyph          outline_glyph,
+                              const FT_Matrix*  matrix,
+                              const FT_Vector*  delta )
+  {
+    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;
+
+
+    if ( matrix )
+      FT_Outline_Transform( &glyph->outline, matrix );
+
+    if ( delta )
+      FT_Outline_Translate( &glyph->outline, delta->x, delta->y );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  ft_outline_glyph_bbox( FT_Glyph  outline_glyph,
+                         FT_BBox*  bbox )
+  {
+    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;
+
+
+    FT_Outline_Get_CBox( &glyph->outline, bbox );
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  ft_outline_glyph_prepare( FT_Glyph      outline_glyph,
+                            FT_GlyphSlot  slot )
+  {
+    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;
+
+
+    slot->format         = FT_GLYPH_FORMAT_OUTLINE;
+    slot->outline        = glyph->outline;
+    slot->outline.flags &= ~FT_OUTLINE_OWNER;
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_DEFINE_GLYPH( ft_outline_glyph_class,
+    sizeof ( FT_OutlineGlyphRec ),
+    FT_GLYPH_FORMAT_OUTLINE,
+
+    ft_outline_glyph_init,
+    ft_outline_glyph_done,
+    ft_outline_glyph_copy,
+    ft_outline_glyph_transform,
+    ft_outline_glyph_bbox,
+    ft_outline_glyph_prepare
+  )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****   FT_Glyph class and API                                        ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+   static FT_Error
+   ft_new_glyph( FT_Library             library,
+                 const FT_Glyph_Class*  clazz,
+                 FT_Glyph*              aglyph )
+   {
+     FT_Memory  memory = library->memory;
+     FT_Error   error;
+     FT_Glyph   glyph  = NULL;
+
+
+     *aglyph = 0;
+
+     if ( !FT_ALLOC( glyph, clazz->glyph_size ) )
+     {
+       glyph->library = library;
+       glyph->clazz   = clazz;
+       glyph->format  = clazz->glyph_format;
+
+       *aglyph = glyph;
+     }
+
+     return error;
+   }
+
+
+  /* documentation is in ftglyph.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Glyph_Copy( FT_Glyph   source,
+                 FT_Glyph  *target )
+  {
+    FT_Glyph               copy;
+    FT_Error               error;
+    const FT_Glyph_Class*  clazz;
+
+
+    /* check arguments */
+    if ( !target )
+    {
+      error = FT_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    *target = 0;
+
+    if ( !source || !source->clazz )
+    {
+      error = FT_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    clazz = source->clazz;
+    error = ft_new_glyph( source->library, clazz, &copy );
+    if ( error )
+      goto Exit;
+
+    copy->advance = source->advance;
+    copy->format  = source->format;
+
+    if ( clazz->glyph_copy )
+      error = clazz->glyph_copy( source, copy );
+
+    if ( error )
+      FT_Done_Glyph( copy );
+    else
+      *target = copy;
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftglyph.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Glyph( FT_GlyphSlot  slot,
+                FT_Glyph     *aglyph )
+  {
+    FT_Library  library;
+    FT_Error    error;
+    FT_Glyph    glyph;
+
+    const FT_Glyph_Class*  clazz = 0;
+
+
+    if ( !slot )
+      return FT_Err_Invalid_Slot_Handle;
+
+    library = slot->library;
+
+    if ( !aglyph )
+      return FT_Err_Invalid_Argument;
+
+    /* if it is a bitmap, that's easy :-) */
+    if ( slot->format == FT_GLYPH_FORMAT_BITMAP )
+      clazz = FT_BITMAP_GLYPH_CLASS_GET;
+
+    /* if it is an outline */
+    else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+      clazz = FT_OUTLINE_GLYPH_CLASS_GET;
+
+    else
+    {
+      /* try to find a renderer that supports the glyph image format */
+      FT_Renderer  render = FT_Lookup_Renderer( library, slot->format, 0 );
+
+
+      if ( render )
+        clazz = &render->glyph_class;
+    }
+
+    if ( !clazz )
+    {
+      error = FT_Err_Invalid_Glyph_Format;
+      goto Exit;
+    }
+
+    /* create FT_Glyph object */
+    error = ft_new_glyph( library, clazz, &glyph );
+    if ( error )
+      goto Exit;
+
+    /* copy advance while converting it to 16.16 format */
+    glyph->advance.x = slot->advance.x << 10;
+    glyph->advance.y = slot->advance.y << 10;
+
+    /* now import the image from the glyph slot */
+    error = clazz->glyph_init( glyph, slot );
+
+    /* if an error occurred, destroy the glyph */
+    if ( error )
+      FT_Done_Glyph( glyph );
+    else
+      *aglyph = glyph;
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftglyph.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Glyph_Transform( FT_Glyph    glyph,
+                      FT_Matrix*  matrix,
+                      FT_Vector*  delta )
+  {
+    const FT_Glyph_Class*  clazz;
+    FT_Error               error = FT_Err_Ok;
+
+
+    if ( !glyph || !glyph->clazz )
+      error = FT_Err_Invalid_Argument;
+    else
+    {
+      clazz = glyph->clazz;
+      if ( clazz->glyph_transform )
+      {
+        /* transform glyph image */
+        clazz->glyph_transform( glyph, matrix, delta );
+
+        /* transform advance vector */
+        if ( matrix )
+          FT_Vector_Transform( &glyph->advance, matrix );
+      }
+      else
+        error = FT_Err_Invalid_Glyph_Format;
+    }
+    return error;
+  }
+
+
+  /* documentation is in ftglyph.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Glyph_Get_CBox( FT_Glyph  glyph,
+                     FT_UInt   bbox_mode,
+                     FT_BBox  *acbox )
+  {
+    const FT_Glyph_Class*  clazz;
+
+
+    if ( !acbox )
+      return;
+
+    acbox->xMin = acbox->yMin = acbox->xMax = acbox->yMax = 0;
+
+    if ( !glyph || !glyph->clazz )
+      return;
+    else
+    {
+      clazz = glyph->clazz;
+      if ( !clazz->glyph_bbox )
+        return;
+      else
+      {
+        /* retrieve bbox in 26.6 coordinates */
+        clazz->glyph_bbox( glyph, acbox );
+
+        /* perform grid fitting if needed */
+        if ( bbox_mode == FT_GLYPH_BBOX_GRIDFIT ||
+             bbox_mode == FT_GLYPH_BBOX_PIXELS  )
+        {
+          acbox->xMin = FT_PIX_FLOOR( acbox->xMin );
+          acbox->yMin = FT_PIX_FLOOR( acbox->yMin );
+          acbox->xMax = FT_PIX_CEIL( acbox->xMax );
+          acbox->yMax = FT_PIX_CEIL( acbox->yMax );
+        }
+
+        /* convert to integer pixels if needed */
+        if ( bbox_mode == FT_GLYPH_BBOX_TRUNCATE ||
+             bbox_mode == FT_GLYPH_BBOX_PIXELS   )
+        {
+          acbox->xMin >>= 6;
+          acbox->yMin >>= 6;
+          acbox->xMax >>= 6;
+          acbox->yMax >>= 6;
+        }
+      }
+    }
+    return;
+  }
+
+
+  /* documentation is in ftglyph.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Glyph_To_Bitmap( FT_Glyph*       the_glyph,
+                      FT_Render_Mode  render_mode,
+                      FT_Vector*      origin,
+                      FT_Bool         destroy )
+  {
+    FT_GlyphSlotRec           dummy;
+    FT_GlyphSlot_InternalRec  dummy_internal;
+    FT_Error                  error = FT_Err_Ok;
+    FT_Glyph                  glyph;
+    FT_BitmapGlyph            bitmap = NULL;
+    const FT_Glyph_Class*     clazz;
+
+    /* FT_BITMAP_GLYPH_CLASS_GET derefers `library' in PIC mode */
+    FT_Library                library;
+
+
+    /* check argument */
+    if ( !the_glyph )
+      goto Bad;
+    glyph = *the_glyph;
+    if ( !glyph )
+      goto Bad;
+
+    clazz   = glyph->clazz;
+    library = glyph->library;
+    if ( !library || !clazz )
+      goto Bad;
+
+    /* when called with a bitmap glyph, do nothing and return successfully */
+    if ( clazz == FT_BITMAP_GLYPH_CLASS_GET )
+      goto Exit;
+
+    if ( !clazz->glyph_prepare )
+      goto Bad;
+
+    /* we render the glyph into a glyph bitmap using a `dummy' glyph slot */
+    /* then calling FT_Render_Glyph_Internal()                            */
+
+    FT_MEM_ZERO( &dummy, sizeof ( dummy ) );
+    FT_MEM_ZERO( &dummy_internal, sizeof ( dummy_internal ) );
+    dummy.internal = &dummy_internal;
+    dummy.library  = library;
+    dummy.format   = clazz->glyph_format;
+
+    /* create result bitmap glyph */
+    error = ft_new_glyph( library, FT_BITMAP_GLYPH_CLASS_GET,
+                          (FT_Glyph*)(void*)&bitmap );
+    if ( error )
+      goto Exit;
+
+#if 1
+    /* if `origin' is set, translate the glyph image */
+    if ( origin )
+      FT_Glyph_Transform( glyph, 0, origin );
+#else
+    FT_UNUSED( origin );
+#endif
+
+    /* prepare dummy slot for rendering */
+    error = clazz->glyph_prepare( glyph, &dummy );
+    if ( !error )
+      error = FT_Render_Glyph_Internal( glyph->library, &dummy, render_mode );
+
+#if 1
+    if ( !destroy && origin )
+    {
+      FT_Vector  v;
+
+
+      v.x = -origin->x;
+      v.y = -origin->y;
+      FT_Glyph_Transform( glyph, 0, &v );
+    }
+#endif
+
+    if ( error )
+      goto Exit;
+
+    /* in case of success, copy the bitmap to the glyph bitmap */
+    error = ft_bitmap_glyph_init( (FT_Glyph)bitmap, &dummy );
+    if ( error )
+      goto Exit;
+
+    /* copy advance */
+    bitmap->root.advance = glyph->advance;
+
+    if ( destroy )
+      FT_Done_Glyph( glyph );
+
+    *the_glyph = FT_GLYPH( bitmap );
+
+  Exit:
+    if ( error && bitmap )
+      FT_Done_Glyph( FT_GLYPH( bitmap ) );
+
+    return error;
+
+  Bad:
+    error = FT_Err_Invalid_Argument;
+    goto Exit;
+  }
+
+
+  /* documentation is in ftglyph.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Done_Glyph( FT_Glyph  glyph )
+  {
+    if ( glyph )
+    {
+      FT_Memory              memory = glyph->library->memory;
+      const FT_Glyph_Class*  clazz  = glyph->clazz;
+
+
+      if ( clazz->glyph_done )
+        clazz->glyph_done( glyph );
+
+      FT_FREE( glyph );
+    }
+  }
+
+
+/* END */
diff --git a/src/base/ftgxval.c b/src/base/ftgxval.c
new file mode 100644 (file)
index 0000000..aeeb8ce
--- /dev/null
@@ -0,0 +1,140 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgxval.c                                                              */
+/*                                                                         */
+/*    FreeType API for validating TrueTyepGX/AAT tables (body).            */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2006, 2010 by                                    */
+/*  Masatake YAMATO, Redhat K.K,                                           */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_SERVICE_GX_VALIDATE_H
+
+
+  /* documentation is in ftgxval.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_TrueTypeGX_Validate( FT_Face   face,
+                          FT_UInt   validation_flags,
+                          FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],
+                          FT_UInt   table_length )
+  {
+    FT_Service_GXvalidate  service;
+    FT_Error               error;
+
+
+    if ( !face )
+    {
+      error = FT_Err_Invalid_Face_Handle;
+      goto Exit;
+    }
+
+    if ( tables == NULL )
+    {
+      error = FT_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, service, GX_VALIDATE );
+
+    if ( service )
+      error = service->validate( face,
+                                 validation_flags,
+                                 tables,
+                                 table_length );
+    else
+      error = FT_Err_Unimplemented_Feature;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_EXPORT_DEF( void )
+  FT_TrueTypeGX_Free( FT_Face   face,
+                      FT_Bytes  table )
+  {
+    FT_Memory  memory;
+
+
+    if ( !face )
+      return;
+
+    memory = FT_FACE_MEMORY( face );
+
+    FT_FREE( table );
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_ClassicKern_Validate( FT_Face    face,
+                           FT_UInt    validation_flags,
+                           FT_Bytes  *ckern_table )
+  {
+    FT_Service_CKERNvalidate  service;
+    FT_Error                  error;
+
+
+    if ( !face )
+    {
+      error = FT_Err_Invalid_Face_Handle;
+      goto Exit;
+    }
+
+    if ( ckern_table == NULL )
+    {
+      error = FT_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, service, CLASSICKERN_VALIDATE );
+
+    if ( service )
+      error = service->validate( face,
+                                 validation_flags,
+                                 ckern_table );
+    else
+      error = FT_Err_Unimplemented_Feature;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_EXPORT_DEF( void )
+  FT_ClassicKern_Free( FT_Face   face,
+                       FT_Bytes  table )
+  {
+    FT_Memory  memory;
+
+
+    if ( !face )
+      return;
+
+    memory = FT_FACE_MEMORY( face );
+
+
+    FT_FREE( table );
+  }
+
+
+/* END */
diff --git a/src/base/ftinit.c b/src/base/ftinit.c
new file mode 100644 (file)
index 0000000..91f8e2a
--- /dev/null
@@ -0,0 +1,282 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftinit.c                                                               */
+/*                                                                         */
+/*    FreeType initialization layer (body).                                */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2005, 2007, 2009, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  The purpose of this file is to implement the following two           */
+  /*  functions:                                                           */
+  /*                                                                       */
+  /*  FT_Add_Default_Modules():                                            */
+  /*     This function is used to add the set of default modules to a      */
+  /*     fresh new library object.  The set is taken from the header file  */
+  /*     `freetype/config/ftmodule.h'.  See the document `FreeType 2.0     */
+  /*     Build System' for more information.                               */
+  /*                                                                       */
+  /*  FT_Init_FreeType():                                                  */
+  /*     This function creates a system object for the current platform,   */
+  /*     builds a library out of it, then calls FT_Default_Drivers().      */
+  /*                                                                       */
+  /*  Note that even if FT_Init_FreeType() uses the implementation of the  */
+  /*  system object defined at build time, client applications are still   */
+  /*  able to provide their own `ftsystem.c'.                              */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_CONFIG_CONFIG_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_MODULE_H
+#include "basepic.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_init
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+
+#undef  FT_USE_MODULE
+#ifdef __cplusplus
+#define FT_USE_MODULE( type, x )  extern "C" const type  x;
+#else
+#define FT_USE_MODULE( type, x )  extern const type  x;
+#endif
+
+#include FT_CONFIG_MODULES_H
+
+#undef  FT_USE_MODULE
+#define FT_USE_MODULE( type, x )  (const FT_Module_Class*)&(x),
+
+  static
+  const FT_Module_Class*  const ft_default_modules[] =
+  {
+#include FT_CONFIG_MODULES_H
+    0
+  };
+
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+
+#ifdef __cplusplus
+#define FT_EXTERNC  extern "C"
+#else
+#define FT_EXTERNC  extern
+#endif
+
+  /* declare the module's class creation/destruction functions */
+#undef  FT_USE_MODULE
+#define FT_USE_MODULE( type, x )                            \
+  FT_EXTERNC FT_Error                                       \
+  FT_Create_Class_ ## x( FT_Library         library,        \
+                         FT_Module_Class*  *output_class ); \
+  FT_EXTERNC void                                           \
+  FT_Destroy_Class_ ## x( FT_Library        library,        \
+                          FT_Module_Class*  clazz );
+
+#include FT_CONFIG_MODULES_H
+
+  /* count all module classes */
+#undef  FT_USE_MODULE
+#define FT_USE_MODULE( type, x )  MODULE_CLASS_ ## x,
+
+  enum
+  {
+#include FT_CONFIG_MODULES_H
+    FT_NUM_MODULE_CLASSES
+  };
+
+  /* destroy all module classes */
+#undef  FT_USE_MODULE
+#define FT_USE_MODULE( type, x )                   \
+  if ( classes[i] )                                \
+  {                                                \
+    FT_Destroy_Class_ ## x( library, classes[i] ); \
+  }                                                \
+  i++;
+
+
+  FT_BASE_DEF( void )
+  ft_destroy_default_module_classes( FT_Library  library )
+  {
+    FT_Module_Class*  *classes;
+    FT_Memory          memory;
+    FT_UInt            i;
+    BasePIC*           pic_container = (BasePIC*)library->pic_container.base;
+
+
+    if ( !pic_container->default_module_classes )
+      return;
+
+    memory  = library->memory;
+    classes = pic_container->default_module_classes;
+    i       = 0;
+
+#include FT_CONFIG_MODULES_H
+
+    FT_FREE( classes );
+    pic_container->default_module_classes = 0;
+  }
+
+
+  /* initialize all module classes and the pointer table */
+#undef  FT_USE_MODULE
+#define FT_USE_MODULE( type, x )                     \
+  error = FT_Create_Class_ ## x( library, &clazz );  \
+  if ( error )                                       \
+    goto Exit;                                       \
+  classes[i++] = clazz;
+
+
+  FT_BASE_DEF( FT_Error )
+  ft_create_default_module_classes( FT_Library  library )
+  {
+    FT_Error           error;
+    FT_Memory          memory;
+    FT_Module_Class*  *classes;
+    FT_Module_Class*   clazz;
+    FT_UInt            i;
+    BasePIC*           pic_container = (BasePIC*)library->pic_container.base;
+
+
+    memory = library->memory;
+
+    pic_container->default_module_classes = 0;
+
+    if ( FT_ALLOC( classes, sizeof ( FT_Module_Class* ) * 
+                              ( FT_NUM_MODULE_CLASSES + 1 ) ) )
+      return error;
+
+    /* initialize all pointers to 0, especially the last one */
+    for ( i = 0; i < FT_NUM_MODULE_CLASSES; i++ )
+      classes[i] = 0;
+    classes[FT_NUM_MODULE_CLASSES] = 0;
+
+    i = 0;
+
+#include FT_CONFIG_MODULES_H
+
+  Exit:
+    if ( error )
+      ft_destroy_default_module_classes( library );
+    else
+      pic_container->default_module_classes = classes;
+
+    return error;
+  }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Add_Default_Modules( FT_Library  library )
+  {
+    FT_Error                       error;
+    const FT_Module_Class* const*  cur;
+
+
+    /* FT_DEFAULT_MODULES_GET dereferences `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+    if ( !library )
+      return;
+#endif
+
+    /* GCC 4.6 warns the type difference:
+     *   FT_Module_Class** != const FT_Module_Class* const*
+     */
+    cur = (const FT_Module_Class* const*)FT_DEFAULT_MODULES_GET;
+
+    /* test for valid `library' delayed to FT_Add_Module() */
+    while ( *cur )
+    {
+      error = FT_Add_Module( library, *cur );
+      /* notify errors, but don't stop */
+      if ( error )
+        FT_TRACE0(( "FT_Add_Default_Module:"
+                    " Cannot install `%s', error = 0x%x\n",
+                    (*cur)->module_name, error ));
+      cur++;
+    }
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Init_FreeType( FT_Library  *alibrary )
+  {
+    FT_Error   error;
+    FT_Memory  memory;
+
+
+    /* First of all, allocate a new system object -- this function is part */
+    /* of the system-specific component, i.e. `ftsystem.c'.                */
+
+    memory = FT_New_Memory();
+    if ( !memory )
+    {
+      FT_ERROR(( "FT_Init_FreeType: cannot find memory manager\n" ));
+      return FT_Err_Unimplemented_Feature;
+    }
+
+    /* build a library out of it, then fill it with the set of */
+    /* default drivers.                                        */
+
+    error = FT_New_Library( memory, alibrary );
+    if ( error )
+      FT_Done_Memory( memory );
+    else
+      FT_Add_Default_Modules( *alibrary );
+
+    return error;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Done_FreeType( FT_Library  library )
+  {
+    if ( library )
+    {
+      FT_Memory  memory = library->memory;
+
+
+      /* Discard the library object */
+      FT_Done_Library( library );
+
+      /* discard memory manager */
+      FT_Done_Memory( memory );
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+/* END */
diff --git a/src/base/ftlcdfil.c b/src/base/ftlcdfil.c
new file mode 100644 (file)
index 0000000..0da4ba1
--- /dev/null
@@ -0,0 +1,376 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftlcdfil.c                                                             */
+/*                                                                         */
+/*    FreeType API for color filtering of subpixel bitmap glyphs (body).   */
+/*                                                                         */
+/*  Copyright 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_LCD_FILTER_H
+#include FT_IMAGE_H
+#include FT_INTERNAL_OBJECTS_H
+
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+/* define USE_LEGACY to implement the legacy filter */
+#define  USE_LEGACY
+
+  /* FIR filter used by the default and light filters */
+  static void
+  _ft_lcd_filter_fir( FT_Bitmap*      bitmap,
+                      FT_Render_Mode  mode,
+                      FT_Library      library )
+  {
+    FT_Byte*  weights = library->lcd_weights;
+    FT_UInt   width   = (FT_UInt)bitmap->width;
+    FT_UInt   height  = (FT_UInt)bitmap->rows;
+
+
+    /* horizontal in-place FIR filter */
+    if ( mode == FT_RENDER_MODE_LCD && width >= 4 )
+    {
+      FT_Byte*  line = bitmap->buffer;
+
+
+      for ( ; height > 0; height--, line += bitmap->pitch )
+      {
+        FT_UInt  fir[5];
+        FT_UInt  val1, xx;
+
+
+        val1   = line[0];
+        fir[0] = weights[2] * val1;
+        fir[1] = weights[3] * val1;
+        fir[2] = weights[4] * val1;
+        fir[3] = 0;
+        fir[4] = 0;
+
+        val1    = line[1];
+        fir[0] += weights[1] * val1;
+        fir[1] += weights[2] * val1;
+        fir[2] += weights[3] * val1;
+        fir[3] += weights[4] * val1;
+
+        for ( xx = 2; xx < width; xx++ )
+        {
+          FT_UInt  val, pix;
+
+
+          val    = line[xx];
+          pix    = fir[0] + weights[0] * val;
+          fir[0] = fir[1] + weights[1] * val;
+          fir[1] = fir[2] + weights[2] * val;
+          fir[2] = fir[3] + weights[3] * val;
+          fir[3] =          weights[4] * val;
+
+          pix        >>= 8;
+          pix         |= -( pix >> 8 );
+          line[xx - 2] = (FT_Byte)pix;
+        }
+
+        {
+          FT_UInt  pix;
+
+
+          pix          = fir[0] >> 8;
+          pix         |= -( pix >> 8 );
+          line[xx - 2] = (FT_Byte)pix;
+
+          pix          = fir[1] >> 8;
+          pix         |= -( pix >> 8 );
+          line[xx - 1] = (FT_Byte)pix;
+        }
+      }
+    }
+
+    /* vertical in-place FIR filter */
+    else if ( mode == FT_RENDER_MODE_LCD_V && height >= 4 )
+    {
+      FT_Byte*  column = bitmap->buffer;
+      FT_Int    pitch  = bitmap->pitch;
+
+
+      for ( ; width > 0; width--, column++ )
+      {
+        FT_Byte*  col = column;
+        FT_UInt   fir[5];
+        FT_UInt   val1, yy;
+
+
+        val1   = col[0];
+        fir[0] = weights[2] * val1;
+        fir[1] = weights[3] * val1;
+        fir[2] = weights[4] * val1;
+        fir[3] = 0;
+        fir[4] = 0;
+        col   += pitch;
+
+        val1    = col[0];
+        fir[0] += weights[1] * val1;
+        fir[1] += weights[2] * val1;
+        fir[2] += weights[3] * val1;
+        fir[3] += weights[4] * val1;
+        col    += pitch;
+
+        for ( yy = 2; yy < height; yy++ )
+        {
+          FT_UInt  val, pix;
+
+
+          val    = col[0];
+          pix    = fir[0] + weights[0] * val;
+          fir[0] = fir[1] + weights[1] * val;
+          fir[1] = fir[2] + weights[2] * val;
+          fir[2] = fir[3] + weights[3] * val;
+          fir[3] =          weights[4] * val;
+
+          pix           >>= 8;
+          pix            |= -( pix >> 8 );
+          col[-2 * pitch] = (FT_Byte)pix;
+          col            += pitch;
+        }
+
+        {
+          FT_UInt  pix;
+
+
+          pix             = fir[0] >> 8;
+          pix            |= -( pix >> 8 );
+          col[-2 * pitch] = (FT_Byte)pix;
+
+          pix         = fir[1] >> 8;
+          pix        |= -( pix >> 8 );
+          col[-pitch] = (FT_Byte)pix;
+        }
+      }
+    }
+  }
+
+
+#ifdef USE_LEGACY
+
+  /* intra-pixel filter used by the legacy filter */
+  static void
+  _ft_lcd_filter_legacy( FT_Bitmap*      bitmap,
+                         FT_Render_Mode  mode,
+                         FT_Library      library )
+  {
+    FT_UInt  width  = (FT_UInt)bitmap->width;
+    FT_UInt  height = (FT_UInt)bitmap->rows;
+    FT_Int   pitch  = bitmap->pitch;
+
+    static const int  filters[3][3] =
+    {
+      { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 },
+      { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 },
+      { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 }
+    };
+
+    FT_UNUSED( library );
+
+
+    /* horizontal in-place intra-pixel filter */
+    if ( mode == FT_RENDER_MODE_LCD && width >= 3 )
+    {
+      FT_Byte*  line = bitmap->buffer;
+
+
+      for ( ; height > 0; height--, line += pitch )
+      {
+        FT_UInt  xx;
+
+
+        for ( xx = 0; xx < width; xx += 3 )
+        {
+          FT_UInt  r = 0;
+          FT_UInt  g = 0;
+          FT_UInt  b = 0;
+          FT_UInt  p;
+
+
+          p  = line[xx];
+          r += filters[0][0] * p;
+          g += filters[0][1] * p;
+          b += filters[0][2] * p;
+
+          p  = line[xx + 1];
+          r += filters[1][0] * p;
+          g += filters[1][1] * p;
+          b += filters[1][2] * p;
+
+          p  = line[xx + 2];
+          r += filters[2][0] * p;
+          g += filters[2][1] * p;
+          b += filters[2][2] * p;
+
+          line[xx]     = (FT_Byte)( r / 65536 );
+          line[xx + 1] = (FT_Byte)( g / 65536 );
+          line[xx + 2] = (FT_Byte)( b / 65536 );
+        }
+      }
+    }
+    else if ( mode == FT_RENDER_MODE_LCD_V && height >= 3 )
+    {
+      FT_Byte*  column = bitmap->buffer;
+
+
+      for ( ; width > 0; width--, column++ )
+      {
+        FT_Byte*  col     = column;
+        FT_Byte*  col_end = col + height * pitch;
+
+
+        for ( ; col < col_end; col += 3 * pitch )
+        {
+          FT_UInt  r = 0;
+          FT_UInt  g = 0;
+          FT_UInt  b = 0;
+          FT_UInt  p;
+
+
+          p  = col[0];
+          r += filters[0][0] * p;
+          g += filters[0][1] * p;
+          b += filters[0][2] * p;
+
+          p  = col[pitch];
+          r += filters[1][0] * p;
+          g += filters[1][1] * p;
+          b += filters[1][2] * p;
+
+          p  = col[pitch * 2];
+          r += filters[2][0] * p;
+          g += filters[2][1] * p;
+          b += filters[2][2] * p;
+
+          col[0]         = (FT_Byte)( r / 65536 );
+          col[pitch]     = (FT_Byte)( g / 65536 );
+          col[2 * pitch] = (FT_Byte)( b / 65536 );
+        }
+      }
+    }
+  }
+
+#endif /* USE_LEGACY */
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Library_SetLcdFilterWeights( FT_Library      library,
+                                  unsigned char  *weights )
+  {
+    if ( !library || !weights )
+      return FT_Err_Invalid_Argument;
+
+    ft_memcpy( library->lcd_weights, weights, 5 );
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Library_SetLcdFilter( FT_Library    library,
+                           FT_LcdFilter  filter )
+  {
+    static const FT_Byte  light_filter[5] =
+                            { 0x00, 0x55, 0x56, 0x55, 0x00 };
+    /* the values here sum up to a value larger than 256, */
+    /* providing a cheap gamma correction                 */
+    static const FT_Byte  default_filter[5] =
+                            { 0x10, 0x40, 0x70, 0x40, 0x10 };
+
+
+    if ( !library )
+      return FT_Err_Invalid_Argument;
+
+    switch ( filter )
+    {
+    case FT_LCD_FILTER_NONE:
+      library->lcd_filter_func = NULL;
+      library->lcd_extra       = 0;
+      break;
+
+    case FT_LCD_FILTER_DEFAULT:
+#if defined( FT_FORCE_LEGACY_LCD_FILTER )
+
+      library->lcd_filter_func = _ft_lcd_filter_legacy;
+      library->lcd_extra       = 0;
+
+#elif defined( FT_FORCE_LIGHT_LCD_FILTER )
+
+      ft_memcpy( library->lcd_weights, light_filter, 5 );
+      library->lcd_filter_func = _ft_lcd_filter_fir;
+      library->lcd_extra       = 2;
+
+#else
+
+      ft_memcpy( library->lcd_weights, default_filter, 5 );
+      library->lcd_filter_func = _ft_lcd_filter_fir;
+      library->lcd_extra       = 2;
+
+#endif
+
+      break;
+
+    case FT_LCD_FILTER_LIGHT:
+      ft_memcpy( library->lcd_weights, light_filter, 5 );
+      library->lcd_filter_func = _ft_lcd_filter_fir;
+      library->lcd_extra       = 2;
+      break;
+
+#ifdef USE_LEGACY
+
+    case FT_LCD_FILTER_LEGACY:
+      library->lcd_filter_func = _ft_lcd_filter_legacy;
+      library->lcd_extra       = 0;
+      break;
+
+#endif
+
+    default:
+      return FT_Err_Invalid_Argument;
+    }
+
+    library->lcd_filter = filter;
+
+    return FT_Err_Ok;
+  }
+
+#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Library_SetLcdFilterWeights( FT_Library      library,
+                                  unsigned char  *weights )
+  {
+    FT_UNUSED( library );
+    FT_UNUSED( weights );
+
+    return FT_Err_Unimplemented_Feature;
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Library_SetLcdFilter( FT_Library    library,
+                           FT_LcdFilter  filter )
+  {
+    FT_UNUSED( library );
+    FT_UNUSED( filter );
+
+    return FT_Err_Unimplemented_Feature;
+  }
+
+#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
+
+/* END */
diff --git a/src/base/ftmac.c b/src/base/ftmac.c
new file mode 100644 (file)
index 0000000..f200748
--- /dev/null
@@ -0,0 +1,1061 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmac.c                                                                */
+/*                                                                         */
+/*    Mac FOND support.  Written by just@letterror.com.                    */
+/*  Heavily modified by mpsuzuki, George Williams, and Sean McBride.       */
+/*                                                                         */
+/*  This file is for Mac OS X only; see builds/mac/ftoldmac.c for          */
+/*  classic platforms built by MPW.                                        */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,         */
+/*            2009 by                                                      */
+/*  Just van Rossum, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*
+    Notes
+
+    Mac suitcase files can (and often do!) contain multiple fonts.  To
+    support this I use the face_index argument of FT_(Open|New)_Face()
+    functions, and pretend the suitcase file is a collection.
+
+    Warning: fbit and NFNT bitmap resources are not supported yet.  In old
+    sfnt fonts, bitmap glyph data for each size is stored in each `NFNT'
+    resources instead of the `bdat' table in the sfnt resource.  Therefore,
+    face->num_fixed_sizes is set to 0, because bitmap data in `NFNT'
+    resource is unavailable at present.
+
+    The Mac FOND support works roughly like this:
+
+    - Check whether the offered stream points to a Mac suitcase file.  This
+      is done by checking the file type: it has to be 'FFIL' or 'tfil'.  The
+      stream that gets passed to our init_face() routine is a stdio stream,
+      which isn't usable for us, since the FOND resources live in the
+      resource fork.  So we just grab the stream->pathname field.
+
+    - Read the FOND resource into memory, then check whether there is a
+      TrueType font and/or(!) a Type 1 font available.
+
+    - If there is a Type 1 font available (as a separate `LWFN' file), read
+      its data into memory, massage it slightly so it becomes PFB data, wrap
+      it into a memory stream, load the Type 1 driver and delegate the rest
+      of the work to it by calling FT_Open_Face().  (XXX TODO: after this
+      has been done, the kerning data from the FOND resource should be
+      appended to the face: On the Mac there are usually no AFM files
+      available.  However, this is tricky since we need to map Mac char
+      codes to ps glyph names to glyph ID's...)
+
+    - If there is a TrueType font (an `sfnt' resource), read it into memory,
+      wrap it into a memory stream, load the TrueType driver and delegate
+      the rest of the work to it, by calling FT_Open_Face().
+
+    - Some suitcase fonts (notably Onyx) might point the `LWFN' file to
+      itself, even though it doesn't contains `POST' resources.  To handle
+      this special case without opening the file an extra time, we just
+      ignore errors from the `LWFN' and fallback to the `sfnt' if both are
+      available.
+  */
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_TRUETYPE_TAGS_H
+#include FT_INTERNAL_STREAM_H
+#include "ftbase.h"
+
+  /* This is for Mac OS X.  Without redefinition, OS_INLINE */
+  /* expands to `static inline' which doesn't survive the   */
+  /* -ansi compilation flag of GCC.                         */
+#if !HAVE_ANSI_OS_INLINE
+#undef  OS_INLINE
+#define OS_INLINE  static __inline__
+#endif
+
+  /* `configure' checks the availability of `ResourceIndex' strictly */
+  /* and sets HAVE_TYPE_RESOURCE_INDEX 1 or 0 always.  If it is      */
+  /* not set (e.g., a build without `configure'), the availability   */
+  /* is guessed from the SDK version.                                */
+#ifndef HAVE_TYPE_RESOURCE_INDEX
+#if !defined( MAC_OS_X_VERSION_10_5 ) || \
+    ( MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 )
+#define HAVE_TYPE_RESOURCE_INDEX 0
+#else
+#define HAVE_TYPE_RESOURCE_INDEX 1
+#endif
+#endif /* !HAVE_TYPE_RESOURCE_INDEX */
+
+#if ( HAVE_TYPE_RESOURCE_INDEX == 0 )
+  typedef short  ResourceIndex;
+#endif
+
+#include <CoreServices/CoreServices.h>
+#include <ApplicationServices/ApplicationServices.h>
+#include <sys/syslimits.h> /* PATH_MAX */
+
+  /* Don't want warnings about our own use of deprecated functions. */
+#define FT_DEPRECATED_ATTRIBUTE
+
+#include FT_MAC_H
+
+#ifndef kATSOptionFlagsUnRestrictedScope /* since Mac OS X 10.1 */
+#define kATSOptionFlagsUnRestrictedScope kATSOptionFlagsDefault
+#endif
+
+
+  /* Set PREFER_LWFN to 1 if LWFN (Type 1) is preferred over
+     TrueType in case *both* are available (this is not common,
+     but it *is* possible). */
+#ifndef PREFER_LWFN
+#define PREFER_LWFN  1
+#endif
+
+
+#ifdef FT_MACINTOSH
+
+  /* This function is deprecated because FSSpec is deprecated in Mac OS X  */
+  FT_EXPORT_DEF( FT_Error )
+  FT_GetFile_From_Mac_Name( const char*  fontName,
+                            FSSpec*      pathSpec,
+                            FT_Long*     face_index )
+  {
+    FT_UNUSED( fontName );
+    FT_UNUSED( pathSpec );
+    FT_UNUSED( face_index );
+
+    return FT_Err_Unimplemented_Feature;
+  }
+
+
+  /* Private function.                                         */
+  /* The FSSpec type has been discouraged for a long time,     */
+  /* unfortunately an FSRef replacement API for                */
+  /* ATSFontGetFileSpecification() is only available in        */
+  /* Mac OS X 10.5 and later.                                  */
+  static OSStatus
+  FT_ATSFontGetFileReference( ATSFontRef  ats_font_id,
+                              FSRef*      ats_font_ref )
+  {
+#if defined( MAC_OS_X_VERSION_10_5 ) && \
+    ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 )
+
+    OSStatus  err;
+
+    err = ATSFontGetFileReference( ats_font_id, ats_font_ref );
+
+    return err;
+#elif __LP64__ /* No 64bit Carbon API on legacy platforms */
+    FT_UNUSED( ats_font_id );
+    FT_UNUSED( ats_font_ref );
+
+
+    return fnfErr;
+#else /* 32bit Carbon API on legacy platforms */
+    OSStatus  err;
+    FSSpec    spec;
+
+
+    err = ATSFontGetFileSpecification( ats_font_id, &spec );
+    if ( noErr == err )
+      err = FSpMakeFSRef( &spec, ats_font_ref );
+
+    return err;
+#endif
+  }
+
+
+  static FT_Error
+  FT_GetFileRef_From_Mac_ATS_Name( const char*  fontName,
+                                   FSRef*       ats_font_ref,
+                                   FT_Long*     face_index )
+  {
+    CFStringRef  cf_fontName;
+    ATSFontRef   ats_font_id;
+
+
+    *face_index = 0;
+
+    cf_fontName = CFStringCreateWithCString( NULL, fontName,
+                                             kCFStringEncodingMacRoman );
+    ats_font_id = ATSFontFindFromName( cf_fontName,
+                                       kATSOptionFlagsUnRestrictedScope );
+    CFRelease( cf_fontName );
+
+    if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL )
+      return FT_Err_Unknown_File_Format;
+
+    if ( noErr != FT_ATSFontGetFileReference( ats_font_id, ats_font_ref ) )
+      return FT_Err_Unknown_File_Format;
+
+    /* face_index calculation by searching preceding fontIDs */
+    /* with same FSRef                                       */
+    {
+      ATSFontRef  id2 = ats_font_id - 1;
+      FSRef       ref2;
+
+
+      while ( id2 > 0 )
+      {
+        if ( noErr != FT_ATSFontGetFileReference( id2, &ref2 ) )
+          break;
+        if ( noErr != FSCompareFSRefs( ats_font_ref, &ref2 ) )
+          break;
+
+        id2 --;
+      }
+      *face_index = ats_font_id - ( id2 + 1 );
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_GetFilePath_From_Mac_ATS_Name( const char*  fontName,
+                                    UInt8*       path,
+                                    UInt32       maxPathSize,
+                                    FT_Long*     face_index )
+  {
+    FSRef     ref;
+    FT_Error  err;
+
+
+    err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index );
+    if ( FT_Err_Ok != err )
+      return err;
+
+    if ( noErr != FSRefMakePath( &ref, path, maxPathSize ) )
+      return FT_Err_Unknown_File_Format;
+
+    return FT_Err_Ok;
+  }
+
+
+  /* This function is deprecated because FSSpec is deprecated in Mac OS X  */
+  FT_EXPORT_DEF( FT_Error )
+  FT_GetFile_From_Mac_ATS_Name( const char*  fontName,
+                                FSSpec*      pathSpec,
+                                FT_Long*     face_index )
+  {
+#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \
+      ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) )
+    FT_UNUSED( fontName );
+    FT_UNUSED( pathSpec );
+    FT_UNUSED( face_index );
+
+    return FT_Err_Unimplemented_Feature;
+#else
+    FSRef     ref;
+    FT_Error  err;
+
+
+    err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index );
+    if ( FT_Err_Ok != err )
+      return err;
+
+    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, NULL, NULL,
+                                    pathSpec, NULL ) )
+      return FT_Err_Unknown_File_Format;
+
+    return FT_Err_Ok;
+#endif
+  }
+
+
+  static OSErr
+  FT_FSPathMakeRes( const UInt8*    pathname,
+                    ResFileRefNum*  res )
+  {
+    OSErr  err;
+    FSRef  ref;
+
+
+    if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) )
+      return FT_Err_Cannot_Open_Resource;
+
+    /* at present, no support for dfont format */
+    err = FSOpenResourceFile( &ref, 0, NULL, fsRdPerm, res );
+    if ( noErr == err )
+      return err;
+
+    /* fallback to original resource-fork font */
+    *res = FSOpenResFile( &ref, fsRdPerm );
+    err  = ResError();
+
+    return err;
+  }
+
+
+  /* Return the file type for given pathname */
+  static OSType
+  get_file_type_from_path( const UInt8*  pathname )
+  {
+    FSRef          ref;
+    FSCatalogInfo  info;
+
+
+    if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) )
+      return ( OSType ) 0;
+
+    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoFinderInfo, &info,
+                                    NULL, NULL, NULL ) )
+      return ( OSType ) 0;
+
+    return ((FInfo *)(info.finderInfo))->fdType;
+  }
+
+
+  /* Given a PostScript font name, create the Macintosh LWFN file name. */
+  static void
+  create_lwfn_name( char*   ps_name,
+                    Str255  lwfn_file_name )
+  {
+    int       max = 5, count = 0;
+    FT_Byte*  p = lwfn_file_name;
+    FT_Byte*  q = (FT_Byte*)ps_name;
+
+
+    lwfn_file_name[0] = 0;
+
+    while ( *q )
+    {
+      if ( ft_isupper( *q ) )
+      {
+        if ( count )
+          max = 3;
+        count = 0;
+      }
+      if ( count < max && ( ft_isalnum( *q ) || *q == '_' ) )
+      {
+        *++p = *q;
+        lwfn_file_name[0]++;
+        count++;
+      }
+      q++;
+    }
+  }
+
+
+  static short
+  count_faces_sfnt( char*  fond_data )
+  {
+    /* The count is 1 greater than the value in the FOND.  */
+    /* Isn't that cute? :-)                                */
+
+    return EndianS16_BtoN( *( (short*)( fond_data +
+                                        sizeof ( FamRec ) ) ) ) + 1;
+  }
+
+
+  static short
+  count_faces_scalable( char*  fond_data )
+  {
+    AsscEntry*  assoc;
+    FamRec*     fond;
+    short       i, face, face_all;
+
+
+    fond     = (FamRec*)fond_data;
+    face_all = EndianS16_BtoN( *( (short *)( fond_data +
+                                             sizeof ( FamRec ) ) ) ) + 1;
+    assoc    = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 );
+    face     = 0;
+
+    for ( i = 0; i < face_all; i++ )
+    {
+      if ( 0 == EndianS16_BtoN( assoc[i].fontSize ) )
+        face++;
+    }
+    return face;
+  }
+
+
+  /* Look inside the FOND data, answer whether there should be an SFNT
+     resource, and answer the name of a possible LWFN Type 1 file.
+
+     Thanks to Paul Miller (paulm@profoundeffects.com) for the fix
+     to load a face OTHER than the first one in the FOND!
+  */
+
+
+  static void
+  parse_fond( char*   fond_data,
+              short*  have_sfnt,
+              ResID*  sfnt_id,
+              Str255  lwfn_file_name,
+              short   face_index )
+  {
+    AsscEntry*  assoc;
+    AsscEntry*  base_assoc;
+    FamRec*     fond;
+
+
+    *sfnt_id          = 0;
+    *have_sfnt        = 0;
+    lwfn_file_name[0] = 0;
+
+    fond       = (FamRec*)fond_data;
+    assoc      = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 );
+    base_assoc = assoc;
+
+    /* the maximum faces in a FOND is 48, size of StyleTable.indexes[] */
+    if ( 47 < face_index )
+      return;
+
+    /* Let's do a little range checking before we get too excited here */
+    if ( face_index < count_faces_sfnt( fond_data ) )
+    {
+      assoc += face_index;        /* add on the face_index! */
+
+      /* if the face at this index is not scalable,
+         fall back to the first one (old behavior) */
+      if ( EndianS16_BtoN( assoc->fontSize ) == 0 )
+      {
+        *have_sfnt = 1;
+        *sfnt_id   = EndianS16_BtoN( assoc->fontID );
+      }
+      else if ( base_assoc->fontSize == 0 )
+      {
+        *have_sfnt = 1;
+        *sfnt_id   = EndianS16_BtoN( base_assoc->fontID );
+      }
+    }
+
+    if ( EndianS32_BtoN( fond->ffStylOff ) )
+    {
+      unsigned char*  p = (unsigned char*)fond_data;
+      StyleTable*     style;
+      unsigned short  string_count;
+      char            ps_name[256];
+      unsigned char*  names[64];
+      int             i;
+
+
+      p += EndianS32_BtoN( fond->ffStylOff );
+      style = (StyleTable*)p;
+      p += sizeof ( StyleTable );
+      string_count = EndianS16_BtoN( *(short*)(p) );
+      p += sizeof ( short );
+
+      for ( i = 0; i < string_count && i < 64; i++ )
+      {
+        names[i] = p;
+        p       += names[i][0];
+        p++;
+      }
+
+      {
+        size_t  ps_name_len = (size_t)names[0][0];
+
+
+        if ( ps_name_len != 0 )
+        {
+          ft_memcpy(ps_name, names[0] + 1, ps_name_len);
+          ps_name[ps_name_len] = 0;
+        }
+        if ( style->indexes[face_index] > 1 &&
+             style->indexes[face_index] <= FT_MIN( string_count, 64 ) )
+        {
+          unsigned char*  suffixes = names[style->indexes[face_index] - 1];
+
+
+          for ( i = 1; i <= suffixes[0]; i++ )
+          {
+            unsigned char*  s;
+            size_t          j = suffixes[i] - 1;
+
+
+            if ( j < string_count && ( s = names[j] ) != NULL )
+            {
+              size_t  s_len = (size_t)s[0];
+
+
+              if ( s_len != 0 && ps_name_len + s_len < sizeof ( ps_name ) )
+              {
+                ft_memcpy( ps_name + ps_name_len, s + 1, s_len );
+                ps_name_len += s_len;
+                ps_name[ps_name_len] = 0;
+              }
+            }
+          }
+        }
+      }
+
+      create_lwfn_name( ps_name, lwfn_file_name );
+    }
+  }
+
+
+  static  FT_Error
+  lookup_lwfn_by_fond( const UInt8*      path_fond,
+                       ConstStr255Param  base_lwfn,
+                       UInt8*            path_lwfn,
+                       size_t            path_size )
+  {
+    FSRef   ref, par_ref;
+    size_t  dirname_len;
+
+
+    /* Pathname for FSRef can be in various formats: HFS, HFS+, and POSIX. */
+    /* We should not extract parent directory by string manipulation.      */
+
+    if ( noErr != FSPathMakeRef( path_fond, &ref, FALSE ) )
+      return FT_Err_Invalid_Argument;
+
+    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone,
+                                    NULL, NULL, NULL, &par_ref ) )
+      return FT_Err_Invalid_Argument;
+
+    if ( noErr != FSRefMakePath( &par_ref, path_lwfn, path_size ) )
+      return FT_Err_Invalid_Argument;
+
+    if ( ft_strlen( (char *)path_lwfn ) + 1 + base_lwfn[0] > path_size )
+      return FT_Err_Invalid_Argument;
+
+    /* now we have absolute dirname in path_lwfn */
+    ft_strcat( (char *)path_lwfn, "/" );
+    dirname_len = ft_strlen( (char *)path_lwfn );
+    ft_strcat( (char *)path_lwfn, (char *)base_lwfn + 1 );
+    path_lwfn[dirname_len + base_lwfn[0]] = '\0';
+
+    if ( noErr != FSPathMakeRef( path_lwfn, &ref, FALSE ) )
+      return FT_Err_Cannot_Open_Resource;
+
+    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone,
+                                    NULL, NULL, NULL, NULL ) )
+      return FT_Err_Cannot_Open_Resource;
+
+    return FT_Err_Ok;
+  }
+
+
+  static short
+  count_faces( Handle        fond,
+               const UInt8*  pathname )
+  {
+    ResID     sfnt_id;
+    short     have_sfnt, have_lwfn;
+    Str255    lwfn_file_name;
+    UInt8     buff[PATH_MAX];
+    FT_Error  err;
+    short     num_faces;
+
+
+    have_sfnt = have_lwfn = 0;
+
+    parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, 0 );
+
+    if ( lwfn_file_name[0] )
+    {
+      err = lookup_lwfn_by_fond( pathname, lwfn_file_name,
+                                 buff, sizeof ( buff )  );
+      if ( FT_Err_Ok == err )
+        have_lwfn = 1;
+    }
+
+    if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) )
+      num_faces = 1;
+    else
+      num_faces = count_faces_scalable( *fond );
+
+    return num_faces;
+  }
+
+
+  /* Read Type 1 data from the POST resources inside the LWFN file,
+     return a PFB buffer.  This is somewhat convoluted because the FT2
+     PFB parser wants the ASCII header as one chunk, and the LWFN
+     chunks are often not organized that way, so we glue chunks
+     of the same type together. */
+  static FT_Error
+  read_lwfn( FT_Memory      memory,
+             ResFileRefNum  res,
+             FT_Byte**      pfb_data,
+             FT_ULong*      size )
+  {
+    FT_Error       error = FT_Err_Ok;
+    ResID          res_id;
+    unsigned char  *buffer, *p, *size_p = NULL;
+    FT_ULong       total_size = 0;
+    FT_ULong       old_total_size = 0;
+    FT_ULong       post_size, pfb_chunk_size;
+    Handle         post_data;
+    char           code, last_code;
+
+
+    UseResFile( res );
+
+    /* First pass: load all POST resources, and determine the size of */
+    /* the output buffer.                                             */
+    res_id    = 501;
+    last_code = -1;
+
+    for (;;)
+    {
+      post_data = Get1Resource( TTAG_POST, res_id++ );
+      if ( post_data == NULL )
+        break;  /* we are done */
+
+      code = (*post_data)[0];
+
+      if ( code != last_code )
+      {
+        if ( code == 5 )
+          total_size += 2; /* just the end code */
+        else
+          total_size += 6; /* code + 4 bytes chunk length */
+      }
+
+      total_size += GetHandleSize( post_data ) - 2;
+      last_code = code;
+
+      /* detect integer overflows */
+      if ( total_size < old_total_size )
+      {
+        error = FT_Err_Array_Too_Large;
+        goto Error;
+      }
+
+      old_total_size = total_size;
+    }
+
+    if ( FT_ALLOC( buffer, (FT_Long)total_size ) )
+      goto Error;
+
+    /* Second pass: append all POST data to the buffer, add PFB fields. */
+    /* Glue all consecutive chunks of the same type together.           */
+    p              = buffer;
+    res_id         = 501;
+    last_code      = -1;
+    pfb_chunk_size = 0;
+
+    for (;;)
+    {
+      post_data = Get1Resource( TTAG_POST, res_id++ );
+      if ( post_data == NULL )
+        break;  /* we are done */
+
+      post_size = (FT_ULong)GetHandleSize( post_data ) - 2;
+      code = (*post_data)[0];
+
+      if ( code != last_code )
+      {
+        if ( last_code != -1 )
+        {
+          /* we are done adding a chunk, fill in the size field */
+          if ( size_p != NULL )
+          {
+            *size_p++ = (FT_Byte)(   pfb_chunk_size         & 0xFF );
+            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8  ) & 0xFF );
+            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF );
+            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF );
+          }
+          pfb_chunk_size = 0;
+        }
+
+        *p++ = 0x80;
+        if ( code == 5 )
+          *p++ = 0x03;  /* the end */
+        else if ( code == 2 )
+          *p++ = 0x02;  /* binary segment */
+        else
+          *p++ = 0x01;  /* ASCII segment */
+
+        if ( code != 5 )
+        {
+          size_p = p;   /* save for later */
+          p += 4;       /* make space for size field */
+        }
+      }
+
+      ft_memcpy( p, *post_data + 2, post_size );
+      pfb_chunk_size += post_size;
+      p += post_size;
+      last_code = code;
+    }
+
+    *pfb_data = buffer;
+    *size = total_size;
+
+  Error:
+    CloseResFile( res );
+    return error;
+  }
+
+
+  /* Create a new FT_Face from a file path to an LWFN file. */
+  static FT_Error
+  FT_New_Face_From_LWFN( FT_Library    library,
+                         const UInt8*  pathname,
+                         FT_Long       face_index,
+                         FT_Face*      aface )
+  {
+    FT_Byte*       pfb_data;
+    FT_ULong       pfb_size;
+    FT_Error       error;
+    ResFileRefNum  res;
+
+
+    if ( noErr != FT_FSPathMakeRes( pathname, &res ) )
+      return FT_Err_Cannot_Open_Resource;
+
+    pfb_data = NULL;
+    pfb_size = 0;
+    error = read_lwfn( library->memory, res, &pfb_data, &pfb_size );
+    CloseResFile( res ); /* PFB is already loaded, useless anymore */
+    if ( error )
+      return error;
+
+    return open_face_from_buffer( library,
+                                  pfb_data,
+                                  pfb_size,
+                                  face_index,
+                                  "type1",
+                                  aface );
+  }
+
+
+  /* Create a new FT_Face from an SFNT resource, specified by res ID. */
+  static FT_Error
+  FT_New_Face_From_SFNT( FT_Library  library,
+                         ResID       sfnt_id,
+                         FT_Long     face_index,
+                         FT_Face*    aface )
+  {
+    Handle     sfnt = NULL;
+    FT_Byte*   sfnt_data;
+    size_t     sfnt_size;
+    FT_Error   error  = FT_Err_Ok;
+    FT_Memory  memory = library->memory;
+    int        is_cff, is_sfnt_ps;
+
+
+    sfnt = GetResource( TTAG_sfnt, sfnt_id );
+    if ( sfnt == NULL )
+      return FT_Err_Invalid_Handle;
+
+    sfnt_size = (FT_ULong)GetHandleSize( sfnt );
+    if ( FT_ALLOC( sfnt_data, (FT_Long)sfnt_size ) )
+    {
+      ReleaseResource( sfnt );
+      return error;
+    }
+
+    ft_memcpy( sfnt_data, *sfnt, sfnt_size );
+    ReleaseResource( sfnt );
+
+    is_cff     = sfnt_size > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 );
+    is_sfnt_ps = sfnt_size > 4 && !ft_memcmp( sfnt_data, "typ1", 4 );
+
+    if ( is_sfnt_ps )
+    {
+      FT_Stream  stream;
+
+
+      if ( FT_NEW( stream ) )
+        goto Try_OpenType;
+
+      FT_Stream_OpenMemory( stream, sfnt_data, sfnt_size );
+      if ( !open_face_PS_from_sfnt_stream( library,
+                                           stream,
+                                           face_index,
+                                           0, NULL,
+                                           aface ) )
+      {
+        FT_Stream_Close( stream );
+        FT_FREE( stream );
+        FT_FREE( sfnt_data );
+        goto Exit;
+      }
+
+      FT_FREE( stream );
+    }
+  Try_OpenType:
+    error = open_face_from_buffer( library,
+                                   sfnt_data,
+                                   sfnt_size,
+                                   face_index,
+                                   is_cff ? "cff" : "truetype",
+                                   aface );
+  Exit:
+    return error;
+  }
+
+
+  /* Create a new FT_Face from a file path to a suitcase file. */
+  static FT_Error
+  FT_New_Face_From_Suitcase( FT_Library    library,
+                             const UInt8*  pathname,
+                             FT_Long       face_index,
+                             FT_Face*      aface )
+  {
+    FT_Error       error = FT_Err_Cannot_Open_Resource;
+    ResFileRefNum  res_ref;
+    ResourceIndex  res_index;
+    Handle         fond;
+    short          num_faces_in_res, num_faces_in_fond;
+
+
+    if ( noErr != FT_FSPathMakeRes( pathname, &res_ref ) )
+      return FT_Err_Cannot_Open_Resource;
+
+    UseResFile( res_ref );
+    if ( ResError() )
+      return FT_Err_Cannot_Open_Resource;
+
+    num_faces_in_res = 0;
+    for ( res_index = 1; ; ++res_index )
+    {
+      fond = Get1IndResource( TTAG_FOND, res_index );
+      if ( ResError() )
+        break;
+
+      num_faces_in_fond  = count_faces( fond, pathname );
+      num_faces_in_res  += num_faces_in_fond;
+
+      if ( 0 <= face_index && face_index < num_faces_in_fond && error )
+        error = FT_New_Face_From_FOND( library, fond, face_index, aface );
+
+      face_index -= num_faces_in_fond;
+    }
+
+    CloseResFile( res_ref );
+    if ( FT_Err_Ok == error && NULL != aface && NULL != *aface )
+      (*aface)->num_faces = num_faces_in_res;
+    return error;
+  }
+
+
+  /* documentation is in ftmac.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Face_From_FOND( FT_Library  library,
+                         Handle      fond,
+                         FT_Long     face_index,
+                         FT_Face*    aface )
+  {
+    short     have_sfnt, have_lwfn = 0;
+    ResID     sfnt_id, fond_id;
+    OSType    fond_type;
+    Str255    fond_name;
+    Str255    lwfn_file_name;
+    UInt8     path_lwfn[PATH_MAX];
+    OSErr     err;
+    FT_Error  error = FT_Err_Ok;
+
+
+    GetResInfo( fond, &fond_id, &fond_type, fond_name );
+    if ( ResError() != noErr || fond_type != TTAG_FOND )
+      return FT_Err_Invalid_File_Format;
+
+    parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, face_index );
+
+    if ( lwfn_file_name[0] )
+    {
+      ResFileRefNum  res;
+
+
+      res = HomeResFile( fond );
+      if ( noErr != ResError() )
+        goto found_no_lwfn_file;
+
+      {
+        UInt8  path_fond[PATH_MAX];
+        FSRef  ref;
+
+
+        err = FSGetForkCBInfo( res, kFSInvalidVolumeRefNum,
+                               NULL, NULL, NULL, &ref, NULL );
+        if ( noErr != err )
+          goto found_no_lwfn_file;
+
+        err = FSRefMakePath( &ref, path_fond, sizeof ( path_fond ) );
+        if ( noErr != err )
+          goto found_no_lwfn_file;
+
+        error = lookup_lwfn_by_fond( path_fond, lwfn_file_name,
+                                     path_lwfn, sizeof ( path_lwfn ) );
+        if ( FT_Err_Ok == error )
+          have_lwfn = 1;
+      }
+    }
+
+    if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) )
+      error = FT_New_Face_From_LWFN( library,
+                                     path_lwfn,
+                                     face_index,
+                                     aface );
+    else
+      error = FT_Err_Unknown_File_Format;
+
+  found_no_lwfn_file:
+    if ( have_sfnt && FT_Err_Ok != error )
+      error = FT_New_Face_From_SFNT( library,
+                                     sfnt_id,
+                                     face_index,
+                                     aface );
+
+    return error;
+  }
+
+
+  /* Common function to load a new FT_Face from a resource file. */
+  static FT_Error
+  FT_New_Face_From_Resource( FT_Library    library,
+                             const UInt8*  pathname,
+                             FT_Long       face_index,
+                             FT_Face*      aface )
+  {
+    OSType    file_type;
+    FT_Error  error;
+
+
+    /* LWFN is a (very) specific file format, check for it explicitly */
+    file_type = get_file_type_from_path( pathname );
+    if ( file_type == TTAG_LWFN )
+      return FT_New_Face_From_LWFN( library, pathname, face_index, aface );
+
+    /* Otherwise the file type doesn't matter (there are more than  */
+    /* `FFIL' and `tfil').  Just try opening it as a font suitcase; */
+    /* if it works, fine.                                           */
+
+    error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface );
+    if ( error == 0 )
+      return error;
+
+    /* let it fall through to normal loader (.ttf, .otf, etc.); */
+    /* we signal this by returning no error and no FT_Face      */
+    *aface = NULL;
+    return 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This is the Mac-specific implementation of FT_New_Face.  In        */
+  /*    addition to the standard FT_New_Face() functionality, it also      */
+  /*    accepts pathnames to Mac suitcase files.  For further              */
+  /*    documentation see the original FT_New_Face() in freetype.h.        */
+  /*                                                                       */
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Face( FT_Library   library,
+               const char*  pathname,
+               FT_Long      face_index,
+               FT_Face*     aface )
+  {
+    FT_Open_Args  args;
+    FT_Error      error;
+
+
+    /* test for valid `library' and `aface' delayed to FT_Open_Face() */
+    if ( !pathname )
+      return FT_Err_Invalid_Argument;
+
+    error  = FT_Err_Ok;
+    *aface = NULL;
+
+    /* try resourcefork based font: LWFN, FFIL */
+    error = FT_New_Face_From_Resource( library, (UInt8 *)pathname,
+                                       face_index, aface );
+    if ( error != 0 || *aface != NULL )
+      return error;
+
+    /* let it fall through to normal loader (.ttf, .otf, etc.) */
+    args.flags    = FT_OPEN_PATHNAME;
+    args.pathname = (char*)pathname;
+    return FT_Open_Face( library, &args, face_index, aface );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face_From_FSRef                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    FT_New_Face_From_FSRef is identical to FT_New_Face except it       */
+  /*    accepts an FSRef instead of a path.                                */
+  /*                                                                       */
+  /* This function is deprecated because Carbon data types (FSRef)         */
+  /* are not cross-platform, and thus not suitable for the freetype API.   */
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Face_From_FSRef( FT_Library    library,
+                          const FSRef*  ref,
+                          FT_Long       face_index,
+                          FT_Face*      aface )
+  {
+    FT_Error      error;
+    FT_Open_Args  args;
+    OSErr   err;
+    UInt8   pathname[PATH_MAX];
+
+
+    if ( !ref )
+      return FT_Err_Invalid_Argument;
+
+    err = FSRefMakePath( ref, pathname, sizeof ( pathname ) );
+    if ( err )
+      error = FT_Err_Cannot_Open_Resource;
+
+    error = FT_New_Face_From_Resource( library, pathname, face_index, aface );
+    if ( error != 0 || *aface != NULL )
+      return error;
+
+    /* fallback to datafork font */
+    args.flags    = FT_OPEN_PATHNAME;
+    args.pathname = (char*)pathname;
+    return FT_Open_Face( library, &args, face_index, aface );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_New_Face_From_FSSpec                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    FT_New_Face_From_FSSpec is identical to FT_New_Face except it      */
+  /*    accepts an FSSpec instead of a path.                               */
+  /*                                                                       */
+  /* This function is deprecated because FSSpec is deprecated in Mac OS X  */
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Face_From_FSSpec( FT_Library     library,
+                           const FSSpec*  spec,
+                           FT_Long        face_index,
+                           FT_Face*       aface )
+  {
+#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \
+      ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) )
+    FT_UNUSED( library );
+    FT_UNUSED( spec );
+    FT_UNUSED( face_index );
+    FT_UNUSED( aface );
+
+    return FT_Err_Unimplemented_Feature;
+#else
+    FSRef  ref;
+
+
+    if ( !spec || FSpMakeFSRef( spec, &ref ) != noErr )
+      return FT_Err_Invalid_Argument;
+    else
+      return FT_New_Face_From_FSRef( library, &ref, face_index, aface );
+#endif
+  }
+
+#endif /* FT_MACINTOSH */
+
+
+/* END */
diff --git a/src/base/ftmm.c b/src/base/ftmm.c
new file mode 100644 (file)
index 0000000..0307729
--- /dev/null
@@ -0,0 +1,202 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmm.c                                                                 */
+/*                                                                         */
+/*    Multiple Master font support (body).                                 */
+/*                                                                         */
+/*  Copyright 1996-2001, 2003, 2004, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_MULTIPLE_MASTERS_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_SERVICE_MULTIPLE_MASTERS_H
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_mm
+
+
+  static FT_Error
+  ft_face_get_mm_service( FT_Face                   face,
+                          FT_Service_MultiMasters  *aservice )
+  {
+    FT_Error  error;
+
+
+    *aservice = NULL;
+
+    if ( !face )
+      return FT_Err_Invalid_Face_Handle;
+
+    error = FT_Err_Invalid_Argument;
+
+    if ( FT_HAS_MULTIPLE_MASTERS( face ) )
+    {
+      FT_FACE_LOOKUP_SERVICE( face,
+                              *aservice,
+                              MULTI_MASTERS );
+
+      if ( *aservice )
+        error = FT_Err_Ok;
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Multi_Master( FT_Face           face,
+                       FT_Multi_Master  *amaster )
+  {
+    FT_Error                 error;
+    FT_Service_MultiMasters  service;
+
+
+    error = ft_face_get_mm_service( face, &service );
+    if ( !error )
+    {
+      error = FT_Err_Invalid_Argument;
+      if ( service->get_mm )
+        error = service->get_mm( face, amaster );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_MM_Var( FT_Face      face,
+                 FT_MM_Var*  *amaster )
+  {
+    FT_Error                 error;
+    FT_Service_MultiMasters  service;
+
+
+    error = ft_face_get_mm_service( face, &service );
+    if ( !error )
+    {
+      error = FT_Err_Invalid_Argument;
+      if ( service->get_mm_var )
+        error = service->get_mm_var( face, amaster );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Set_MM_Design_Coordinates( FT_Face   face,
+                                FT_UInt   num_coords,
+                                FT_Long*  coords )
+  {
+    FT_Error                 error;
+    FT_Service_MultiMasters  service;
+
+
+    error = ft_face_get_mm_service( face, &service );
+    if ( !error )
+    {
+      error = FT_Err_Invalid_Argument;
+      if ( service->set_mm_design )
+        error = service->set_mm_design( face, num_coords, coords );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Set_Var_Design_Coordinates( FT_Face    face,
+                                 FT_UInt    num_coords,
+                                 FT_Fixed*  coords )
+  {
+    FT_Error                 error;
+    FT_Service_MultiMasters  service;
+
+
+    error = ft_face_get_mm_service( face, &service );
+    if ( !error )
+    {
+      error = FT_Err_Invalid_Argument;
+      if ( service->set_var_design )
+        error = service->set_var_design( face, num_coords, coords );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Set_MM_Blend_Coordinates( FT_Face    face,
+                               FT_UInt    num_coords,
+                               FT_Fixed*  coords )
+  {
+    FT_Error                 error;
+    FT_Service_MultiMasters  service;
+
+
+    error = ft_face_get_mm_service( face, &service );
+    if ( !error )
+    {
+      error = FT_Err_Invalid_Argument;
+      if ( service->set_mm_blend )
+         error = service->set_mm_blend( face, num_coords, coords );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  /* This is exactly the same as the previous function.  It exists for */
+  /* orthogonality.                                                    */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Set_Var_Blend_Coordinates( FT_Face    face,
+                                FT_UInt    num_coords,
+                                FT_Fixed*  coords )
+  {
+    FT_Error                 error;
+    FT_Service_MultiMasters  service;
+
+
+    error = ft_face_get_mm_service( face, &service );
+    if ( !error )
+    {
+      error = FT_Err_Invalid_Argument;
+      if ( service->set_mm_blend )
+         error = service->set_mm_blend( face, num_coords, coords );
+    }
+
+    return error;
+  }
+
+
+/* END */
diff --git a/src/base/ftobjs.c b/src/base/ftobjs.c
new file mode 100644 (file)
index 0000000..36ee797
--- /dev/null
@@ -0,0 +1,4751 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftobjs.c                                                               */
+/*                                                                         */
+/*    The FreeType private base classes (body).                            */
+/*                                                                         */
+/*  Copyright 1996-2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_LIST_H
+#include FT_OUTLINE_H
+#include FT_INTERNAL_VALIDATE_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_RFORK_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_SFNT_H    /* for SFNT_Load_Table_Func */
+#include FT_TRUETYPE_TABLES_H
+#include FT_TRUETYPE_TAGS_H
+#include FT_TRUETYPE_IDS_H
+
+#include FT_SERVICE_SFNT_H
+#include FT_SERVICE_POSTSCRIPT_NAME_H
+#include FT_SERVICE_GLYPH_DICT_H
+#include FT_SERVICE_TT_CMAP_H
+#include FT_SERVICE_KERNING_H
+#include FT_SERVICE_TRUETYPE_ENGINE_H
+
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+#include "ftbase.h"
+#endif
+
+#define GRID_FIT_METRICS
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_service_list_lookup( FT_ServiceDesc  service_descriptors,
+                          const char*     service_id )
+  {
+    FT_Pointer      result = NULL;
+    FT_ServiceDesc  desc   = service_descriptors;
+
+
+    if ( desc && service_id )
+    {
+      for ( ; desc->serv_id != NULL; desc++ )
+      {
+        if ( ft_strcmp( desc->serv_id, service_id ) == 0 )
+        {
+          result = (FT_Pointer)desc->serv_data;
+          break;
+        }
+      }
+    }
+
+    return result;
+  }
+
+
+  FT_BASE_DEF( void )
+  ft_validator_init( FT_Validator        valid,
+                     const FT_Byte*      base,
+                     const FT_Byte*      limit,
+                     FT_ValidationLevel  level )
+  {
+    valid->base  = base;
+    valid->limit = limit;
+    valid->level = level;
+    valid->error = FT_Err_Ok;
+  }
+
+
+  FT_BASE_DEF( FT_Int )
+  ft_validator_run( FT_Validator  valid )
+  {
+    /* This function doesn't work!  None should call it. */
+    FT_UNUSED( valid );
+
+    return -1;
+  }
+
+
+  FT_BASE_DEF( void )
+  ft_validator_error( FT_Validator  valid,
+                      FT_Error      error )
+  {
+    /* since the cast below also disables the compiler's */
+    /* type check, we introduce a dummy variable, which  */
+    /* will be optimized away                            */
+    volatile ft_jmp_buf* jump_buffer = &valid->jump_buffer;
+
+
+    valid->error = error;
+
+    /* throw away volatileness; use `jump_buffer' or the  */
+    /* compiler may warn about an unused local variable   */
+    ft_longjmp( *(ft_jmp_buf*) jump_buffer, 1 );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                           S T R E A M                           ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* create a new input stream from an FT_Open_Args structure */
+  /*                                                          */
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_New( FT_Library           library,
+                 const FT_Open_Args*  args,
+                 FT_Stream           *astream )
+  {
+    FT_Error   error;
+    FT_Memory  memory;
+    FT_Stream  stream = NULL;
+
+
+    *astream = 0;
+
+    if ( !library )
+      return FT_Err_Invalid_Library_Handle;
+
+    if ( !args )
+      return FT_Err_Invalid_Argument;
+
+    memory = library->memory;
+
+    if ( FT_NEW( stream ) )
+      goto Exit;
+
+    stream->memory = memory;
+
+    if ( args->flags & FT_OPEN_MEMORY )
+    {
+      /* create a memory-based stream */
+      FT_Stream_OpenMemory( stream,
+                            (const FT_Byte*)args->memory_base,
+                            args->memory_size );
+    }
+
+#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT
+
+    else if ( args->flags & FT_OPEN_PATHNAME )
+    {
+      /* create a normal system stream */
+      error = FT_Stream_Open( stream, args->pathname );
+      stream->pathname.pointer = args->pathname;
+    }
+    else if ( ( args->flags & FT_OPEN_STREAM ) && args->stream )
+    {
+      /* use an existing, user-provided stream */
+
+      /* in this case, we do not need to allocate a new stream object */
+      /* since the caller is responsible for closing it himself       */
+      FT_FREE( stream );
+      stream = args->stream;
+    }
+
+#endif
+
+    else
+      error = FT_Err_Invalid_Argument;
+
+    if ( error )
+      FT_FREE( stream );
+    else
+      stream->memory = memory;  /* just to be certain */
+
+    *astream = stream;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Stream_Free( FT_Stream  stream,
+                  FT_Int     external )
+  {
+    if ( stream )
+    {
+      FT_Memory  memory = stream->memory;
+
+
+      FT_Stream_Close( stream );
+
+      if ( !external )
+        FT_FREE( stream );
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_objs
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****               FACE, SIZE & GLYPH SLOT OBJECTS                   ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  static FT_Error
+  ft_glyphslot_init( FT_GlyphSlot  slot )
+  {
+    FT_Driver         driver   = slot->face->driver;
+    FT_Driver_Class   clazz    = driver->clazz;
+    FT_Memory         memory   = driver->root.memory;
+    FT_Error          error    = FT_Err_Ok;
+    FT_Slot_Internal  internal = NULL;
+
+
+    slot->library = driver->root.library;
+
+    if ( FT_NEW( internal ) )
+      goto Exit;
+
+    slot->internal = internal;
+
+    if ( FT_DRIVER_USES_OUTLINES( driver ) )
+      error = FT_GlyphLoader_New( memory, &internal->loader );
+
+    if ( !error && clazz->init_slot )
+      error = clazz->init_slot( slot );
+
+  Exit:
+    return error;
+  }
+
+
+  FT_BASE_DEF( void )
+  ft_glyphslot_free_bitmap( FT_GlyphSlot  slot )
+  {
+    if ( slot->internal && ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) )
+    {
+      FT_Memory  memory = FT_FACE_MEMORY( slot->face );
+
+
+      FT_FREE( slot->bitmap.buffer );
+      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+    }
+    else
+    {
+      /* assume that the bitmap buffer was stolen or not */
+      /* allocated from the heap                         */
+      slot->bitmap.buffer = NULL;
+    }
+  }
+
+
+  FT_BASE_DEF( void )
+  ft_glyphslot_set_bitmap( FT_GlyphSlot  slot,
+                           FT_Byte*      buffer )
+  {
+    ft_glyphslot_free_bitmap( slot );
+
+    slot->bitmap.buffer = buffer;
+
+    FT_ASSERT( (slot->internal->flags & FT_GLYPH_OWN_BITMAP) == 0 );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  ft_glyphslot_alloc_bitmap( FT_GlyphSlot  slot,
+                             FT_ULong      size )
+  {
+    FT_Memory  memory = FT_FACE_MEMORY( slot->face );
+    FT_Error   error;
+
+
+    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+      FT_FREE( slot->bitmap.buffer );
+    else
+      slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
+
+    (void)FT_ALLOC( slot->bitmap.buffer, size );
+    return error;
+  }
+
+
+  static void
+  ft_glyphslot_clear( FT_GlyphSlot  slot )
+  {
+    /* free bitmap if needed */
+    ft_glyphslot_free_bitmap( slot );
+
+    /* clear all public fields in the glyph slot */
+    FT_ZERO( &slot->metrics );
+    FT_ZERO( &slot->outline );
+
+    slot->bitmap.width      = 0;
+    slot->bitmap.rows       = 0;
+    slot->bitmap.pitch      = 0;
+    slot->bitmap.pixel_mode = 0;
+    /* `slot->bitmap.buffer' has been handled by ft_glyphslot_free_bitmap */
+
+    slot->bitmap_left   = 0;
+    slot->bitmap_top    = 0;
+    slot->num_subglyphs = 0;
+    slot->subglyphs     = 0;
+    slot->control_data  = 0;
+    slot->control_len   = 0;
+    slot->other         = 0;
+    slot->format        = FT_GLYPH_FORMAT_NONE;
+
+    slot->linearHoriAdvance = 0;
+    slot->linearVertAdvance = 0;
+    slot->lsb_delta         = 0;
+    slot->rsb_delta         = 0;
+  }
+
+
+  static void
+  ft_glyphslot_done( FT_GlyphSlot  slot )
+  {
+    FT_Driver        driver = slot->face->driver;
+    FT_Driver_Class  clazz  = driver->clazz;
+    FT_Memory        memory = driver->root.memory;
+
+
+    if ( clazz->done_slot )
+      clazz->done_slot( slot );
+
+    /* free bitmap buffer if needed */
+    ft_glyphslot_free_bitmap( slot );
+
+    /* slot->internal might be NULL in out-of-memory situations */
+    if ( slot->internal )
+    {
+      /* free glyph loader */
+      if ( FT_DRIVER_USES_OUTLINES( driver ) )
+      {
+        FT_GlyphLoader_Done( slot->internal->loader );
+        slot->internal->loader = 0;
+      }
+
+      FT_FREE( slot->internal );
+    }
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( FT_Error )
+  FT_New_GlyphSlot( FT_Face        face,
+                    FT_GlyphSlot  *aslot )
+  {
+    FT_Error         error;
+    FT_Driver        driver;
+    FT_Driver_Class  clazz;
+    FT_Memory        memory;
+    FT_GlyphSlot     slot = NULL;
+
+
+    if ( !face || !face->driver )
+      return FT_Err_Invalid_Argument;
+
+    driver = face->driver;
+    clazz  = driver->clazz;
+    memory = driver->root.memory;
+
+    FT_TRACE4(( "FT_New_GlyphSlot: Creating new slot object\n" ));
+    if ( !FT_ALLOC( slot, clazz->slot_object_size ) )
+    {
+      slot->face = face;
+
+      error = ft_glyphslot_init( slot );
+      if ( error )
+      {
+        ft_glyphslot_done( slot );
+        FT_FREE( slot );
+        goto Exit;
+      }
+
+      slot->next  = face->glyph;
+      face->glyph = slot;
+
+      if ( aslot )
+        *aslot = slot;
+    }
+    else if ( aslot )
+      *aslot = 0;
+
+
+  Exit:
+    FT_TRACE4(( "FT_New_GlyphSlot: Return %d\n", error ));
+    return error;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( void )
+  FT_Done_GlyphSlot( FT_GlyphSlot  slot )
+  {
+    if ( slot )
+    {
+      FT_Driver     driver = slot->face->driver;
+      FT_Memory     memory = driver->root.memory;
+      FT_GlyphSlot  prev;
+      FT_GlyphSlot  cur;
+
+
+      /* Remove slot from its parent face's list */
+      prev = NULL;
+      cur  = slot->face->glyph;
+
+      while ( cur )
+      {
+        if ( cur == slot )
+        {
+          if ( !prev )
+            slot->face->glyph = cur->next;
+          else
+            prev->next = cur->next;
+
+          /* finalize client-specific data */
+          if ( slot->generic.finalizer )
+            slot->generic.finalizer( slot );
+
+          ft_glyphslot_done( slot );
+          FT_FREE( slot );
+          break;
+        }
+        prev = cur;
+        cur  = cur->next;
+      }
+    }
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Set_Transform( FT_Face     face,
+                    FT_Matrix*  matrix,
+                    FT_Vector*  delta )
+  {
+    FT_Face_Internal  internal;
+
+
+    if ( !face )
+      return;
+
+    internal = face->internal;
+
+    internal->transform_flags = 0;
+
+    if ( !matrix )
+    {
+      internal->transform_matrix.xx = 0x10000L;
+      internal->transform_matrix.xy = 0;
+      internal->transform_matrix.yx = 0;
+      internal->transform_matrix.yy = 0x10000L;
+      matrix = &internal->transform_matrix;
+    }
+    else
+      internal->transform_matrix = *matrix;
+
+    /* set transform_flags bit flag 0 if `matrix' isn't the identity */
+    if ( ( matrix->xy | matrix->yx ) ||
+         matrix->xx != 0x10000L      ||
+         matrix->yy != 0x10000L      )
+      internal->transform_flags |= 1;
+
+    if ( !delta )
+    {
+      internal->transform_delta.x = 0;
+      internal->transform_delta.y = 0;
+      delta = &internal->transform_delta;
+    }
+    else
+      internal->transform_delta = *delta;
+
+    /* set transform_flags bit flag 1 if `delta' isn't the null vector */
+    if ( delta->x | delta->y )
+      internal->transform_flags |= 2;
+  }
+
+
+  static FT_Renderer
+  ft_lookup_glyph_renderer( FT_GlyphSlot  slot );
+
+
+#ifdef GRID_FIT_METRICS
+  static void
+  ft_glyphslot_grid_fit_metrics( FT_GlyphSlot  slot,
+                                 FT_Bool       vertical )
+  {
+    FT_Glyph_Metrics*  metrics = &slot->metrics;
+    FT_Pos             right, bottom;
+
+
+    if ( vertical )
+    {
+      metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX );
+      metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY );
+
+      right  = FT_PIX_CEIL( metrics->vertBearingX + metrics->width );
+      bottom = FT_PIX_CEIL( metrics->vertBearingY + metrics->height );
+
+      metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX );
+      metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY );
+
+      metrics->width  = right - metrics->vertBearingX;
+      metrics->height = bottom - metrics->vertBearingY;
+    }
+    else
+    {
+      metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX );
+      metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY );
+
+      right  = FT_PIX_CEIL ( metrics->horiBearingX + metrics->width );
+      bottom = FT_PIX_FLOOR( metrics->horiBearingY - metrics->height );
+
+      metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX );
+      metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY );
+
+      metrics->width  = right - metrics->horiBearingX;
+      metrics->height = metrics->horiBearingY - bottom;
+    }
+
+    metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance );
+    metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance );
+  }
+#endif /* GRID_FIT_METRICS */
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Load_Glyph( FT_Face   face,
+                 FT_UInt   glyph_index,
+                 FT_Int32  load_flags )
+  {
+    FT_Error      error;
+    FT_Driver     driver;
+    FT_GlyphSlot  slot;
+    FT_Library    library;
+    FT_Bool       autohint = FALSE;
+    FT_Module     hinter;
+    TT_Face       ttface = (TT_Face)face;
+
+
+    if ( !face || !face->size || !face->glyph )
+      return FT_Err_Invalid_Face_Handle;
+
+    /* The validity test for `glyph_index' is performed by the */
+    /* font drivers.                                           */
+
+    slot = face->glyph;
+    ft_glyphslot_clear( slot );
+
+    driver  = face->driver;
+    library = driver->root.library;
+    hinter  = library->auto_hinter;
+
+    /* resolve load flags dependencies */
+
+    if ( load_flags & FT_LOAD_NO_RECURSE )
+      load_flags |= FT_LOAD_NO_SCALE         |
+                    FT_LOAD_IGNORE_TRANSFORM;
+
+    if ( load_flags & FT_LOAD_NO_SCALE )
+    {
+      load_flags |= FT_LOAD_NO_HINTING |
+                    FT_LOAD_NO_BITMAP;
+
+      load_flags &= ~FT_LOAD_RENDER;
+    }
+
+    /*
+     * Determine whether we need to auto-hint or not.
+     * The general rules are:
+     *
+     * - Do only auto-hinting if we have a hinter module, a scalable font
+     *   format dealing with outlines, and no transforms except simple
+     *   slants and/or rotations by integer multiples of 90 degrees.
+     *
+     * - Then, auto-hint if FT_LOAD_FORCE_AUTOHINT is set or if we don't
+     *   have a native font hinter.
+     *
+     * - Otherwise, auto-hint for LIGHT hinting mode or if there isn't
+     *   any hinting bytecode in the TrueType/OpenType font.
+     *
+     * - Exception: The font is `tricky' and requires the native hinter to
+     *   load properly.
+     */
+
+    if ( hinter                                           &&
+         !( load_flags & FT_LOAD_NO_HINTING )             &&
+         !( load_flags & FT_LOAD_NO_AUTOHINT )            &&
+         FT_DRIVER_IS_SCALABLE( driver )                  &&
+         FT_DRIVER_USES_OUTLINES( driver )                &&
+         !FT_IS_TRICKY( face )                            &&
+         ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM )    ||
+           ( face->internal->transform_matrix.yx == 0 &&
+             face->internal->transform_matrix.xx != 0 ) ||
+           ( face->internal->transform_matrix.xx == 0 &&
+             face->internal->transform_matrix.yx != 0 ) ) )
+    {
+      if ( ( load_flags & FT_LOAD_FORCE_AUTOHINT ) ||
+           !FT_DRIVER_HAS_HINTER( driver )         )
+        autohint = TRUE;
+      else
+      {
+        FT_Render_Mode  mode = FT_LOAD_TARGET_MODE( load_flags );
+
+
+        /* the check for `num_locations' assures that we actually    */
+        /* test for instructions in a TTF and not in a CFF-based OTF */
+        if ( mode == FT_RENDER_MODE_LIGHT                       ||
+             face->internal->ignore_unpatented_hinter           ||
+             ( FT_IS_SFNT( face )                             &&
+               ttface->num_locations                          &&
+               ttface->max_profile.maxSizeOfInstructions == 0 ) )
+          autohint = TRUE;
+      }
+    }
+
+    if ( autohint )
+    {
+      FT_AutoHinter_Service  hinting;
+
+
+      /* try to load embedded bitmaps first if available            */
+      /*                                                            */
+      /* XXX: This is really a temporary hack that should disappear */
+      /*      promptly with FreeType 2.1!                           */
+      /*                                                            */
+      if ( FT_HAS_FIXED_SIZES( face )             &&
+          ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
+      {
+        error = driver->clazz->load_glyph( slot, face->size,
+                                           glyph_index,
+                                           load_flags | FT_LOAD_SBITS_ONLY );
+
+        if ( !error && slot->format == FT_GLYPH_FORMAT_BITMAP )
+          goto Load_Ok;
+      }
+
+      {
+        FT_Face_Internal  internal        = face->internal;
+        FT_Int            transform_flags = internal->transform_flags;
+
+
+        /* since the auto-hinter calls FT_Load_Glyph by itself, */
+        /* make sure that glyphs aren't transformed             */
+        internal->transform_flags = 0;
+
+        /* load auto-hinted outline */
+        hinting = (FT_AutoHinter_Service)hinter->clazz->module_interface;
+
+        error   = hinting->load_glyph( (FT_AutoHinter)hinter,
+                                       slot, face->size,
+                                       glyph_index, load_flags );
+
+        internal->transform_flags = transform_flags;
+      }
+    }
+    else
+    {
+      error = driver->clazz->load_glyph( slot,
+                                         face->size,
+                                         glyph_index,
+                                         load_flags );
+      if ( error )
+        goto Exit;
+
+      if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+      {
+        /* check that the loaded outline is correct */
+        error = FT_Outline_Check( &slot->outline );
+        if ( error )
+          goto Exit;
+
+#ifdef GRID_FIT_METRICS
+        if ( !( load_flags & FT_LOAD_NO_HINTING ) )
+          ft_glyphslot_grid_fit_metrics( slot,
+              FT_BOOL( load_flags & FT_LOAD_VERTICAL_LAYOUT ) );
+#endif
+      }
+    }
+
+  Load_Ok:
+    /* compute the advance */
+    if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+    {
+      slot->advance.x = 0;
+      slot->advance.y = slot->metrics.vertAdvance;
+    }
+    else
+    {
+      slot->advance.x = slot->metrics.horiAdvance;
+      slot->advance.y = 0;
+    }
+
+    /* compute the linear advance in 16.16 pixels */
+    if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 &&
+         ( FT_IS_SCALABLE( face ) )                  )
+    {
+      FT_Size_Metrics*  metrics = &face->size->metrics;
+
+
+      /* it's tricky! */
+      slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance,
+                                           metrics->x_scale, 64 );
+
+      slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance,
+                                           metrics->y_scale, 64 );
+    }
+
+    if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 )
+    {
+      FT_Face_Internal  internal = face->internal;
+
+
+      /* now, transform the glyph image if needed */
+      if ( internal->transform_flags )
+      {
+        /* get renderer */
+        FT_Renderer  renderer = ft_lookup_glyph_renderer( slot );
+
+
+        if ( renderer )
+          error = renderer->clazz->transform_glyph(
+                                     renderer, slot,
+                                     &internal->transform_matrix,
+                                     &internal->transform_delta );
+        else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+        {
+          /* apply `standard' transformation if no renderer is available */
+          if ( internal->transform_flags & 1 )
+            FT_Outline_Transform( &slot->outline,
+                                  &internal->transform_matrix );
+
+          if ( internal->transform_flags & 2 )
+            FT_Outline_Translate( &slot->outline,
+                                  internal->transform_delta.x,
+                                  internal->transform_delta.y );
+        }
+
+        /* transform advance */
+        FT_Vector_Transform( &slot->advance, &internal->transform_matrix );
+      }
+    }
+
+    FT_TRACE5(( "  x advance: %d\n" , slot->advance.x ));
+    FT_TRACE5(( "  y advance: %d\n" , slot->advance.y ));
+
+    FT_TRACE5(( "  linear x advance: %d\n" , slot->linearHoriAdvance ));
+    FT_TRACE5(( "  linear y advance: %d\n" , slot->linearVertAdvance ));
+
+    /* do we need to render the image now? */
+    if ( !error                                    &&
+         slot->format != FT_GLYPH_FORMAT_BITMAP    &&
+         slot->format != FT_GLYPH_FORMAT_COMPOSITE &&
+         load_flags & FT_LOAD_RENDER )
+    {
+      FT_Render_Mode  mode = FT_LOAD_TARGET_MODE( load_flags );
+
+
+      if ( mode == FT_RENDER_MODE_NORMAL      &&
+           (load_flags & FT_LOAD_MONOCHROME ) )
+        mode = FT_RENDER_MODE_MONO;
+
+      error = FT_Render_Glyph( slot, mode );
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Load_Char( FT_Face   face,
+                FT_ULong  char_code,
+                FT_Int32  load_flags )
+  {
+    FT_UInt  glyph_index;
+
+
+    if ( !face )
+      return FT_Err_Invalid_Face_Handle;
+
+    glyph_index = (FT_UInt)char_code;
+    if ( face->charmap )
+      glyph_index = FT_Get_Char_Index( face, char_code );
+
+    return FT_Load_Glyph( face, glyph_index, load_flags );
+  }
+
+
+  /* destructor for sizes list */
+  static void
+  destroy_size( FT_Memory  memory,
+                FT_Size    size,
+                FT_Driver  driver )
+  {
+    /* finalize client-specific data */
+    if ( size->generic.finalizer )
+      size->generic.finalizer( size );
+
+    /* finalize format-specific stuff */
+    if ( driver->clazz->done_size )
+      driver->clazz->done_size( size );
+
+    FT_FREE( size->internal );
+    FT_FREE( size );
+  }
+
+
+  static void
+  ft_cmap_done_internal( FT_CMap  cmap );
+
+
+  static void
+  destroy_charmaps( FT_Face    face,
+                    FT_Memory  memory )
+  {
+    FT_Int  n;
+
+
+    if ( !face )
+      return;
+
+    for ( n = 0; n < face->num_charmaps; n++ )
+    {
+      FT_CMap  cmap = FT_CMAP( face->charmaps[n] );
+
+
+      ft_cmap_done_internal( cmap );
+
+      face->charmaps[n] = NULL;
+    }
+
+    FT_FREE( face->charmaps );
+    face->num_charmaps = 0;
+  }
+
+
+  /* destructor for faces list */
+  static void
+  destroy_face( FT_Memory  memory,
+                FT_Face    face,
+                FT_Driver  driver )
+  {
+    FT_Driver_Class  clazz = driver->clazz;
+
+
+    /* discard auto-hinting data */
+    if ( face->autohint.finalizer )
+      face->autohint.finalizer( face->autohint.data );
+
+    /* Discard glyph slots for this face.                           */
+    /* Beware!  FT_Done_GlyphSlot() changes the field `face->glyph' */
+    while ( face->glyph )
+      FT_Done_GlyphSlot( face->glyph );
+
+    /* discard all sizes for this face */
+    FT_List_Finalize( &face->sizes_list,
+                      (FT_List_Destructor)destroy_size,
+                      memory,
+                      driver );
+    face->size = 0;
+
+    /* now discard client data */
+    if ( face->generic.finalizer )
+      face->generic.finalizer( face );
+
+    /* discard charmaps */
+    destroy_charmaps( face, memory );
+
+    /* finalize format-specific stuff */
+    if ( clazz->done_face )
+      clazz->done_face( face );
+
+    /* close the stream for this face if needed */
+    FT_Stream_Free(
+      face->stream,
+      ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 );
+
+    face->stream = 0;
+
+    /* get rid of it */
+    if ( face->internal )
+    {
+      FT_FREE( face->internal );
+    }
+    FT_FREE( face );
+  }
+
+
+  static void
+  Destroy_Driver( FT_Driver  driver )
+  {
+    FT_List_Finalize( &driver->faces_list,
+                      (FT_List_Destructor)destroy_face,
+                      driver->root.memory,
+                      driver );
+
+    /* check whether we need to drop the driver's glyph loader */
+    if ( FT_DRIVER_USES_OUTLINES( driver ) )
+      FT_GlyphLoader_Done( driver->glyph_loader );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    find_unicode_charmap                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function finds a Unicode charmap, if there is one.            */
+  /*    And if there is more than one, it tries to favour the more         */
+  /*    extensive one, i.e., one that supports UCS-4 against those which   */
+  /*    are limited to the BMP (said UCS-2 encoding.)                      */
+  /*                                                                       */
+  /*    This function is called from open_face() (just below), and also    */
+  /*    from FT_Select_Charmap( ..., FT_ENCODING_UNICODE ).                */
+  /*                                                                       */
+  static FT_Error
+  find_unicode_charmap( FT_Face  face )
+  {
+    FT_CharMap*  first;
+    FT_CharMap*  cur;
+
+
+    /* caller should have already checked that `face' is valid */
+    FT_ASSERT( face );
+
+    first = face->charmaps;
+
+    if ( !first )
+      return FT_Err_Invalid_CharMap_Handle;
+
+    /*
+     *  The original TrueType specification(s) only specified charmap
+     *  formats that are capable of mapping 8 or 16 bit character codes to
+     *  glyph indices.
+     *
+     *  However, recent updates to the Apple and OpenType specifications
+     *  introduced new formats that are capable of mapping 32-bit character
+     *  codes as well.  And these are already used on some fonts, mainly to
+     *  map non-BMP Asian ideographs as defined in Unicode.
+     *
+     *  For compatibility purposes, these fonts generally come with
+     *  *several* Unicode charmaps:
+     *
+     *   - One of them in the "old" 16-bit format, that cannot access
+     *     all glyphs in the font.
+     *
+     *   - Another one in the "new" 32-bit format, that can access all
+     *     the glyphs.
+     *
+     *  This function has been written to always favor a 32-bit charmap
+     *  when found.  Otherwise, a 16-bit one is returned when found.
+     */
+
+    /* Since the `interesting' table, with IDs (3,10), is normally the */
+    /* last one, we loop backwards.  This loses with type1 fonts with  */
+    /* non-BMP characters (<.0001%), this wins with .ttf with non-BMP  */
+    /* chars (.01% ?), and this is the same about 99.99% of the time!  */
+
+    cur = first + face->num_charmaps;  /* points after the last one */
+
+    for ( ; --cur >= first; )
+    {
+      if ( cur[0]->encoding == FT_ENCODING_UNICODE )
+      {
+        /* XXX If some new encodings to represent UCS-4 are added, */
+        /*     they should be added here.                          */
+        if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT &&
+               cur[0]->encoding_id == TT_MS_ID_UCS_4        )     ||
+             ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE &&
+               cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32    ) )
+        {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+          if ( cur - first > FT_MAX_CHARMAP_CACHEABLE )
+          {
+            FT_ERROR(( "find_unicode_charmap: UCS-4 cmap is found "
+                       "at too late position (%d)\n", cur - first ));
+            continue;
+          }
+#endif
+          face->charmap = cur[0];
+          return FT_Err_Ok;
+        }
+      }
+    }
+
+    /* We do not have any UCS-4 charmap.                */
+    /* Do the loop again and search for UCS-2 charmaps. */
+    cur = first + face->num_charmaps;
+
+    for ( ; --cur >= first; )
+    {
+      if ( cur[0]->encoding == FT_ENCODING_UNICODE )
+      {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+        if ( cur - first > FT_MAX_CHARMAP_CACHEABLE )
+        {
+          FT_ERROR(( "find_unicode_charmap: UCS-2 cmap is found "
+                     "at too late position (%d)\n", cur - first ));
+          continue;
+        }
+#endif
+        face->charmap = cur[0];
+        return FT_Err_Ok;
+      }
+    }
+
+    return FT_Err_Invalid_CharMap_Handle;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    find_variant_selector_charmap                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function finds the variant selector charmap, if there is one. */
+  /*    There can only be one (platform=0, specific=5, format=14).         */
+  /*                                                                       */
+  static FT_CharMap
+  find_variant_selector_charmap( FT_Face  face )
+  {
+    FT_CharMap*  first;
+    FT_CharMap*  end;
+    FT_CharMap*  cur;
+
+
+    /* caller should have already checked that `face' is valid */
+    FT_ASSERT( face );
+
+    first = face->charmaps;
+
+    if ( !first )
+      return NULL;
+
+    end = first + face->num_charmaps;  /* points after the last one */
+
+    for ( cur = first; cur < end; ++cur )
+    {
+      if ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE    &&
+           cur[0]->encoding_id == TT_APPLE_ID_VARIANT_SELECTOR &&
+           FT_Get_CMap_Format( cur[0] ) == 14                  )
+      {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+        if ( cur - first > FT_MAX_CHARMAP_CACHEABLE )
+        {
+          FT_ERROR(( "find_unicode_charmap: UVS cmap is found "
+                     "at too late position (%d)\n", cur - first ));
+          continue;
+        }
+#endif
+        return cur[0];
+      }
+    }
+
+    return NULL;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    open_face                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function does some work for FT_Open_Face().                   */
+  /*                                                                       */
+  static FT_Error
+  open_face( FT_Driver      driver,
+             FT_Stream      stream,
+             FT_Long        face_index,
+             FT_Int         num_params,
+             FT_Parameter*  params,
+             FT_Face       *aface )
+  {
+    FT_Memory         memory;
+    FT_Driver_Class   clazz;
+    FT_Face           face = 0;
+    FT_Error          error, error2;
+    FT_Face_Internal  internal = NULL;
+
+
+    clazz  = driver->clazz;
+    memory = driver->root.memory;
+
+    /* allocate the face object and perform basic initialization */
+    if ( FT_ALLOC( face, clazz->face_object_size ) )
+      goto Fail;
+
+    if ( FT_NEW( internal ) )
+      goto Fail;
+
+    face->internal = internal;
+
+    face->driver   = driver;
+    face->memory   = memory;
+    face->stream   = stream;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    {
+      int  i;
+
+
+      face->internal->incremental_interface = 0;
+      for ( i = 0; i < num_params && !face->internal->incremental_interface;
+            i++ )
+        if ( params[i].tag == FT_PARAM_TAG_INCREMENTAL )
+          face->internal->incremental_interface =
+            (FT_Incremental_Interface)params[i].data;
+    }
+#endif
+
+    if ( clazz->init_face )
+      error = clazz->init_face( stream,
+                                face,
+                                (FT_Int)face_index,
+                                num_params,
+                                params );
+    if ( error )
+      goto Fail;
+
+    /* select Unicode charmap by default */
+    error2 = find_unicode_charmap( face );
+
+    /* if no Unicode charmap can be found, FT_Err_Invalid_CharMap_Handle */
+    /* is returned.                                                      */
+
+    /* no error should happen, but we want to play safe */
+    if ( error2 && error2 != FT_Err_Invalid_CharMap_Handle )
+    {
+      error = error2;
+      goto Fail;
+    }
+
+    *aface = face;
+
+  Fail:
+    if ( error )
+    {
+      destroy_charmaps( face, memory );
+      if ( clazz->done_face )
+        clazz->done_face( face );
+      FT_FREE( internal );
+      FT_FREE( face );
+      *aface = 0;
+    }
+
+    return error;
+  }
+
+
+  /* there's a Mac-specific extended implementation of FT_New_Face() */
+  /* in src/base/ftmac.c                                             */
+
+#ifndef FT_MACINTOSH
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Face( FT_Library   library,
+               const char*  pathname,
+               FT_Long      face_index,
+               FT_Face     *aface )
+  {
+    FT_Open_Args  args;
+
+
+    /* test for valid `library' and `aface' delayed to FT_Open_Face() */
+    if ( !pathname )
+      return FT_Err_Invalid_Argument;
+
+    args.flags    = FT_OPEN_PATHNAME;
+    args.pathname = (char*)pathname;
+    args.stream   = NULL;
+
+    return FT_Open_Face( library, &args, face_index, aface );
+  }
+
+#endif
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Memory_Face( FT_Library      library,
+                      const FT_Byte*  file_base,
+                      FT_Long         file_size,
+                      FT_Long         face_index,
+                      FT_Face        *aface )
+  {
+    FT_Open_Args  args;
+
+
+    /* test for valid `library' and `face' delayed to FT_Open_Face() */
+    if ( !file_base )
+      return FT_Err_Invalid_Argument;
+
+    args.flags       = FT_OPEN_MEMORY;
+    args.memory_base = file_base;
+    args.memory_size = file_size;
+    args.stream      = NULL;
+
+    return FT_Open_Face( library, &args, face_index, aface );
+  }
+
+
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+
+  /* The behavior here is very similar to that in base/ftmac.c, but it     */
+  /* is designed to work on non-mac systems, so no mac specific calls.     */
+  /*                                                                       */
+  /* We look at the file and determine if it is a mac dfont file or a mac  */
+  /* resource file, or a macbinary file containing a mac resource file.    */
+  /*                                                                       */
+  /* Unlike ftmac I'm not going to look at a `FOND'.  I don't really see   */
+  /* the point, especially since there may be multiple `FOND' resources.   */
+  /* Instead I'll just look for `sfnt' and `POST' resources, ordered as    */
+  /* they occur in the file.                                               */
+  /*                                                                       */
+  /* Note that multiple `POST' resources do not mean multiple postscript   */
+  /* fonts; they all get jammed together to make what is essentially a     */
+  /* pfb file.                                                             */
+  /*                                                                       */
+  /* We aren't interested in `NFNT' or `FONT' bitmap resources.            */
+  /*                                                                       */
+  /* As soon as we get an `sfnt' load it into memory and pass it off to    */
+  /* FT_Open_Face.                                                         */
+  /*                                                                       */
+  /* If we have a (set of) `POST' resources, massage them into a (memory)  */
+  /* pfb file and pass that to FT_Open_Face.  (As with ftmac.c I'm not     */
+  /* going to try to save the kerning info.  After all that lives in the   */
+  /* `FOND' which isn't in the file containing the `POST' resources so     */
+  /* we don't really have access to it.                                    */
+
+
+  /* Finalizer for a memory stream; gets called by FT_Done_Face(). */
+  /* It frees the memory it uses.                                  */
+  /* From ftmac.c.                                                 */
+  static void
+  memory_stream_close( FT_Stream  stream )
+  {
+    FT_Memory  memory = stream->memory;
+
+
+    FT_FREE( stream->base );
+
+    stream->size  = 0;
+    stream->base  = 0;
+    stream->close = 0;
+  }
+
+
+  /* Create a new memory stream from a buffer and a size. */
+  /* From ftmac.c.                                        */
+  static FT_Error
+  new_memory_stream( FT_Library           library,
+                     FT_Byte*             base,
+                     FT_ULong             size,
+                     FT_Stream_CloseFunc  close,
+                     FT_Stream           *astream )
+  {
+    FT_Error   error;
+    FT_Memory  memory;
+    FT_Stream  stream = NULL;
+
+
+    if ( !library )
+      return FT_Err_Invalid_Library_Handle;
+
+    if ( !base )
+      return FT_Err_Invalid_Argument;
+
+    *astream = 0;
+    memory = library->memory;
+    if ( FT_NEW( stream ) )
+      goto Exit;
+
+    FT_Stream_OpenMemory( stream, base, size );
+
+    stream->close = close;
+
+    *astream = stream;
+
+  Exit:
+    return error;
+  }
+
+
+  /* Create a new FT_Face given a buffer and a driver name. */
+  /* from ftmac.c */
+  FT_LOCAL_DEF( FT_Error )
+  open_face_from_buffer( FT_Library   library,
+                         FT_Byte*     base,
+                         FT_ULong     size,
+                         FT_Long      face_index,
+                         const char*  driver_name,
+                         FT_Face     *aface )
+  {
+    FT_Open_Args  args;
+    FT_Error      error;
+    FT_Stream     stream = NULL;
+    FT_Memory     memory = library->memory;
+
+
+    error = new_memory_stream( library,
+                               base,
+                               size,
+                               memory_stream_close,
+                               &stream );
+    if ( error )
+    {
+      FT_FREE( base );
+      return error;
+    }
+
+    args.flags = FT_OPEN_STREAM;
+    args.stream = stream;
+    if ( driver_name )
+    {
+      args.flags = args.flags | FT_OPEN_DRIVER;
+      args.driver = FT_Get_Module( library, driver_name );
+    }
+
+#ifdef FT_MACINTOSH
+    /* At this point, face_index has served its purpose;      */
+    /* whoever calls this function has already used it to     */
+    /* locate the correct font data.  We should not propagate */
+    /* this index to FT_Open_Face() (unless it is negative).  */
+
+    if ( face_index > 0 )
+      face_index = 0;
+#endif
+
+    error = FT_Open_Face( library, &args, face_index, aface );
+
+    if ( error == FT_Err_Ok )
+      (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM;
+    else
+#ifdef FT_MACINTOSH
+      FT_Stream_Free( stream, 0 );
+#else
+    {
+      FT_Stream_Close( stream );
+      FT_FREE( stream );
+    }
+#endif
+
+    return error;
+  }
+
+
+  /* Look up `TYP1' or `CID ' table from sfnt table directory.       */
+  /* `offset' and `length' must exclude the binary header in tables. */
+
+  /* Type 1 and CID-keyed font drivers should recognize sfnt-wrapped */
+  /* format too.  Here, since we can't expect that the TrueType font */
+  /* driver is loaded unconditially, we must parse the font by       */
+  /* ourselves.  We are only interested in the name of the table and */
+  /* the offset.                                                     */
+
+  static FT_Error
+  ft_lookup_PS_in_sfnt_stream( FT_Stream  stream,
+                               FT_Long    face_index,
+                               FT_ULong*  offset,
+                               FT_ULong*  length,
+                               FT_Bool*   is_sfnt_cid )
+  {
+    FT_Error   error;
+    FT_UShort  numTables;
+    FT_Long    pstable_index;
+    FT_ULong   tag;
+    int        i;
+
+
+    *offset = 0;
+    *length = 0;
+    *is_sfnt_cid = FALSE;
+
+    /* TODO: support for sfnt-wrapped PS/CID in TTC format */
+
+    /* version check for 'typ1' (should be ignored?) */
+    if ( FT_READ_ULONG( tag ) )
+      return error;
+    if ( tag != TTAG_typ1 )
+      return FT_Err_Unknown_File_Format;
+
+    if ( FT_READ_USHORT( numTables ) )
+      return error;
+    if ( FT_STREAM_SKIP( 2 * 3 ) ) /* skip binary search header */
+      return error;
+
+    pstable_index = -1;
+    *is_sfnt_cid  = FALSE;
+
+    for ( i = 0; i < numTables; i++ )
+    {
+      if ( FT_READ_ULONG( tag )     || FT_STREAM_SKIP( 4 )      ||
+           FT_READ_ULONG( *offset ) || FT_READ_ULONG( *length ) )
+        return error;
+
+      if ( tag == TTAG_CID )
+      {
+        pstable_index++;
+        *offset += 22;
+        *length -= 22;
+        *is_sfnt_cid = TRUE;
+        if ( face_index < 0 )
+          return FT_Err_Ok;
+      }
+      else if ( tag == TTAG_TYP1 )
+      {
+        pstable_index++;
+        *offset += 24;
+        *length -= 24;
+        *is_sfnt_cid = FALSE;
+        if ( face_index < 0 )
+          return FT_Err_Ok;
+      }
+      if ( face_index >= 0 && pstable_index == face_index )
+        return FT_Err_Ok;
+    }
+    return FT_Err_Table_Missing;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  open_face_PS_from_sfnt_stream( FT_Library     library,
+                                 FT_Stream      stream,
+                                 FT_Long        face_index,
+                                 FT_Int         num_params,
+                                 FT_Parameter  *params,
+                                 FT_Face       *aface )
+  {
+    FT_Error   error;
+    FT_Memory  memory = library->memory;
+    FT_ULong   offset, length;
+    FT_Long    pos;
+    FT_Bool    is_sfnt_cid;
+    FT_Byte*   sfnt_ps = NULL;
+
+    FT_UNUSED( num_params );
+    FT_UNUSED( params );
+
+
+    pos = FT_Stream_Pos( stream );
+
+    error = ft_lookup_PS_in_sfnt_stream( stream,
+                                         face_index,
+                                         &offset,
+                                         &length,
+                                         &is_sfnt_cid );
+    if ( error )
+      goto Exit;
+
+    if ( FT_Stream_Seek( stream, pos + offset ) )
+      goto Exit;
+
+    if ( FT_ALLOC( sfnt_ps, (FT_Long)length ) )
+      goto Exit;
+
+    error = FT_Stream_Read( stream, (FT_Byte *)sfnt_ps, length );
+    if ( error )
+      goto Exit;
+
+    error = open_face_from_buffer( library,
+                                   sfnt_ps,
+                                   length,
+                                   face_index < 0 ? face_index : 0,
+                                   is_sfnt_cid ? "cid" : "type1",
+                                   aface );
+  Exit:
+    {
+      FT_Error  error1;
+
+
+      if ( error == FT_Err_Unknown_File_Format )
+      {
+        error1 = FT_Stream_Seek( stream, pos );
+        if ( error1 )
+          return error1;
+      }
+
+      return error;
+    }
+  }
+
+
+#ifndef FT_MACINTOSH
+
+  /* The resource header says we've got resource_cnt `POST' (type1) */
+  /* resources in this file.  They all need to be coalesced into    */
+  /* one lump which gets passed on to the type1 driver.             */
+  /* Here can be only one PostScript font in a file so face_index   */
+  /* must be 0 (or -1).                                             */
+  /*                                                                */
+  static FT_Error
+  Mac_Read_POST_Resource( FT_Library  library,
+                          FT_Stream   stream,
+                          FT_Long    *offsets,
+                          FT_Long     resource_cnt,
+                          FT_Long     face_index,
+                          FT_Face    *aface )
+  {
+    FT_Error   error  = FT_Err_Cannot_Open_Resource;
+    FT_Memory  memory = library->memory;
+    FT_Byte*   pfb_data = NULL;
+    int        i, type, flags;
+    FT_Long    len;
+    FT_Long    pfb_len, pfb_pos, pfb_lenpos;
+    FT_Long    rlen, temp;
+
+
+    if ( face_index == -1 )
+      face_index = 0;
+    if ( face_index != 0 )
+      return error;
+
+    /* Find the length of all the POST resources, concatenated.  Assume */
+    /* worst case (each resource in its own section).                   */
+    pfb_len = 0;
+    for ( i = 0; i < resource_cnt; ++i )
+    {
+      error = FT_Stream_Seek( stream, offsets[i] );
+      if ( error )
+        goto Exit;
+      if ( FT_READ_LONG( temp ) )
+        goto Exit;
+      pfb_len += temp + 6;
+    }
+
+    if ( FT_ALLOC( pfb_data, (FT_Long)pfb_len + 2 ) )
+      goto Exit;
+
+    pfb_data[0] = 0x80;
+    pfb_data[1] = 1;            /* Ascii section */
+    pfb_data[2] = 0;            /* 4-byte length, fill in later */
+    pfb_data[3] = 0;
+    pfb_data[4] = 0;
+    pfb_data[5] = 0;
+    pfb_pos     = 6;
+    pfb_lenpos  = 2;
+
+    len = 0;
+    type = 1;
+    for ( i = 0; i < resource_cnt; ++i )
+    {
+      error = FT_Stream_Seek( stream, offsets[i] );
+      if ( error )
+        goto Exit2;
+      if ( FT_READ_LONG( rlen ) )
+        goto Exit;
+      if ( FT_READ_USHORT( flags ) )
+        goto Exit;
+      FT_TRACE3(( "POST fragment[%d]: offsets=0x%08x, rlen=0x%08x, flags=0x%04x\n",
+                   i, offsets[i], rlen, flags ));
+
+      /* postpone the check of rlen longer than buffer until FT_Stream_Read() */
+      if ( ( flags >> 8 ) == 0 )        /* Comment, should not be loaded */
+        continue;
+
+      /* the flags are part of the resource, so rlen >= 2.  */
+      /* but some fonts declare rlen = 0 for empty fragment */
+      if ( rlen > 2 )
+        rlen -= 2;
+      else
+        rlen = 0;
+
+      if ( ( flags >> 8 ) == type )
+        len += rlen;
+      else
+      {
+        if ( pfb_lenpos + 3 > pfb_len + 2 )
+          goto Exit2;
+        pfb_data[pfb_lenpos    ] = (FT_Byte)( len );
+        pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 );
+        pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 );
+        pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 );
+
+        if ( ( flags >> 8 ) == 5 )      /* End of font mark */
+          break;
+
+        if ( pfb_pos + 6 > pfb_len + 2 )
+          goto Exit2;
+        pfb_data[pfb_pos++] = 0x80;
+
+        type = flags >> 8;
+        len = rlen;
+
+        pfb_data[pfb_pos++] = (FT_Byte)type;
+        pfb_lenpos          = pfb_pos;
+        pfb_data[pfb_pos++] = 0;        /* 4-byte length, fill in later */
+        pfb_data[pfb_pos++] = 0;
+        pfb_data[pfb_pos++] = 0;
+        pfb_data[pfb_pos++] = 0;
+      }
+
+      error = FT_Err_Cannot_Open_Resource;
+      if ( pfb_pos > pfb_len || pfb_pos + rlen > pfb_len )
+        goto Exit2;
+
+      error = FT_Stream_Read( stream, (FT_Byte *)pfb_data + pfb_pos, rlen );
+      if ( error )
+        goto Exit2;
+      pfb_pos += rlen;
+    }
+
+    if ( pfb_pos + 2 > pfb_len + 2 )
+      goto Exit2;
+    pfb_data[pfb_pos++] = 0x80;
+    pfb_data[pfb_pos++] = 3;
+
+    if ( pfb_lenpos + 3 > pfb_len + 2 )
+      goto Exit2;
+    pfb_data[pfb_lenpos    ] = (FT_Byte)( len );
+    pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 );
+    pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 );
+    pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 );
+
+    return open_face_from_buffer( library,
+                                  pfb_data,
+                                  pfb_pos,
+                                  face_index,
+                                  "type1",
+                                  aface );
+
+  Exit2:
+    FT_FREE( pfb_data );
+
+  Exit:
+    return error;
+  }
+
+
+  /* The resource header says we've got resource_cnt `sfnt'      */
+  /* (TrueType/OpenType) resources in this file.  Look through   */
+  /* them for the one indicated by face_index, load it into mem, */
+  /* pass it on the the truetype driver and return it.           */
+  /*                                                             */
+  static FT_Error
+  Mac_Read_sfnt_Resource( FT_Library  library,
+                          FT_Stream   stream,
+                          FT_Long    *offsets,
+                          FT_Long     resource_cnt,
+                          FT_Long     face_index,
+                          FT_Face    *aface )
+  {
+    FT_Memory  memory = library->memory;
+    FT_Byte*   sfnt_data = NULL;
+    FT_Error   error;
+    FT_Long    flag_offset;
+    FT_Long    rlen;
+    int        is_cff;
+    FT_Long    face_index_in_resource = 0;
+
+
+    if ( face_index == -1 )
+      face_index = 0;
+    if ( face_index >= resource_cnt )
+      return FT_Err_Cannot_Open_Resource;
+
+    flag_offset = offsets[face_index];
+    error = FT_Stream_Seek( stream, flag_offset );
+    if ( error )
+      goto Exit;
+
+    if ( FT_READ_LONG( rlen ) )
+      goto Exit;
+    if ( rlen == -1 )
+      return FT_Err_Cannot_Open_Resource;
+
+    error = open_face_PS_from_sfnt_stream( library,
+                                           stream,
+                                           face_index,
+                                           0, NULL,
+                                           aface );
+    if ( !error )
+      goto Exit;
+
+    /* rewind sfnt stream before open_face_PS_from_sfnt_stream() */
+    if ( FT_Stream_Seek( stream, flag_offset + 4 ) )
+      goto Exit;
+
+    if ( FT_ALLOC( sfnt_data, (FT_Long)rlen ) )
+      return error;
+    error = FT_Stream_Read( stream, (FT_Byte *)sfnt_data, rlen );
+    if ( error )
+      goto Exit;
+
+    is_cff = rlen > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 );
+    error = open_face_from_buffer( library,
+                                   sfnt_data,
+                                   rlen,
+                                   face_index_in_resource,
+                                   is_cff ? "cff" : "truetype",
+                                   aface );
+
+  Exit:
+    return error;
+  }
+
+
+  /* Check for a valid resource fork header, or a valid dfont    */
+  /* header.  In a resource fork the first 16 bytes are repeated */
+  /* at the location specified by bytes 4-7.  In a dfont bytes   */
+  /* 4-7 point to 16 bytes of zeroes instead.                    */
+  /*                                                             */
+  static FT_Error
+  IsMacResource( FT_Library  library,
+                 FT_Stream   stream,
+                 FT_Long     resource_offset,
+                 FT_Long     face_index,
+                 FT_Face    *aface )
+  {
+    FT_Memory  memory = library->memory;
+    FT_Error   error;
+    FT_Long    map_offset, rdara_pos;
+    FT_Long    *data_offsets;
+    FT_Long    count;
+
+
+    error = FT_Raccess_Get_HeaderInfo( library, stream, resource_offset,
+                                       &map_offset, &rdara_pos );
+    if ( error )
+      return error;
+
+    error = FT_Raccess_Get_DataOffsets( library, stream,
+                                        map_offset, rdara_pos,
+                                        TTAG_POST,
+                                        &data_offsets, &count );
+    if ( !error )
+    {
+      error = Mac_Read_POST_Resource( library, stream, data_offsets, count,
+                                      face_index, aface );
+      FT_FREE( data_offsets );
+      /* POST exists in an LWFN providing a single face */
+      if ( !error )
+        (*aface)->num_faces = 1;
+      return error;
+    }
+
+    error = FT_Raccess_Get_DataOffsets( library, stream,
+                                        map_offset, rdara_pos,
+                                        TTAG_sfnt,
+                                        &data_offsets, &count );
+    if ( !error )
+    {
+      FT_Long  face_index_internal = face_index % count;
+
+
+      error = Mac_Read_sfnt_Resource( library, stream, data_offsets, count,
+                                      face_index_internal, aface );
+      FT_FREE( data_offsets );
+      if ( !error )
+        (*aface)->num_faces = count;
+    }
+
+    return error;
+  }
+
+
+  /* Check for a valid macbinary header, and if we find one   */
+  /* check that the (flattened) resource fork in it is valid. */
+  /*                                                          */
+  static FT_Error
+  IsMacBinary( FT_Library  library,
+               FT_Stream   stream,
+               FT_Long     face_index,
+               FT_Face    *aface )
+  {
+    unsigned char  header[128];
+    FT_Error       error;
+    FT_Long        dlen, offset;
+
+
+    if ( NULL == stream )
+      return FT_Err_Invalid_Stream_Operation;
+
+    error = FT_Stream_Seek( stream, 0 );
+    if ( error )
+      goto Exit;
+
+    error = FT_Stream_Read( stream, (FT_Byte*)header, 128 );
+    if ( error )
+      goto Exit;
+
+    if (            header[ 0] !=  0 ||
+                    header[74] !=  0 ||
+                    header[82] !=  0 ||
+                    header[ 1] ==  0 ||
+                    header[ 1] >  33 ||
+                    header[63] !=  0 ||
+         header[2 + header[1]] !=  0 )
+      return FT_Err_Unknown_File_Format;
+
+    dlen = ( header[0x53] << 24 ) |
+           ( header[0x54] << 16 ) |
+           ( header[0x55] <<  8 ) |
+             header[0x56];
+#if 0
+    rlen = ( header[0x57] << 24 ) |
+           ( header[0x58] << 16 ) |
+           ( header[0x59] <<  8 ) |
+             header[0x5a];
+#endif /* 0 */
+    offset = 128 + ( ( dlen + 127 ) & ~127 );
+
+    return IsMacResource( library, stream, offset, face_index, aface );
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  load_face_in_embedded_rfork( FT_Library           library,
+                               FT_Stream            stream,
+                               FT_Long              face_index,
+                               FT_Face             *aface,
+                               const FT_Open_Args  *args )
+  {
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_raccess
+
+    FT_Memory  memory = library->memory;
+    FT_Error   error  = FT_Err_Unknown_File_Format;
+    int        i;
+
+    char *     file_names[FT_RACCESS_N_RULES];
+    FT_Long    offsets[FT_RACCESS_N_RULES];
+    FT_Error   errors[FT_RACCESS_N_RULES];
+    FT_Bool    is_darwin_vfs, vfs_rfork_has_no_font = FALSE; /* not tested */
+
+    FT_Open_Args  args2;
+    FT_Stream     stream2 = 0;
+
+
+    FT_Raccess_Guess( library, stream,
+                      args->pathname, file_names, offsets, errors );
+
+    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
+    {
+      is_darwin_vfs = ft_raccess_rule_by_darwin_vfs( library, i );
+      if ( is_darwin_vfs && vfs_rfork_has_no_font )
+      {
+        FT_TRACE3(( "Skip rule %d: darwin vfs resource fork"
+                    " is already checked and"
+                    " no font is found\n", i ));
+        continue;
+      }
+
+      if ( errors[i] )
+      {
+        FT_TRACE3(( "Error[%d] has occurred in rule %d\n", errors[i], i ));
+        continue;
+      }
+
+      args2.flags    = FT_OPEN_PATHNAME;
+      args2.pathname = file_names[i] ? file_names[i] : args->pathname;
+
+      FT_TRACE3(( "Try rule %d: %s (offset=%d) ...",
+                  i, args2.pathname, offsets[i] ));
+
+      error = FT_Stream_New( library, &args2, &stream2 );
+      if ( is_darwin_vfs && error == FT_Err_Cannot_Open_Stream )
+        vfs_rfork_has_no_font = TRUE;
+
+      if ( error )
+      {
+        FT_TRACE3(( "failed\n" ));
+        continue;
+      }
+
+      error = IsMacResource( library, stream2, offsets[i],
+                             face_index, aface );
+      FT_Stream_Free( stream2, 0 );
+
+      FT_TRACE3(( "%s\n", error ? "failed": "successful" ));
+
+      if ( !error )
+          break;
+      else if ( is_darwin_vfs )
+          vfs_rfork_has_no_font = TRUE;
+    }
+
+    for (i = 0; i < FT_RACCESS_N_RULES; i++)
+    {
+      if ( file_names[i] )
+        FT_FREE( file_names[i] );
+    }
+
+    /* Caller (load_mac_face) requires FT_Err_Unknown_File_Format. */
+    if ( error )
+      error = FT_Err_Unknown_File_Format;
+
+    return error;
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_objs
+
+  }
+
+
+  /* Check for some macintosh formats without Carbon framework.    */
+  /* Is this a macbinary file?  If so look at the resource fork.   */
+  /* Is this a mac dfont file?                                     */
+  /* Is this an old style resource fork? (in data)                 */
+  /* Else call load_face_in_embedded_rfork to try extra rules      */
+  /* (defined in `ftrfork.c').                                     */
+  /*                                                               */
+  static FT_Error
+  load_mac_face( FT_Library           library,
+                 FT_Stream            stream,
+                 FT_Long              face_index,
+                 FT_Face             *aface,
+                 const FT_Open_Args  *args )
+  {
+    FT_Error error;
+    FT_UNUSED( args );
+
+
+    error = IsMacBinary( library, stream, face_index, aface );
+    if ( FT_ERROR_BASE( error ) == FT_Err_Unknown_File_Format )
+    {
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_raccess
+
+      FT_TRACE3(( "Try as dfont: %s ...", args->pathname ));
+
+      error = IsMacResource( library, stream, 0, face_index, aface );
+
+      FT_TRACE3(( "%s\n", error ? "failed" : "successful" ));
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_objs
+
+    }
+
+    if ( ( FT_ERROR_BASE( error ) == FT_Err_Unknown_File_Format      ||
+           FT_ERROR_BASE( error ) == FT_Err_Invalid_Stream_Operation ) &&
+         ( args->flags & FT_OPEN_PATHNAME )                            )
+      error = load_face_in_embedded_rfork( library, stream,
+                                           face_index, aface, args );
+    return error;
+  }
+#endif
+
+#endif  /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Open_Face( FT_Library           library,
+                const FT_Open_Args*  args,
+                FT_Long              face_index,
+                FT_Face             *aface )
+  {
+    FT_Error     error;
+    FT_Driver    driver;
+    FT_Memory    memory;
+    FT_Stream    stream = NULL;
+    FT_Face      face   = NULL;
+    FT_ListNode  node   = NULL;
+    FT_Bool      external_stream;
+    FT_Module*   cur;
+    FT_Module*   limit;
+
+
+    /* test for valid `library' delayed to */
+    /* FT_Stream_New()                     */
+
+    if ( ( !aface && face_index >= 0 ) || !args )
+      return FT_Err_Invalid_Argument;
+
+    external_stream = FT_BOOL( ( args->flags & FT_OPEN_STREAM ) &&
+                               args->stream                     );
+
+    /* create input stream */
+    error = FT_Stream_New( library, args, &stream );
+    if ( error )
+      goto Fail3;
+
+    memory = library->memory;
+
+    /* If the font driver is specified in the `args' structure, use */
+    /* it.  Otherwise, we scan the list of registered drivers.      */
+    if ( ( args->flags & FT_OPEN_DRIVER ) && args->driver )
+    {
+      driver = FT_DRIVER( args->driver );
+
+      /* not all modules are drivers, so check... */
+      if ( FT_MODULE_IS_DRIVER( driver ) )
+      {
+        FT_Int         num_params = 0;
+        FT_Parameter*  params     = 0;
+
+
+        if ( args->flags & FT_OPEN_PARAMS )
+        {
+          num_params = args->num_params;
+          params     = args->params;
+        }
+
+        error = open_face( driver, stream, face_index,
+                           num_params, params, &face );
+        if ( !error )
+          goto Success;
+      }
+      else
+        error = FT_Err_Invalid_Handle;
+
+      FT_Stream_Free( stream, external_stream );
+      goto Fail;
+    }
+    else
+    {
+      /* check each font driver for an appropriate format */
+      cur   = library->modules;
+      limit = cur + library->num_modules;
+
+
+      for ( ; cur < limit; cur++ )
+      {
+        /* not all modules are font drivers, so check... */
+        if ( FT_MODULE_IS_DRIVER( cur[0] ) )
+        {
+          FT_Int         num_params = 0;
+          FT_Parameter*  params     = 0;
+
+
+          driver = FT_DRIVER( cur[0] );
+
+          if ( args->flags & FT_OPEN_PARAMS )
+          {
+            num_params = args->num_params;
+            params     = args->params;
+          }
+
+          error = open_face( driver, stream, face_index,
+                             num_params, params, &face );
+          if ( !error )
+            goto Success;
+
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+          if ( ft_strcmp( cur[0]->clazz->module_name, "truetype" ) == 0 &&
+               FT_ERROR_BASE( error ) == FT_Err_Table_Missing           )
+          {
+            /* TrueType but essential tables are missing */
+            if ( FT_Stream_Seek( stream, 0 ) )
+              break;
+
+            error = open_face_PS_from_sfnt_stream( library,
+                                                   stream,
+                                                   face_index,
+                                                   num_params,
+                                                   params,
+                                                   aface );
+            if ( !error )
+            {
+              FT_Stream_Free( stream, external_stream );
+              return error;
+            }
+          }
+#endif
+
+          if ( FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format )
+            goto Fail3;
+        }
+      }
+
+  Fail3:
+    /* If we are on the mac, and we get an FT_Err_Invalid_Stream_Operation */
+    /* it may be because we have an empty data fork, so we need to check   */
+    /* the resource fork.                                                  */
+    if ( FT_ERROR_BASE( error ) != FT_Err_Cannot_Open_Stream       &&
+         FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format      &&
+         FT_ERROR_BASE( error ) != FT_Err_Invalid_Stream_Operation )
+      goto Fail2;
+
+#if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS )
+    error = load_mac_face( library, stream, face_index, aface, args );
+    if ( !error )
+    {
+      /* We don't want to go to Success here.  We've already done that. */
+      /* On the other hand, if we succeeded we still need to close this */
+      /* stream (we opened a different stream which extracted the       */
+      /* interesting information out of this stream here.  That stream  */
+      /* will still be open and the face will point to it).             */
+      FT_Stream_Free( stream, external_stream );
+      return error;
+    }
+
+    if ( FT_ERROR_BASE( error ) != FT_Err_Unknown_File_Format )
+      goto Fail2;
+#endif  /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */
+
+      /* no driver is able to handle this format */
+      error = FT_Err_Unknown_File_Format;
+
+  Fail2:
+      FT_Stream_Free( stream, external_stream );
+      goto Fail;
+    }
+
+  Success:
+    FT_TRACE4(( "FT_Open_Face: New face object, adding to list\n" ));
+
+    /* set the FT_FACE_FLAG_EXTERNAL_STREAM bit for FT_Done_Face */
+    if ( external_stream )
+      face->face_flags |= FT_FACE_FLAG_EXTERNAL_STREAM;
+
+    /* add the face object to its driver's list */
+    if ( FT_NEW( node ) )
+      goto Fail;
+
+    node->data = face;
+    /* don't assume driver is the same as face->driver, so use */
+    /* face->driver instead.                                   */
+    FT_List_Add( &face->driver->faces_list, node );
+
+    /* now allocate a glyph slot object for the face */
+    FT_TRACE4(( "FT_Open_Face: Creating glyph slot\n" ));
+
+    if ( face_index >= 0 )
+    {
+      error = FT_New_GlyphSlot( face, NULL );
+      if ( error )
+        goto Fail;
+
+      /* finally, allocate a size object for the face */
+      {
+        FT_Size  size;
+
+
+        FT_TRACE4(( "FT_Open_Face: Creating size object\n" ));
+
+        error = FT_New_Size( face, &size );
+        if ( error )
+          goto Fail;
+
+        face->size = size;
+      }
+    }
+
+    /* some checks */
+
+    if ( FT_IS_SCALABLE( face ) )
+    {
+      if ( face->height < 0 )
+        face->height = (FT_Short)-face->height;
+
+      if ( !FT_HAS_VERTICAL( face ) )
+        face->max_advance_height = (FT_Short)face->height;
+    }
+
+    if ( FT_HAS_FIXED_SIZES( face ) )
+    {
+      FT_Int  i;
+
+
+      for ( i = 0; i < face->num_fixed_sizes; i++ )
+      {
+        FT_Bitmap_Size*  bsize = face->available_sizes + i;
+
+
+        if ( bsize->height < 0 )
+          bsize->height = (FT_Short)-bsize->height;
+        if ( bsize->x_ppem < 0 )
+          bsize->x_ppem = (FT_Short)-bsize->x_ppem;
+        if ( bsize->y_ppem < 0 )
+          bsize->y_ppem = -bsize->y_ppem;
+      }
+    }
+
+    /* initialize internal face data */
+    {
+      FT_Face_Internal  internal = face->internal;
+
+
+      internal->transform_matrix.xx = 0x10000L;
+      internal->transform_matrix.xy = 0;
+      internal->transform_matrix.yx = 0;
+      internal->transform_matrix.yy = 0x10000L;
+
+      internal->transform_delta.x = 0;
+      internal->transform_delta.y = 0;
+
+      internal->refcount = 1;
+    }
+
+    if ( aface )
+      *aface = face;
+    else
+      FT_Done_Face( face );
+
+    goto Exit;
+
+  Fail:
+    FT_Done_Face( face );
+
+  Exit:
+    FT_TRACE4(( "FT_Open_Face: Return %d\n", error ));
+
+    return error;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Attach_File( FT_Face      face,
+                  const char*  filepathname )
+  {
+    FT_Open_Args  open;
+
+
+    /* test for valid `face' delayed to FT_Attach_Stream() */
+
+    if ( !filepathname )
+      return FT_Err_Invalid_Argument;
+
+    open.stream   = NULL;
+    open.flags    = FT_OPEN_PATHNAME;
+    open.pathname = (char*)filepathname;
+
+    return FT_Attach_Stream( face, &open );
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Attach_Stream( FT_Face        face,
+                    FT_Open_Args*  parameters )
+  {
+    FT_Stream  stream;
+    FT_Error   error;
+    FT_Driver  driver;
+
+    FT_Driver_Class  clazz;
+
+
+    /* test for valid `parameters' delayed to FT_Stream_New() */
+
+    if ( !face )
+      return FT_Err_Invalid_Face_Handle;
+
+    driver = face->driver;
+    if ( !driver )
+      return FT_Err_Invalid_Driver_Handle;
+
+    error = FT_Stream_New( driver->root.library, parameters, &stream );
+    if ( error )
+      goto Exit;
+
+    /* we implement FT_Attach_Stream in each driver through the */
+    /* `attach_file' interface                                  */
+
+    error = FT_Err_Unimplemented_Feature;
+    clazz = driver->clazz;
+    if ( clazz->attach_file )
+      error = clazz->attach_file( face, stream );
+
+    /* close the attached stream */
+    FT_Stream_Free( stream,
+                    (FT_Bool)( parameters->stream &&
+                               ( parameters->flags & FT_OPEN_STREAM ) ) );
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Reference_Face( FT_Face  face )
+  {
+    face->internal->refcount++;
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Done_Face( FT_Face  face )
+  {
+    FT_Error     error;
+    FT_Driver    driver;
+    FT_Memory    memory;
+    FT_ListNode  node;
+
+
+    error = FT_Err_Invalid_Face_Handle;
+    if ( face && face->driver )
+    {
+      face->internal->refcount--;
+      if ( face->internal->refcount > 0 )
+        error = FT_Err_Ok;
+      else
+      {
+        driver = face->driver;
+        memory = driver->root.memory;
+
+        /* find face in driver's list */
+        node = FT_List_Find( &driver->faces_list, face );
+        if ( node )
+        {
+          /* remove face object from the driver's list */
+          FT_List_Remove( &driver->faces_list, node );
+          FT_FREE( node );
+
+          /* now destroy the object proper */
+          destroy_face( memory, face, driver );
+          error = FT_Err_Ok;
+        }
+      }
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Size( FT_Face   face,
+               FT_Size  *asize )
+  {
+    FT_Error         error;
+    FT_Memory        memory;
+    FT_Driver        driver;
+    FT_Driver_Class  clazz;
+
+    FT_Size          size = 0;
+    FT_ListNode      node = 0;
+
+
+    if ( !face )
+      return FT_Err_Invalid_Face_Handle;
+
+    if ( !asize )
+      return FT_Err_Invalid_Size_Handle;
+
+    if ( !face->driver )
+      return FT_Err_Invalid_Driver_Handle;
+
+    *asize = 0;
+
+    driver = face->driver;
+    clazz  = driver->clazz;
+    memory = face->memory;
+
+    /* Allocate new size object and perform basic initialisation */
+    if ( FT_ALLOC( size, clazz->size_object_size ) || FT_NEW( node ) )
+      goto Exit;
+
+    size->face = face;
+
+    /* for now, do not use any internal fields in size objects */
+    size->internal = 0;
+
+    if ( clazz->init_size )
+      error = clazz->init_size( size );
+
+    /* in case of success, add to the face's list */
+    if ( !error )
+    {
+      *asize     = size;
+      node->data = size;
+      FT_List_Add( &face->sizes_list, node );
+    }
+
+  Exit:
+    if ( error )
+    {
+      FT_FREE( node );
+      FT_FREE( size );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Done_Size( FT_Size  size )
+  {
+    FT_Error     error;
+    FT_Driver    driver;
+    FT_Memory    memory;
+    FT_Face      face;
+    FT_ListNode  node;
+
+
+    if ( !size )
+      return FT_Err_Invalid_Size_Handle;
+
+    face = size->face;
+    if ( !face )
+      return FT_Err_Invalid_Face_Handle;
+
+    driver = face->driver;
+    if ( !driver )
+      return FT_Err_Invalid_Driver_Handle;
+
+    memory = driver->root.memory;
+
+    error = FT_Err_Ok;
+    node  = FT_List_Find( &face->sizes_list, size );
+    if ( node )
+    {
+      FT_List_Remove( &face->sizes_list, node );
+      FT_FREE( node );
+
+      if ( face->size == size )
+      {
+        face->size = 0;
+        if ( face->sizes_list.head )
+          face->size = (FT_Size)(face->sizes_list.head->data);
+      }
+
+      destroy_size( memory, size, driver );
+    }
+    else
+      error = FT_Err_Invalid_Size_Handle;
+
+    return error;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( FT_Error )
+  FT_Match_Size( FT_Face          face,
+                 FT_Size_Request  req,
+                 FT_Bool          ignore_width,
+                 FT_ULong*        size_index )
+  {
+    FT_Int   i;
+    FT_Long  w, h;
+
+
+    if ( !FT_HAS_FIXED_SIZES( face ) )
+      return FT_Err_Invalid_Face_Handle;
+
+    /* FT_Bitmap_Size doesn't provide enough info... */
+    if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL )
+      return FT_Err_Unimplemented_Feature;
+
+    w = FT_REQUEST_WIDTH ( req );
+    h = FT_REQUEST_HEIGHT( req );
+
+    if ( req->width && !req->height )
+      h = w;
+    else if ( !req->width && req->height )
+      w = h;
+
+    w = FT_PIX_ROUND( w );
+    h = FT_PIX_ROUND( h );
+
+    for ( i = 0; i < face->num_fixed_sizes; i++ )
+    {
+      FT_Bitmap_Size*  bsize = face->available_sizes + i;
+
+
+      if ( h != FT_PIX_ROUND( bsize->y_ppem ) )
+        continue;
+
+      if ( w == FT_PIX_ROUND( bsize->x_ppem ) || ignore_width )
+      {
+        if ( size_index )
+          *size_index = (FT_ULong)i;
+
+        return FT_Err_Ok;
+      }
+    }
+
+    return FT_Err_Invalid_Pixel_Size;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( void )
+  ft_synthesize_vertical_metrics( FT_Glyph_Metrics*  metrics,
+                                  FT_Pos             advance )
+  {
+    FT_Pos  height = metrics->height;
+
+
+    /* compensate for glyph with bbox above/below the baseline */
+    if ( metrics->horiBearingY < 0 )
+    {
+      if ( height < metrics->horiBearingY )
+        height = metrics->horiBearingY;
+    }
+    else if ( metrics->horiBearingY > 0 )
+      height -= metrics->horiBearingY;
+
+    /* the factor 1.2 is a heuristical value */
+    if ( !advance )
+      advance = height * 12 / 10;
+
+    metrics->vertBearingX = metrics->horiBearingX - metrics->horiAdvance / 2;
+    metrics->vertBearingY = ( advance - height ) / 2;
+    metrics->vertAdvance  = advance;
+  }
+
+
+  static void
+  ft_recompute_scaled_metrics( FT_Face           face,
+                               FT_Size_Metrics*  metrics )
+  {
+    /* Compute root ascender, descender, test height, and max_advance */
+
+#ifdef GRID_FIT_METRICS
+    metrics->ascender    = FT_PIX_CEIL( FT_MulFix( face->ascender,
+                                                   metrics->y_scale ) );
+
+    metrics->descender   = FT_PIX_FLOOR( FT_MulFix( face->descender,
+                                                    metrics->y_scale ) );
+
+    metrics->height      = FT_PIX_ROUND( FT_MulFix( face->height,
+                                                    metrics->y_scale ) );
+
+    metrics->max_advance = FT_PIX_ROUND( FT_MulFix( face->max_advance_width,
+                                                    metrics->x_scale ) );
+#else /* !GRID_FIT_METRICS */
+    metrics->ascender    = FT_MulFix( face->ascender,
+                                      metrics->y_scale );
+
+    metrics->descender   = FT_MulFix( face->descender,
+                                      metrics->y_scale );
+
+    metrics->height      = FT_MulFix( face->height,
+                                      metrics->y_scale );
+
+    metrics->max_advance = FT_MulFix( face->max_advance_width,
+                                      metrics->x_scale );
+#endif /* !GRID_FIT_METRICS */
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Select_Metrics( FT_Face   face,
+                     FT_ULong  strike_index )
+  {
+    FT_Size_Metrics*  metrics;
+    FT_Bitmap_Size*   bsize;
+
+
+    metrics = &face->size->metrics;
+    bsize   = face->available_sizes + strike_index;
+
+    metrics->x_ppem = (FT_UShort)( ( bsize->x_ppem + 32 ) >> 6 );
+    metrics->y_ppem = (FT_UShort)( ( bsize->y_ppem + 32 ) >> 6 );
+
+    if ( FT_IS_SCALABLE( face ) )
+    {
+      metrics->x_scale = FT_DivFix( bsize->x_ppem,
+                                    face->units_per_EM );
+      metrics->y_scale = FT_DivFix( bsize->y_ppem,
+                                    face->units_per_EM );
+
+      ft_recompute_scaled_metrics( face, metrics );
+    }
+    else
+    {
+      metrics->x_scale     = 1L << 16;
+      metrics->y_scale     = 1L << 16;
+      metrics->ascender    = bsize->y_ppem;
+      metrics->descender   = 0;
+      metrics->height      = bsize->height << 6;
+      metrics->max_advance = bsize->x_ppem;
+    }
+
+    FT_TRACE5(( "FT_Select_Metrics:\n" ));
+    FT_TRACE5(( "  x scale: %d (%f)\n",
+                metrics->x_scale, metrics->x_scale / 65536.0 ));
+    FT_TRACE5(( "  y scale: %d (%f)\n",
+                metrics->y_scale, metrics->y_scale / 65536.0 ));
+    FT_TRACE5(( "  ascender: %f\n",    metrics->ascender / 64.0 ));
+    FT_TRACE5(( "  descender: %f\n",   metrics->descender / 64.0 ));
+    FT_TRACE5(( "  height: %f\n",      metrics->height / 64.0 ));
+    FT_TRACE5(( "  max advance: %f\n", metrics->max_advance / 64.0 ));
+    FT_TRACE5(( "  x ppem: %d\n",      metrics->x_ppem ));
+    FT_TRACE5(( "  y ppem: %d\n",      metrics->y_ppem ));
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Request_Metrics( FT_Face          face,
+                      FT_Size_Request  req )
+  {
+    FT_Size_Metrics*  metrics;
+
+
+    metrics = &face->size->metrics;
+
+    if ( FT_IS_SCALABLE( face ) )
+    {
+      FT_Long  w = 0, h = 0, scaled_w = 0, scaled_h = 0;
+
+
+      switch ( req->type )
+      {
+      case FT_SIZE_REQUEST_TYPE_NOMINAL:
+        w = h = face->units_per_EM;
+        break;
+
+      case FT_SIZE_REQUEST_TYPE_REAL_DIM:
+        w = h = face->ascender - face->descender;
+        break;
+
+      case FT_SIZE_REQUEST_TYPE_BBOX:
+        w = face->bbox.xMax - face->bbox.xMin;
+        h = face->bbox.yMax - face->bbox.yMin;
+        break;
+
+      case FT_SIZE_REQUEST_TYPE_CELL:
+        w = face->max_advance_width;
+        h = face->ascender - face->descender;
+        break;
+
+      case FT_SIZE_REQUEST_TYPE_SCALES:
+        metrics->x_scale = (FT_Fixed)req->width;
+        metrics->y_scale = (FT_Fixed)req->height;
+        if ( !metrics->x_scale )
+          metrics->x_scale = metrics->y_scale;
+        else if ( !metrics->y_scale )
+          metrics->y_scale = metrics->x_scale;
+        goto Calculate_Ppem;
+
+      case FT_SIZE_REQUEST_TYPE_MAX:
+        break;
+      }
+
+      /* to be on the safe side */
+      if ( w < 0 )
+        w = -w;
+
+      if ( h < 0 )
+        h = -h;
+
+      scaled_w = FT_REQUEST_WIDTH ( req );
+      scaled_h = FT_REQUEST_HEIGHT( req );
+
+      /* determine scales */
+      if ( req->width )
+      {
+        metrics->x_scale = FT_DivFix( scaled_w, w );
+
+        if ( req->height )
+        {
+          metrics->y_scale = FT_DivFix( scaled_h, h );
+
+          if ( req->type == FT_SIZE_REQUEST_TYPE_CELL )
+          {
+            if ( metrics->y_scale > metrics->x_scale )
+              metrics->y_scale = metrics->x_scale;
+            else
+              metrics->x_scale = metrics->y_scale;
+          }
+        }
+        else
+        {
+          metrics->y_scale = metrics->x_scale;
+          scaled_h = FT_MulDiv( scaled_w, h, w );
+        }
+      }
+      else
+      {
+        metrics->x_scale = metrics->y_scale = FT_DivFix( scaled_h, h );
+        scaled_w = FT_MulDiv( scaled_h, w, h );
+      }
+
+  Calculate_Ppem:
+      /* calculate the ppems */
+      if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL )
+      {
+        scaled_w = FT_MulFix( face->units_per_EM, metrics->x_scale );
+        scaled_h = FT_MulFix( face->units_per_EM, metrics->y_scale );
+      }
+
+      metrics->x_ppem = (FT_UShort)( ( scaled_w + 32 ) >> 6 );
+      metrics->y_ppem = (FT_UShort)( ( scaled_h + 32 ) >> 6 );
+
+      ft_recompute_scaled_metrics( face, metrics );
+    }
+    else
+    {
+      FT_ZERO( metrics );
+      metrics->x_scale = 1L << 16;
+      metrics->y_scale = 1L << 16;
+    }
+
+    FT_TRACE5(( "FT_Request_Metrics:\n" ));
+    FT_TRACE5(( "  x scale: %d (%f)\n",
+                metrics->x_scale, metrics->x_scale / 65536.0 ));
+    FT_TRACE5(( "  y scale: %d (%f)\n",
+                metrics->y_scale, metrics->y_scale / 65536.0 ));
+    FT_TRACE5(( "  ascender: %f\n",    metrics->ascender / 64.0 ));
+    FT_TRACE5(( "  descender: %f\n",   metrics->descender / 64.0 ));
+    FT_TRACE5(( "  height: %f\n",      metrics->height / 64.0 ));
+    FT_TRACE5(( "  max advance: %f\n", metrics->max_advance / 64.0 ));
+    FT_TRACE5(( "  x ppem: %d\n",      metrics->x_ppem ));
+    FT_TRACE5(( "  y ppem: %d\n",      metrics->y_ppem ));
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Select_Size( FT_Face  face,
+                  FT_Int   strike_index )
+  {
+    FT_Driver_Class  clazz;
+
+
+    if ( !face || !FT_HAS_FIXED_SIZES( face ) )
+      return FT_Err_Invalid_Face_Handle;
+
+    if ( strike_index < 0 || strike_index >= face->num_fixed_sizes )
+      return FT_Err_Invalid_Argument;
+
+    clazz = face->driver->clazz;
+
+    if ( clazz->select_size )
+    {
+      FT_Error  error;
+
+
+      error = clazz->select_size( face->size, (FT_ULong)strike_index );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+      {
+        FT_Size_Metrics*  metrics = &face->size->metrics;
+
+
+        FT_TRACE5(( "FT_Select_Size (font driver's `select_size'):\n" ));
+        FT_TRACE5(( "  x scale: %d (%f)\n",
+                    metrics->x_scale, metrics->x_scale / 65536.0 ));
+        FT_TRACE5(( "  y scale: %d (%f)\n",
+                    metrics->y_scale, metrics->y_scale / 65536.0 ));
+        FT_TRACE5(( "  ascender: %f\n",    metrics->ascender / 64.0 ));
+        FT_TRACE5(( "  descender: %f\n",   metrics->descender / 64.0 ));
+        FT_TRACE5(( "  height: %f\n",      metrics->height / 64.0 ));
+        FT_TRACE5(( "  max advance: %f\n", metrics->max_advance / 64.0 ));
+        FT_TRACE5(( "  x ppem: %d\n",      metrics->x_ppem ));
+        FT_TRACE5(( "  y ppem: %d\n",      metrics->y_ppem ));
+      }
+#endif
+
+      return error;
+    }
+
+    FT_Select_Metrics( face, (FT_ULong)strike_index );
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Request_Size( FT_Face          face,
+                   FT_Size_Request  req )
+  {
+    FT_Driver_Class  clazz;
+    FT_ULong         strike_index;
+
+
+    if ( !face )
+      return FT_Err_Invalid_Face_Handle;
+
+    if ( !req || req->width < 0 || req->height < 0 ||
+         req->type >= FT_SIZE_REQUEST_TYPE_MAX )
+      return FT_Err_Invalid_Argument;
+
+    clazz = face->driver->clazz;
+
+    if ( clazz->request_size )
+    {
+      FT_Error  error;
+
+
+      error = clazz->request_size( face->size, req );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+      {
+        FT_Size_Metrics*  metrics = &face->size->metrics;
+
+
+        FT_TRACE5(( "FT_Request_Size (font driver's `request_size'):\n" ));
+        FT_TRACE5(( "  x scale: %d (%f)\n",
+                    metrics->x_scale, metrics->x_scale / 65536.0 ));
+        FT_TRACE5(( "  y scale: %d (%f)\n",
+                    metrics->y_scale, metrics->y_scale / 65536.0 ));
+        FT_TRACE5(( "  ascender: %f\n",    metrics->ascender / 64.0 ));
+        FT_TRACE5(( "  descender: %f\n",   metrics->descender / 64.0 ));
+        FT_TRACE5(( "  height: %f\n",      metrics->height / 64.0 ));
+        FT_TRACE5(( "  max advance: %f\n", metrics->max_advance / 64.0 ));
+        FT_TRACE5(( "  x ppem: %d\n",      metrics->x_ppem ));
+        FT_TRACE5(( "  y ppem: %d\n",      metrics->y_ppem ));
+      }
+#endif
+
+      return error;
+    }
+
+    /*
+     * The reason that a driver doesn't have `request_size' defined is
+     * either that the scaling here suffices or that the supported formats
+     * are bitmap-only and size matching is not implemented.
+     *
+     * In the latter case, a simple size matching is done.
+     */
+    if ( !FT_IS_SCALABLE( face ) && FT_HAS_FIXED_SIZES( face ) )
+    {
+      FT_Error  error;
+
+
+      error = FT_Match_Size( face, req, 0, &strike_index );
+      if ( error )
+        return error;
+
+      FT_TRACE3(( "FT_Request_Size: bitmap strike %lu matched\n",
+                  strike_index ));
+
+      return FT_Select_Size( face, (FT_Int)strike_index );
+    }
+
+    FT_Request_Metrics( face, req );
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Set_Char_Size( FT_Face     face,
+                    FT_F26Dot6  char_width,
+                    FT_F26Dot6  char_height,
+                    FT_UInt     horz_resolution,
+                    FT_UInt     vert_resolution )
+  {
+    FT_Size_RequestRec  req;
+
+
+    if ( !char_width )
+      char_width = char_height;
+    else if ( !char_height )
+      char_height = char_width;
+
+    if ( !horz_resolution )
+      horz_resolution = vert_resolution;
+    else if ( !vert_resolution )
+      vert_resolution = horz_resolution;
+
+    if ( char_width  < 1 * 64 )
+      char_width  = 1 * 64;
+    if ( char_height < 1 * 64 )
+      char_height = 1 * 64;
+
+    if ( !horz_resolution )
+      horz_resolution = vert_resolution = 72;
+
+    req.type           = FT_SIZE_REQUEST_TYPE_NOMINAL;
+    req.width          = char_width;
+    req.height         = char_height;
+    req.horiResolution = horz_resolution;
+    req.vertResolution = vert_resolution;
+
+    return FT_Request_Size( face, &req );
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Set_Pixel_Sizes( FT_Face  face,
+                      FT_UInt  pixel_width,
+                      FT_UInt  pixel_height )
+  {
+    FT_Size_RequestRec  req;
+
+
+    if ( pixel_width == 0 )
+      pixel_width = pixel_height;
+    else if ( pixel_height == 0 )
+      pixel_height = pixel_width;
+
+    if ( pixel_width  < 1 )
+      pixel_width  = 1;
+    if ( pixel_height < 1 )
+      pixel_height = 1;
+
+    /* use `>=' to avoid potential compiler warning on 16bit platforms */
+    if ( pixel_width  >= 0xFFFFU )
+      pixel_width  = 0xFFFFU;
+    if ( pixel_height >= 0xFFFFU )
+      pixel_height = 0xFFFFU;
+
+    req.type           = FT_SIZE_REQUEST_TYPE_NOMINAL;
+    req.width          = pixel_width << 6;
+    req.height         = pixel_height << 6;
+    req.horiResolution = 0;
+    req.vertResolution = 0;
+
+    return FT_Request_Size( face, &req );
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Kerning( FT_Face     face,
+                  FT_UInt     left_glyph,
+                  FT_UInt     right_glyph,
+                  FT_UInt     kern_mode,
+                  FT_Vector  *akerning )
+  {
+    FT_Error   error = FT_Err_Ok;
+    FT_Driver  driver;
+
+
+    if ( !face )
+      return FT_Err_Invalid_Face_Handle;
+
+    if ( !akerning )
+      return FT_Err_Invalid_Argument;
+
+    driver = face->driver;
+
+    akerning->x = 0;
+    akerning->y = 0;
+
+    if ( driver->clazz->get_kerning )
+    {
+      error = driver->clazz->get_kerning( face,
+                                          left_glyph,
+                                          right_glyph,
+                                          akerning );
+      if ( !error )
+      {
+        if ( kern_mode != FT_KERNING_UNSCALED )
+        {
+          akerning->x = FT_MulFix( akerning->x, face->size->metrics.x_scale );
+          akerning->y = FT_MulFix( akerning->y, face->size->metrics.y_scale );
+
+          if ( kern_mode != FT_KERNING_UNFITTED )
+          {
+            /* we scale down kerning values for small ppem values */
+            /* to avoid that rounding makes them too big.         */
+            /* `25' has been determined heuristically.            */
+            if ( face->size->metrics.x_ppem < 25 )
+              akerning->x = FT_MulDiv( akerning->x,
+                                       face->size->metrics.x_ppem, 25 );
+            if ( face->size->metrics.y_ppem < 25 )
+              akerning->y = FT_MulDiv( akerning->y,
+                                       face->size->metrics.y_ppem, 25 );
+
+            akerning->x = FT_PIX_ROUND( akerning->x );
+            akerning->y = FT_PIX_ROUND( akerning->y );
+          }
+        }
+      }
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Track_Kerning( FT_Face    face,
+                        FT_Fixed   point_size,
+                        FT_Int     degree,
+                        FT_Fixed*  akerning )
+  {
+    FT_Service_Kerning  service;
+    FT_Error            error = FT_Err_Ok;
+
+
+    if ( !face )
+      return FT_Err_Invalid_Face_Handle;
+
+    if ( !akerning )
+      return FT_Err_Invalid_Argument;
+
+    FT_FACE_FIND_SERVICE( face, service, KERNING );
+    if ( !service )
+      return FT_Err_Unimplemented_Feature;
+
+    error = service->get_track( face,
+                                point_size,
+                                degree,
+                                akerning );
+
+    return error;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Select_Charmap( FT_Face      face,
+                     FT_Encoding  encoding )
+  {
+    FT_CharMap*  cur;
+    FT_CharMap*  limit;
+
+
+    if ( !face )
+      return FT_Err_Invalid_Face_Handle;
+
+    if ( encoding == FT_ENCODING_NONE )
+      return FT_Err_Invalid_Argument;
+
+    /* FT_ENCODING_UNICODE is special.  We try to find the `best' Unicode */
+    /* charmap available, i.e., one with UCS-4 characters, if possible.   */
+    /*                                                                    */
+    /* This is done by find_unicode_charmap() above, to share code.       */
+    if ( encoding == FT_ENCODING_UNICODE )
+      return find_unicode_charmap( face );
+
+    cur = face->charmaps;
+    if ( !cur )
+      return FT_Err_Invalid_CharMap_Handle;
+
+    limit = cur + face->num_charmaps;
+
+    for ( ; cur < limit; cur++ )
+    {
+      if ( cur[0]->encoding == encoding )
+      {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+        if ( cur - face->charmaps > FT_MAX_CHARMAP_CACHEABLE )
+        {
+          FT_ERROR(( "FT_Select_Charmap: requested charmap is found (%d), "
+                     "but in too late position to cache\n",
+                     cur - face->charmaps ));
+          continue;
+        }
+#endif
+        face->charmap = cur[0];
+        return 0;
+      }
+    }
+
+    return FT_Err_Invalid_Argument;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Set_Charmap( FT_Face     face,
+                  FT_CharMap  charmap )
+  {
+    FT_CharMap*  cur;
+    FT_CharMap*  limit;
+
+
+    if ( !face )
+      return FT_Err_Invalid_Face_Handle;
+
+    cur = face->charmaps;
+    if ( !cur )
+      return FT_Err_Invalid_CharMap_Handle;
+    if ( FT_Get_CMap_Format( charmap ) == 14 )
+      return FT_Err_Invalid_Argument;
+
+    limit = cur + face->num_charmaps;
+
+    for ( ; cur < limit; cur++ )
+    {
+      if ( cur[0] == charmap )
+      {
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+        if ( cur - face->charmaps > FT_MAX_CHARMAP_CACHEABLE )
+        {
+          FT_ERROR(( "FT_Set_Charmap: requested charmap is found (%d), "
+                     "but in too late position to cache\n",
+                     cur - face->charmaps ));
+          continue;
+        }
+#endif
+        face->charmap = cur[0];
+        return 0;
+      }
+    }
+    return FT_Err_Invalid_Argument;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Int )
+  FT_Get_Charmap_Index( FT_CharMap  charmap )
+  {
+    FT_Int  i;
+
+
+    if ( !charmap || !charmap->face )
+      return -1;
+
+    for ( i = 0; i < charmap->face->num_charmaps; i++ )
+      if ( charmap->face->charmaps[i] == charmap )
+        break;
+
+    FT_ASSERT( i < charmap->face->num_charmaps );
+
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+    if ( i > FT_MAX_CHARMAP_CACHEABLE )
+    {
+      FT_ERROR(( "FT_Get_Charmap_Index: requested charmap is found (%d), "
+                 "but in too late position to cache\n",
+                 i ));
+      return -i;
+    }
+#endif
+    return i;
+  }
+
+
+  static void
+  ft_cmap_done_internal( FT_CMap  cmap )
+  {
+    FT_CMap_Class  clazz  = cmap->clazz;
+    FT_Face        face   = cmap->charmap.face;
+    FT_Memory      memory = FT_FACE_MEMORY(face);
+
+
+    if ( clazz->done )
+      clazz->done( cmap );
+
+    FT_FREE( cmap );
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_CMap_Done( FT_CMap  cmap )
+  {
+    if ( cmap )
+    {
+      FT_Face    face   = cmap->charmap.face;
+      FT_Memory  memory = FT_FACE_MEMORY( face );
+      FT_Error   error;
+      FT_Int     i, j;
+
+
+      for ( i = 0; i < face->num_charmaps; i++ )
+      {
+        if ( (FT_CMap)face->charmaps[i] == cmap )
+        {
+          FT_CharMap  last_charmap = face->charmaps[face->num_charmaps - 1];
+
+
+          if ( FT_RENEW_ARRAY( face->charmaps,
+                               face->num_charmaps,
+                               face->num_charmaps - 1 ) )
+            return;
+
+          /* remove it from our list of charmaps */
+          for ( j = i + 1; j < face->num_charmaps; j++ )
+          {
+            if ( j == face->num_charmaps - 1 )
+              face->charmaps[j - 1] = last_charmap;
+            else
+              face->charmaps[j - 1] = face->charmaps[j];
+          }
+
+          face->num_charmaps--;
+
+          if ( (FT_CMap)face->charmap == cmap )
+            face->charmap = NULL;
+
+          ft_cmap_done_internal( cmap );
+
+          break;
+        }
+      }
+    }
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_CMap_New( FT_CMap_Class  clazz,
+               FT_Pointer     init_data,
+               FT_CharMap     charmap,
+               FT_CMap       *acmap )
+  {
+    FT_Error   error = FT_Err_Ok;
+    FT_Face    face;
+    FT_Memory  memory;
+    FT_CMap    cmap = NULL;
+
+
+    if ( clazz == NULL || charmap == NULL || charmap->face == NULL )
+      return FT_Err_Invalid_Argument;
+
+    face   = charmap->face;
+    memory = FT_FACE_MEMORY( face );
+
+    if ( !FT_ALLOC( cmap, clazz->size ) )
+    {
+      cmap->charmap = *charmap;
+      cmap->clazz   = clazz;
+
+      if ( clazz->init )
+      {
+        error = clazz->init( cmap, init_data );
+        if ( error )
+          goto Fail;
+      }
+
+      /* add it to our list of charmaps */
+      if ( FT_RENEW_ARRAY( face->charmaps,
+                           face->num_charmaps,
+                           face->num_charmaps + 1 ) )
+        goto Fail;
+
+      face->charmaps[face->num_charmaps++] = (FT_CharMap)cmap;
+    }
+
+  Exit:
+    if ( acmap )
+      *acmap = cmap;
+
+    return error;
+
+  Fail:
+    ft_cmap_done_internal( cmap );
+    cmap = NULL;
+    goto Exit;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_UInt )
+  FT_Get_Char_Index( FT_Face   face,
+                     FT_ULong  charcode )
+  {
+    FT_UInt  result = 0;
+
+
+    if ( face && face->charmap )
+    {
+      FT_CMap  cmap = FT_CMAP( face->charmap );
+
+
+      if ( charcode > 0xFFFFFFFFUL )
+      {
+        FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+        FT_TRACE1(( " 0x%x is truncated\n", charcode ));
+      }
+      result = cmap->clazz->char_index( cmap, (FT_UInt32)charcode );
+    }
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_ULong )
+  FT_Get_First_Char( FT_Face   face,
+                     FT_UInt  *agindex )
+  {
+    FT_ULong  result = 0;
+    FT_UInt   gindex = 0;
+
+
+    if ( face && face->charmap && face->num_glyphs )
+    {
+      gindex = FT_Get_Char_Index( face, 0 );
+      if ( gindex == 0 || gindex >= (FT_UInt)face->num_glyphs )
+        result = FT_Get_Next_Char( face, 0, &gindex );
+    }
+
+    if ( agindex )
+      *agindex = gindex;
+
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_ULong )
+  FT_Get_Next_Char( FT_Face   face,
+                    FT_ULong  charcode,
+                    FT_UInt  *agindex )
+  {
+    FT_ULong  result = 0;
+    FT_UInt   gindex = 0;
+
+
+    if ( face && face->charmap && face->num_glyphs )
+    {
+      FT_UInt32  code = (FT_UInt32)charcode;
+      FT_CMap    cmap = FT_CMAP( face->charmap );
+
+
+      do {
+        gindex = cmap->clazz->char_next( cmap, &code );
+      } while ( gindex >= (FT_UInt)face->num_glyphs );
+
+      result = ( gindex == 0 ) ? 0 : code;
+    }
+
+    if ( agindex )
+      *agindex = gindex;
+
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_UInt )
+  FT_Face_GetCharVariantIndex( FT_Face   face,
+                               FT_ULong  charcode,
+                               FT_ULong  variantSelector )
+  {
+    FT_UInt  result = 0;
+
+
+    if ( face && face->charmap &&
+        face->charmap->encoding == FT_ENCODING_UNICODE )
+    {
+      FT_CharMap  charmap = find_variant_selector_charmap( face );
+      FT_CMap     ucmap = FT_CMAP( face->charmap );
+
+
+      if ( charmap != NULL )
+      {
+        FT_CMap  vcmap = FT_CMAP( charmap );
+
+
+        if ( charcode > 0xFFFFFFFFUL )
+        {
+          FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+          FT_TRACE1(( " 0x%x is truncated\n", charcode ));
+        }
+        if ( variantSelector > 0xFFFFFFFFUL )
+        {
+          FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" ));
+          FT_TRACE1(( " 0x%x is truncated\n", variantSelector ));
+        }
+
+        result = vcmap->clazz->char_var_index( vcmap, ucmap,
+                                               (FT_UInt32)charcode,
+                                               (FT_UInt32)variantSelector );
+      }
+    }
+
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Int )
+  FT_Face_GetCharVariantIsDefault( FT_Face   face,
+                                   FT_ULong  charcode,
+                                   FT_ULong  variantSelector )
+  {
+    FT_Int  result = -1;
+
+
+    if ( face )
+    {
+      FT_CharMap  charmap = find_variant_selector_charmap( face );
+
+
+      if ( charmap != NULL )
+      {
+        FT_CMap  vcmap = FT_CMAP( charmap );
+
+
+        if ( charcode > 0xFFFFFFFFUL )
+        {
+          FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+          FT_TRACE1(( " 0x%x is truncated\n", charcode ));
+        }
+        if ( variantSelector > 0xFFFFFFFFUL )
+        {
+          FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" ));
+          FT_TRACE1(( " 0x%x is truncated\n", variantSelector ));
+        }
+
+        result = vcmap->clazz->char_var_default( vcmap,
+                                                 (FT_UInt32)charcode,
+                                                 (FT_UInt32)variantSelector );
+      }
+    }
+
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_UInt32* )
+  FT_Face_GetVariantSelectors( FT_Face  face )
+  {
+    FT_UInt32  *result = NULL;
+
+
+    if ( face )
+    {
+      FT_CharMap  charmap = find_variant_selector_charmap( face );
+
+
+      if ( charmap != NULL )
+      {
+        FT_CMap    vcmap  = FT_CMAP( charmap );
+        FT_Memory  memory = FT_FACE_MEMORY( face );
+
+
+        result = vcmap->clazz->variant_list( vcmap, memory );
+      }
+    }
+
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_UInt32* )
+  FT_Face_GetVariantsOfChar( FT_Face   face,
+                             FT_ULong  charcode )
+  {
+    FT_UInt32  *result = NULL;
+
+
+    if ( face )
+    {
+      FT_CharMap  charmap = find_variant_selector_charmap( face );
+
+
+      if ( charmap != NULL )
+      {
+        FT_CMap    vcmap  = FT_CMAP( charmap );
+        FT_Memory  memory = FT_FACE_MEMORY( face );
+
+
+        if ( charcode > 0xFFFFFFFFUL )
+        {
+          FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
+          FT_TRACE1(( " 0x%x is truncated\n", charcode ));
+        }
+
+        result = vcmap->clazz->charvariant_list( vcmap, memory,
+                                                 (FT_UInt32)charcode );
+      }
+    }
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_UInt32* )
+  FT_Face_GetCharsOfVariant( FT_Face   face,
+                             FT_ULong  variantSelector )
+  {
+    FT_UInt32  *result = NULL;
+
+
+    if ( face )
+    {
+      FT_CharMap  charmap = find_variant_selector_charmap( face );
+
+
+      if ( charmap != NULL )
+      {
+        FT_CMap    vcmap  = FT_CMAP( charmap );
+        FT_Memory  memory = FT_FACE_MEMORY( face );
+
+
+        if ( variantSelector > 0xFFFFFFFFUL )
+        {
+          FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" ));
+          FT_TRACE1(( " 0x%x is truncated\n", variantSelector ));
+        }
+
+        result = vcmap->clazz->variantchar_list( vcmap, memory,
+                                                 (FT_UInt32)variantSelector );
+      }
+    }
+
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_UInt )
+  FT_Get_Name_Index( FT_Face     face,
+                     FT_String*  glyph_name )
+  {
+    FT_UInt  result = 0;
+
+
+    if ( face && FT_HAS_GLYPH_NAMES( face ) )
+    {
+      FT_Service_GlyphDict  service;
+
+
+      FT_FACE_LOOKUP_SERVICE( face,
+                              service,
+                              GLYPH_DICT );
+
+      if ( service && service->name_index )
+        result = service->name_index( face, glyph_name );
+    }
+
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Glyph_Name( FT_Face     face,
+                     FT_UInt     glyph_index,
+                     FT_Pointer  buffer,
+                     FT_UInt     buffer_max )
+  {
+    FT_Error  error = FT_Err_Invalid_Argument;
+
+
+    /* clean up buffer */
+    if ( buffer && buffer_max > 0 )
+      ((FT_Byte*)buffer)[0] = 0;
+
+    if ( face                                     &&
+         (FT_Long)glyph_index <= face->num_glyphs &&
+         FT_HAS_GLYPH_NAMES( face )               )
+    {
+      FT_Service_GlyphDict  service;
+
+
+      FT_FACE_LOOKUP_SERVICE( face,
+                              service,
+                              GLYPH_DICT );
+
+      if ( service && service->get_name )
+        error = service->get_name( face, glyph_index, buffer, buffer_max );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( const char* )
+  FT_Get_Postscript_Name( FT_Face  face )
+  {
+    const char*  result = NULL;
+
+
+    if ( !face )
+      goto Exit;
+
+    if ( !result )
+    {
+      FT_Service_PsFontName  service;
+
+
+      FT_FACE_LOOKUP_SERVICE( face,
+                              service,
+                              POSTSCRIPT_FONT_NAME );
+
+      if ( service && service->get_ps_font_name )
+        result = service->get_ps_font_name( face );
+    }
+
+  Exit:
+    return result;
+  }
+
+
+  /* documentation is in tttables.h */
+
+  FT_EXPORT_DEF( void* )
+  FT_Get_Sfnt_Table( FT_Face      face,
+                     FT_Sfnt_Tag  tag )
+  {
+    void*                  table = 0;
+    FT_Service_SFNT_Table  service;
+
+
+    if ( face && FT_IS_SFNT( face ) )
+    {
+      FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
+      if ( service != NULL )
+        table = service->get_table( face, tag );
+    }
+
+    return table;
+  }
+
+
+  /* documentation is in tttables.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Load_Sfnt_Table( FT_Face    face,
+                      FT_ULong   tag,
+                      FT_Long    offset,
+                      FT_Byte*   buffer,
+                      FT_ULong*  length )
+  {
+    FT_Service_SFNT_Table  service;
+
+
+    if ( !face || !FT_IS_SFNT( face ) )
+      return FT_Err_Invalid_Face_Handle;
+
+    FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
+    if ( service == NULL )
+      return FT_Err_Unimplemented_Feature;
+
+    return service->load_table( face, tag, offset, buffer, length );
+  }
+
+
+  /* documentation is in tttables.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Sfnt_Table_Info( FT_Face    face,
+                      FT_UInt    table_index,
+                      FT_ULong  *tag,
+                      FT_ULong  *length )
+  {
+    FT_Service_SFNT_Table  service;
+    FT_ULong               offset;
+
+
+    if ( !face || !FT_IS_SFNT( face ) )
+      return FT_Err_Invalid_Face_Handle;
+
+    FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
+    if ( service == NULL )
+      return FT_Err_Unimplemented_Feature;
+
+    return service->table_info( face, table_index, tag, &offset, length );
+  }
+
+
+  /* documentation is in tttables.h */
+
+  FT_EXPORT_DEF( FT_ULong )
+  FT_Get_CMap_Language_ID( FT_CharMap  charmap )
+  {
+    FT_Service_TTCMaps  service;
+    FT_Face             face;
+    TT_CMapInfo         cmap_info;
+
+
+    if ( !charmap || !charmap->face )
+      return 0;
+
+    face = charmap->face;
+    FT_FACE_FIND_SERVICE( face, service, TT_CMAP );
+    if ( service == NULL )
+      return 0;
+    if ( service->get_cmap_info( charmap, &cmap_info ))
+      return 0;
+
+    return cmap_info.language;
+  }
+
+
+  /* documentation is in tttables.h */
+
+  FT_EXPORT_DEF( FT_Long )
+  FT_Get_CMap_Format( FT_CharMap  charmap )
+  {
+    FT_Service_TTCMaps  service;
+    FT_Face             face;
+    TT_CMapInfo         cmap_info;
+
+
+    if ( !charmap || !charmap->face )
+      return -1;
+
+    face = charmap->face;
+    FT_FACE_FIND_SERVICE( face, service, TT_CMAP );
+    if ( service == NULL )
+      return -1;
+    if ( service->get_cmap_info( charmap, &cmap_info ))
+      return -1;
+
+    return cmap_info.format;
+  }
+
+
+  /* documentation is in ftsizes.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Activate_Size( FT_Size  size )
+  {
+    FT_Face  face;
+
+
+    if ( size == NULL )
+      return FT_Err_Invalid_Argument;
+
+    face = size->face;
+    if ( face == NULL || face->driver == NULL )
+      return FT_Err_Invalid_Argument;
+
+    /* we don't need anything more complex than that; all size objects */
+    /* are already listed by the face                                  */
+    face->size = size;
+
+    return FT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                        R E N D E R E R S                        ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* lookup a renderer by glyph format in the library's list */
+  FT_BASE_DEF( FT_Renderer )
+  FT_Lookup_Renderer( FT_Library       library,
+                      FT_Glyph_Format  format,
+                      FT_ListNode*     node )
+  {
+    FT_ListNode  cur;
+    FT_Renderer  result = 0;
+
+
+    if ( !library )
+      goto Exit;
+
+    cur = library->renderers.head;
+
+    if ( node )
+    {
+      if ( *node )
+        cur = (*node)->next;
+      *node = 0;
+    }
+
+    while ( cur )
+    {
+      FT_Renderer  renderer = FT_RENDERER( cur->data );
+
+
+      if ( renderer->glyph_format == format )
+      {
+        if ( node )
+          *node = cur;
+
+        result = renderer;
+        break;
+      }
+      cur = cur->next;
+    }
+
+  Exit:
+    return result;
+  }
+
+
+  static FT_Renderer
+  ft_lookup_glyph_renderer( FT_GlyphSlot  slot )
+  {
+    FT_Face      face    = slot->face;
+    FT_Library   library = FT_FACE_LIBRARY( face );
+    FT_Renderer  result  = library->cur_renderer;
+
+
+    if ( !result || result->glyph_format != slot->format )
+      result = FT_Lookup_Renderer( library, slot->format, 0 );
+
+    return result;
+  }
+
+
+  static void
+  ft_set_current_renderer( FT_Library  library )
+  {
+    FT_Renderer  renderer;
+
+
+    renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, 0 );
+    library->cur_renderer = renderer;
+  }
+
+
+  static FT_Error
+  ft_add_renderer( FT_Module  module )
+  {
+    FT_Library   library = module->library;
+    FT_Memory    memory  = library->memory;
+    FT_Error     error;
+    FT_ListNode  node    = NULL;
+
+
+    if ( FT_NEW( node ) )
+      goto Exit;
+
+    {
+      FT_Renderer         render = FT_RENDERER( module );
+      FT_Renderer_Class*  clazz  = (FT_Renderer_Class*)module->clazz;
+
+
+      render->clazz        = clazz;
+      render->glyph_format = clazz->glyph_format;
+
+      /* allocate raster object if needed */
+      if ( clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&
+           clazz->raster_class->raster_new                )
+      {
+        error = clazz->raster_class->raster_new( memory, &render->raster );
+        if ( error )
+          goto Fail;
+
+        render->raster_render = clazz->raster_class->raster_render;
+        render->render        = clazz->render_glyph;
+      }
+
+      /* add to list */
+      node->data = module;
+      FT_List_Add( &library->renderers, node );
+
+      ft_set_current_renderer( library );
+    }
+
+  Fail:
+    if ( error )
+      FT_FREE( node );
+
+  Exit:
+    return error;
+  }
+
+
+  static void
+  ft_remove_renderer( FT_Module  module )
+  {
+    FT_Library   library = module->library;
+    FT_Memory    memory  = library->memory;
+    FT_ListNode  node;
+
+
+    node = FT_List_Find( &library->renderers, module );
+    if ( node )
+    {
+      FT_Renderer  render = FT_RENDERER( module );
+
+
+      /* release raster object, if any */
+      if ( render->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&
+           render->raster                                         )
+        render->clazz->raster_class->raster_done( render->raster );
+
+      /* remove from list */
+      FT_List_Remove( &library->renderers, node );
+      FT_FREE( node );
+
+      ft_set_current_renderer( library );
+    }
+  }
+
+
+  /* documentation is in ftrender.h */
+
+  FT_EXPORT_DEF( FT_Renderer )
+  FT_Get_Renderer( FT_Library       library,
+                   FT_Glyph_Format  format )
+  {
+    /* test for valid `library' delayed to FT_Lookup_Renderer() */
+
+    return FT_Lookup_Renderer( library, format, 0 );
+  }
+
+
+  /* documentation is in ftrender.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Set_Renderer( FT_Library     library,
+                   FT_Renderer    renderer,
+                   FT_UInt        num_params,
+                   FT_Parameter*  parameters )
+  {
+    FT_ListNode  node;
+    FT_Error     error = FT_Err_Ok;
+
+
+    if ( !library )
+      return FT_Err_Invalid_Library_Handle;
+
+    if ( !renderer )
+      return FT_Err_Invalid_Argument;
+
+    node = FT_List_Find( &library->renderers, renderer );
+    if ( !node )
+    {
+      error = FT_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    FT_List_Up( &library->renderers, node );
+
+    if ( renderer->glyph_format == FT_GLYPH_FORMAT_OUTLINE )
+      library->cur_renderer = renderer;
+
+    if ( num_params > 0 )
+    {
+      FT_Renderer_SetModeFunc  set_mode = renderer->clazz->set_mode;
+
+
+      for ( ; num_params > 0; num_params-- )
+      {
+        error = set_mode( renderer, parameters->tag, parameters->data );
+        if ( error )
+          break;
+        parameters++;
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Render_Glyph_Internal( FT_Library      library,
+                            FT_GlyphSlot    slot,
+                            FT_Render_Mode  render_mode )
+  {
+    FT_Error     error = FT_Err_Ok;
+    FT_Renderer  renderer;
+
+
+    /* if it is already a bitmap, no need to do anything */
+    switch ( slot->format )
+    {
+    case FT_GLYPH_FORMAT_BITMAP:   /* already a bitmap, don't do anything */
+      break;
+
+    default:
+      {
+        FT_ListNode  node   = 0;
+        FT_Bool      update = 0;
+
+
+        /* small shortcut for the very common case */
+        if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+        {
+          renderer = library->cur_renderer;
+          node     = library->renderers.head;
+        }
+        else
+          renderer = FT_Lookup_Renderer( library, slot->format, &node );
+
+        error = FT_Err_Unimplemented_Feature;
+        while ( renderer )
+        {
+          error = renderer->render( renderer, slot, render_mode, NULL );
+          if ( !error                                               ||
+               FT_ERROR_BASE( error ) != FT_Err_Cannot_Render_Glyph )
+            break;
+
+          /* FT_Err_Cannot_Render_Glyph is returned if the render mode   */
+          /* is unsupported by the current renderer for this glyph image */
+          /* format.                                                     */
+
+          /* now, look for another renderer that supports the same */
+          /* format.                                               */
+          renderer = FT_Lookup_Renderer( library, slot->format, &node );
+          update   = 1;
+        }
+
+        /* if we changed the current renderer for the glyph image format */
+        /* we need to select it as the next current one                  */
+        if ( !error && update && renderer )
+          FT_Set_Renderer( library, renderer, 0, 0 );
+      }
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Render_Glyph( FT_GlyphSlot    slot,
+                   FT_Render_Mode  render_mode )
+  {
+    FT_Library  library;
+
+
+    if ( !slot || !slot->face )
+      return FT_Err_Invalid_Argument;
+
+    library = FT_FACE_LIBRARY( slot->face );
+
+    return FT_Render_Glyph_Internal( library, slot, render_mode );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                         M O D U L E S                           ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Destroy_Module                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroys a given module object.  For drivers, this also destroys   */
+  /*    all child faces.                                                   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    module :: A handle to the target driver object.                    */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The driver _must_ be LOCKED!                                       */
+  /*                                                                       */
+  static void
+  Destroy_Module( FT_Module  module )
+  {
+    FT_Memory         memory  = module->memory;
+    FT_Module_Class*  clazz   = module->clazz;
+    FT_Library        library = module->library;
+
+
+    if ( library && library->auto_hinter == module )
+      library->auto_hinter = 0;
+
+    /* if the module is a renderer */
+    if ( FT_MODULE_IS_RENDERER( module ) )
+      ft_remove_renderer( module );
+
+    /* if the module is a font driver, add some steps */
+    if ( FT_MODULE_IS_DRIVER( module ) )
+      Destroy_Driver( FT_DRIVER( module ) );
+
+    /* finalize the module object */
+    if ( clazz->module_done )
+      clazz->module_done( module );
+
+    /* discard it */
+    FT_FREE( module );
+  }
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Add_Module( FT_Library              library,
+                 const FT_Module_Class*  clazz )
+  {
+    FT_Error   error;
+    FT_Memory  memory;
+    FT_Module  module;
+    FT_UInt    nn;
+
+
+#define FREETYPE_VER_FIXED  ( ( (FT_Long)FREETYPE_MAJOR << 16 ) | \
+                                FREETYPE_MINOR                  )
+
+    if ( !library )
+      return FT_Err_Invalid_Library_Handle;
+
+    if ( !clazz )
+      return FT_Err_Invalid_Argument;
+
+    /* check freetype version */
+    if ( clazz->module_requires > FREETYPE_VER_FIXED )
+      return FT_Err_Invalid_Version;
+
+    /* look for a module with the same name in the library's table */
+    for ( nn = 0; nn < library->num_modules; nn++ )
+    {
+      module = library->modules[nn];
+      if ( ft_strcmp( module->clazz->module_name, clazz->module_name ) == 0 )
+      {
+        /* this installed module has the same name, compare their versions */
+        if ( clazz->module_version <= module->clazz->module_version )
+          return FT_Err_Lower_Module_Version;
+
+        /* remove the module from our list, then exit the loop to replace */
+        /* it by our new version..                                        */
+        FT_Remove_Module( library, module );
+        break;
+      }
+    }
+
+    memory = library->memory;
+    error  = FT_Err_Ok;
+
+    if ( library->num_modules >= FT_MAX_MODULES )
+    {
+      error = FT_Err_Too_Many_Drivers;
+      goto Exit;
+    }
+
+    /* allocate module object */
+    if ( FT_ALLOC( module, clazz->module_size ) )
+      goto Exit;
+
+    /* base initialization */
+    module->library = library;
+    module->memory  = memory;
+    module->clazz   = (FT_Module_Class*)clazz;
+
+    /* check whether the module is a renderer - this must be performed */
+    /* before the normal module initialization                         */
+    if ( FT_MODULE_IS_RENDERER( module ) )
+    {
+      /* add to the renderers list */
+      error = ft_add_renderer( module );
+      if ( error )
+        goto Fail;
+    }
+
+    /* is the module a auto-hinter? */
+    if ( FT_MODULE_IS_HINTER( module ) )
+      library->auto_hinter = module;
+
+    /* if the module is a font driver */
+    if ( FT_MODULE_IS_DRIVER( module ) )
+    {
+      /* allocate glyph loader if needed */
+      FT_Driver  driver = FT_DRIVER( module );
+
+
+      driver->clazz = (FT_Driver_Class)module->clazz;
+      if ( FT_DRIVER_USES_OUTLINES( driver ) )
+      {
+        error = FT_GlyphLoader_New( memory, &driver->glyph_loader );
+        if ( error )
+          goto Fail;
+      }
+    }
+
+    if ( clazz->module_init )
+    {
+      error = clazz->module_init( module );
+      if ( error )
+        goto Fail;
+    }
+
+    /* add module to the library's table */
+    library->modules[library->num_modules++] = module;
+
+  Exit:
+    return error;
+
+  Fail:
+    if ( FT_MODULE_IS_DRIVER( module ) )
+    {
+      FT_Driver  driver = FT_DRIVER( module );
+
+
+      if ( FT_DRIVER_USES_OUTLINES( driver ) )
+        FT_GlyphLoader_Done( driver->glyph_loader );
+    }
+
+    if ( FT_MODULE_IS_RENDERER( module ) )
+    {
+      FT_Renderer  renderer = FT_RENDERER( module );
+
+
+      if ( renderer->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&
+           renderer->raster                                         )
+        renderer->clazz->raster_class->raster_done( renderer->raster );
+    }
+
+    FT_FREE( module );
+    goto Exit;
+  }
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( FT_Module )
+  FT_Get_Module( FT_Library   library,
+                 const char*  module_name )
+  {
+    FT_Module   result = 0;
+    FT_Module*  cur;
+    FT_Module*  limit;
+
+
+    if ( !library || !module_name )
+      return result;
+
+    cur   = library->modules;
+    limit = cur + library->num_modules;
+
+    for ( ; cur < limit; cur++ )
+      if ( ft_strcmp( cur[0]->clazz->module_name, module_name ) == 0 )
+      {
+        result = cur[0];
+        break;
+      }
+
+    return result;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( const void* )
+  FT_Get_Module_Interface( FT_Library   library,
+                           const char*  mod_name )
+  {
+    FT_Module  module;
+
+
+    /* test for valid `library' delayed to FT_Get_Module() */
+
+    module = FT_Get_Module( library, mod_name );
+
+    return module ? module->clazz->module_interface : 0;
+  }
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_module_get_service( FT_Module    module,
+                         const char*  service_id )
+  {
+    FT_Pointer  result = NULL;
+
+    if ( module )
+    {
+      FT_ASSERT( module->clazz && module->clazz->get_interface );
+
+     /* first, look for the service in the module
+      */
+      if ( module->clazz->get_interface )
+        result = module->clazz->get_interface( module, service_id );
+
+      if ( result == NULL )
+      {
+       /* we didn't find it, look in all other modules then
+        */
+        FT_Library  library = module->library;
+        FT_Module*  cur     = library->modules;
+        FT_Module*  limit   = cur + library->num_modules;
+
+
+        for ( ; cur < limit; cur++ )
+        {
+          if ( cur[0] != module )
+          {
+            FT_ASSERT( cur[0]->clazz );
+
+            if ( cur[0]->clazz->get_interface )
+            {
+              result = cur[0]->clazz->get_interface( cur[0], service_id );
+              if ( result != NULL )
+                break;
+            }
+          }
+        }
+      }
+    }
+
+    return result;
+  }
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Remove_Module( FT_Library  library,
+                    FT_Module   module )
+  {
+    /* try to find the module from the table, then remove it from there */
+
+    if ( !library )
+      return FT_Err_Invalid_Library_Handle;
+
+    if ( module )
+    {
+      FT_Module*  cur   = library->modules;
+      FT_Module*  limit = cur + library->num_modules;
+
+
+      for ( ; cur < limit; cur++ )
+      {
+        if ( cur[0] == module )
+        {
+          /* remove it from the table */
+          library->num_modules--;
+          limit--;
+          while ( cur < limit )
+          {
+            cur[0] = cur[1];
+            cur++;
+          }
+          limit[0] = 0;
+
+          /* destroy the module */
+          Destroy_Module( module );
+
+          return FT_Err_Ok;
+        }
+      }
+    }
+    return FT_Err_Invalid_Driver_Handle;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                         L I B R A R Y                           ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Reference_Library( FT_Library  library )
+  {
+    library->refcount++;
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_New_Library( FT_Memory    memory,
+                  FT_Library  *alibrary )
+  {
+    FT_Library  library = NULL;
+    FT_Error    error;
+
+
+    if ( !memory )
+      return FT_Err_Invalid_Argument;
+
+#ifdef FT_DEBUG_LEVEL_ERROR
+    /* init debugging support */
+    ft_debug_init();
+#endif
+
+    /* first of all, allocate the library object */
+    if ( FT_NEW( library ) )
+      return error;
+
+    library->memory = memory;
+
+#ifdef FT_CONFIG_OPTION_PIC
+    /* initialize position independent code containers */
+    error = ft_pic_container_init( library );
+    if ( error )
+      goto Fail;
+#endif
+
+    /* allocate the render pool */
+    library->raster_pool_size = FT_RENDER_POOL_SIZE;
+#if FT_RENDER_POOL_SIZE > 0
+    if ( FT_ALLOC( library->raster_pool, FT_RENDER_POOL_SIZE ) )
+      goto Fail;
+#endif
+
+    library->version_major = FREETYPE_MAJOR;
+    library->version_minor = FREETYPE_MINOR;
+    library->version_patch = FREETYPE_PATCH;
+
+    library->refcount = 1;
+
+    /* That's ok now */
+    *alibrary = library;
+
+    return FT_Err_Ok;
+
+  Fail:
+#ifdef FT_CONFIG_OPTION_PIC
+    ft_pic_container_destroy( library );
+#endif
+    FT_FREE( library );
+    return error;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Library_Version( FT_Library   library,
+                      FT_Int      *amajor,
+                      FT_Int      *aminor,
+                      FT_Int      *apatch )
+  {
+    FT_Int  major = 0;
+    FT_Int  minor = 0;
+    FT_Int  patch = 0;
+
+
+    if ( library )
+    {
+      major = library->version_major;
+      minor = library->version_minor;
+      patch = library->version_patch;
+    }
+
+    if ( amajor )
+      *amajor = major;
+
+    if ( aminor )
+      *aminor = minor;
+
+    if ( apatch )
+      *apatch = patch;
+  }
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Done_Library( FT_Library  library )
+  {
+    FT_Memory  memory;
+
+
+    if ( !library )
+      return FT_Err_Invalid_Library_Handle;
+
+    library->refcount--;
+    if ( library->refcount > 0 )
+      goto Exit;
+
+    memory = library->memory;
+
+    /*
+     * Close all faces in the library.  If we don't do this, we can have
+     * some subtle memory leaks.
+     *
+     * Example:
+     *
+     *  - the cff font driver uses the pshinter module in cff_size_done
+     *  - if the pshinter module is destroyed before the cff font driver,
+     *    opened FT_Face objects managed by the driver are not properly
+     *    destroyed, resulting in a memory leak
+     *
+     * Some faces are dependent on other faces, like Type42 faces that
+     * depend on TrueType faces synthesized internally.
+     *
+     * The order of drivers should be specified in driver_name[].
+     */
+    {
+      FT_UInt      m, n;
+      const char*  driver_name[] = { "type42", NULL };
+
+
+      for ( m = 0;
+            m < sizeof ( driver_name ) / sizeof ( driver_name[0] );
+            m++ )
+      {
+        for ( n = 0; n < library->num_modules; n++ )
+        {
+          FT_Module    module      = library->modules[n];
+          const char*  module_name = module->clazz->module_name;
+          FT_List      faces;
+
+
+          if ( driver_name[m]                                &&
+               ft_strcmp( module_name, driver_name[m] ) != 0 )
+            continue;
+
+          if ( ( module->clazz->module_flags & FT_MODULE_FONT_DRIVER ) == 0 )
+            continue;
+
+          FT_TRACE7(( "FT_Done_Library: close faces for %s\n", module_name ));
+
+          faces = &FT_DRIVER( module )->faces_list;
+          while ( faces->head )
+          {
+            FT_Done_Face( FT_FACE( faces->head->data ) );
+            if ( faces->head )
+              FT_TRACE0(( "FT_Done_Library: failed to free some faces\n" ));
+          }
+        }
+      }
+    }
+
+    /* Close all other modules in the library */
+#if 1
+    /* XXX Modules are removed in the reversed order so that  */
+    /* type42 module is removed before truetype module.  This */
+    /* avoids double free in some occasions.  It is a hack.   */
+    while ( library->num_modules > 0 )
+      FT_Remove_Module( library,
+                        library->modules[library->num_modules - 1] );
+#else
+    {
+      FT_UInt  n;
+
+
+      for ( n = 0; n < library->num_modules; n++ )
+      {
+        FT_Module  module = library->modules[n];
+
+
+        if ( module )
+        {
+          Destroy_Module( module );
+          library->modules[n] = 0;
+        }
+      }
+    }
+#endif
+
+    /* Destroy raster objects */
+    FT_FREE( library->raster_pool );
+    library->raster_pool_size = 0;
+
+#ifdef FT_CONFIG_OPTION_PIC
+    /* Destroy pic container contents */
+    ft_pic_container_destroy( library );
+#endif
+
+    FT_FREE( library );
+
+  Exit:
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Set_Debug_Hook( FT_Library         library,
+                     FT_UInt            hook_index,
+                     FT_DebugHook_Func  debug_hook )
+  {
+    if ( library && debug_hook &&
+         hook_index <
+           ( sizeof ( library->debug_hooks ) / sizeof ( void* ) ) )
+      library->debug_hooks[hook_index] = debug_hook;
+  }
+
+
+  /* documentation is in ftmodapi.h */
+
+  FT_EXPORT_DEF( FT_TrueTypeEngineType )
+  FT_Get_TrueType_Engine_Type( FT_Library  library )
+  {
+    FT_TrueTypeEngineType  result = FT_TRUETYPE_ENGINE_TYPE_NONE;
+
+
+    if ( library )
+    {
+      FT_Module  module = FT_Get_Module( library, "truetype" );
+
+
+      if ( module )
+      {
+        FT_Service_TrueTypeEngine  service;
+
+
+        service = (FT_Service_TrueTypeEngine)
+                    ft_module_get_service( module,
+                                           FT_SERVICE_ID_TRUETYPE_ENGINE );
+        if ( service )
+          result = service->engine_type;
+      }
+    }
+
+    return result;
+  }
+
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  FT_BASE_DEF( FT_Error )
+  ft_stub_set_char_sizes( FT_Size     size,
+                          FT_F26Dot6  width,
+                          FT_F26Dot6  height,
+                          FT_UInt     horz_res,
+                          FT_UInt     vert_res )
+  {
+    FT_Size_RequestRec  req;
+    FT_Driver           driver = size->face->driver;
+
+
+    if ( driver->clazz->request_size )
+    {
+      req.type   = FT_SIZE_REQUEST_TYPE_NOMINAL;
+      req.width  = width;
+      req.height = height;
+
+      if ( horz_res == 0 )
+        horz_res = vert_res;
+
+      if ( vert_res == 0 )
+        vert_res = horz_res;
+
+      if ( horz_res == 0 )
+        horz_res = vert_res = 72;
+
+      req.horiResolution = horz_res;
+      req.vertResolution = vert_res;
+
+      return driver->clazz->request_size( size, &req );
+    }
+
+    return 0;
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  ft_stub_set_pixel_sizes( FT_Size  size,
+                           FT_UInt  width,
+                           FT_UInt  height )
+  {
+    FT_Size_RequestRec  req;
+    FT_Driver           driver = size->face->driver;
+
+
+    if ( driver->clazz->request_size )
+    {
+      req.type           = FT_SIZE_REQUEST_TYPE_NOMINAL;
+      req.width          = width  << 6;
+      req.height         = height << 6;
+      req.horiResolution = 0;
+      req.vertResolution = 0;
+
+      return driver->clazz->request_size( size, &req );
+    }
+
+    return 0;
+  }
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_SubGlyph_Info( FT_GlyphSlot  glyph,
+                        FT_UInt       sub_index,
+                        FT_Int       *p_index,
+                        FT_UInt      *p_flags,
+                        FT_Int       *p_arg1,
+                        FT_Int       *p_arg2,
+                        FT_Matrix    *p_transform )
+  {
+    FT_Error  error = FT_Err_Invalid_Argument;
+
+
+    if ( glyph                                      &&
+         glyph->subglyphs                           &&
+         glyph->format == FT_GLYPH_FORMAT_COMPOSITE &&
+         sub_index < glyph->num_subglyphs           )
+    {
+      FT_SubGlyph  subg = glyph->subglyphs + sub_index;
+
+
+      *p_index     = subg->index;
+      *p_flags     = subg->flags;
+      *p_arg1      = subg->arg1;
+      *p_arg2      = subg->arg2;
+      *p_transform = subg->transform;
+    }
+
+    return error;
+  }
+
+
+/* END */
diff --git a/src/base/ftotval.c b/src/base/ftotval.c
new file mode 100644 (file)
index 0000000..694fd2b
--- /dev/null
@@ -0,0 +1,89 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftotval.c                                                              */
+/*                                                                         */
+/*    FreeType API for validating OpenType tables (body).                  */
+/*                                                                         */
+/*  Copyright 2004, 2006, 2008, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_SERVICE_OPENTYPE_VALIDATE_H
+#include FT_OPENTYPE_VALIDATE_H
+
+
+  /* documentation is in ftotval.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_OpenType_Validate( FT_Face    face,
+                        FT_UInt    validation_flags,
+                        FT_Bytes  *BASE_table,
+                        FT_Bytes  *GDEF_table,
+                        FT_Bytes  *GPOS_table,
+                        FT_Bytes  *GSUB_table,
+                        FT_Bytes  *JSTF_table )
+  {
+    FT_Service_OTvalidate  service;
+    FT_Error               error;
+
+
+    if ( !face )
+    {
+      error = FT_Err_Invalid_Face_Handle;
+      goto Exit;
+    }
+
+    if ( !( BASE_table &&
+            GDEF_table &&
+            GPOS_table &&
+            GSUB_table &&
+            JSTF_table ) )
+    {
+      error = FT_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, service, OPENTYPE_VALIDATE );
+
+    if ( service )
+      error = service->validate( face,
+                                 validation_flags,
+                                 BASE_table,
+                                 GDEF_table,
+                                 GPOS_table,
+                                 GSUB_table,
+                                 JSTF_table );
+    else
+      error = FT_Err_Unimplemented_Feature;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_EXPORT_DEF( void )
+  FT_OpenType_Free( FT_Face   face,
+                    FT_Bytes  table )
+  {
+    FT_Memory  memory;
+
+
+    if ( !face )
+      return;
+
+    memory = FT_FACE_MEMORY( face );
+
+    FT_FREE( table );
+  }
+
+
+/* END */
diff --git a/src/base/ftoutln.c b/src/base/ftoutln.c
new file mode 100644 (file)
index 0000000..9ae276d
--- /dev/null
@@ -0,0 +1,1129 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftoutln.c                                                              */
+/*                                                                         */
+/*    FreeType outline management (body).                                  */
+/*                                                                         */
+/*  Copyright 1996-2008, 2010, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* All functions are declared in freetype.h.                             */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_OUTLINE_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_TRIGONOMETRY_H
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_outline
+
+
+  static
+  const FT_Outline  null_outline = { 0, 0, 0, 0, 0, 0 };
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_Decompose( FT_Outline*              outline,
+                        const FT_Outline_Funcs*  func_interface,
+                        void*                    user )
+  {
+#undef SCALED
+#define SCALED( x )  ( ( (x) << shift ) - delta )
+
+    FT_Vector   v_last;
+    FT_Vector   v_control;
+    FT_Vector   v_start;
+
+    FT_Vector*  point;
+    FT_Vector*  limit;
+    char*       tags;
+
+    FT_Error    error;
+
+    FT_Int   n;         /* index of contour in outline     */
+    FT_UInt  first;     /* index of first point in contour */
+    FT_Int   tag;       /* current point's state           */
+
+    FT_Int   shift;
+    FT_Pos   delta;
+
+
+    if ( !outline || !func_interface )
+      return FT_Err_Invalid_Argument;
+
+    shift = func_interface->shift;
+    delta = func_interface->delta;
+    first = 0;
+
+    for ( n = 0; n < outline->n_contours; n++ )
+    {
+      FT_Int  last;  /* index of last point in contour */
+
+
+      FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n ));
+
+      last = outline->contours[n];
+      if ( last < 0 )
+        goto Invalid_Outline;
+      limit = outline->points + last;
+
+      v_start   = outline->points[first];
+      v_start.x = SCALED( v_start.x );
+      v_start.y = SCALED( v_start.y );
+
+      v_last   = outline->points[last];
+      v_last.x = SCALED( v_last.x );
+      v_last.y = SCALED( v_last.y );
+
+      v_control = v_start;
+
+      point = outline->points + first;
+      tags  = outline->tags   + first;
+      tag   = FT_CURVE_TAG( tags[0] );
+
+      /* A contour cannot start with a cubic control point! */
+      if ( tag == FT_CURVE_TAG_CUBIC )
+        goto Invalid_Outline;
+
+      /* check first point to determine origin */
+      if ( tag == FT_CURVE_TAG_CONIC )
+      {
+        /* first point is conic control.  Yes, this happens. */
+        if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )
+        {
+          /* start at last point if it is on the curve */
+          v_start = v_last;
+          limit--;
+        }
+        else
+        {
+          /* if both first and last points are conic,         */
+          /* start at their middle and record its position    */
+          /* for closure                                      */
+          v_start.x = ( v_start.x + v_last.x ) / 2;
+          v_start.y = ( v_start.y + v_last.y ) / 2;
+
+          v_last = v_start;
+        }
+        point--;
+        tags--;
+      }
+
+      FT_TRACE5(( "  move to (%.2f, %.2f)\n",
+                  v_start.x / 64.0, v_start.y / 64.0 ));
+      error = func_interface->move_to( &v_start, user );
+      if ( error )
+        goto Exit;
+
+      while ( point < limit )
+      {
+        point++;
+        tags++;
+
+        tag = FT_CURVE_TAG( tags[0] );
+        switch ( tag )
+        {
+        case FT_CURVE_TAG_ON:  /* emit a single line_to */
+          {
+            FT_Vector  vec;
+
+
+            vec.x = SCALED( point->x );
+            vec.y = SCALED( point->y );
+
+            FT_TRACE5(( "  line to (%.2f, %.2f)\n",
+                        vec.x / 64.0, vec.y / 64.0 ));
+            error = func_interface->line_to( &vec, user );
+            if ( error )
+              goto Exit;
+            continue;
+          }
+
+        case FT_CURVE_TAG_CONIC:  /* consume conic arcs */
+          v_control.x = SCALED( point->x );
+          v_control.y = SCALED( point->y );
+
+        Do_Conic:
+          if ( point < limit )
+          {
+            FT_Vector  vec;
+            FT_Vector  v_middle;
+
+
+            point++;
+            tags++;
+            tag = FT_CURVE_TAG( tags[0] );
+
+            vec.x = SCALED( point->x );
+            vec.y = SCALED( point->y );
+
+            if ( tag == FT_CURVE_TAG_ON )
+            {
+              FT_TRACE5(( "  conic to (%.2f, %.2f)"
+                          " with control (%.2f, %.2f)\n",
+                          vec.x / 64.0, vec.y / 64.0,
+                          v_control.x / 64.0, v_control.y / 64.0 ));
+              error = func_interface->conic_to( &v_control, &vec, user );
+              if ( error )
+                goto Exit;
+              continue;
+            }
+
+            if ( tag != FT_CURVE_TAG_CONIC )
+              goto Invalid_Outline;
+
+            v_middle.x = ( v_control.x + vec.x ) / 2;
+            v_middle.y = ( v_control.y + vec.y ) / 2;
+
+            FT_TRACE5(( "  conic to (%.2f, %.2f)"
+                        " with control (%.2f, %.2f)\n",
+                        v_middle.x / 64.0, v_middle.y / 64.0,
+                        v_control.x / 64.0, v_control.y / 64.0 ));
+            error = func_interface->conic_to( &v_control, &v_middle, user );
+            if ( error )
+              goto Exit;
+
+            v_control = vec;
+            goto Do_Conic;
+          }
+
+          FT_TRACE5(( "  conic to (%.2f, %.2f)"
+                      " with control (%.2f, %.2f)\n",
+                      v_start.x / 64.0, v_start.y / 64.0,
+                      v_control.x / 64.0, v_control.y / 64.0 ));
+          error = func_interface->conic_to( &v_control, &v_start, user );
+          goto Close;
+
+        default:  /* FT_CURVE_TAG_CUBIC */
+          {
+            FT_Vector  vec1, vec2;
+
+
+            if ( point + 1 > limit                             ||
+                 FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
+              goto Invalid_Outline;
+
+            point += 2;
+            tags  += 2;
+
+            vec1.x = SCALED( point[-2].x );
+            vec1.y = SCALED( point[-2].y );
+
+            vec2.x = SCALED( point[-1].x );
+            vec2.y = SCALED( point[-1].y );
+
+            if ( point <= limit )
+            {
+              FT_Vector  vec;
+
+
+              vec.x = SCALED( point->x );
+              vec.y = SCALED( point->y );
+
+              FT_TRACE5(( "  cubic to (%.2f, %.2f)"
+                          " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
+                          vec.x / 64.0, vec.y / 64.0,
+                          vec1.x / 64.0, vec1.y / 64.0,
+                          vec2.x / 64.0, vec2.y / 64.0 ));
+              error = func_interface->cubic_to( &vec1, &vec2, &vec, user );
+              if ( error )
+                goto Exit;
+              continue;
+            }
+
+            FT_TRACE5(( "  cubic to (%.2f, %.2f)"
+                        " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
+                        v_start.x / 64.0, v_start.y / 64.0,
+                        vec1.x / 64.0, vec1.y / 64.0,
+                        vec2.x / 64.0, vec2.y / 64.0 ));
+            error = func_interface->cubic_to( &vec1, &vec2, &v_start, user );
+            goto Close;
+          }
+        }
+      }
+
+      /* close the contour with a line segment */
+      FT_TRACE5(( "  line to (%.2f, %.2f)\n",
+                  v_start.x / 64.0, v_start.y / 64.0 ));
+      error = func_interface->line_to( &v_start, user );
+
+    Close:
+      if ( error )
+        goto Exit;
+
+      first = last + 1;
+    }
+
+    FT_TRACE5(( "FT_Outline_Decompose: Done\n", n ));
+    return FT_Err_Ok;
+
+  Exit:
+    FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error ));
+    return error;
+
+  Invalid_Outline:
+    return FT_Err_Invalid_Outline;
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_New_Internal( FT_Memory    memory,
+                           FT_UInt      numPoints,
+                           FT_Int       numContours,
+                           FT_Outline  *anoutline )
+  {
+    FT_Error  error;
+
+
+    if ( !anoutline || !memory )
+      return FT_Err_Invalid_Argument;
+
+    *anoutline = null_outline;
+
+    if ( FT_NEW_ARRAY( anoutline->points,   numPoints   ) ||
+         FT_NEW_ARRAY( anoutline->tags,     numPoints   ) ||
+         FT_NEW_ARRAY( anoutline->contours, numContours ) )
+      goto Fail;
+
+    anoutline->n_points    = (FT_UShort)numPoints;
+    anoutline->n_contours  = (FT_Short)numContours;
+    anoutline->flags      |= FT_OUTLINE_OWNER;
+
+    return FT_Err_Ok;
+
+  Fail:
+    anoutline->flags |= FT_OUTLINE_OWNER;
+    FT_Outline_Done_Internal( memory, anoutline );
+
+    return error;
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_New( FT_Library   library,
+                  FT_UInt      numPoints,
+                  FT_Int       numContours,
+                  FT_Outline  *anoutline )
+  {
+    if ( !library )
+      return FT_Err_Invalid_Library_Handle;
+
+    return FT_Outline_New_Internal( library->memory, numPoints,
+                                    numContours, anoutline );
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_Check( FT_Outline*  outline )
+  {
+    if ( outline )
+    {
+      FT_Int  n_points   = outline->n_points;
+      FT_Int  n_contours = outline->n_contours;
+      FT_Int  end0, end;
+      FT_Int  n;
+
+
+      /* empty glyph? */
+      if ( n_points == 0 && n_contours == 0 )
+        return 0;
+
+      /* check point and contour counts */
+      if ( n_points <= 0 || n_contours <= 0 )
+        goto Bad;
+
+      end0 = end = -1;
+      for ( n = 0; n < n_contours; n++ )
+      {
+        end = outline->contours[n];
+
+        /* note that we don't accept empty contours */
+        if ( end <= end0 || end >= n_points )
+          goto Bad;
+
+        end0 = end;
+      }
+
+      if ( end != n_points - 1 )
+        goto Bad;
+
+      /* XXX: check the tags array */
+      return 0;
+    }
+
+  Bad:
+    return FT_Err_Invalid_Argument;
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_Copy( const FT_Outline*  source,
+                   FT_Outline        *target )
+  {
+    FT_Int  is_owner;
+
+
+    if ( !source            || !target            ||
+         source->n_points   != target->n_points   ||
+         source->n_contours != target->n_contours )
+      return FT_Err_Invalid_Argument;
+
+    if ( source == target )
+      return FT_Err_Ok;
+
+    FT_ARRAY_COPY( target->points, source->points, source->n_points );
+
+    FT_ARRAY_COPY( target->tags, source->tags, source->n_points );
+
+    FT_ARRAY_COPY( target->contours, source->contours, source->n_contours );
+
+    /* copy all flags, except the `FT_OUTLINE_OWNER' one */
+    is_owner      = target->flags & FT_OUTLINE_OWNER;
+    target->flags = source->flags;
+
+    target->flags &= ~FT_OUTLINE_OWNER;
+    target->flags |= is_owner;
+
+    return FT_Err_Ok;
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_Done_Internal( FT_Memory    memory,
+                            FT_Outline*  outline )
+  {
+    if ( memory && outline )
+    {
+      if ( outline->flags & FT_OUTLINE_OWNER )
+      {
+        FT_FREE( outline->points   );
+        FT_FREE( outline->tags     );
+        FT_FREE( outline->contours );
+      }
+      *outline = null_outline;
+
+      return FT_Err_Ok;
+    }
+    else
+      return FT_Err_Invalid_Argument;
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_Done( FT_Library   library,
+                   FT_Outline*  outline )
+  {
+    /* check for valid `outline' in FT_Outline_Done_Internal() */
+
+    if ( !library )
+      return FT_Err_Invalid_Library_Handle;
+
+    return FT_Outline_Done_Internal( library->memory, outline );
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Outline_Get_CBox( const FT_Outline*  outline,
+                       FT_BBox           *acbox )
+  {
+    FT_Pos  xMin, yMin, xMax, yMax;
+
+
+    if ( outline && acbox )
+    {
+      if ( outline->n_points == 0 )
+      {
+        xMin = 0;
+        yMin = 0;
+        xMax = 0;
+        yMax = 0;
+      }
+      else
+      {
+        FT_Vector*  vec   = outline->points;
+        FT_Vector*  limit = vec + outline->n_points;
+
+
+        xMin = xMax = vec->x;
+        yMin = yMax = vec->y;
+        vec++;
+
+        for ( ; vec < limit; vec++ )
+        {
+          FT_Pos  x, y;
+
+
+          x = vec->x;
+          if ( x < xMin ) xMin = x;
+          if ( x > xMax ) xMax = x;
+
+          y = vec->y;
+          if ( y < yMin ) yMin = y;
+          if ( y > yMax ) yMax = y;
+        }
+      }
+      acbox->xMin = xMin;
+      acbox->xMax = xMax;
+      acbox->yMin = yMin;
+      acbox->yMax = yMax;
+    }
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Outline_Translate( const FT_Outline*  outline,
+                        FT_Pos             xOffset,
+                        FT_Pos             yOffset )
+  {
+    FT_UShort   n;
+    FT_Vector*  vec;
+
+
+    if ( !outline )
+      return;
+
+    vec = outline->points;
+
+    for ( n = 0; n < outline->n_points; n++ )
+    {
+      vec->x += xOffset;
+      vec->y += yOffset;
+      vec++;
+    }
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Outline_Reverse( FT_Outline*  outline )
+  {
+    FT_UShort  n;
+    FT_Int     first, last;
+
+
+    if ( !outline )
+      return;
+
+    first = 0;
+
+    for ( n = 0; n < outline->n_contours; n++ )
+    {
+      last  = outline->contours[n];
+
+      /* reverse point table */
+      {
+        FT_Vector*  p = outline->points + first;
+        FT_Vector*  q = outline->points + last;
+        FT_Vector   swap;
+
+
+        while ( p < q )
+        {
+          swap = *p;
+          *p   = *q;
+          *q   = swap;
+          p++;
+          q--;
+        }
+      }
+
+      /* reverse tags table */
+      {
+        char*  p = outline->tags + first;
+        char*  q = outline->tags + last;
+        char   swap;
+
+
+        while ( p < q )
+        {
+          swap = *p;
+          *p   = *q;
+          *q   = swap;
+          p++;
+          q--;
+        }
+      }
+
+      first = last + 1;
+    }
+
+    outline->flags ^= FT_OUTLINE_REVERSE_FILL;
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_Render( FT_Library         library,
+                     FT_Outline*        outline,
+                     FT_Raster_Params*  params )
+  {
+    FT_Error     error;
+    FT_Bool      update = FALSE;
+    FT_Renderer  renderer;
+    FT_ListNode  node;
+
+
+    if ( !library )
+      return FT_Err_Invalid_Library_Handle;
+
+    if ( !outline || !params )
+      return FT_Err_Invalid_Argument;
+
+    renderer = library->cur_renderer;
+    node     = library->renderers.head;
+
+    params->source = (void*)outline;
+
+    error = FT_Err_Cannot_Render_Glyph;
+    while ( renderer )
+    {
+      error = renderer->raster_render( renderer->raster, params );
+      if ( !error || FT_ERROR_BASE( error ) != FT_Err_Cannot_Render_Glyph )
+        break;
+
+      /* FT_Err_Cannot_Render_Glyph is returned if the render mode   */
+      /* is unsupported by the current renderer for this glyph image */
+      /* format                                                      */
+
+      /* now, look for another renderer that supports the same */
+      /* format                                                */
+      renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE,
+                                     &node );
+      update   = TRUE;
+    }
+
+    /* if we changed the current renderer for the glyph image format */
+    /* we need to select it as the next current one                  */
+    if ( !error && update && renderer )
+      FT_Set_Renderer( library, renderer, 0, 0 );
+
+    return error;
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_Get_Bitmap( FT_Library        library,
+                         FT_Outline*       outline,
+                         const FT_Bitmap  *abitmap )
+  {
+    FT_Raster_Params  params;
+
+
+    if ( !abitmap )
+      return FT_Err_Invalid_Argument;
+
+    /* other checks are delayed to FT_Outline_Render() */
+
+    params.target = abitmap;
+    params.flags  = 0;
+
+    if ( abitmap->pixel_mode == FT_PIXEL_MODE_GRAY  ||
+         abitmap->pixel_mode == FT_PIXEL_MODE_LCD   ||
+         abitmap->pixel_mode == FT_PIXEL_MODE_LCD_V )
+      params.flags |= FT_RASTER_FLAG_AA;
+
+    return FT_Outline_Render( library, outline, &params );
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Vector_Transform( FT_Vector*        vector,
+                       const FT_Matrix*  matrix )
+  {
+    FT_Pos  xz, yz;
+
+
+    if ( !vector || !matrix )
+      return;
+
+    xz = FT_MulFix( vector->x, matrix->xx ) +
+         FT_MulFix( vector->y, matrix->xy );
+
+    yz = FT_MulFix( vector->x, matrix->yx ) +
+         FT_MulFix( vector->y, matrix->yy );
+
+    vector->x = xz;
+    vector->y = yz;
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Outline_Transform( const FT_Outline*  outline,
+                        const FT_Matrix*   matrix )
+  {
+    FT_Vector*  vec;
+    FT_Vector*  limit;
+
+
+    if ( !outline || !matrix )
+      return;
+
+    vec   = outline->points;
+    limit = vec + outline->n_points;
+
+    for ( ; vec < limit; vec++ )
+      FT_Vector_Transform( vec, matrix );
+  }
+
+
+#if 0
+
+#define FT_OUTLINE_GET_CONTOUR( outline, c, first, last )  \
+  do {                                                     \
+    (first) = ( c > 0 ) ? (outline)->points +              \
+                            (outline)->contours[c - 1] + 1 \
+                        : (outline)->points;               \
+    (last) = (outline)->points + (outline)->contours[c];   \
+  } while ( 0 )
+
+
+  /* Is a point in some contour?                     */
+  /*                                                 */
+  /* We treat every point of the contour as if it    */
+  /* it were ON.  That is, we allow false positives, */
+  /* but disallow false negatives.  (XXX really?)    */
+  static FT_Bool
+  ft_contour_has( FT_Outline*  outline,
+                  FT_Short     c,
+                  FT_Vector*   point )
+  {
+    FT_Vector*  first;
+    FT_Vector*  last;
+    FT_Vector*  a;
+    FT_Vector*  b;
+    FT_UInt     n = 0;
+
+
+    FT_OUTLINE_GET_CONTOUR( outline, c, first, last );
+
+    for ( a = first; a <= last; a++ )
+    {
+      FT_Pos  x;
+      FT_Int  intersect;
+
+
+      b = ( a == last ) ? first : a + 1;
+
+      intersect = ( a->y - point->y ) ^ ( b->y - point->y );
+
+      /* a and b are on the same side */
+      if ( intersect >= 0 )
+      {
+        if ( intersect == 0 && a->y == point->y )
+        {
+          if ( ( a->x <= point->x && b->x >= point->x ) ||
+               ( a->x >= point->x && b->x <= point->x ) )
+            return 1;
+        }
+
+        continue;
+      }
+
+      x = a->x + ( b->x - a->x ) * (point->y - a->y ) / ( b->y - a->y );
+
+      if ( x < point->x )
+        n++;
+      else if ( x == point->x )
+        return 1;
+    }
+
+    return n & 1;
+  }
+
+
+  static FT_Bool
+  ft_contour_enclosed( FT_Outline*  outline,
+                       FT_UShort    c )
+  {
+    FT_Vector*  first;
+    FT_Vector*  last;
+    FT_Short    i;
+
+
+    FT_OUTLINE_GET_CONTOUR( outline, c, first, last );
+
+    for ( i = 0; i < outline->n_contours; i++ )
+    {
+      if ( i != c && ft_contour_has( outline, i, first ) )
+      {
+        FT_Vector*  pt;
+
+
+        for ( pt = first + 1; pt <= last; pt++ )
+          if ( !ft_contour_has( outline, i, pt ) )
+            return 0;
+
+        return 1;
+      }
+    }
+
+    return 0;
+  }
+
+
+  /* This version differs from the public one in that each */
+  /* part (contour not enclosed in another contour) of the */
+  /* outline is checked for orientation.  This is          */
+  /* necessary for some buggy CJK fonts.                   */
+  static FT_Orientation
+  ft_outline_get_orientation( FT_Outline*  outline )
+  {
+    FT_Short        i;
+    FT_Vector*      first;
+    FT_Vector*      last;
+    FT_Orientation  orient = FT_ORIENTATION_NONE;
+
+
+    first = outline->points;
+    for ( i = 0; i < outline->n_contours; i++, first = last + 1 )
+    {
+      FT_Vector*  point;
+      FT_Vector*  xmin_point;
+      FT_Pos      xmin;
+
+
+      last = outline->points + outline->contours[i];
+
+      /* skip degenerate contours */
+      if ( last < first + 2 )
+        continue;
+
+      if ( ft_contour_enclosed( outline, i ) )
+        continue;
+
+      xmin       = first->x;
+      xmin_point = first;
+
+      for ( point = first + 1; point <= last; point++ )
+      {
+        if ( point->x < xmin )
+        {
+          xmin       = point->x;
+          xmin_point = point;
+        }
+      }
+
+      /* check the orientation of the contour */
+      {
+        FT_Vector*      prev;
+        FT_Vector*      next;
+        FT_Orientation  o;
+
+
+        prev = ( xmin_point == first ) ? last : xmin_point - 1;
+        next = ( xmin_point == last ) ? first : xmin_point + 1;
+
+        if ( FT_Atan2( prev->x - xmin_point->x, prev->y - xmin_point->y ) >
+             FT_Atan2( next->x - xmin_point->x, next->y - xmin_point->y ) )
+          o = FT_ORIENTATION_POSTSCRIPT;
+        else
+          o = FT_ORIENTATION_TRUETYPE;
+
+        if ( orient == FT_ORIENTATION_NONE )
+          orient = o;
+        else if ( orient != o )
+          return FT_ORIENTATION_NONE;
+      }
+    }
+
+    return orient;
+  }
+
+#endif /* 0 */
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Outline_Embolden( FT_Outline*  outline,
+                       FT_Pos       strength )
+  {
+    FT_Vector*  points;
+    FT_Vector   v_prev, v_first, v_next, v_cur;
+    FT_Angle    rotate, angle_in, angle_out;
+    FT_Int      c, n, first;
+    FT_Int      orientation;
+
+
+    if ( !outline )
+      return FT_Err_Invalid_Argument;
+
+    strength /= 2;
+    if ( strength == 0 )
+      return FT_Err_Ok;
+
+    orientation = FT_Outline_Get_Orientation( outline );
+    if ( orientation == FT_ORIENTATION_NONE )
+    {
+      if ( outline->n_contours )
+        return FT_Err_Invalid_Argument;
+      else
+        return FT_Err_Ok;
+    }
+
+    if ( orientation == FT_ORIENTATION_TRUETYPE )
+      rotate = -FT_ANGLE_PI2;
+    else
+      rotate = FT_ANGLE_PI2;
+
+    points = outline->points;
+
+    first = 0;
+    for ( c = 0; c < outline->n_contours; c++ )
+    {
+      int  last = outline->contours[c];
+
+
+      v_first = points[first];
+      v_prev  = points[last];
+      v_cur   = v_first;
+
+      for ( n = first; n <= last; n++ )
+      {
+        FT_Vector  in, out;
+        FT_Angle   angle_diff;
+        FT_Pos     d;
+        FT_Fixed   scale;
+
+
+        if ( n < last )
+          v_next = points[n + 1];
+        else
+          v_next = v_first;
+
+        /* compute the in and out vectors */
+        in.x = v_cur.x - v_prev.x;
+        in.y = v_cur.y - v_prev.y;
+
+        out.x = v_next.x - v_cur.x;
+        out.y = v_next.y - v_cur.y;
+
+        angle_in   = FT_Atan2( in.x, in.y );
+        angle_out  = FT_Atan2( out.x, out.y );
+        angle_diff = FT_Angle_Diff( angle_in, angle_out );
+        scale      = FT_Cos( angle_diff / 2 );
+
+        if ( scale < 0x4000L && scale > -0x4000L )
+          in.x = in.y = 0;
+        else
+        {
+          d = FT_DivFix( strength, scale );
+
+          FT_Vector_From_Polar( &in, d, angle_in + angle_diff / 2 - rotate );
+        }
+
+        outline->points[n].x = v_cur.x + strength + in.x;
+        outline->points[n].y = v_cur.y + strength + in.y;
+
+        v_prev = v_cur;
+        v_cur  = v_next;
+      }
+
+      first = last + 1;
+    }
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftoutln.h */
+
+  FT_EXPORT_DEF( FT_Orientation )
+  FT_Outline_Get_Orientation( FT_Outline*  outline )
+  {
+    FT_Pos      xmin       = 32768L;
+    FT_Pos      xmin_ymin  = 32768L;
+    FT_Pos      xmin_ymax  = -32768L;
+    FT_Vector*  xmin_first = NULL;
+    FT_Vector*  xmin_last  = NULL;
+
+    short*      contour;
+
+    FT_Vector*  first;
+    FT_Vector*  last;
+    FT_Vector*  prev;
+    FT_Vector*  point;
+
+    int             i;
+    FT_Pos          ray_y[3];
+    FT_Orientation  result[3] =
+      { FT_ORIENTATION_NONE, FT_ORIENTATION_NONE, FT_ORIENTATION_NONE };
+
+
+    if ( !outline || outline->n_points <= 0 )
+      return FT_ORIENTATION_TRUETYPE;
+
+    /* We use the nonzero winding rule to find the orientation.       */
+    /* Since glyph outlines behave much more `regular' than arbitrary */
+    /* cubic or quadratic curves, this test deals with the polygon    */
+    /* only which is spanned up by the control points.                */
+
+    first = outline->points;
+    for ( contour = outline->contours;
+          contour < outline->contours + outline->n_contours;
+          contour++, first = last + 1 )
+    {
+      FT_Pos  contour_xmin = 32768L;
+      FT_Pos  contour_xmax = -32768L;
+      FT_Pos  contour_ymin = 32768L;
+      FT_Pos  contour_ymax = -32768L;
+
+
+      last = outline->points + *contour;
+
+      /* skip degenerate contours */
+      if ( last < first + 2 )
+        continue;
+
+      for ( point = first; point <= last; ++point )
+      {
+        if ( point->x < contour_xmin )
+          contour_xmin = point->x;
+
+        if ( point->x > contour_xmax )
+          contour_xmax = point->x;
+
+        if ( point->y < contour_ymin )
+          contour_ymin = point->y;
+
+        if ( point->y > contour_ymax )
+          contour_ymax = point->y;
+      }
+
+      if ( contour_xmin < xmin          &&
+           contour_xmin != contour_xmax &&
+           contour_ymin != contour_ymax )
+      {
+        xmin       = contour_xmin;
+        xmin_ymin  = contour_ymin;
+        xmin_ymax  = contour_ymax;
+        xmin_first = first;
+        xmin_last  = last;
+      }
+    }
+
+    if ( xmin == 32768L )
+      return FT_ORIENTATION_TRUETYPE;
+
+    ray_y[0] = ( xmin_ymin * 3 + xmin_ymax     ) >> 2;
+    ray_y[1] = ( xmin_ymin     + xmin_ymax     ) >> 1;
+    ray_y[2] = ( xmin_ymin     + xmin_ymax * 3 ) >> 2;
+
+    for ( i = 0; i < 3; i++ )
+    {
+      FT_Pos      left_x;
+      FT_Pos      right_x;
+      FT_Vector*  left1;
+      FT_Vector*  left2;
+      FT_Vector*  right1;
+      FT_Vector*  right2;
+
+
+    RedoRay:
+      left_x  = 32768L;
+      right_x = -32768L;
+
+      left1 = left2 = right1 = right2 = NULL;
+
+      prev = xmin_last;
+      for ( point = xmin_first; point <= xmin_last; prev = point, ++point )
+      {
+        FT_Pos  tmp_x;
+
+
+        if ( point->y == ray_y[i] || prev->y == ray_y[i] )
+        {
+          ray_y[i]++;
+          goto RedoRay;
+        }
+
+        if ( ( point->y < ray_y[i] && prev->y < ray_y[i] ) ||
+             ( point->y > ray_y[i] && prev->y > ray_y[i] ) )
+          continue;
+
+        tmp_x = FT_MulDiv( point->x - prev->x,
+                           ray_y[i] - prev->y,
+                           point->y - prev->y ) + prev->x;
+
+        if ( tmp_x < left_x )
+        {
+          left_x = tmp_x;
+          left1  = prev;
+          left2  = point;
+        }
+
+        if ( tmp_x > right_x )
+        {
+          right_x = tmp_x;
+          right1  = prev;
+          right2  = point;
+        }
+      }
+
+      if ( left1 && right1 )
+      {
+        if ( left1->y < left2->y && right1->y > right2->y )
+          result[i] = FT_ORIENTATION_TRUETYPE;
+        else if ( left1->y > left2->y && right1->y < right2->y )
+          result[i] = FT_ORIENTATION_POSTSCRIPT;
+        else
+          result[i] = FT_ORIENTATION_NONE;
+      }
+    }
+
+    if ( result[0] != FT_ORIENTATION_NONE                     &&
+         ( result[0] == result[1] || result[0] == result[2] ) )
+      return result[0];
+
+    if ( result[1] != FT_ORIENTATION_NONE && result[1] == result[2] )
+      return result[1];
+
+    return FT_ORIENTATION_TRUETYPE;
+  }
+
+
+/* END */
diff --git a/src/base/ftpatent.c b/src/base/ftpatent.c
new file mode 100644 (file)
index 0000000..82b42f0
--- /dev/null
@@ -0,0 +1,286 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftpatent.c                                                             */
+/*                                                                         */
+/*    FreeType API for checking patented TrueType bytecode instructions    */
+/*    (body).                                                              */
+/*                                                                         */
+/*  Copyright 2007, 2008, 2010 by David Turner.                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_TRUETYPE_TAGS_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_STREAM_H
+#include FT_SERVICE_SFNT_H
+#include FT_SERVICE_TRUETYPE_GLYF_H
+
+
+  static FT_Bool
+  _tt_check_patents_in_range( FT_Stream  stream,
+                              FT_ULong   size )
+  {
+    FT_Bool   result = FALSE;
+    FT_Error  error;
+    FT_Bytes  p, end;
+
+
+    if ( FT_FRAME_ENTER( size ) )
+      return 0;
+
+    p   = stream->cursor;
+    end = p + size;
+
+    while ( p < end )
+    {
+      switch (p[0])
+      {
+      case 0x06:  /* SPvTL // */
+      case 0x07:  /* SPvTL +  */
+      case 0x08:  /* SFvTL // */
+      case 0x09:  /* SFvTL +  */
+      case 0x0A:  /* SPvFS    */
+      case 0x0B:  /* SFvFS    */
+        result = TRUE;
+        goto Exit;
+
+      case 0x40:
+        if ( p + 1 >= end )
+          goto Exit;
+
+        p += p[1] + 2;
+        break;
+
+      case 0x41:
+        if ( p + 1 >= end )
+          goto Exit;
+
+        p += p[1] * 2 + 2;
+        break;
+
+      case 0x71:  /* DELTAP2 */
+      case 0x72:  /* DELTAP3 */
+      case 0x73:  /* DELTAC0 */
+      case 0x74:  /* DELTAC1 */
+      case 0x75:  /* DELTAC2 */
+        result = TRUE;
+        goto Exit;
+
+      case 0xB0:
+      case 0xB1:
+      case 0xB2:
+      case 0xB3:
+      case 0xB4:
+      case 0xB5:
+      case 0xB6:
+      case 0xB7:
+        p += ( p[0] - 0xB0 ) + 2;
+        break;
+
+      case 0xB8:
+      case 0xB9:
+      case 0xBA:
+      case 0xBB:
+      case 0xBC:
+      case 0xBD:
+      case 0xBE:
+      case 0xBF:
+        p += ( p[0] - 0xB8 ) * 2 + 3;
+        break;
+
+      default:
+        p += 1;
+        break;
+      }
+    }
+
+  Exit:
+    FT_UNUSED( error );
+    FT_FRAME_EXIT();
+    return result;
+  }
+
+
+  static FT_Bool
+  _tt_check_patents_in_table( FT_Face   face,
+                              FT_ULong  tag )
+  {
+    FT_Stream              stream = face->stream;
+    FT_Error               error  = FT_Err_Ok;
+    FT_Service_SFNT_Table  service;
+    FT_Bool                result = FALSE;
+
+
+    FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
+
+    if ( service )
+    {
+      FT_UInt   i = 0;
+      FT_ULong  tag_i = 0, offset_i = 0, length_i = 0;
+
+
+      for ( i = 0; !error && tag_i != tag ; i++ )
+        error = service->table_info( face, i,
+                                     &tag_i, &offset_i, &length_i );
+
+      if ( error                      ||
+           FT_STREAM_SEEK( offset_i ) )
+        goto Exit;
+
+      result = _tt_check_patents_in_range( stream, length_i );
+    }
+
+  Exit:
+    return result;
+  }
+
+
+  static FT_Bool
+  _tt_face_check_patents( FT_Face  face )
+  {
+    FT_Stream  stream = face->stream;
+    FT_UInt    gindex;
+    FT_Error   error;
+    FT_Bool    result;
+
+    FT_Service_TTGlyf  service;
+
+
+    result = _tt_check_patents_in_table( face, TTAG_fpgm );
+    if ( result )
+      goto Exit;
+
+    result = _tt_check_patents_in_table( face, TTAG_prep );
+    if ( result )
+      goto Exit;
+
+    FT_FACE_FIND_SERVICE( face, service, TT_GLYF );
+    if ( service == NULL )
+      goto Exit;
+
+    for ( gindex = 0; gindex < (FT_UInt)face->num_glyphs; gindex++ )
+    {
+      FT_ULong  offset, num_ins, size;
+      FT_Int    num_contours;
+
+
+      offset = service->get_location( face, gindex, &size );
+      if ( size == 0 )
+        continue;
+
+      if ( FT_STREAM_SEEK( offset )      ||
+           FT_READ_SHORT( num_contours ) )
+        continue;
+
+      if ( num_contours >= 0 )  /* simple glyph */
+      {
+        if ( FT_STREAM_SKIP( 8 + num_contours * 2 ) )
+          continue;
+      }
+      else  /* compound glyph */
+      {
+        FT_Bool  has_instr = 0;
+
+
+        if ( FT_STREAM_SKIP( 8 ) )
+          continue;
+
+        /* now read each component */
+        for (;;)
+        {
+          FT_UInt  flags, toskip;
+
+
+          if( FT_READ_USHORT( flags ) )
+            break;
+
+          toskip = 2 + 1 + 1;
+
+          if ( ( flags & ( 1 << 0 ) ) != 0 )       /* ARGS_ARE_WORDS */
+            toskip += 2;
+
+          if ( ( flags & ( 1 << 3 ) ) != 0 )       /* WE_HAVE_A_SCALE */
+            toskip += 2;
+          else if ( ( flags & ( 1 << 6 ) ) != 0 )  /* WE_HAVE_X_Y_SCALE */
+            toskip += 4;
+          else if ( ( flags & ( 1 << 7 ) ) != 0 )  /* WE_HAVE_A_2x2 */
+            toskip += 8;
+
+          if ( ( flags & ( 1 << 8 ) ) != 0 )       /* WE_HAVE_INSTRUCTIONS */
+            has_instr = 1;
+
+          if ( FT_STREAM_SKIP( toskip ) )
+            goto NextGlyph;
+
+          if ( ( flags & ( 1 << 5 ) ) == 0 )       /* MORE_COMPONENTS */
+            break;
+        }
+
+        if ( !has_instr )
+          goto NextGlyph;
+      }
+
+      if ( FT_READ_USHORT( num_ins ) )
+        continue;
+
+      result = _tt_check_patents_in_range( stream, num_ins );
+      if ( result )
+        goto Exit;
+
+    NextGlyph:
+      ;
+    }
+
+  Exit:
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Bool )
+  FT_Face_CheckTrueTypePatents( FT_Face  face )
+  {
+    FT_Bool  result = FALSE;
+
+
+    if ( face && FT_IS_SFNT( face ) )
+      result = _tt_face_check_patents( face );
+
+    return result;
+  }
+
+
+  /* documentation is in freetype.h */
+
+  FT_EXPORT_DEF( FT_Bool )
+  FT_Face_SetUnpatentedHinting( FT_Face  face,
+                                FT_Bool  value )
+  {
+    FT_Bool  result = FALSE;
+
+
+#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \
+    !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER )
+    if ( face && FT_IS_SFNT( face ) )
+    {
+      result = !face->internal->ignore_unpatented_hinter;
+      face->internal->ignore_unpatented_hinter = !value;
+    }
+#else
+    FT_UNUSED( face );
+    FT_UNUSED( value );
+#endif
+
+    return result;
+  }
+
+/* END */
diff --git a/src/base/ftpfr.c b/src/base/ftpfr.c
new file mode 100644 (file)
index 0000000..3a0f92d
--- /dev/null
@@ -0,0 +1,144 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftpfr.c                                                                */
+/*                                                                         */
+/*    FreeType API for accessing PFR-specific data (body).                 */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004, 2008, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_SERVICE_PFR_H
+
+
+  /* check the format */
+  static FT_Service_PfrMetrics
+  ft_pfr_check( FT_Face  face )
+  {
+    FT_Service_PfrMetrics  service = NULL;
+
+
+    if ( face )
+      FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS );
+
+    return service;
+  }
+
+
+  /* documentation is in ftpfr.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_PFR_Metrics( FT_Face    face,
+                      FT_UInt   *aoutline_resolution,
+                      FT_UInt   *ametrics_resolution,
+                      FT_Fixed  *ametrics_x_scale,
+                      FT_Fixed  *ametrics_y_scale )
+  {
+    FT_Error               error = FT_Err_Ok;
+    FT_Service_PfrMetrics  service;
+
+
+    if ( !face )
+      return FT_Err_Invalid_Argument;
+
+    service = ft_pfr_check( face );
+    if ( service )
+    {
+      error = service->get_metrics( face,
+                                    aoutline_resolution,
+                                    ametrics_resolution,
+                                    ametrics_x_scale,
+                                    ametrics_y_scale );
+    }
+    else
+    {
+      FT_Fixed  x_scale, y_scale;
+
+
+      /* this is not a PFR font */
+      if ( aoutline_resolution )
+        *aoutline_resolution = face->units_per_EM;
+
+      if ( ametrics_resolution )
+        *ametrics_resolution = face->units_per_EM;
+
+      x_scale = y_scale = 0x10000L;
+      if ( face->size )
+      {
+        x_scale = face->size->metrics.x_scale;
+        y_scale = face->size->metrics.y_scale;
+      }
+
+      if ( ametrics_x_scale )
+        *ametrics_x_scale = x_scale;
+
+      if ( ametrics_y_scale )
+        *ametrics_y_scale = y_scale;
+
+      error = FT_Err_Unknown_File_Format;
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftpfr.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_PFR_Kerning( FT_Face     face,
+                      FT_UInt     left,
+                      FT_UInt     right,
+                      FT_Vector  *avector )
+  {
+    FT_Error               error;
+    FT_Service_PfrMetrics  service;
+
+
+    if ( !face )
+      return FT_Err_Invalid_Argument;
+
+    service = ft_pfr_check( face );
+    if ( service )
+      error = service->get_kerning( face, left, right, avector );
+    else
+      error = FT_Get_Kerning( face, left, right,
+                              FT_KERNING_UNSCALED, avector );
+
+    return error;
+  }
+
+
+  /* documentation is in ftpfr.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_PFR_Advance( FT_Face   face,
+                      FT_UInt   gindex,
+                      FT_Pos   *aadvance )
+  {
+    FT_Error               error;
+    FT_Service_PfrMetrics  service;
+
+
+    service = ft_pfr_check( face );
+    if ( service )
+    {
+      error = service->get_advance( face, gindex, aadvance );
+    }
+    else
+      /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */
+      error = FT_Err_Invalid_Argument;
+
+    return error;
+  }
+
+
+/* END */
diff --git a/src/base/ftpic.c b/src/base/ftpic.c
new file mode 100644 (file)
index 0000000..b74e90d
--- /dev/null
@@ -0,0 +1,54 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftpic.c                                                                */
+/*                                                                         */
+/*    The FreeType position independent code services (body).              */
+/*                                                                         */
+/*  Copyright 2009 by                                                      */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_INTERNAL_OBJECTS_H
+#include "basepic.h"
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* documentation is in ftpic.h */
+
+  FT_BASE_DEF( FT_Error )
+  ft_pic_container_init( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Error  error = FT_Err_Ok;
+
+    FT_MEM_SET( pic_container, 0, sizeof ( *pic_container ) );
+
+    error = ft_base_pic_init( library );
+    if ( error )
+      return error;
+
+    return FT_Err_Ok;
+  }
+
+
+  /* Destroy the contents of the container. */
+  FT_BASE_DEF( void )
+  ft_pic_container_destroy( FT_Library  library )
+  {
+    ft_base_pic_free( library );
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/src/base/ftrfork.c b/src/base/ftrfork.c
new file mode 100644 (file)
index 0000000..01d8625
--- /dev/null
@@ -0,0 +1,849 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftrfork.c                                                              */
+/*                                                                         */
+/*    Embedded resource forks accessor (body).                             */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010 by                  */
+/*  Masatake YAMATO and Redhat K.K.                                        */
+/*                                                                         */
+/*  FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are     */
+/*  derived from ftobjs.c.                                                 */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/* Development of the code in this file is support of                      */
+/* Information-technology Promotion Agency, Japan.                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_RFORK_H
+#include "basepic.h"
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_raccess
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****               Resource fork directory access                    ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_BASE_DEF( FT_Error )
+  FT_Raccess_Get_HeaderInfo( FT_Library  library,
+                             FT_Stream   stream,
+                             FT_Long     rfork_offset,
+                             FT_Long    *map_offset,
+                             FT_Long    *rdata_pos )
+  {
+    FT_Error       error;
+    unsigned char  head[16], head2[16];
+    FT_Long        map_pos, rdata_len;
+    int            allzeros, allmatch, i;
+    FT_Long        type_list;
+
+    FT_UNUSED( library );
+
+
+    error = FT_Stream_Seek( stream, rfork_offset );
+    if ( error )
+      return error;
+
+    error = FT_Stream_Read( stream, (FT_Byte *)head, 16 );
+    if ( error )
+      return error;
+
+    *rdata_pos = rfork_offset + ( ( head[0] << 24 ) |
+                                  ( head[1] << 16 ) |
+                                  ( head[2] <<  8 ) |
+                                    head[3]         );
+    map_pos    = rfork_offset + ( ( head[4] << 24 ) |
+                                  ( head[5] << 16 ) |
+                                  ( head[6] <<  8 ) |
+                                    head[7]         );
+    rdata_len = ( head[ 8] << 24 ) |
+                ( head[ 9] << 16 ) |
+                ( head[10] <<  8 ) |
+                  head[11];
+
+    /* map_len = head[12] .. head[15] */
+
+    if ( *rdata_pos + rdata_len != map_pos || map_pos == rfork_offset )
+      return FT_Err_Unknown_File_Format;
+
+    error = FT_Stream_Seek( stream, map_pos );
+    if ( error )
+      return error;
+
+    head2[15] = (FT_Byte)( head[15] + 1 );       /* make it be different */
+
+    error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 );
+    if ( error )
+      return error;
+
+    allzeros = 1;
+    allmatch = 1;
+    for ( i = 0; i < 16; ++i )
+    {
+      if ( head2[i] != 0 )
+        allzeros = 0;
+      if ( head2[i] != head[i] )
+        allmatch = 0;
+    }
+    if ( !allzeros && !allmatch )
+      return FT_Err_Unknown_File_Format;
+
+    /* If we have reached this point then it is probably a mac resource */
+    /* file.  Now, does it contain any interesting resources?           */
+    /* Skip handle to next resource map, the file resource number, and  */
+    /* attributes.                                                      */
+    (void)FT_STREAM_SKIP( 4        /* skip handle to next resource map */
+                          + 2      /* skip file resource number */
+                          + 2 );   /* skip attributes */
+
+    if ( FT_READ_USHORT( type_list ) )
+      return error;
+    if ( type_list == -1 )
+      return FT_Err_Unknown_File_Format;
+
+    error = FT_Stream_Seek( stream, map_pos + type_list );
+    if ( error )
+      return error;
+
+    *map_offset = map_pos + type_list;
+    return FT_Err_Ok;
+  }
+
+
+  static int
+  ft_raccess_sort_ref_by_id( FT_RFork_Ref*  a,
+                             FT_RFork_Ref*  b )
+  {
+    if ( a->res_id < b->res_id )
+      return -1;
+    else if ( a->res_id > b->res_id )
+      return 1;
+    else
+      return 0;
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Raccess_Get_DataOffsets( FT_Library  library,
+                              FT_Stream   stream,
+                              FT_Long     map_offset,
+                              FT_Long     rdata_pos,
+                              FT_Long     tag,
+                              FT_Long   **offsets,
+                              FT_Long    *count )
+  {
+    FT_Error      error;
+    int           i, j, cnt, subcnt;
+    FT_Long       tag_internal, rpos;
+    FT_Memory     memory = library->memory;
+    FT_Long       temp;
+    FT_Long       *offsets_internal = NULL;
+    FT_RFork_Ref  *ref = NULL;
+
+
+    error = FT_Stream_Seek( stream, map_offset );
+    if ( error )
+      return error;
+
+    if ( FT_READ_USHORT( cnt ) )
+      return error;
+    cnt++;
+
+    for ( i = 0; i < cnt; ++i )
+    {
+      if ( FT_READ_LONG( tag_internal ) ||
+           FT_READ_USHORT( subcnt )     ||
+           FT_READ_USHORT( rpos )       )
+        return error;
+
+      FT_TRACE2(( "Resource tags: %c%c%c%c\n",
+                  (char)( 0xff & ( tag_internal >> 24 ) ),
+                  (char)( 0xff & ( tag_internal >> 16 ) ),
+                  (char)( 0xff & ( tag_internal >>  8 ) ),
+                  (char)( 0xff & ( tag_internal >>  0 ) ) ));
+
+      if ( tag_internal == tag )
+      {
+        *count = subcnt + 1;
+        rpos  += map_offset;
+
+        error = FT_Stream_Seek( stream, rpos );
+        if ( error )
+          return error;
+
+        if ( FT_NEW_ARRAY( ref, *count ) )
+          return error;
+
+        for ( j = 0; j < *count; ++j )
+        {
+          if ( FT_READ_USHORT( ref[j].res_id ) )
+            goto Exit;
+          if ( FT_STREAM_SKIP( 2 ) ) /* resource name */
+            goto Exit;
+          if ( FT_READ_LONG( temp ) )
+            goto Exit;
+          if ( FT_STREAM_SKIP( 4 ) ) /* mbz */
+            goto Exit;
+
+          ref[j].offset = temp & 0xFFFFFFL;
+        }
+
+        ft_qsort( ref, *count, sizeof ( FT_RFork_Ref ),
+                  ( int(*)(const void*, const void*) )
+                  ft_raccess_sort_ref_by_id );
+
+        if ( FT_NEW_ARRAY( offsets_internal, *count ) )
+          goto Exit;
+
+        /* XXX: duplicated reference ID,
+         *      gap between reference IDs are acceptable?
+         *      further investigation on Apple implementation is needed.
+         */
+        for ( j = 0; j < *count; ++j )
+          offsets_internal[j] = rdata_pos + ref[j].offset;
+
+        *offsets = offsets_internal;
+        error    = FT_Err_Ok;
+
+      Exit:
+        FT_FREE( ref );
+        return error;
+      }
+    }
+
+    return FT_Err_Cannot_Open_Resource;
+  }
+
+
+#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                     Guessing functions                          ****/
+  /****                                                                 ****/
+  /****            When you add a new guessing function,                ****/
+  /****           update FT_RACCESS_N_RULES in ftrfork.h.               ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static FT_Error
+  raccess_guess_apple_double( FT_Library  library,
+                              FT_Stream   stream,
+                              char       *base_file_name,
+                              char      **result_file_name,
+                              FT_Long    *result_offset );
+
+  static FT_Error
+  raccess_guess_apple_single( FT_Library  library,
+                              FT_Stream   stream,
+                              char       *base_file_name,
+                              char      **result_file_name,
+                              FT_Long    *result_offset );
+
+  static FT_Error
+  raccess_guess_darwin_ufs_export( FT_Library  library,
+                                   FT_Stream   stream,
+                                   char       *base_file_name,
+                                   char      **result_file_name,
+                                   FT_Long    *result_offset );
+
+  static FT_Error
+  raccess_guess_darwin_newvfs( FT_Library  library,
+                               FT_Stream   stream,
+                               char       *base_file_name,
+                               char      **result_file_name,
+                               FT_Long    *result_offset );
+
+  static FT_Error
+  raccess_guess_darwin_hfsplus( FT_Library  library,
+                                FT_Stream   stream,
+                                char       *base_file_name,
+                                char      **result_file_name,
+                                FT_Long    *result_offset );
+
+  static FT_Error
+  raccess_guess_vfat( FT_Library  library,
+                      FT_Stream   stream,
+                      char       *base_file_name,
+                      char      **result_file_name,
+                      FT_Long    *result_offset );
+
+  static FT_Error
+  raccess_guess_linux_cap( FT_Library  library,
+                           FT_Stream   stream,
+                           char       *base_file_name,
+                           char      **result_file_name,
+                           FT_Long    *result_offset );
+
+  static FT_Error
+  raccess_guess_linux_double( FT_Library  library,
+                              FT_Stream   stream,
+                              char       *base_file_name,
+                              char      **result_file_name,
+                              FT_Long    *result_offset );
+
+  static FT_Error
+  raccess_guess_linux_netatalk( FT_Library  library,
+                                FT_Stream   stream,
+                                char       *base_file_name,
+                                char      **result_file_name,
+                                FT_Long    *result_offset );
+
+
+  CONST_FT_RFORK_RULE_ARRAY_BEGIN(ft_raccess_guess_table,
+                                  ft_raccess_guess_rec)
+  CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_double,      apple_double)
+  CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_single,      apple_single)
+  CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_ufs_export, darwin_ufs_export)
+  CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_newvfs,     darwin_newvfs)
+  CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_hfsplus,    darwin_hfsplus)
+  CONST_FT_RFORK_RULE_ARRAY_ENTRY(vfat,              vfat)
+  CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_cap,         linux_cap)
+  CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_double,      linux_double)
+  CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_netatalk,    linux_netatalk)
+  CONST_FT_RFORK_RULE_ARRAY_END
+
+
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                       Helper functions                          ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+
+  static FT_Error
+  raccess_guess_apple_generic( FT_Library  library,
+                               FT_Stream   stream,
+                               char       *base_file_name,
+                               FT_Int32    magic,
+                               FT_Long    *result_offset );
+
+  static FT_Error
+  raccess_guess_linux_double_from_file_name( FT_Library  library,
+                                             char *      file_name,
+                                             FT_Long    *result_offset );
+
+  static char *
+  raccess_make_file_name( FT_Memory    memory,
+                          const char  *original_name,
+                          const char  *insertion );
+
+  FT_BASE_DEF( void )
+  FT_Raccess_Guess( FT_Library  library,
+                    FT_Stream   stream,
+                    char*       base_name,
+                    char      **new_names,
+                    FT_Long    *offsets,
+                    FT_Error   *errors )
+  {
+    FT_Long  i;
+
+
+    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
+    {
+      new_names[i] = NULL;
+      if ( NULL != stream )
+        errors[i] = FT_Stream_Seek( stream, 0 );
+      else
+        errors[i] = FT_Err_Ok;
+
+      if ( errors[i] )
+        continue ;
+
+      errors[i] = (FT_RACCESS_GUESS_TABLE_GET[i].func)( library,
+                                                 stream, base_name,
+                                                 &(new_names[i]),
+                                                 &(offsets[i]) );
+    }
+
+    return;
+  }
+
+
+#ifndef FT_MACINTOSH
+  static FT_RFork_Rule
+  raccess_get_rule_type_from_rule_index( FT_Library  library,
+                                         FT_UInt     rule_index )
+  {
+    FT_UNUSED( library );
+
+    if ( rule_index >= FT_RACCESS_N_RULES )
+      return FT_RFork_Rule_invalid;
+
+    return FT_RACCESS_GUESS_TABLE_GET[rule_index].type;
+  }
+
+
+  /*
+   * For this function, refer ftbase.h.
+   */
+  FT_LOCAL_DEF( FT_Bool )
+  ft_raccess_rule_by_darwin_vfs( FT_Library  library,
+                                 FT_UInt     rule_index )
+  {
+    switch( raccess_get_rule_type_from_rule_index( library, rule_index ) )
+    {
+      case FT_RFork_Rule_darwin_newvfs:
+      case FT_RFork_Rule_darwin_hfsplus:
+        return TRUE;
+
+      default:
+        return FALSE;
+    }
+  }
+#endif
+
+
+  static FT_Error
+  raccess_guess_apple_double( FT_Library  library,
+                              FT_Stream   stream,
+                              char       *base_file_name,
+                              char      **result_file_name,
+                              FT_Long    *result_offset )
+  {
+    FT_Int32  magic = ( 0x00 << 24 ) |
+                      ( 0x05 << 16 ) |
+                      ( 0x16 <<  8 ) |
+                        0x07;
+
+
+    *result_file_name = NULL;
+    if ( NULL == stream )
+      return FT_Err_Cannot_Open_Stream;
+
+    return raccess_guess_apple_generic( library, stream, base_file_name,
+                                        magic, result_offset );
+  }
+
+
+  static FT_Error
+  raccess_guess_apple_single( FT_Library  library,
+                              FT_Stream   stream,
+                              char       *base_file_name,
+                              char      **result_file_name,
+                              FT_Long    *result_offset )
+  {
+    FT_Int32  magic = ( 0x00 << 24 ) |
+                      ( 0x05 << 16 ) |
+                      ( 0x16 <<  8 ) |
+                        0x00;
+
+
+    *result_file_name = NULL;
+    if ( NULL == stream )
+      return FT_Err_Cannot_Open_Stream;
+
+    return raccess_guess_apple_generic( library, stream, base_file_name,
+                                        magic, result_offset );
+  }
+
+
+  static FT_Error
+  raccess_guess_darwin_ufs_export( FT_Library  library,
+                                   FT_Stream   stream,
+                                   char       *base_file_name,
+                                   char      **result_file_name,
+                                   FT_Long    *result_offset )
+  {
+    char*      newpath;
+    FT_Error   error;
+    FT_Memory  memory;
+
+    FT_UNUSED( stream );
+
+
+    memory  = library->memory;
+    newpath = raccess_make_file_name( memory, base_file_name, "._" );
+    if ( !newpath )
+      return FT_Err_Out_Of_Memory;
+
+    error = raccess_guess_linux_double_from_file_name( library, newpath,
+                                                       result_offset );
+    if ( !error )
+      *result_file_name = newpath;
+    else
+      FT_FREE( newpath );
+
+    return error;
+  }
+
+
+  static FT_Error
+  raccess_guess_darwin_hfsplus( FT_Library  library,
+                                FT_Stream   stream,
+                                char       *base_file_name,
+                                char      **result_file_name,
+                                FT_Long    *result_offset )
+  {
+    /*
+      Only meaningful on systems with hfs+ drivers (or Macs).
+     */
+    FT_Error   error;
+    char*      newpath = NULL;
+    FT_Memory  memory;
+    FT_Long    base_file_len = ft_strlen( base_file_name );
+
+    FT_UNUSED( stream );
+
+
+    memory = library->memory;
+
+    if ( base_file_len + 6 > FT_INT_MAX )
+      return FT_Err_Array_Too_Large;
+
+    if ( FT_ALLOC( newpath, base_file_len + 6 ) )
+      return error;
+
+    FT_MEM_COPY( newpath, base_file_name, base_file_len );
+    FT_MEM_COPY( newpath + base_file_len, "/rsrc", 6 );
+
+    *result_file_name = newpath;
+    *result_offset    = 0;
+
+    return FT_Err_Ok;
+  }
+
+
+  static FT_Error
+  raccess_guess_darwin_newvfs( FT_Library  library,
+                               FT_Stream   stream,
+                               char       *base_file_name,
+                               char      **result_file_name,
+                               FT_Long    *result_offset )
+  {
+    /*
+      Only meaningful on systems with Mac OS X (> 10.1).
+     */
+    FT_Error   error;
+    char*      newpath = NULL;
+    FT_Memory  memory;
+    FT_Long    base_file_len = ft_strlen( base_file_name );
+
+    FT_UNUSED( stream );
+
+
+    memory = library->memory;
+
+    if ( base_file_len + 18 > FT_INT_MAX )
+      return FT_Err_Array_Too_Large;
+
+    if ( FT_ALLOC( newpath, base_file_len + 18 ) )
+      return error;
+
+    FT_MEM_COPY( newpath, base_file_name, base_file_len );
+    FT_MEM_COPY( newpath + base_file_len, "/..namedfork/rsrc", 18 );
+
+    *result_file_name = newpath;
+    *result_offset    = 0;
+
+    return FT_Err_Ok;
+  }
+
+
+  static FT_Error
+  raccess_guess_vfat( FT_Library  library,
+                      FT_Stream   stream,
+                      char       *base_file_name,
+                      char      **result_file_name,
+                      FT_Long    *result_offset )
+  {
+    char*      newpath;
+    FT_Memory  memory;
+
+    FT_UNUSED( stream );
+
+
+    memory = library->memory;
+
+    newpath = raccess_make_file_name( memory, base_file_name,
+                                      "resource.frk/" );
+    if ( !newpath )
+      return FT_Err_Out_Of_Memory;
+
+    *result_file_name = newpath;
+    *result_offset    = 0;
+
+    return FT_Err_Ok;
+  }
+
+
+  static FT_Error
+  raccess_guess_linux_cap( FT_Library  library,
+                           FT_Stream   stream,
+                           char       *base_file_name,
+                           char      **result_file_name,
+                           FT_Long    *result_offset )
+  {
+    char*      newpath;
+    FT_Memory  memory;
+
+    FT_UNUSED( stream );
+
+
+    memory = library->memory;
+
+    newpath = raccess_make_file_name( memory, base_file_name, ".resource/" );
+    if ( !newpath )
+      return FT_Err_Out_Of_Memory;
+
+    *result_file_name = newpath;
+    *result_offset    = 0;
+
+    return FT_Err_Ok;
+  }
+
+
+  static FT_Error
+  raccess_guess_linux_double( FT_Library  library,
+                              FT_Stream   stream,
+                              char       *base_file_name,
+                              char      **result_file_name,
+                              FT_Long    *result_offset )
+  {
+    char*      newpath;
+    FT_Error   error;
+    FT_Memory  memory;
+
+    FT_UNUSED( stream );
+
+
+    memory = library->memory;
+
+    newpath = raccess_make_file_name( memory, base_file_name, "%" );
+    if ( !newpath )
+      return FT_Err_Out_Of_Memory;
+
+    error = raccess_guess_linux_double_from_file_name( library, newpath,
+                                                       result_offset );
+    if ( !error )
+      *result_file_name = newpath;
+    else
+      FT_FREE( newpath );
+
+    return error;
+  }
+
+
+  static FT_Error
+  raccess_guess_linux_netatalk( FT_Library  library,
+                                FT_Stream   stream,
+                                char       *base_file_name,
+                                char      **result_file_name,
+                                FT_Long    *result_offset )
+  {
+    char*      newpath;
+    FT_Error   error;
+    FT_Memory  memory;
+
+    FT_UNUSED( stream );
+
+
+    memory = library->memory;
+
+    newpath = raccess_make_file_name( memory, base_file_name,
+                                      ".AppleDouble/" );
+    if ( !newpath )
+      return FT_Err_Out_Of_Memory;
+
+    error = raccess_guess_linux_double_from_file_name( library, newpath,
+                                                       result_offset );
+    if ( !error )
+      *result_file_name = newpath;
+    else
+      FT_FREE( newpath );
+
+    return error;
+  }
+
+
+  static FT_Error
+  raccess_guess_apple_generic( FT_Library  library,
+                               FT_Stream   stream,
+                               char       *base_file_name,
+                               FT_Int32    magic,
+                               FT_Long    *result_offset )
+  {
+    FT_Int32   magic_from_stream;
+    FT_Error   error;
+    FT_Int32   version_number = 0;
+    FT_UShort  n_of_entries;
+
+    int        i;
+    FT_UInt32  entry_id, entry_offset, entry_length = 0;
+
+    const FT_UInt32  resource_fork_entry_id = 0x2;
+
+    FT_UNUSED( library );
+    FT_UNUSED( base_file_name );
+    FT_UNUSED( version_number );
+    FT_UNUSED( entry_length   );
+
+
+    if ( FT_READ_LONG( magic_from_stream ) )
+      return error;
+    if ( magic_from_stream != magic )
+      return FT_Err_Unknown_File_Format;
+
+    if ( FT_READ_LONG( version_number ) )
+      return error;
+
+    /* filler */
+    error = FT_Stream_Skip( stream, 16 );
+    if ( error )
+      return error;
+
+    if ( FT_READ_USHORT( n_of_entries ) )
+      return error;
+    if ( n_of_entries == 0 )
+      return FT_Err_Unknown_File_Format;
+
+    for ( i = 0; i < n_of_entries; i++ )
+    {
+      if ( FT_READ_LONG( entry_id ) )
+        return error;
+      if ( entry_id == resource_fork_entry_id )
+      {
+        if ( FT_READ_LONG( entry_offset ) ||
+             FT_READ_LONG( entry_length ) )
+          continue;
+        *result_offset = entry_offset;
+
+        return FT_Err_Ok;
+      }
+      else
+      {
+        error = FT_Stream_Skip( stream, 4 + 4 );    /* offset + length */
+        if ( error )
+          return error;
+      }
+    }
+
+    return FT_Err_Unknown_File_Format;
+  }
+
+
+  static FT_Error
+  raccess_guess_linux_double_from_file_name( FT_Library  library,
+                                             char       *file_name,
+                                             FT_Long    *result_offset )
+  {
+    FT_Open_Args  args2;
+    FT_Stream     stream2;
+    char *        nouse = NULL;
+    FT_Error      error;
+
+
+    args2.flags    = FT_OPEN_PATHNAME;
+    args2.pathname = file_name;
+    error = FT_Stream_New( library, &args2, &stream2 );
+    if ( error )
+      return error;
+
+    error = raccess_guess_apple_double( library, stream2, file_name,
+                                        &nouse, result_offset );
+
+    FT_Stream_Free( stream2, 0 );
+
+    return error;
+  }
+
+
+  static char*
+  raccess_make_file_name( FT_Memory    memory,
+                          const char  *original_name,
+                          const char  *insertion )
+  {
+    char*        new_name = NULL;
+    const char*  tmp;
+    const char*  slash;
+    size_t       new_length;
+    FT_Error     error = FT_Err_Ok;
+
+    FT_UNUSED( error );
+
+
+    new_length = ft_strlen( original_name ) + ft_strlen( insertion );
+    if ( FT_ALLOC( new_name, new_length + 1 ) )
+      return NULL;
+
+    tmp = ft_strrchr( original_name, '/' );
+    if ( tmp )
+    {
+      ft_strncpy( new_name, original_name, tmp - original_name + 1 );
+      new_name[tmp - original_name + 1] = '\0';
+      slash = tmp + 1;
+    }
+    else
+    {
+      slash       = original_name;
+      new_name[0] = '\0';
+    }
+
+    ft_strcat( new_name, insertion );
+    ft_strcat( new_name, slash );
+
+    return new_name;
+  }
+
+
+#else   /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
+
+
+  /*************************************************************************/
+  /*                  Dummy function; just sets errors                     */
+  /*************************************************************************/
+
+  FT_BASE_DEF( void )
+  FT_Raccess_Guess( FT_Library  library,
+                    FT_Stream   stream,
+                    char       *base_name,
+                    char      **new_names,
+                    FT_Long    *offsets,
+                    FT_Error   *errors )
+  {
+    int  i;
+
+    FT_UNUSED( library );
+    FT_UNUSED( stream );
+    FT_UNUSED( base_name );
+
+
+    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
+    {
+      new_names[i] = NULL;
+      offsets[i]   = 0;
+      errors[i]    = FT_Err_Unimplemented_Feature;
+    }
+  }
+
+
+#endif  /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
+
+
+/* END */
diff --git a/src/base/ftsnames.c b/src/base/ftsnames.c
new file mode 100644 (file)
index 0000000..3447888
--- /dev/null
@@ -0,0 +1,94 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsnames.c                                                             */
+/*                                                                         */
+/*    Simple interface to access SFNT name tables (which are used          */
+/*    to hold font names, copyright info, notices, etc.) (body).           */
+/*                                                                         */
+/*    This is _not_ used to retrieve glyph names!                          */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_SFNT_NAMES_H
+#include FT_INTERNAL_TRUETYPE_TYPES_H
+#include FT_INTERNAL_STREAM_H
+
+
+#ifdef TT_CONFIG_OPTION_SFNT_NAMES
+
+
+  /* documentation is in ftsnames.h */
+
+  FT_EXPORT_DEF( FT_UInt )
+  FT_Get_Sfnt_Name_Count( FT_Face  face )
+  {
+    return ( face && FT_IS_SFNT( face ) ) ? ((TT_Face)face)->num_names : 0;
+  }
+
+
+  /* documentation is in ftsnames.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Sfnt_Name( FT_Face       face,
+                    FT_UInt       idx,
+                    FT_SfntName  *aname )
+  {
+    FT_Error  error = FT_Err_Invalid_Argument;
+
+
+    if ( aname && face && FT_IS_SFNT( face ) )
+    {
+      TT_Face  ttface = (TT_Face)face;
+
+
+      if ( idx < (FT_UInt)ttface->num_names )
+      {
+        TT_NameEntryRec*  entry = ttface->name_table.names + idx;
+
+
+        /* load name on demand */
+        if ( entry->stringLength > 0 && entry->string == NULL )
+        {
+          FT_Memory  memory = face->memory;
+          FT_Stream  stream = face->stream;
+
+
+          if ( FT_NEW_ARRAY  ( entry->string, entry->stringLength ) ||
+               FT_STREAM_SEEK( entry->stringOffset )                ||
+               FT_STREAM_READ( entry->string, entry->stringLength ) )
+          {
+            FT_FREE( entry->string );
+            entry->stringLength = 0;
+          }
+        }
+
+        aname->platform_id = entry->platformID;
+        aname->encoding_id = entry->encodingID;
+        aname->language_id = entry->languageID;
+        aname->name_id     = entry->nameID;
+        aname->string      = (FT_Byte*)entry->string;
+        aname->string_len  = entry->stringLength;
+
+        error = FT_Err_Ok;
+      }
+    }
+
+    return error;
+  }
+
+
+#endif /* TT_CONFIG_OPTION_SFNT_NAMES */
+
+
+/* END */
diff --git a/src/base/ftstream.c b/src/base/ftstream.c
new file mode 100644 (file)
index 0000000..fc2868e
--- /dev/null
@@ -0,0 +1,864 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftstream.c                                                             */
+/*                                                                         */
+/*    I/O stream support (body).                                           */
+/*                                                                         */
+/*  Copyright 2000-2002, 2004-2006, 2008-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_DEBUG_H
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_stream
+
+
+  FT_BASE_DEF( void )
+  FT_Stream_OpenMemory( FT_Stream       stream,
+                        const FT_Byte*  base,
+                        FT_ULong        size )
+  {
+    stream->base   = (FT_Byte*) base;
+    stream->size   = size;
+    stream->pos    = 0;
+    stream->cursor = 0;
+    stream->read   = 0;
+    stream->close  = 0;
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Stream_Close( FT_Stream  stream )
+  {
+    if ( stream && stream->close )
+      stream->close( stream );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_Seek( FT_Stream  stream,
+                  FT_ULong   pos )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    if ( stream->read )
+    {
+      if ( stream->read( stream, pos, 0, 0 ) )
+      {
+        FT_ERROR(( "FT_Stream_Seek:"
+                   " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+                   pos, stream->size ));
+
+        error = FT_Err_Invalid_Stream_Operation;
+      }
+    }
+    /* note that seeking to the first position after the file is valid */
+    else if ( pos > stream->size )
+    {
+      FT_ERROR(( "FT_Stream_Seek:"
+                 " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+                 pos, stream->size ));
+
+      error = FT_Err_Invalid_Stream_Operation;
+    }
+
+    if ( !error )
+      stream->pos = pos;
+
+    return error;
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_Skip( FT_Stream  stream,
+                  FT_Long    distance )
+  {
+    if ( distance < 0 )
+      return FT_Err_Invalid_Stream_Operation;
+
+    return FT_Stream_Seek( stream, (FT_ULong)( stream->pos + distance ) );
+  }
+
+
+  FT_BASE_DEF( FT_Long )
+  FT_Stream_Pos( FT_Stream  stream )
+  {
+    return stream->pos;
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_Read( FT_Stream  stream,
+                  FT_Byte*   buffer,
+                  FT_ULong   count )
+  {
+    return FT_Stream_ReadAt( stream, stream->pos, buffer, count );
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_ReadAt( FT_Stream  stream,
+                    FT_ULong   pos,
+                    FT_Byte*   buffer,
+                    FT_ULong   count )
+  {
+    FT_Error  error = FT_Err_Ok;
+    FT_ULong  read_bytes;
+
+
+    if ( pos >= stream->size )
+    {
+      FT_ERROR(( "FT_Stream_ReadAt:"
+                 " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+                 pos, stream->size ));
+
+      return FT_Err_Invalid_Stream_Operation;
+    }
+
+    if ( stream->read )
+      read_bytes = stream->read( stream, pos, buffer, count );
+    else
+    {
+      read_bytes = stream->size - pos;
+      if ( read_bytes > count )
+        read_bytes = count;
+
+      FT_MEM_COPY( buffer, stream->base + pos, read_bytes );
+    }
+
+    stream->pos = pos + read_bytes;
+
+    if ( read_bytes < count )
+    {
+      FT_ERROR(( "FT_Stream_ReadAt:"
+                 " invalid read; expected %lu bytes, got %lu\n",
+                 count, read_bytes ));
+
+      error = FT_Err_Invalid_Stream_Operation;
+    }
+
+    return error;
+  }
+
+
+  FT_BASE_DEF( FT_ULong )
+  FT_Stream_TryRead( FT_Stream  stream,
+                     FT_Byte*   buffer,
+                     FT_ULong   count )
+  {
+    FT_ULong  read_bytes = 0;
+
+
+    if ( stream->pos >= stream->size )
+      goto Exit;
+
+    if ( stream->read )
+      read_bytes = stream->read( stream, stream->pos, buffer, count );
+    else
+    {
+      read_bytes = stream->size - stream->pos;
+      if ( read_bytes > count )
+        read_bytes = count;
+
+      FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes );
+    }
+
+    stream->pos += read_bytes;
+
+  Exit:
+    return read_bytes;
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_ExtractFrame( FT_Stream  stream,
+                          FT_ULong   count,
+                          FT_Byte**  pbytes )
+  {
+    FT_Error  error;
+
+
+    error = FT_Stream_EnterFrame( stream, count );
+    if ( !error )
+    {
+      *pbytes = (FT_Byte*)stream->cursor;
+
+      /* equivalent to FT_Stream_ExitFrame(), with no memory block release */
+      stream->cursor = 0;
+      stream->limit  = 0;
+    }
+
+    return error;
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Stream_ReleaseFrame( FT_Stream  stream,
+                          FT_Byte**  pbytes )
+  {
+    if ( stream && stream->read )
+    {
+      FT_Memory  memory = stream->memory;
+
+#ifdef FT_DEBUG_MEMORY
+      ft_mem_free( memory, *pbytes );
+      *pbytes = NULL;
+#else
+      FT_FREE( *pbytes );
+#endif
+    }
+    *pbytes = 0;
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_EnterFrame( FT_Stream  stream,
+                        FT_ULong   count )
+  {
+    FT_Error  error = FT_Err_Ok;
+    FT_ULong  read_bytes;
+
+
+    /* check for nested frame access */
+    FT_ASSERT( stream && stream->cursor == 0 );
+
+    if ( stream->read )
+    {
+      /* allocate the frame in memory */
+      FT_Memory  memory = stream->memory;
+
+
+      /* simple sanity check */
+      if ( count > stream->size )
+      {
+        FT_ERROR(( "FT_Stream_EnterFrame:"
+                   " frame size (%lu) larger than stream size (%lu)\n",
+                   count, stream->size ));
+
+        error = FT_Err_Invalid_Stream_Operation;
+        goto Exit;
+      }
+
+#ifdef FT_DEBUG_MEMORY
+      /* assume _ft_debug_file and _ft_debug_lineno are already set */
+      stream->base = (unsigned char*)ft_mem_qalloc( memory, count, &error );
+      if ( error )
+        goto Exit;
+#else
+      if ( FT_QALLOC( stream->base, count ) )
+        goto Exit;
+#endif
+      /* read it */
+      read_bytes = stream->read( stream, stream->pos,
+                                 stream->base, count );
+      if ( read_bytes < count )
+      {
+        FT_ERROR(( "FT_Stream_EnterFrame:"
+                   " invalid read; expected %lu bytes, got %lu\n",
+                   count, read_bytes ));
+
+        FT_FREE( stream->base );
+        error = FT_Err_Invalid_Stream_Operation;
+      }
+      stream->cursor = stream->base;
+      stream->limit  = stream->cursor + count;
+      stream->pos   += read_bytes;
+    }
+    else
+    {
+      /* check current and new position */
+      if ( stream->pos >= stream->size        ||
+           stream->size - stream->pos < count )
+      {
+        FT_ERROR(( "FT_Stream_EnterFrame:"
+                   " invalid i/o; pos = 0x%lx, count = %lu, size = 0x%lx\n",
+                   stream->pos, count, stream->size ));
+
+        error = FT_Err_Invalid_Stream_Operation;
+        goto Exit;
+      }
+
+      /* set cursor */
+      stream->cursor = stream->base + stream->pos;
+      stream->limit  = stream->cursor + count;
+      stream->pos   += count;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Stream_ExitFrame( FT_Stream  stream )
+  {
+    /* IMPORTANT: The assertion stream->cursor != 0 was removed, given    */
+    /*            that it is possible to access a frame of length 0 in    */
+    /*            some weird fonts (usually, when accessing an array of   */
+    /*            0 records, like in some strange kern tables).           */
+    /*                                                                    */
+    /*  In this case, the loader code handles the 0-length table          */
+    /*  gracefully; however, stream.cursor is really set to 0 by the      */
+    /*  FT_Stream_EnterFrame() call, and this is not an error.            */
+    /*                                                                    */
+    FT_ASSERT( stream );
+
+    if ( stream->read )
+    {
+      FT_Memory  memory = stream->memory;
+
+#ifdef FT_DEBUG_MEMORY
+      ft_mem_free( memory, stream->base );
+      stream->base = NULL;
+#else
+      FT_FREE( stream->base );
+#endif
+    }
+    stream->cursor = 0;
+    stream->limit  = 0;
+  }
+
+
+  FT_BASE_DEF( FT_Char )
+  FT_Stream_GetChar( FT_Stream  stream )
+  {
+    FT_Char  result;
+
+
+    FT_ASSERT( stream && stream->cursor );
+
+    result = 0;
+    if ( stream->cursor < stream->limit )
+      result = *stream->cursor++;
+
+    return result;
+  }
+
+
+  FT_BASE_DEF( FT_UShort )
+  FT_Stream_GetUShort( FT_Stream  stream )
+  {
+    FT_Byte*  p;
+    FT_Short  result;
+
+
+    FT_ASSERT( stream && stream->cursor );
+
+    result         = 0;
+    p              = stream->cursor;
+    if ( p + 1 < stream->limit )
+      result       = FT_NEXT_USHORT( p );
+    stream->cursor = p;
+
+    return result;
+  }
+
+
+  FT_BASE_DEF( FT_UShort )
+  FT_Stream_GetUShortLE( FT_Stream  stream )
+  {
+    FT_Byte*  p;
+    FT_Short  result;
+
+
+    FT_ASSERT( stream && stream->cursor );
+
+    result         = 0;
+    p              = stream->cursor;
+    if ( p + 1 < stream->limit )
+      result       = FT_NEXT_USHORT_LE( p );
+    stream->cursor = p;
+
+    return result;
+  }
+
+
+  FT_BASE_DEF( FT_ULong )
+  FT_Stream_GetUOffset( FT_Stream  stream )
+  {
+    FT_Byte*  p;
+    FT_Long   result;
+
+
+    FT_ASSERT( stream && stream->cursor );
+
+    result         = 0;
+    p              = stream->cursor;
+    if ( p + 2 < stream->limit )
+      result       = FT_NEXT_UOFF3( p );
+    stream->cursor = p;
+    return result;
+  }
+
+
+  FT_BASE_DEF( FT_ULong )
+  FT_Stream_GetULong( FT_Stream  stream )
+  {
+    FT_Byte*  p;
+    FT_Long   result;
+
+
+    FT_ASSERT( stream && stream->cursor );
+
+    result         = 0;
+    p              = stream->cursor;
+    if ( p + 3 < stream->limit )
+      result       = FT_NEXT_ULONG( p );
+    stream->cursor = p;
+    return result;
+  }
+
+
+  FT_BASE_DEF( FT_ULong )
+  FT_Stream_GetULongLE( FT_Stream  stream )
+  {
+    FT_Byte*  p;
+    FT_Long   result;
+
+
+    FT_ASSERT( stream && stream->cursor );
+
+    result         = 0;
+    p              = stream->cursor;
+    if ( p + 3 < stream->limit )
+      result       = FT_NEXT_ULONG_LE( p );
+    stream->cursor = p;
+    return result;
+  }
+
+
+  FT_BASE_DEF( FT_Char )
+  FT_Stream_ReadChar( FT_Stream  stream,
+                      FT_Error*  error )
+  {
+    FT_Byte  result = 0;
+
+
+    FT_ASSERT( stream );
+
+    *error = FT_Err_Ok;
+
+    if ( stream->read )
+    {
+      if ( stream->read( stream, stream->pos, &result, 1L ) != 1L )
+        goto Fail;
+    }
+    else
+    {
+      if ( stream->pos < stream->size )
+        result = stream->base[stream->pos];
+      else
+        goto Fail;
+    }
+    stream->pos++;
+
+    return result;
+
+  Fail:
+    *error = FT_Err_Invalid_Stream_Operation;
+    FT_ERROR(( "FT_Stream_ReadChar:"
+               " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+               stream->pos, stream->size ));
+
+    return 0;
+  }
+
+
+  FT_BASE_DEF( FT_UShort )
+  FT_Stream_ReadUShort( FT_Stream  stream,
+                       FT_Error*  error )
+  {
+    FT_Byte   reads[2];
+    FT_Byte*  p = 0;
+    FT_Short  result = 0;
+
+
+    FT_ASSERT( stream );
+
+    *error = FT_Err_Ok;
+
+    if ( stream->pos + 1 < stream->size )
+    {
+      if ( stream->read )
+      {
+        if ( stream->read( stream, stream->pos, reads, 2L ) != 2L )
+          goto Fail;
+
+        p = reads;
+      }
+      else
+      {
+        p = stream->base + stream->pos;
+      }
+
+      if ( p )
+        result = FT_NEXT_USHORT( p );
+    }
+    else
+      goto Fail;
+
+    stream->pos += 2;
+
+    return result;
+
+  Fail:
+    *error = FT_Err_Invalid_Stream_Operation;
+    FT_ERROR(( "FT_Stream_ReadUShort:"
+               " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+               stream->pos, stream->size ));
+
+    return 0;
+  }
+
+
+  FT_BASE_DEF( FT_UShort )
+  FT_Stream_ReadUShortLE( FT_Stream  stream,
+                         FT_Error*  error )
+  {
+    FT_Byte   reads[2];
+    FT_Byte*  p = 0;
+    FT_Short  result = 0;
+
+
+    FT_ASSERT( stream );
+
+    *error = FT_Err_Ok;
+
+    if ( stream->pos + 1 < stream->size )
+    {
+      if ( stream->read )
+      {
+        if ( stream->read( stream, stream->pos, reads, 2L ) != 2L )
+          goto Fail;
+
+        p = reads;
+      }
+      else
+      {
+        p = stream->base + stream->pos;
+      }
+
+      if ( p )
+        result = FT_NEXT_USHORT_LE( p );
+    }
+    else
+      goto Fail;
+
+    stream->pos += 2;
+
+    return result;
+
+  Fail:
+    *error = FT_Err_Invalid_Stream_Operation;
+    FT_ERROR(( "FT_Stream_ReadUShortLE:"
+               " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+               stream->pos, stream->size ));
+
+    return 0;
+  }
+
+
+  FT_BASE_DEF( FT_ULong )
+  FT_Stream_ReadUOffset( FT_Stream  stream,
+                        FT_Error*  error )
+  {
+    FT_Byte   reads[3];
+    FT_Byte*  p = 0;
+    FT_Long   result = 0;
+
+
+    FT_ASSERT( stream );
+
+    *error = FT_Err_Ok;
+
+    if ( stream->pos + 2 < stream->size )
+    {
+      if ( stream->read )
+      {
+        if (stream->read( stream, stream->pos, reads, 3L ) != 3L )
+          goto Fail;
+
+        p = reads;
+      }
+      else
+      {
+        p = stream->base + stream->pos;
+      }
+
+      if ( p )
+        result = FT_NEXT_UOFF3( p );
+    }
+    else
+      goto Fail;
+
+    stream->pos += 3;
+
+    return result;
+
+  Fail:
+    *error = FT_Err_Invalid_Stream_Operation;
+    FT_ERROR(( "FT_Stream_ReadUOffset:"
+               " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+               stream->pos, stream->size ));
+
+    return 0;
+  }
+
+
+  FT_BASE_DEF( FT_ULong )
+  FT_Stream_ReadULong( FT_Stream  stream,
+                      FT_Error*  error )
+  {
+    FT_Byte   reads[4];
+    FT_Byte*  p = 0;
+    FT_Long   result = 0;
+
+
+    FT_ASSERT( stream );
+
+    *error = FT_Err_Ok;
+
+    if ( stream->pos + 3 < stream->size )
+    {
+      if ( stream->read )
+      {
+        if ( stream->read( stream, stream->pos, reads, 4L ) != 4L )
+          goto Fail;
+
+        p = reads;
+      }
+      else
+      {
+        p = stream->base + stream->pos;
+      }
+
+      if ( p )
+        result = FT_NEXT_ULONG( p );
+    }
+    else
+      goto Fail;
+
+    stream->pos += 4;
+
+    return result;
+
+  Fail:
+    *error = FT_Err_Invalid_Stream_Operation;
+    FT_ERROR(( "FT_Stream_ReadULong:"
+               " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+               stream->pos, stream->size ));
+
+    return 0;
+  }
+
+
+  FT_BASE_DEF( FT_ULong )
+  FT_Stream_ReadULongLE( FT_Stream  stream,
+                        FT_Error*  error )
+  {
+    FT_Byte   reads[4];
+    FT_Byte*  p = 0;
+    FT_Long   result = 0;
+
+
+    FT_ASSERT( stream );
+
+    *error = FT_Err_Ok;
+
+    if ( stream->pos + 3 < stream->size )
+    {
+      if ( stream->read )
+      {
+        if ( stream->read( stream, stream->pos, reads, 4L ) != 4L )
+          goto Fail;
+
+        p = reads;
+      }
+      else
+      {
+        p = stream->base + stream->pos;
+      }
+
+      if ( p )
+        result = FT_NEXT_ULONG_LE( p );
+    }
+    else
+      goto Fail;
+
+    stream->pos += 4;
+
+    return result;
+
+  Fail:
+    *error = FT_Err_Invalid_Stream_Operation;
+    FT_ERROR(( "FT_Stream_ReadULongLE:"
+               " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+               stream->pos, stream->size ));
+
+    return 0;
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_ReadFields( FT_Stream              stream,
+                        const FT_Frame_Field*  fields,
+                        void*                  structure )
+  {
+    FT_Error  error;
+    FT_Bool   frame_accessed = 0;
+    FT_Byte*  cursor;
+
+    if ( !fields || !stream )
+      return FT_Err_Invalid_Argument;
+
+    cursor = stream->cursor;
+
+    error = FT_Err_Ok;
+    do
+    {
+      FT_ULong  value;
+      FT_Int    sign_shift;
+      FT_Byte*  p;
+
+
+      switch ( fields->value )
+      {
+      case ft_frame_start:  /* access a new frame */
+        error = FT_Stream_EnterFrame( stream, fields->offset );
+        if ( error )
+          goto Exit;
+
+        frame_accessed = 1;
+        cursor         = stream->cursor;
+        fields++;
+        continue;  /* loop! */
+
+      case ft_frame_bytes:  /* read a byte sequence */
+      case ft_frame_skip:   /* skip some bytes      */
+        {
+          FT_UInt  len = fields->size;
+
+
+          if ( cursor + len > stream->limit )
+          {
+            error = FT_Err_Invalid_Stream_Operation;
+            goto Exit;
+          }
+
+          if ( fields->value == ft_frame_bytes )
+          {
+            p = (FT_Byte*)structure + fields->offset;
+            FT_MEM_COPY( p, cursor, len );
+          }
+          cursor += len;
+          fields++;
+          continue;
+        }
+
+      case ft_frame_byte:
+      case ft_frame_schar:  /* read a single byte */
+        value = FT_NEXT_BYTE(cursor);
+        sign_shift = 24;
+        break;
+
+      case ft_frame_short_be:
+      case ft_frame_ushort_be:  /* read a 2-byte big-endian short */
+        value = FT_NEXT_USHORT(cursor);
+        sign_shift = 16;
+        break;
+
+      case ft_frame_short_le:
+      case ft_frame_ushort_le:  /* read a 2-byte little-endian short */
+        value = FT_NEXT_USHORT_LE(cursor);
+        sign_shift = 16;
+        break;
+
+      case ft_frame_long_be:
+      case ft_frame_ulong_be:  /* read a 4-byte big-endian long */
+        value = FT_NEXT_ULONG(cursor);
+        sign_shift = 0;
+        break;
+
+      case ft_frame_long_le:
+      case ft_frame_ulong_le:  /* read a 4-byte little-endian long */
+        value = FT_NEXT_ULONG_LE(cursor);
+        sign_shift = 0;
+        break;
+
+      case ft_frame_off3_be:
+      case ft_frame_uoff3_be:  /* read a 3-byte big-endian long */
+        value = FT_NEXT_UOFF3(cursor);
+        sign_shift = 8;
+        break;
+
+      case ft_frame_off3_le:
+      case ft_frame_uoff3_le:  /* read a 3-byte little-endian long */
+        value = FT_NEXT_UOFF3_LE(cursor);
+        sign_shift = 8;
+        break;
+
+      default:
+        /* otherwise, exit the loop */
+        stream->cursor = cursor;
+        goto Exit;
+      }
+
+      /* now, compute the signed value is necessary */
+      if ( fields->value & FT_FRAME_OP_SIGNED )
+        value = (FT_ULong)( (FT_Int32)( value << sign_shift ) >> sign_shift );
+
+      /* finally, store the value in the object */
+
+      p = (FT_Byte*)structure + fields->offset;
+      switch ( fields->size )
+      {
+      case (8 / FT_CHAR_BIT):
+        *(FT_Byte*)p = (FT_Byte)value;
+        break;
+
+      case (16 / FT_CHAR_BIT):
+        *(FT_UShort*)p = (FT_UShort)value;
+        break;
+
+      case (32 / FT_CHAR_BIT):
+        *(FT_UInt32*)p = (FT_UInt32)value;
+        break;
+
+      default:  /* for 64-bit systems */
+        *(FT_ULong*)p = (FT_ULong)value;
+      }
+
+      /* go to next field */
+      fields++;
+    }
+    while ( 1 );
+
+  Exit:
+    /* close the frame if it was opened by this read */
+    if ( frame_accessed )
+      FT_Stream_ExitFrame( stream );
+
+    return error;
+  }
+
+
+/* END */
diff --git a/src/base/ftstroke.c b/src/base/ftstroke.c
new file mode 100644 (file)
index 0000000..5399efe
--- /dev/null
@@ -0,0 +1,2419 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftstroke.c                                                             */
+/*                                                                         */
+/*    FreeType path stroker (body).                                        */
+/*                                                                         */
+/*  Copyright 2002-2006, 2008-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_STROKER_H
+#include FT_TRIGONOMETRY_H
+#include FT_OUTLINE_H
+#include FT_INTERNAL_MEMORY_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_OBJECTS_H
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_StrokerBorder )
+  FT_Outline_GetInsideBorder( FT_Outline*  outline )
+  {
+    FT_Orientation  o = FT_Outline_Get_Orientation( outline );
+
+
+    return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_RIGHT
+                                        : FT_STROKER_BORDER_LEFT;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_StrokerBorder )
+  FT_Outline_GetOutsideBorder( FT_Outline*  outline )
+  {
+    FT_Orientation  o = FT_Outline_Get_Orientation( outline );
+
+
+    return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_LEFT
+                                        : FT_STROKER_BORDER_RIGHT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      BEZIER COMPUTATIONS                      *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define FT_SMALL_CONIC_THRESHOLD  ( FT_ANGLE_PI / 6 )
+#define FT_SMALL_CUBIC_THRESHOLD  ( FT_ANGLE_PI / 8 )
+
+#define FT_EPSILON  2
+
+#define FT_IS_SMALL( x )  ( (x) > -FT_EPSILON && (x) < FT_EPSILON )
+
+
+  static FT_Pos
+  ft_pos_abs( FT_Pos  x )
+  {
+    return x >= 0 ? x : -x;
+  }
+
+
+  static void
+  ft_conic_split( FT_Vector*  base )
+  {
+    FT_Pos  a, b;
+
+
+    base[4].x = base[2].x;
+    b = base[1].x;
+    a = base[3].x = ( base[2].x + b ) / 2;
+    b = base[1].x = ( base[0].x + b ) / 2;
+    base[2].x = ( a + b ) / 2;
+
+    base[4].y = base[2].y;
+    b = base[1].y;
+    a = base[3].y = ( base[2].y + b ) / 2;
+    b = base[1].y = ( base[0].y + b ) / 2;
+    base[2].y = ( a + b ) / 2;
+  }
+
+
+  static FT_Bool
+  ft_conic_is_small_enough( FT_Vector*  base,
+                            FT_Angle   *angle_in,
+                            FT_Angle   *angle_out )
+  {
+    FT_Vector  d1, d2;
+    FT_Angle   theta;
+    FT_Int     close1, close2;
+
+
+    d1.x = base[1].x - base[2].x;
+    d1.y = base[1].y - base[2].y;
+    d2.x = base[0].x - base[1].x;
+    d2.y = base[0].y - base[1].y;
+
+    close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y );
+    close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y );
+
+    if ( close1 )
+    {
+      if ( close2 )
+      {
+        /* basically a point;                      */
+        /* do nothing to retain original direction */
+      }
+      else
+      {
+        *angle_in  =
+        *angle_out = FT_Atan2( d2.x, d2.y );
+      }
+    }
+    else /* !close1 */
+    {
+      if ( close2 )
+      {
+        *angle_in  =
+        *angle_out = FT_Atan2( d1.x, d1.y );
+      }
+      else
+      {
+        *angle_in  = FT_Atan2( d1.x, d1.y );
+        *angle_out = FT_Atan2( d2.x, d2.y );
+      }
+    }
+
+    theta = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_out ) );
+
+    return FT_BOOL( theta < FT_SMALL_CONIC_THRESHOLD );
+  }
+
+
+  static void
+  ft_cubic_split( FT_Vector*  base )
+  {
+    FT_Pos  a, b, c, d;
+
+
+    base[6].x = base[3].x;
+    c = base[1].x;
+    d = base[2].x;
+    base[1].x = a = ( base[0].x + c ) / 2;
+    base[5].x = b = ( base[3].x + d ) / 2;
+    c = ( c + d ) / 2;
+    base[2].x = a = ( a + c ) / 2;
+    base[4].x = b = ( b + c ) / 2;
+    base[3].x = ( a + b ) / 2;
+
+    base[6].y = base[3].y;
+    c = base[1].y;
+    d = base[2].y;
+    base[1].y = a = ( base[0].y + c ) / 2;
+    base[5].y = b = ( base[3].y + d ) / 2;
+    c = ( c + d ) / 2;
+    base[2].y = a = ( a + c ) / 2;
+    base[4].y = b = ( b + c ) / 2;
+    base[3].y = ( a + b ) / 2;
+  }
+
+
+  /* Return the average of `angle1' and `angle2'.            */
+  /* This gives correct result even if `angle1' and `angle2' */
+  /* have opposite signs.                                    */
+  static FT_Angle
+  ft_angle_mean( FT_Angle  angle1,
+                 FT_Angle  angle2 )
+  {
+    return angle1 + FT_Angle_Diff( angle1, angle2 ) / 2;
+  }
+
+
+  static FT_Bool
+  ft_cubic_is_small_enough( FT_Vector*  base,
+                            FT_Angle   *angle_in,
+                            FT_Angle   *angle_mid,
+                            FT_Angle   *angle_out )
+  {
+    FT_Vector  d1, d2, d3;
+    FT_Angle   theta1, theta2;
+    FT_Int     close1, close2, close3;
+
+
+    d1.x = base[2].x - base[3].x;
+    d1.y = base[2].y - base[3].y;
+    d2.x = base[1].x - base[2].x;
+    d2.y = base[1].y - base[2].y;
+    d3.x = base[0].x - base[1].x;
+    d3.y = base[0].y - base[1].y;
+
+    close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y );
+    close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y );
+    close3 = FT_IS_SMALL( d3.x ) && FT_IS_SMALL( d3.y );
+
+    if ( close1 )
+    {
+      if ( close2 )
+      {
+        if ( close3 )
+        {
+          /* basically a point;                      */
+          /* do nothing to retain original direction */
+        }
+        else /* !close3 */
+        {
+          *angle_in  =
+          *angle_mid =
+          *angle_out = FT_Atan2( d3.x, d3.y );
+        }
+      }
+      else /* !close2 */
+      {
+        if ( close3 )
+        {
+          *angle_in  =
+          *angle_mid =
+          *angle_out = FT_Atan2( d2.x, d2.y );
+        }
+        else /* !close3 */
+        {
+          *angle_in  =
+          *angle_mid = FT_Atan2( d2.x, d2.y );
+          *angle_out = FT_Atan2( d3.x, d3.y );
+        }
+      }
+    }
+    else /* !close1 */
+    {
+      if ( close2 )
+      {
+        if ( close3 )
+        {
+          *angle_in  =
+          *angle_mid =
+          *angle_out = FT_Atan2( d1.x, d1.y );
+        }
+        else /* !close3 */
+        {
+          *angle_in  = FT_Atan2( d1.x, d1.y );
+          *angle_out = FT_Atan2( d3.x, d3.y );
+          *angle_mid = ft_angle_mean( *angle_in, *angle_out );
+        }
+      }
+      else /* !close2 */
+      {
+        if ( close3 )
+        {
+          *angle_in  = FT_Atan2( d1.x, d1.y );
+          *angle_mid =
+          *angle_out = FT_Atan2( d2.x, d2.y );
+        }
+        else /* !close3 */
+        {
+          *angle_in  = FT_Atan2( d1.x, d1.y );
+          *angle_mid = FT_Atan2( d2.x, d2.y );
+          *angle_out = FT_Atan2( d3.x, d3.y );
+        }
+      }
+    }
+
+    theta1 = ft_pos_abs( FT_Angle_Diff( *angle_in,  *angle_mid ) );
+    theta2 = ft_pos_abs( FT_Angle_Diff( *angle_mid, *angle_out ) );
+
+    return FT_BOOL( theta1 < FT_SMALL_CUBIC_THRESHOLD &&
+                    theta2 < FT_SMALL_CUBIC_THRESHOLD );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       STROKE BORDERS                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef enum  FT_StrokeTags_
+  {
+    FT_STROKE_TAG_ON    = 1,   /* on-curve point  */
+    FT_STROKE_TAG_CUBIC = 2,   /* cubic off-point */
+    FT_STROKE_TAG_BEGIN = 4,   /* sub-path start  */
+    FT_STROKE_TAG_END   = 8    /* sub-path end    */
+
+  } FT_StrokeTags;
+
+#define  FT_STROKE_TAG_BEGIN_END  ( FT_STROKE_TAG_BEGIN | FT_STROKE_TAG_END )
+
+  typedef struct  FT_StrokeBorderRec_
+  {
+    FT_UInt     num_points;
+    FT_UInt     max_points;
+    FT_Vector*  points;
+    FT_Byte*    tags;
+    FT_Bool     movable;  /* TRUE for ends of lineto borders */
+    FT_Int      start;    /* index of current sub-path start point */
+    FT_Memory   memory;
+    FT_Bool     valid;
+
+  } FT_StrokeBorderRec, *FT_StrokeBorder;
+
+
+  static FT_Error
+  ft_stroke_border_grow( FT_StrokeBorder  border,
+                         FT_UInt          new_points )
+  {
+    FT_UInt   old_max = border->max_points;
+    FT_UInt   new_max = border->num_points + new_points;
+    FT_Error  error   = FT_Err_Ok;
+
+
+    if ( new_max > old_max )
+    {
+      FT_UInt    cur_max = old_max;
+      FT_Memory  memory  = border->memory;
+
+
+      while ( cur_max < new_max )
+        cur_max += ( cur_max >> 1 ) + 16;
+
+      if ( FT_RENEW_ARRAY( border->points, old_max, cur_max ) ||
+           FT_RENEW_ARRAY( border->tags,   old_max, cur_max ) )
+        goto Exit;
+
+      border->max_points = cur_max;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static void
+  ft_stroke_border_close( FT_StrokeBorder  border,
+                          FT_Bool          reverse )
+  {
+    FT_UInt  start = border->start;
+    FT_UInt  count = border->num_points;
+
+
+    FT_ASSERT( border->start >= 0 );
+
+    /* don't record empty paths! */
+    if ( count <= start + 1U )
+      border->num_points = start;
+    else
+    {
+      /* copy the last point to the start of this sub-path, since */
+      /* it contains the `adjusted' starting coordinates          */
+      border->num_points    = --count;
+      border->points[start] = border->points[count];
+
+      if ( reverse )
+      {
+        /* reverse the points */
+        {
+          FT_Vector*  vec1 = border->points + start + 1;
+          FT_Vector*  vec2 = border->points + count - 1;
+
+
+          for ( ; vec1 < vec2; vec1++, vec2-- )
+          {
+            FT_Vector  tmp;
+
+
+            tmp   = *vec1;
+            *vec1 = *vec2;
+            *vec2 = tmp;
+          }
+        }
+
+        /* then the tags */
+        {
+          FT_Byte*  tag1 = border->tags + start + 1;
+          FT_Byte*  tag2 = border->tags + count - 1;
+
+
+          for ( ; tag1 < tag2; tag1++, tag2-- )
+          {
+            FT_Byte  tmp;
+
+
+            tmp   = *tag1;
+            *tag1 = *tag2;
+            *tag2 = tmp;
+          }
+        }
+      }
+
+      border->tags[start    ] |= FT_STROKE_TAG_BEGIN;
+      border->tags[count - 1] |= FT_STROKE_TAG_END;
+    }
+
+    border->start   = -1;
+    border->movable = FALSE;
+  }
+
+
+  static FT_Error
+  ft_stroke_border_lineto( FT_StrokeBorder  border,
+                           FT_Vector*       to,
+                           FT_Bool          movable )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    FT_ASSERT( border->start >= 0 );
+
+    if ( border->movable )
+    {
+      /* move last point */
+      border->points[border->num_points - 1] = *to;
+    }
+    else
+    {
+      /* don't add zero-length lineto */
+      if ( border->num_points > 0                                          &&
+           FT_IS_SMALL( border->points[border->num_points - 1].x - to->x ) &&
+           FT_IS_SMALL( border->points[border->num_points - 1].y - to->y ) )
+        return error;
+
+      /* add one point */
+      error = ft_stroke_border_grow( border, 1 );
+      if ( !error )
+      {
+        FT_Vector*  vec = border->points + border->num_points;
+        FT_Byte*    tag = border->tags   + border->num_points;
+
+
+        vec[0] = *to;
+        tag[0] = FT_STROKE_TAG_ON;
+
+        border->num_points += 1;
+      }
+    }
+    border->movable = movable;
+    return error;
+  }
+
+
+  static FT_Error
+  ft_stroke_border_conicto( FT_StrokeBorder  border,
+                            FT_Vector*       control,
+                            FT_Vector*       to )
+  {
+    FT_Error  error;
+
+
+    FT_ASSERT( border->start >= 0 );
+
+    error = ft_stroke_border_grow( border, 2 );
+    if ( !error )
+    {
+      FT_Vector*  vec = border->points + border->num_points;
+      FT_Byte*    tag = border->tags   + border->num_points;
+
+
+      vec[0] = *control;
+      vec[1] = *to;
+
+      tag[0] = 0;
+      tag[1] = FT_STROKE_TAG_ON;
+
+      border->num_points += 2;
+    }
+
+    border->movable = FALSE;
+
+    return error;
+  }
+
+
+  static FT_Error
+  ft_stroke_border_cubicto( FT_StrokeBorder  border,
+                            FT_Vector*       control1,
+                            FT_Vector*       control2,
+                            FT_Vector*       to )
+  {
+    FT_Error  error;
+
+
+    FT_ASSERT( border->start >= 0 );
+
+    error = ft_stroke_border_grow( border, 3 );
+    if ( !error )
+    {
+      FT_Vector*  vec = border->points + border->num_points;
+      FT_Byte*    tag = border->tags   + border->num_points;
+
+
+      vec[0] = *control1;
+      vec[1] = *control2;
+      vec[2] = *to;
+
+      tag[0] = FT_STROKE_TAG_CUBIC;
+      tag[1] = FT_STROKE_TAG_CUBIC;
+      tag[2] = FT_STROKE_TAG_ON;
+
+      border->num_points += 3;
+    }
+
+    border->movable = FALSE;
+
+    return error;
+  }
+
+
+#define FT_ARC_CUBIC_ANGLE  ( FT_ANGLE_PI / 2 )
+
+
+  static FT_Error
+  ft_stroke_border_arcto( FT_StrokeBorder  border,
+                          FT_Vector*       center,
+                          FT_Fixed         radius,
+                          FT_Angle         angle_start,
+                          FT_Angle         angle_diff )
+  {
+    FT_Angle   total, angle, step, rotate, next, theta;
+    FT_Vector  a, b, a2, b2;
+    FT_Fixed   length;
+    FT_Error   error = FT_Err_Ok;
+
+
+    /* compute start point */
+    FT_Vector_From_Polar( &a, radius, angle_start );
+    a.x += center->x;
+    a.y += center->y;
+
+    total  = angle_diff;
+    angle  = angle_start;
+    rotate = ( angle_diff >= 0 ) ? FT_ANGLE_PI2 : -FT_ANGLE_PI2;
+
+    while ( total != 0 )
+    {
+      step = total;
+      if ( step > FT_ARC_CUBIC_ANGLE )
+        step = FT_ARC_CUBIC_ANGLE;
+
+      else if ( step < -FT_ARC_CUBIC_ANGLE )
+        step = -FT_ARC_CUBIC_ANGLE;
+
+      next  = angle + step;
+      theta = step;
+      if ( theta < 0 )
+        theta = -theta;
+
+      theta >>= 1;
+
+      /* compute end point */
+      FT_Vector_From_Polar( &b, radius, next );
+      b.x += center->x;
+      b.y += center->y;
+
+      /* compute first and second control points */
+      length = FT_MulDiv( radius, FT_Sin( theta ) * 4,
+                          ( 0x10000L + FT_Cos( theta ) ) * 3 );
+
+      FT_Vector_From_Polar( &a2, length, angle + rotate );
+      a2.x += a.x;
+      a2.y += a.y;
+
+      FT_Vector_From_Polar( &b2, length, next - rotate );
+      b2.x += b.x;
+      b2.y += b.y;
+
+      /* add cubic arc */
+      error = ft_stroke_border_cubicto( border, &a2, &b2, &b );
+      if ( error )
+        break;
+
+      /* process the rest of the arc ?? */
+      a      = b;
+      total -= step;
+      angle  = next;
+    }
+
+    return error;
+  }
+
+
+  static FT_Error
+  ft_stroke_border_moveto( FT_StrokeBorder  border,
+                           FT_Vector*       to )
+  {
+    /* close current open path if any ? */
+    if ( border->start >= 0 )
+      ft_stroke_border_close( border, FALSE );
+
+    border->start = border->num_points;
+    border->movable = FALSE;
+
+    return ft_stroke_border_lineto( border, to, FALSE );
+  }
+
+
+  static void
+  ft_stroke_border_init( FT_StrokeBorder  border,
+                         FT_Memory        memory )
+  {
+    border->memory = memory;
+    border->points = NULL;
+    border->tags   = NULL;
+
+    border->num_points = 0;
+    border->max_points = 0;
+    border->start      = -1;
+    border->valid      = FALSE;
+  }
+
+
+  static void
+  ft_stroke_border_reset( FT_StrokeBorder  border )
+  {
+    border->num_points = 0;
+    border->start      = -1;
+    border->valid      = FALSE;
+  }
+
+
+  static void
+  ft_stroke_border_done( FT_StrokeBorder  border )
+  {
+    FT_Memory  memory = border->memory;
+
+
+    FT_FREE( border->points );
+    FT_FREE( border->tags );
+
+    border->num_points = 0;
+    border->max_points = 0;
+    border->start      = -1;
+    border->valid      = FALSE;
+  }
+
+
+  static FT_Error
+  ft_stroke_border_get_counts( FT_StrokeBorder  border,
+                               FT_UInt         *anum_points,
+                               FT_UInt         *anum_contours )
+  {
+    FT_Error  error        = FT_Err_Ok;
+    FT_UInt   num_points   = 0;
+    FT_UInt   num_contours = 0;
+
+    FT_UInt     count      = border->num_points;
+    FT_Vector*  point      = border->points;
+    FT_Byte*    tags       = border->tags;
+    FT_Int      in_contour = 0;
+
+
+    for ( ; count > 0; count--, num_points++, point++, tags++ )
+    {
+      if ( tags[0] & FT_STROKE_TAG_BEGIN )
+      {
+        if ( in_contour != 0 )
+          goto Fail;
+
+        in_contour = 1;
+      }
+      else if ( in_contour == 0 )
+        goto Fail;
+
+      if ( tags[0] & FT_STROKE_TAG_END )
+      {
+        in_contour = 0;
+        num_contours++;
+      }
+    }
+
+    if ( in_contour != 0 )
+      goto Fail;
+
+    border->valid = TRUE;
+
+  Exit:
+    *anum_points   = num_points;
+    *anum_contours = num_contours;
+    return error;
+
+  Fail:
+    num_points   = 0;
+    num_contours = 0;
+    goto Exit;
+  }
+
+
+  static void
+  ft_stroke_border_export( FT_StrokeBorder  border,
+                           FT_Outline*      outline )
+  {
+    /* copy point locations */
+    FT_ARRAY_COPY( outline->points + outline->n_points,
+                   border->points,
+                   border->num_points );
+
+    /* copy tags */
+    {
+      FT_UInt   count = border->num_points;
+      FT_Byte*  read  = border->tags;
+      FT_Byte*  write = (FT_Byte*)outline->tags + outline->n_points;
+
+
+      for ( ; count > 0; count--, read++, write++ )
+      {
+        if ( *read & FT_STROKE_TAG_ON )
+          *write = FT_CURVE_TAG_ON;
+        else if ( *read & FT_STROKE_TAG_CUBIC )
+          *write = FT_CURVE_TAG_CUBIC;
+        else
+          *write = FT_CURVE_TAG_CONIC;
+      }
+    }
+
+    /* copy contours */
+    {
+      FT_UInt    count = border->num_points;
+      FT_Byte*   tags  = border->tags;
+      FT_Short*  write = outline->contours + outline->n_contours;
+      FT_Short   idx   = (FT_Short)outline->n_points;
+
+
+      for ( ; count > 0; count--, tags++, idx++ )
+      {
+        if ( *tags & FT_STROKE_TAG_END )
+        {
+          *write++ = idx;
+          outline->n_contours++;
+        }
+      }
+    }
+
+    outline->n_points = (short)( outline->n_points + border->num_points );
+
+    FT_ASSERT( FT_Outline_Check( outline ) == 0 );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                           STROKER                             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define FT_SIDE_TO_ROTATE( s )   ( FT_ANGLE_PI2 - (s) * FT_ANGLE_PI )
+
+  typedef struct  FT_StrokerRec_
+  {
+    FT_Angle             angle_in;             /* direction into curr join */
+    FT_Angle             angle_out;            /* direction out of join  */
+    FT_Vector            center;               /* current position */
+    FT_Fixed             line_length;          /* length of last lineto */
+    FT_Bool              first_point;          /* is this the start? */
+    FT_Bool              subpath_open;         /* is the subpath open? */
+    FT_Angle             subpath_angle;        /* subpath start direction */
+    FT_Vector            subpath_start;        /* subpath start position */
+    FT_Fixed             subpath_line_length;  /* subpath start lineto len */
+    FT_Bool              handle_wide_strokes;  /* use wide strokes logic? */
+
+    FT_Stroker_LineCap   line_cap;
+    FT_Stroker_LineJoin  line_join;
+    FT_Stroker_LineJoin  line_join_saved;
+    FT_Fixed             miter_limit;
+    FT_Fixed             radius;
+
+    FT_StrokeBorderRec   borders[2];
+    FT_Library           library;
+
+  } FT_StrokerRec;
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stroker_New( FT_Library   library,
+                  FT_Stroker  *astroker )
+  {
+    FT_Error    error;
+    FT_Memory   memory;
+    FT_Stroker  stroker = NULL;
+
+
+    if ( !library )
+      return FT_Err_Invalid_Argument;
+
+    memory = library->memory;
+
+    if ( !FT_NEW( stroker ) )
+    {
+      stroker->library = library;
+
+      ft_stroke_border_init( &stroker->borders[0], memory );
+      ft_stroke_border_init( &stroker->borders[1], memory );
+    }
+
+    *astroker = stroker;
+
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Stroker_Set( FT_Stroker           stroker,
+                  FT_Fixed             radius,
+                  FT_Stroker_LineCap   line_cap,
+                  FT_Stroker_LineJoin  line_join,
+                  FT_Fixed             miter_limit )
+  {
+    stroker->radius      = radius;
+    stroker->line_cap    = line_cap;
+    stroker->line_join   = line_join;
+    stroker->miter_limit = miter_limit;
+
+    /* ensure miter limit has sensible value */
+    if ( stroker->miter_limit < 0x10000 )
+      stroker->miter_limit = 0x10000;
+
+    /* save line join style:                                           */
+    /* line join style can be temporarily changed when stroking curves */
+    stroker->line_join_saved = line_join;
+
+    FT_Stroker_Rewind( stroker );
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Stroker_Rewind( FT_Stroker  stroker )
+  {
+    if ( stroker )
+    {
+      ft_stroke_border_reset( &stroker->borders[0] );
+      ft_stroke_border_reset( &stroker->borders[1] );
+    }
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Stroker_Done( FT_Stroker  stroker )
+  {
+    if ( stroker )
+    {
+      FT_Memory  memory = stroker->library->memory;
+
+
+      ft_stroke_border_done( &stroker->borders[0] );
+      ft_stroke_border_done( &stroker->borders[1] );
+
+      stroker->library = NULL;
+      FT_FREE( stroker );
+    }
+  }
+
+
+  /* create a circular arc at a corner or cap */
+  static FT_Error
+  ft_stroker_arcto( FT_Stroker  stroker,
+                    FT_Int      side )
+  {
+    FT_Angle         total, rotate;
+    FT_Fixed         radius = stroker->radius;
+    FT_Error         error  = FT_Err_Ok;
+    FT_StrokeBorder  border = stroker->borders + side;
+
+
+    rotate = FT_SIDE_TO_ROTATE( side );
+
+    total = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );
+    if ( total == FT_ANGLE_PI )
+      total = -rotate * 2;
+
+    error = ft_stroke_border_arcto( border,
+                                    &stroker->center,
+                                    radius,
+                                    stroker->angle_in + rotate,
+                                    total );
+    border->movable = FALSE;
+    return error;
+  }
+
+
+  /* add a cap at the end of an opened path */
+  static FT_Error
+  ft_stroker_cap( FT_Stroker  stroker,
+                  FT_Angle    angle,
+                  FT_Int      side )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    if ( stroker->line_cap == FT_STROKER_LINECAP_ROUND )
+    {
+      /* add a round cap */
+      stroker->angle_in  = angle;
+      stroker->angle_out = angle + FT_ANGLE_PI;
+
+      error = ft_stroker_arcto( stroker, side );
+    }
+    else if ( stroker->line_cap == FT_STROKER_LINECAP_SQUARE )
+    {
+      /* add a square cap */
+      FT_Vector        delta, delta2;
+      FT_Angle         rotate = FT_SIDE_TO_ROTATE( side );
+      FT_Fixed         radius = stroker->radius;
+      FT_StrokeBorder  border = stroker->borders + side;
+
+
+      FT_Vector_From_Polar( &delta2, radius, angle + rotate );
+      FT_Vector_From_Polar( &delta,  radius, angle );
+
+      delta.x += stroker->center.x + delta2.x;
+      delta.y += stroker->center.y + delta2.y;
+
+      error = ft_stroke_border_lineto( border, &delta, FALSE );
+      if ( error )
+        goto Exit;
+
+      FT_Vector_From_Polar( &delta2, radius, angle - rotate );
+      FT_Vector_From_Polar( &delta,  radius, angle );
+
+      delta.x += delta2.x + stroker->center.x;
+      delta.y += delta2.y + stroker->center.y;
+
+      error = ft_stroke_border_lineto( border, &delta, FALSE );
+    }
+    else if ( stroker->line_cap == FT_STROKER_LINECAP_BUTT )
+    {
+      /* add a butt ending */
+      FT_Vector        delta;
+      FT_Angle         rotate = FT_SIDE_TO_ROTATE( side );
+      FT_Fixed         radius = stroker->radius;
+      FT_StrokeBorder  border = stroker->borders + side;
+
+
+      FT_Vector_From_Polar( &delta, radius, angle + rotate );
+
+      delta.x += stroker->center.x;
+      delta.y += stroker->center.y;
+
+      error = ft_stroke_border_lineto( border, &delta, FALSE );
+      if ( error )
+        goto Exit;
+
+      FT_Vector_From_Polar( &delta, radius, angle - rotate );
+
+      delta.x += stroker->center.x;
+      delta.y += stroker->center.y;
+
+      error = ft_stroke_border_lineto( border, &delta, FALSE );
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* process an inside corner, i.e. compute intersection */
+  static FT_Error
+  ft_stroker_inside( FT_Stroker  stroker,
+                     FT_Int      side,
+                     FT_Fixed    line_length )
+  {
+    FT_StrokeBorder  border = stroker->borders + side;
+    FT_Angle         phi, theta, rotate;
+    FT_Fixed         length, thcos;
+    FT_Vector        delta;
+    FT_Error         error = FT_Err_Ok;
+    FT_Bool          intersect;          /* use intersection of lines? */
+
+
+    rotate = FT_SIDE_TO_ROTATE( side );
+
+    theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ) / 2;
+
+    /* Only intersect borders if between two lineto's and both */
+    /* lines are long enough (line_length is zero for curves). */
+    if ( !border->movable || line_length == 0 )
+      intersect = FALSE;
+    else
+    {
+      /* compute minimum required length of lines */
+      FT_Fixed  min_length = ft_pos_abs( FT_MulFix( stroker->radius,
+                                                    FT_Tan( theta ) ) );
+
+
+      intersect = FT_BOOL( stroker->line_length >= min_length &&
+                           line_length          >= min_length );
+    }
+
+    if ( !intersect )
+    {
+      FT_Vector_From_Polar( &delta, stroker->radius,
+                            stroker->angle_out + rotate );
+      delta.x += stroker->center.x;
+      delta.y += stroker->center.y;
+
+      border->movable = FALSE;
+    }
+    else
+    {
+      /* compute median angle */
+      phi = stroker->angle_in + theta;
+
+      thcos = FT_Cos( theta );
+
+      length = FT_DivFix( stroker->radius, thcos );
+
+      FT_Vector_From_Polar( &delta, length, phi + rotate );
+      delta.x += stroker->center.x;
+      delta.y += stroker->center.y;
+    }
+
+    error = ft_stroke_border_lineto( border, &delta, FALSE );
+
+    return error;
+  }
+
+
+  /* process an outside corner, i.e. compute bevel/miter/round */
+  static FT_Error
+  ft_stroker_outside( FT_Stroker  stroker,
+                      FT_Int      side,
+                      FT_Fixed    line_length )
+  {
+    FT_StrokeBorder  border = stroker->borders + side;
+    FT_Error         error;
+    FT_Angle         rotate;
+
+
+    if ( stroker->line_join == FT_STROKER_LINEJOIN_ROUND )
+      error = ft_stroker_arcto( stroker, side );
+    else
+    {
+      /* this is a mitered (pointed) or beveled (truncated) corner */
+      FT_Fixed  sigma = 0, radius = stroker->radius;
+      FT_Angle  theta = 0, phi = 0;
+      FT_Fixed  thcos = 0;
+      FT_Bool   bevel, fixed_bevel;
+
+
+      rotate = FT_SIDE_TO_ROTATE( side );
+
+      bevel =
+        FT_BOOL( stroker->line_join == FT_STROKER_LINEJOIN_BEVEL );
+
+      fixed_bevel =
+        FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_MITER_VARIABLE );
+
+      if ( !bevel )
+      {
+        theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );
+
+        if ( theta == FT_ANGLE_PI )
+        {
+          theta = rotate;
+          phi   = stroker->angle_in;
+        }
+        else
+        {
+          theta /= 2;
+          phi    = stroker->angle_in + theta + rotate;
+        }
+
+        thcos = FT_Cos( theta );
+        sigma = FT_MulFix( stroker->miter_limit, thcos );
+
+        /* is miter limit exceeded? */
+        if ( sigma < 0x10000L )
+        {
+          /* don't create variable bevels for very small deviations; */
+          /* FT_Sin(x) = 0 for x <= 57                               */
+          if ( fixed_bevel || ft_pos_abs( theta ) > 57 )
+            bevel = TRUE;
+        }
+      }
+
+      if ( bevel )  /* this is a bevel (broken angle) */
+      {
+        if ( fixed_bevel )
+        {
+          /* the outer corners are simply joined together */
+          FT_Vector  delta;
+
+
+          /* add bevel */
+          FT_Vector_From_Polar( &delta,
+                                radius,
+                                stroker->angle_out + rotate );
+          delta.x += stroker->center.x;
+          delta.y += stroker->center.y;
+
+          border->movable = FALSE;
+          error = ft_stroke_border_lineto( border, &delta, FALSE );
+        }
+        else /* variable bevel */
+        {
+          /* the miter is truncated */
+          FT_Vector  middle, delta;
+          FT_Fixed   length;
+
+
+          /* compute middle point */
+          FT_Vector_From_Polar( &middle,
+                                FT_MulFix( radius, stroker->miter_limit ),
+                                phi );
+          middle.x += stroker->center.x;
+          middle.y += stroker->center.y;
+
+          /* compute first angle point */
+          length = FT_MulFix( radius,
+                              FT_DivFix( 0x10000L - sigma,
+                                         ft_pos_abs( FT_Sin( theta ) ) ) );
+
+          FT_Vector_From_Polar( &delta, length, phi + rotate );
+          delta.x += middle.x;
+          delta.y += middle.y;
+
+          error = ft_stroke_border_lineto( border, &delta, FALSE );
+          if ( error )
+            goto Exit;
+
+          /* compute second angle point */
+          FT_Vector_From_Polar( &delta, length, phi - rotate );
+          delta.x += middle.x;
+          delta.y += middle.y;
+
+          error = ft_stroke_border_lineto( border, &delta, FALSE );
+          if ( error )
+            goto Exit;
+
+          /* finally, add an end point; only needed if not lineto */
+          /* (line_length is zero for curves)                     */
+          if ( line_length == 0 )
+          {
+            FT_Vector_From_Polar( &delta,
+                                  radius,
+                                  stroker->angle_out + rotate );
+
+            delta.x += stroker->center.x;
+            delta.y += stroker->center.y;
+
+            error = ft_stroke_border_lineto( border, &delta, FALSE );
+          }
+        }
+      }
+      else /* this is a miter (intersection) */
+      {
+        FT_Fixed   length;
+        FT_Vector  delta;
+
+
+        length = FT_DivFix( stroker->radius, thcos );
+
+        FT_Vector_From_Polar( &delta, length, phi );
+        delta.x += stroker->center.x;
+        delta.y += stroker->center.y;
+
+        error = ft_stroke_border_lineto( border, &delta, FALSE );
+        if ( error )
+          goto Exit;
+
+        /* now add an end point; only needed if not lineto */
+        /* (line_length is zero for curves)                */
+        if ( line_length == 0 )
+        {
+          FT_Vector_From_Polar( &delta,
+                                stroker->radius,
+                                stroker->angle_out + rotate );
+          delta.x += stroker->center.x;
+          delta.y += stroker->center.y;
+
+          error = ft_stroke_border_lineto( border, &delta, FALSE );
+        }
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  ft_stroker_process_corner( FT_Stroker  stroker,
+                             FT_Fixed    line_length )
+  {
+    FT_Error  error = FT_Err_Ok;
+    FT_Angle  turn;
+    FT_Int    inside_side;
+
+
+    turn = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );
+
+    /* no specific corner processing is required if the turn is 0 */
+    if ( turn == 0 )
+      goto Exit;
+
+    /* when we turn to the right, the inside side is 0 */
+    inside_side = 0;
+
+    /* otherwise, the inside side is 1 */
+    if ( turn < 0 )
+      inside_side = 1;
+
+    /* process the inside side */
+    error = ft_stroker_inside( stroker, inside_side, line_length );
+    if ( error )
+      goto Exit;
+
+    /* process the outside side */
+    error = ft_stroker_outside( stroker, 1 - inside_side, line_length );
+
+  Exit:
+    return error;
+  }
+
+
+  /* add two points to the left and right borders corresponding to the */
+  /* start of the subpath                                              */
+  static FT_Error
+  ft_stroker_subpath_start( FT_Stroker  stroker,
+                            FT_Angle    start_angle,
+                            FT_Fixed    line_length )
+  {
+    FT_Vector        delta;
+    FT_Vector        point;
+    FT_Error         error;
+    FT_StrokeBorder  border;
+
+
+    FT_Vector_From_Polar( &delta, stroker->radius,
+                          start_angle + FT_ANGLE_PI2 );
+
+    point.x = stroker->center.x + delta.x;
+    point.y = stroker->center.y + delta.y;
+
+    border = stroker->borders;
+    error = ft_stroke_border_moveto( border, &point );
+    if ( error )
+      goto Exit;
+
+    point.x = stroker->center.x - delta.x;
+    point.y = stroker->center.y - delta.y;
+
+    border++;
+    error = ft_stroke_border_moveto( border, &point );
+
+    /* save angle, position, and line length for last join */
+    /* (line_length is zero for curves)                    */
+    stroker->subpath_angle       = start_angle;
+    stroker->first_point         = FALSE;
+    stroker->subpath_line_length = line_length;
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stroker_LineTo( FT_Stroker  stroker,
+                     FT_Vector*  to )
+  {
+    FT_Error         error = FT_Err_Ok;
+    FT_StrokeBorder  border;
+    FT_Vector        delta;
+    FT_Angle         angle;
+    FT_Int           side;
+    FT_Fixed         line_length;
+
+
+    delta.x = to->x - stroker->center.x;
+    delta.y = to->y - stroker->center.y;
+
+    /* a zero-length lineto is a no-op; avoid creating a spurious corner */
+    if ( delta.x == 0 && delta.y == 0 )
+       goto Exit;
+
+    /* compute length of line */
+    line_length = FT_Vector_Length( &delta );
+
+    angle = FT_Atan2( delta.x, delta.y );
+    FT_Vector_From_Polar( &delta, stroker->radius, angle + FT_ANGLE_PI2 );
+
+    /* process corner if necessary */
+    if ( stroker->first_point )
+    {
+      /* This is the first segment of a subpath.  We need to     */
+      /* add a point to each border at their respective starting */
+      /* point locations.                                        */
+      error = ft_stroker_subpath_start( stroker, angle, line_length );
+      if ( error )
+        goto Exit;
+    }
+    else
+    {
+      /* process the current corner */
+      stroker->angle_out = angle;
+      error = ft_stroker_process_corner( stroker, line_length );
+      if ( error )
+        goto Exit;
+    }
+
+    /* now add a line segment to both the `inside' and `outside' paths */
+    for ( border = stroker->borders, side = 1; side >= 0; side--, border++ )
+    {
+      FT_Vector  point;
+
+
+      point.x = to->x + delta.x;
+      point.y = to->y + delta.y;
+
+      /* the ends of lineto borders are movable */
+      error = ft_stroke_border_lineto( border, &point, TRUE );
+      if ( error )
+        goto Exit;
+
+      delta.x = -delta.x;
+      delta.y = -delta.y;
+    }
+
+    stroker->angle_in    = angle;
+    stroker->center      = *to;
+    stroker->line_length = line_length;
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stroker_ConicTo( FT_Stroker  stroker,
+                      FT_Vector*  control,
+                      FT_Vector*  to )
+  {
+    FT_Error    error = FT_Err_Ok;
+    FT_Vector   bez_stack[34];
+    FT_Vector*  arc;
+    FT_Vector*  limit = bez_stack + 30;
+    FT_Bool     first_arc = TRUE;
+
+
+    /* if all control points are coincident, this is a no-op; */
+    /* avoid creating a spurious corner                       */
+    if ( FT_IS_SMALL( stroker->center.x - control->x ) &&
+         FT_IS_SMALL( stroker->center.y - control->y ) &&
+         FT_IS_SMALL( control->x        - to->x      ) &&
+         FT_IS_SMALL( control->y        - to->y      ) )
+    {
+       stroker->center = *to;
+       goto Exit;
+    }
+
+    arc    = bez_stack;
+    arc[0] = *to;
+    arc[1] = *control;
+    arc[2] = stroker->center;
+
+    while ( arc >= bez_stack )
+    {
+      FT_Angle  angle_in, angle_out;
+
+
+      /* initialize with current direction */
+      angle_in = angle_out = stroker->angle_in;
+
+      if ( arc < limit                                             &&
+           !ft_conic_is_small_enough( arc, &angle_in, &angle_out ) )
+      {
+        if ( stroker->first_point )
+          stroker->angle_in = angle_in;
+
+        ft_conic_split( arc );
+        arc += 2;
+        continue;
+      }
+
+      if ( first_arc )
+      {
+        first_arc = FALSE;
+
+        /* process corner if necessary */
+        if ( stroker->first_point )
+          error = ft_stroker_subpath_start( stroker, angle_in, 0 );
+        else
+        {
+          stroker->angle_out = angle_in;
+          error = ft_stroker_process_corner( stroker, 0 );
+        }
+      }
+      else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) >
+                  FT_SMALL_CONIC_THRESHOLD / 4                             )
+      {
+        /* if the deviation from one arc to the next is too great, */
+        /* add a round corner                                      */
+        stroker->center    = arc[2];
+        stroker->angle_out = angle_in;
+        stroker->line_join = FT_STROKER_LINEJOIN_ROUND;
+
+        error = ft_stroker_process_corner( stroker, 0 );
+
+        /* reinstate line join style */
+        stroker->line_join = stroker->line_join_saved;
+      }
+
+      if ( error )
+        goto Exit;
+
+      /* the arc's angle is small enough; we can add it directly to each */
+      /* border                                                          */
+      {
+        FT_Vector        ctrl, end;
+        FT_Angle         theta, phi, rotate, alpha0 = 0;
+        FT_Fixed         length;
+        FT_StrokeBorder  border;
+        FT_Int           side;
+
+
+        theta  = FT_Angle_Diff( angle_in, angle_out ) / 2;
+        phi    = angle_in + theta;
+        length = FT_DivFix( stroker->radius, FT_Cos( theta ) );
+
+        /* compute direction of original arc */
+        if ( stroker->handle_wide_strokes )
+          alpha0 = FT_Atan2( arc[0].x - arc[2].x, arc[0].y - arc[2].y );
+
+        for ( border = stroker->borders, side = 0;
+              side <= 1;
+              side++, border++ )
+        {
+          rotate = FT_SIDE_TO_ROTATE( side );
+
+          /* compute control point */
+          FT_Vector_From_Polar( &ctrl, length, phi + rotate );
+          ctrl.x += arc[1].x;
+          ctrl.y += arc[1].y;
+
+          /* compute end point */
+          FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate );
+          end.x += arc[0].x;
+          end.y += arc[0].y;
+
+          if ( stroker->handle_wide_strokes )
+          {
+            FT_Vector  start;
+            FT_Angle   alpha1;
+
+
+            /* determine whether the border radius is greater than the */
+            /* radius of curvature of the original arc                 */
+            start = border->points[border->num_points - 1];
+
+            alpha1 = FT_Atan2( end.x - start.x, end.y - start.y );
+
+            /* is the direction of the border arc opposite to */
+            /* that of the original arc? */
+            if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) >
+                   FT_ANGLE_PI / 2                             )
+            {
+              FT_Angle   beta, gamma;
+              FT_Vector  bvec, delta;
+              FT_Fixed   blen, sinA, sinB, alen;
+
+
+              /* use the sine rule to find the intersection point */
+              beta  = FT_Atan2( arc[2].x - start.x, arc[2].y - start.y );
+              gamma = FT_Atan2( arc[0].x - end.x,   arc[0].y - end.y );
+
+              bvec.x = end.x - start.x;
+              bvec.y = end.y - start.y;
+
+              blen = FT_Vector_Length( &bvec );
+
+              sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) );
+              sinB = ft_pos_abs( FT_Sin( beta - gamma ) );
+
+              alen = FT_DivFix( FT_MulFix( blen, sinA ), sinB );
+
+              FT_Vector_From_Polar( &delta, alen, beta );
+              delta.x += start.x;
+              delta.y += start.y;
+
+              /* circumnavigate the negative sector backwards */
+              border->movable = FALSE;
+              error = ft_stroke_border_lineto( border, &delta, FALSE );
+              if ( error )
+                goto Exit;
+              error = ft_stroke_border_lineto( border, &end, FALSE );
+              if ( error )
+                goto Exit;
+              error = ft_stroke_border_conicto( border, &ctrl, &start );
+              if ( error )
+                goto Exit;
+              /* and then move to the endpoint */
+              error = ft_stroke_border_lineto( border, &end, FALSE );
+              if ( error )
+                goto Exit;
+
+              continue;
+            }
+
+            /* else fall through */
+          }
+
+          /* simply add an arc */
+          error = ft_stroke_border_conicto( border, &ctrl, &end );
+          if ( error )
+            goto Exit;
+        }
+      }
+
+      arc -= 2;
+
+      stroker->angle_in = angle_out;
+    }
+
+    stroker->center = *to;
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stroker_CubicTo( FT_Stroker  stroker,
+                      FT_Vector*  control1,
+                      FT_Vector*  control2,
+                      FT_Vector*  to )
+  {
+    FT_Error    error = FT_Err_Ok;
+    FT_Vector   bez_stack[37];
+    FT_Vector*  arc;
+    FT_Vector*  limit = bez_stack + 32;
+    FT_Bool     first_arc = TRUE;
+
+
+    /* if all control points are coincident, this is a no-op; */
+    /* avoid creating a spurious corner */
+    if ( FT_IS_SMALL( stroker->center.x - control1->x ) &&
+         FT_IS_SMALL( stroker->center.y - control1->y ) &&
+         FT_IS_SMALL( control1->x       - control2->x ) &&
+         FT_IS_SMALL( control1->y       - control2->y ) &&
+         FT_IS_SMALL( control2->x       - to->x       ) &&
+         FT_IS_SMALL( control2->y       - to->y       ) )
+    {
+       stroker->center = *to;
+       goto Exit;
+    }
+
+    arc    = bez_stack;
+    arc[0] = *to;
+    arc[1] = *control2;
+    arc[2] = *control1;
+    arc[3] = stroker->center;
+
+    while ( arc >= bez_stack )
+    {
+      FT_Angle  angle_in, angle_mid, angle_out;
+
+
+      /* initialize with current direction */
+      angle_in = angle_out = angle_mid = stroker->angle_in;
+
+      if ( arc < limit                                         &&
+           !ft_cubic_is_small_enough( arc, &angle_in,
+                                      &angle_mid, &angle_out ) )
+      {
+        if ( stroker->first_point )
+          stroker->angle_in = angle_in;
+
+        ft_cubic_split( arc );
+        arc += 3;
+        continue;
+      }
+
+      if ( first_arc )
+      {
+        first_arc = FALSE;
+
+        /* process corner if necessary */
+        if ( stroker->first_point )
+          error = ft_stroker_subpath_start( stroker, angle_in, 0 );
+        else
+        {
+          stroker->angle_out = angle_in;
+          error = ft_stroker_process_corner( stroker, 0 );
+        }
+      }
+      else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) >
+                  FT_SMALL_CUBIC_THRESHOLD / 4                             )
+      {
+        /* if the deviation from one arc to the next is too great, */
+        /* add a round corner                                      */
+        stroker->center    = arc[3];
+        stroker->angle_out = angle_in;
+        stroker->line_join = FT_STROKER_LINEJOIN_ROUND;
+
+        error = ft_stroker_process_corner( stroker, 0 );
+
+        /* reinstate line join style */
+        stroker->line_join = stroker->line_join_saved;
+      }
+
+      if ( error )
+        goto Exit;
+
+      /* the arc's angle is small enough; we can add it directly to each */
+      /* border                                                          */
+      {
+        FT_Vector        ctrl1, ctrl2, end;
+        FT_Angle         theta1, phi1, theta2, phi2, rotate, alpha0 = 0;
+        FT_Fixed         length1, length2;
+        FT_StrokeBorder  border;
+        FT_Int           side;
+
+
+        theta1  = FT_Angle_Diff( angle_in,  angle_mid ) / 2;
+        theta2  = FT_Angle_Diff( angle_mid, angle_out ) / 2;
+        phi1    = ft_angle_mean( angle_in,  angle_mid );
+        phi2    = ft_angle_mean( angle_mid, angle_out );
+        length1 = FT_DivFix( stroker->radius, FT_Cos( theta1 ) );
+        length2 = FT_DivFix( stroker->radius, FT_Cos( theta2 ) );
+
+        /* compute direction of original arc */
+        if ( stroker->handle_wide_strokes )
+          alpha0 = FT_Atan2( arc[0].x - arc[3].x, arc[0].y - arc[3].y );
+
+        for ( border = stroker->borders, side = 0;
+              side <= 1;
+              side++, border++ )
+        {
+          rotate = FT_SIDE_TO_ROTATE( side );
+
+          /* compute control points */
+          FT_Vector_From_Polar( &ctrl1, length1, phi1 + rotate );
+          ctrl1.x += arc[2].x;
+          ctrl1.y += arc[2].y;
+
+          FT_Vector_From_Polar( &ctrl2, length2, phi2 + rotate );
+          ctrl2.x += arc[1].x;
+          ctrl2.y += arc[1].y;
+
+          /* compute end point */
+          FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate );
+          end.x += arc[0].x;
+          end.y += arc[0].y;
+
+          if ( stroker->handle_wide_strokes )
+          {
+            FT_Vector  start;
+            FT_Angle   alpha1;
+
+
+            /* determine whether the border radius is greater than the */
+            /* radius of curvature of the original arc                 */
+            start = border->points[border->num_points - 1];
+
+            alpha1 = FT_Atan2( end.x - start.x, end.y - start.y );
+
+            /* is the direction of the border arc opposite to */
+            /* that of the original arc? */
+            if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) >
+                   FT_ANGLE_PI / 2                             )
+            {
+              FT_Angle   beta, gamma;
+              FT_Vector  bvec, delta;
+              FT_Fixed   blen, sinA, sinB, alen;
+
+
+              /* use the sine rule to find the intersection point */
+              beta  = FT_Atan2( arc[3].x - start.x, arc[3].y - start.y );
+              gamma = FT_Atan2( arc[0].x - end.x,   arc[0].y - end.y );
+
+              bvec.x = end.x - start.x;
+              bvec.y = end.y - start.y;
+
+              blen = FT_Vector_Length( &bvec );
+
+              sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) );
+              sinB = ft_pos_abs( FT_Sin( beta - gamma ) );
+
+              alen = FT_DivFix( FT_MulFix( blen, sinA ), sinB );
+
+              FT_Vector_From_Polar( &delta, alen, beta );
+              delta.x += start.x;
+              delta.y += start.y;
+
+              /* circumnavigate the negative sector backwards */
+              border->movable = FALSE;
+              error = ft_stroke_border_lineto( border, &delta, FALSE );
+              if ( error )
+                goto Exit;
+              error = ft_stroke_border_lineto( border, &end, FALSE );
+              if ( error )
+                goto Exit;
+              error = ft_stroke_border_cubicto( border,
+                                                &ctrl2,
+                                                &ctrl1,
+                                                &start );
+              if ( error )
+                goto Exit;
+              /* and then move to the endpoint */
+              error = ft_stroke_border_lineto( border, &end, FALSE );
+              if ( error )
+                goto Exit;
+
+              continue;
+            }
+
+            /* else fall through */
+          }
+
+          /* simply add an arc */
+          error = ft_stroke_border_cubicto( border, &ctrl1, &ctrl2, &end );
+          if ( error )
+            goto Exit;
+        }
+      }
+
+      arc -= 3;
+
+      stroker->angle_in = angle_out;
+    }
+
+    stroker->center = *to;
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stroker_BeginSubPath( FT_Stroker  stroker,
+                           FT_Vector*  to,
+                           FT_Bool     open )
+  {
+    /* We cannot process the first point, because there is not enough      */
+    /* information regarding its corner/cap.  The latter will be processed */
+    /* in the `FT_Stroker_EndSubPath' routine.                             */
+    /*                                                                     */
+    stroker->first_point  = TRUE;
+    stroker->center       = *to;
+    stroker->subpath_open = open;
+
+    /* Determine if we need to check whether the border radius is greater */
+    /* than the radius of curvature of a curve, to handle this case       */
+    /* specially.  This is only required if bevel joins or butt caps may  */
+    /* be created, because round & miter joins and round & square caps    */
+    /* cover the negative sector created with wide strokes.               */
+    stroker->handle_wide_strokes =
+      FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_ROUND  ||
+               ( stroker->subpath_open                        &&
+                 stroker->line_cap == FT_STROKER_LINECAP_BUTT ) );
+
+    /* record the subpath start point for each border */
+    stroker->subpath_start = *to;
+
+    stroker->angle_in = 0;
+
+    return FT_Err_Ok;
+  }
+
+
+  static FT_Error
+  ft_stroker_add_reverse_left( FT_Stroker  stroker,
+                               FT_Bool     open )
+  {
+    FT_StrokeBorder  right = stroker->borders + 0;
+    FT_StrokeBorder  left  = stroker->borders + 1;
+    FT_Int           new_points;
+    FT_Error         error = FT_Err_Ok;
+
+
+    FT_ASSERT( left->start >= 0 );
+
+    new_points = left->num_points - left->start;
+    if ( new_points > 0 )
+    {
+      error = ft_stroke_border_grow( right, (FT_UInt)new_points );
+      if ( error )
+        goto Exit;
+
+      {
+        FT_Vector*  dst_point = right->points + right->num_points;
+        FT_Byte*    dst_tag   = right->tags   + right->num_points;
+        FT_Vector*  src_point = left->points  + left->num_points - 1;
+        FT_Byte*    src_tag   = left->tags    + left->num_points - 1;
+
+
+        while ( src_point >= left->points + left->start )
+        {
+          *dst_point = *src_point;
+          *dst_tag   = *src_tag;
+
+          if ( open )
+            dst_tag[0] &= ~FT_STROKE_TAG_BEGIN_END;
+          else
+          {
+            FT_Byte  ttag =
+                       (FT_Byte)( dst_tag[0] & FT_STROKE_TAG_BEGIN_END );
+
+
+            /* switch begin/end tags if necessary */
+            if ( ttag == FT_STROKE_TAG_BEGIN ||
+                 ttag == FT_STROKE_TAG_END   )
+              dst_tag[0] ^= FT_STROKE_TAG_BEGIN_END;
+          }
+
+          src_point--;
+          src_tag--;
+          dst_point++;
+          dst_tag++;
+        }
+      }
+
+      left->num_points   = left->start;
+      right->num_points += new_points;
+
+      right->movable = FALSE;
+      left->movable  = FALSE;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  /* there's a lot of magic in this function! */
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stroker_EndSubPath( FT_Stroker  stroker )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    if ( stroker->subpath_open )
+    {
+      FT_StrokeBorder  right = stroker->borders;
+
+
+      /* All right, this is an opened path, we need to add a cap between */
+      /* right & left, add the reverse of left, then add a final cap     */
+      /* between left & right.                                           */
+      error = ft_stroker_cap( stroker, stroker->angle_in, 0 );
+      if ( error )
+        goto Exit;
+
+      /* add reversed points from `left' to `right' */
+      error = ft_stroker_add_reverse_left( stroker, TRUE );
+      if ( error )
+        goto Exit;
+
+      /* now add the final cap */
+      stroker->center = stroker->subpath_start;
+      error = ft_stroker_cap( stroker,
+                              stroker->subpath_angle + FT_ANGLE_PI, 0 );
+      if ( error )
+        goto Exit;
+
+      /* Now end the right subpath accordingly.  The left one is */
+      /* rewind and doesn't need further processing.             */
+      ft_stroke_border_close( right, FALSE );
+    }
+    else
+    {
+      FT_Angle  turn;
+      FT_Int    inside_side;
+
+
+      /* close the path if needed */
+      if ( stroker->center.x != stroker->subpath_start.x ||
+           stroker->center.y != stroker->subpath_start.y )
+      {
+         error = FT_Stroker_LineTo( stroker, &stroker->subpath_start );
+         if ( error )
+           goto Exit;
+      }
+
+      /* process the corner */
+      stroker->angle_out = stroker->subpath_angle;
+      turn               = FT_Angle_Diff( stroker->angle_in,
+                                          stroker->angle_out );
+
+      /* no specific corner processing is required if the turn is 0 */
+      if ( turn != 0 )
+      {
+        /* when we turn to the right, the inside side is 0 */
+        inside_side = 0;
+
+        /* otherwise, the inside side is 1 */
+        if ( turn < 0 )
+          inside_side = 1;
+
+        error = ft_stroker_inside( stroker,
+                                   inside_side,
+                                   stroker->subpath_line_length );
+        if ( error )
+          goto Exit;
+
+        /* process the outside side */
+        error = ft_stroker_outside( stroker,
+                                    1 - inside_side,
+                                    stroker->subpath_line_length );
+        if ( error )
+          goto Exit;
+      }
+
+      /* then end our two subpaths */
+      ft_stroke_border_close( stroker->borders + 0, FALSE );
+      ft_stroke_border_close( stroker->borders + 1, TRUE );
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stroker_GetBorderCounts( FT_Stroker        stroker,
+                              FT_StrokerBorder  border,
+                              FT_UInt          *anum_points,
+                              FT_UInt          *anum_contours )
+  {
+    FT_UInt   num_points = 0, num_contours = 0;
+    FT_Error  error;
+
+
+    if ( !stroker || border > 1 )
+    {
+      error = FT_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    error = ft_stroke_border_get_counts( stroker->borders + border,
+                                         &num_points, &num_contours );
+  Exit:
+    if ( anum_points )
+      *anum_points = num_points;
+
+    if ( anum_contours )
+      *anum_contours = num_contours;
+
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stroker_GetCounts( FT_Stroker  stroker,
+                        FT_UInt    *anum_points,
+                        FT_UInt    *anum_contours )
+  {
+    FT_UInt   count1, count2, num_points   = 0;
+    FT_UInt   count3, count4, num_contours = 0;
+    FT_Error  error;
+
+
+    error = ft_stroke_border_get_counts( stroker->borders + 0,
+                                         &count1, &count2 );
+    if ( error )
+      goto Exit;
+
+    error = ft_stroke_border_get_counts( stroker->borders + 1,
+                                         &count3, &count4 );
+    if ( error )
+      goto Exit;
+
+    num_points   = count1 + count3;
+    num_contours = count2 + count4;
+
+  Exit:
+    *anum_points   = num_points;
+    *anum_contours = num_contours;
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Stroker_ExportBorder( FT_Stroker        stroker,
+                           FT_StrokerBorder  border,
+                           FT_Outline*       outline )
+  {
+    if ( border == FT_STROKER_BORDER_LEFT  ||
+         border == FT_STROKER_BORDER_RIGHT )
+    {
+      FT_StrokeBorder  sborder = & stroker->borders[border];
+
+
+      if ( sborder->valid )
+        ft_stroke_border_export( sborder, outline );
+    }
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Stroker_Export( FT_Stroker   stroker,
+                     FT_Outline*  outline )
+  {
+    FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_LEFT, outline );
+    FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_RIGHT, outline );
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  /*
+   *  The following is very similar to FT_Outline_Decompose, except
+   *  that we do support opened paths, and do not scale the outline.
+   */
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stroker_ParseOutline( FT_Stroker   stroker,
+                           FT_Outline*  outline,
+                           FT_Bool      opened )
+  {
+    FT_Vector   v_last;
+    FT_Vector   v_control;
+    FT_Vector   v_start;
+
+    FT_Vector*  point;
+    FT_Vector*  limit;
+    char*       tags;
+
+    FT_Error    error;
+
+    FT_Int      n;         /* index of contour in outline     */
+    FT_UInt     first;     /* index of first point in contour */
+    FT_Int      tag;       /* current point's state           */
+
+
+    if ( !outline || !stroker )
+      return FT_Err_Invalid_Argument;
+
+    FT_Stroker_Rewind( stroker );
+
+    first = 0;
+
+    for ( n = 0; n < outline->n_contours; n++ )
+    {
+      FT_UInt  last;  /* index of last point in contour */
+
+
+      last  = outline->contours[n];
+      limit = outline->points + last;
+
+      /* skip empty points; we don't stroke these */
+      if ( last <= first )
+      {
+        first = last + 1;
+        continue;
+      }
+
+      v_start = outline->points[first];
+      v_last  = outline->points[last];
+
+      v_control = v_start;
+
+      point = outline->points + first;
+      tags  = outline->tags   + first;
+      tag   = FT_CURVE_TAG( tags[0] );
+
+      /* A contour cannot start with a cubic control point! */
+      if ( tag == FT_CURVE_TAG_CUBIC )
+        goto Invalid_Outline;
+
+      /* check first point to determine origin */
+      if ( tag == FT_CURVE_TAG_CONIC )
+      {
+        /* First point is conic control.  Yes, this happens. */
+        if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )
+        {
+          /* start at last point if it is on the curve */
+          v_start = v_last;
+          limit--;
+        }
+        else
+        {
+          /* if both first and last points are conic, */
+          /* start at their middle                    */
+          v_start.x = ( v_start.x + v_last.x ) / 2;
+          v_start.y = ( v_start.y + v_last.y ) / 2;
+        }
+        point--;
+        tags--;
+      }
+
+      error = FT_Stroker_BeginSubPath( stroker, &v_start, opened );
+      if ( error )
+        goto Exit;
+
+      while ( point < limit )
+      {
+        point++;
+        tags++;
+
+        tag = FT_CURVE_TAG( tags[0] );
+        switch ( tag )
+        {
+        case FT_CURVE_TAG_ON:  /* emit a single line_to */
+          {
+            FT_Vector  vec;
+
+
+            vec.x = point->x;
+            vec.y = point->y;
+
+            error = FT_Stroker_LineTo( stroker, &vec );
+            if ( error )
+              goto Exit;
+            continue;
+          }
+
+        case FT_CURVE_TAG_CONIC:  /* consume conic arcs */
+          v_control.x = point->x;
+          v_control.y = point->y;
+
+        Do_Conic:
+          if ( point < limit )
+          {
+            FT_Vector  vec;
+            FT_Vector  v_middle;
+
+
+            point++;
+            tags++;
+            tag = FT_CURVE_TAG( tags[0] );
+
+            vec = point[0];
+
+            if ( tag == FT_CURVE_TAG_ON )
+            {
+              error = FT_Stroker_ConicTo( stroker, &v_control, &vec );
+              if ( error )
+                goto Exit;
+              continue;
+            }
+
+            if ( tag != FT_CURVE_TAG_CONIC )
+              goto Invalid_Outline;
+
+            v_middle.x = ( v_control.x + vec.x ) / 2;
+            v_middle.y = ( v_control.y + vec.y ) / 2;
+
+            error = FT_Stroker_ConicTo( stroker, &v_control, &v_middle );
+            if ( error )
+              goto Exit;
+
+            v_control = vec;
+            goto Do_Conic;
+          }
+
+          error = FT_Stroker_ConicTo( stroker, &v_control, &v_start );
+          goto Close;
+
+        default:  /* FT_CURVE_TAG_CUBIC */
+          {
+            FT_Vector  vec1, vec2;
+
+
+            if ( point + 1 > limit                             ||
+                 FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
+              goto Invalid_Outline;
+
+            point += 2;
+            tags  += 2;
+
+            vec1 = point[-2];
+            vec2 = point[-1];
+
+            if ( point <= limit )
+            {
+              FT_Vector  vec;
+
+
+              vec = point[0];
+
+              error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &vec );
+              if ( error )
+                goto Exit;
+              continue;
+            }
+
+            error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &v_start );
+            goto Close;
+          }
+        }
+      }
+
+    Close:
+      if ( error )
+        goto Exit;
+
+      /* don't try to end the path if no segments have been generated */
+      if ( !stroker->first_point )
+      {
+        error = FT_Stroker_EndSubPath( stroker );
+        if ( error )
+          goto Exit;
+      }
+
+      first = last + 1;
+    }
+
+    return FT_Err_Ok;
+
+  Exit:
+    return error;
+
+  Invalid_Outline:
+    return FT_Err_Invalid_Outline;
+  }
+
+
+  /* declare an extern to access `ft_outline_glyph_class' globally     */
+  /* allocated  in `ftglyph.c', and use the FT_OUTLINE_GLYPH_CLASS_GET */
+  /* macro to access it when FT_CONFIG_OPTION_PIC is defined           */
+#ifndef FT_CONFIG_OPTION_PIC
+  extern const FT_Glyph_Class  ft_outline_glyph_class;
+#endif
+#include "basepic.h"
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Glyph_Stroke( FT_Glyph    *pglyph,
+                   FT_Stroker   stroker,
+                   FT_Bool      destroy )
+  {
+    FT_Error    error   = FT_Err_Invalid_Argument;
+    FT_Glyph    glyph   = NULL;
+    FT_Library  library = stroker->library;
+
+    FT_UNUSED( library );
+
+
+    if ( pglyph == NULL )
+      goto Exit;
+
+    glyph = *pglyph;
+    if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET )
+      goto Exit;
+
+    {
+      FT_Glyph  copy;
+
+
+      error = FT_Glyph_Copy( glyph, &copy );
+      if ( error )
+        goto Exit;
+
+      glyph = copy;
+    }
+
+    {
+      FT_OutlineGlyph  oglyph  = (FT_OutlineGlyph)glyph;
+      FT_Outline*      outline = &oglyph->outline;
+      FT_UInt          num_points, num_contours;
+
+
+      error = FT_Stroker_ParseOutline( stroker, outline, FALSE );
+      if ( error )
+        goto Fail;
+
+      (void)FT_Stroker_GetCounts( stroker, &num_points, &num_contours );
+
+      FT_Outline_Done( glyph->library, outline );
+
+      error = FT_Outline_New( glyph->library,
+                              num_points, num_contours, outline );
+      if ( error )
+        goto Fail;
+
+      outline->n_points   = 0;
+      outline->n_contours = 0;
+
+      FT_Stroker_Export( stroker, outline );
+    }
+
+    if ( destroy )
+      FT_Done_Glyph( *pglyph );
+
+    *pglyph = glyph;
+    goto Exit;
+
+  Fail:
+    FT_Done_Glyph( glyph );
+    glyph = NULL;
+
+    if ( !destroy )
+      *pglyph = NULL;
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftstroke.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Glyph_StrokeBorder( FT_Glyph    *pglyph,
+                         FT_Stroker   stroker,
+                         FT_Bool      inside,
+                         FT_Bool      destroy )
+  {
+    FT_Error    error   = FT_Err_Invalid_Argument;
+    FT_Glyph    glyph   = NULL;
+    FT_Library  library = stroker->library;
+
+    FT_UNUSED( library );
+
+
+    if ( pglyph == NULL )
+      goto Exit;
+
+    glyph = *pglyph;
+    if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET )
+      goto Exit;
+
+    {
+      FT_Glyph  copy;
+
+
+      error = FT_Glyph_Copy( glyph, &copy );
+      if ( error )
+        goto Exit;
+
+      glyph = copy;
+    }
+
+    {
+      FT_OutlineGlyph   oglyph  = (FT_OutlineGlyph)glyph;
+      FT_StrokerBorder  border;
+      FT_Outline*       outline = &oglyph->outline;
+      FT_UInt           num_points, num_contours;
+
+
+      border = FT_Outline_GetOutsideBorder( outline );
+      if ( inside )
+      {
+        if ( border == FT_STROKER_BORDER_LEFT )
+          border = FT_STROKER_BORDER_RIGHT;
+        else
+          border = FT_STROKER_BORDER_LEFT;
+      }
+
+      error = FT_Stroker_ParseOutline( stroker, outline, FALSE );
+      if ( error )
+        goto Fail;
+
+      (void)FT_Stroker_GetBorderCounts( stroker, border,
+                                        &num_points, &num_contours );
+
+      FT_Outline_Done( glyph->library, outline );
+
+      error = FT_Outline_New( glyph->library,
+                              num_points,
+                              num_contours,
+                              outline );
+      if ( error )
+        goto Fail;
+
+      outline->n_points   = 0;
+      outline->n_contours = 0;
+
+      FT_Stroker_ExportBorder( stroker, border, outline );
+    }
+
+    if ( destroy )
+      FT_Done_Glyph( *pglyph );
+
+    *pglyph = glyph;
+    goto Exit;
+
+  Fail:
+    FT_Done_Glyph( glyph );
+    glyph = NULL;
+
+    if ( !destroy )
+      *pglyph = NULL;
+
+  Exit:
+    return error;
+  }
+
+
+/* END */
diff --git a/src/base/ftsynth.c b/src/base/ftsynth.c
new file mode 100644 (file)
index 0000000..d4ec0da
--- /dev/null
@@ -0,0 +1,160 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsynth.c                                                              */
+/*                                                                         */
+/*    FreeType synthesizing code for emboldening and slanting (body).      */
+/*                                                                         */
+/*  Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_SYNTHESIS_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_OUTLINE_H
+#include FT_BITMAP_H
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_synth
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****   EXPERIMENTAL OBLIQUING SUPPORT                                ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* documentation is in ftsynth.h */
+
+  FT_EXPORT_DEF( void )
+  FT_GlyphSlot_Oblique( FT_GlyphSlot  slot )
+  {
+    FT_Matrix    transform;
+    FT_Outline*  outline = &slot->outline;
+
+
+    /* only oblique outline glyphs */
+    if ( slot->format != FT_GLYPH_FORMAT_OUTLINE )
+      return;
+
+    /* we don't touch the advance width */
+
+    /* For italic, simply apply a shear transform, with an angle */
+    /* of about 12 degrees.                                      */
+
+    transform.xx = 0x10000L;
+    transform.yx = 0x00000L;
+
+    transform.xy = 0x06000L;
+    transform.yy = 0x10000L;
+
+    FT_Outline_Transform( outline, &transform );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****   EXPERIMENTAL EMBOLDENING/OUTLINING SUPPORT                    ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* documentation is in ftsynth.h */
+
+  FT_EXPORT_DEF( void )
+  FT_GlyphSlot_Embolden( FT_GlyphSlot  slot )
+  {
+    FT_Library  library = slot->library;
+    FT_Face     face    = slot->face;
+    FT_Error    error;
+    FT_Pos      xstr, ystr;
+
+
+    if ( slot->format != FT_GLYPH_FORMAT_OUTLINE &&
+         slot->format != FT_GLYPH_FORMAT_BITMAP  )
+      return;
+
+    /* some reasonable strength */
+    xstr = FT_MulFix( face->units_per_EM,
+                      face->size->metrics.y_scale ) / 24;
+    ystr = xstr;
+
+    if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
+    {
+      /* ignore error */
+      (void)FT_Outline_Embolden( &slot->outline, xstr );
+
+      /* this is more than enough for most glyphs; if you need accurate */
+      /* values, you have to call FT_Outline_Get_CBox                   */
+      xstr = xstr * 2;
+      ystr = xstr;
+    }
+    else /* slot->format == FT_GLYPH_FORMAT_BITMAP */
+    {
+      /* round to full pixels */
+      xstr &= ~63;
+      if ( xstr == 0 )
+        xstr = 1 << 6;
+      ystr &= ~63;
+
+      /*
+       * XXX: overflow check for 16-bit system, for compatibility
+       *      with FT_GlyphSlot_Embolden() since freetype-2.1.10.
+       *      unfortunately, this function return no informations
+       *      about the cause of error.
+       */
+      if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN )
+      {
+        FT_TRACE1(( "FT_GlyphSlot_Embolden:" ));
+        FT_TRACE1(( "too strong embolding parameter ystr=%d\n", ystr ));
+        return;
+      }
+      error = FT_GlyphSlot_Own_Bitmap( slot );
+      if ( error )
+        return;
+
+      error = FT_Bitmap_Embolden( library, &slot->bitmap, xstr, ystr );
+      if ( error )
+        return;
+    }
+
+    if ( slot->advance.x )
+      slot->advance.x += xstr;
+
+    if ( slot->advance.y )
+      slot->advance.y += ystr;
+
+    slot->metrics.width        += xstr;
+    slot->metrics.height       += ystr;
+    slot->metrics.horiBearingY += ystr;
+    slot->metrics.horiAdvance  += xstr;
+    slot->metrics.vertBearingX -= xstr / 2;
+    slot->metrics.vertBearingY += ystr;
+    slot->metrics.vertAdvance  += ystr;
+
+    /* XXX: 16-bit overflow case must be excluded before here */
+    if ( slot->format == FT_GLYPH_FORMAT_BITMAP )
+      slot->bitmap_top += (FT_Int)( ystr >> 6 );
+  }
+
+
+/* END */
diff --git a/src/base/ftsystem.c b/src/base/ftsystem.c
new file mode 100644 (file)
index 0000000..7e203be
--- /dev/null
@@ -0,0 +1,320 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsystem.c                                                             */
+/*                                                                         */
+/*    ANSI-specific FreeType low-level system interface (body).            */
+/*                                                                         */
+/*  Copyright 1996-2002, 2006, 2008-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file contains the default interface used by FreeType to access   */
+  /* low-level, i.e. memory management, i/o access as well as thread       */
+  /* synchronisation.  It can be replaced by user-specific routines if     */
+  /* necessary.                                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_CONFIG_CONFIG_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_SYSTEM_H
+#include FT_ERRORS_H
+#include FT_TYPES_H
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                       MEMORY MANAGEMENT INTERFACE                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* It is not necessary to do any error checking for the                  */
+  /* allocation-related functions.  This will be done by the higher level  */
+  /* routines like ft_mem_alloc() or ft_mem_realloc().                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_alloc                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The memory allocation function.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory :: A pointer to the memory object.                          */
+  /*                                                                       */
+  /*    size   :: The requested size in bytes.                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The address of newly allocated block.                              */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void* )
+  ft_alloc( FT_Memory  memory,
+            long       size )
+  {
+    FT_UNUSED( memory );
+
+    return ft_smalloc( size );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_realloc                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The memory reallocation function.                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory   :: A pointer to the memory object.                        */
+  /*                                                                       */
+  /*    cur_size :: The current size of the allocated memory block.        */
+  /*                                                                       */
+  /*    new_size :: The newly requested size in bytes.                     */
+  /*                                                                       */
+  /*    block    :: The current address of the block in memory.            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The address of the reallocated memory block.                       */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void* )
+  ft_realloc( FT_Memory  memory,
+              long       cur_size,
+              long       new_size,
+              void*      block )
+  {
+    FT_UNUSED( memory );
+    FT_UNUSED( cur_size );
+
+    return ft_srealloc( block, new_size );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_free                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The memory release function.                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory  :: A pointer to the memory object.                         */
+  /*                                                                       */
+  /*    block   :: The address of block in memory to be freed.             */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void )
+  ft_free( FT_Memory  memory,
+           void*      block )
+  {
+    FT_UNUSED( memory );
+
+    ft_sfree( block );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                     RESOURCE MANAGEMENT INTERFACE                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_io
+
+  /* We use the macro STREAM_FILE for convenience to extract the       */
+  /* system-specific stream handle from a given FreeType stream object */
+#define STREAM_FILE( stream )  ( (FT_FILE*)stream->descriptor.pointer )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_ansi_stream_close                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The function to close a stream.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: A pointer to the stream object.                          */
+  /*                                                                       */
+  FT_CALLBACK_DEF( void )
+  ft_ansi_stream_close( FT_Stream  stream )
+  {
+    ft_fclose( STREAM_FILE( stream ) );
+
+    stream->descriptor.pointer = NULL;
+    stream->size               = 0;
+    stream->base               = 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_ansi_stream_io                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The function to open a stream.                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: A pointer to the stream object.                          */
+  /*                                                                       */
+  /*    offset :: The position in the data stream to start reading.        */
+  /*                                                                       */
+  /*    buffer :: The address of buffer to store the read data.            */
+  /*                                                                       */
+  /*    count  :: The number of bytes to read from the stream.             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The number of bytes actually read.  If `count' is zero (this is,   */
+  /*    the function is used for seeking), a non-zero return value         */
+  /*    indicates an error.                                                */
+  /*                                                                       */
+  FT_CALLBACK_DEF( unsigned long )
+  ft_ansi_stream_io( FT_Stream       stream,
+                     unsigned long   offset,
+                     unsigned char*  buffer,
+                     unsigned long   count )
+  {
+    FT_FILE*  file;
+
+
+    if ( !count && offset > stream->size )
+      return 1;
+
+    file = STREAM_FILE( stream );
+
+    if ( stream->pos != offset )
+      ft_fseek( file, offset, SEEK_SET );
+
+    return (unsigned long)ft_fread( buffer, 1, count, file );
+  }
+
+
+  /* documentation is in ftstream.h */
+
+  FT_BASE_DEF( FT_Error )
+  FT_Stream_Open( FT_Stream    stream,
+                  const char*  filepathname )
+  {
+    FT_FILE*  file;
+
+
+    if ( !stream )
+      return FT_Err_Invalid_Stream_Handle;
+
+    stream->descriptor.pointer = NULL;
+    stream->pathname.pointer   = (char*)filepathname;
+    stream->base               = 0;
+    stream->pos                = 0;
+    stream->read               = NULL;
+    stream->close              = NULL;
+
+    file = ft_fopen( filepathname, "rb" );
+    if ( !file )
+    {
+      FT_ERROR(( "FT_Stream_Open:"
+                 " could not open `%s'\n", filepathname ));
+
+      return FT_Err_Cannot_Open_Resource;
+    }
+
+    ft_fseek( file, 0, SEEK_END );
+    stream->size = ft_ftell( file );
+    if ( !stream->size )
+    {
+      FT_ERROR(( "FT_Stream_Open:" ));
+      FT_ERROR(( " opened `%s' but zero-sized\n", filepathname ));
+      ft_fclose( file );
+      return FT_Err_Cannot_Open_Stream;
+    }
+    ft_fseek( file, 0, SEEK_SET );
+
+    stream->descriptor.pointer = file;
+    stream->read  = ft_ansi_stream_io;
+    stream->close = ft_ansi_stream_close;
+
+    FT_TRACE1(( "FT_Stream_Open:" ));
+    FT_TRACE1(( " opened `%s' (%d bytes) successfully\n",
+                filepathname, stream->size ));
+
+    return FT_Err_Ok;
+  }
+
+#endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */
+
+#ifdef FT_DEBUG_MEMORY
+
+  extern FT_Int
+  ft_mem_debug_init( FT_Memory  memory );
+
+  extern void
+  ft_mem_debug_done( FT_Memory  memory );
+
+#endif
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( FT_Memory )
+  FT_New_Memory( void )
+  {
+    FT_Memory  memory;
+
+
+    memory = (FT_Memory)ft_smalloc( sizeof ( *memory ) );
+    if ( memory )
+    {
+      memory->user    = 0;
+      memory->alloc   = ft_alloc;
+      memory->realloc = ft_realloc;
+      memory->free    = ft_free;
+#ifdef FT_DEBUG_MEMORY
+      ft_mem_debug_init( memory );
+#endif
+    }
+
+    return memory;
+  }
+
+
+  /* documentation is in ftobjs.h */
+
+  FT_BASE_DEF( void )
+  FT_Done_Memory( FT_Memory  memory )
+  {
+#ifdef FT_DEBUG_MEMORY
+    ft_mem_debug_done( memory );
+#endif
+    ft_sfree( memory );
+  }
+
+
+/* END */
diff --git a/src/base/fttrigon.c b/src/base/fttrigon.c
new file mode 100644 (file)
index 0000000..fdf433a
--- /dev/null
@@ -0,0 +1,546 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fttrigon.c                                                             */
+/*                                                                         */
+/*    FreeType trigonometric functions (body).                             */
+/*                                                                         */
+/*  Copyright 2001, 2002, 2003, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_TRIGONOMETRY_H
+
+
+  /* the following is 0.2715717684432231 * 2^30 */
+#define FT_TRIG_COSCALE  0x11616E8EUL
+
+  /* this table was generated for FT_PI = 180L << 16, i.e. degrees */
+#define FT_TRIG_MAX_ITERS  23
+
+  static const FT_Fixed
+  ft_trig_arctan_table[24] =
+  {
+    4157273L, 2949120L, 1740967L, 919879L, 466945L, 234379L, 117304L,
+    58666L, 29335L, 14668L, 7334L, 3667L, 1833L, 917L, 458L, 229L, 115L,
+    57L, 29L, 14L, 7L, 4L, 2L, 1L
+  };
+
+  /* the Cordic shrink factor, multiplied by 2^32 */
+#define FT_TRIG_SCALE    1166391785UL  /* 0x4585BA38UL */
+
+
+#ifdef FT_CONFIG_HAS_INT64
+
+  /* multiply a given value by the CORDIC shrink factor */
+  static FT_Fixed
+  ft_trig_downscale( FT_Fixed  val )
+  {
+    FT_Fixed  s;
+    FT_Int64  v;
+
+
+    s   = val;
+    val = ( val >= 0 ) ? val : -val;
+
+    v   = ( val * (FT_Int64)FT_TRIG_SCALE ) + 0x100000000UL;
+    val = (FT_Fixed)( v >> 32 );
+
+    return ( s >= 0 ) ? val : -val;
+  }
+
+#else /* !FT_CONFIG_HAS_INT64 */
+
+  /* multiply a given value by the CORDIC shrink factor */
+  static FT_Fixed
+  ft_trig_downscale( FT_Fixed  val )
+  {
+    FT_Fixed   s;
+    FT_UInt32  v1, v2, k1, k2, hi, lo1, lo2, lo3;
+
+
+    s   = val;
+    val = ( val >= 0 ) ? val : -val;
+
+    v1 = (FT_UInt32)val >> 16;
+    v2 = (FT_UInt32)(val & 0xFFFFL);
+
+    k1 = (FT_UInt32)FT_TRIG_SCALE >> 16;       /* constant */
+    k2 = (FT_UInt32)(FT_TRIG_SCALE & 0xFFFFL);   /* constant */
+
+    hi   = k1 * v1;
+    lo1  = k1 * v2 + k2 * v1;       /* can't overflow */
+
+    lo2  = ( k2 * v2 ) >> 16;
+    lo3  = ( lo1 >= lo2 ) ? lo1 : lo2;
+    lo1 += lo2;
+
+    hi  += lo1 >> 16;
+    if ( lo1 < lo3 )
+      hi += (FT_UInt32)0x10000UL;
+
+    val  = (FT_Fixed)hi;
+
+    return ( s >= 0 ) ? val : -val;
+  }
+
+#endif /* !FT_CONFIG_HAS_INT64 */
+
+
+  static FT_Int
+  ft_trig_prenorm( FT_Vector*  vec )
+  {
+    FT_Fixed  x, y, z;
+    FT_Int    shift;
+
+
+    x = vec->x;
+    y = vec->y;
+
+    z     = ( ( x >= 0 ) ? x : - x ) | ( (y >= 0) ? y : -y );
+    shift = 0;
+
+#if 1
+    /* determine msb bit index in `shift' */
+    if ( z >= ( 1L << 16 ) )
+    {
+      z     >>= 16;
+      shift  += 16;
+    }
+    if ( z >= ( 1L << 8 ) )
+    {
+      z     >>= 8;
+      shift  += 8;
+    }
+    if ( z >= ( 1L << 4 ) )
+    {
+      z     >>= 4;
+      shift  += 4;
+    }
+    if ( z >= ( 1L << 2 ) )
+    {
+      z     >>= 2;
+      shift  += 2;
+    }
+    if ( z >= ( 1L << 1 ) )
+    {
+      z    >>= 1;
+      shift += 1;
+    }
+
+    if ( shift <= 27 )
+    {
+      shift  = 27 - shift;
+      vec->x = x << shift;
+      vec->y = y << shift;
+    }
+    else
+    {
+      shift -= 27;
+      vec->x = x >> shift;
+      vec->y = y >> shift;
+      shift  = -shift;
+    }
+
+#else /* 0 */
+
+    if ( z < ( 1L << 27 ) )
+    {
+      do
+      {
+        shift++;
+        z <<= 1;
+      } while ( z < ( 1L << 27 ) );
+      vec->x = x << shift;
+      vec->y = y << shift;
+    }
+    else if ( z > ( 1L << 28 ) )
+    {
+      do
+      {
+        shift++;
+        z >>= 1;
+      } while ( z > ( 1L << 28 ) );
+
+      vec->x = x >> shift;
+      vec->y = y >> shift;
+      shift  = -shift;
+    }
+
+#endif /* 0 */
+
+    return shift;
+  }
+
+
+  static void
+  ft_trig_pseudo_rotate( FT_Vector*  vec,
+                         FT_Angle    theta )
+  {
+    FT_Int           i;
+    FT_Fixed         x, y, xtemp;
+    const FT_Fixed  *arctanptr;
+
+
+    x = vec->x;
+    y = vec->y;
+
+    /* Get angle between -90 and 90 degrees */
+    while ( theta <= -FT_ANGLE_PI2 )
+    {
+      x = -x;
+      y = -y;
+      theta += FT_ANGLE_PI;
+    }
+
+    while ( theta > FT_ANGLE_PI2 )
+    {
+      x = -x;
+      y = -y;
+      theta -= FT_ANGLE_PI;
+    }
+
+    /* Initial pseudorotation, with left shift */
+    arctanptr = ft_trig_arctan_table;
+
+    if ( theta < 0 )
+    {
+      xtemp  = x + ( y << 1 );
+      y      = y - ( x << 1 );
+      x      = xtemp;
+      theta += *arctanptr++;
+    }
+    else
+    {
+      xtemp  = x - ( y << 1 );
+      y      = y + ( x << 1 );
+      x      = xtemp;
+      theta -= *arctanptr++;
+    }
+
+    /* Subsequent pseudorotations, with right shifts */
+    i = 0;
+    do
+    {
+      if ( theta < 0 )
+      {
+        xtemp  = x + ( y >> i );
+        y      = y - ( x >> i );
+        x      = xtemp;
+        theta += *arctanptr++;
+      }
+      else
+      {
+        xtemp  = x - ( y >> i );
+        y      = y + ( x >> i );
+        x      = xtemp;
+        theta -= *arctanptr++;
+      }
+    } while ( ++i < FT_TRIG_MAX_ITERS );
+
+    vec->x = x;
+    vec->y = y;
+  }
+
+
+  static void
+  ft_trig_pseudo_polarize( FT_Vector*  vec )
+  {
+    FT_Fixed         theta;
+    FT_Fixed         yi, i;
+    FT_Fixed         x, y;
+    const FT_Fixed  *arctanptr;
+
+
+    x = vec->x;
+    y = vec->y;
+
+    /* Get the vector into the right half plane */
+    theta = 0;
+    if ( x < 0 )
+    {
+      x = -x;
+      y = -y;
+      theta = 2 * FT_ANGLE_PI2;
+    }
+
+    if ( y > 0 )
+      theta = - theta;
+
+    arctanptr = ft_trig_arctan_table;
+
+    if ( y < 0 )
+    {
+      /* Rotate positive */
+      yi     = y + ( x << 1 );
+      x      = x - ( y << 1 );
+      y      = yi;
+      theta -= *arctanptr++;  /* Subtract angle */
+    }
+    else
+    {
+      /* Rotate negative */
+      yi     = y - ( x << 1 );
+      x      = x + ( y << 1 );
+      y      = yi;
+      theta += *arctanptr++;  /* Add angle */
+    }
+
+    i = 0;
+    do
+    {
+      if ( y < 0 )
+      {
+        /* Rotate positive */
+        yi     = y + ( x >> i );
+        x      = x - ( y >> i );
+        y      = yi;
+        theta -= *arctanptr++;
+      }
+      else
+      {
+        /* Rotate negative */
+        yi     = y - ( x >> i );
+        x      = x + ( y >> i );
+        y      = yi;
+        theta += *arctanptr++;
+      }
+    } while ( ++i < FT_TRIG_MAX_ITERS );
+
+    /* round theta */
+    if ( theta >= 0 )
+      theta = FT_PAD_ROUND( theta, 32 );
+    else
+      theta = -FT_PAD_ROUND( -theta, 32 );
+
+    vec->x = x;
+    vec->y = theta;
+  }
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( FT_Fixed )
+  FT_Cos( FT_Angle  angle )
+  {
+    FT_Vector  v;
+
+
+    v.x = FT_TRIG_COSCALE >> 2;
+    v.y = 0;
+    ft_trig_pseudo_rotate( &v, angle );
+
+    return v.x / ( 1 << 12 );
+  }
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( FT_Fixed )
+  FT_Sin( FT_Angle  angle )
+  {
+    return FT_Cos( FT_ANGLE_PI2 - angle );
+  }
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( FT_Fixed )
+  FT_Tan( FT_Angle  angle )
+  {
+    FT_Vector  v;
+
+
+    v.x = FT_TRIG_COSCALE >> 2;
+    v.y = 0;
+    ft_trig_pseudo_rotate( &v, angle );
+
+    return FT_DivFix( v.y, v.x );
+  }
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( FT_Angle )
+  FT_Atan2( FT_Fixed  dx,
+            FT_Fixed  dy )
+  {
+    FT_Vector  v;
+
+
+    if ( dx == 0 && dy == 0 )
+      return 0;
+
+    v.x = dx;
+    v.y = dy;
+    ft_trig_prenorm( &v );
+    ft_trig_pseudo_polarize( &v );
+
+    return v.y;
+  }
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Vector_Unit( FT_Vector*  vec,
+                  FT_Angle    angle )
+  {
+    vec->x = FT_TRIG_COSCALE >> 2;
+    vec->y = 0;
+    ft_trig_pseudo_rotate( vec, angle );
+    vec->x >>= 12;
+    vec->y >>= 12;
+  }
+
+
+  /* these macros return 0 for positive numbers,
+     and -1 for negative ones */
+#define FT_SIGN_LONG( x )   ( (x) >> ( FT_SIZEOF_LONG * 8 - 1 ) )
+#define FT_SIGN_INT( x )    ( (x) >> ( FT_SIZEOF_INT * 8 - 1 ) )
+#define FT_SIGN_INT32( x )  ( (x) >> 31 )
+#define FT_SIGN_INT16( x )  ( (x) >> 15 )
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Vector_Rotate( FT_Vector*  vec,
+                    FT_Angle    angle )
+  {
+    FT_Int     shift;
+    FT_Vector  v;
+
+
+    v.x   = vec->x;
+    v.y   = vec->y;
+
+    if ( angle && ( v.x != 0 || v.y != 0 ) )
+    {
+      shift = ft_trig_prenorm( &v );
+      ft_trig_pseudo_rotate( &v, angle );
+      v.x = ft_trig_downscale( v.x );
+      v.y = ft_trig_downscale( v.y );
+
+      if ( shift > 0 )
+      {
+        FT_Int32  half = (FT_Int32)1L << ( shift - 1 );
+
+
+        vec->x = ( v.x + half + FT_SIGN_LONG( v.x ) ) >> shift;
+        vec->y = ( v.y + half + FT_SIGN_LONG( v.y ) ) >> shift;
+      }
+      else
+      {
+        shift  = -shift;
+        vec->x = v.x << shift;
+        vec->y = v.y << shift;
+      }
+    }
+  }
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( FT_Fixed )
+  FT_Vector_Length( FT_Vector*  vec )
+  {
+    FT_Int     shift;
+    FT_Vector  v;
+
+
+    v = *vec;
+
+    /* handle trivial cases */
+    if ( v.x == 0 )
+    {
+      return ( v.y >= 0 ) ? v.y : -v.y;
+    }
+    else if ( v.y == 0 )
+    {
+      return ( v.x >= 0 ) ? v.x : -v.x;
+    }
+
+    /* general case */
+    shift = ft_trig_prenorm( &v );
+    ft_trig_pseudo_polarize( &v );
+
+    v.x = ft_trig_downscale( v.x );
+
+    if ( shift > 0 )
+      return ( v.x + ( 1 << ( shift - 1 ) ) ) >> shift;
+
+    return v.x << -shift;
+  }
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Vector_Polarize( FT_Vector*  vec,
+                      FT_Fixed   *length,
+                      FT_Angle   *angle )
+  {
+    FT_Int     shift;
+    FT_Vector  v;
+
+
+    v = *vec;
+
+    if ( v.x == 0 && v.y == 0 )
+      return;
+
+    shift = ft_trig_prenorm( &v );
+    ft_trig_pseudo_polarize( &v );
+
+    v.x = ft_trig_downscale( v.x );
+
+    *length = ( shift >= 0 ) ? ( v.x >> shift ) : ( v.x << -shift );
+    *angle  = v.y;
+  }
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( void )
+  FT_Vector_From_Polar( FT_Vector*  vec,
+                        FT_Fixed    length,
+                        FT_Angle    angle )
+  {
+    vec->x = length;
+    vec->y = 0;
+
+    FT_Vector_Rotate( vec, angle );
+  }
+
+
+  /* documentation is in fttrigon.h */
+
+  FT_EXPORT_DEF( FT_Angle )
+  FT_Angle_Diff( FT_Angle  angle1,
+                 FT_Angle  angle2 )
+  {
+    FT_Angle  delta = angle2 - angle1;
+
+
+    delta %= FT_ANGLE_2PI;
+    if ( delta < 0 )
+      delta += FT_ANGLE_2PI;
+
+    if ( delta > FT_ANGLE_PI )
+      delta -= FT_ANGLE_2PI;
+
+    return delta;
+  }
+
+
+/* END */
diff --git a/src/base/fttype1.c b/src/base/fttype1.c
new file mode 100644 (file)
index 0000000..885dba5
--- /dev/null
@@ -0,0 +1,120 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fttype1.c                                                              */
+/*                                                                         */
+/*    FreeType utility file for PS names support (body).                   */
+/*                                                                         */
+/*  Copyright 2002-2004, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_SERVICE_H
+#include FT_SERVICE_POSTSCRIPT_INFO_H
+
+
+  /* documentation is in t1tables.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_PS_Font_Info( FT_Face          face,
+                       PS_FontInfoRec*  afont_info )
+  {
+    FT_Error  error = FT_Err_Invalid_Argument;
+
+
+    if ( face )
+    {
+      FT_Service_PsInfo  service = NULL;
+
+
+      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+      if ( service && service->ps_get_font_info )
+        error = service->ps_get_font_info( face, afont_info );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in t1tables.h */
+
+  FT_EXPORT_DEF( FT_Int )
+  FT_Has_PS_Glyph_Names( FT_Face  face )
+  {
+    FT_Int             result  = 0;
+    FT_Service_PsInfo  service = NULL;
+
+
+    if ( face )
+    {
+      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+      if ( service && service->ps_has_glyph_names )
+        result = service->ps_has_glyph_names( face );
+    }
+
+    return result;
+  }
+
+
+  /* documentation is in t1tables.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_PS_Font_Private( FT_Face         face,
+                          PS_PrivateRec*  afont_private )
+  {
+    FT_Error  error = FT_Err_Invalid_Argument;
+
+
+    if ( face )
+    {
+      FT_Service_PsInfo  service = NULL;
+
+
+      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+      if ( service && service->ps_get_font_private )
+        error = service->ps_get_font_private( face, afont_private );
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in t1tables.h */
+
+  FT_EXPORT_DEF( FT_Long )
+  FT_Get_PS_Font_Value( FT_Face       face,
+                        PS_Dict_Keys  key,
+                        FT_UInt       idx,
+                        void         *value,
+                        FT_Long       value_len )
+  {
+    FT_Int             result  = 0;
+    FT_Service_PsInfo  service = NULL;
+
+
+    if ( face )
+    {
+      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
+
+      if ( service && service->ps_get_font_value )
+        result = service->ps_get_font_value( face, key, idx,
+                                             value, value_len );
+    }
+
+    return result;
+  }
+
+
+/* END */
diff --git a/src/base/ftutil.c b/src/base/ftutil.c
new file mode 100644 (file)
index 0000000..5f77be5
--- /dev/null
@@ -0,0 +1,501 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftutil.c                                                               */
+/*                                                                         */
+/*    FreeType utility file for memory and list management (body).         */
+/*                                                                         */
+/*  Copyright 2002, 2004, 2005, 2006, 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_MEMORY_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_LIST_H
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_memory
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                                                               *****/
+  /*****               M E M O R Y   M A N A G E M E N T               *****/
+  /*****                                                               *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_mem_alloc( FT_Memory  memory,
+                FT_Long    size,
+                FT_Error  *p_error )
+  {
+    FT_Error    error;
+    FT_Pointer  block = ft_mem_qalloc( memory, size, &error );
+
+    if ( !error && size > 0 )
+      FT_MEM_ZERO( block, size );
+
+    *p_error = error;
+    return block;
+  }
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_mem_qalloc( FT_Memory  memory,
+                 FT_Long    size,
+                 FT_Error  *p_error )
+  {
+    FT_Error    error = FT_Err_Ok;
+    FT_Pointer  block = NULL;
+
+
+    if ( size > 0 )
+    {
+      block = memory->alloc( memory, size );
+      if ( block == NULL )
+        error = FT_Err_Out_Of_Memory;
+    }
+    else if ( size < 0 )
+    {
+      /* may help catch/prevent security issues */
+      error = FT_Err_Invalid_Argument;
+    }
+
+    *p_error = error;
+    return block;
+  }
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_mem_realloc( FT_Memory  memory,
+                  FT_Long    item_size,
+                  FT_Long    cur_count,
+                  FT_Long    new_count,
+                  void*      block,
+                  FT_Error  *p_error )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+    block = ft_mem_qrealloc( memory, item_size,
+                             cur_count, new_count, block, &error );
+    if ( !error && new_count > cur_count )
+      FT_MEM_ZERO( (char*)block + cur_count * item_size,
+                   ( new_count - cur_count ) * item_size );
+
+    *p_error = error;
+    return block;
+  }
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_mem_qrealloc( FT_Memory  memory,
+                   FT_Long    item_size,
+                   FT_Long    cur_count,
+                   FT_Long    new_count,
+                   void*      block,
+                   FT_Error  *p_error )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    /* Note that we now accept `item_size == 0' as a valid parameter, in
+     * order to cover very weird cases where an ALLOC_MULT macro would be
+     * called.
+     */
+    if ( cur_count < 0 || new_count < 0 || item_size < 0 )
+    {
+      /* may help catch/prevent nasty security issues */
+      error = FT_Err_Invalid_Argument;
+    }
+    else if ( new_count == 0 || item_size == 0 )
+    {
+      ft_mem_free( memory, block );
+      block = NULL;
+    }
+    else if ( new_count > FT_INT_MAX/item_size )
+    {
+      error = FT_Err_Array_Too_Large;
+    }
+    else if ( cur_count == 0 )
+    {
+      FT_ASSERT( block == NULL );
+
+      block = ft_mem_alloc( memory, new_count*item_size, &error );
+    }
+    else
+    {
+      FT_Pointer  block2;
+      FT_Long     cur_size = cur_count*item_size;
+      FT_Long     new_size = new_count*item_size;
+
+
+      block2 = memory->realloc( memory, cur_size, new_size, block );
+      if ( block2 == NULL )
+        error = FT_Err_Out_Of_Memory;
+      else
+        block = block2;
+    }
+
+    *p_error = error;
+    return block;
+  }
+
+
+  FT_BASE_DEF( void )
+  ft_mem_free( FT_Memory   memory,
+               const void *P )
+  {
+    if ( P )
+      memory->free( memory, (void*)P );
+  }
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_mem_dup( FT_Memory    memory,
+              const void*  address,
+              FT_ULong     size,
+              FT_Error    *p_error )
+  {
+    FT_Error    error;
+    FT_Pointer  p = ft_mem_qalloc( memory, size, &error );
+
+
+    if ( !error && address )
+      ft_memcpy( p, address, size );
+
+    *p_error = error;
+    return p;
+  }
+
+
+  FT_BASE_DEF( FT_Pointer )
+  ft_mem_strdup( FT_Memory    memory,
+                 const char*  str,
+                 FT_Error    *p_error )
+  {
+    FT_ULong  len = str ? (FT_ULong)ft_strlen( str ) + 1
+                        : 0;
+
+
+    return ft_mem_dup( memory, str, len, p_error );
+  }
+
+
+  FT_BASE_DEF( FT_Int )
+  ft_mem_strcpyn( char*        dst,
+                  const char*  src,
+                  FT_ULong     size )
+  {
+    while ( size > 1 && *src != 0 )
+    {
+      *dst++ = *src++;
+      size--;
+    }
+
+    *dst = 0;  /* always zero-terminate */
+
+    return *src != 0;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                                                               *****/
+  /*****            D O U B L Y   L I N K E D   L I S T S              *****/
+  /*****                                                               *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_list
+
+  /* documentation is in ftlist.h */
+
+  FT_EXPORT_DEF( FT_ListNode )
+  FT_List_Find( FT_List  list,
+                void*    data )
+  {
+    FT_ListNode  cur;
+
+
+    cur = list->head;
+    while ( cur )
+    {
+      if ( cur->data == data )
+        return cur;
+
+      cur = cur->next;
+    }
+
+    return (FT_ListNode)0;
+  }
+
+
+  /* documentation is in ftlist.h */
+
+  FT_EXPORT_DEF( void )
+  FT_List_Add( FT_List      list,
+               FT_ListNode  node )
+  {
+    FT_ListNode  before = list->tail;
+
+
+    node->next = 0;
+    node->prev = before;
+
+    if ( before )
+      before->next = node;
+    else
+      list->head = node;
+
+    list->tail = node;
+  }
+
+
+  /* documentation is in ftlist.h */
+
+  FT_EXPORT_DEF( void )
+  FT_List_Insert( FT_List      list,
+                  FT_ListNode  node )
+  {
+    FT_ListNode  after = list->head;
+
+
+    node->next = after;
+    node->prev = 0;
+
+    if ( !after )
+      list->tail = node;
+    else
+      after->prev = node;
+
+    list->head = node;
+  }
+
+
+  /* documentation is in ftlist.h */
+
+  FT_EXPORT_DEF( void )
+  FT_List_Remove( FT_List      list,
+                  FT_ListNode  node )
+  {
+    FT_ListNode  before, after;
+
+
+    before = node->prev;
+    after  = node->next;
+
+    if ( before )
+      before->next = after;
+    else
+      list->head = after;
+
+    if ( after )
+      after->prev = before;
+    else
+      list->tail = before;
+  }
+
+
+  /* documentation is in ftlist.h */
+
+  FT_EXPORT_DEF( void )
+  FT_List_Up( FT_List      list,
+              FT_ListNode  node )
+  {
+    FT_ListNode  before, after;
+
+
+    before = node->prev;
+    after  = node->next;
+
+    /* check whether we are already on top of the list */
+    if ( !before )
+      return;
+
+    before->next = after;
+
+    if ( after )
+      after->prev = before;
+    else
+      list->tail = before;
+
+    node->prev       = 0;
+    node->next       = list->head;
+    list->head->prev = node;
+    list->head       = node;
+  }
+
+
+  /* documentation is in ftlist.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_List_Iterate( FT_List            list,
+                   FT_List_Iterator   iterator,
+                   void*              user )
+  {
+    FT_ListNode  cur   = list->head;
+    FT_Error     error = FT_Err_Ok;
+
+
+    while ( cur )
+    {
+      FT_ListNode  next = cur->next;
+
+
+      error = iterator( cur, user );
+      if ( error )
+        break;
+
+      cur = next;
+    }
+
+    return error;
+  }
+
+
+  /* documentation is in ftlist.h */
+
+  FT_EXPORT_DEF( void )
+  FT_List_Finalize( FT_List             list,
+                    FT_List_Destructor  destroy,
+                    FT_Memory           memory,
+                    void*               user )
+  {
+    FT_ListNode  cur;
+
+
+    cur = list->head;
+    while ( cur )
+    {
+      FT_ListNode  next = cur->next;
+      void*        data = cur->data;
+
+
+      if ( destroy )
+        destroy( memory, data, user );
+
+      FT_FREE( cur );
+      cur = next;
+    }
+
+    list->head = 0;
+    list->tail = 0;
+  }
+
+
+  FT_BASE_DEF( FT_UInt32 )
+  ft_highpow2( FT_UInt32  value )
+  {
+    FT_UInt32  value2;
+
+
+    /*
+     *  We simply clear the lowest bit in each iteration.  When
+     *  we reach 0, we know that the previous value was our result.
+     */
+    for ( ;; )
+    {
+      value2 = value & (value - 1);  /* clear lowest bit */
+      if ( value2 == 0 )
+        break;
+
+      value = value2;
+    }
+    return value;
+  }
+
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  FT_BASE_DEF( FT_Error )
+  FT_Alloc( FT_Memory  memory,
+            FT_Long    size,
+            void*     *P )
+  {
+    FT_Error  error;
+
+
+    (void)FT_ALLOC( *P, size );
+    return error;
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_QAlloc( FT_Memory  memory,
+             FT_Long    size,
+             void*     *p )
+  {
+    FT_Error  error;
+
+
+    (void)FT_QALLOC( *p, size );
+    return error;
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_Realloc( FT_Memory  memory,
+              FT_Long    current,
+              FT_Long    size,
+              void*     *P )
+  {
+    FT_Error  error;
+
+
+    (void)FT_REALLOC( *P, current, size );
+    return error;
+  }
+
+
+  FT_BASE_DEF( FT_Error )
+  FT_QRealloc( FT_Memory  memory,
+               FT_Long    current,
+               FT_Long    size,
+               void*     *p )
+  {
+    FT_Error  error;
+
+
+    (void)FT_QREALLOC( *p, current, size );
+    return error;
+  }
+
+
+  FT_BASE_DEF( void )
+  FT_Free( FT_Memory  memory,
+           void*     *P )
+  {
+    if ( *P )
+      FT_MEM_FREE( *P );
+  }
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+/* END */
diff --git a/src/base/ftwinfnt.c b/src/base/ftwinfnt.c
new file mode 100644 (file)
index 0000000..bc2e90e
--- /dev/null
@@ -0,0 +1,51 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftwinfnt.c                                                             */
+/*                                                                         */
+/*    FreeType API for accessing Windows FNT specific info (body).         */
+/*                                                                         */
+/*  Copyright 2003, 2004 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_WINFONTS_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_SERVICE_WINFNT_H
+
+
+  /* documentation is in ftwinfnt.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_WinFNT_Header( FT_Face               face,
+                        FT_WinFNT_HeaderRec  *header )
+  {
+    FT_Service_WinFnt  service;
+    FT_Error           error;
+
+
+    error = FT_Err_Invalid_Argument;
+
+    if ( face != NULL )
+    {
+      FT_FACE_LOOKUP_SERVICE( face, service, WINFNT );
+
+      if ( service != NULL )
+      {
+        error = service->get_header( face, header );
+      }
+    }
+
+    return error;
+  }
+
+
+/* END */
diff --git a/src/base/ftxf86.c b/src/base/ftxf86.c
new file mode 100644 (file)
index 0000000..a4bf767
--- /dev/null
@@ -0,0 +1,40 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftxf86.c                                                               */
+/*                                                                         */
+/*    FreeType utility file for X11 support (body).                        */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_XFREE86_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_SERVICE_XFREE86_NAME_H
+
+
+  /* documentation is in ftxf86.h */
+
+  FT_EXPORT_DEF( const char* )
+  FT_Get_X11_Font_Format( FT_Face  face )
+  {
+    const char*  result = NULL;
+
+
+    if ( face )
+      FT_FACE_FIND_SERVICE( face, result, XF86_NAME );
+
+    return result;
+  }
+
+
+/* END */
diff --git a/src/base/rules.mk b/src/base/rules.mk
new file mode 100644 (file)
index 0000000..10f578a
--- /dev/null
@@ -0,0 +1,96 @@
+#
+# FreeType 2 base layer configuration rules
+#
+
+
+# Copyright 1996-2000, 2002, 2003, 2004, 2005, 2006, 2007, 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.
+
+
+# It sets the following variables which are used by the master Makefile
+# after the call:
+#
+#   BASE_OBJ_S:   The single-object base layer.
+#   BASE_OBJ_M:   A list of all objects for a multiple-objects build.
+#   BASE_EXT_OBJ: A list of base layer extensions, i.e., components found
+#                 in `freetype/src/base' which are not compiled within the
+#                 base layer proper.
+
+
+BASE_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SRC_DIR)/base)
+
+
+# Base layer sources
+#
+#   ftsystem, ftinit, and ftdebug are handled by freetype.mk
+#
+# All files listed here should be included in `ftbase.c' (for a `single'
+# build).
+#
+BASE_SRC := $(BASE_DIR)/ftadvanc.c \
+            $(BASE_DIR)/ftcalc.c   \
+            $(BASE_DIR)/ftdbgmem.c \
+            $(BASE_DIR)/ftgloadr.c \
+            $(BASE_DIR)/ftobjs.c   \
+            $(BASE_DIR)/ftoutln.c  \
+            $(BASE_DIR)/ftrfork.c  \
+            $(BASE_DIR)/ftsnames.c \
+            $(BASE_DIR)/ftstream.c \
+            $(BASE_DIR)/fttrigon.c \
+            $(BASE_DIR)/ftutil.c
+
+
+ifneq ($(ftmac_c),)
+  BASE_SRC += $(BASE_DIR)/$(ftmac_c)
+endif
+
+BASE_H := $(BASE_DIR)/ftbase.h
+
+# Base layer `extensions' sources
+#
+# An extension is added to the library file as a separate object.  It is
+# then linked to the final executable only if one of its symbols is used by
+# the application.
+#
+BASE_EXT_SRC := $(patsubst %,$(BASE_DIR)/%,$(BASE_EXTENSIONS))
+
+# Default extensions objects
+#
+BASE_EXT_OBJ := $(BASE_EXT_SRC:$(BASE_DIR)/%.c=$(OBJ_DIR)/%.$O)
+
+
+# Base layer object(s)
+#
+#   BASE_OBJ_M is used during `multi' builds (each base source file compiles
+#   to a single object file).
+#
+#   BASE_OBJ_S is used during `single' builds (the whole base layer is
+#   compiled as a single object file using ftbase.c).
+#
+BASE_OBJ_M := $(BASE_SRC:$(BASE_DIR)/%.c=$(OBJ_DIR)/%.$O)
+BASE_OBJ_S := $(OBJ_DIR)/ftbase.$O
+
+# Base layer root source file for single build
+#
+BASE_SRC_S := $(BASE_DIR)/ftbase.c
+
+
+# Base layer - single object build
+#
+$(BASE_OBJ_S): $(BASE_SRC_S) $(BASE_SRC) $(FREETYPE_H) $(BASE_H)
+       $(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BASE_SRC_S))
+
+
+# Multiple objects build + extensions
+#
+$(OBJ_DIR)/%.$O: $(BASE_DIR)/%.c $(FREETYPE_H) $(BASE_H)
+       $(BASE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# EOF
diff --git a/src/bdf/Jamfile b/src/bdf/Jamfile
new file mode 100644 (file)
index 0000000..da23ccd
--- /dev/null
@@ -0,0 +1,29 @@
+# FreeType 2 src/bdf Jamfile
+#
+# Copyright 2002 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) bdf ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = bdfdrivr bdflib ;
+  }
+  else
+  {
+    _sources = bdf ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/bdf Jamfile
diff --git a/src/bdf/README b/src/bdf/README
new file mode 100644 (file)
index 0000000..b761aba
--- /dev/null
@@ -0,0 +1,148 @@
+                  FreeType font driver for BDF fonts
+
+                       Francesco Zappa Nardelli
+                  <francesco.zappa.nardelli@ens.fr>
+
+
+Introduction
+************
+
+BDF (Bitmap Distribution Format) is a bitmap font format defined by Adobe,
+which is intended to be easily understood by both humans and computers.
+This code implements a BDF driver for the FreeType library, following the
+Adobe Specification V 2.2.  The specification of the BDF font format is
+available from Adobe's web site:
+
+  http://partners.adobe.com/public/developer/en/font/5005.BDF_Spec.pdf
+
+Many good bitmap fonts in bdf format come with XFree86 (www.XFree86.org).
+They do not define vertical metrics, because the X Consortium BDF
+specification has removed them.
+
+
+Encodings
+*********
+
+The variety of encodings that accompanies bdf fonts appears to encompass the
+small set defined in freetype.h.  On the other hand, two properties that
+specify encoding and registry are usually defined in bdf fonts.
+
+I decided to make these two properties directly accessible, leaving to the
+client application the work of interpreting them.  For instance:
+
+
+  #include FT_INTERNAL_BDF_TYPES_H
+
+  FT_Face          face;
+  BDF_Public_Face  bdfface;
+
+
+  FT_New_Face( library, ..., &face );
+
+  bdfface = (BDF_Public_Face)face;
+
+  if ( ( bdfface->charset_registry == "ISO10646" ) &&
+       ( bdfface->charset_encoding == "1" )        )
+    [..]
+
+
+Thus the driver always exports `ft_encoding_none' as face->charmap.encoding.
+FT_Get_Char_Index's behavior is unmodified, that is, it converts the ULong
+value given as argument into the corresponding glyph number.
+
+If the two properties are not available, Adobe Standard Encoding should be
+assumed.
+
+
+Anti-Aliased Bitmaps
+********************
+
+The driver supports an extension to the BDF format as used in Mark Leisher's
+xmbdfed bitmap font editor.  Microsoft's SBIT tool expects bitmap fonts in
+that format for adding anti-aliased them to TrueType fonts.  It introduces a
+fourth field to the `SIZE' keyword which gives the bpp value (bits per
+pixel) of the glyph data in the font.  Possible values are 1 (the default),
+2 (four gray levels), 4 (16 gray levels), and 8 (256 gray levels).  The
+driver returns either a bitmap with 1 bit per pixel or a pixmap with 8bits
+per pixel (using 4, 16, and 256 gray levels, respectively).
+
+
+Known problems
+**************
+
+- A font is entirely loaded into memory.  Obviously, this is not the Right
+  Thing(TM).  If you have big fonts I suggest you convert them into PCF
+  format (using the bdftopcf utility): the PCF font drive of FreeType can
+  perform incremental glyph loading.
+
+When I have some time, I will implement on-demand glyph parsing.
+
+- Except for encodings properties, client applications have no visibility of
+  the PCF_Face object.  This means that applications cannot directly access
+  font tables and must trust FreeType.
+
+- Currently, glyph names are ignored.
+
+  I plan to give full visibility of the BDF_Face object in an upcoming
+  revision of the driver, thus implementing also glyph names.
+
+- As I have never seen a BDF font that defines vertical metrics, vertical
+  metrics are (parsed and) discarded.  If you own a BDF font that defines
+  vertical metrics, please let me know (I will implement them in 5-10
+  minutes).
+
+
+License
+*******
+
+Copyright (C) 2001-2002 by Francesco Zappa Nardelli
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*** Portions of the driver (that is, bdflib.c and bdf.h):
+
+Copyright 2000 Computing Research Labs, New Mexico State University
+Copyright 2001-2002, 2011 Francesco Zappa Nardelli
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
+OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+Credits
+*******
+
+This driver is based on excellent Mark Leisher's bdf library.  If you
+find something good in this driver you should probably thank him, not
+me.
diff --git a/src/bdf/bdf.c b/src/bdf/bdf.c
new file mode 100644 (file)
index 0000000..f95fb76
--- /dev/null
@@ -0,0 +1,34 @@
+/*  bdf.c
+
+    FreeType font driver for bdf files
+
+    Copyright (C) 2001, 2002 by
+    Francesco Zappa Nardelli
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include <ft2build.h>
+#include "bdflib.c"
+#include "bdfdrivr.c"
+
+
+/* END */
diff --git a/src/bdf/bdf.h b/src/bdf/bdf.h
new file mode 100644 (file)
index 0000000..d11be6f
--- /dev/null
@@ -0,0 +1,297 @@
+/*
+ * Copyright 2000 Computing Research Labs, New Mexico State University
+ * Copyright 2001-2004, 2011 Francesco Zappa Nardelli
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
+ * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+#ifndef __BDF_H__
+#define __BDF_H__
+
+
+/*
+ * Based on bdf.h,v 1.16 2000/03/16 20:08:51 mleisher
+ */
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_STREAM_H
+
+
+FT_BEGIN_HEADER
+
+
+/* Imported from bdfP.h */
+
+#define _bdf_glyph_modified( map, e )                 \
+          ( (map)[(e) >> 5] & ( 1 << ( (e) & 31 ) ) )
+#define _bdf_set_glyph_modified( map, e )              \
+          ( (map)[(e) >> 5] |= ( 1 << ( (e) & 31 ) ) )
+#define _bdf_clear_glyph_modified( map, e )             \
+          ( (map)[(e) >> 5] &= ~( 1 << ( (e) & 31 ) ) )
+
+/* end of bdfP.h */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* BDF font options macros and types.                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#define BDF_CORRECT_METRICS  0x01 /* Correct invalid metrics when loading. */
+#define BDF_KEEP_COMMENTS    0x02 /* Preserve the font comments.           */
+#define BDF_KEEP_UNENCODED   0x04 /* Keep the unencoded glyphs.            */
+#define BDF_PROPORTIONAL     0x08 /* Font has proportional spacing.        */
+#define BDF_MONOWIDTH        0x10 /* Font has mono width.                  */
+#define BDF_CHARCELL         0x20 /* Font has charcell spacing.            */
+
+#define BDF_ALL_SPACING  ( BDF_PROPORTIONAL | \
+                           BDF_MONOWIDTH    | \
+                           BDF_CHARCELL     )
+
+#define BDF_DEFAULT_LOAD_OPTIONS  ( BDF_CORRECT_METRICS | \
+                                    BDF_KEEP_COMMENTS   | \
+                                    BDF_KEEP_UNENCODED  | \
+                                    BDF_PROPORTIONAL    )
+
+
+  typedef struct  bdf_options_t_
+  {
+    int            correct_metrics;
+    int            keep_unencoded;
+    int            keep_comments;
+    int            font_spacing;
+
+  } bdf_options_t;
+
+
+  /* Callback function type for unknown configuration options. */
+  typedef int
+  (*bdf_options_callback_t)( bdf_options_t*  opts,
+                             char**          params,
+                             unsigned long   nparams,
+                             void*           client_data );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* BDF font property macros and types.                                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#define BDF_ATOM      1
+#define BDF_INTEGER   2
+#define BDF_CARDINAL  3
+
+
+  /* This structure represents a particular property of a font. */
+  /* There are a set of defaults and each font has their own.   */
+  typedef struct  bdf_property_t_
+  {
+    char*  name;         /* Name of the property.   */
+    int    format;       /* Format of the property. */
+    int    builtin;      /* A builtin property.     */
+    union
+    {
+      char*          atom;
+      long           l;
+      unsigned long  ul;
+
+    } value;             /* Value of the property.  */
+
+  } bdf_property_t;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* BDF font metric and glyph types.                                      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  typedef struct  bdf_bbx_t_
+  {
+    unsigned short  width;
+    unsigned short  height;
+
+    short           x_offset;
+    short           y_offset;
+
+    short           ascent;
+    short           descent;
+
+  } bdf_bbx_t;
+
+
+  typedef struct  bdf_glyph_t_
+  {
+    char*           name;        /* Glyph name.                          */
+    long            encoding;    /* Glyph encoding.                      */
+    unsigned short  swidth;      /* Scalable width.                      */
+    unsigned short  dwidth;      /* Device width.                        */
+    bdf_bbx_t       bbx;         /* Glyph bounding box.                  */
+    unsigned char*  bitmap;      /* Glyph bitmap.                        */
+    unsigned long   bpr;         /* Number of bytes used per row.        */
+    unsigned short  bytes;       /* Number of bytes used for the bitmap. */
+
+  } bdf_glyph_t;
+
+
+  typedef struct  _hashnode_
+  {
+    const char*  key;
+    size_t       data;
+
+  } _hashnode, *hashnode;
+
+
+  typedef struct  hashtable_
+  {
+    int        limit;
+    int        size;
+    int        used;
+    hashnode*  table;
+
+  } hashtable;
+
+
+  typedef struct  bdf_glyphlist_t_
+  {
+    unsigned short  pad;          /* Pad to 4-byte boundary.              */
+    unsigned short  bpp;          /* Bits per pixel.                      */
+    long            start;        /* Beginning encoding value of glyphs.  */
+    long            end;          /* Ending encoding value of glyphs.     */
+    bdf_glyph_t*    glyphs;       /* Glyphs themselves.                   */
+    unsigned long   glyphs_size;  /* Glyph structures allocated.          */
+    unsigned long   glyphs_used;  /* Glyph structures used.               */
+    bdf_bbx_t       bbx;          /* Overall bounding box of glyphs.      */
+
+  } bdf_glyphlist_t;
+
+
+  typedef struct  bdf_font_t_
+  {
+    char*            name;           /* Name of the font.                   */
+    bdf_bbx_t        bbx;            /* Font bounding box.                  */
+
+    long             point_size;     /* Point size of the font.             */
+    unsigned long    resolution_x;   /* Font horizontal resolution.         */
+    unsigned long    resolution_y;   /* Font vertical resolution.           */
+
+    int              spacing;        /* Font spacing value.                 */
+
+    unsigned short   monowidth;      /* Logical width for monowidth font.   */
+
+    long             default_char;   /* Encoding of the default glyph.      */
+
+    long             font_ascent;    /* Font ascent.                        */
+    long             font_descent;   /* Font descent.                       */
+
+    unsigned long    glyphs_size;    /* Glyph structures allocated.         */
+    unsigned long    glyphs_used;    /* Glyph structures used.              */
+    bdf_glyph_t*     glyphs;         /* Glyphs themselves.                  */
+
+    unsigned long    unencoded_size; /* Unencoded glyph struct. allocated.  */
+    unsigned long    unencoded_used; /* Unencoded glyph struct. used.       */
+    bdf_glyph_t*     unencoded;      /* Unencoded glyphs themselves.        */
+
+    unsigned long    props_size;     /* Font properties allocated.          */
+    unsigned long    props_used;     /* Font properties used.               */
+    bdf_property_t*  props;          /* Font properties themselves.         */
+
+    char*            comments;       /* Font comments.                      */
+    unsigned long    comments_len;   /* Length of comment string.           */
+
+    bdf_glyphlist_t  overflow;       /* Storage used for glyph insertion.   */
+
+    void*            internal;       /* Internal data for the font.         */
+
+    /* The size of the next two arrays must be in sync with the */
+    /* size of the `have' array in the `bdf_parse_t' structure. */
+    unsigned long    nmod[34816];    /* Bitmap indicating modified glyphs.  */
+    unsigned long    umod[34816];    /* Bitmap indicating modified          */
+                                     /* unencoded glyphs.                   */
+    unsigned short   modified;       /* Boolean indicating font modified.   */
+    unsigned short   bpp;            /* Bits per pixel.                     */
+
+    FT_Memory        memory;
+
+    bdf_property_t*  user_props;
+    unsigned long    nuser_props;
+    hashtable        proptbl;
+
+  } bdf_font_t;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Types for load/save callbacks.                                        */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* Error codes. */
+#define BDF_MISSING_START       -1
+#define BDF_MISSING_FONTNAME    -2
+#define BDF_MISSING_SIZE        -3
+#define BDF_MISSING_CHARS       -4
+#define BDF_MISSING_STARTCHAR   -5
+#define BDF_MISSING_ENCODING    -6
+#define BDF_MISSING_BBX         -7
+
+#define BDF_OUT_OF_MEMORY      -20
+
+#define BDF_INVALID_LINE      -100
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* BDF font API.                                                         */
+  /*                                                                       */
+  /*************************************************************************/
+
+  FT_LOCAL( FT_Error )
+  bdf_load_font( FT_Stream       stream,
+                 FT_Memory       memory,
+                 bdf_options_t*  opts,
+                 bdf_font_t*    *font );
+
+  FT_LOCAL( void )
+  bdf_free_font( bdf_font_t*  font );
+
+  FT_LOCAL( bdf_property_t * )
+  bdf_get_property( char*        name,
+                    bdf_font_t*  font );
+
+  FT_LOCAL( bdf_property_t * )
+  bdf_get_font_property( bdf_font_t*  font,
+                         const char*  name );
+
+
+FT_END_HEADER
+
+
+#endif /* __BDF_H__ */
+
+
+/* END */
diff --git a/src/bdf/bdfdrivr.c b/src/bdf/bdfdrivr.c
new file mode 100644 (file)
index 0000000..0edcc77
--- /dev/null
@@ -0,0 +1,882 @@
+/*  bdfdrivr.c
+
+    FreeType font driver for bdf files
+
+    Copyright (C) 2001-2008, 2011 by
+    Francesco Zappa Nardelli
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+#include <ft2build.h>
+
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_BDF_H
+#include FT_TRUETYPE_IDS_H
+
+#include FT_SERVICE_BDF_H
+#include FT_SERVICE_XFREE86_NAME_H
+
+#include "bdf.h"
+#include "bdfdrivr.h"
+
+#include "bdferror.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_bdfdriver
+
+
+  typedef struct  BDF_CMapRec_
+  {
+    FT_CMapRec        cmap;
+    FT_ULong          num_encodings; /* ftobjs.h: FT_CMap->clazz->size */
+    BDF_encoding_el*  encodings;
+
+  } BDF_CMapRec, *BDF_CMap;
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  bdf_cmap_init( FT_CMap     bdfcmap,
+                 FT_Pointer  init_data )
+  {
+    BDF_CMap  cmap = (BDF_CMap)bdfcmap;
+    BDF_Face  face = (BDF_Face)FT_CMAP_FACE( cmap );
+    FT_UNUSED( init_data );
+
+
+    cmap->num_encodings = face->bdffont->glyphs_used;
+    cmap->encodings     = face->en_table;
+
+    return BDF_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  bdf_cmap_done( FT_CMap  bdfcmap )
+  {
+    BDF_CMap  cmap = (BDF_CMap)bdfcmap;
+
+
+    cmap->encodings     = NULL;
+    cmap->num_encodings = 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  bdf_cmap_char_index( FT_CMap    bdfcmap,
+                       FT_UInt32  charcode )
+  {
+    BDF_CMap          cmap      = (BDF_CMap)bdfcmap;
+    BDF_encoding_el*  encodings = cmap->encodings;
+    FT_ULong          min, max, mid; /* num_encodings */
+    FT_UShort         result    = 0; /* encodings->glyph */
+
+
+    min = 0;
+    max = cmap->num_encodings;
+
+    while ( min < max )
+    {
+      FT_ULong  code;
+
+
+      mid  = ( min + max ) >> 1;
+      code = encodings[mid].enc;
+
+      if ( charcode == code )
+      {
+        /* increase glyph index by 1 --              */
+        /* we reserve slot 0 for the undefined glyph */
+        result = encodings[mid].glyph + 1;
+        break;
+      }
+
+      if ( charcode < code )
+        max = mid;
+      else
+        min = mid + 1;
+    }
+
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  bdf_cmap_char_next( FT_CMap     bdfcmap,
+                      FT_UInt32  *acharcode )
+  {
+    BDF_CMap          cmap      = (BDF_CMap)bdfcmap;
+    BDF_encoding_el*  encodings = cmap->encodings;
+    FT_ULong          min, max, mid; /* num_encodings */
+    FT_UShort         result   = 0;  /* encodings->glyph */
+    FT_ULong          charcode = *acharcode + 1;
+
+
+    min = 0;
+    max = cmap->num_encodings;
+
+    while ( min < max )
+    {
+      FT_ULong  code; /* same as BDF_encoding_el.enc */
+
+
+      mid  = ( min + max ) >> 1;
+      code = encodings[mid].enc;
+
+      if ( charcode == code )
+      {
+        /* increase glyph index by 1 --              */
+        /* we reserve slot 0 for the undefined glyph */
+        result = encodings[mid].glyph + 1;
+        goto Exit;
+      }
+
+      if ( charcode < code )
+        max = mid;
+      else
+        min = mid + 1;
+    }
+
+    charcode = 0;
+    if ( min < cmap->num_encodings )
+    {
+      charcode = encodings[min].enc;
+      result   = encodings[min].glyph + 1;
+    }
+
+  Exit:
+    if ( charcode > 0xFFFFFFFFUL )
+    {
+      FT_TRACE1(( "bdf_cmap_char_next: charcode 0x%x > 32bit API" ));
+      *acharcode = 0;
+      /* XXX: result should be changed to indicate an overflow error */
+    }
+    else
+      *acharcode = (FT_UInt32)charcode;
+    return result;
+  }
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FT_CMap_ClassRec  bdf_cmap_class =
+  {
+    sizeof ( BDF_CMapRec ),
+    bdf_cmap_init,
+    bdf_cmap_done,
+    bdf_cmap_char_index,
+    bdf_cmap_char_next,
+
+    NULL, NULL, NULL, NULL, NULL
+  };
+
+
+  static FT_Error
+  bdf_interpret_style( BDF_Face  bdf )
+  {
+    FT_Error         error  = BDF_Err_Ok;
+    FT_Face          face   = FT_FACE( bdf );
+    FT_Memory        memory = face->memory;
+    bdf_font_t*      font   = bdf->bdffont;
+    bdf_property_t*  prop;
+
+    char*   strings[4] = { NULL, NULL, NULL, NULL };
+    size_t  nn, len, lengths[4];
+
+
+    face->style_flags = 0;
+
+    prop = bdf_get_font_property( font, (char *)"SLANT" );
+    if ( prop && prop->format == BDF_ATOM                             &&
+         prop->value.atom                                             &&
+         ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' ||
+           *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) )
+    {
+      face->style_flags |= FT_STYLE_FLAG_ITALIC;
+      strings[2] = ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' )
+                   ? (char *)"Oblique"
+                   : (char *)"Italic";
+    }
+
+    prop = bdf_get_font_property( font, (char *)"WEIGHT_NAME" );
+    if ( prop && prop->format == BDF_ATOM                             &&
+         prop->value.atom                                             &&
+         ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) )
+    {
+      face->style_flags |= FT_STYLE_FLAG_BOLD;
+      strings[1] = (char *)"Bold";
+    }
+
+    prop = bdf_get_font_property( font, (char *)"SETWIDTH_NAME" );
+    if ( prop && prop->format == BDF_ATOM                              &&
+         prop->value.atom && *(prop->value.atom)                       &&
+         !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) )
+      strings[3] = (char *)(prop->value.atom);
+
+    prop = bdf_get_font_property( font, (char *)"ADD_STYLE_NAME" );
+    if ( prop && prop->format == BDF_ATOM                              &&
+         prop->value.atom && *(prop->value.atom)                       &&
+         !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) )
+      strings[0] = (char *)(prop->value.atom);
+
+    len = 0;
+
+    for ( len = 0, nn = 0; nn < 4; nn++ )
+    {
+      lengths[nn] = 0;
+      if ( strings[nn] )
+      {
+        lengths[nn] = ft_strlen( strings[nn] );
+        len        += lengths[nn] + 1;
+      }
+    }
+
+    if ( len == 0 )
+    {
+      strings[0] = (char *)"Regular";
+      lengths[0] = ft_strlen( strings[0] );
+      len        = lengths[0] + 1;
+    }
+
+    {
+      char*  s;
+
+
+      if ( FT_ALLOC( face->style_name, len ) )
+        return error;
+
+      s = face->style_name;
+
+      for ( nn = 0; nn < 4; nn++ )
+      {
+        char*  src = strings[nn];
+
+
+        len = lengths[nn];
+
+        if ( src == NULL )
+          continue;
+
+        /* separate elements with a space */
+        if ( s != face->style_name )
+          *s++ = ' ';
+
+        ft_memcpy( s, src, len );
+
+        /* need to convert spaces to dashes for */
+        /* add_style_name and setwidth_name     */
+        if ( nn == 0 || nn == 3 )
+        {
+          size_t  mm;
+
+
+          for ( mm = 0; mm < len; mm++ )
+            if ( s[mm] == ' ' )
+              s[mm] = '-';
+        }
+
+        s += len;
+      }
+      *s = 0;
+    }
+
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  BDF_Face_Done( FT_Face  bdfface )         /* BDF_Face */
+  {
+    BDF_Face   face = (BDF_Face)bdfface;
+    FT_Memory  memory;
+
+
+    if ( !face )
+      return;
+
+    memory = FT_FACE_MEMORY( face );
+
+    bdf_free_font( face->bdffont );
+
+    FT_FREE( face->en_table );
+
+    FT_FREE( face->charset_encoding );
+    FT_FREE( face->charset_registry );
+    FT_FREE( bdfface->family_name );
+    FT_FREE( bdfface->style_name );
+
+    FT_FREE( bdfface->available_sizes );
+
+    FT_FREE( face->bdffont );
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  BDF_Face_Init( FT_Stream      stream,
+                 FT_Face        bdfface,        /* BDF_Face */
+                 FT_Int         face_index,
+                 FT_Int         num_params,
+                 FT_Parameter*  params )
+  {
+    FT_Error       error  = BDF_Err_Ok;
+    BDF_Face       face   = (BDF_Face)bdfface;
+    FT_Memory      memory = FT_FACE_MEMORY( face );
+
+    bdf_font_t*    font = NULL;
+    bdf_options_t  options;
+
+    FT_UNUSED( num_params );
+    FT_UNUSED( params );
+    FT_UNUSED( face_index );
+
+
+    FT_TRACE2(( "BDF driver\n" ));
+
+    if ( FT_STREAM_SEEK( 0 ) )
+      goto Exit;
+
+    options.correct_metrics = 1;   /* FZ XXX: options semantics */
+    options.keep_unencoded  = 1;
+    options.keep_comments   = 0;
+    options.font_spacing    = BDF_PROPORTIONAL;
+
+    error = bdf_load_font( stream, memory, &options, &font );
+    if ( error == BDF_Err_Missing_Startfont_Field )
+    {
+      FT_TRACE2(( "  not a BDF file\n" ));
+      goto Fail;
+    }
+    else if ( error )
+      goto Exit;
+
+    /* we have a bdf font: let's construct the face object */
+    face->bdffont = font;
+    {
+      bdf_property_t*  prop = NULL;
+
+
+      FT_TRACE4(( "  number of glyphs: allocated %d (used %d)\n",
+                  font->glyphs_size,
+                  font->glyphs_used ));
+      FT_TRACE4(( "  number of unencoded glyphs: allocated %d (used %d)\n",
+                  font->unencoded_size,
+                  font->unencoded_used ));
+
+      bdfface->num_faces  = 1;
+      bdfface->face_index = 0;
+      bdfface->face_flags = FT_FACE_FLAG_FIXED_SIZES |
+                            FT_FACE_FLAG_HORIZONTAL  |
+                            FT_FACE_FLAG_FAST_GLYPHS;
+
+      prop = bdf_get_font_property( font, "SPACING" );
+      if ( prop && prop->format == BDF_ATOM                             &&
+           prop->value.atom                                             &&
+           ( *(prop->value.atom) == 'M' || *(prop->value.atom) == 'm' ||
+             *(prop->value.atom) == 'C' || *(prop->value.atom) == 'c' ) )
+        bdfface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+      /* FZ XXX: TO DO: FT_FACE_FLAGS_VERTICAL   */
+      /* FZ XXX: I need a font to implement this */
+
+      prop = bdf_get_font_property( font, "FAMILY_NAME" );
+      if ( prop && prop->value.atom )
+      {
+        if ( FT_STRDUP( bdfface->family_name, prop->value.atom ) )
+          goto Exit;
+      }
+      else
+        bdfface->family_name = 0;
+
+      if ( ( error = bdf_interpret_style( face ) ) != 0 )
+        goto Exit;
+
+      /* the number of glyphs (with one slot for the undefined glyph */
+      /* at position 0 and all unencoded glyphs)                     */
+      bdfface->num_glyphs = font->glyphs_size + 1;
+
+      bdfface->num_fixed_sizes = 1;
+      if ( FT_NEW_ARRAY( bdfface->available_sizes, 1 ) )
+        goto Exit;
+
+      {
+        FT_Bitmap_Size*  bsize = bdfface->available_sizes;
+        FT_Short         resolution_x = 0, resolution_y = 0;
+
+
+        FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) );
+
+        bsize->height = (FT_Short)( font->font_ascent + font->font_descent );
+
+        prop = bdf_get_font_property( font, "AVERAGE_WIDTH" );
+        if ( prop )
+          bsize->width = (FT_Short)( ( prop->value.l + 5 ) / 10 );
+        else
+          bsize->width = (FT_Short)( bsize->height * 2/3 );
+
+        prop = bdf_get_font_property( font, "POINT_SIZE" );
+        if ( prop )
+          /* convert from 722.7 decipoints to 72 points per inch */
+          bsize->size =
+            (FT_Pos)( ( prop->value.l * 64 * 7200 + 36135L ) / 72270L );
+        else
+          bsize->size = bsize->width << 6;
+
+        prop = bdf_get_font_property( font, "PIXEL_SIZE" );
+        if ( prop )
+          bsize->y_ppem = (FT_Short)prop->value.l << 6;
+
+        prop = bdf_get_font_property( font, "RESOLUTION_X" );
+        if ( prop )
+          resolution_x = (FT_Short)prop->value.l;
+
+        prop = bdf_get_font_property( font, "RESOLUTION_Y" );
+        if ( prop )
+          resolution_y = (FT_Short)prop->value.l;
+
+        if ( bsize->y_ppem == 0 )
+        {
+          bsize->y_ppem = bsize->size;
+          if ( resolution_y )
+            bsize->y_ppem = bsize->y_ppem * resolution_y / 72;
+        }
+        if ( resolution_x && resolution_y )
+          bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y;
+        else
+          bsize->x_ppem = bsize->y_ppem;
+      }
+
+      /* encoding table */
+      {
+        bdf_glyph_t*   cur = font->glyphs;
+        unsigned long  n;
+
+
+        if ( FT_NEW_ARRAY( face->en_table, font->glyphs_size ) )
+          goto Exit;
+
+        face->default_glyph = 0;
+        for ( n = 0; n < font->glyphs_size; n++ )
+        {
+          (face->en_table[n]).enc = cur[n].encoding;
+          FT_TRACE4(( "  idx %d, val 0x%lX\n", n, cur[n].encoding ));
+          (face->en_table[n]).glyph = (FT_Short)n;
+
+          if ( cur[n].encoding == font->default_char )
+          {
+            if ( n < FT_UINT_MAX )
+              face->default_glyph = (FT_UInt)n;
+            else
+              FT_TRACE1(( "BDF_Face_Init:"
+                          " idx %d is too large for this system\n", n ));
+          }
+        }
+      }
+
+      /* charmaps */
+      {
+        bdf_property_t  *charset_registry = 0, *charset_encoding = 0;
+        FT_Bool          unicode_charmap  = 0;
+
+
+        charset_registry =
+          bdf_get_font_property( font, "CHARSET_REGISTRY" );
+        charset_encoding =
+          bdf_get_font_property( font, "CHARSET_ENCODING" );
+        if ( charset_registry && charset_encoding )
+        {
+          if ( charset_registry->format == BDF_ATOM &&
+               charset_encoding->format == BDF_ATOM &&
+               charset_registry->value.atom         &&
+               charset_encoding->value.atom         )
+          {
+            const char*  s;
+
+
+            if ( FT_STRDUP( face->charset_encoding,
+                            charset_encoding->value.atom ) ||
+                 FT_STRDUP( face->charset_registry,
+                            charset_registry->value.atom ) )
+              goto Exit;
+
+            /* Uh, oh, compare first letters manually to avoid dependency */
+            /* on locales.                                                */
+            s = face->charset_registry;
+            if ( ( s[0] == 'i' || s[0] == 'I' ) &&
+                 ( s[1] == 's' || s[1] == 'S' ) &&
+                 ( s[2] == 'o' || s[2] == 'O' ) )
+            {
+              s += 3;
+              if ( !ft_strcmp( s, "10646" )                      ||
+                   ( !ft_strcmp( s, "8859" ) &&
+                     !ft_strcmp( face->charset_encoding, "1" ) ) )
+              unicode_charmap = 1;
+            }
+
+            {
+              FT_CharMapRec  charmap;
+
+
+              charmap.face        = FT_FACE( face );
+              charmap.encoding    = FT_ENCODING_NONE;
+              /* initial platform/encoding should indicate unset status? */
+              charmap.platform_id = TT_PLATFORM_APPLE_UNICODE;
+              charmap.encoding_id = TT_APPLE_ID_DEFAULT;
+
+              if ( unicode_charmap )
+              {
+                charmap.encoding    = FT_ENCODING_UNICODE;
+                charmap.platform_id = TT_PLATFORM_MICROSOFT;
+                charmap.encoding_id = TT_MS_ID_UNICODE_CS;
+              }
+
+              error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL );
+
+#if 0
+              /* Select default charmap */
+              if ( bdfface->num_charmaps )
+                bdfface->charmap = bdfface->charmaps[0];
+#endif
+            }
+
+            goto Exit;
+          }
+        }
+
+        /* otherwise assume Adobe standard encoding */
+
+        {
+          FT_CharMapRec  charmap;
+
+
+          charmap.face        = FT_FACE( face );
+          charmap.encoding    = FT_ENCODING_ADOBE_STANDARD;
+          charmap.platform_id = TT_PLATFORM_ADOBE;
+          charmap.encoding_id = TT_ADOBE_ID_STANDARD;
+
+          error = FT_CMap_New( &bdf_cmap_class, NULL, &charmap, NULL );
+
+          /* Select default charmap */
+          if ( bdfface->num_charmaps )
+            bdfface->charmap = bdfface->charmaps[0];
+        }
+      }
+    }
+
+  Exit:
+    return error;
+
+  Fail:
+    BDF_Face_Done( bdfface );
+    return BDF_Err_Unknown_File_Format;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  BDF_Size_Select( FT_Size   size,
+                   FT_ULong  strike_index )
+  {
+    bdf_font_t*  bdffont = ( (BDF_Face)size->face )->bdffont;
+
+
+    FT_Select_Metrics( size->face, strike_index );
+
+    size->metrics.ascender    = bdffont->font_ascent << 6;
+    size->metrics.descender   = -bdffont->font_descent << 6;
+    size->metrics.max_advance = bdffont->bbx.width << 6;
+
+    return BDF_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  BDF_Size_Request( FT_Size          size,
+                    FT_Size_Request  req )
+  {
+    FT_Face          face    = size->face;
+    FT_Bitmap_Size*  bsize   = face->available_sizes;
+    bdf_font_t*      bdffont = ( (BDF_Face)face )->bdffont;
+    FT_Error         error   = BDF_Err_Invalid_Pixel_Size;
+    FT_Long          height;
+
+
+    height = FT_REQUEST_HEIGHT( req );
+    height = ( height + 32 ) >> 6;
+
+    switch ( req->type )
+    {
+    case FT_SIZE_REQUEST_TYPE_NOMINAL:
+      if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) )
+        error = BDF_Err_Ok;
+      break;
+
+    case FT_SIZE_REQUEST_TYPE_REAL_DIM:
+      if ( height == ( bdffont->font_ascent +
+                       bdffont->font_descent ) )
+        error = BDF_Err_Ok;
+      break;
+
+    default:
+      error = BDF_Err_Unimplemented_Feature;
+      break;
+    }
+
+    if ( error )
+      return error;
+    else
+      return BDF_Size_Select( size, 0 );
+  }
+
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  BDF_Glyph_Load( FT_GlyphSlot  slot,
+                  FT_Size       size,
+                  FT_UInt       glyph_index,
+                  FT_Int32      load_flags )
+  {
+    BDF_Face     bdf    = (BDF_Face)FT_SIZE_FACE( size );
+    FT_Face      face   = FT_FACE( bdf );
+    FT_Error     error  = BDF_Err_Ok;
+    FT_Bitmap*   bitmap = &slot->bitmap;
+    bdf_glyph_t  glyph;
+    int          bpp    = bdf->bdffont->bpp;
+
+    FT_UNUSED( load_flags );
+
+
+    if ( !face || glyph_index >= (FT_UInt)face->num_glyphs )
+    {
+      error = BDF_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    /* index 0 is the undefined glyph */
+    if ( glyph_index == 0 )
+      glyph_index = bdf->default_glyph;
+    else
+      glyph_index--;
+
+    /* slot, bitmap => freetype, glyph => bdflib */
+    glyph = bdf->bdffont->glyphs[glyph_index];
+
+    bitmap->rows  = glyph.bbx.height;
+    bitmap->width = glyph.bbx.width;
+    if ( glyph.bpr > INT_MAX )
+      FT_TRACE1(( "BDF_Glyph_Load: too large pitch %d is truncated\n",
+                   glyph.bpr ));
+    bitmap->pitch = (int)glyph.bpr; /* same as FT_Bitmap.pitch */
+
+    /* note: we don't allocate a new array to hold the bitmap; */
+    /*       we can simply point to it                         */
+    ft_glyphslot_set_bitmap( slot, glyph.bitmap );
+
+    switch ( bpp )
+    {
+    case 1:
+      bitmap->pixel_mode = FT_PIXEL_MODE_MONO;
+      break;
+    case 2:
+      bitmap->pixel_mode = FT_PIXEL_MODE_GRAY2;
+      break;
+    case 4:
+      bitmap->pixel_mode = FT_PIXEL_MODE_GRAY4;
+      break;
+    case 8:
+      bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
+      bitmap->num_grays  = 256;
+      break;
+    }
+
+    slot->format      = FT_GLYPH_FORMAT_BITMAP;
+    slot->bitmap_left = glyph.bbx.x_offset;
+    slot->bitmap_top  = glyph.bbx.ascent;
+
+    slot->metrics.horiAdvance  = glyph.dwidth << 6;
+    slot->metrics.horiBearingX = glyph.bbx.x_offset << 6;
+    slot->metrics.horiBearingY = glyph.bbx.ascent << 6;
+    slot->metrics.width        = bitmap->width << 6;
+    slot->metrics.height       = bitmap->rows << 6;
+
+    /*
+     * XXX DWIDTH1 and VVECTOR should be parsed and
+     * used here, provided such fonts do exist.
+     */
+    ft_synthesize_vertical_metrics( &slot->metrics,
+                                    bdf->bdffont->bbx.height << 6 );
+
+  Exit:
+    return error;
+  }
+
+
+ /*
+  *
+  *  BDF SERVICE
+  *
+  */
+
+  static FT_Error
+  bdf_get_bdf_property( BDF_Face          face,
+                        const char*       prop_name,
+                        BDF_PropertyRec  *aproperty )
+  {
+    bdf_property_t*  prop;
+
+
+    FT_ASSERT( face && face->bdffont );
+
+    prop = bdf_get_font_property( face->bdffont, prop_name );
+    if ( prop )
+    {
+      switch ( prop->format )
+      {
+      case BDF_ATOM:
+        aproperty->type   = BDF_PROPERTY_TYPE_ATOM;
+        aproperty->u.atom = prop->value.atom;
+        break;
+
+      case BDF_INTEGER:
+        if ( prop->value.l > 0x7FFFFFFFL || prop->value.l < ( -1 - 0x7FFFFFFFL ) )
+        {
+          FT_TRACE1(( "bdf_get_bdf_property:"
+                      " too large integer 0x%x is truncated\n" ));
+        }
+        aproperty->type      = BDF_PROPERTY_TYPE_INTEGER;
+        aproperty->u.integer = (FT_Int32)prop->value.l;
+        break;
+
+      case BDF_CARDINAL:
+        if ( prop->value.ul > 0xFFFFFFFFUL )
+        {
+          FT_TRACE1(( "bdf_get_bdf_property:"
+                      " too large cardinal 0x%x is truncated\n" ));
+        }
+        aproperty->type       = BDF_PROPERTY_TYPE_CARDINAL;
+        aproperty->u.cardinal = (FT_UInt32)prop->value.ul;
+        break;
+
+      default:
+        goto Fail;
+      }
+      return 0;
+    }
+
+  Fail:
+    return BDF_Err_Invalid_Argument;
+  }
+
+
+  static FT_Error
+  bdf_get_charset_id( BDF_Face      face,
+                      const char*  *acharset_encoding,
+                      const char*  *acharset_registry )
+  {
+    *acharset_encoding = face->charset_encoding;
+    *acharset_registry = face->charset_registry;
+
+    return 0;
+  }
+
+
+  static const FT_Service_BDFRec  bdf_service_bdf =
+  {
+    (FT_BDF_GetCharsetIdFunc)bdf_get_charset_id,
+    (FT_BDF_GetPropertyFunc) bdf_get_bdf_property
+  };
+
+
+ /*
+  *
+  *  SERVICES LIST
+  *
+  */
+
+  static const FT_ServiceDescRec  bdf_services[] =
+  {
+    { FT_SERVICE_ID_BDF,       &bdf_service_bdf },
+    { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_BDF },
+    { NULL, NULL }
+  };
+
+
+  FT_CALLBACK_DEF( FT_Module_Interface )
+  bdf_driver_requester( FT_Module    module,
+                        const char*  name )
+  {
+    FT_UNUSED( module );
+
+    return ft_service_list_lookup( bdf_services, name );
+  }
+
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FT_Driver_ClassRec  bdf_driver_class =
+  {
+    {
+      FT_MODULE_FONT_DRIVER         |
+      FT_MODULE_DRIVER_NO_OUTLINES,
+      sizeof ( FT_DriverRec ),
+
+      "bdf",
+      0x10000L,
+      0x20000L,
+
+      0,
+
+      0,                        /* FT_Module_Constructor */
+      0,                        /* FT_Module_Destructor  */
+      bdf_driver_requester
+    },
+
+    sizeof ( BDF_FaceRec ),
+    sizeof ( FT_SizeRec ),
+    sizeof ( FT_GlyphSlotRec ),
+
+    BDF_Face_Init,
+    BDF_Face_Done,
+    0,                          /* FT_Size_InitFunc */
+    0,                          /* FT_Size_DoneFunc */
+    0,                          /* FT_Slot_InitFunc */
+    0,                          /* FT_Slot_DoneFunc */
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+    ft_stub_set_char_sizes,
+    ft_stub_set_pixel_sizes,
+#endif
+    BDF_Glyph_Load,
+
+    0,                          /* FT_Face_GetKerningFunc  */
+    0,                          /* FT_Face_AttachFunc      */
+    0,                          /* FT_Face_GetAdvancesFunc */
+
+    BDF_Size_Request,
+    BDF_Size_Select
+  };
+
+
+/* END */
diff --git a/src/bdf/bdfdrivr.h b/src/bdf/bdfdrivr.h
new file mode 100644 (file)
index 0000000..ca0dae5
--- /dev/null
@@ -0,0 +1,80 @@
+/*  bdfdrivr.h
+
+    FreeType font driver for bdf fonts
+
+  Copyright (C) 2001, 2002, 2003, 2004 by
+  Francesco Zappa Nardelli
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+
+#ifndef __BDFDRIVR_H__
+#define __BDFDRIVR_H__
+
+#include <ft2build.h>
+#include FT_INTERNAL_DRIVER_H
+
+#include "bdf.h"
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+
+  typedef struct  BDF_encoding_el_
+  {
+    FT_ULong   enc;
+    FT_UShort  glyph;
+
+  } BDF_encoding_el;
+
+
+  typedef struct  BDF_FaceRec_
+  {
+    FT_FaceRec        root;
+
+    char*             charset_encoding;
+    char*             charset_registry;
+
+    bdf_font_t*       bdffont;
+
+    BDF_encoding_el*  en_table;
+
+    FT_CharMap        charmap_handle;
+    FT_CharMapRec     charmap;  /* a single charmap per face */
+
+    FT_UInt           default_glyph;
+
+  } BDF_FaceRec, *BDF_Face;
+
+
+  FT_EXPORT_VAR( const FT_Driver_ClassRec )  bdf_driver_class;
+
+
+FT_END_HEADER
+
+
+#endif /* __BDFDRIVR_H__ */
+
+
+/* END */
diff --git a/src/bdf/bdferror.h b/src/bdf/bdferror.h
new file mode 100644 (file)
index 0000000..ea545ac
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2001, 2002, 2012 Francesco Zappa Nardelli
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
+ * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the BDF error enumeration constants.      */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __BDFERROR_H__
+#define __BDFERROR_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  BDF_Err_
+#define FT_ERR_BASE    FT_Mod_Err_BDF
+
+#include FT_ERRORS_H
+
+#endif /* __BDFERROR_H__ */
+
+
+/* END */
diff --git a/src/bdf/bdflib.c b/src/bdf/bdflib.c
new file mode 100644 (file)
index 0000000..b7b6857
--- /dev/null
@@ -0,0 +1,2613 @@
+/*
+ * Copyright 2000 Computing Research Labs, New Mexico State University
+ * Copyright 2001-2012
+ *   Francesco Zappa Nardelli
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
+ * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  This file is based on bdf.c,v 1.22 2000/03/16 20:08:50               */
+  /*                                                                       */
+  /*  taken from Mark Leisher's xmbdfed package                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include <ft2build.h>
+
+#include FT_FREETYPE_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_OBJECTS_H
+
+#include "bdf.h"
+#include "bdferror.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_bdflib
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Default BDF font options.                                             */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static const bdf_options_t  _bdf_opts =
+  {
+    1,                /* Correct metrics.               */
+    1,                /* Preserve unencoded glyphs.     */
+    0,                /* Preserve comments.             */
+    BDF_PROPORTIONAL  /* Default spacing.               */
+  };
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Builtin BDF font properties.                                          */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /* List of most properties that might appear in a font.  Doesn't include */
+  /* the RAW_* and AXIS_* properties in X11R6 polymorphic fonts.           */
+
+  static const bdf_property_t  _bdf_properties[] =
+  {
+    { (char *)"ADD_STYLE_NAME",          BDF_ATOM,     1, { 0 } },
+    { (char *)"AVERAGE_WIDTH",           BDF_INTEGER,  1, { 0 } },
+    { (char *)"AVG_CAPITAL_WIDTH",       BDF_INTEGER,  1, { 0 } },
+    { (char *)"AVG_LOWERCASE_WIDTH",     BDF_INTEGER,  1, { 0 } },
+    { (char *)"CAP_HEIGHT",              BDF_INTEGER,  1, { 0 } },
+    { (char *)"CHARSET_COLLECTIONS",     BDF_ATOM,     1, { 0 } },
+    { (char *)"CHARSET_ENCODING",        BDF_ATOM,     1, { 0 } },
+    { (char *)"CHARSET_REGISTRY",        BDF_ATOM,     1, { 0 } },
+    { (char *)"COMMENT",                 BDF_ATOM,     1, { 0 } },
+    { (char *)"COPYRIGHT",               BDF_ATOM,     1, { 0 } },
+    { (char *)"DEFAULT_CHAR",            BDF_CARDINAL, 1, { 0 } },
+    { (char *)"DESTINATION",             BDF_CARDINAL, 1, { 0 } },
+    { (char *)"DEVICE_FONT_NAME",        BDF_ATOM,     1, { 0 } },
+    { (char *)"END_SPACE",               BDF_INTEGER,  1, { 0 } },
+    { (char *)"FACE_NAME",               BDF_ATOM,     1, { 0 } },
+    { (char *)"FAMILY_NAME",             BDF_ATOM,     1, { 0 } },
+    { (char *)"FIGURE_WIDTH",            BDF_INTEGER,  1, { 0 } },
+    { (char *)"FONT",                    BDF_ATOM,     1, { 0 } },
+    { (char *)"FONTNAME_REGISTRY",       BDF_ATOM,     1, { 0 } },
+    { (char *)"FONT_ASCENT",             BDF_INTEGER,  1, { 0 } },
+    { (char *)"FONT_DESCENT",            BDF_INTEGER,  1, { 0 } },
+    { (char *)"FOUNDRY",                 BDF_ATOM,     1, { 0 } },
+    { (char *)"FULL_NAME",               BDF_ATOM,     1, { 0 } },
+    { (char *)"ITALIC_ANGLE",            BDF_INTEGER,  1, { 0 } },
+    { (char *)"MAX_SPACE",               BDF_INTEGER,  1, { 0 } },
+    { (char *)"MIN_SPACE",               BDF_INTEGER,  1, { 0 } },
+    { (char *)"NORM_SPACE",              BDF_INTEGER,  1, { 0 } },
+    { (char *)"NOTICE",                  BDF_ATOM,     1, { 0 } },
+    { (char *)"PIXEL_SIZE",              BDF_INTEGER,  1, { 0 } },
+    { (char *)"POINT_SIZE",              BDF_INTEGER,  1, { 0 } },
+    { (char *)"QUAD_WIDTH",              BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_ASCENT",              BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_AVERAGE_WIDTH",       BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_AVG_CAPITAL_WIDTH",   BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_AVG_LOWERCASE_WIDTH", BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_CAP_HEIGHT",          BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_DESCENT",             BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_END_SPACE",           BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_FIGURE_WIDTH",        BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_MAX_SPACE",           BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_MIN_SPACE",           BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_NORM_SPACE",          BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_PIXEL_SIZE",          BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_POINT_SIZE",          BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_PIXELSIZE",           BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_POINTSIZE",           BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_QUAD_WIDTH",          BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_SMALL_CAP_SIZE",      BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_STRIKEOUT_ASCENT",    BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_STRIKEOUT_DESCENT",   BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_SUBSCRIPT_SIZE",      BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_SUBSCRIPT_X",         BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_SUBSCRIPT_Y",         BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_SUPERSCRIPT_SIZE",    BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_SUPERSCRIPT_X",       BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_SUPERSCRIPT_Y",       BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_UNDERLINE_POSITION",  BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_UNDERLINE_THICKNESS", BDF_INTEGER,  1, { 0 } },
+    { (char *)"RAW_X_HEIGHT",            BDF_INTEGER,  1, { 0 } },
+    { (char *)"RELATIVE_SETWIDTH",       BDF_CARDINAL, 1, { 0 } },
+    { (char *)"RELATIVE_WEIGHT",         BDF_CARDINAL, 1, { 0 } },
+    { (char *)"RESOLUTION",              BDF_INTEGER,  1, { 0 } },
+    { (char *)"RESOLUTION_X",            BDF_CARDINAL, 1, { 0 } },
+    { (char *)"RESOLUTION_Y",            BDF_CARDINAL, 1, { 0 } },
+    { (char *)"SETWIDTH_NAME",           BDF_ATOM,     1, { 0 } },
+    { (char *)"SLANT",                   BDF_ATOM,     1, { 0 } },
+    { (char *)"SMALL_CAP_SIZE",          BDF_INTEGER,  1, { 0 } },
+    { (char *)"SPACING",                 BDF_ATOM,     1, { 0 } },
+    { (char *)"STRIKEOUT_ASCENT",        BDF_INTEGER,  1, { 0 } },
+    { (char *)"STRIKEOUT_DESCENT",       BDF_INTEGER,  1, { 0 } },
+    { (char *)"SUBSCRIPT_SIZE",          BDF_INTEGER,  1, { 0 } },
+    { (char *)"SUBSCRIPT_X",             BDF_INTEGER,  1, { 0 } },
+    { (char *)"SUBSCRIPT_Y",             BDF_INTEGER,  1, { 0 } },
+    { (char *)"SUPERSCRIPT_SIZE",        BDF_INTEGER,  1, { 0 } },
+    { (char *)"SUPERSCRIPT_X",           BDF_INTEGER,  1, { 0 } },
+    { (char *)"SUPERSCRIPT_Y",           BDF_INTEGER,  1, { 0 } },
+    { (char *)"UNDERLINE_POSITION",      BDF_INTEGER,  1, { 0 } },
+    { (char *)"UNDERLINE_THICKNESS",     BDF_INTEGER,  1, { 0 } },
+    { (char *)"WEIGHT",                  BDF_CARDINAL, 1, { 0 } },
+    { (char *)"WEIGHT_NAME",             BDF_ATOM,     1, { 0 } },
+    { (char *)"X_HEIGHT",                BDF_INTEGER,  1, { 0 } },
+    { (char *)"_MULE_BASELINE_OFFSET",   BDF_INTEGER,  1, { 0 } },
+    { (char *)"_MULE_RELATIVE_COMPOSE",  BDF_INTEGER,  1, { 0 } },
+  };
+
+  static const unsigned long
+  _num_bdf_properties = sizeof ( _bdf_properties ) /
+                        sizeof ( _bdf_properties[0] );
+
+
+  /* Auto correction messages. */
+#define ACMSG1   "FONT_ASCENT property missing.  " \
+                 "Added `FONT_ASCENT %hd'.\n"
+#define ACMSG2   "FONT_DESCENT property missing.  " \
+                 "Added `FONT_DESCENT %hd'.\n"
+#define ACMSG3   "Font width != actual width.  Old: %hd New: %hd.\n"
+#define ACMSG4   "Font left bearing != actual left bearing.  " \
+                 "Old: %hd New: %hd.\n"
+#define ACMSG5   "Font ascent != actual ascent.  Old: %hd New: %hd.\n"
+#define ACMSG6   "Font descent != actual descent.  Old: %hd New: %hd.\n"
+#define ACMSG7   "Font height != actual height. Old: %hd New: %hd.\n"
+#define ACMSG8   "Glyph scalable width (SWIDTH) adjustments made.\n"
+#define ACMSG9   "SWIDTH field missing at line %ld.  Set automatically.\n"
+#define ACMSG10  "DWIDTH field missing at line %ld.  Set to glyph width.\n"
+#define ACMSG11  "SIZE bits per pixel field adjusted to %hd.\n"
+#define ACMSG12  "Duplicate encoding %ld (%s) changed to unencoded.\n"
+#define ACMSG13  "Glyph %ld extra rows removed.\n"
+#define ACMSG14  "Glyph %ld extra columns removed.\n"
+#define ACMSG15  "Incorrect glyph count: %ld indicated but %ld found.\n"
+#define ACMSG16  "Glyph %ld missing columns padded with zero bits.\n"
+
+  /* Error messages. */
+#define ERRMSG1  "[line %ld] Missing `%s' line.\n"
+#define ERRMSG2  "[line %ld] Font header corrupted or missing fields.\n"
+#define ERRMSG3  "[line %ld] Font glyphs corrupted or missing fields.\n"
+#define ERRMSG4  "[line %ld] BBX too big.\n"
+#define ERRMSG5  "[line %ld] `%s' value too big.\n"
+#define ERRMSG6  "[line %ld] Input line too long.\n"
+#define ERRMSG7  "[line %ld] Font name too long.\n"
+#define ERRMSG8  "[line %ld] Invalid `%s' value.\n"
+#define ERRMSG9  "[line %ld] Invalid keyword.\n"
+
+  /* Debug messages. */
+#define DBGMSG1  "  [%6ld] %s" /* no \n */
+#define DBGMSG2  " (0x%lX)\n"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Hash table utilities for the properties.                              */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /* XXX: Replace this with FreeType's hash functions */
+
+
+#define INITIAL_HT_SIZE  241
+
+  typedef void
+  (*hash_free_func)( hashnode  node );
+
+  static hashnode*
+  hash_bucket( const char*  key,
+               hashtable*   ht )
+  {
+    const char*    kp  = key;
+    unsigned long  res = 0;
+    hashnode*      bp  = ht->table, *ndp;
+
+
+    /* Mocklisp hash function. */
+    while ( *kp )
+      res = ( res << 5 ) - res + *kp++;
+
+    ndp = bp + ( res % ht->size );
+    while ( *ndp )
+    {
+      kp = (*ndp)->key;
+      if ( kp[0] == key[0] && ft_strcmp( kp, key ) == 0 )
+        break;
+      ndp--;
+      if ( ndp < bp )
+        ndp = bp + ( ht->size - 1 );
+    }
+
+    return ndp;
+  }
+
+
+  static FT_Error
+  hash_rehash( hashtable*  ht,
+               FT_Memory   memory )
+  {
+    hashnode*  obp = ht->table, *bp, *nbp;
+    int        i, sz = ht->size;
+    FT_Error   error = BDF_Err_Ok;
+
+
+    ht->size <<= 1;
+    ht->limit  = ht->size / 3;
+
+    if ( FT_NEW_ARRAY( ht->table, ht->size ) )
+      goto Exit;
+
+    for ( i = 0, bp = obp; i < sz; i++, bp++ )
+    {
+      if ( *bp )
+      {
+        nbp = hash_bucket( (*bp)->key, ht );
+        *nbp = *bp;
+      }
+    }
+    FT_FREE( obp );
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  hash_init( hashtable*  ht,
+             FT_Memory   memory )
+  {
+    int       sz = INITIAL_HT_SIZE;
+    FT_Error  error = BDF_Err_Ok;
+
+
+    ht->size  = sz;
+    ht->limit = sz / 3;
+    ht->used  = 0;
+
+    if ( FT_NEW_ARRAY( ht->table, sz ) )
+      goto Exit;
+
+  Exit:
+    return error;
+  }
+
+
+  static void
+  hash_free( hashtable*  ht,
+             FT_Memory   memory )
+  {
+    if ( ht != 0 )
+    {
+      int        i, sz = ht->size;
+      hashnode*  bp = ht->table;
+
+
+      for ( i = 0; i < sz; i++, bp++ )
+        FT_FREE( *bp );
+
+      FT_FREE( ht->table );
+    }
+  }
+
+
+  static FT_Error
+  hash_insert( char*       key,
+               size_t      data,
+               hashtable*  ht,
+               FT_Memory   memory )
+  {
+    hashnode  nn, *bp = hash_bucket( key, ht );
+    FT_Error  error = BDF_Err_Ok;
+
+
+    nn = *bp;
+    if ( !nn )
+    {
+      if ( FT_NEW( nn ) )
+        goto Exit;
+      *bp = nn;
+
+      nn->key  = key;
+      nn->data = data;
+
+      if ( ht->used >= ht->limit )
+      {
+        error = hash_rehash( ht, memory );
+        if ( error )
+          goto Exit;
+      }
+      ht->used++;
+    }
+    else
+      nn->data = data;
+
+  Exit:
+    return error;
+  }
+
+
+  static hashnode
+  hash_lookup( const char* key,
+               hashtable*  ht )
+  {
+    hashnode *np = hash_bucket( key, ht );
+
+
+    return *np;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Utility types and functions.                                          */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* Function type for parsing lines of a BDF font. */
+
+  typedef FT_Error
+  (*_bdf_line_func_t)( char*          line,
+                       unsigned long  linelen,
+                       unsigned long  lineno,
+                       void*          call_data,
+                       void*          client_data );
+
+
+  /* List structure for splitting lines into fields. */
+
+  typedef struct  _bdf_list_t_
+  {
+    char**         field;
+    unsigned long  size;
+    unsigned long  used;
+    FT_Memory      memory;
+
+  } _bdf_list_t;
+
+
+  /* Structure used while loading BDF fonts. */
+
+  typedef struct  _bdf_parse_t_
+  {
+    unsigned long   flags;
+    unsigned long   cnt;
+    unsigned long   row;
+
+    short           minlb;
+    short           maxlb;
+    short           maxrb;
+    short           maxas;
+    short           maxds;
+
+    short           rbearing;
+
+    char*           glyph_name;
+    long            glyph_enc;
+
+    bdf_font_t*     font;
+    bdf_options_t*  opts;
+
+    unsigned long   have[34816]; /* must be in sync with `nmod' and `umod' */
+                                 /* arrays from `bdf_font_t' structure     */
+    _bdf_list_t     list;
+
+    FT_Memory       memory;
+
+  } _bdf_parse_t;
+
+
+#define setsbit( m, cc ) \
+          ( m[(FT_Byte)(cc) >> 3] |= (FT_Byte)( 1 << ( (cc) & 7 ) ) )
+#define sbitset( m, cc ) \
+          ( m[(FT_Byte)(cc) >> 3]  & ( 1 << ( (cc) & 7 ) ) )
+
+
+  static void
+  _bdf_list_init( _bdf_list_t*  list,
+                  FT_Memory     memory )
+  {
+    FT_ZERO( list );
+    list->memory = memory;
+  }
+
+
+  static void
+  _bdf_list_done( _bdf_list_t*  list )
+  {
+    FT_Memory  memory = list->memory;
+
+
+    if ( memory )
+    {
+      FT_FREE( list->field );
+      FT_ZERO( list );
+    }
+  }
+
+
+  static FT_Error
+  _bdf_list_ensure( _bdf_list_t*   list,
+                    unsigned long  num_items ) /* same as _bdf_list_t.used */
+  {
+    FT_Error  error = BDF_Err_Ok;
+
+
+    if ( num_items > list->size )
+    {
+      unsigned long  oldsize = list->size; /* same as _bdf_list_t.size */
+      unsigned long  newsize = oldsize + ( oldsize >> 1 ) + 5;
+      unsigned long  bigsize = (unsigned long)( FT_INT_MAX / sizeof ( char* ) );
+      FT_Memory      memory  = list->memory;
+
+
+      if ( oldsize == bigsize )
+      {
+        error = BDF_Err_Out_Of_Memory;
+        goto Exit;
+      }
+      else if ( newsize < oldsize || newsize > bigsize )
+        newsize = bigsize;
+
+      if ( FT_RENEW_ARRAY( list->field, oldsize, newsize ) )
+        goto Exit;
+
+      list->size = newsize;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static void
+  _bdf_list_shift( _bdf_list_t*   list,
+                   unsigned long  n )
+  {
+    unsigned long  i, u;
+
+
+    if ( list == 0 || list->used == 0 || n == 0 )
+      return;
+
+    if ( n >= list->used )
+    {
+      list->used = 0;
+      return;
+    }
+
+    for ( u = n, i = 0; u < list->used; i++, u++ )
+      list->field[i] = list->field[u];
+    list->used -= n;
+  }
+
+
+  /* An empty string for empty fields. */
+
+  static const char  empty[1] = { 0 };      /* XXX eliminate this */
+
+
+  static char *
+  _bdf_list_join( _bdf_list_t*    list,
+                  int             c,
+                  unsigned long  *alen )
+  {
+    unsigned long  i, j;
+    char           *fp, *dp;
+
+
+    *alen = 0;
+
+    if ( list == 0 || list->used == 0 )
+      return 0;
+
+    dp = list->field[0];
+    for ( i = j = 0; i < list->used; i++ )
+    {
+      fp = list->field[i];
+      while ( *fp )
+        dp[j++] = *fp++;
+
+      if ( i + 1 < list->used )
+        dp[j++] = (char)c;
+    }
+    if ( dp != empty )
+      dp[j] = 0;
+
+    *alen = j;
+    return dp;
+  }
+
+
+  /* The code below ensures that we have at least 4 + 1 `field' */
+  /* elements in `list' (which are possibly NULL) so that we    */
+  /* don't have to check the number of fields in most cases.    */
+
+  static FT_Error
+  _bdf_list_split( _bdf_list_t*   list,
+                   char*          separators,
+                   char*          line,
+                   unsigned long  linelen )
+  {
+    int       mult, final_empty;
+    char      *sp, *ep, *end;
+    char      seps[32];
+    FT_Error  error = BDF_Err_Ok;
+
+
+    /* Initialize the list. */
+    list->used = 0;
+    if ( list->size )
+    {
+      list->field[0] = (char*)empty;
+      list->field[1] = (char*)empty;
+      list->field[2] = (char*)empty;
+      list->field[3] = (char*)empty;
+    }
+
+    /* If the line is empty, then simply return. */
+    if ( linelen == 0 || line[0] == 0 )
+      goto Exit;
+
+    /* In the original code, if the `separators' parameter is NULL or */
+    /* empty, the list is split into individual bytes.  We don't need */
+    /* this, so an error is signaled.                                 */
+    if ( separators == 0 || *separators == 0 )
+    {
+      error = BDF_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    /* Prepare the separator bitmap. */
+    FT_MEM_ZERO( seps, 32 );
+
+    /* If the very last character of the separator string is a plus, then */
+    /* set the `mult' flag to indicate that multiple separators should be */
+    /* collapsed into one.                                                */
+    for ( mult = 0, sp = separators; sp && *sp; sp++ )
+    {
+      if ( *sp == '+' && *( sp + 1 ) == 0 )
+        mult = 1;
+      else
+        setsbit( seps, *sp );
+    }
+
+    /* Break the line up into fields. */
+    for ( final_empty = 0, sp = ep = line, end = sp + linelen;
+          sp < end && *sp; )
+    {
+      /* Collect everything that is not a separator. */
+      for ( ; *ep && !sbitset( seps, *ep ); ep++ )
+        ;
+
+      /* Resize the list if necessary. */
+      if ( list->used == list->size )
+      {
+        error = _bdf_list_ensure( list, list->used + 1 );
+        if ( error )
+          goto Exit;
+      }
+
+      /* Assign the field appropriately. */
+      list->field[list->used++] = ( ep > sp ) ? sp : (char*)empty;
+
+      sp = ep;
+
+      if ( mult )
+      {
+        /* If multiple separators should be collapsed, do it now by */
+        /* setting all the separator characters to 0.               */
+        for ( ; *ep && sbitset( seps, *ep ); ep++ )
+          *ep = 0;
+      }
+      else if ( *ep != 0 )
+        /* Don't collapse multiple separators by making them 0, so just */
+        /* make the one encountered 0.                                  */
+        *ep++ = 0;
+
+      final_empty = ( ep > sp && *ep == 0 );
+      sp = ep;
+    }
+
+    /* Finally, NULL-terminate the list. */
+    if ( list->used + final_empty >= list->size )
+    {
+      error = _bdf_list_ensure( list, list->used + final_empty + 1 );
+      if ( error )
+        goto Exit;
+    }
+
+    if ( final_empty )
+      list->field[list->used++] = (char*)empty;
+
+    list->field[list->used] = 0;
+
+  Exit:
+    return error;
+  }
+
+
+#define NO_SKIP  256  /* this value cannot be stored in a 'char' */
+
+
+  static FT_Error
+  _bdf_readstream( FT_Stream         stream,
+                   _bdf_line_func_t  callback,
+                   void*             client_data,
+                   unsigned long    *lno )
+  {
+    _bdf_line_func_t  cb;
+    unsigned long     lineno, buf_size;
+    int               refill, hold, to_skip;
+    ptrdiff_t         bytes, start, end, cursor, avail;
+    char*             buf = 0;
+    FT_Memory         memory = stream->memory;
+    FT_Error          error = BDF_Err_Ok;
+
+
+    if ( callback == 0 )
+    {
+      error = BDF_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    /* initial size and allocation of the input buffer */
+    buf_size = 1024;
+
+    if ( FT_NEW_ARRAY( buf, buf_size ) )
+      goto Exit;
+
+    cb      = callback;
+    lineno  = 1;
+    buf[0]  = 0;
+    start   = 0;
+    end     = 0;
+    avail   = 0;
+    cursor  = 0;
+    refill  = 1;
+    to_skip = NO_SKIP;
+    bytes   = 0;        /* make compiler happy */
+
+    for (;;)
+    {
+      if ( refill )
+      {
+        bytes  = (ptrdiff_t)FT_Stream_TryRead(
+                   stream, (FT_Byte*)buf + cursor,
+                   (FT_ULong)( buf_size - cursor ) );
+        avail  = cursor + bytes;
+        cursor = 0;
+        refill = 0;
+      }
+
+      end = start;
+
+      /* should we skip an optional character like \n or \r? */
+      if ( start < avail && buf[start] == to_skip )
+      {
+        start  += 1;
+        to_skip = NO_SKIP;
+        continue;
+      }
+
+      /* try to find the end of the line */
+      while ( end < avail && buf[end] != '\n' && buf[end] != '\r' )
+        end++;
+
+      /* if we hit the end of the buffer, try shifting its content */
+      /* or even resizing it                                       */
+      if ( end >= avail )
+      {
+        if ( bytes == 0 )  /* last line in file doesn't end in \r or \n */
+          break;           /* ignore it then exit                       */
+
+        if ( start == 0 )
+        {
+          /* this line is definitely too long; try resizing the input */
+          /* buffer a bit to handle it.                               */
+          FT_ULong  new_size;
+
+
+          if ( buf_size >= 65536UL )  /* limit ourselves to 64KByte */
+          {
+            FT_ERROR(( "_bdf_readstream: " ERRMSG6, lineno ));
+            error = BDF_Err_Invalid_Argument;
+            goto Exit;
+          }
+
+          new_size = buf_size * 2;
+          if ( FT_RENEW_ARRAY( buf, buf_size, new_size ) )
+            goto Exit;
+
+          cursor   = buf_size;
+          buf_size = new_size;
+        }
+        else
+        {
+          bytes = avail - start;
+
+          FT_MEM_COPY( buf, buf + start, bytes );
+
+          cursor = bytes;
+          avail -= bytes;
+          start  = 0;
+        }
+        refill = 1;
+        continue;
+      }
+
+      /* Temporarily NUL-terminate the line. */
+      hold     = buf[end];
+      buf[end] = 0;
+
+      /* XXX: Use encoding independent value for 0x1a */
+      if ( buf[start] != '#' && buf[start] != 0x1a && end > start )
+      {
+        error = (*cb)( buf + start, end - start, lineno,
+                       (void*)&cb, client_data );
+        /* Redo if we have encountered CHARS without properties. */
+        if ( error == -1 )
+          error = (*cb)( buf + start, end - start, lineno,
+                         (void*)&cb, client_data );
+        if ( error )
+          break;
+      }
+
+      lineno  += 1;
+      buf[end] = (char)hold;
+      start    = end + 1;
+
+      if ( hold == '\n' )
+        to_skip = '\r';
+      else if ( hold == '\r' )
+        to_skip = '\n';
+      else
+        to_skip = NO_SKIP;
+    }
+
+    *lno = lineno;
+
+  Exit:
+    FT_FREE( buf );
+    return error;
+  }
+
+
+  /* XXX: make this work with EBCDIC also */
+
+  static const unsigned char  a2i[128] =
+  {
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+  };
+
+  static const unsigned char  odigits[32] =
+  {
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  };
+
+  static const unsigned char  ddigits[32] =
+  {
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  };
+
+  static const unsigned char  hdigits[32] =
+  {
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03,
+    0x7e, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  };
+
+
+#define isdigok( m, d )  (m[(d) >> 3] & ( 1 << ( (d) & 7 ) ) )
+
+
+  /* Routine to convert an ASCII string into an unsigned long integer. */
+  static unsigned long
+  _bdf_atoul( char*   s,
+              char**  end,
+              int     base )
+  {
+    unsigned long         v;
+    const unsigned char*  dmap;
+
+
+    if ( s == 0 || *s == 0 )
+      return 0;
+
+    /* Make sure the radix is something recognizable.  Default to 10. */
+    switch ( base )
+    {
+    case 8:
+      dmap = odigits;
+      break;
+    case 16:
+      dmap = hdigits;
+      break;
+    default:
+      base = 10;
+      dmap = ddigits;
+      break;
+    }
+
+    /* Check for the special hex prefix. */
+    if ( *s == '0'                                  &&
+         ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) )
+    {
+      base = 16;
+      dmap = hdigits;
+      s   += 2;
+    }
+
+    for ( v = 0; isdigok( dmap, *s ); s++ )
+      v = v * base + a2i[(int)*s];
+
+    if ( end != 0 )
+      *end = s;
+
+    return v;
+  }
+
+
+  /* Routine to convert an ASCII string into an signed long integer. */
+  static long
+  _bdf_atol( char*   s,
+             char**  end,
+             int     base )
+  {
+    long                  v, neg;
+    const unsigned char*  dmap;
+
+
+    if ( s == 0 || *s == 0 )
+      return 0;
+
+    /* Make sure the radix is something recognizable.  Default to 10. */
+    switch ( base )
+    {
+    case 8:
+      dmap = odigits;
+      break;
+    case 16:
+      dmap = hdigits;
+      break;
+    default:
+      base = 10;
+      dmap = ddigits;
+      break;
+    }
+
+    /* Check for a minus sign. */
+    neg = 0;
+    if ( *s == '-' )
+    {
+      s++;
+      neg = 1;
+    }
+
+    /* Check for the special hex prefix. */
+    if ( *s == '0'                                  &&
+         ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) )
+    {
+      base = 16;
+      dmap = hdigits;
+      s   += 2;
+    }
+
+    for ( v = 0; isdigok( dmap, *s ); s++ )
+      v = v * base + a2i[(int)*s];
+
+    if ( end != 0 )
+      *end = s;
+
+    return ( !neg ) ? v : -v;
+  }
+
+
+  /* Routine to convert an ASCII string into an signed short integer. */
+  static short
+  _bdf_atos( char*   s,
+             char**  end,
+             int     base )
+  {
+    short                 v, neg;
+    const unsigned char*  dmap;
+
+
+    if ( s == 0 || *s == 0 )
+      return 0;
+
+    /* Make sure the radix is something recognizable.  Default to 10. */
+    switch ( base )
+    {
+    case 8:
+      dmap = odigits;
+      break;
+    case 16:
+      dmap = hdigits;
+      break;
+    default:
+      base = 10;
+      dmap = ddigits;
+      break;
+    }
+
+    /* Check for a minus. */
+    neg = 0;
+    if ( *s == '-' )
+    {
+      s++;
+      neg = 1;
+    }
+
+    /* Check for the special hex prefix. */
+    if ( *s == '0'                                  &&
+         ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) )
+    {
+      base = 16;
+      dmap = hdigits;
+      s   += 2;
+    }
+
+    for ( v = 0; isdigok( dmap, *s ); s++ )
+      v = (short)( v * base + a2i[(int)*s] );
+
+    if ( end != 0 )
+      *end = s;
+
+    return (short)( ( !neg ) ? v : -v );
+  }
+
+
+  /* Routine to compare two glyphs by encoding so they can be sorted. */
+  static int
+  by_encoding( const void*  a,
+               const void*  b )
+  {
+    bdf_glyph_t  *c1, *c2;
+
+
+    c1 = (bdf_glyph_t *)a;
+    c2 = (bdf_glyph_t *)b;
+
+    if ( c1->encoding < c2->encoding )
+      return -1;
+
+    if ( c1->encoding > c2->encoding )
+      return 1;
+
+    return 0;
+  }
+
+
+  static FT_Error
+  bdf_create_property( char*        name,
+                       int          format,
+                       bdf_font_t*  font )
+  {
+    size_t           n;
+    bdf_property_t*  p;
+    FT_Memory        memory = font->memory;
+    FT_Error         error = BDF_Err_Ok;
+
+
+    /* First check whether the property has        */
+    /* already been added or not.  If it has, then */
+    /* simply ignore it.                           */
+    if ( hash_lookup( name, &(font->proptbl) ) )
+      goto Exit;
+
+    if ( FT_RENEW_ARRAY( font->user_props,
+                         font->nuser_props,
+                         font->nuser_props + 1 ) )
+      goto Exit;
+
+    p = font->user_props + font->nuser_props;
+    FT_ZERO( p );
+
+    n = ft_strlen( name ) + 1;
+    if ( n > FT_ULONG_MAX )
+      return BDF_Err_Invalid_Argument;
+
+    if ( FT_NEW_ARRAY( p->name, n ) )
+      goto Exit;
+
+    FT_MEM_COPY( (char *)p->name, name, n );
+
+    p->format  = format;
+    p->builtin = 0;
+
+    n = _num_bdf_properties + font->nuser_props;
+
+    error = hash_insert( p->name, n, &(font->proptbl), memory );
+    if ( error )
+      goto Exit;
+
+    font->nuser_props++;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( bdf_property_t * )
+  bdf_get_property( char*        name,
+                    bdf_font_t*  font )
+  {
+    hashnode  hn;
+    size_t    propid;
+
+
+    if ( name == 0 || *name == 0 )
+      return 0;
+
+    if ( ( hn = hash_lookup( name, &(font->proptbl) ) ) == 0 )
+      return 0;
+
+    propid = hn->data;
+    if ( propid >= _num_bdf_properties )
+      return font->user_props + ( propid - _num_bdf_properties );
+
+    return (bdf_property_t*)_bdf_properties + propid;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* BDF font file parsing flags and functions.                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* Parse flags. */
+
+#define _BDF_START      0x0001
+#define _BDF_FONT_NAME  0x0002
+#define _BDF_SIZE       0x0004
+#define _BDF_FONT_BBX   0x0008
+#define _BDF_PROPS      0x0010
+#define _BDF_GLYPHS     0x0020
+#define _BDF_GLYPH      0x0040
+#define _BDF_ENCODING   0x0080
+#define _BDF_SWIDTH     0x0100
+#define _BDF_DWIDTH     0x0200
+#define _BDF_BBX        0x0400
+#define _BDF_BITMAP     0x0800
+
+#define _BDF_SWIDTH_ADJ  0x1000
+
+#define _BDF_GLYPH_BITS ( _BDF_GLYPH    | \
+                          _BDF_ENCODING | \
+                          _BDF_SWIDTH   | \
+                          _BDF_DWIDTH   | \
+                          _BDF_BBX      | \
+                          _BDF_BITMAP   )
+
+#define _BDF_GLYPH_WIDTH_CHECK   0x40000000UL
+#define _BDF_GLYPH_HEIGHT_CHECK  0x80000000UL
+
+
+  static FT_Error
+  _bdf_add_comment( bdf_font_t*    font,
+                    char*          comment,
+                    unsigned long  len )
+  {
+    char*      cp;
+    FT_Memory  memory = font->memory;
+    FT_Error   error = BDF_Err_Ok;
+
+
+    if ( FT_RENEW_ARRAY( font->comments,
+                         font->comments_len,
+                         font->comments_len + len + 1 ) )
+      goto Exit;
+
+    cp = font->comments + font->comments_len;
+
+    FT_MEM_COPY( cp, comment, len );
+    cp[len] = '\n';
+
+    font->comments_len += len + 1;
+
+  Exit:
+    return error;
+  }
+
+
+  /* Set the spacing from the font name if it exists, or set it to the */
+  /* default specified in the options.                                 */
+  static FT_Error
+  _bdf_set_default_spacing( bdf_font_t*     font,
+                            bdf_options_t*  opts,
+                            unsigned long   lineno )
+  {
+    size_t       len;
+    char         name[256];
+    _bdf_list_t  list;
+    FT_Memory    memory;
+    FT_Error     error = BDF_Err_Ok;
+
+
+    if ( font == 0 || font->name == 0 || font->name[0] == 0 )
+    {
+      error = BDF_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    memory = font->memory;
+
+    _bdf_list_init( &list, memory );
+
+    font->spacing = opts->font_spacing;
+
+    len = ft_strlen( font->name ) + 1;
+    /* Limit ourselves to 256 characters in the font name. */
+    if ( len >= 256 )
+    {
+      FT_ERROR(( "_bdf_set_default_spacing: " ERRMSG7, lineno ));
+      error = BDF_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    FT_MEM_COPY( name, font->name, len );
+
+    error = _bdf_list_split( &list, (char *)"-", name, len );
+    if ( error )
+      goto Fail;
+
+    if ( list.used == 15 )
+    {
+      switch ( list.field[11][0] )
+      {
+      case 'C':
+      case 'c':
+        font->spacing = BDF_CHARCELL;
+        break;
+      case 'M':
+      case 'm':
+        font->spacing = BDF_MONOWIDTH;
+        break;
+      case 'P':
+      case 'p':
+        font->spacing = BDF_PROPORTIONAL;
+        break;
+      }
+    }
+
+  Fail:
+    _bdf_list_done( &list );
+
+  Exit:
+    return error;
+  }
+
+
+  /* Determine whether the property is an atom or not.  If it is, then */
+  /* clean it up so the double quotes are removed if they exist.       */
+  static int
+  _bdf_is_atom( char*          line,
+                unsigned long  linelen,
+                char**         name,
+                char**         value,
+                bdf_font_t*    font )
+  {
+    int              hold;
+    char             *sp, *ep;
+    bdf_property_t*  p;
+
+
+    *name = sp = ep = line;
+
+    while ( *ep && *ep != ' ' && *ep != '\t' )
+      ep++;
+
+    hold = -1;
+    if ( *ep )
+    {
+      hold = *ep;
+      *ep  = 0;
+    }
+
+    p = bdf_get_property( sp, font );
+
+    /* Restore the character that was saved before any return can happen. */
+    if ( hold != -1 )
+      *ep = (char)hold;
+
+    /* If the property exists and is not an atom, just return here. */
+    if ( p && p->format != BDF_ATOM )
+      return 0;
+
+    /* The property is an atom.  Trim all leading and trailing whitespace */
+    /* and double quotes for the atom value.                              */
+    sp = ep;
+    ep = line + linelen;
+
+    /* Trim the leading whitespace if it exists. */
+    if ( *sp )
+      *sp++ = 0;
+    while ( *sp                           &&
+            ( *sp == ' ' || *sp == '\t' ) )
+      sp++;
+
+    /* Trim the leading double quote if it exists. */
+    if ( *sp == '"' )
+      sp++;
+    *value = sp;
+
+    /* Trim the trailing whitespace if it exists. */
+    while ( ep > sp                                       &&
+            ( *( ep - 1 ) == ' ' || *( ep - 1 ) == '\t' ) )
+      *--ep = 0;
+
+    /* Trim the trailing double quote if it exists. */
+    if ( ep > sp && *( ep - 1 ) == '"' )
+      *--ep = 0;
+
+    return 1;
+  }
+
+
+  static FT_Error
+  _bdf_add_property( bdf_font_t*    font,
+                     char*          name,
+                     char*          value,
+                     unsigned long  lineno )
+  {
+    size_t          propid;
+    hashnode        hn;
+    bdf_property_t  *prop, *fp;
+    FT_Memory       memory = font->memory;
+    FT_Error        error = BDF_Err_Ok;
+
+
+    /* First, check whether the property already exists in the font. */
+    if ( ( hn = hash_lookup( name, (hashtable *)font->internal ) ) != 0 )
+    {
+      /* The property already exists in the font, so simply replace */
+      /* the value of the property with the current value.          */
+      fp = font->props + hn->data;
+
+      switch ( fp->format )
+      {
+      case BDF_ATOM:
+        /* Delete the current atom if it exists. */
+        FT_FREE( fp->value.atom );
+
+        if ( value && value[0] != 0 )
+        {
+          if ( FT_STRDUP( fp->value.atom, value ) )
+            goto Exit;
+        }
+        break;
+
+      case BDF_INTEGER:
+        fp->value.l = _bdf_atol( value, 0, 10 );
+        break;
+
+      case BDF_CARDINAL:
+        fp->value.ul = _bdf_atoul( value, 0, 10 );
+        break;
+
+      default:
+        ;
+      }
+
+      goto Exit;
+    }
+
+    /* See whether this property type exists yet or not. */
+    /* If not, create it.                                */
+    hn = hash_lookup( name, &(font->proptbl) );
+    if ( hn == 0 )
+    {
+      error = bdf_create_property( name, BDF_ATOM, font );
+      if ( error )
+        goto Exit;
+      hn = hash_lookup( name, &(font->proptbl) );
+    }
+
+    /* Allocate another property if this is overflow. */
+    if ( font->props_used == font->props_size )
+    {
+      if ( font->props_size == 0 )
+      {
+        if ( FT_NEW_ARRAY( font->props, 1 ) )
+          goto Exit;
+      }
+      else
+      {
+        if ( FT_RENEW_ARRAY( font->props,
+                             font->props_size,
+                             font->props_size + 1 ) )
+          goto Exit;
+      }
+
+      fp = font->props + font->props_size;
+      FT_MEM_ZERO( fp, sizeof ( bdf_property_t ) );
+      font->props_size++;
+    }
+
+    propid = hn->data;
+    if ( propid >= _num_bdf_properties )
+      prop = font->user_props + ( propid - _num_bdf_properties );
+    else
+      prop = (bdf_property_t*)_bdf_properties + propid;
+
+    fp = font->props + font->props_used;
+
+    fp->name    = prop->name;
+    fp->format  = prop->format;
+    fp->builtin = prop->builtin;
+
+    switch ( prop->format )
+    {
+    case BDF_ATOM:
+      fp->value.atom = 0;
+      if ( value != 0 && value[0] )
+      {
+        if ( FT_STRDUP( fp->value.atom, value ) )
+          goto Exit;
+      }
+      break;
+
+    case BDF_INTEGER:
+      fp->value.l = _bdf_atol( value, 0, 10 );
+      break;
+
+    case BDF_CARDINAL:
+      fp->value.ul = _bdf_atoul( value, 0, 10 );
+      break;
+    }
+
+    /* If the property happens to be a comment, then it doesn't need */
+    /* to be added to the internal hash table.                       */
+    if ( ft_memcmp( name, "COMMENT", 7 ) != 0 )
+    {
+      /* Add the property to the font property table. */
+      error = hash_insert( fp->name,
+                           font->props_used,
+                           (hashtable *)font->internal,
+                           memory );
+      if ( error )
+        goto Exit;
+    }
+
+    font->props_used++;
+
+    /* Some special cases need to be handled here.  The DEFAULT_CHAR       */
+    /* property needs to be located if it exists in the property list, the */
+    /* FONT_ASCENT and FONT_DESCENT need to be assigned if they are        */
+    /* present, and the SPACING property should override the default       */
+    /* spacing.                                                            */
+    if ( ft_memcmp( name, "DEFAULT_CHAR", 12 ) == 0 )
+      font->default_char = fp->value.l;
+    else if ( ft_memcmp( name, "FONT_ASCENT", 11 ) == 0 )
+      font->font_ascent = fp->value.l;
+    else if ( ft_memcmp( name, "FONT_DESCENT", 12 ) == 0 )
+      font->font_descent = fp->value.l;
+    else if ( ft_memcmp( name, "SPACING", 7 ) == 0 )
+    {
+      if ( !fp->value.atom )
+      {
+        FT_ERROR(( "_bdf_add_property: " ERRMSG8, lineno, "SPACING" ));
+        error = BDF_Err_Invalid_File_Format;
+        goto Exit;
+      }
+
+      if ( fp->value.atom[0] == 'p' || fp->value.atom[0] == 'P' )
+        font->spacing = BDF_PROPORTIONAL;
+      else if ( fp->value.atom[0] == 'm' || fp->value.atom[0] == 'M' )
+        font->spacing = BDF_MONOWIDTH;
+      else if ( fp->value.atom[0] == 'c' || fp->value.atom[0] == 'C' )
+        font->spacing = BDF_CHARCELL;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static const unsigned char nibble_mask[8] =
+  {
+    0xFF, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE
+  };
+
+
+  /* Actually parse the glyph info and bitmaps. */
+  static FT_Error
+  _bdf_parse_glyphs( char*          line,
+                     unsigned long  linelen,
+                     unsigned long  lineno,
+                     void*          call_data,
+                     void*          client_data )
+  {
+    int                c, mask_index;
+    char*              s;
+    unsigned char*     bp;
+    unsigned long      i, slen, nibbles;
+
+    _bdf_parse_t*      p;
+    bdf_glyph_t*       glyph;
+    bdf_font_t*        font;
+
+    FT_Memory          memory;
+    FT_Error           error = BDF_Err_Ok;
+
+    FT_UNUSED( call_data );
+    FT_UNUSED( lineno );        /* only used in debug mode */
+
+
+    p = (_bdf_parse_t *)client_data;
+
+    font   = p->font;
+    memory = font->memory;
+
+    /* Check for a comment. */
+    if ( ft_memcmp( line, "COMMENT", 7 ) == 0 )
+    {
+      linelen -= 7;
+
+      s = line + 7;
+      if ( *s != 0 )
+      {
+        s++;
+        linelen--;
+      }
+      error = _bdf_add_comment( p->font, s, linelen );
+      goto Exit;
+    }
+
+    /* The very first thing expected is the number of glyphs. */
+    if ( !( p->flags & _BDF_GLYPHS ) )
+    {
+      if ( ft_memcmp( line, "CHARS", 5 ) != 0 )
+      {
+        FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "CHARS" ));
+        error = BDF_Err_Missing_Chars_Field;
+        goto Exit;
+      }
+
+      error = _bdf_list_split( &p->list, (char *)" +", line, linelen );
+      if ( error )
+        goto Exit;
+      p->cnt = font->glyphs_size = _bdf_atoul( p->list.field[1], 0, 10 );
+
+      /* Make sure the number of glyphs is non-zero. */
+      if ( p->cnt == 0 )
+        font->glyphs_size = 64;
+
+      /* Limit ourselves to 1,114,112 glyphs in the font (this is the */
+      /* number of code points available in Unicode).                 */
+      if ( p->cnt >= 0x110000UL )
+      {
+        FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG5, lineno, "CHARS" ));
+        error = BDF_Err_Invalid_Argument;
+        goto Exit;
+      }
+
+      if ( FT_NEW_ARRAY( font->glyphs, font->glyphs_size ) )
+        goto Exit;
+
+      p->flags |= _BDF_GLYPHS;
+
+      goto Exit;
+    }
+
+    /* Check for the ENDFONT field. */
+    if ( ft_memcmp( line, "ENDFONT", 7 ) == 0 )
+    {
+      /* Sort the glyphs by encoding. */
+      ft_qsort( (char *)font->glyphs,
+                font->glyphs_used,
+                sizeof ( bdf_glyph_t ),
+                by_encoding );
+
+      p->flags &= ~_BDF_START;
+
+      goto Exit;
+    }
+
+    /* Check for the ENDCHAR field. */
+    if ( ft_memcmp( line, "ENDCHAR", 7 ) == 0 )
+    {
+      p->glyph_enc = 0;
+      p->flags    &= ~_BDF_GLYPH_BITS;
+
+      goto Exit;
+    }
+
+    /* Check whether a glyph is being scanned but should be */
+    /* ignored because it is an unencoded glyph.            */
+    if ( ( p->flags & _BDF_GLYPH )     &&
+         p->glyph_enc            == -1 &&
+         p->opts->keep_unencoded == 0  )
+      goto Exit;
+
+    /* Check for the STARTCHAR field. */
+    if ( ft_memcmp( line, "STARTCHAR", 9 ) == 0 )
+    {
+      /* Set the character name in the parse info first until the */
+      /* encoding can be checked for an unencoded character.      */
+      FT_FREE( p->glyph_name );
+
+      error = _bdf_list_split( &p->list, (char *)" +", line, linelen );
+      if ( error )
+        goto Exit;
+
+      _bdf_list_shift( &p->list, 1 );
+
+      s = _bdf_list_join( &p->list, ' ', &slen );
+
+      if ( !s )
+      {
+        FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG8, lineno, "STARTCHAR" ));
+        error = BDF_Err_Invalid_File_Format;
+        goto Exit;
+      }
+
+      if ( FT_NEW_ARRAY( p->glyph_name, slen + 1 ) )
+        goto Exit;
+
+      FT_MEM_COPY( p->glyph_name, s, slen + 1 );
+
+      p->flags |= _BDF_GLYPH;
+
+      FT_TRACE4(( DBGMSG1, lineno, s ));
+
+      goto Exit;
+    }
+
+    /* Check for the ENCODING field. */
+    if ( ft_memcmp( line, "ENCODING", 8 ) == 0 )
+    {
+      if ( !( p->flags & _BDF_GLYPH ) )
+      {
+        /* Missing STARTCHAR field. */
+        FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "STARTCHAR" ));
+        error = BDF_Err_Missing_Startchar_Field;
+        goto Exit;
+      }
+
+      error = _bdf_list_split( &p->list, (char *)" +", line, linelen );
+      if ( error )
+        goto Exit;
+
+      p->glyph_enc = _bdf_atol( p->list.field[1], 0, 10 );
+
+      /* Normalize negative encoding values.  The specification only */
+      /* allows -1, but we can be more generous here.                */
+      if ( p->glyph_enc < -1 )
+        p->glyph_enc = -1;
+
+      /* Check for alternative encoding format. */
+      if ( p->glyph_enc == -1 && p->list.used > 2 )
+        p->glyph_enc = _bdf_atol( p->list.field[2], 0, 10 );
+
+      FT_TRACE4(( DBGMSG2, p->glyph_enc ));
+
+      /* Check that the encoding is in the Unicode range because  */
+      /* otherwise p->have (a bitmap with static size) overflows. */
+      if ( p->glyph_enc > 0                               &&
+           (size_t)p->glyph_enc >= sizeof ( p->have ) * 8 )
+      {
+        FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG5, lineno, "ENCODING" ));
+        error = BDF_Err_Invalid_File_Format;
+        goto Exit;
+      }
+
+      /* Check whether this encoding has already been encountered. */
+      /* If it has then change it to unencoded so it gets added if */
+      /* indicated.                                                */
+      if ( p->glyph_enc >= 0 )
+      {
+        if ( _bdf_glyph_modified( p->have, p->glyph_enc ) )
+        {
+          /* Emit a message saying a glyph has been moved to the */
+          /* unencoded area.                                     */
+          FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG12,
+                      p->glyph_enc, p->glyph_name ));
+          p->glyph_enc = -1;
+          font->modified = 1;
+        }
+        else
+          _bdf_set_glyph_modified( p->have, p->glyph_enc );
+      }
+
+      if ( p->glyph_enc >= 0 )
+      {
+        /* Make sure there are enough glyphs allocated in case the */
+        /* number of characters happen to be wrong.                */
+        if ( font->glyphs_used == font->glyphs_size )
+        {
+          if ( FT_RENEW_ARRAY( font->glyphs,
+                               font->glyphs_size,
+                               font->glyphs_size + 64 ) )
+            goto Exit;
+
+          font->glyphs_size += 64;
+        }
+
+        glyph           = font->glyphs + font->glyphs_used++;
+        glyph->name     = p->glyph_name;
+        glyph->encoding = p->glyph_enc;
+
+        /* Reset the initial glyph info. */
+        p->glyph_name = 0;
+      }
+      else
+      {
+        /* Unencoded glyph.  Check whether it should */
+        /* be added or not.                          */
+        if ( p->opts->keep_unencoded != 0 )
+        {
+          /* Allocate the next unencoded glyph. */
+          if ( font->unencoded_used == font->unencoded_size )
+          {
+            if ( FT_RENEW_ARRAY( font->unencoded ,
+                                 font->unencoded_size,
+                                 font->unencoded_size + 4 ) )
+              goto Exit;
+
+            font->unencoded_size += 4;
+          }
+
+          glyph           = font->unencoded + font->unencoded_used;
+          glyph->name     = p->glyph_name;
+          glyph->encoding = font->unencoded_used++;
+        }
+        else
+          /* Free up the glyph name if the unencoded shouldn't be */
+          /* kept.                                                */
+          FT_FREE( p->glyph_name );
+
+        p->glyph_name = 0;
+      }
+
+      /* Clear the flags that might be added when width and height are */
+      /* checked for consistency.                                      */
+      p->flags &= ~( _BDF_GLYPH_WIDTH_CHECK | _BDF_GLYPH_HEIGHT_CHECK );
+
+      p->flags |= _BDF_ENCODING;
+
+      goto Exit;
+    }
+
+    /* Point at the glyph being constructed. */
+    if ( p->glyph_enc == -1 )
+      glyph = font->unencoded + ( font->unencoded_used - 1 );
+    else
+      glyph = font->glyphs + ( font->glyphs_used - 1 );
+
+    /* Check whether a bitmap is being constructed. */
+    if ( p->flags & _BDF_BITMAP )
+    {
+      /* If there are more rows than are specified in the glyph metrics, */
+      /* ignore the remaining lines.                                     */
+      if ( p->row >= (unsigned long)glyph->bbx.height )
+      {
+        if ( !( p->flags & _BDF_GLYPH_HEIGHT_CHECK ) )
+        {
+          FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG13, glyph->encoding ));
+          p->flags |= _BDF_GLYPH_HEIGHT_CHECK;
+          font->modified = 1;
+        }
+
+        goto Exit;
+      }
+
+      /* Only collect the number of nibbles indicated by the glyph     */
+      /* metrics.  If there are more columns, they are simply ignored. */
+      nibbles = glyph->bpr << 1;
+      bp      = glyph->bitmap + p->row * glyph->bpr;
+
+      for ( i = 0; i < nibbles; i++ )
+      {
+        c = line[i];
+        if ( !isdigok( hdigits, c ) )
+          break;
+        *bp = (FT_Byte)( ( *bp << 4 ) + a2i[c] );
+        if ( i + 1 < nibbles && ( i & 1 ) )
+          *++bp = 0;
+      }
+
+      /* If any line has not enough columns,            */
+      /* indicate they have been padded with zero bits. */
+      if ( i < nibbles                            &&
+           !( p->flags & _BDF_GLYPH_WIDTH_CHECK ) )
+      {
+        FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG16, glyph->encoding ));
+        p->flags       |= _BDF_GLYPH_WIDTH_CHECK;
+        font->modified  = 1;
+      }
+
+      /* Remove possible garbage at the right. */
+      mask_index = ( glyph->bbx.width * p->font->bpp ) & 7;
+      if ( glyph->bbx.width )
+        *bp &= nibble_mask[mask_index];
+
+      /* If any line has extra columns, indicate they have been removed. */
+      if ( i == nibbles                           &&
+           isdigok( hdigits, line[nibbles] )      &&
+           !( p->flags & _BDF_GLYPH_WIDTH_CHECK ) )
+      {
+        FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG14, glyph->encoding ));
+        p->flags       |= _BDF_GLYPH_WIDTH_CHECK;
+        font->modified  = 1;
+      }
+
+      p->row++;
+      goto Exit;
+    }
+
+    /* Expect the SWIDTH (scalable width) field next. */
+    if ( ft_memcmp( line, "SWIDTH", 6 ) == 0 )
+    {
+      if ( !( p->flags & _BDF_ENCODING ) )
+        goto Missing_Encoding;
+
+      error = _bdf_list_split( &p->list, (char *)" +", line, linelen );
+      if ( error )
+        goto Exit;
+
+      glyph->swidth = (unsigned short)_bdf_atoul( p->list.field[1], 0, 10 );
+      p->flags |= _BDF_SWIDTH;
+
+      goto Exit;
+    }
+
+    /* Expect the DWIDTH (scalable width) field next. */
+    if ( ft_memcmp( line, "DWIDTH", 6 ) == 0 )
+    {
+      if ( !( p->flags & _BDF_ENCODING ) )
+        goto Missing_Encoding;
+
+      error = _bdf_list_split( &p->list, (char *)" +", line, linelen );
+      if ( error )
+        goto Exit;
+
+      glyph->dwidth = (unsigned short)_bdf_atoul( p->list.field[1], 0, 10 );
+
+      if ( !( p->flags & _BDF_SWIDTH ) )
+      {
+        /* Missing SWIDTH field.  Emit an auto correction message and set */
+        /* the scalable width from the device width.                      */
+        FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG9, lineno ));
+
+        glyph->swidth = (unsigned short)FT_MulDiv(
+                          glyph->dwidth, 72000L,
+                          (FT_Long)( font->point_size *
+                                     font->resolution_x ) );
+      }
+
+      p->flags |= _BDF_DWIDTH;
+      goto Exit;
+    }
+
+    /* Expect the BBX field next. */
+    if ( ft_memcmp( line, "BBX", 3 ) == 0 )
+    {
+      if ( !( p->flags & _BDF_ENCODING ) )
+        goto Missing_Encoding;
+
+      error = _bdf_list_split( &p->list, (char *)" +", line, linelen );
+      if ( error )
+        goto Exit;
+
+      glyph->bbx.width    = _bdf_atos( p->list.field[1], 0, 10 );
+      glyph->bbx.height   = _bdf_atos( p->list.field[2], 0, 10 );
+      glyph->bbx.x_offset = _bdf_atos( p->list.field[3], 0, 10 );
+      glyph->bbx.y_offset = _bdf_atos( p->list.field[4], 0, 10 );
+
+      /* Generate the ascent and descent of the character. */
+      glyph->bbx.ascent  = (short)( glyph->bbx.height + glyph->bbx.y_offset );
+      glyph->bbx.descent = (short)( -glyph->bbx.y_offset );
+
+      /* Determine the overall font bounding box as the characters are */
+      /* loaded so corrections can be done later if indicated.         */
+      p->maxas    = (short)FT_MAX( glyph->bbx.ascent, p->maxas );
+      p->maxds    = (short)FT_MAX( glyph->bbx.descent, p->maxds );
+
+      p->rbearing = (short)( glyph->bbx.width + glyph->bbx.x_offset );
+
+      p->maxrb    = (short)FT_MAX( p->rbearing, p->maxrb );
+      p->minlb    = (short)FT_MIN( glyph->bbx.x_offset, p->minlb );
+      p->maxlb    = (short)FT_MAX( glyph->bbx.x_offset, p->maxlb );
+
+      if ( !( p->flags & _BDF_DWIDTH ) )
+      {
+        /* Missing DWIDTH field.  Emit an auto correction message and set */
+        /* the device width to the glyph width.                           */
+        FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG10, lineno ));
+        glyph->dwidth = glyph->bbx.width;
+      }
+
+      /* If the BDF_CORRECT_METRICS flag is set, then adjust the SWIDTH */
+      /* value if necessary.                                            */
+      if ( p->opts->correct_metrics != 0 )
+      {
+        /* Determine the point size of the glyph. */
+        unsigned short  sw = (unsigned short)FT_MulDiv(
+                               glyph->dwidth, 72000L,
+                               (FT_Long)( font->point_size *
+                                          font->resolution_x ) );
+
+
+        if ( sw != glyph->swidth )
+        {
+          glyph->swidth = sw;
+
+          if ( p->glyph_enc == -1 )
+            _bdf_set_glyph_modified( font->umod,
+                                     font->unencoded_used - 1 );
+          else
+            _bdf_set_glyph_modified( font->nmod, glyph->encoding );
+
+          p->flags       |= _BDF_SWIDTH_ADJ;
+          font->modified  = 1;
+        }
+      }
+
+      p->flags |= _BDF_BBX;
+      goto Exit;
+    }
+
+    /* And finally, gather up the bitmap. */
+    if ( ft_memcmp( line, "BITMAP", 6 ) == 0 )
+    {
+      unsigned long  bitmap_size;
+
+
+      if ( !( p->flags & _BDF_BBX ) )
+      {
+        /* Missing BBX field. */
+        FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "BBX" ));
+        error = BDF_Err_Missing_Bbx_Field;
+        goto Exit;
+      }
+
+      /* Allocate enough space for the bitmap. */
+      glyph->bpr = ( glyph->bbx.width * p->font->bpp + 7 ) >> 3;
+
+      bitmap_size = glyph->bpr * glyph->bbx.height;
+      if ( glyph->bpr > 0xFFFFU || bitmap_size > 0xFFFFU )
+      {
+        FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG4, lineno ));
+        error = BDF_Err_Bbx_Too_Big;
+        goto Exit;
+      }
+      else
+        glyph->bytes = (unsigned short)bitmap_size;
+
+      if ( FT_NEW_ARRAY( glyph->bitmap, glyph->bytes ) )
+        goto Exit;
+
+      p->row    = 0;
+      p->flags |= _BDF_BITMAP;
+
+      goto Exit;
+    }
+
+    FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG9, lineno ));
+    error = BDF_Err_Invalid_File_Format;
+    goto Exit;
+
+  Missing_Encoding:
+    /* Missing ENCODING field. */
+    FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "ENCODING" ));
+    error = BDF_Err_Missing_Encoding_Field;
+
+  Exit:
+    if ( error && ( p->flags & _BDF_GLYPH ) )
+      FT_FREE( p->glyph_name );
+
+    return error;
+  }
+
+
+  /* Load the font properties. */
+  static FT_Error
+  _bdf_parse_properties( char*          line,
+                         unsigned long  linelen,
+                         unsigned long  lineno,
+                         void*          call_data,
+                         void*          client_data )
+  {
+    unsigned long      vlen;
+    _bdf_line_func_t*  next;
+    _bdf_parse_t*      p;
+    char*              name;
+    char*              value;
+    char               nbuf[128];
+    FT_Error           error = BDF_Err_Ok;
+
+    FT_UNUSED( lineno );
+
+
+    next = (_bdf_line_func_t *)call_data;
+    p    = (_bdf_parse_t *)    client_data;
+
+    /* Check for the end of the properties. */
+    if ( ft_memcmp( line, "ENDPROPERTIES", 13 ) == 0 )
+    {
+      /* If the FONT_ASCENT or FONT_DESCENT properties have not been      */
+      /* encountered yet, then make sure they are added as properties and */
+      /* make sure they are set from the font bounding box info.          */
+      /*                                                                  */
+      /* This is *always* done regardless of the options, because X11     */
+      /* requires these two fields to compile fonts.                      */
+      if ( bdf_get_font_property( p->font, "FONT_ASCENT" ) == 0 )
+      {
+        p->font->font_ascent = p->font->bbx.ascent;
+        ft_sprintf( nbuf, "%hd", p->font->bbx.ascent );
+        error = _bdf_add_property( p->font, (char *)"FONT_ASCENT",
+                                   nbuf, lineno );
+        if ( error )
+          goto Exit;
+
+        FT_TRACE2(( "_bdf_parse_properties: " ACMSG1, p->font->bbx.ascent ));
+        p->font->modified = 1;
+      }
+
+      if ( bdf_get_font_property( p->font, "FONT_DESCENT" ) == 0 )
+      {
+        p->font->font_descent = p->font->bbx.descent;
+        ft_sprintf( nbuf, "%hd", p->font->bbx.descent );
+        error = _bdf_add_property( p->font, (char *)"FONT_DESCENT",
+                                   nbuf, lineno );
+        if ( error )
+          goto Exit;
+
+        FT_TRACE2(( "_bdf_parse_properties: " ACMSG2, p->font->bbx.descent ));
+        p->font->modified = 1;
+      }
+
+      p->flags &= ~_BDF_PROPS;
+      *next     = _bdf_parse_glyphs;
+
+      goto Exit;
+    }
+
+    /* Ignore the _XFREE86_GLYPH_RANGES properties. */
+    if ( ft_memcmp( line, "_XFREE86_GLYPH_RANGES", 21 ) == 0 )
+      goto Exit;
+
+    /* Handle COMMENT fields and properties in a special way to preserve */
+    /* the spacing.                                                      */
+    if ( ft_memcmp( line, "COMMENT", 7 ) == 0 )
+    {
+      name = value = line;
+      value += 7;
+      if ( *value )
+        *value++ = 0;
+      error = _bdf_add_property( p->font, name, value, lineno );
+      if ( error )
+        goto Exit;
+    }
+    else if ( _bdf_is_atom( line, linelen, &name, &value, p->font ) )
+    {
+      error = _bdf_add_property( p->font, name, value, lineno );
+      if ( error )
+        goto Exit;
+    }
+    else
+    {
+      error = _bdf_list_split( &p->list, (char *)" +", line, linelen );
+      if ( error )
+        goto Exit;
+      name = p->list.field[0];
+
+      _bdf_list_shift( &p->list, 1 );
+      value = _bdf_list_join( &p->list, ' ', &vlen );
+
+      error = _bdf_add_property( p->font, name, value, lineno );
+      if ( error )
+        goto Exit;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* Load the font header. */
+  static FT_Error
+  _bdf_parse_start( char*          line,
+                    unsigned long  linelen,
+                    unsigned long  lineno,
+                    void*          call_data,
+                    void*          client_data )
+  {
+    unsigned long      slen;
+    _bdf_line_func_t*  next;
+    _bdf_parse_t*      p;
+    bdf_font_t*        font;
+    char               *s;
+
+    FT_Memory          memory = NULL;
+    FT_Error           error  = BDF_Err_Ok;
+
+    FT_UNUSED( lineno );            /* only used in debug mode */
+
+
+    next = (_bdf_line_func_t *)call_data;
+    p    = (_bdf_parse_t *)    client_data;
+
+    if ( p->font )
+      memory = p->font->memory;
+
+    /* Check for a comment.  This is done to handle those fonts that have */
+    /* comments before the STARTFONT line for some reason.                */
+    if ( ft_memcmp( line, "COMMENT", 7 ) == 0 )
+    {
+      if ( p->opts->keep_comments != 0 && p->font != 0 )
+      {
+        linelen -= 7;
+
+        s = line + 7;
+        if ( *s != 0 )
+        {
+          s++;
+          linelen--;
+        }
+
+        error = _bdf_add_comment( p->font, s, linelen );
+        if ( error )
+          goto Exit;
+        /* here font is not defined! */
+      }
+
+      goto Exit;
+    }
+
+    if ( !( p->flags & _BDF_START ) )
+    {
+      memory = p->memory;
+
+      if ( ft_memcmp( line, "STARTFONT", 9 ) != 0 )
+      {
+        /* we don't emit an error message since this code gets */
+        /* explicitly caught one level higher                  */
+        error = BDF_Err_Missing_Startfont_Field;
+        goto Exit;
+      }
+
+      p->flags = _BDF_START;
+      font = p->font = 0;
+
+      if ( FT_NEW( font ) )
+        goto Exit;
+      p->font = font;
+
+      font->memory = p->memory;
+      p->memory    = 0;
+
+      { /* setup */
+        size_t           i;
+        bdf_property_t*  prop;
+
+
+        error = hash_init( &(font->proptbl), memory );
+        if ( error )
+          goto Exit;
+        for ( i = 0, prop = (bdf_property_t*)_bdf_properties;
+              i < _num_bdf_properties; i++, prop++ )
+        {
+          error = hash_insert( prop->name, i,
+                               &(font->proptbl), memory );
+          if ( error )
+            goto Exit;
+        }
+      }
+
+      if ( FT_ALLOC( p->font->internal, sizeof ( hashtable ) ) )
+        goto Exit;
+      error = hash_init( (hashtable *)p->font->internal,memory );
+      if ( error )
+        goto Exit;
+      p->font->spacing      = p->opts->font_spacing;
+      p->font->default_char = -1;
+
+      goto Exit;
+    }
+
+    /* Check for the start of the properties. */
+    if ( ft_memcmp( line, "STARTPROPERTIES", 15 ) == 0 )
+    {
+      if ( !( p->flags & _BDF_FONT_BBX ) )
+      {
+        /* Missing the FONTBOUNDINGBOX field. */
+        FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "FONTBOUNDINGBOX" ));
+        error = BDF_Err_Missing_Fontboundingbox_Field;
+        goto Exit;
+      }
+
+      error = _bdf_list_split( &p->list, (char *)" +", line, linelen );
+      if ( error )
+        goto Exit;
+      /* at this point, `p->font' can't be NULL */
+      p->cnt = p->font->props_size = _bdf_atoul( p->list.field[1], 0, 10 );
+
+      if ( FT_NEW_ARRAY( p->font->props, p->cnt ) )
+        goto Exit;
+
+      p->flags |= _BDF_PROPS;
+      *next     = _bdf_parse_properties;
+
+      goto Exit;
+    }
+
+    /* Check for the FONTBOUNDINGBOX field. */
+    if ( ft_memcmp( line, "FONTBOUNDINGBOX", 15 ) == 0 )
+    {
+      if ( !( p->flags & _BDF_SIZE ) )
+      {
+        /* Missing the SIZE field. */
+        FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "SIZE" ));
+        error = BDF_Err_Missing_Size_Field;
+        goto Exit;
+      }
+
+      error = _bdf_list_split( &p->list, (char *)" +", line, linelen );
+      if ( error )
+        goto Exit;
+
+      p->font->bbx.width  = _bdf_atos( p->list.field[1], 0, 10 );
+      p->font->bbx.height = _bdf_atos( p->list.field[2], 0, 10 );
+
+      p->font->bbx.x_offset = _bdf_atos( p->list.field[3], 0, 10 );
+      p->font->bbx.y_offset = _bdf_atos( p->list.field[4], 0, 10 );
+
+      p->font->bbx.ascent  = (short)( p->font->bbx.height +
+                                      p->font->bbx.y_offset );
+
+      p->font->bbx.descent = (short)( -p->font->bbx.y_offset );
+
+      p->flags |= _BDF_FONT_BBX;
+
+      goto Exit;
+    }
+
+    /* The next thing to check for is the FONT field. */
+    if ( ft_memcmp( line, "FONT", 4 ) == 0 )
+    {
+      error = _bdf_list_split( &p->list, (char *)" +", line, linelen );
+      if ( error )
+        goto Exit;
+      _bdf_list_shift( &p->list, 1 );
+
+      s = _bdf_list_join( &p->list, ' ', &slen );
+
+      if ( !s )
+      {
+        FT_ERROR(( "_bdf_parse_start: " ERRMSG8, lineno, "FONT" ));
+        error = BDF_Err_Invalid_File_Format;
+        goto Exit;
+      }
+
+      /* Allowing multiple `FONT' lines (which is invalid) doesn't hurt... */
+      FT_FREE( p->font->name );
+
+      if ( FT_NEW_ARRAY( p->font->name, slen + 1 ) )
+        goto Exit;
+      FT_MEM_COPY( p->font->name, s, slen + 1 );
+
+      /* If the font name is an XLFD name, set the spacing to the one in  */
+      /* the font name.  If there is no spacing fall back on the default. */
+      error = _bdf_set_default_spacing( p->font, p->opts, lineno );
+      if ( error )
+        goto Exit;
+
+      p->flags |= _BDF_FONT_NAME;
+
+      goto Exit;
+    }
+
+    /* Check for the SIZE field. */
+    if ( ft_memcmp( line, "SIZE", 4 ) == 0 )
+    {
+      if ( !( p->flags & _BDF_FONT_NAME ) )
+      {
+        /* Missing the FONT field. */
+        FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "FONT" ));
+        error = BDF_Err_Missing_Font_Field;
+        goto Exit;
+      }
+
+      error = _bdf_list_split( &p->list, (char *)" +", line, linelen );
+      if ( error )
+        goto Exit;
+
+      p->font->point_size   = _bdf_atoul( p->list.field[1], 0, 10 );
+      p->font->resolution_x = _bdf_atoul( p->list.field[2], 0, 10 );
+      p->font->resolution_y = _bdf_atoul( p->list.field[3], 0, 10 );
+
+      /* Check for the bits per pixel field. */
+      if ( p->list.used == 5 )
+      {
+        unsigned short bitcount, i, shift;
+
+
+        p->font->bpp = (unsigned short)_bdf_atos( p->list.field[4], 0, 10 );
+
+        /* Only values 1, 2, 4, 8 are allowed. */
+        shift = p->font->bpp;
+        bitcount = 0;
+        for ( i = 0; shift > 0; i++ )
+        {
+          if ( shift & 1 )
+            bitcount = i;
+          shift >>= 1;
+        }
+
+        shift = (short)( ( bitcount > 3 ) ? 8 : ( 1 << bitcount ) );
+
+        if ( p->font->bpp > shift || p->font->bpp != shift )
+        {
+          /* select next higher value */
+          p->font->bpp = (unsigned short)( shift << 1 );
+          FT_TRACE2(( "_bdf_parse_start: " ACMSG11, p->font->bpp ));
+        }
+      }
+      else
+        p->font->bpp = 1;
+
+      p->flags |= _BDF_SIZE;
+
+      goto Exit;
+    }
+
+    /* Check for the CHARS field -- font properties are optional */
+    if ( ft_memcmp( line, "CHARS", 5 ) == 0 )
+    {
+      char  nbuf[128];
+
+
+      if ( !( p->flags & _BDF_FONT_BBX ) )
+      {
+        /* Missing the FONTBOUNDINGBOX field. */
+        FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "FONTBOUNDINGBOX" ));
+        error = BDF_Err_Missing_Fontboundingbox_Field;
+        goto Exit;
+      }
+
+      /* Add the two standard X11 properties which are required */
+      /* for compiling fonts.                                   */
+      p->font->font_ascent = p->font->bbx.ascent;
+      ft_sprintf( nbuf, "%hd", p->font->bbx.ascent );
+      error = _bdf_add_property( p->font, (char *)"FONT_ASCENT",
+                                 nbuf, lineno );
+      if ( error )
+        goto Exit;
+      FT_TRACE2(( "_bdf_parse_properties: " ACMSG1, p->font->bbx.ascent ));
+
+      p->font->font_descent = p->font->bbx.descent;
+      ft_sprintf( nbuf, "%hd", p->font->bbx.descent );
+      error = _bdf_add_property( p->font, (char *)"FONT_DESCENT",
+                                 nbuf, lineno );
+      if ( error )
+        goto Exit;
+      FT_TRACE2(( "_bdf_parse_properties: " ACMSG2, p->font->bbx.descent ));
+
+      p->font->modified = 1;
+
+      *next = _bdf_parse_glyphs;
+
+      /* A special return value. */
+      error = -1;
+      goto Exit;
+    }
+
+    FT_ERROR(( "_bdf_parse_start: " ERRMSG9, lineno ));
+    error = BDF_Err_Invalid_File_Format;
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* API.                                                                  */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  FT_LOCAL_DEF( FT_Error )
+  bdf_load_font( FT_Stream       stream,
+                 FT_Memory       extmemory,
+                 bdf_options_t*  opts,
+                 bdf_font_t*    *font )
+  {
+    unsigned long  lineno = 0; /* make compiler happy */
+    _bdf_parse_t   *p     = NULL;
+
+    FT_Memory      memory = extmemory;
+    FT_Error       error  = BDF_Err_Ok;
+
+
+    if ( FT_NEW( p ) )
+      goto Exit;
+
+    memory    = NULL;
+    p->opts   = (bdf_options_t*)( ( opts != 0 ) ? opts : &_bdf_opts );
+    p->minlb  = 32767;
+    p->memory = extmemory;  /* only during font creation */
+
+    _bdf_list_init( &p->list, extmemory );
+
+    error = _bdf_readstream( stream, _bdf_parse_start,
+                             (void *)p, &lineno );
+    if ( error )
+      goto Fail;
+
+    if ( p->font != 0 )
+    {
+      /* If the font is not proportional, set the font's monowidth */
+      /* field to the width of the font bounding box.              */
+      memory = p->font->memory;
+
+      if ( p->font->spacing != BDF_PROPORTIONAL )
+        p->font->monowidth = p->font->bbx.width;
+
+      /* If the number of glyphs loaded is not that of the original count, */
+      /* indicate the difference.                                          */
+      if ( p->cnt != p->font->glyphs_used + p->font->unencoded_used )
+      {
+        FT_TRACE2(( "bdf_load_font: " ACMSG15, p->cnt,
+                    p->font->glyphs_used + p->font->unencoded_used ));
+        p->font->modified = 1;
+      }
+
+      /* Once the font has been loaded, adjust the overall font metrics if */
+      /* necessary.                                                        */
+      if ( p->opts->correct_metrics != 0 &&
+           ( p->font->glyphs_used > 0 || p->font->unencoded_used > 0 ) )
+      {
+        if ( p->maxrb - p->minlb != p->font->bbx.width )
+        {
+          FT_TRACE2(( "bdf_load_font: " ACMSG3,
+                      p->font->bbx.width, p->maxrb - p->minlb ));
+          p->font->bbx.width = (unsigned short)( p->maxrb - p->minlb );
+          p->font->modified  = 1;
+        }
+
+        if ( p->font->bbx.x_offset != p->minlb )
+        {
+          FT_TRACE2(( "bdf_load_font: " ACMSG4,
+                      p->font->bbx.x_offset, p->minlb ));
+          p->font->bbx.x_offset = p->minlb;
+          p->font->modified     = 1;
+        }
+
+        if ( p->font->bbx.ascent != p->maxas )
+        {
+          FT_TRACE2(( "bdf_load_font: " ACMSG5,
+                      p->font->bbx.ascent, p->maxas ));
+          p->font->bbx.ascent = p->maxas;
+          p->font->modified   = 1;
+        }
+
+        if ( p->font->bbx.descent != p->maxds )
+        {
+          FT_TRACE2(( "bdf_load_font: " ACMSG6,
+                      p->font->bbx.descent, p->maxds ));
+          p->font->bbx.descent  = p->maxds;
+          p->font->bbx.y_offset = (short)( -p->maxds );
+          p->font->modified     = 1;
+        }
+
+        if ( p->maxas + p->maxds != p->font->bbx.height )
+        {
+          FT_TRACE2(( "bdf_load_font: " ACMSG7,
+                      p->font->bbx.height, p->maxas + p->maxds ));
+          p->font->bbx.height = (unsigned short)( p->maxas + p->maxds );
+        }
+
+        if ( p->flags & _BDF_SWIDTH_ADJ )
+          FT_TRACE2(( "bdf_load_font: " ACMSG8 ));
+      }
+    }
+
+    if ( p->flags & _BDF_START )
+    {
+      /* The ENDFONT field was never reached or did not exist. */
+      if ( !( p->flags & _BDF_GLYPHS ) )
+      {
+        /* Error happened while parsing header. */
+        FT_ERROR(( "bdf_load_font: " ERRMSG2, lineno ));
+        error = BDF_Err_Corrupted_Font_Header;
+        goto Exit;
+      }
+      else
+      {
+        /* Error happened when parsing glyphs. */
+        FT_ERROR(( "bdf_load_font: " ERRMSG3, lineno ));
+        error = BDF_Err_Corrupted_Font_Glyphs;
+        goto Exit;
+      }
+    }
+
+    if ( p->font != 0 )
+    {
+      /* Make sure the comments are NULL terminated if they exist. */
+      memory = p->font->memory;
+
+      if ( p->font->comments_len > 0 )
+      {
+        if ( FT_RENEW_ARRAY( p->font->comments,
+                             p->font->comments_len,
+                             p->font->comments_len + 1 ) )
+          goto Fail;
+
+        p->font->comments[p->font->comments_len] = 0;
+      }
+    }
+    else if ( error == BDF_Err_Ok )
+      error = BDF_Err_Invalid_File_Format;
+
+    *font = p->font;
+
+  Exit:
+    if ( p )
+    {
+      _bdf_list_done( &p->list );
+
+      memory = extmemory;
+
+      FT_FREE( p );
+    }
+
+    return error;
+
+  Fail:
+    bdf_free_font( p->font );
+
+    memory = extmemory;
+
+    FT_FREE( p->font );
+
+    goto Exit;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  bdf_free_font( bdf_font_t*  font )
+  {
+    bdf_property_t*  prop;
+    unsigned long    i;
+    bdf_glyph_t*     glyphs;
+    FT_Memory        memory;
+
+
+    if ( font == 0 )
+      return;
+
+    memory = font->memory;
+
+    FT_FREE( font->name );
+
+    /* Free up the internal hash table of property names. */
+    if ( font->internal )
+    {
+      hash_free( (hashtable *)font->internal, memory );
+      FT_FREE( font->internal );
+    }
+
+    /* Free up the comment info. */
+    FT_FREE( font->comments );
+
+    /* Free up the properties. */
+    for ( i = 0; i < font->props_size; i++ )
+    {
+      if ( font->props[i].format == BDF_ATOM )
+        FT_FREE( font->props[i].value.atom );
+    }
+
+    FT_FREE( font->props );
+
+    /* Free up the character info. */
+    for ( i = 0, glyphs = font->glyphs;
+          i < font->glyphs_used; i++, glyphs++ )
+    {
+      FT_FREE( glyphs->name );
+      FT_FREE( glyphs->bitmap );
+    }
+
+    for ( i = 0, glyphs = font->unencoded; i < font->unencoded_used;
+          i++, glyphs++ )
+    {
+      FT_FREE( glyphs->name );
+      FT_FREE( glyphs->bitmap );
+    }
+
+    FT_FREE( font->glyphs );
+    FT_FREE( font->unencoded );
+
+    /* Free up the overflow storage if it was used. */
+    for ( i = 0, glyphs = font->overflow.glyphs;
+          i < font->overflow.glyphs_used; i++, glyphs++ )
+    {
+      FT_FREE( glyphs->name );
+      FT_FREE( glyphs->bitmap );
+    }
+
+    FT_FREE( font->overflow.glyphs );
+
+    /* bdf_cleanup */
+    hash_free( &(font->proptbl), memory );
+
+    /* Free up the user defined properties. */
+    for ( prop = font->user_props, i = 0;
+          i < font->nuser_props; i++, prop++ )
+    {
+      FT_FREE( prop->name );
+      if ( prop->format == BDF_ATOM )
+        FT_FREE( prop->value.atom );
+    }
+
+    FT_FREE( font->user_props );
+
+    /* FREE( font ); */ /* XXX Fixme */
+  }
+
+
+  FT_LOCAL_DEF( bdf_property_t * )
+  bdf_get_font_property( bdf_font_t*  font,
+                         const char*  name )
+  {
+    hashnode  hn;
+
+
+    if ( font == 0 || font->props_size == 0 || name == 0 || *name == 0 )
+      return 0;
+
+    hn = hash_lookup( name, (hashtable *)font->internal );
+
+    return hn ? ( font->props + hn->data ) : 0;
+  }
+
+
+/* END */
diff --git a/src/bdf/module.mk b/src/bdf/module.mk
new file mode 100644 (file)
index 0000000..fe06ae8
--- /dev/null
@@ -0,0 +1,34 @@
+#
+# FreeType 2 BDF module definition
+#
+
+# Copyright 2001, 2002, 2006 by
+# Francesco Zappa Nardelli
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+
+FTMODULE_H_COMMANDS += BDF_DRIVER
+
+define BDF_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, bdf_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)bdf       $(ECHO_DRIVER_DESC)bdf bitmap fonts$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/src/bdf/rules.mk b/src/bdf/rules.mk
new file mode 100644 (file)
index 0000000..6ff1614
--- /dev/null
@@ -0,0 +1,81 @@
+#
+# FreeType 2 bdf driver configuration rules
+#
+
+
+# Copyright (C) 2001, 2002, 2003, 2008 by
+# Francesco Zappa Nardelli
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+
+
+
+# bdf driver directory
+#
+BDF_DIR := $(SRC_DIR)/bdf
+
+
+BDF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(BDF_DIR))
+
+
+# bdf driver sources (i.e., C files)
+#
+BDF_DRV_SRC := $(BDF_DIR)/bdflib.c \
+               $(BDF_DIR)/bdfdrivr.c
+
+
+# bdf driver headers
+#
+BDF_DRV_H := $(BDF_DIR)/bdf.h \
+             $(BDF_DIR)/bdfdrivr.h \
+             $(BDF_DIR)/bdferror.h
+
+# bdf driver object(s)
+#
+#   BDF_DRV_OBJ_M is used during `multi' builds
+#   BDF_DRV_OBJ_S is used during `single' builds
+#
+BDF_DRV_OBJ_M := $(BDF_DRV_SRC:$(BDF_DIR)/%.c=$(OBJ_DIR)/%.$O)
+BDF_DRV_OBJ_S := $(OBJ_DIR)/bdf.$O
+
+# bdf driver source file for single build
+#
+BDF_DRV_SRC_S := $(BDF_DIR)/bdf.c
+
+
+# bdf driver - single object
+#
+$(BDF_DRV_OBJ_S): $(BDF_DRV_SRC_S) $(BDF_DRV_SRC) $(FREETYPE_H) $(BDF_DRV_H)
+       $(BDF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BDF_DRV_SRC_S))
+
+
+# bdf driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(BDF_DIR)/%.c $(FREETYPE_H) $(BDF_DRV_H)
+       $(BDF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(BDF_DRV_OBJ_S)
+DRV_OBJS_M += $(BDF_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/bzip2/Jamfile b/src/bzip2/Jamfile
new file mode 100644 (file)
index 0000000..3da986d
--- /dev/null
@@ -0,0 +1,19 @@
+# FreeType 2 src/bzip2 Jamfile
+#
+# Copyright 2010 by
+# Joel Klinghed
+#
+# Based on src/lzw/Jamfile, Copyright 2004, 2006 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) bzip2 ;
+
+Library  $(FT2_LIB) : ftbzip2.c ;
+
+# end of src/bzip2 Jamfile
diff --git a/src/bzip2/ftbzip2.c b/src/bzip2/ftbzip2.c
new file mode 100644 (file)
index 0000000..d60ee3e
--- /dev/null
@@ -0,0 +1,511 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftbzip2.c                                                              */
+/*                                                                         */
+/*    FreeType support for .bz2 compressed files.                          */
+/*                                                                         */
+/*  This optional component relies on libbz2.  It should mainly be used to */
+/*  parse compressed PCF fonts, as found with many X11 server              */
+/*  distributions.                                                         */
+/*                                                                         */
+/*  Copyright 2010, 2012 by                                                */
+/*  Joel Klinghed.                                                         */
+/*                                                                         */
+/*  Based on src/gzip/ftgzip.c, Copyright 2002 - 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_MEMORY_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_BZIP2_H
+#include FT_CONFIG_STANDARD_LIBRARY_H
+
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  Bzip2_Err_
+#define FT_ERR_BASE    FT_Mod_Err_Bzip2
+
+#include FT_ERRORS_H
+
+
+#ifdef FT_CONFIG_OPTION_USE_BZIP2
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "bzip2 code does not support PIC yet"
+#endif
+
+#define BZ_NO_STDIO /* Do not need FILE */
+#include <bzlib.h>
+
+
+/***************************************************************************/
+/***************************************************************************/
+/*****                                                                 *****/
+/*****           B Z I P 2   M E M O R Y   M A N A G E M E N T         *****/
+/*****                                                                 *****/
+/***************************************************************************/
+/***************************************************************************/
+
+  /* it is better to use FreeType memory routines instead of raw
+     'malloc/free' */
+
+  typedef void *(* alloc_func)(void*, int, int);
+  typedef void (* free_func)(void*, void*);
+
+  static void*
+  ft_bzip2_alloc( FT_Memory  memory,
+                  int        items,
+                  int        size )
+  {
+    FT_ULong    sz = (FT_ULong)size * items;
+    FT_Error    error;
+    FT_Pointer  p  = NULL;
+
+
+    (void)FT_ALLOC( p, sz );
+    return p;
+  }
+
+
+  static void
+  ft_bzip2_free( FT_Memory  memory,
+                 void*      address )
+  {
+    FT_MEM_FREE( address );
+  }
+
+
+/***************************************************************************/
+/***************************************************************************/
+/*****                                                                 *****/
+/*****              B Z I P 2   F I L E   D E S C R I P T O R          *****/
+/*****                                                                 *****/
+/***************************************************************************/
+/***************************************************************************/
+
+#define FT_BZIP2_BUFFER_SIZE  4096
+
+  typedef struct  FT_BZip2FileRec_
+  {
+    FT_Stream  source;         /* parent/source stream        */
+    FT_Stream  stream;         /* embedding stream            */
+    FT_Memory  memory;         /* memory allocator            */
+    bz_stream  bzstream;       /* bzlib input stream          */
+
+    FT_Byte    input[FT_BZIP2_BUFFER_SIZE];  /* input read buffer  */
+
+    FT_Byte    buffer[FT_BZIP2_BUFFER_SIZE]; /* output buffer      */
+    FT_ULong   pos;                          /* position in output */
+    FT_Byte*   cursor;
+    FT_Byte*   limit;
+
+  } FT_BZip2FileRec, *FT_BZip2File;
+
+
+  /* check and skip .bz2 header - we don't support `transparent' compression */
+  static FT_Error
+  ft_bzip2_check_header( FT_Stream  stream )
+  {
+    FT_Error  error = Bzip2_Err_Ok;
+    FT_Byte   head[4];
+
+
+    if ( FT_STREAM_SEEK( 0 )       ||
+         FT_STREAM_READ( head, 4 ) )
+      goto Exit;
+
+    /* head[0] && head[1] are the magic numbers;    */
+    /* head[2] is the version, and head[3] the blocksize */
+    if ( head[0] != 0x42  ||
+         head[1] != 0x5a  ||
+         head[2] != 0x68  )  /* only support bzip2 (huffman) */
+    {
+      error = Bzip2_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  ft_bzip2_file_init( FT_BZip2File  zip,
+                      FT_Stream     stream,
+                      FT_Stream     source )
+  {
+    bz_stream*  bzstream = &zip->bzstream;
+    FT_Error    error    = Bzip2_Err_Ok;
+
+
+    zip->stream = stream;
+    zip->source = source;
+    zip->memory = stream->memory;
+
+    zip->limit  = zip->buffer + FT_BZIP2_BUFFER_SIZE;
+    zip->cursor = zip->limit;
+    zip->pos    = 0;
+
+    /* check .bz2 header */
+    {
+      stream = source;
+
+      error = ft_bzip2_check_header( stream );
+      if ( error )
+        goto Exit;
+
+      if ( FT_STREAM_SEEK( 0 ) )
+        goto Exit;
+    }
+
+    /* initialize bzlib */
+    bzstream->bzalloc = (alloc_func)ft_bzip2_alloc;
+    bzstream->bzfree  = (free_func) ft_bzip2_free;
+    bzstream->opaque  = zip->memory;
+
+    bzstream->avail_in = 0;
+    bzstream->next_in  = (char*)zip->buffer;
+
+    if ( BZ2_bzDecompressInit( bzstream, 0, 0 ) != BZ_OK ||
+         bzstream->next_in == NULL                       )
+      error = Bzip2_Err_Invalid_File_Format;
+
+  Exit:
+    return error;
+  }
+
+
+  static void
+  ft_bzip2_file_done( FT_BZip2File  zip )
+  {
+    bz_stream*  bzstream = &zip->bzstream;
+
+
+    BZ2_bzDecompressEnd( bzstream );
+
+    /* clear the rest */
+    bzstream->bzalloc   = NULL;
+    bzstream->bzfree    = NULL;
+    bzstream->opaque    = NULL;
+    bzstream->next_in   = NULL;
+    bzstream->next_out  = NULL;
+    bzstream->avail_in  = 0;
+    bzstream->avail_out = 0;
+
+    zip->memory = NULL;
+    zip->source = NULL;
+    zip->stream = NULL;
+  }
+
+
+  static FT_Error
+  ft_bzip2_file_reset( FT_BZip2File  zip )
+  {
+    FT_Stream  stream = zip->source;
+    FT_Error   error;
+
+
+    if ( !FT_STREAM_SEEK( 0 ) )
+    {
+      bz_stream*  bzstream = &zip->bzstream;
+
+
+      BZ2_bzDecompressEnd( bzstream );
+
+      bzstream->avail_in  = 0;
+      bzstream->next_in   = (char*)zip->input;
+      bzstream->avail_out = 0;
+      bzstream->next_out  = (char*)zip->buffer;
+
+      zip->limit  = zip->buffer + FT_BZIP2_BUFFER_SIZE;
+      zip->cursor = zip->limit;
+      zip->pos    = 0;
+
+      BZ2_bzDecompressInit( bzstream, 0, 0 );
+    }
+
+    return error;
+  }
+
+
+  static FT_Error
+  ft_bzip2_file_fill_input( FT_BZip2File  zip )
+  {
+    bz_stream*  bzstream = &zip->bzstream;
+    FT_Stream   stream    = zip->source;
+    FT_ULong    size;
+
+
+    if ( stream->read )
+    {
+      size = stream->read( stream, stream->pos, zip->input,
+                           FT_BZIP2_BUFFER_SIZE );
+      if ( size == 0 )
+        return Bzip2_Err_Invalid_Stream_Operation;
+    }
+    else
+    {
+      size = stream->size - stream->pos;
+      if ( size > FT_BZIP2_BUFFER_SIZE )
+        size = FT_BZIP2_BUFFER_SIZE;
+
+      if ( size == 0 )
+        return Bzip2_Err_Invalid_Stream_Operation;
+
+      FT_MEM_COPY( zip->input, stream->base + stream->pos, size );
+    }
+    stream->pos += size;
+
+    bzstream->next_in  = (char*)zip->input;
+    bzstream->avail_in = size;
+
+    return Bzip2_Err_Ok;
+  }
+
+
+  static FT_Error
+  ft_bzip2_file_fill_output( FT_BZip2File  zip )
+  {
+    bz_stream*  bzstream = &zip->bzstream;
+    FT_Error    error    = Bzip2_Err_Ok;
+
+
+    zip->cursor         = zip->buffer;
+    bzstream->next_out  = (char*)zip->cursor;
+    bzstream->avail_out = FT_BZIP2_BUFFER_SIZE;
+
+    while ( bzstream->avail_out > 0 )
+    {
+      int  err;
+
+
+      if ( bzstream->avail_in == 0 )
+      {
+        error = ft_bzip2_file_fill_input( zip );
+        if ( error )
+          break;
+      }
+
+      err = BZ2_bzDecompress( bzstream );
+
+      if ( err == BZ_STREAM_END )
+      {
+        zip->limit = (FT_Byte*)bzstream->next_out;
+        if ( zip->limit == zip->cursor )
+          error = Bzip2_Err_Invalid_Stream_Operation;
+        break;
+      }
+      else if ( err != BZ_OK )
+      {
+        error = Bzip2_Err_Invalid_Stream_Operation;
+        break;
+      }
+    }
+
+    return error;
+  }
+
+
+  /* fill output buffer; `count' must be <= FT_BZIP2_BUFFER_SIZE */
+  static FT_Error
+  ft_bzip2_file_skip_output( FT_BZip2File  zip,
+                             FT_ULong      count )
+  {
+    FT_Error  error = Bzip2_Err_Ok;
+    FT_ULong  delta;
+
+
+    for (;;)
+    {
+      delta = (FT_ULong)( zip->limit - zip->cursor );
+      if ( delta >= count )
+        delta = count;
+
+      zip->cursor += delta;
+      zip->pos    += delta;
+
+      count -= delta;
+      if ( count == 0 )
+        break;
+
+      error = ft_bzip2_file_fill_output( zip );
+      if ( error )
+        break;
+    }
+
+    return error;
+  }
+
+
+  static FT_ULong
+  ft_bzip2_file_io( FT_BZip2File  zip,
+                    FT_ULong      pos,
+                    FT_Byte*      buffer,
+                    FT_ULong      count )
+  {
+    FT_ULong  result = 0;
+    FT_Error  error;
+
+
+    /* Reset inflate stream if we're seeking backwards.        */
+    /* Yes, that is not too efficient, but it saves memory :-) */
+    if ( pos < zip->pos )
+    {
+      error = ft_bzip2_file_reset( zip );
+      if ( error )
+        goto Exit;
+    }
+
+    /* skip unwanted bytes */
+    if ( pos > zip->pos )
+    {
+      error = ft_bzip2_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) );
+      if ( error )
+        goto Exit;
+    }
+
+    if ( count == 0 )
+      goto Exit;
+
+    /* now read the data */
+    for (;;)
+    {
+      FT_ULong  delta;
+
+
+      delta = (FT_ULong)( zip->limit - zip->cursor );
+      if ( delta >= count )
+        delta = count;
+
+      FT_MEM_COPY( buffer, zip->cursor, delta );
+      buffer      += delta;
+      result      += delta;
+      zip->cursor += delta;
+      zip->pos    += delta;
+
+      count -= delta;
+      if ( count == 0 )
+        break;
+
+      error = ft_bzip2_file_fill_output( zip );
+      if ( error )
+        break;
+    }
+
+  Exit:
+    return result;
+  }
+
+
+/***************************************************************************/
+/***************************************************************************/
+/*****                                                                 *****/
+/*****               B Z   E M B E D D I N G   S T R E A M             *****/
+/*****                                                                 *****/
+/***************************************************************************/
+/***************************************************************************/
+
+  static void
+  ft_bzip2_stream_close( FT_Stream  stream )
+  {
+    FT_BZip2File  zip    = (FT_BZip2File)stream->descriptor.pointer;
+    FT_Memory     memory = stream->memory;
+
+
+    if ( zip )
+    {
+      /* finalize bzip file descriptor */
+      ft_bzip2_file_done( zip );
+
+      FT_FREE( zip );
+
+      stream->descriptor.pointer = NULL;
+    }
+  }
+
+
+  static FT_ULong
+  ft_bzip2_stream_io( FT_Stream  stream,
+                      FT_ULong   pos,
+                      FT_Byte*   buffer,
+                      FT_ULong   count )
+  {
+    FT_BZip2File  zip = (FT_BZip2File)stream->descriptor.pointer;
+
+
+    return ft_bzip2_file_io( zip, pos, buffer, count );
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stream_OpenBzip2( FT_Stream  stream,
+                       FT_Stream  source )
+  {
+    FT_Error      error;
+    FT_Memory     memory = source->memory;
+    FT_BZip2File  zip = NULL;
+
+
+    /*
+     *  check the header right now; this prevents allocating unnecessary
+     *  objects when we don't need them
+     */
+    error = ft_bzip2_check_header( source );
+    if ( error )
+      goto Exit;
+
+    FT_ZERO( stream );
+    stream->memory = memory;
+
+    if ( !FT_QNEW( zip ) )
+    {
+      error = ft_bzip2_file_init( zip, stream, source );
+      if ( error )
+      {
+        FT_FREE( zip );
+        goto Exit;
+      }
+
+      stream->descriptor.pointer = zip;
+    }
+
+    stream->size  = 0x7FFFFFFFL;  /* don't know the real size! */
+    stream->pos   = 0;
+    stream->base  = 0;
+    stream->read  = ft_bzip2_stream_io;
+    stream->close = ft_bzip2_stream_close;
+
+  Exit:
+    return error;
+  }
+
+#else  /* !FT_CONFIG_OPTION_USE_BZIP2 */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stream_OpenBzip2( FT_Stream  stream,
+                       FT_Stream  source )
+  {
+    FT_UNUSED( stream );
+    FT_UNUSED( source );
+
+    return Bzip2_Err_Unimplemented_Feature;
+  }
+
+#endif /* !FT_CONFIG_OPTION_USE_BZIP2 */
+
+
+/* END */
diff --git a/src/bzip2/rules.mk b/src/bzip2/rules.mk
new file mode 100644 (file)
index 0000000..0ff2628
--- /dev/null
@@ -0,0 +1,63 @@
+#
+# FreeType 2 BZIP2 support configuration rules
+#
+
+# Copyright 2010 by
+# Joel Klinghed.
+#
+# Based on src/lzw/rules.mk, Copyright 2004-2006 by
+# Albert Chin-A-Young.
+#
+# 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.
+
+
+# BZIP2 driver directory
+#
+BZIP2_DIR := $(SRC_DIR)/bzip2
+
+
+# compilation flags for the driver
+#
+BZIP2_COMPILE := $(FT_COMPILE)
+
+
+# BZIP2 support sources (i.e., C files)
+#
+BZIP2_DRV_SRC := $(BZIP2_DIR)/ftbzip2.c
+
+# BZIP2 driver object(s)
+#
+#   BZIP2_DRV_OBJ_M is used during `multi' builds
+#   BZIP2_DRV_OBJ_S is used during `single' builds
+#
+BZIP2_DRV_OBJ_M := $(OBJ_DIR)/ftbzip2.$O
+BZIP2_DRV_OBJ_S := $(OBJ_DIR)/ftbzip2.$O
+
+# BZIP2 support source file for single build
+#
+BZIP2_DRV_SRC_S := $(BZIP2_DIR)/ftbzip2.c
+
+
+# BZIP2 support - single object
+#
+$(BZIP2_DRV_OBJ_S): $(BZIP2_DRV_SRC_S) $(BZIP2_DRV_SRC) $(FREETYPE_H) $(BZIP2_DRV_H)
+       $(BZIP2_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(BZIP2_DRV_SRC_S))
+
+
+# BZIP2 support - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(BZIP2_DIR)/%.c $(FREETYPE_H) $(BZIP2_DRV_H)
+       $(BZIP2_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(BZIP2_DRV_OBJ_S)
+DRV_OBJS_M += $(BZIP2_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/cache/Jamfile b/src/cache/Jamfile
new file mode 100644 (file)
index 0000000..340cff7
--- /dev/null
@@ -0,0 +1,43 @@
+# FreeType 2 src/cache Jamfile
+#
+# Copyright 2001, 2003, 2004 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) cache ;
+
+# The file <freetype/ftcache.h> contains some macro definitions that are
+# later used in #include statements related to the cache sub-system.  It
+# needs to be parsed through a HDRMACRO rule for macro definitions.
+#
+HDRMACRO  [ FT2_SubDir  include ftcache.h ] ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = ftcmru
+               ftcmanag
+               ftccache
+               ftcglyph
+               ftcsbits
+               ftcimage
+               ftcbasic
+               ftccmap
+               ;
+  }
+  else
+  {
+    _sources = ftcache ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/cache Jamfile
diff --git a/src/cache/ftcache.c b/src/cache/ftcache.c
new file mode 100644 (file)
index 0000000..d41e91e
--- /dev/null
@@ -0,0 +1,31 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcache.c                                                              */
+/*                                                                         */
+/*    The FreeType Caching sub-system (body only).                         */
+/*                                                                         */
+/*  Copyright 2000-2001, 2003 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include <ft2build.h>
+#include "ftcmru.c"
+#include "ftcmanag.c"
+#include "ftccache.c"
+#include "ftccmap.c"
+#include "ftcglyph.c"
+#include "ftcimage.c"
+#include "ftcsbits.c"
+#include "ftcbasic.c"
+
+/* END */
diff --git a/src/cache/ftcbasic.c b/src/cache/ftcbasic.c
new file mode 100644 (file)
index 0000000..d4fc353
--- /dev/null
@@ -0,0 +1,855 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcbasic.c                                                             */
+/*                                                                         */
+/*    The FreeType basic cache interface (body).                           */
+/*                                                                         */
+/*  Copyright 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_CACHE_H
+#include "ftcglyph.h"
+#include "ftcimage.h"
+#include "ftcsbits.h"
+
+#include "ftccback.h"
+#include "ftcerror.h"
+
+#define FT_COMPONENT  trace_cache
+
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  /*
+   *  These structures correspond to the FTC_Font and FTC_ImageDesc types
+   *  that were defined in version 2.1.7.
+   */
+  typedef struct  FTC_OldFontRec_
+  {
+    FTC_FaceID  face_id;
+    FT_UShort   pix_width;
+    FT_UShort   pix_height;
+
+  } FTC_OldFontRec, *FTC_OldFont;
+
+
+  typedef struct  FTC_OldImageDescRec_
+  {
+    FTC_OldFontRec  font;
+    FT_UInt32       flags;
+
+  } FTC_OldImageDescRec, *FTC_OldImageDesc;
+
+
+  /*
+   *  Notice that FTC_OldImageDescRec and FTC_ImageTypeRec are nearly
+   *  identical, bit-wise.  The only difference is that the `width' and
+   *  `height' fields are expressed as 16-bit integers in the old structure,
+   *  and as normal `int' in the new one.
+   *
+   *  We are going to perform a weird hack to detect which structure is
+   *  being passed to the image and sbit caches.  If the new structure's
+   *  `width' is larger than 0x10000, we assume that we are really receiving
+   *  an FTC_OldImageDesc.
+   */
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+  /*
+   *  Basic Families
+   *
+   */
+  typedef struct  FTC_BasicAttrRec_
+  {
+    FTC_ScalerRec  scaler;
+    FT_UInt        load_flags;
+
+  } FTC_BasicAttrRec, *FTC_BasicAttrs;
+
+#define FTC_BASIC_ATTR_COMPARE( a, b )                                 \
+          FT_BOOL( FTC_SCALER_COMPARE( &(a)->scaler, &(b)->scaler ) && \
+                   (a)->load_flags == (b)->load_flags               )
+
+#define FTC_BASIC_ATTR_HASH( a )                                   \
+          ( FTC_SCALER_HASH( &(a)->scaler ) + 31*(a)->load_flags )
+
+
+  typedef struct  FTC_BasicQueryRec_
+  {
+    FTC_GQueryRec     gquery;
+    FTC_BasicAttrRec  attrs;
+
+  } FTC_BasicQueryRec, *FTC_BasicQuery;
+
+
+  typedef struct  FTC_BasicFamilyRec_
+  {
+    FTC_FamilyRec     family;
+    FTC_BasicAttrRec  attrs;
+
+  } FTC_BasicFamilyRec, *FTC_BasicFamily;
+
+
+  FT_CALLBACK_DEF( FT_Bool )
+  ftc_basic_family_compare( FTC_MruNode  ftcfamily,
+                            FT_Pointer   ftcquery )
+  {
+    FTC_BasicFamily  family = (FTC_BasicFamily)ftcfamily;
+    FTC_BasicQuery   query  = (FTC_BasicQuery)ftcquery;
+
+
+    return FTC_BASIC_ATTR_COMPARE( &family->attrs, &query->attrs );
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  ftc_basic_family_init( FTC_MruNode  ftcfamily,
+                         FT_Pointer   ftcquery,
+                         FT_Pointer   ftccache )
+  {
+    FTC_BasicFamily  family = (FTC_BasicFamily)ftcfamily;
+    FTC_BasicQuery   query  = (FTC_BasicQuery)ftcquery;
+    FTC_Cache        cache  = (FTC_Cache)ftccache;
+
+
+    FTC_Family_Init( FTC_FAMILY( family ), cache );
+    family->attrs = query->attrs;
+    return 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  ftc_basic_family_get_count( FTC_Family   ftcfamily,
+                              FTC_Manager  manager )
+  {
+    FTC_BasicFamily  family = (FTC_BasicFamily)ftcfamily;
+    FT_Error         error;
+    FT_Face          face;
+    FT_UInt          result = 0;
+
+
+    error = FTC_Manager_LookupFace( manager, family->attrs.scaler.face_id,
+                                    &face );
+
+    if ( error || !face )
+      return result;
+
+    if ( (FT_ULong)face->num_glyphs > FT_UINT_MAX || 0 > face->num_glyphs )
+    {
+      FT_TRACE1(( "ftc_basic_family_get_count: too large number of glyphs " ));
+      FT_TRACE1(( "in this face, truncated\n", face->num_glyphs ));
+    }
+
+    if ( !error )
+      result = (FT_UInt)face->num_glyphs;
+
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  ftc_basic_family_load_bitmap( FTC_Family   ftcfamily,
+                                FT_UInt      gindex,
+                                FTC_Manager  manager,
+                                FT_Face     *aface )
+  {
+    FTC_BasicFamily  family = (FTC_BasicFamily)ftcfamily;
+    FT_Error         error;
+    FT_Size          size;
+
+
+    error = FTC_Manager_LookupSize( manager, &family->attrs.scaler, &size );
+    if ( !error )
+    {
+      FT_Face  face = size->face;
+
+
+      error = FT_Load_Glyph( face, gindex,
+                             family->attrs.load_flags | FT_LOAD_RENDER );
+      if ( !error )
+        *aface = face;
+    }
+
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  ftc_basic_family_load_glyph( FTC_Family  ftcfamily,
+                               FT_UInt     gindex,
+                               FTC_Cache   cache,
+                               FT_Glyph   *aglyph )
+  {
+    FTC_BasicFamily  family = (FTC_BasicFamily)ftcfamily;
+    FT_Error         error;
+    FTC_Scaler       scaler = &family->attrs.scaler;
+    FT_Face          face;
+    FT_Size          size;
+
+
+    /* we will now load the glyph image */
+    error = FTC_Manager_LookupSize( cache->manager,
+                                    scaler,
+                                    &size );
+    if ( !error )
+    {
+      face = size->face;
+
+      error = FT_Load_Glyph( face, gindex, family->attrs.load_flags );
+      if ( !error )
+      {
+        if ( face->glyph->format == FT_GLYPH_FORMAT_BITMAP  ||
+             face->glyph->format == FT_GLYPH_FORMAT_OUTLINE )
+        {
+          /* ok, copy it */
+          FT_Glyph  glyph;
+
+
+          error = FT_Get_Glyph( face->glyph, &glyph );
+          if ( !error )
+          {
+            *aglyph = glyph;
+            goto Exit;
+          }
+        }
+        else
+          error = FTC_Err_Invalid_Argument;
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Bool )
+  ftc_basic_gnode_compare_faceid( FTC_Node    ftcgnode,
+                                  FT_Pointer  ftcface_id,
+                                  FTC_Cache   cache,
+                                  FT_Bool*    list_changed )
+  {
+    FTC_GNode        gnode   = (FTC_GNode)ftcgnode;
+    FTC_FaceID       face_id = (FTC_FaceID)ftcface_id;
+    FTC_BasicFamily  family  = (FTC_BasicFamily)gnode->family;
+    FT_Bool          result;
+
+
+    if ( list_changed )
+      *list_changed = FALSE;
+    result = FT_BOOL( family->attrs.scaler.face_id == face_id );
+    if ( result )
+    {
+      /* we must call this function to avoid this node from appearing
+       * in later lookups with the same face_id!
+       */
+      FTC_GNode_UnselectFamily( gnode, cache );
+    }
+    return result;
+  }
+
+
+ /*
+  *
+  * basic image cache
+  *
+  */
+
+  FT_CALLBACK_TABLE_DEF
+  const FTC_IFamilyClassRec  ftc_basic_image_family_class =
+  {
+    {
+      sizeof ( FTC_BasicFamilyRec ),
+      ftc_basic_family_compare,
+      ftc_basic_family_init,
+      0,                        /* FTC_MruNode_ResetFunc */
+      0                         /* FTC_MruNode_DoneFunc  */
+    },
+    ftc_basic_family_load_glyph
+  };
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FTC_GCacheClassRec  ftc_basic_image_cache_class =
+  {
+    {
+      ftc_inode_new,
+      ftc_inode_weight,
+      ftc_gnode_compare,
+      ftc_basic_gnode_compare_faceid,
+      ftc_inode_free,
+
+      sizeof ( FTC_GCacheRec ),
+      ftc_gcache_init,
+      ftc_gcache_done
+    },
+    (FTC_MruListClass)&ftc_basic_image_family_class
+  };
+
+
+  /* documentation is in ftcache.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FTC_ImageCache_New( FTC_Manager      manager,
+                      FTC_ImageCache  *acache )
+  {
+    return FTC_GCache_New( manager, &ftc_basic_image_cache_class,
+                           (FTC_GCache*)acache );
+  }
+
+
+  /* documentation is in ftcache.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FTC_ImageCache_Lookup( FTC_ImageCache  cache,
+                         FTC_ImageType   type,
+                         FT_UInt         gindex,
+                         FT_Glyph       *aglyph,
+                         FTC_Node       *anode )
+  {
+    FTC_BasicQueryRec  query;
+    FTC_Node           node = 0; /* make compiler happy */
+    FT_Error           error;
+    FT_PtrDist         hash;
+
+
+    /* some argument checks are delayed to FTC_Cache_Lookup */
+    if ( !aglyph )
+    {
+      error = FTC_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    *aglyph = NULL;
+    if ( anode )
+      *anode  = NULL;
+
+#if defined( FT_CONFIG_OPTION_OLD_INTERNALS ) && ( FT_INT_MAX > 0xFFFFU )
+
+    /*
+     *  This one is a major hack used to detect whether we are passed a
+     *  regular FTC_ImageType handle, or a legacy FTC_OldImageDesc one.
+     */
+    if ( (FT_ULong)type->width >= 0x10000L )
+    {
+      FTC_OldImageDesc  desc = (FTC_OldImageDesc)type;
+
+
+      query.attrs.scaler.face_id = desc->font.face_id;
+      query.attrs.scaler.width   = desc->font.pix_width;
+      query.attrs.scaler.height  = desc->font.pix_height;
+      query.attrs.load_flags     = desc->flags;
+    }
+    else
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+    {
+      if ( (FT_ULong)(type->flags - FT_INT_MIN) > FT_UINT_MAX )
+      {
+        FT_TRACE1(( "FTC_ImageCache_Lookup: higher bits in load_flags" ));
+        FT_TRACE1(( "0x%x are dropped\n", (type->flags & ~((FT_ULong)FT_UINT_MAX)) ));
+      }
+
+      query.attrs.scaler.face_id = type->face_id;
+      query.attrs.scaler.width   = type->width;
+      query.attrs.scaler.height  = type->height;
+      query.attrs.load_flags     = (FT_UInt)type->flags;
+    }
+
+    query.attrs.scaler.pixel = 1;
+    query.attrs.scaler.x_res = 0;  /* make compilers happy */
+    query.attrs.scaler.y_res = 0;
+
+    hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + gindex;
+
+#if 1  /* inlining is about 50% faster! */
+    FTC_GCACHE_LOOKUP_CMP( cache,
+                           ftc_basic_family_compare,
+                           FTC_GNode_Compare,
+                           hash, gindex,
+                           &query,
+                           node,
+                           error );
+#else
+    error = FTC_GCache_Lookup( FTC_GCACHE( cache ),
+                               hash, gindex,
+                               FTC_GQUERY( &query ),
+                               &node );
+#endif
+    if ( !error )
+    {
+      *aglyph = FTC_INODE( node )->glyph;
+
+      if ( anode )
+      {
+        *anode = node;
+        node->ref_count++;
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftcache.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FTC_ImageCache_LookupScaler( FTC_ImageCache  cache,
+                               FTC_Scaler      scaler,
+                               FT_ULong        load_flags,
+                               FT_UInt         gindex,
+                               FT_Glyph       *aglyph,
+                               FTC_Node       *anode )
+  {
+    FTC_BasicQueryRec  query;
+    FTC_Node           node = 0; /* make compiler happy */
+    FT_Error           error;
+    FT_PtrDist         hash;
+
+
+    /* some argument checks are delayed to FTC_Cache_Lookup */
+    if ( !aglyph || !scaler )
+    {
+      error = FTC_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    *aglyph = NULL;
+    if ( anode )
+      *anode  = NULL;
+
+    /* FT_Load_Glyph(), FT_Load_Char() take FT_UInt flags */
+    if ( load_flags > FT_UINT_MAX )
+    {
+      FT_TRACE1(( "FTC_ImageCache_LookupScaler: higher bits in load_flags" ));
+      FT_TRACE1(( "0x%x are dropped\n", (load_flags & ~((FT_ULong)FT_UINT_MAX)) ));
+    }
+
+    query.attrs.scaler     = scaler[0];
+    query.attrs.load_flags = (FT_UInt)load_flags;
+
+    hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + gindex;
+
+    FTC_GCACHE_LOOKUP_CMP( cache,
+                           ftc_basic_family_compare,
+                           FTC_GNode_Compare,
+                           hash, gindex,
+                           &query,
+                           node,
+                           error );
+    if ( !error )
+    {
+      *aglyph = FTC_INODE( node )->glyph;
+
+      if ( anode )
+      {
+        *anode = node;
+        node->ref_count++;
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  /* yet another backwards-legacy structure */
+  typedef struct  FTC_OldImage_Desc_
+  {
+    FTC_FontRec  font;
+    FT_UInt      image_type;
+
+  } FTC_OldImage_Desc;
+
+
+#define FTC_OLD_IMAGE_FORMAT( x )  ( (x) & 7 )
+
+
+#define ftc_old_image_format_bitmap    0x0000
+#define ftc_old_image_format_outline   0x0001
+
+#define ftc_old_image_format_mask      0x000F
+
+#define ftc_old_image_flag_monochrome  0x0010
+#define ftc_old_image_flag_unhinted    0x0020
+#define ftc_old_image_flag_autohinted  0x0040
+#define ftc_old_image_flag_unscaled    0x0080
+#define ftc_old_image_flag_no_sbits    0x0100
+
+  /* monochrome bitmap */
+#define ftc_old_image_mono             ftc_old_image_format_bitmap   | \
+                                       ftc_old_image_flag_monochrome
+
+  /* anti-aliased bitmap */
+#define ftc_old_image_grays            ftc_old_image_format_bitmap
+
+  /* scaled outline */
+#define ftc_old_image_outline          ftc_old_image_format_outline
+
+
+  static void
+  ftc_image_type_from_old_desc( FTC_ImageType       typ,
+                                FTC_OldImage_Desc*  desc )
+  {
+    typ->face_id = desc->font.face_id;
+    typ->width   = desc->font.pix_width;
+    typ->height  = desc->font.pix_height;
+
+    /* convert image type flags to load flags */
+    {
+      FT_UInt  load_flags = FT_LOAD_DEFAULT;
+      FT_UInt  type       = desc->image_type;
+
+
+      /* determine load flags, depending on the font description's */
+      /* image type                                                */
+
+      if ( FTC_OLD_IMAGE_FORMAT( type ) == ftc_old_image_format_bitmap )
+      {
+        if ( type & ftc_old_image_flag_monochrome )
+          load_flags |= FT_LOAD_MONOCHROME;
+
+        /* disable embedded bitmaps loading if necessary */
+        if ( type & ftc_old_image_flag_no_sbits )
+          load_flags |= FT_LOAD_NO_BITMAP;
+      }
+      else
+      {
+        /* we want an outline, don't load embedded bitmaps */
+        load_flags |= FT_LOAD_NO_BITMAP;
+
+        if ( type & ftc_old_image_flag_unscaled )
+          load_flags |= FT_LOAD_NO_SCALE;
+      }
+
+      /* always render glyphs to bitmaps */
+      load_flags |= FT_LOAD_RENDER;
+
+      if ( type & ftc_old_image_flag_unhinted )
+        load_flags |= FT_LOAD_NO_HINTING;
+
+      if ( type & ftc_old_image_flag_autohinted )
+        load_flags |= FT_LOAD_FORCE_AUTOHINT;
+
+      typ->flags = load_flags;
+    }
+  }
+
+
+  FT_EXPORT( FT_Error )
+  FTC_Image_Cache_New( FTC_Manager      manager,
+                       FTC_ImageCache  *acache );
+
+  FT_EXPORT( FT_Error )
+  FTC_Image_Cache_Lookup( FTC_ImageCache      icache,
+                          FTC_OldImage_Desc*  desc,
+                          FT_UInt             gindex,
+                          FT_Glyph           *aglyph );
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FTC_Image_Cache_New( FTC_Manager      manager,
+                       FTC_ImageCache  *acache )
+  {
+    return FTC_ImageCache_New( manager, (FTC_ImageCache*)acache );
+  }
+
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FTC_Image_Cache_Lookup( FTC_ImageCache      icache,
+                          FTC_OldImage_Desc*  desc,
+                          FT_UInt             gindex,
+                          FT_Glyph           *aglyph )
+  {
+    FTC_ImageTypeRec  type0;
+
+
+    if ( !desc )
+      return FTC_Err_Invalid_Argument;
+
+    ftc_image_type_from_old_desc( &type0, desc );
+
+    return FTC_ImageCache_Lookup( (FTC_ImageCache)icache,
+                                   &type0,
+                                   gindex,
+                                   aglyph,
+                                   NULL );
+  }
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+ /*
+  *
+  * basic small bitmap cache
+  *
+  */
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FTC_SFamilyClassRec  ftc_basic_sbit_family_class =
+  {
+    {
+      sizeof ( FTC_BasicFamilyRec ),
+      ftc_basic_family_compare,
+      ftc_basic_family_init,
+      0,                            /* FTC_MruNode_ResetFunc */
+      0                             /* FTC_MruNode_DoneFunc  */
+    },
+    ftc_basic_family_get_count,
+    ftc_basic_family_load_bitmap
+  };
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FTC_GCacheClassRec  ftc_basic_sbit_cache_class =
+  {
+    {
+      ftc_snode_new,
+      ftc_snode_weight,
+      ftc_snode_compare,
+      ftc_basic_gnode_compare_faceid,
+      ftc_snode_free,
+
+      sizeof ( FTC_GCacheRec ),
+      ftc_gcache_init,
+      ftc_gcache_done
+    },
+    (FTC_MruListClass)&ftc_basic_sbit_family_class
+  };
+
+
+  /* documentation is in ftcache.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FTC_SBitCache_New( FTC_Manager     manager,
+                     FTC_SBitCache  *acache )
+  {
+    return FTC_GCache_New( manager, &ftc_basic_sbit_cache_class,
+                           (FTC_GCache*)acache );
+  }
+
+
+  /* documentation is in ftcache.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FTC_SBitCache_Lookup( FTC_SBitCache  cache,
+                        FTC_ImageType  type,
+                        FT_UInt        gindex,
+                        FTC_SBit      *ansbit,
+                        FTC_Node      *anode )
+  {
+    FT_Error           error;
+    FTC_BasicQueryRec  query;
+    FTC_Node           node = 0; /* make compiler happy */
+    FT_PtrDist         hash;
+
+
+    if ( anode )
+      *anode = NULL;
+
+    /* other argument checks delayed to FTC_Cache_Lookup */
+    if ( !ansbit )
+      return FTC_Err_Invalid_Argument;
+
+    *ansbit = NULL;
+
+#if defined( FT_CONFIG_OPTION_OLD_INTERNALS ) && ( FT_INT_MAX > 0xFFFFU )
+
+    /*  This one is a major hack used to detect whether we are passed a
+     *  regular FTC_ImageType handle, or a legacy FTC_OldImageDesc one.
+     */
+    if ( (FT_ULong)type->width >= 0x10000L )
+    {
+      FTC_OldImageDesc  desc = (FTC_OldImageDesc)type;
+
+
+      query.attrs.scaler.face_id = desc->font.face_id;
+      query.attrs.scaler.width   = desc->font.pix_width;
+      query.attrs.scaler.height  = desc->font.pix_height;
+      query.attrs.load_flags     = desc->flags;
+    }
+    else
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+    {
+      if ( (FT_ULong)(type->flags - FT_INT_MIN) > FT_UINT_MAX )
+      {
+        FT_TRACE1(( "FTC_ImageCache_Lookup: higher bits in load_flags" ));
+        FT_TRACE1(( "0x%x are dropped\n", (type->flags & ~((FT_ULong)FT_UINT_MAX)) ));
+      }
+
+      query.attrs.scaler.face_id = type->face_id;
+      query.attrs.scaler.width   = type->width;
+      query.attrs.scaler.height  = type->height;
+      query.attrs.load_flags     = (FT_UInt)type->flags;
+    }
+
+    query.attrs.scaler.pixel = 1;
+    query.attrs.scaler.x_res = 0;  /* make compilers happy */
+    query.attrs.scaler.y_res = 0;
+
+    /* beware, the hash must be the same for all glyph ranges! */
+    hash = FTC_BASIC_ATTR_HASH( &query.attrs ) +
+           gindex / FTC_SBIT_ITEMS_PER_NODE;
+
+#if 1  /* inlining is about 50% faster! */
+    FTC_GCACHE_LOOKUP_CMP( cache,
+                           ftc_basic_family_compare,
+                           FTC_SNode_Compare,
+                           hash, gindex,
+                           &query,
+                           node,
+                           error );
+#else
+    error = FTC_GCache_Lookup( FTC_GCACHE( cache ),
+                               hash,
+                               gindex,
+                               FTC_GQUERY( &query ),
+                               &node );
+#endif
+    if ( error )
+      goto Exit;
+
+    *ansbit = FTC_SNODE( node )->sbits +
+              ( gindex - FTC_GNODE( node )->gindex );
+
+    if ( anode )
+    {
+      *anode = node;
+      node->ref_count++;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftcache.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FTC_SBitCache_LookupScaler( FTC_SBitCache  cache,
+                              FTC_Scaler     scaler,
+                              FT_ULong       load_flags,
+                              FT_UInt        gindex,
+                              FTC_SBit      *ansbit,
+                              FTC_Node      *anode )
+  {
+    FT_Error           error;
+    FTC_BasicQueryRec  query;
+    FTC_Node           node = 0; /* make compiler happy */
+    FT_PtrDist         hash;
+
+
+    if ( anode )
+        *anode = NULL;
+
+    /* other argument checks delayed to FTC_Cache_Lookup */
+    if ( !ansbit || !scaler )
+        return FTC_Err_Invalid_Argument;
+
+    *ansbit = NULL;
+
+    /* FT_Load_Glyph(), FT_Load_Char() take FT_UInt flags */
+    if ( load_flags > FT_UINT_MAX )
+    {
+      FT_TRACE1(( "FTC_ImageCache_LookupScaler: higher bits in load_flags" ));
+      FT_TRACE1(( "0x%x are dropped\n", (load_flags & ~((FT_ULong)FT_UINT_MAX)) ));
+    }
+
+    query.attrs.scaler     = scaler[0];
+    query.attrs.load_flags = (FT_UInt)load_flags;
+
+    /* beware, the hash must be the same for all glyph ranges! */
+    hash = FTC_BASIC_ATTR_HASH( &query.attrs ) +
+             gindex / FTC_SBIT_ITEMS_PER_NODE;
+
+    FTC_GCACHE_LOOKUP_CMP( cache,
+                           ftc_basic_family_compare,
+                           FTC_SNode_Compare,
+                           hash, gindex,
+                           &query,
+                           node,
+                           error );
+    if ( error )
+      goto Exit;
+
+    *ansbit = FTC_SNODE( node )->sbits +
+              ( gindex - FTC_GNODE( node )->gindex );
+
+    if ( anode )
+    {
+      *anode = node;
+      node->ref_count++;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  FT_EXPORT( FT_Error )
+  FTC_SBit_Cache_New( FTC_Manager     manager,
+                      FTC_SBitCache  *acache );
+
+  FT_EXPORT( FT_Error )
+  FTC_SBit_Cache_Lookup( FTC_SBitCache       cache,
+                         FTC_OldImage_Desc*  desc,
+                         FT_UInt             gindex,
+                         FTC_SBit           *ansbit );
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FTC_SBit_Cache_New( FTC_Manager     manager,
+                      FTC_SBitCache  *acache )
+  {
+    return FTC_SBitCache_New( manager, (FTC_SBitCache*)acache );
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FTC_SBit_Cache_Lookup( FTC_SBitCache       cache,
+                         FTC_OldImage_Desc*  desc,
+                         FT_UInt             gindex,
+                         FTC_SBit           *ansbit )
+  {
+    FTC_ImageTypeRec  type0;
+
+
+    if ( !desc )
+      return FTC_Err_Invalid_Argument;
+
+    ftc_image_type_from_old_desc( &type0, desc );
+
+    return FTC_SBitCache_Lookup( (FTC_SBitCache)cache,
+                                  &type0,
+                                  gindex,
+                                  ansbit,
+                                  NULL );
+  }
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+/* END */
diff --git a/src/cache/ftccache.c b/src/cache/ftccache.c
new file mode 100644 (file)
index 0000000..f01c403
--- /dev/null
@@ -0,0 +1,626 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftccache.c                                                             */
+/*                                                                         */
+/*    The FreeType internal cache interface (body).                        */
+/*                                                                         */
+/*  Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010,   */
+/*            2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include "ftcmanag.h"
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_DEBUG_H
+
+#include "ftccback.h"
+#include "ftcerror.h"
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cache
+
+
+#define FTC_HASH_MAX_LOAD  2
+#define FTC_HASH_MIN_LOAD  1
+#define FTC_HASH_SUB_LOAD  ( FTC_HASH_MAX_LOAD - FTC_HASH_MIN_LOAD )
+
+  /* this one _must_ be a power of 2! */
+#define FTC_HASH_INITIAL_SIZE  8
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                   CACHE NODE DEFINITIONS                      *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* add a new node to the head of the manager's circular MRU list */
+  static void
+  ftc_node_mru_link( FTC_Node     node,
+                     FTC_Manager  manager )
+  {
+    void  *nl = &manager->nodes_list;
+
+
+    FTC_MruNode_Prepend( (FTC_MruNode*)nl,
+                         (FTC_MruNode)node );
+    manager->num_nodes++;
+  }
+
+
+  /* remove a node from the manager's MRU list */
+  static void
+  ftc_node_mru_unlink( FTC_Node     node,
+                       FTC_Manager  manager )
+  {
+    void  *nl = &manager->nodes_list;
+
+
+    FTC_MruNode_Remove( (FTC_MruNode*)nl,
+                        (FTC_MruNode)node );
+    manager->num_nodes--;
+  }
+
+
+#ifndef FTC_INLINE
+
+  /* move a node to the head of the manager's MRU list */
+  static void
+  ftc_node_mru_up( FTC_Node     node,
+                   FTC_Manager  manager )
+  {
+    FTC_MruNode_Up( (FTC_MruNode*)&manager->nodes_list,
+                    (FTC_MruNode)node );
+  }
+
+
+  /* get a top bucket for specified hash from cache,
+   * body for FTC_NODE__TOP_FOR_HASH( cache, hash )
+   */
+  FT_LOCAL_DEF( FTC_Node* )
+  ftc_get_top_node_for_hash( FTC_Cache   cache,
+                             FT_PtrDist  hash )
+  {
+    FTC_Node*  pnode;
+    FT_UInt    idx;
+
+
+    idx = (FT_UInt)( hash & cache->mask );
+    if ( idx < cache->p )
+      idx = (FT_UInt)( hash & ( 2 * cache->mask + 1 ) );
+    pnode = cache->buckets + idx;
+    return pnode;
+  }
+
+#endif /* !FTC_INLINE */
+
+
+  /* Note that this function cannot fail.  If we cannot re-size the
+   * buckets array appropriately, we simply degrade the hash table's
+   * performance!
+   */
+  static void
+  ftc_cache_resize( FTC_Cache  cache )
+  {
+    for (;;)
+    {
+      FTC_Node  node, *pnode;
+      FT_UFast  p     = cache->p;
+      FT_UFast  mask  = cache->mask;
+      FT_UFast  count = mask + p + 1;    /* number of buckets */
+
+
+      /* do we need to shrink the buckets array? */
+      if ( cache->slack < 0 )
+      {
+        FTC_Node  new_list = NULL;
+
+
+        /* try to expand the buckets array _before_ splitting
+         * the bucket lists
+         */
+        if ( p >= mask )
+        {
+          FT_Memory  memory = cache->memory;
+          FT_Error   error;
+
+
+          /* if we can't expand the array, leave immediately */
+          if ( FT_RENEW_ARRAY( cache->buckets,
+                               ( mask + 1 ) * 2, ( mask + 1 ) * 4 ) )
+            break;
+        }
+
+        /* split a single bucket */
+        pnode = cache->buckets + p;
+
+        for (;;)
+        {
+          node = *pnode;
+          if ( node == NULL )
+            break;
+
+          if ( node->hash & ( mask + 1 ) )
+          {
+            *pnode     = node->link;
+            node->link = new_list;
+            new_list   = node;
+          }
+          else
+            pnode = &node->link;
+        }
+
+        cache->buckets[p + mask + 1] = new_list;
+
+        cache->slack += FTC_HASH_MAX_LOAD;
+
+        if ( p >= mask )
+        {
+          cache->mask = 2 * mask + 1;
+          cache->p    = 0;
+        }
+        else
+          cache->p = p + 1;
+      }
+
+      /* do we need to expand the buckets array? */
+      else if ( cache->slack > (FT_Long)count * FTC_HASH_SUB_LOAD )
+      {
+        FT_UFast   old_index = p + mask;
+        FTC_Node*  pold;
+
+
+        if ( old_index + 1 <= FTC_HASH_INITIAL_SIZE )
+          break;
+
+        if ( p == 0 )
+        {
+          FT_Memory  memory = cache->memory;
+          FT_Error   error;
+
+
+          /* if we can't shrink the array, leave immediately */
+          if ( FT_RENEW_ARRAY( cache->buckets,
+                               ( mask + 1 ) * 2, mask + 1 ) )
+            break;
+
+          cache->mask >>= 1;
+          p             = cache->mask;
+        }
+        else
+          p--;
+
+        pnode = cache->buckets + p;
+        while ( *pnode )
+          pnode = &(*pnode)->link;
+
+        pold   = cache->buckets + old_index;
+        *pnode = *pold;
+        *pold  = NULL;
+
+        cache->slack -= FTC_HASH_MAX_LOAD;
+        cache->p      = p;
+      }
+
+      /* otherwise, the hash table is balanced */
+      else
+        break;
+    }
+  }
+
+
+  /* remove a node from its cache's hash table */
+  static void
+  ftc_node_hash_unlink( FTC_Node   node0,
+                        FTC_Cache  cache )
+  {
+    FTC_Node  *pnode = FTC_NODE__TOP_FOR_HASH( cache, node0->hash );
+
+
+    for (;;)
+    {
+      FTC_Node  node = *pnode;
+
+
+      if ( node == NULL )
+      {
+        FT_TRACE0(( "ftc_node_hash_unlink: unknown node\n" ));
+        return;
+      }
+
+      if ( node == node0 )
+        break;
+
+      pnode = &(*pnode)->link;
+    }
+
+    *pnode      = node0->link;
+    node0->link = NULL;
+
+    cache->slack++;
+    ftc_cache_resize( cache );
+  }
+
+
+  /* add a node to the `top' of its cache's hash table */
+  static void
+  ftc_node_hash_link( FTC_Node   node,
+                      FTC_Cache  cache )
+  {
+    FTC_Node  *pnode = FTC_NODE__TOP_FOR_HASH( cache, node->hash );
+
+
+    node->link = *pnode;
+    *pnode     = node;
+
+    cache->slack--;
+    ftc_cache_resize( cache );
+  }
+
+
+  /* remove a node from the cache manager */
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+  FT_BASE_DEF( void )
+#else
+  FT_LOCAL_DEF( void )
+#endif
+  ftc_node_destroy( FTC_Node     node,
+                    FTC_Manager  manager )
+  {
+    FTC_Cache  cache;
+
+
+#ifdef FT_DEBUG_ERROR
+    /* find node's cache */
+    if ( node->cache_index >= manager->num_caches )
+    {
+      FT_TRACE0(( "ftc_node_destroy: invalid node handle\n" ));
+      return;
+    }
+#endif
+
+    cache = manager->caches[node->cache_index];
+
+#ifdef FT_DEBUG_ERROR
+    if ( cache == NULL )
+    {
+      FT_TRACE0(( "ftc_node_destroy: invalid node handle\n" ));
+      return;
+    }
+#endif
+
+    manager->cur_weight -= cache->clazz.node_weight( node, cache );
+
+    /* remove node from mru list */
+    ftc_node_mru_unlink( node, manager );
+
+    /* remove node from cache's hash table */
+    ftc_node_hash_unlink( node, cache );
+
+    /* now finalize it */
+    cache->clazz.node_free( node, cache );
+
+#if 0
+    /* check, just in case of general corruption :-) */
+    if ( manager->num_nodes == 0 )
+      FT_TRACE0(( "ftc_node_destroy: invalid cache node count (%d)\n",
+                  manager->num_nodes ));
+#endif
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    ABSTRACT CACHE CLASS                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_LOCAL_DEF( FT_Error )
+  FTC_Cache_Init( FTC_Cache  cache )
+  {
+    return ftc_cache_init( cache );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  ftc_cache_init( FTC_Cache  cache )
+  {
+    FT_Memory  memory = cache->memory;
+    FT_Error   error;
+
+
+    cache->p     = 0;
+    cache->mask  = FTC_HASH_INITIAL_SIZE - 1;
+    cache->slack = FTC_HASH_INITIAL_SIZE * FTC_HASH_MAX_LOAD;
+
+    (void)FT_NEW_ARRAY( cache->buckets, FTC_HASH_INITIAL_SIZE * 2 );
+    return error;
+  }
+
+
+  static void
+  FTC_Cache_Clear( FTC_Cache  cache )
+  {
+    if ( cache && cache->buckets )
+    {
+      FTC_Manager  manager = cache->manager;
+      FT_UFast     i;
+      FT_UFast     count;
+
+
+      count = cache->p + cache->mask + 1;
+
+      for ( i = 0; i < count; i++ )
+      {
+        FTC_Node  *pnode = cache->buckets + i, next, node = *pnode;
+
+
+        while ( node )
+        {
+          next        = node->link;
+          node->link  = NULL;
+
+          /* remove node from mru list */
+          ftc_node_mru_unlink( node, manager );
+
+          /* now finalize it */
+          manager->cur_weight -= cache->clazz.node_weight( node, cache );
+
+          cache->clazz.node_free( node, cache );
+          node = next;
+        }
+        cache->buckets[i] = NULL;
+      }
+      ftc_cache_resize( cache );
+    }
+  }
+
+
+  FT_LOCAL_DEF( void )
+  ftc_cache_done( FTC_Cache  cache )
+  {
+    if ( cache->memory )
+    {
+      FT_Memory  memory = cache->memory;
+
+
+      FTC_Cache_Clear( cache );
+
+      FT_FREE( cache->buckets );
+      cache->mask  = 0;
+      cache->p     = 0;
+      cache->slack = 0;
+
+      cache->memory = NULL;
+    }
+  }
+
+
+  FT_LOCAL_DEF( void )
+  FTC_Cache_Done( FTC_Cache  cache )
+  {
+    ftc_cache_done( cache );
+  }
+
+
+  static void
+  ftc_cache_add( FTC_Cache  cache,
+                 FT_PtrDist hash,
+                 FTC_Node   node )
+  {
+    node->hash        = hash;
+    node->cache_index = (FT_UInt16)cache->index;
+    node->ref_count   = 0;
+
+    ftc_node_hash_link( node, cache );
+    ftc_node_mru_link( node, cache->manager );
+
+    {
+      FTC_Manager  manager = cache->manager;
+
+
+      manager->cur_weight += cache->clazz.node_weight( node, cache );
+
+      if ( manager->cur_weight >= manager->max_weight )
+      {
+        node->ref_count++;
+        FTC_Manager_Compress( manager );
+        node->ref_count--;
+      }
+    }
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  FTC_Cache_NewNode( FTC_Cache   cache,
+                     FT_PtrDist  hash,
+                     FT_Pointer  query,
+                     FTC_Node   *anode )
+  {
+    FT_Error  error;
+    FTC_Node  node;
+
+
+    /*
+     * We use the FTC_CACHE_TRYLOOP macros to support out-of-memory
+     * errors (OOM) correctly, i.e., by flushing the cache progressively
+     * in order to make more room.
+     */
+
+    FTC_CACHE_TRYLOOP( cache )
+    {
+      error = cache->clazz.node_new( &node, query, cache );
+    }
+    FTC_CACHE_TRYLOOP_END( NULL );
+
+    if ( error )
+      node = NULL;
+    else
+    {
+     /* don't assume that the cache has the same number of buckets, since
+      * our allocation request might have triggered global cache flushing
+      */
+      ftc_cache_add( cache, hash, node );
+    }
+
+    *anode = node;
+    return error;
+  }
+
+
+#ifndef FTC_INLINE
+
+  FT_LOCAL_DEF( FT_Error )
+  FTC_Cache_Lookup( FTC_Cache   cache,
+                    FT_PtrDist  hash,
+                    FT_Pointer  query,
+                    FTC_Node   *anode )
+  {
+    FTC_Node*  bucket;
+    FTC_Node*  pnode;
+    FTC_Node   node;
+    FT_Error   error        = FTC_Err_Ok;
+    FT_Bool    list_changed = FALSE;
+
+    FTC_Node_CompareFunc  compare = cache->clazz.node_compare;
+
+
+    if ( cache == NULL || anode == NULL )
+      return FTC_Err_Invalid_Argument;
+
+    /* Go to the `top' node of the list sharing same masked hash */
+    bucket = pnode = FTC_NODE__TOP_FOR_HASH( cache, hash );
+
+    /* Lookup a node with exactly same hash and queried properties.  */
+    /* NOTE: _nodcomp() may change the linked list to reduce memory. */
+    for (;;)
+    {
+      node = *pnode;
+      if ( node == NULL )
+        goto NewNode;
+
+      if ( node->hash == hash                           &&
+           compare( node, query, cache, &list_changed ) )
+        break;
+
+      pnode = &node->link;
+    }
+
+    if ( list_changed )
+    {
+      /* Update bucket by modified linked list */
+      bucket = pnode = FTC_NODE__TOP_FOR_HASH( cache, hash );
+
+      /* Update pnode by modified linked list */
+      while ( *pnode != node )
+      {
+        if ( *pnode == NULL )
+        {
+          FT_ERROR(( "FTC_Cache_Lookup: oops!!!  node missing\n" ));
+          goto NewNode;
+        }
+        else
+          pnode = &((*pnode)->link);
+      }
+    }
+
+    /* Reorder the list to move the found node to the `top' */
+    if ( node != *bucket )
+    {
+      *pnode     = node->link;
+      node->link = *bucket;
+      *bucket    = node;
+    }
+
+    /* move to head of MRU list */
+    {
+      FTC_Manager  manager = cache->manager;
+
+
+      if ( node != manager->nodes_list )
+        ftc_node_mru_up( node, manager );
+    }
+    *anode = node;
+
+    return error;
+
+  NewNode:
+    return FTC_Cache_NewNode( cache, hash, query, anode );
+  }
+
+#endif /* !FTC_INLINE */
+
+
+  FT_LOCAL_DEF( void )
+  FTC_Cache_RemoveFaceID( FTC_Cache   cache,
+                          FTC_FaceID  face_id )
+  {
+    FT_UFast     i, count;
+    FTC_Manager  manager = cache->manager;
+    FTC_Node     frees   = NULL;
+
+
+    count = cache->p + cache->mask + 1;
+    for ( i = 0; i < count; i++ )
+    {
+      FTC_Node*  bucket = cache->buckets + i;
+      FTC_Node*  pnode  = bucket;
+
+
+      for ( ;; )
+      {
+        FTC_Node  node = *pnode;
+        FT_Bool   list_changed = FALSE;
+
+
+        if ( node == NULL )
+          break;
+
+        if ( cache->clazz.node_remove_faceid( node, face_id,
+                                              cache, &list_changed ) )
+        {
+          *pnode     = node->link;
+          node->link = frees;
+          frees      = node;
+        }
+        else
+          pnode = &node->link;
+      }
+    }
+
+    /* remove all nodes in the free list */
+    while ( frees )
+    {
+      FTC_Node  node;
+
+
+      node  = frees;
+      frees = node->link;
+
+      manager->cur_weight -= cache->clazz.node_weight( node, cache );
+      ftc_node_mru_unlink( node, manager );
+
+      cache->clazz.node_free( node, cache );
+
+      cache->slack++;
+    }
+
+    ftc_cache_resize( cache );
+  }
+
+
+/* END */
diff --git a/src/cache/ftccache.h b/src/cache/ftccache.h
new file mode 100644 (file)
index 0000000..d60984f
--- /dev/null
@@ -0,0 +1,359 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftccache.h                                                             */
+/*                                                                         */
+/*    FreeType internal cache interface (specification).                   */
+/*                                                                         */
+/*  Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010,   */
+/*            2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTCCACHE_H__
+#define __FTCCACHE_H__
+
+
+#include "ftcmru.h"
+
+FT_BEGIN_HEADER
+
+#define _FTC_FACE_ID_HASH( i )                                                \
+          ((FT_PtrDist)(( (FT_PtrDist)(i) >> 3 ) ^ ( (FT_PtrDist)(i) << 7 )))
+
+  /* handle to cache object */
+  typedef struct FTC_CacheRec_*  FTC_Cache;
+
+  /* handle to cache class */
+  typedef const struct FTC_CacheClassRec_*  FTC_CacheClass;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                   CACHE NODE DEFINITIONS                      *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Each cache controls one or more cache nodes.  Each node is part of    */
+  /* the global_lru list of the manager.  Its `data' field however is used */
+  /* as a reference count for now.                                         */
+  /*                                                                       */
+  /* A node can be anything, depending on the type of information held by  */
+  /* the cache.  It can be an individual glyph image, a set of bitmaps     */
+  /* glyphs for a given size, some metrics, etc.                           */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /* structure size should be 20 bytes on 32-bits machines */
+  typedef struct  FTC_NodeRec_
+  {
+    FTC_MruNodeRec  mru;          /* circular mru list pointer           */
+    FTC_Node        link;         /* used for hashing                    */
+    FT_PtrDist      hash;         /* used for hashing too                */
+    FT_UShort       cache_index;  /* index of cache the node belongs to  */
+    FT_Short        ref_count;    /* reference count for this node       */
+
+  } FTC_NodeRec;
+
+
+#define FTC_NODE( x )    ( (FTC_Node)(x) )
+#define FTC_NODE_P( x )  ( (FTC_Node*)(x) )
+
+#define FTC_NODE__NEXT( x )  FTC_NODE( (x)->mru.next )
+#define FTC_NODE__PREV( x )  FTC_NODE( (x)->mru.prev )
+
+#ifdef FTC_INLINE
+#define FTC_NODE__TOP_FOR_HASH( cache, hash )                     \
+        ( ( cache )->buckets +                                    \
+            ( ( ( ( hash ) &   ( cache )->mask ) < ( cache )->p ) \
+              ? ( ( hash ) & ( ( cache )->mask * 2 + 1 ) )        \
+              : ( ( hash ) &   ( cache )->mask ) ) )
+#else
+  FT_LOCAL( FTC_Node* )
+  ftc_get_top_node_for_hash( FTC_Cache   cache,
+                             FT_PtrDist  hash );
+#define FTC_NODE__TOP_FOR_HASH( cache, hash )            \
+        ftc_get_top_node_for_hash( ( cache ), ( hash ) )
+#endif
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+  FT_BASE( void )
+  ftc_node_destroy( FTC_Node     node,
+                    FTC_Manager  manager );
+#endif
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       CACHE DEFINITIONS                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* initialize a new cache node */
+  typedef FT_Error
+  (*FTC_Node_NewFunc)( FTC_Node    *pnode,
+                       FT_Pointer   query,
+                       FTC_Cache    cache );
+
+  typedef FT_Offset
+  (*FTC_Node_WeightFunc)( FTC_Node   node,
+                          FTC_Cache  cache );
+
+  /* compare a node to a given key pair */
+  typedef FT_Bool
+  (*FTC_Node_CompareFunc)( FTC_Node    node,
+                           FT_Pointer  key,
+                           FTC_Cache   cache,
+                           FT_Bool*    list_changed );
+
+
+  typedef void
+  (*FTC_Node_FreeFunc)( FTC_Node   node,
+                        FTC_Cache  cache );
+
+  typedef FT_Error
+  (*FTC_Cache_InitFunc)( FTC_Cache  cache );
+
+  typedef void
+  (*FTC_Cache_DoneFunc)( FTC_Cache  cache );
+
+
+  typedef struct  FTC_CacheClassRec_
+  {
+    FTC_Node_NewFunc      node_new;
+    FTC_Node_WeightFunc   node_weight;
+    FTC_Node_CompareFunc  node_compare;
+    FTC_Node_CompareFunc  node_remove_faceid;
+    FTC_Node_FreeFunc     node_free;
+
+    FT_Offset             cache_size;
+    FTC_Cache_InitFunc    cache_init;
+    FTC_Cache_DoneFunc    cache_done;
+
+  } FTC_CacheClassRec;
+
+
+  /* each cache really implements a dynamic hash table to manage its nodes */
+  typedef struct  FTC_CacheRec_
+  {
+    FT_UFast           p;
+    FT_UFast           mask;
+    FT_Long            slack;
+    FTC_Node*          buckets;
+
+    FTC_CacheClassRec  clazz;       /* local copy, for speed  */
+
+    FTC_Manager        manager;
+    FT_Memory          memory;
+    FT_UInt            index;       /* in manager's table     */
+
+    FTC_CacheClass     org_class;   /* original class pointer */
+
+  } FTC_CacheRec;
+
+
+#define FTC_CACHE( x )    ( (FTC_Cache)(x) )
+#define FTC_CACHE_P( x )  ( (FTC_Cache*)(x) )
+
+
+  /* default cache initialize */
+  FT_LOCAL( FT_Error )
+  FTC_Cache_Init( FTC_Cache  cache );
+
+  /* default cache finalizer */
+  FT_LOCAL( void )
+  FTC_Cache_Done( FTC_Cache  cache );
+
+  /* Call this function to look up the cache.  If no corresponding
+   * node is found, a new one is automatically created.  This function
+   * is capable of flushing the cache adequately to make room for the
+   * new cache object.
+   */
+
+#ifndef FTC_INLINE
+  FT_LOCAL( FT_Error )
+  FTC_Cache_Lookup( FTC_Cache   cache,
+                    FT_PtrDist  hash,
+                    FT_Pointer  query,
+                    FTC_Node   *anode );
+#endif
+
+  FT_LOCAL( FT_Error )
+  FTC_Cache_NewNode( FTC_Cache   cache,
+                     FT_PtrDist  hash,
+                     FT_Pointer  query,
+                     FTC_Node   *anode );
+
+  /* Remove all nodes that relate to a given face_id.  This is useful
+   * when un-installing fonts.  Note that if a cache node relates to
+   * the face_id but is locked (i.e., has `ref_count > 0'), the node
+   * will _not_ be destroyed, but its internal face_id reference will
+   * be modified.
+   *
+   * The final result will be that the node will never come back
+   * in further lookup requests, and will be flushed on demand from
+   * the cache normally when its reference count reaches 0.
+   */
+  FT_LOCAL( void )
+  FTC_Cache_RemoveFaceID( FTC_Cache   cache,
+                          FTC_FaceID  face_id );
+
+
+#ifdef FTC_INLINE
+
+#define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \
+  FT_BEGIN_STMNT                                                         \
+    FTC_Node             *_bucket, *_pnode, _node;                       \
+    FTC_Cache             _cache   = FTC_CACHE(cache);                   \
+    FT_PtrDist            _hash    = (FT_PtrDist)(hash);                 \
+    FTC_Node_CompareFunc  _nodcomp = (FTC_Node_CompareFunc)(nodecmp);    \
+    FT_Bool               _list_changed = FALSE;                         \
+                                                                         \
+                                                                         \
+    error = FTC_Err_Ok;                                                  \
+    node  = NULL;                                                        \
+                                                                         \
+    /* Go to the `top' node of the list sharing same masked hash */      \
+    _bucket = _pnode = FTC_NODE__TOP_FOR_HASH( _cache, _hash );          \
+                                                                         \
+    /* Look up a node with identical hash and queried properties.    */  \
+    /* NOTE: _nodcomp() may change the linked list to reduce memory. */  \
+    for (;;)                                                             \
+    {                                                                    \
+      _node = *_pnode;                                                   \
+      if ( _node == NULL )                                               \
+        goto _NewNode;                                                   \
+                                                                         \
+      if ( _node->hash == _hash                             &&           \
+           _nodcomp( _node, query, _cache, &_list_changed ) )            \
+        break;                                                           \
+                                                                         \
+      _pnode = &_node->link;                                             \
+    }                                                                    \
+                                                                         \
+    if ( _list_changed )                                                 \
+    {                                                                    \
+      /* Update _bucket by possibly modified linked list */              \
+      _bucket = _pnode = FTC_NODE__TOP_FOR_HASH( _cache, _hash );        \
+                                                                         \
+      /* Update _pnode by possibly modified linked list */               \
+      while ( *_pnode != _node )                                         \
+      {                                                                  \
+        if ( *_pnode == NULL )                                           \
+        {                                                                \
+          FT_ERROR(( "FTC_CACHE_LOOKUP_CMP: oops!!! node missing\n" ));  \
+          goto _NewNode;                                                 \
+        }                                                                \
+        else                                                             \
+          _pnode = &((*_pnode)->link);                                   \
+      }                                                                  \
+    }                                                                    \
+                                                                         \
+    /* Reorder the list to move the found node to the `top' */           \
+    if ( _node != *_bucket )                                             \
+    {                                                                    \
+      *_pnode     = _node->link;                                         \
+      _node->link = *_bucket;                                            \
+      *_bucket    = _node;                                               \
+    }                                                                    \
+                                                                         \
+    /* Update MRU list */                                                \
+    {                                                                    \
+      FTC_Manager  _manager = _cache->manager;                           \
+      void*        _nl      = &_manager->nodes_list;                     \
+                                                                         \
+                                                                         \
+      if ( _node != _manager->nodes_list )                               \
+        FTC_MruNode_Up( (FTC_MruNode*)_nl,                               \
+                        (FTC_MruNode)_node );                            \
+    }                                                                    \
+    goto _Ok;                                                            \
+                                                                         \
+  _NewNode:                                                              \
+    error = FTC_Cache_NewNode( _cache, _hash, query, &_node );           \
+                                                                         \
+  _Ok:                                                                   \
+    node = _node;                                                        \
+  FT_END_STMNT
+
+#else /* !FTC_INLINE */
+
+#define FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ) \
+  FT_BEGIN_STMNT                                                         \
+    error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query,           \
+                              (FTC_Node*)&(node) );                      \
+  FT_END_STMNT
+
+#endif /* !FTC_INLINE */
+
+
+  /*
+   * This macro, together with FTC_CACHE_TRYLOOP_END, defines a retry
+   * loop to flush the cache repeatedly in case of memory overflows.
+   *
+   * It is used when creating a new cache node, or within a lookup
+   * that needs to allocate data (e.g. the sbit cache lookup).
+   *
+   * Example:
+   *
+   *   {
+   *     FTC_CACHE_TRYLOOP( cache )
+   *       error = load_data( ... );
+   *     FTC_CACHE_TRYLOOP_END()
+   *   }
+   *
+   */
+#define FTC_CACHE_TRYLOOP( cache )                           \
+  {                                                          \
+    FTC_Manager  _try_manager = FTC_CACHE( cache )->manager; \
+    FT_UInt      _try_count   = 4;                           \
+                                                             \
+                                                             \
+    for (;;)                                                 \
+    {                                                        \
+      FT_UInt  _try_done;
+
+
+#define FTC_CACHE_TRYLOOP_END( list_changed )                     \
+      if ( !error || error != FTC_Err_Out_Of_Memory )             \
+        break;                                                    \
+                                                                  \
+      _try_done = FTC_Manager_FlushN( _try_manager, _try_count ); \
+      if ( _try_done > 0 && ( list_changed ) )                    \
+        *(FT_Bool*)( list_changed ) = TRUE;                       \
+                                                                  \
+      if ( _try_done == 0 )                                       \
+        break;                                                    \
+                                                                  \
+      if ( _try_done == _try_count )                              \
+      {                                                           \
+        _try_count *= 2;                                          \
+        if ( _try_count < _try_done              ||               \
+            _try_count > _try_manager->num_nodes )                \
+          _try_count = _try_manager->num_nodes;                   \
+      }                                                           \
+    }                                                             \
+  }
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __FTCCACHE_H__ */
+
+
+/* END */
diff --git a/src/cache/ftccback.h b/src/cache/ftccback.h
new file mode 100644 (file)
index 0000000..80ec9ce
--- /dev/null
@@ -0,0 +1,92 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftccback.h                                                             */
+/*                                                                         */
+/*    Callback functions of the caching sub-system (specification only).   */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2006, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#ifndef __FTCCBACK_H__
+#define __FTCCBACK_H__
+
+#include <ft2build.h>
+#include FT_CACHE_H
+#include "ftcmru.h"
+#include "ftcimage.h"
+#include "ftcmanag.h"
+#include "ftcglyph.h"
+#include "ftcsbits.h"
+
+
+  FT_LOCAL( void )
+  ftc_inode_free( FTC_Node   inode,
+                  FTC_Cache  cache );
+
+  FT_LOCAL( FT_Error )
+  ftc_inode_new( FTC_Node   *pinode,
+                 FT_Pointer  gquery,
+                 FTC_Cache   cache );
+
+  FT_LOCAL( FT_Offset )
+  ftc_inode_weight( FTC_Node   inode,
+                    FTC_Cache  cache );
+
+
+  FT_LOCAL( void )
+  ftc_snode_free( FTC_Node   snode,
+                  FTC_Cache  cache );
+
+  FT_LOCAL( FT_Error )
+  ftc_snode_new( FTC_Node   *psnode,
+                 FT_Pointer  gquery,
+                 FTC_Cache   cache );
+
+  FT_LOCAL( FT_Offset )
+  ftc_snode_weight( FTC_Node   snode,
+                    FTC_Cache  cache );
+
+  FT_LOCAL( FT_Bool )
+  ftc_snode_compare( FTC_Node    snode,
+                     FT_Pointer  gquery,
+                     FTC_Cache   cache,
+                     FT_Bool*    list_changed );
+
+
+  FT_LOCAL( FT_Bool )
+  ftc_gnode_compare( FTC_Node    gnode,
+                     FT_Pointer  gquery,
+                     FTC_Cache   cache,
+                     FT_Bool*    list_changed );
+
+
+  FT_LOCAL( FT_Error )
+  ftc_gcache_init( FTC_Cache  cache );
+
+  FT_LOCAL( void )
+  ftc_gcache_done( FTC_Cache  cache );
+
+
+  FT_LOCAL( FT_Error )
+  ftc_cache_init( FTC_Cache  cache );
+
+  FT_LOCAL( void )
+  ftc_cache_done( FTC_Cache  cache );
+
+#ifndef FT_CONFIG_OPTION_OLD_INTERNALS
+  FT_LOCAL( void )
+  ftc_node_destroy( FTC_Node     node,
+                    FTC_Manager  manager );
+#endif
+
+#endif /* __FTCCBACK_H__ */
+
+/* END */
diff --git a/src/cache/ftccmap.c b/src/cache/ftccmap.c
new file mode 100644 (file)
index 0000000..ad436ef
--- /dev/null
@@ -0,0 +1,438 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftccmap.c                                                              */
+/*                                                                         */
+/*    FreeType CharMap cache (body)                                        */
+/*                                                                         */
+/*  Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,   */
+/*            2010, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_CACHE_H
+#include "ftcmanag.h"
+#include FT_INTERNAL_MEMORY_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_DEBUG_H
+
+#include "ftccback.h"
+#include "ftcerror.h"
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cache
+
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  typedef enum  FTC_OldCMapType_
+  {
+    FTC_OLD_CMAP_BY_INDEX    = 0,
+    FTC_OLD_CMAP_BY_ENCODING = 1,
+    FTC_OLD_CMAP_BY_ID       = 2
+
+  } FTC_OldCMapType;
+
+
+  typedef struct  FTC_OldCMapIdRec_
+  {
+    FT_UInt  platform;
+    FT_UInt  encoding;
+
+  } FTC_OldCMapIdRec, *FTC_OldCMapId;
+
+
+  typedef struct  FTC_OldCMapDescRec_
+  {
+    FTC_FaceID       face_id;
+    FTC_OldCMapType  type;
+
+    union
+    {
+      FT_UInt           index;
+      FT_Encoding       encoding;
+      FTC_OldCMapIdRec  id;
+
+    } u;
+
+  } FTC_OldCMapDescRec, *FTC_OldCMapDesc;
+
+#endif /* FT_CONFIG_OLD_INTERNALS */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Each FTC_CMapNode contains a simple array to map a range of character */
+  /* codes to equivalent glyph indices.                                    */
+  /*                                                                       */
+  /* For now, the implementation is very basic: Each node maps a range of  */
+  /* 128 consecutive character codes to their corresponding glyph indices. */
+  /*                                                                       */
+  /* We could do more complex things, but I don't think it is really very  */
+  /* useful.                                                               */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* number of glyph indices / character code per node */
+#define FTC_CMAP_INDICES_MAX  128
+
+  /* compute a query/node hash */
+#define FTC_CMAP_HASH( faceid, index, charcode )         \
+          ( _FTC_FACE_ID_HASH( faceid ) + 211 * (index) + \
+            ( (charcode) / FTC_CMAP_INDICES_MAX )      )
+
+  /* the charmap query */
+  typedef struct  FTC_CMapQueryRec_
+  {
+    FTC_FaceID  face_id;
+    FT_UInt     cmap_index;
+    FT_UInt32   char_code;
+
+  } FTC_CMapQueryRec, *FTC_CMapQuery;
+
+#define FTC_CMAP_QUERY( x )  ((FTC_CMapQuery)(x))
+#define FTC_CMAP_QUERY_HASH( x )                                         \
+          FTC_CMAP_HASH( (x)->face_id, (x)->cmap_index, (x)->char_code )
+
+  /* the cmap cache node */
+  typedef struct  FTC_CMapNodeRec_
+  {
+    FTC_NodeRec  node;
+    FTC_FaceID   face_id;
+    FT_UInt      cmap_index;
+    FT_UInt32    first;                         /* first character in node */
+    FT_UInt16    indices[FTC_CMAP_INDICES_MAX]; /* array of glyph indices  */
+
+  } FTC_CMapNodeRec, *FTC_CMapNode;
+
+#define FTC_CMAP_NODE( x ) ( (FTC_CMapNode)( x ) )
+#define FTC_CMAP_NODE_HASH( x )                                      \
+          FTC_CMAP_HASH( (x)->face_id, (x)->cmap_index, (x)->first )
+
+  /* if (indices[n] == FTC_CMAP_UNKNOWN), we assume that the corresponding */
+  /* glyph indices haven't been queried through FT_Get_Glyph_Index() yet   */
+#define FTC_CMAP_UNKNOWN  ( (FT_UInt16)-1 )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                        CHARMAP NODES                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_CALLBACK_DEF( void )
+  ftc_cmap_node_free( FTC_Node   ftcnode,
+                      FTC_Cache  cache )
+  {
+    FTC_CMapNode  node   = (FTC_CMapNode)ftcnode;
+    FT_Memory     memory = cache->memory;
+
+
+    FT_FREE( node );
+  }
+
+
+  /* initialize a new cmap node */
+  FT_CALLBACK_DEF( FT_Error )
+  ftc_cmap_node_new( FTC_Node   *ftcanode,
+                     FT_Pointer  ftcquery,
+                     FTC_Cache   cache )
+  {
+    FTC_CMapNode  *anode  = (FTC_CMapNode*)ftcanode;
+    FTC_CMapQuery  query  = (FTC_CMapQuery)ftcquery;
+    FT_Error       error;
+    FT_Memory      memory = cache->memory;
+    FTC_CMapNode   node   = NULL;
+    FT_UInt        nn;
+
+
+    if ( !FT_NEW( node ) )
+    {
+      node->face_id    = query->face_id;
+      node->cmap_index = query->cmap_index;
+      node->first      = (query->char_code / FTC_CMAP_INDICES_MAX) *
+                         FTC_CMAP_INDICES_MAX;
+
+      for ( nn = 0; nn < FTC_CMAP_INDICES_MAX; nn++ )
+        node->indices[nn] = FTC_CMAP_UNKNOWN;
+    }
+
+    *anode = node;
+    return error;
+  }
+
+
+  /* compute the weight of a given cmap node */
+  FT_CALLBACK_DEF( FT_Offset )
+  ftc_cmap_node_weight( FTC_Node   cnode,
+                        FTC_Cache  cache )
+  {
+    FT_UNUSED( cnode );
+    FT_UNUSED( cache );
+
+    return sizeof ( *cnode );
+  }
+
+
+  /* compare a cmap node to a given query */
+  FT_CALLBACK_DEF( FT_Bool )
+  ftc_cmap_node_compare( FTC_Node    ftcnode,
+                         FT_Pointer  ftcquery,
+                         FTC_Cache   cache,
+                         FT_Bool*    list_changed )
+  {
+    FTC_CMapNode   node  = (FTC_CMapNode)ftcnode;
+    FTC_CMapQuery  query = (FTC_CMapQuery)ftcquery;
+    FT_UNUSED( cache );
+
+
+    if ( list_changed )
+      *list_changed = FALSE;
+    if ( node->face_id    == query->face_id    &&
+         node->cmap_index == query->cmap_index )
+    {
+      FT_UInt32  offset = (FT_UInt32)( query->char_code - node->first );
+
+
+      return FT_BOOL( offset < FTC_CMAP_INDICES_MAX );
+    }
+
+    return 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Bool )
+  ftc_cmap_node_remove_faceid( FTC_Node    ftcnode,
+                               FT_Pointer  ftcface_id,
+                               FTC_Cache   cache,
+                               FT_Bool*    list_changed )
+  {
+    FTC_CMapNode  node    = (FTC_CMapNode)ftcnode;
+    FTC_FaceID    face_id = (FTC_FaceID)ftcface_id;
+    FT_UNUSED( cache );
+
+
+    if ( list_changed )
+      *list_changed = FALSE;
+    return FT_BOOL( node->face_id == face_id );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    GLYPH IMAGE CACHE                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FTC_CacheClassRec  ftc_cmap_cache_class =
+  {
+    ftc_cmap_node_new,
+    ftc_cmap_node_weight,
+    ftc_cmap_node_compare,
+    ftc_cmap_node_remove_faceid,
+    ftc_cmap_node_free,
+
+    sizeof ( FTC_CacheRec ),
+    ftc_cache_init,
+    ftc_cache_done,
+  };
+
+
+  /* documentation is in ftcache.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FTC_CMapCache_New( FTC_Manager     manager,
+                     FTC_CMapCache  *acache )
+  {
+    return FTC_Manager_RegisterCache( manager,
+                                      &ftc_cmap_cache_class,
+                                      FTC_CACHE_P( acache ) );
+  }
+
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  /*
+   *  Unfortunately, it is not possible to support binary backwards
+   *  compatibility in the cmap cache.  The FTC_CMapCache_Lookup signature
+   *  changes were too deep, and there is no clever hackish way to detect
+   *  what kind of structure we are being passed.
+   *
+   *  On the other hand it seems that no production code is using this
+   *  function on Unix distributions.
+   */
+
+#endif
+
+
+  /* documentation is in ftcache.h */
+
+  FT_EXPORT_DEF( FT_UInt )
+  FTC_CMapCache_Lookup( FTC_CMapCache  cmap_cache,
+                        FTC_FaceID     face_id,
+                        FT_Int         cmap_index,
+                        FT_UInt32      char_code )
+  {
+    FTC_Cache         cache = FTC_CACHE( cmap_cache );
+    FTC_CMapQueryRec  query;
+    FTC_Node          node;
+    FT_Error          error;
+    FT_UInt           gindex = 0;
+    FT_PtrDist        hash;
+    FT_Int            no_cmap_change = 0;
+
+
+    if ( cmap_index < 0 )
+    {
+      /* Treat a negative cmap index as a special value, meaning that you */
+      /* don't want to change the FT_Face's character map through this    */
+      /* call.  This can be useful if the face requester callback already */
+      /* sets the face's charmap to the appropriate value.                */
+
+      no_cmap_change = 1;
+      cmap_index     = 0;
+    }
+
+    if ( !cache )
+    {
+      FT_TRACE0(( "FTC_CMapCache_Lookup: bad arguments, returning 0\n" ));
+      return 0;
+    }
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+    /*
+     * If cmap_index is greater than the maximum number of cachable
+     * charmaps, we assume the request is from a legacy rogue client
+     * using old internal header. See include/config/ftoption.h.
+     */
+    if ( cmap_index > FT_MAX_CHARMAP_CACHEABLE && !no_cmap_change )
+    {
+      FTC_OldCMapDesc  desc = (FTC_OldCMapDesc) face_id;
+
+
+      char_code     = (FT_UInt32)cmap_index;
+      query.face_id = desc->face_id;
+
+
+      switch ( desc->type )
+      {
+      case FTC_OLD_CMAP_BY_INDEX:
+        query.cmap_index = desc->u.index;
+        query.char_code  = (FT_UInt32)cmap_index;
+        break;
+
+      case FTC_OLD_CMAP_BY_ENCODING:
+        {
+          FT_Face  face;
+
+
+          error = FTC_Manager_LookupFace( cache->manager, desc->face_id,
+                                          &face );
+          if ( error )
+            return 0;
+
+          FT_Select_Charmap( face, desc->u.encoding );
+
+          return FT_Get_Char_Index( face, char_code );
+        }
+
+      default:
+        return 0;
+      }
+    }
+    else
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+    {
+      query.face_id    = face_id;
+      query.cmap_index = (FT_UInt)cmap_index;
+      query.char_code  = char_code;
+    }
+
+    hash = FTC_CMAP_HASH( face_id, cmap_index, char_code );
+
+#if 1
+    FTC_CACHE_LOOKUP_CMP( cache, ftc_cmap_node_compare, hash, &query,
+                          node, error );
+#else
+    error = FTC_Cache_Lookup( cache, hash, &query, &node );
+#endif
+    if ( error )
+      goto Exit;
+
+    FT_ASSERT( (FT_UInt)( char_code - FTC_CMAP_NODE( node )->first ) <
+                FTC_CMAP_INDICES_MAX );
+
+    /* something rotten can happen with rogue clients */
+    if ( (FT_UInt)( char_code - FTC_CMAP_NODE( node )->first >=
+                    FTC_CMAP_INDICES_MAX ) )
+      return 0; /* XXX: should return appropriate error */
+
+    gindex = FTC_CMAP_NODE( node )->indices[char_code -
+                                            FTC_CMAP_NODE( node )->first];
+    if ( gindex == FTC_CMAP_UNKNOWN )
+    {
+      FT_Face  face;
+
+
+      gindex = 0;
+
+      error = FTC_Manager_LookupFace( cache->manager,
+                                      FTC_CMAP_NODE( node )->face_id,
+                                      &face );
+      if ( error )
+        goto Exit;
+
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+      /* something rotten can happen with rogue clients */
+      if ( cmap_index > FT_MAX_CHARMAP_CACHEABLE )
+        return 0; /* XXX: should return appropriate error */
+#endif
+
+      if ( (FT_UInt)cmap_index < (FT_UInt)face->num_charmaps )
+      {
+        FT_CharMap  old, cmap  = NULL;
+
+
+        old  = face->charmap;
+        cmap = face->charmaps[cmap_index];
+
+        if ( old != cmap && !no_cmap_change )
+          FT_Set_Charmap( face, cmap );
+
+        gindex = FT_Get_Char_Index( face, char_code );
+
+        if ( old != cmap && !no_cmap_change )
+          FT_Set_Charmap( face, old );
+      }
+
+      FTC_CMAP_NODE( node )->indices[char_code -
+                                     FTC_CMAP_NODE( node )->first]
+        = (FT_UShort)gindex;
+    }
+
+  Exit:
+    return gindex;
+  }
+
+
+/* END */
diff --git a/src/cache/ftcerror.h b/src/cache/ftcerror.h
new file mode 100644 (file)
index 0000000..0e05570
--- /dev/null
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcerror.h                                                             */
+/*                                                                         */
+/*    Caching sub-system error codes (specification only).                 */
+/*                                                                         */
+/*  Copyright 2001, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the caching sub-system error enumeration  */
+  /* constants.                                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __FTCERROR_H__
+#define __FTCERROR_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  FTC_Err_
+#define FT_ERR_BASE    FT_Mod_Err_Cache
+
+#include FT_ERRORS_H
+
+#endif /* __FTCERROR_H__ */
+
+/* END */
diff --git a/src/cache/ftcglyph.c b/src/cache/ftcglyph.c
new file mode 100644 (file)
index 0000000..441e177
--- /dev/null
@@ -0,0 +1,219 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcglyph.c                                                             */
+/*                                                                         */
+/*    FreeType Glyph Image (FT_Glyph) cache (body).                        */
+/*                                                                         */
+/*  Copyright 2000-2001, 2003, 2004, 2006, 2009, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_CACHE_H
+#include "ftcglyph.h"
+#include FT_ERRORS_H
+
+#include "ftccback.h"
+#include "ftcerror.h"
+
+
+  /* create a new chunk node, setting its cache index and ref count */
+  FT_LOCAL_DEF( void )
+  FTC_GNode_Init( FTC_GNode   gnode,
+                  FT_UInt     gindex,
+                  FTC_Family  family )
+  {
+    gnode->family = family;
+    gnode->gindex = gindex;
+    family->num_nodes++;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  FTC_GNode_UnselectFamily( FTC_GNode  gnode,
+                            FTC_Cache  cache )
+  {
+    FTC_Family  family = gnode->family;
+
+
+    gnode->family = NULL;
+    if ( family && --family->num_nodes == 0 )
+      FTC_FAMILY_FREE( family, cache );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  FTC_GNode_Done( FTC_GNode  gnode,
+                  FTC_Cache  cache )
+  {
+    /* finalize the node */
+    gnode->gindex = 0;
+
+    FTC_GNode_UnselectFamily( gnode, cache );
+  }
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  ftc_gnode_compare( FTC_Node    ftcgnode,
+                     FT_Pointer  ftcgquery,
+                     FTC_Cache   cache,
+                     FT_Bool*    list_changed )
+  {
+    FTC_GNode   gnode  = (FTC_GNode)ftcgnode;
+    FTC_GQuery  gquery = (FTC_GQuery)ftcgquery;
+    FT_UNUSED( cache );
+
+
+    if ( list_changed )
+      *list_changed = FALSE;
+    return FT_BOOL( gnode->family == gquery->family &&
+                    gnode->gindex == gquery->gindex );
+  }
+
+
+#ifdef FTC_INLINE
+
+  FT_LOCAL_DEF( FT_Bool )
+  FTC_GNode_Compare( FTC_GNode   gnode,
+                     FTC_GQuery  gquery,
+                     FTC_Cache   cache,
+                     FT_Bool*    list_changed )
+  {
+    return ftc_gnode_compare( FTC_NODE( gnode ), gquery,
+                              cache, list_changed );
+  }
+
+#endif
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      CHUNK SETS                               *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  FTC_Family_Init( FTC_Family  family,
+                   FTC_Cache   cache )
+  {
+    FTC_GCacheClass  clazz = FTC_CACHE__GCACHE_CLASS( cache );
+
+
+    family->clazz     = clazz->family_class;
+    family->num_nodes = 0;
+    family->cache     = cache;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  ftc_gcache_init( FTC_Cache  ftccache )
+  {
+    FTC_GCache  cache = (FTC_GCache)ftccache;
+    FT_Error    error;
+
+
+    error = FTC_Cache_Init( FTC_CACHE( cache ) );
+    if ( !error )
+    {
+      FTC_GCacheClass   clazz = (FTC_GCacheClass)FTC_CACHE( cache )->org_class;
+
+      FTC_MruList_Init( &cache->families,
+                        clazz->family_class,
+                        0,  /* no maximum here! */
+                        cache,
+                        FTC_CACHE( cache )->memory );
+    }
+
+    return error;
+  }
+
+
+#if 0
+
+  FT_LOCAL_DEF( FT_Error )
+  FTC_GCache_Init( FTC_GCache  cache )
+  {
+    return ftc_gcache_init( FTC_CACHE( cache ) );
+  }
+
+#endif /* 0 */
+
+
+  FT_LOCAL_DEF( void )
+  ftc_gcache_done( FTC_Cache  ftccache )
+  {
+    FTC_GCache  cache = (FTC_GCache)ftccache;
+
+
+    FTC_Cache_Done( (FTC_Cache)cache );
+    FTC_MruList_Done( &cache->families );
+  }
+
+
+#if 0
+
+  FT_LOCAL_DEF( void )
+  FTC_GCache_Done( FTC_GCache  cache )
+  {
+    ftc_gcache_done( FTC_CACHE( cache ) );
+  }
+
+#endif /* 0 */
+
+
+  FT_LOCAL_DEF( FT_Error )
+  FTC_GCache_New( FTC_Manager       manager,
+                  FTC_GCacheClass   clazz,
+                  FTC_GCache       *acache )
+  {
+    return FTC_Manager_RegisterCache( manager, (FTC_CacheClass)clazz,
+                                      (FTC_Cache*)acache );
+  }
+
+
+#ifndef FTC_INLINE
+
+  FT_LOCAL_DEF( FT_Error )
+  FTC_GCache_Lookup( FTC_GCache   cache,
+                     FT_PtrDist   hash,
+                     FT_UInt      gindex,
+                     FTC_GQuery   query,
+                     FTC_Node    *anode )
+  {
+    FT_Error  error;
+
+
+    query->gindex = gindex;
+
+    FTC_MRULIST_LOOKUP( &cache->families, query, query->family, error );
+    if ( !error )
+    {
+      FTC_Family  family = query->family;
+
+
+      /* prevent the family from being destroyed too early when an        */
+      /* out-of-memory condition occurs during glyph node initialization. */
+      family->num_nodes++;
+
+      error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, anode );
+
+      if ( --family->num_nodes == 0 )
+        FTC_FAMILY_FREE( family, cache );
+    }
+    return error;
+  }
+
+#endif /* !FTC_INLINE */
+
+
+/* END */
diff --git a/src/cache/ftcglyph.h b/src/cache/ftcglyph.h
new file mode 100644 (file)
index 0000000..5fed19c
--- /dev/null
@@ -0,0 +1,329 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcglyph.h                                                             */
+/*                                                                         */
+/*    FreeType abstract glyph cache (specification).                       */
+/*                                                                         */
+/*  Copyright 2000-2001, 2003, 2004, 2006, 2007, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*
+   *
+   *  FTC_GCache is an _abstract_ cache object optimized to store glyph
+   *  data.  It works as follows:
+   *
+   *   - It manages FTC_GNode objects. Each one of them can hold one or more
+   *     glyph `items'.  Item types are not specified in the FTC_GCache but
+   *     in classes that extend it.
+   *
+   *   - Glyph attributes, like face ID, character size, render mode, etc.,
+   *     can be grouped into abstract `glyph families'.  This avoids storing
+   *     the attributes within the FTC_GCache, since it is likely that many
+   *     FTC_GNodes will belong to the same family in typical uses.
+   *
+   *   - Each FTC_GNode is thus an FTC_Node with two additional fields:
+   *
+   *       * gindex: A glyph index, or the first index in a glyph range.
+   *       * family: A pointer to a glyph `family'.
+   *
+   *   - Family types are not fully specific in the FTC_Family type, but
+   *     by classes that extend it.
+   *
+   *  Note that both FTC_ImageCache and FTC_SBitCache extend FTC_GCache.
+   *  They share an FTC_Family sub-class called FTC_BasicFamily which is
+   *  used to store the following data: face ID, pixel/point sizes, load
+   *  flags.  For more details see the file `src/cache/ftcbasic.c'.
+   *
+   *  Client applications can extend FTC_GNode with their own FTC_GNode
+   *  and FTC_Family sub-classes to implement more complex caches (e.g.,
+   *  handling automatic synthesis, like obliquing & emboldening, colored
+   *  glyphs, etc.).
+   *
+   *  See also the FTC_ICache & FTC_SCache classes in `ftcimage.h' and
+   *  `ftcsbits.h', which both extend FTC_GCache with additional
+   *  optimizations.
+   *
+   *  A typical FTC_GCache implementation must provide at least the
+   *  following:
+   *
+   *  - FTC_GNode sub-class, e.g. MyNode, with relevant methods:
+   *        my_node_new            (must call FTC_GNode_Init)
+   *        my_node_free           (must call FTC_GNode_Done)
+   *        my_node_compare        (must call FTC_GNode_Compare)
+   *        my_node_remove_faceid  (must call ftc_gnode_unselect in case
+   *                                of match)
+   *
+   *  - FTC_Family sub-class, e.g. MyFamily, with relevant methods:
+   *        my_family_compare
+   *        my_family_init
+   *        my_family_reset (optional)
+   *        my_family_done
+   *
+   *  - FTC_GQuery sub-class, e.g. MyQuery, to hold cache-specific query
+   *    data.
+   *
+   *  - Constant structures for a FTC_GNodeClass.
+   *
+   *  - MyCacheNew() can be implemented easily as a call to the convenience
+   *    function FTC_GCache_New.
+   *
+   *  - MyCacheLookup with a call to FTC_GCache_Lookup.  This function will
+   *    automatically:
+   *
+   *    - Search for the corresponding family in the cache, or create
+   *      a new one if necessary.  Put it in FTC_GQUERY(myquery).family
+   *
+   *    - Call FTC_Cache_Lookup.
+   *
+   *    If it returns NULL, you should create a new node, then call
+   *    ftc_cache_add as usual.
+   */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Important: The functions defined in this file are only used to        */
+  /*            implement an abstract glyph cache class.  You need to      */
+  /*            provide additional logic to implement a complete cache.    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*********                                                       *********/
+  /*********             WARNING, THIS IS BETA CODE.               *********/
+  /*********                                                       *********/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#ifndef __FTCGLYPH_H__
+#define __FTCGLYPH_H__
+
+
+#include <ft2build.h>
+#include "ftcmanag.h"
+
+
+FT_BEGIN_HEADER
+
+
+ /*
+  *  We can group glyphs into `families'.  Each family correspond to a
+  *  given face ID, character size, transform, etc.
+  *
+  *  Families are implemented as MRU list nodes.  They are
+  *  reference-counted.
+  */
+
+  typedef struct  FTC_FamilyRec_
+  {
+    FTC_MruNodeRec    mrunode;
+    FT_UInt           num_nodes; /* current number of nodes in this family */
+    FTC_Cache         cache;
+    FTC_MruListClass  clazz;
+
+  } FTC_FamilyRec, *FTC_Family;
+
+#define  FTC_FAMILY(x)    ( (FTC_Family)(x) )
+#define  FTC_FAMILY_P(x)  ( (FTC_Family*)(x) )
+
+
+  typedef struct  FTC_GNodeRec_
+  {
+    FTC_NodeRec      node;
+    FTC_Family       family;
+    FT_UInt          gindex;
+
+  } FTC_GNodeRec, *FTC_GNode;
+
+#define FTC_GNODE( x )    ( (FTC_GNode)(x) )
+#define FTC_GNODE_P( x )  ( (FTC_GNode*)(x) )
+
+
+  typedef struct  FTC_GQueryRec_
+  {
+    FT_UInt      gindex;
+    FTC_Family   family;
+
+  } FTC_GQueryRec, *FTC_GQuery;
+
+#define FTC_GQUERY( x )  ( (FTC_GQuery)(x) )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* These functions are exported so that they can be called from          */
+  /* user-provided cache classes; otherwise, they are really part of the   */
+  /* cache sub-system internals.                                           */
+  /*                                                                       */
+
+  /* must be called by derived FTC_Node_InitFunc routines */
+  FT_LOCAL( void )
+  FTC_GNode_Init( FTC_GNode   node,
+                  FT_UInt     gindex,  /* glyph index for node */
+                  FTC_Family  family );
+
+#ifdef FTC_INLINE
+
+  /* returns TRUE iff the query's glyph index correspond to the node;  */
+  /* this assumes that the `family' and `hash' fields of the query are */
+  /* already correctly set                                             */
+  FT_LOCAL( FT_Bool )
+  FTC_GNode_Compare( FTC_GNode   gnode,
+                     FTC_GQuery  gquery,
+                     FTC_Cache   cache,
+                     FT_Bool*    list_changed );
+
+#endif
+
+  /* call this function to clear a node's family -- this is necessary */
+  /* to implement the `node_remove_faceid' cache method correctly     */
+  FT_LOCAL( void )
+  FTC_GNode_UnselectFamily( FTC_GNode  gnode,
+                            FTC_Cache  cache );
+
+  /* must be called by derived FTC_Node_DoneFunc routines */
+  FT_LOCAL( void )
+  FTC_GNode_Done( FTC_GNode  node,
+                  FTC_Cache  cache );
+
+
+  FT_LOCAL( void )
+  FTC_Family_Init( FTC_Family  family,
+                   FTC_Cache   cache );
+
+  typedef struct FTC_GCacheRec_
+  {
+    FTC_CacheRec    cache;
+    FTC_MruListRec  families;
+
+  } FTC_GCacheRec, *FTC_GCache;
+
+#define FTC_GCACHE( x )  ((FTC_GCache)(x))
+
+
+#if 0
+  /* can be used as @FTC_Cache_InitFunc */
+  FT_LOCAL( FT_Error )
+  FTC_GCache_Init( FTC_GCache  cache );
+#endif
+
+
+#if 0
+  /* can be used as @FTC_Cache_DoneFunc */
+  FT_LOCAL( void )
+  FTC_GCache_Done( FTC_GCache  cache );
+#endif
+
+
+  /* the glyph cache class adds fields for the family implementation */
+  typedef struct  FTC_GCacheClassRec_
+  {
+    FTC_CacheClassRec  clazz;
+    FTC_MruListClass   family_class;
+
+  } FTC_GCacheClassRec;
+
+  typedef const FTC_GCacheClassRec*   FTC_GCacheClass;
+
+#define FTC_GCACHE_CLASS( x )  ((FTC_GCacheClass)(x))
+
+#define FTC_CACHE__GCACHE_CLASS( x ) \
+          FTC_GCACHE_CLASS( FTC_CACHE(x)->org_class )
+#define FTC_CACHE__FAMILY_CLASS( x ) \
+          ( (FTC_MruListClass)FTC_CACHE__GCACHE_CLASS( x )->family_class )
+
+
+  /* convenience function; use it instead of FTC_Manager_Register_Cache */
+  FT_LOCAL( FT_Error )
+  FTC_GCache_New( FTC_Manager       manager,
+                  FTC_GCacheClass   clazz,
+                  FTC_GCache       *acache );
+
+#ifndef FTC_INLINE
+  FT_LOCAL( FT_Error )
+  FTC_GCache_Lookup( FTC_GCache   cache,
+                     FT_PtrDist   hash,
+                     FT_UInt      gindex,
+                     FTC_GQuery   query,
+                     FTC_Node    *anode );
+#endif
+
+
+  /* */
+
+
+#define FTC_FAMILY_FREE( family, cache )                      \
+          FTC_MruList_Remove( &FTC_GCACHE((cache))->families, \
+                              (FTC_MruNode)(family) )
+
+
+#ifdef FTC_INLINE
+
+#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash,                \
+                               gindex, query, node, error )                 \
+  FT_BEGIN_STMNT                                                            \
+    FTC_GCache               _gcache   = FTC_GCACHE( cache );               \
+    FTC_GQuery               _gquery   = (FTC_GQuery)( query );             \
+    FTC_MruNode_CompareFunc  _fcompare = (FTC_MruNode_CompareFunc)(famcmp); \
+    FTC_MruNode              _mrunode;                                      \
+                                                                            \
+                                                                            \
+    _gquery->gindex = (gindex);                                             \
+                                                                            \
+    FTC_MRULIST_LOOKUP_CMP( &_gcache->families, _gquery, _fcompare,         \
+                            _mrunode, error );                              \
+    _gquery->family = FTC_FAMILY( _mrunode );                               \
+    if ( !error )                                                           \
+    {                                                                       \
+      FTC_Family  _gqfamily = _gquery->family;                              \
+                                                                            \
+                                                                            \
+      _gqfamily->num_nodes++;                                               \
+                                                                            \
+      FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error );     \
+                                                                            \
+      if ( --_gqfamily->num_nodes == 0 )                                    \
+        FTC_FAMILY_FREE( _gqfamily, _gcache );                              \
+    }                                                                       \
+  FT_END_STMNT
+  /* */
+
+#else /* !FTC_INLINE */
+
+#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash,          \
+                               gindex, query, node, error )           \
+   FT_BEGIN_STMNT                                                     \
+                                                                      \
+     error = FTC_GCache_Lookup( FTC_GCACHE( cache ), hash, gindex,    \
+                                FTC_GQUERY( query ), &node );         \
+                                                                      \
+   FT_END_STMNT
+
+#endif /* !FTC_INLINE */
+
+
+FT_END_HEADER
+
+
+#endif /* __FTCGLYPH_H__ */
+
+
+/* END */
diff --git a/src/cache/ftcimage.c b/src/cache/ftcimage.c
new file mode 100644 (file)
index 0000000..c242ece
--- /dev/null
@@ -0,0 +1,163 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcimage.c                                                             */
+/*                                                                         */
+/*    FreeType Image cache (body).                                         */
+/*                                                                         */
+/*  Copyright 2000-2001, 2003, 2004, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_CACHE_H
+#include "ftcimage.h"
+#include FT_INTERNAL_MEMORY_H
+
+#include "ftccback.h"
+#include "ftcerror.h"
+
+
+  /* finalize a given glyph image node */
+  FT_LOCAL_DEF( void )
+  ftc_inode_free( FTC_Node   ftcinode,
+                  FTC_Cache  cache )
+  {
+    FTC_INode  inode = (FTC_INode)ftcinode;
+    FT_Memory  memory = cache->memory;
+
+
+    if ( inode->glyph )
+    {
+      FT_Done_Glyph( inode->glyph );
+      inode->glyph = NULL;
+    }
+
+    FTC_GNode_Done( FTC_GNODE( inode ), cache );
+    FT_FREE( inode );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  FTC_INode_Free( FTC_INode  inode,
+                  FTC_Cache  cache )
+  {
+    ftc_inode_free( FTC_NODE( inode ), cache );
+  }
+
+
+  /* initialize a new glyph image node */
+  FT_LOCAL_DEF( FT_Error )
+  FTC_INode_New( FTC_INode   *pinode,
+                 FTC_GQuery   gquery,
+                 FTC_Cache    cache )
+  {
+    FT_Memory  memory = cache->memory;
+    FT_Error   error;
+    FTC_INode  inode  = NULL;
+
+
+    if ( !FT_NEW( inode ) )
+    {
+      FTC_GNode         gnode  = FTC_GNODE( inode );
+      FTC_Family        family = gquery->family;
+      FT_UInt           gindex = gquery->gindex;
+      FTC_IFamilyClass  clazz  = FTC_CACHE__IFAMILY_CLASS( cache );
+
+
+      /* initialize its inner fields */
+      FTC_GNode_Init( gnode, gindex, family );
+
+      /* we will now load the glyph image */
+      error = clazz->family_load_glyph( family, gindex, cache,
+                                        &inode->glyph );
+      if ( error )
+      {
+        FTC_INode_Free( inode, cache );
+        inode = NULL;
+      }
+    }
+
+    *pinode = inode;
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  ftc_inode_new( FTC_Node   *ftcpinode,
+                 FT_Pointer  ftcgquery,
+                 FTC_Cache   cache )
+  {
+    FTC_INode  *pinode = (FTC_INode*)ftcpinode;
+    FTC_GQuery  gquery = (FTC_GQuery)ftcgquery;
+
+
+    return FTC_INode_New( pinode, gquery, cache );
+  }
+
+
+  FT_LOCAL_DEF( FT_Offset )
+  ftc_inode_weight( FTC_Node   ftcinode,
+                    FTC_Cache  ftccache )
+  {
+    FTC_INode  inode = (FTC_INode)ftcinode;
+    FT_Offset  size  = 0;
+    FT_Glyph   glyph = inode->glyph;
+
+    FT_UNUSED( ftccache );
+
+
+    switch ( glyph->format )
+    {
+    case FT_GLYPH_FORMAT_BITMAP:
+      {
+        FT_BitmapGlyph  bitg;
+
+
+        bitg = (FT_BitmapGlyph)glyph;
+        size = bitg->bitmap.rows * ft_labs( bitg->bitmap.pitch ) +
+               sizeof ( *bitg );
+      }
+      break;
+
+    case FT_GLYPH_FORMAT_OUTLINE:
+      {
+        FT_OutlineGlyph  outg;
+
+
+        outg = (FT_OutlineGlyph)glyph;
+        size = outg->outline.n_points *
+                 ( sizeof ( FT_Vector ) + sizeof ( FT_Byte ) ) +
+               outg->outline.n_contours * sizeof ( FT_Short ) +
+               sizeof ( *outg );
+      }
+      break;
+
+    default:
+      ;
+    }
+
+    size += sizeof ( *inode );
+    return size;
+  }
+
+
+#if 0
+
+  FT_LOCAL_DEF( FT_Offset )
+  FTC_INode_Weight( FTC_INode  inode )
+  {
+    return ftc_inode_weight( FTC_NODE( inode ), NULL );
+  }
+
+#endif /* 0 */
+
+
+/* END */
diff --git a/src/cache/ftcimage.h b/src/cache/ftcimage.h
new file mode 100644 (file)
index 0000000..20d5d3e
--- /dev/null
@@ -0,0 +1,107 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcimage.h                                                             */
+/*                                                                         */
+/*    FreeType Generic Image cache (specification)                         */
+/*                                                                         */
+/*  Copyright 2000-2001, 2002, 2003, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+ /*
+  *  FTC_ICache is an _abstract_ cache used to store a single FT_Glyph
+  *  image per cache node.
+  *
+  *  FTC_ICache extends FTC_GCache.  For an implementation example,
+  *  see FTC_ImageCache in `src/cache/ftbasic.c'.
+  */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Each image cache really manages FT_Glyph objects.                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTCIMAGE_H__
+#define __FTCIMAGE_H__
+
+
+#include <ft2build.h>
+#include FT_CACHE_H
+#include "ftcglyph.h"
+
+FT_BEGIN_HEADER
+
+
+  /* the FT_Glyph image node type - we store only 1 glyph per node */
+  typedef struct  FTC_INodeRec_
+  {
+    FTC_GNodeRec  gnode;
+    FT_Glyph      glyph;
+
+  } FTC_INodeRec, *FTC_INode;
+
+#define FTC_INODE( x )         ( (FTC_INode)( x ) )
+#define FTC_INODE_GINDEX( x )  FTC_GNODE(x)->gindex
+#define FTC_INODE_FAMILY( x )  FTC_GNODE(x)->family
+
+  typedef FT_Error
+  (*FTC_IFamily_LoadGlyphFunc)( FTC_Family  family,
+                                FT_UInt     gindex,
+                                FTC_Cache   cache,
+                                FT_Glyph   *aglyph );
+
+  typedef struct  FTC_IFamilyClassRec_
+  {
+    FTC_MruListClassRec        clazz;
+    FTC_IFamily_LoadGlyphFunc  family_load_glyph;
+
+  } FTC_IFamilyClassRec;
+
+  typedef const FTC_IFamilyClassRec*  FTC_IFamilyClass;
+
+#define FTC_IFAMILY_CLASS( x )  ((FTC_IFamilyClass)(x))
+
+#define FTC_CACHE__IFAMILY_CLASS( x ) \
+          FTC_IFAMILY_CLASS( FTC_CACHE__GCACHE_CLASS(x)->family_class )
+
+
+  /* can be used as a @FTC_Node_FreeFunc */
+  FT_LOCAL( void )
+  FTC_INode_Free( FTC_INode  inode,
+                  FTC_Cache  cache );
+
+  /* Can be used as @FTC_Node_NewFunc.  `gquery.index' and `gquery.family'
+   * must be set correctly.  This function will call the `family_load_glyph'
+   * method to load the FT_Glyph into the cache node.
+   */
+  FT_LOCAL( FT_Error )
+  FTC_INode_New( FTC_INode   *pinode,
+                 FTC_GQuery   gquery,
+                 FTC_Cache    cache );
+
+#if 0
+  /* can be used as @FTC_Node_WeightFunc */
+  FT_LOCAL( FT_ULong )
+  FTC_INode_Weight( FTC_INode  inode );
+#endif
+
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTCIMAGE_H__ */
+
+
+/* END */
diff --git a/src/cache/ftcmanag.c b/src/cache/ftcmanag.c
new file mode 100644 (file)
index 0000000..76a510d
--- /dev/null
@@ -0,0 +1,743 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcmanag.c                                                             */
+/*                                                                         */
+/*    FreeType Cache Manager (body).                                       */
+/*                                                                         */
+/*  Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_CACHE_H
+#include "ftcmanag.h"
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_SIZES_H
+
+#include "ftccback.h"
+#include "ftcerror.h"
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "cache system does not support PIC yet"
+#endif
+
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cache
+
+#define FTC_LRU_GET_MANAGER( lru )  ( (FTC_Manager)(lru)->user_data )
+
+
+  static FT_Error
+  ftc_scaler_lookup_size( FTC_Manager  manager,
+                          FTC_Scaler   scaler,
+                          FT_Size     *asize )
+  {
+    FT_Face   face;
+    FT_Size   size = NULL;
+    FT_Error  error;
+
+
+    error = FTC_Manager_LookupFace( manager, scaler->face_id, &face );
+    if ( error )
+      goto Exit;
+
+    error = FT_New_Size( face, &size );
+    if ( error )
+      goto Exit;
+
+    FT_Activate_Size( size );
+
+    if ( scaler->pixel )
+      error = FT_Set_Pixel_Sizes( face, scaler->width, scaler->height );
+    else
+      error = FT_Set_Char_Size( face, scaler->width, scaler->height,
+                                scaler->x_res, scaler->y_res );
+    if ( error )
+    {
+      FT_Done_Size( size );
+      size = NULL;
+    }
+
+  Exit:
+    *asize = size;
+    return error;
+  }
+
+
+  typedef struct  FTC_SizeNodeRec_
+  {
+    FTC_MruNodeRec  node;
+    FT_Size         size;
+    FTC_ScalerRec   scaler;
+
+  } FTC_SizeNodeRec, *FTC_SizeNode;
+
+#define FTC_SIZE_NODE( x ) ( (FTC_SizeNode)( x ) )
+
+
+  FT_CALLBACK_DEF( void )
+  ftc_size_node_done( FTC_MruNode  ftcnode,
+                      FT_Pointer   data )
+  {
+    FTC_SizeNode  node = (FTC_SizeNode)ftcnode;
+    FT_Size       size = node->size;
+    FT_UNUSED( data );
+
+
+    if ( size )
+      FT_Done_Size( size );
+  }
+
+
+  FT_CALLBACK_DEF( FT_Bool )
+  ftc_size_node_compare( FTC_MruNode  ftcnode,
+                         FT_Pointer   ftcscaler )
+  {
+    FTC_SizeNode  node    = (FTC_SizeNode)ftcnode;
+    FTC_Scaler    scaler  = (FTC_Scaler)ftcscaler;
+    FTC_Scaler    scaler0 = &node->scaler;
+
+
+    if ( FTC_SCALER_COMPARE( scaler0, scaler ) )
+    {
+      FT_Activate_Size( node->size );
+      return 1;
+    }
+    return 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  ftc_size_node_init( FTC_MruNode  ftcnode,
+                      FT_Pointer   ftcscaler,
+                      FT_Pointer   ftcmanager )
+  {
+    FTC_SizeNode  node    = (FTC_SizeNode)ftcnode;
+    FTC_Scaler    scaler  = (FTC_Scaler)ftcscaler;
+    FTC_Manager   manager = (FTC_Manager)ftcmanager;
+
+
+    node->scaler = scaler[0];
+
+    return ftc_scaler_lookup_size( manager, scaler, &node->size );
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  ftc_size_node_reset( FTC_MruNode  ftcnode,
+                       FT_Pointer   ftcscaler,
+                       FT_Pointer   ftcmanager )
+  {
+    FTC_SizeNode  node    = (FTC_SizeNode)ftcnode;
+    FTC_Scaler    scaler  = (FTC_Scaler)ftcscaler;
+    FTC_Manager   manager = (FTC_Manager)ftcmanager;
+
+
+    FT_Done_Size( node->size );
+
+    node->scaler = scaler[0];
+
+    return ftc_scaler_lookup_size( manager, scaler, &node->size );
+  }
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FTC_MruListClassRec  ftc_size_list_class =
+  {
+    sizeof ( FTC_SizeNodeRec ),
+    ftc_size_node_compare,
+    ftc_size_node_init,
+    ftc_size_node_reset,
+    ftc_size_node_done
+  };
+
+
+  /* helper function used by ftc_face_node_done */
+  static FT_Bool
+  ftc_size_node_compare_faceid( FTC_MruNode  ftcnode,
+                                FT_Pointer   ftcface_id )
+  {
+    FTC_SizeNode  node    = (FTC_SizeNode)ftcnode;
+    FTC_FaceID    face_id = (FTC_FaceID)ftcface_id;
+
+
+    return FT_BOOL( node->scaler.face_id == face_id );
+  }
+
+
+  /* documentation is in ftcache.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FTC_Manager_LookupSize( FTC_Manager  manager,
+                          FTC_Scaler   scaler,
+                          FT_Size     *asize )
+  {
+    FT_Error     error;
+    FTC_MruNode  mrunode;
+
+
+    if ( asize == NULL )
+      return FTC_Err_Invalid_Argument;
+
+    *asize = NULL;
+
+    if ( !manager )
+      return FTC_Err_Invalid_Cache_Handle;
+
+#ifdef FTC_INLINE
+
+    FTC_MRULIST_LOOKUP_CMP( &manager->sizes, scaler, ftc_size_node_compare,
+                            mrunode, error );
+
+#else
+    error = FTC_MruList_Lookup( &manager->sizes, scaler, &mrunode );
+#endif
+
+    if ( !error )
+      *asize = FTC_SIZE_NODE( mrunode )->size;
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    FACE MRU IMPLEMENTATION                    *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct  FTC_FaceNodeRec_
+  {
+    FTC_MruNodeRec  node;
+    FTC_FaceID      face_id;
+    FT_Face         face;
+
+  } FTC_FaceNodeRec, *FTC_FaceNode;
+
+#define FTC_FACE_NODE( x ) ( ( FTC_FaceNode )( x ) )
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  ftc_face_node_init( FTC_MruNode  ftcnode,
+                      FT_Pointer   ftcface_id,
+                      FT_Pointer   ftcmanager )
+  {
+    FTC_FaceNode  node    = (FTC_FaceNode)ftcnode;
+    FTC_FaceID    face_id = (FTC_FaceID)ftcface_id;
+    FTC_Manager   manager = (FTC_Manager)ftcmanager;
+    FT_Error      error;
+
+
+    node->face_id = face_id;
+
+    error = manager->request_face( face_id,
+                                   manager->library,
+                                   manager->request_data,
+                                   &node->face );
+    if ( !error )
+    {
+      /* destroy initial size object; it will be re-created later */
+      if ( node->face->size )
+        FT_Done_Size( node->face->size );
+    }
+
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  ftc_face_node_done( FTC_MruNode  ftcnode,
+                      FT_Pointer   ftcmanager )
+  {
+    FTC_FaceNode  node    = (FTC_FaceNode)ftcnode;
+    FTC_Manager   manager = (FTC_Manager)ftcmanager;
+
+
+    /* we must begin by removing all scalers for the target face */
+    /* from the manager's list                                   */
+    FTC_MruList_RemoveSelection( &manager->sizes,
+                                 ftc_size_node_compare_faceid,
+                                 node->face_id );
+
+    /* all right, we can discard the face now */
+    FT_Done_Face( node->face );
+    node->face    = NULL;
+    node->face_id = NULL;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Bool )
+  ftc_face_node_compare( FTC_MruNode  ftcnode,
+                         FT_Pointer   ftcface_id )
+  {
+    FTC_FaceNode  node    = (FTC_FaceNode)ftcnode;
+    FTC_FaceID    face_id = (FTC_FaceID)ftcface_id;
+
+
+    return FT_BOOL( node->face_id == face_id );
+  }
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FTC_MruListClassRec  ftc_face_list_class =
+  {
+    sizeof ( FTC_FaceNodeRec),
+
+    ftc_face_node_compare,
+    ftc_face_node_init,
+    0,                          /* FTC_MruNode_ResetFunc */
+    ftc_face_node_done
+  };
+
+
+  /* documentation is in ftcache.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FTC_Manager_LookupFace( FTC_Manager  manager,
+                          FTC_FaceID   face_id,
+                          FT_Face     *aface )
+  {
+    FT_Error     error;
+    FTC_MruNode  mrunode;
+
+
+    if ( aface == NULL )
+      return FTC_Err_Invalid_Argument;
+
+    *aface = NULL;
+
+    if ( !manager )
+      return FTC_Err_Invalid_Cache_Handle;
+
+    /* we break encapsulation for the sake of speed */
+#ifdef FTC_INLINE
+
+    FTC_MRULIST_LOOKUP_CMP( &manager->faces, face_id, ftc_face_node_compare,
+                            mrunode, error );
+
+#else
+    error = FTC_MruList_Lookup( &manager->faces, face_id, &mrunode );
+#endif
+
+    if ( !error )
+      *aface = FTC_FACE_NODE( mrunode )->face;
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    CACHE MANAGER ROUTINES                     *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* documentation is in ftcache.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FTC_Manager_New( FT_Library          library,
+                   FT_UInt             max_faces,
+                   FT_UInt             max_sizes,
+                   FT_ULong            max_bytes,
+                   FTC_Face_Requester  requester,
+                   FT_Pointer          req_data,
+                   FTC_Manager        *amanager )
+  {
+    FT_Error     error;
+    FT_Memory    memory;
+    FTC_Manager  manager = 0;
+
+
+    if ( !library )
+      return FTC_Err_Invalid_Library_Handle;
+
+    memory = library->memory;
+
+    if ( FT_NEW( manager ) )
+      goto Exit;
+
+    if ( max_faces == 0 )
+      max_faces = FTC_MAX_FACES_DEFAULT;
+
+    if ( max_sizes == 0 )
+      max_sizes = FTC_MAX_SIZES_DEFAULT;
+
+    if ( max_bytes == 0 )
+      max_bytes = FTC_MAX_BYTES_DEFAULT;
+
+    manager->library      = library;
+    manager->memory       = memory;
+    manager->max_weight   = max_bytes;
+
+    manager->request_face = requester;
+    manager->request_data = req_data;
+
+    FTC_MruList_Init( &manager->faces,
+                      &ftc_face_list_class,
+                      max_faces,
+                      manager,
+                      memory );
+
+    FTC_MruList_Init( &manager->sizes,
+                      &ftc_size_list_class,
+                      max_sizes,
+                      manager,
+                      memory );
+
+    *amanager = manager;
+
+  Exit:
+    return error;
+  }
+
+
+  /* documentation is in ftcache.h */
+
+  FT_EXPORT_DEF( void )
+  FTC_Manager_Done( FTC_Manager  manager )
+  {
+    FT_Memory  memory;
+    FT_UInt    idx;
+
+
+    if ( !manager || !manager->library )
+      return;
+
+    memory = manager->memory;
+
+    /* now discard all caches */
+    for (idx = manager->num_caches; idx-- > 0; )
+    {
+      FTC_Cache  cache = manager->caches[idx];
+
+
+      if ( cache )
+      {
+        cache->clazz.cache_done( cache );
+        FT_FREE( cache );
+        manager->caches[idx] = NULL;
+      }
+    }
+    manager->num_caches = 0;
+
+    /* discard faces and sizes */
+    FTC_MruList_Done( &manager->sizes );
+    FTC_MruList_Done( &manager->faces );
+
+    manager->library = NULL;
+    manager->memory  = NULL;
+
+    FT_FREE( manager );
+  }
+
+
+  /* documentation is in ftcache.h */
+
+  FT_EXPORT_DEF( void )
+  FTC_Manager_Reset( FTC_Manager  manager )
+  {
+    if ( manager )
+    {
+      FTC_MruList_Reset( &manager->sizes );
+      FTC_MruList_Reset( &manager->faces );
+    }
+    /* XXX: FIXME: flush the caches? */
+  }
+
+
+#ifdef FT_DEBUG_ERROR
+
+  static void
+  FTC_Manager_Check( FTC_Manager  manager )
+  {
+    FTC_Node  node, first;
+
+
+    first = manager->nodes_list;
+
+    /* check node weights */
+    if ( first )
+    {
+      FT_ULong  weight = 0;
+
+
+      node = first;
+
+      do
+      {
+        FTC_Cache  cache = manager->caches[node->cache_index];
+
+
+        if ( (FT_UInt)node->cache_index >= manager->num_caches )
+          FT_TRACE0(( "FTC_Manager_Check: invalid node (cache index = %ld\n",
+                      node->cache_index ));
+        else
+          weight += cache->clazz.node_weight( node, cache );
+
+        node = FTC_NODE__NEXT( node );
+
+      } while ( node != first );
+
+      if ( weight != manager->cur_weight )
+        FT_TRACE0(( "FTC_Manager_Check: invalid weight %ld instead of %ld\n",
+                    manager->cur_weight, weight ));
+    }
+
+    /* check circular list */
+    if ( first )
+    {
+      FT_UFast  count = 0;
+
+
+      node = first;
+      do
+      {
+        count++;
+        node = FTC_NODE__NEXT( node );
+
+      } while ( node != first );
+
+      if ( count != manager->num_nodes )
+        FT_TRACE0(( "FTC_Manager_Check:"
+                    " invalid cache node count %d instead of %d\n",
+                    manager->num_nodes, count ));
+    }
+  }
+
+#endif /* FT_DEBUG_ERROR */
+
+
+  /* `Compress' the manager's data, i.e., get rid of old cache nodes */
+  /* that are not referenced anymore in order to limit the total     */
+  /* memory used by the cache.                                       */
+
+  /* documentation is in ftcmanag.h */
+
+  FT_LOCAL_DEF( void )
+  FTC_Manager_Compress( FTC_Manager  manager )
+  {
+    FTC_Node   node, first;
+
+
+    if ( !manager )
+      return;
+
+    first = manager->nodes_list;
+
+#ifdef FT_DEBUG_ERROR
+    FTC_Manager_Check( manager );
+
+    FT_TRACE0(( "compressing, weight = %ld, max = %ld, nodes = %d\n",
+                manager->cur_weight, manager->max_weight,
+                manager->num_nodes ));
+#endif
+
+    if ( manager->cur_weight < manager->max_weight || first == NULL )
+      return;
+
+    /* go to last node -- it's a circular list */
+    node = FTC_NODE__PREV( first );
+    do
+    {
+      FTC_Node  prev;
+
+
+      prev = ( node == first ) ? NULL : FTC_NODE__PREV( node );
+
+      if ( node->ref_count <= 0 )
+        ftc_node_destroy( node, manager );
+
+      node = prev;
+
+    } while ( node && manager->cur_weight > manager->max_weight );
+  }
+
+
+  /* documentation is in ftcmanag.h */
+
+  FT_LOCAL_DEF( FT_Error )
+  FTC_Manager_RegisterCache( FTC_Manager      manager,
+                             FTC_CacheClass   clazz,
+                             FTC_Cache       *acache )
+  {
+    FT_Error   error = FTC_Err_Invalid_Argument;
+    FTC_Cache  cache = NULL;
+
+
+    if ( manager && clazz && acache )
+    {
+      FT_Memory  memory = manager->memory;
+
+
+      if ( manager->num_caches >= FTC_MAX_CACHES )
+      {
+        error = FTC_Err_Too_Many_Caches;
+        FT_ERROR(( "FTC_Manager_RegisterCache:"
+                   " too many registered caches\n" ));
+        goto Exit;
+      }
+
+      if ( !FT_ALLOC( cache, clazz->cache_size ) )
+      {
+        cache->manager   = manager;
+        cache->memory    = memory;
+        cache->clazz     = clazz[0];
+        cache->org_class = clazz;
+
+        /* THIS IS VERY IMPORTANT!  IT WILL WRETCH THE MANAGER */
+        /* IF IT IS NOT SET CORRECTLY                          */
+        cache->index = manager->num_caches;
+
+        error = clazz->cache_init( cache );
+        if ( error )
+        {
+          clazz->cache_done( cache );
+          FT_FREE( cache );
+          goto Exit;
+        }
+
+        manager->caches[manager->num_caches++] = cache;
+      }
+    }
+
+  Exit:
+    if ( acache )
+      *acache = cache;
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_UInt )
+  FTC_Manager_FlushN( FTC_Manager  manager,
+                      FT_UInt      count )
+  {
+    FTC_Node  first = manager->nodes_list;
+    FTC_Node  node;
+    FT_UInt   result;
+
+
+    /* try to remove `count' nodes from the list */
+    if ( first == NULL )  /* empty list! */
+      return 0;
+
+    /* go to last node - it's a circular list */
+    node = FTC_NODE__PREV(first);
+    for ( result = 0; result < count; )
+    {
+      FTC_Node  prev = FTC_NODE__PREV( node );
+
+
+      /* don't touch locked nodes */
+      if ( node->ref_count <= 0 )
+      {
+        ftc_node_destroy( node, manager );
+        result++;
+      }
+
+      if ( node == first )
+        break;
+
+      node = prev;
+    }
+    return  result;
+  }
+
+
+  /* documentation is in ftcache.h */
+
+  FT_EXPORT_DEF( void )
+  FTC_Manager_RemoveFaceID( FTC_Manager  manager,
+                            FTC_FaceID   face_id )
+  {
+    FT_UInt  nn;
+
+    /* this will remove all FTC_SizeNode that correspond to
+     * the face_id as well
+     */
+    FTC_MruList_RemoveSelection( &manager->faces,
+                                 ftc_face_node_compare,
+                                 face_id );
+
+    for ( nn = 0; nn < manager->num_caches; nn++ )
+      FTC_Cache_RemoveFaceID( manager->caches[nn], face_id );
+  }
+
+
+  /* documentation is in ftcache.h */
+
+  FT_EXPORT_DEF( void )
+  FTC_Node_Unref( FTC_Node     node,
+                  FTC_Manager  manager )
+  {
+    if ( node && (FT_UInt)node->cache_index < manager->num_caches )
+      node->ref_count--;
+  }
+
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  FT_EXPORT_DEF( FT_Error )
+  FTC_Manager_Lookup_Face( FTC_Manager  manager,
+                           FTC_FaceID   face_id,
+                           FT_Face     *aface )
+  {
+    return FTC_Manager_LookupFace( manager, face_id, aface );
+  }
+
+
+  FT_EXPORT( FT_Error )
+  FTC_Manager_Lookup_Size( FTC_Manager  manager,
+                           FTC_Font     font,
+                           FT_Face     *aface,
+                           FT_Size     *asize )
+  {
+    FTC_ScalerRec  scaler;
+    FT_Error       error;
+    FT_Size        size;
+    FT_Face        face;
+
+
+    scaler.face_id = font->face_id;
+    scaler.width   = font->pix_width;
+    scaler.height  = font->pix_height;
+    scaler.pixel   = TRUE;
+    scaler.x_res   = 0;
+    scaler.y_res   = 0;
+
+    error = FTC_Manager_LookupSize( manager, &scaler, &size );
+    if ( error )
+    {
+      face = NULL;
+      size = NULL;
+    }
+    else
+      face = size->face;
+
+    if ( aface )
+      *aface = face;
+
+    if ( asize )
+      *asize = size;
+
+    return error;
+  }
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+/* END */
diff --git a/src/cache/ftcmanag.h b/src/cache/ftcmanag.h
new file mode 100644 (file)
index 0000000..d6c8516
--- /dev/null
@@ -0,0 +1,175 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcmanag.h                                                             */
+/*                                                                         */
+/*    FreeType Cache Manager (specification).                              */
+/*                                                                         */
+/*  Copyright 2000-2001, 2003, 2004, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* A cache manager is in charge of the following:                        */
+  /*                                                                       */
+  /*  - Maintain a mapping between generic FTC_FaceIDs and live FT_Face    */
+  /*    objects.  The mapping itself is performed through a user-provided  */
+  /*    callback.  However, the manager maintains a small cache of FT_Face */
+  /*    and FT_Size objects in order to speed up things considerably.      */
+  /*                                                                       */
+  /*  - Manage one or more cache objects.  Each cache is in charge of      */
+  /*    holding a varying number of `cache nodes'.  Each cache node        */
+  /*    represents a minimal amount of individually accessible cached      */
+  /*    data.  For example, a cache node can be an FT_Glyph image          */
+  /*    containing a vector outline, or some glyph metrics, or anything    */
+  /*    else.                                                              */
+  /*                                                                       */
+  /*    Each cache node has a certain size in bytes that is added to the   */
+  /*    total amount of `cache memory' within the manager.                 */
+  /*                                                                       */
+  /*    All cache nodes are located in a global LRU list, where the oldest */
+  /*    node is at the tail of the list.                                   */
+  /*                                                                       */
+  /*    Each node belongs to a single cache, and includes a reference      */
+  /*    count to avoid destroying it (due to caching).                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*********                                                       *********/
+  /*********             WARNING, THIS IS BETA CODE.               *********/
+  /*********                                                       *********/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#ifndef __FTCMANAG_H__
+#define __FTCMANAG_H__
+
+
+#include <ft2build.h>
+#include FT_CACHE_H
+#include "ftcmru.h"
+#include "ftccache.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Section>                                                             */
+  /*    cache_subsystem                                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#define FTC_MAX_FACES_DEFAULT  2
+#define FTC_MAX_SIZES_DEFAULT  4
+#define FTC_MAX_BYTES_DEFAULT  200000L  /* ~200kByte by default */
+
+  /* maximum number of caches registered in a single manager */
+#define FTC_MAX_CACHES         16
+
+
+  typedef struct  FTC_ManagerRec_
+  {
+    FT_Library          library;
+    FT_Memory           memory;
+
+    FTC_Node            nodes_list;
+    FT_ULong            max_weight;
+    FT_ULong            cur_weight;
+    FT_UInt             num_nodes;
+
+    FTC_Cache           caches[FTC_MAX_CACHES];
+    FT_UInt             num_caches;
+
+    FTC_MruListRec      faces;
+    FTC_MruListRec      sizes;
+
+    FT_Pointer          request_data;
+    FTC_Face_Requester  request_face;
+
+  } FTC_ManagerRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FTC_Manager_Compress                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This function is used to check the state of the cache manager if   */
+  /*    its `num_bytes' field is greater than its `max_bytes' field.  It   */
+  /*    will flush as many old cache nodes as possible (ignoring cache     */
+  /*    nodes with a non-zero reference count).                            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    manager :: A handle to the cache manager.                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Client applications should not call this function directly.  It is */
+  /*    normally invoked by specific cache implementations.                */
+  /*                                                                       */
+  /*    The reason this function is exported is to allow client-specific   */
+  /*    cache classes.                                                     */
+  /*                                                                       */
+  FT_LOCAL( void )
+  FTC_Manager_Compress( FTC_Manager  manager );
+
+
+  /* try to flush `count' old nodes from the cache; return the number
+   * of really flushed nodes
+   */
+  FT_LOCAL( FT_UInt )
+  FTC_Manager_FlushN( FTC_Manager  manager,
+                      FT_UInt      count );
+
+
+  /* this must be used internally for the moment */
+  FT_LOCAL( FT_Error )
+  FTC_Manager_RegisterCache( FTC_Manager      manager,
+                             FTC_CacheClass   clazz,
+                             FTC_Cache       *acache );
+
+ /* */
+
+#define FTC_SCALER_COMPARE( a, b )                \
+    ( (a)->face_id      == (b)->face_id      &&   \
+      (a)->width        == (b)->width        &&   \
+      (a)->height       == (b)->height       &&   \
+      ((a)->pixel != 0) == ((b)->pixel != 0) &&   \
+      ( (a)->pixel ||                             \
+        ( (a)->x_res == (b)->x_res &&             \
+          (a)->y_res == (b)->y_res ) ) )
+
+#define FTC_SCALER_HASH( q )                                 \
+    ( _FTC_FACE_ID_HASH( (q)->face_id ) +                     \
+      (q)->width + (q)->height*7 +                           \
+      ( (q)->pixel ? 0 : ( (q)->x_res*33 ^ (q)->y_res*61 ) ) )
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTCMANAG_H__ */
+
+
+/* END */
diff --git a/src/cache/ftcmru.c b/src/cache/ftcmru.c
new file mode 100644 (file)
index 0000000..dc8b4cc
--- /dev/null
@@ -0,0 +1,357 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcmru.c                                                               */
+/*                                                                         */
+/*    FreeType MRU support (body).                                         */
+/*                                                                         */
+/*  Copyright 2003, 2004, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_CACHE_H
+#include "ftcmru.h"
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_DEBUG_H
+
+#include "ftcerror.h"
+
+
+  FT_LOCAL_DEF( void )
+  FTC_MruNode_Prepend( FTC_MruNode  *plist,
+                       FTC_MruNode   node )
+  {
+    FTC_MruNode  first = *plist;
+
+
+    if ( first )
+    {
+      FTC_MruNode  last = first->prev;
+
+
+#ifdef FT_DEBUG_ERROR
+      {
+        FTC_MruNode  cnode = first;
+
+
+        do
+        {
+          if ( cnode == node )
+          {
+            fprintf( stderr, "FTC_MruNode_Prepend: invalid action\n" );
+            exit( 2 );
+          }
+          cnode = cnode->next;
+
+        } while ( cnode != first );
+      }
+#endif
+
+      first->prev = node;
+      last->next  = node;
+      node->next  = first;
+      node->prev  = last;
+    }
+    else
+    {
+      node->next = node;
+      node->prev = node;
+    }
+    *plist = node;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  FTC_MruNode_Up( FTC_MruNode  *plist,
+                  FTC_MruNode   node )
+  {
+    FTC_MruNode  first = *plist;
+
+
+    FT_ASSERT( first != NULL );
+
+    if ( first != node )
+    {
+      FTC_MruNode  prev, next, last;
+
+
+#ifdef FT_DEBUG_ERROR
+      {
+        FTC_MruNode  cnode = first;
+        do
+        {
+          if ( cnode == node )
+            goto Ok;
+          cnode = cnode->next;
+
+        } while ( cnode != first );
+
+        fprintf( stderr, "FTC_MruNode_Up: invalid action\n" );
+        exit( 2 );
+      Ok:
+      }
+#endif
+      prev = node->prev;
+      next = node->next;
+
+      prev->next = next;
+      next->prev = prev;
+
+      last = first->prev;
+
+      last->next  = node;
+      first->prev = node;
+
+      node->next = first;
+      node->prev = last;
+
+      *plist = node;
+    }
+  }
+
+
+  FT_LOCAL_DEF( void )
+  FTC_MruNode_Remove( FTC_MruNode  *plist,
+                      FTC_MruNode   node )
+  {
+    FTC_MruNode  first = *plist;
+    FTC_MruNode  prev, next;
+
+
+    FT_ASSERT( first != NULL );
+
+#ifdef FT_DEBUG_ERROR
+      {
+        FTC_MruNode  cnode = first;
+
+
+        do
+        {
+          if ( cnode == node )
+            goto Ok;
+          cnode = cnode->next;
+
+        } while ( cnode != first );
+
+        fprintf( stderr, "FTC_MruNode_Remove: invalid action\n" );
+        exit( 2 );
+      Ok:
+      }
+#endif
+
+    prev = node->prev;
+    next = node->next;
+
+    prev->next = next;
+    next->prev = prev;
+
+    if ( node == next )
+    {
+      FT_ASSERT( first == node );
+      FT_ASSERT( prev  == node );
+
+      *plist = NULL;
+    }
+    else if ( node == first )
+      *plist = next;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  FTC_MruList_Init( FTC_MruList       list,
+                    FTC_MruListClass  clazz,
+                    FT_UInt           max_nodes,
+                    FT_Pointer        data,
+                    FT_Memory         memory )
+  {
+    list->num_nodes = 0;
+    list->max_nodes = max_nodes;
+    list->nodes     = NULL;
+    list->clazz     = *clazz;
+    list->data      = data;
+    list->memory    = memory;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  FTC_MruList_Reset( FTC_MruList  list )
+  {
+    while ( list->nodes )
+      FTC_MruList_Remove( list, list->nodes );
+
+    FT_ASSERT( list->num_nodes == 0 );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  FTC_MruList_Done( FTC_MruList  list )
+  {
+    FTC_MruList_Reset( list );
+  }
+
+
+#ifndef FTC_INLINE
+  FT_LOCAL_DEF( FTC_MruNode )
+  FTC_MruList_Find( FTC_MruList  list,
+                    FT_Pointer   key )
+  {
+    FTC_MruNode_CompareFunc  compare = list->clazz.node_compare;
+    FTC_MruNode              first, node;
+
+
+    first = list->nodes;
+    node  = NULL;
+
+    if ( first )
+    {
+      node = first;
+      do
+      {
+        if ( compare( node, key ) )
+        {
+          if ( node != first )
+            FTC_MruNode_Up( &list->nodes, node );
+
+          return node;
+        }
+
+        node = node->next;
+
+      } while ( node != first);
+    }
+
+    return NULL;
+  }
+#endif
+
+  FT_LOCAL_DEF( FT_Error )
+  FTC_MruList_New( FTC_MruList   list,
+                   FT_Pointer    key,
+                   FTC_MruNode  *anode )
+  {
+    FT_Error     error;
+    FTC_MruNode  node = NULL;
+    FT_Memory    memory = list->memory;
+
+
+    if ( list->num_nodes >= list->max_nodes && list->max_nodes > 0 )
+    {
+      node = list->nodes->prev;
+
+      FT_ASSERT( node );
+
+      if ( list->clazz.node_reset )
+      {
+        FTC_MruNode_Up( &list->nodes, node );
+
+        error = list->clazz.node_reset( node, key, list->data );
+        if ( !error )
+          goto Exit;
+      }
+
+      FTC_MruNode_Remove( &list->nodes, node );
+      list->num_nodes--;
+
+      if ( list->clazz.node_done )
+        list->clazz.node_done( node, list->data );
+    }
+    else if ( FT_ALLOC( node, list->clazz.node_size ) )
+      goto Exit;
+
+    error = list->clazz.node_init( node, key, list->data );
+    if ( error )
+      goto Fail;
+
+    FTC_MruNode_Prepend( &list->nodes, node );
+    list->num_nodes++;
+
+  Exit:
+    *anode = node;
+    return error;
+
+  Fail:
+    if ( list->clazz.node_done )
+      list->clazz.node_done( node, list->data );
+
+    FT_FREE( node );
+    goto Exit;
+  }
+
+
+#ifndef FTC_INLINE
+  FT_LOCAL_DEF( FT_Error )
+  FTC_MruList_Lookup( FTC_MruList   list,
+                      FT_Pointer    key,
+                      FTC_MruNode  *anode )
+  {
+    FTC_MruNode  node;
+
+
+    node = FTC_MruList_Find( list, key );
+    if ( node == NULL )
+      return FTC_MruList_New( list, key, anode );
+
+    *anode = node;
+    return 0;
+  }
+#endif /* FTC_INLINE */
+
+  FT_LOCAL_DEF( void )
+  FTC_MruList_Remove( FTC_MruList  list,
+                      FTC_MruNode  node )
+  {
+    FTC_MruNode_Remove( &list->nodes, node );
+    list->num_nodes--;
+
+    {
+      FT_Memory  memory = list->memory;
+
+
+      if ( list->clazz.node_done )
+        list->clazz.node_done( node, list->data );
+
+      FT_FREE( node );
+    }
+  }
+
+
+  FT_LOCAL_DEF( void )
+  FTC_MruList_RemoveSelection( FTC_MruList              list,
+                               FTC_MruNode_CompareFunc  selection,
+                               FT_Pointer               key )
+  {
+    FTC_MruNode  first, node, next;
+
+
+    first = list->nodes;
+    while ( first && ( selection == NULL || selection( first, key ) ) )
+    {
+      FTC_MruList_Remove( list, first );
+      first = list->nodes;
+    }
+
+    if ( first )
+    {
+      node = first->next;
+      while ( node != first )
+      {
+        next = node->next;
+
+        if ( selection( node, key ) )
+          FTC_MruList_Remove( list, node );
+
+        node = next;
+      }
+    }
+  }
+
+
+/* END */
diff --git a/src/cache/ftcmru.h b/src/cache/ftcmru.h
new file mode 100644 (file)
index 0000000..8c3797f
--- /dev/null
@@ -0,0 +1,246 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcmru.h                                                               */
+/*                                                                         */
+/*    Simple MRU list-cache (specification).                               */
+/*                                                                         */
+/*  Copyright 2000-2001, 2003, 2004, 2005, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* An MRU is a list that cannot hold more than a certain number of       */
+  /* elements (`max_elements').  All elements in the list are sorted in    */
+  /* least-recently-used order, i.e., the `oldest' element is at the tail  */
+  /* of the list.                                                          */
+  /*                                                                       */
+  /* When doing a lookup (either through `Lookup()' or `Lookup_Node()'),   */
+  /* the list is searched for an element with the corresponding key.  If   */
+  /* it is found, the element is moved to the head of the list and is      */
+  /* returned.                                                             */
+  /*                                                                       */
+  /* If no corresponding element is found, the lookup routine will try to  */
+  /* obtain a new element with the relevant key.  If the list is already   */
+  /* full, the oldest element from the list is discarded and replaced by a */
+  /* new one; a new element is added to the list otherwise.                */
+  /*                                                                       */
+  /* Note that it is possible to pre-allocate the element list nodes.      */
+  /* This is handy if `max_elements' is sufficiently small, as it saves    */
+  /* allocations/releases during the lookup process.                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef __FTCMRU_H__
+#define __FTCMRU_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#ifdef FREETYPE_H
+#error "freetype.h of FreeType 1 has been loaded!"
+#error "Please fix the directory search order for header files"
+#error "so that freetype.h of FreeType 2 is found first."
+#endif
+
+#define  xxFT_DEBUG_ERROR
+#define  FTC_INLINE
+
+FT_BEGIN_HEADER
+
+  typedef struct FTC_MruNodeRec_*  FTC_MruNode;
+
+  typedef struct  FTC_MruNodeRec_
+  {
+    FTC_MruNode  next;
+    FTC_MruNode  prev;
+
+  } FTC_MruNodeRec;
+
+
+  FT_LOCAL( void )
+  FTC_MruNode_Prepend( FTC_MruNode  *plist,
+                       FTC_MruNode   node );
+
+  FT_LOCAL( void )
+  FTC_MruNode_Up( FTC_MruNode  *plist,
+                  FTC_MruNode   node );
+
+  FT_LOCAL( void )
+  FTC_MruNode_Remove( FTC_MruNode  *plist,
+                      FTC_MruNode   node );
+
+
+  typedef struct FTC_MruListRec_*              FTC_MruList;
+
+  typedef struct FTC_MruListClassRec_ const *  FTC_MruListClass;
+
+
+  typedef FT_Bool
+  (*FTC_MruNode_CompareFunc)( FTC_MruNode  node,
+                              FT_Pointer   key );
+
+  typedef FT_Error
+  (*FTC_MruNode_InitFunc)( FTC_MruNode  node,
+                           FT_Pointer   key,
+                           FT_Pointer   data );
+
+  typedef FT_Error
+  (*FTC_MruNode_ResetFunc)( FTC_MruNode  node,
+                            FT_Pointer   key,
+                            FT_Pointer   data );
+
+  typedef void
+  (*FTC_MruNode_DoneFunc)( FTC_MruNode  node,
+                           FT_Pointer   data );
+
+
+  typedef struct  FTC_MruListClassRec_
+  {
+    FT_Offset                node_size;
+    FTC_MruNode_CompareFunc  node_compare;
+    FTC_MruNode_InitFunc     node_init;
+    FTC_MruNode_ResetFunc    node_reset;
+    FTC_MruNode_DoneFunc     node_done;
+
+  } FTC_MruListClassRec;
+
+  typedef struct  FTC_MruListRec_
+  {
+    FT_UInt              num_nodes;
+    FT_UInt              max_nodes;
+    FTC_MruNode          nodes;
+    FT_Pointer           data;
+    FTC_MruListClassRec  clazz;
+    FT_Memory            memory;
+
+  } FTC_MruListRec;
+
+
+  FT_LOCAL( void )
+  FTC_MruList_Init( FTC_MruList       list,
+                    FTC_MruListClass  clazz,
+                    FT_UInt           max_nodes,
+                    FT_Pointer        data,
+                    FT_Memory         memory );
+
+  FT_LOCAL( void )
+  FTC_MruList_Reset( FTC_MruList  list );
+
+
+  FT_LOCAL( void )
+  FTC_MruList_Done( FTC_MruList  list );
+
+
+  FT_LOCAL( FT_Error )
+  FTC_MruList_New( FTC_MruList   list,
+                   FT_Pointer    key,
+                   FTC_MruNode  *anode );
+
+  FT_LOCAL( void )
+  FTC_MruList_Remove( FTC_MruList  list,
+                      FTC_MruNode  node );
+
+  FT_LOCAL( void )
+  FTC_MruList_RemoveSelection( FTC_MruList              list,
+                               FTC_MruNode_CompareFunc  selection,
+                               FT_Pointer               key );
+
+
+#ifdef FTC_INLINE
+
+#define FTC_MRULIST_LOOKUP_CMP( list, key, compare, node, error )           \
+  FT_BEGIN_STMNT                                                            \
+    FTC_MruNode*             _pfirst  = &(list)->nodes;                     \
+    FTC_MruNode_CompareFunc  _compare = (FTC_MruNode_CompareFunc)(compare); \
+    FTC_MruNode              _first, _node;                                 \
+                                                                            \
+                                                                            \
+    error  = FTC_Err_Ok;                                                    \
+    _first = *(_pfirst);                                                    \
+    _node  = NULL;                                                          \
+                                                                            \
+    if ( _first )                                                           \
+    {                                                                       \
+      _node = _first;                                                       \
+      do                                                                    \
+      {                                                                     \
+        if ( _compare( _node, (key) ) )                                     \
+        {                                                                   \
+          if ( _node != _first )                                            \
+            FTC_MruNode_Up( _pfirst, _node );                               \
+                                                                            \
+          node = _node;                                                     \
+          goto _MruOk;                                                      \
+        }                                                                   \
+        _node = _node->next;                                                \
+                                                                            \
+      } while ( _node != _first) ;                                          \
+    }                                                                       \
+                                                                            \
+    error = FTC_MruList_New( (list), (key), (FTC_MruNode*)(void*)&(node) ); \
+  _MruOk:                                                                   \
+    ;                                                                       \
+  FT_END_STMNT
+
+#define FTC_MRULIST_LOOKUP( list, key, node, error ) \
+  FTC_MRULIST_LOOKUP_CMP( list, key, (list)->clazz.node_compare, node, error )
+
+#else  /* !FTC_INLINE */
+
+  FT_LOCAL( FTC_MruNode )
+  FTC_MruList_Find( FTC_MruList  list,
+                    FT_Pointer   key );
+
+  FT_LOCAL( FT_Error )
+  FTC_MruList_Lookup( FTC_MruList   list,
+                      FT_Pointer    key,
+                      FTC_MruNode  *pnode );
+
+#define FTC_MRULIST_LOOKUP( list, key, node, error ) \
+  error = FTC_MruList_Lookup( (list), (key), (FTC_MruNode*)&(node) )
+
+#endif /* !FTC_INLINE */
+
+
+#define FTC_MRULIST_LOOP( list, node )        \
+  FT_BEGIN_STMNT                              \
+    FTC_MruNode  _first = (list)->nodes;      \
+                                              \
+                                              \
+    if ( _first )                             \
+    {                                         \
+      FTC_MruNode  _node = _first;            \
+                                              \
+                                              \
+      do                                      \
+      {                                       \
+        *(FTC_MruNode*)&(node) = _node;
+
+
+#define FTC_MRULIST_LOOP_END()               \
+        _node = _node->next;                 \
+                                             \
+      } while ( _node != _first );           \
+    }                                        \
+  FT_END_STMNT
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __FTCMRU_H__ */
+
+
+/* END */
diff --git a/src/cache/ftcsbits.c b/src/cache/ftcsbits.c
new file mode 100644 (file)
index 0000000..8bf8d60
--- /dev/null
@@ -0,0 +1,421 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcsbits.c                                                             */
+/*                                                                         */
+/*    FreeType sbits manager (body).                                       */
+/*                                                                         */
+/*  Copyright 2000-2001, 2002, 2003, 2004, 2005, 2006, 2009, 2010, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_CACHE_H
+#include "ftcsbits.h"
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_ERRORS_H
+
+#include "ftccback.h"
+#include "ftcerror.h"
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cache
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     SBIT CACHE NODES                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  static FT_Error
+  ftc_sbit_copy_bitmap( FTC_SBit    sbit,
+                        FT_Bitmap*  bitmap,
+                        FT_Memory   memory )
+  {
+    FT_Error  error;
+    FT_Int    pitch = bitmap->pitch;
+    FT_ULong  size;
+
+
+    if ( pitch < 0 )
+      pitch = -pitch;
+
+    size = (FT_ULong)( pitch * bitmap->rows );
+
+    if ( !FT_ALLOC( sbit->buffer, size ) )
+      FT_MEM_COPY( sbit->buffer, bitmap->buffer, size );
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  ftc_snode_free( FTC_Node   ftcsnode,
+                  FTC_Cache  cache )
+  {
+    FTC_SNode  snode  = (FTC_SNode)ftcsnode;
+    FTC_SBit   sbit   = snode->sbits;
+    FT_UInt    count  = snode->count;
+    FT_Memory  memory = cache->memory;
+
+
+    for ( ; count > 0; sbit++, count-- )
+      FT_FREE( sbit->buffer );
+
+    FTC_GNode_Done( FTC_GNODE( snode ), cache );
+
+    FT_FREE( snode );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  FTC_SNode_Free( FTC_SNode  snode,
+                  FTC_Cache  cache )
+  {
+    ftc_snode_free( FTC_NODE( snode ), cache );
+  }
+
+
+  /*
+   *  This function tries to load a small bitmap within a given FTC_SNode.
+   *  Note that it returns a non-zero error code _only_ in the case of
+   *  out-of-memory condition.  For all other errors (e.g., corresponding
+   *  to a bad font file), this function will mark the sbit as `unavailable'
+   *  and return a value of 0.
+   *
+   *  You should also read the comment within the @ftc_snode_compare
+   *  function below to see how out-of-memory is handled during a lookup.
+   */
+  static FT_Error
+  ftc_snode_load( FTC_SNode    snode,
+                  FTC_Manager  manager,
+                  FT_UInt      gindex,
+                  FT_ULong    *asize )
+  {
+    FT_Error          error;
+    FTC_GNode         gnode  = FTC_GNODE( snode );
+    FTC_Family        family = gnode->family;
+    FT_Memory         memory = manager->memory;
+    FT_Face           face;
+    FTC_SBit          sbit;
+    FTC_SFamilyClass  clazz;
+
+
+    if ( (FT_UInt)(gindex - gnode->gindex) >= snode->count )
+    {
+      FT_ERROR(( "ftc_snode_load: invalid glyph index" ));
+      return FTC_Err_Invalid_Argument;
+    }
+
+    sbit  = snode->sbits + ( gindex - gnode->gindex );
+    clazz = (FTC_SFamilyClass)family->clazz;
+
+    sbit->buffer = 0;
+
+    error = clazz->family_load_glyph( family, gindex, manager, &face );
+    if ( error )
+      goto BadGlyph;
+
+    {
+      FT_Int        temp;
+      FT_GlyphSlot  slot   = face->glyph;
+      FT_Bitmap*    bitmap = &slot->bitmap;
+      FT_Pos        xadvance, yadvance; /* FT_GlyphSlot->advance.{x|y} */
+
+
+      if ( slot->format != FT_GLYPH_FORMAT_BITMAP )
+      {
+        FT_TRACE0(( "ftc_snode_load:"
+                    " glyph loaded didn't return a bitmap\n" ));
+        goto BadGlyph;
+      }
+
+      /* Check that our values fit into 8-bit containers!       */
+      /* If this is not the case, our bitmap is too large       */
+      /* and we will leave it as `missing' with sbit.buffer = 0 */
+
+#define CHECK_CHAR( d )  ( temp = (FT_Char)d, temp == d )
+#define CHECK_BYTE( d )  ( temp = (FT_Byte)d, temp == d )
+
+      /* horizontal advance in pixels */
+      xadvance = ( slot->advance.x + 32 ) >> 6;
+      yadvance = ( slot->advance.y + 32 ) >> 6;
+
+      if ( !CHECK_BYTE( bitmap->rows  )     ||
+           !CHECK_BYTE( bitmap->width )     ||
+           !CHECK_CHAR( bitmap->pitch )     ||
+           !CHECK_CHAR( slot->bitmap_left ) ||
+           !CHECK_CHAR( slot->bitmap_top  ) ||
+           !CHECK_CHAR( xadvance )          ||
+           !CHECK_CHAR( yadvance )          )
+      {
+        FT_TRACE2(( "ftc_snode_load:"
+                    " glyph too large for small bitmap cache\n"));
+        goto BadGlyph;
+      }
+
+      sbit->width     = (FT_Byte)bitmap->width;
+      sbit->height    = (FT_Byte)bitmap->rows;
+      sbit->pitch     = (FT_Char)bitmap->pitch;
+      sbit->left      = (FT_Char)slot->bitmap_left;
+      sbit->top       = (FT_Char)slot->bitmap_top;
+      sbit->xadvance  = (FT_Char)xadvance;
+      sbit->yadvance  = (FT_Char)yadvance;
+      sbit->format    = (FT_Byte)bitmap->pixel_mode;
+      sbit->max_grays = (FT_Byte)(bitmap->num_grays - 1);
+
+      /* copy the bitmap into a new buffer -- ignore error */
+      error = ftc_sbit_copy_bitmap( sbit, bitmap, memory );
+
+      /* now, compute size */
+      if ( asize )
+        *asize = FT_ABS( sbit->pitch ) * sbit->height;
+
+    } /* glyph loading successful */
+
+    /* ignore the errors that might have occurred --   */
+    /* we mark unloaded glyphs with `sbit.buffer == 0' */
+    /* and `width == 255', `height == 0'               */
+    /*                                                 */
+    if ( error && error != FTC_Err_Out_Of_Memory )
+    {
+    BadGlyph:
+      sbit->width  = 255;
+      sbit->height = 0;
+      sbit->buffer = NULL;
+      error        = FTC_Err_Ok;
+      if ( asize )
+        *asize = 0;
+    }
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  FTC_SNode_New( FTC_SNode  *psnode,
+                 FTC_GQuery  gquery,
+                 FTC_Cache   cache )
+  {
+    FT_Memory   memory = cache->memory;
+    FT_Error    error;
+    FTC_SNode   snode  = NULL;
+    FT_UInt     gindex = gquery->gindex;
+    FTC_Family  family = gquery->family;
+
+    FTC_SFamilyClass  clazz = FTC_CACHE__SFAMILY_CLASS( cache );
+    FT_UInt           total;
+    FT_UInt           node_count;
+
+
+    total = clazz->family_get_count( family, cache->manager );
+    if ( total == 0 || gindex >= total )
+    {
+      error = FTC_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    if ( !FT_NEW( snode ) )
+    {
+      FT_UInt  count, start;
+
+
+      start = gindex - ( gindex % FTC_SBIT_ITEMS_PER_NODE );
+      count = total - start;
+      if ( count > FTC_SBIT_ITEMS_PER_NODE )
+        count = FTC_SBIT_ITEMS_PER_NODE;
+
+      FTC_GNode_Init( FTC_GNODE( snode ), start, family );
+
+      snode->count = count;
+      for ( node_count = 0; node_count < count; node_count++ )
+      {
+        snode->sbits[node_count].width = 255;
+      }
+
+      error = ftc_snode_load( snode,
+                              cache->manager,
+                              gindex,
+                              NULL );
+      if ( error )
+      {
+        FTC_SNode_Free( snode, cache );
+        snode = NULL;
+      }
+    }
+
+  Exit:
+    *psnode = snode;
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  ftc_snode_new( FTC_Node   *ftcpsnode,
+                 FT_Pointer  ftcgquery,
+                 FTC_Cache   cache )
+  {
+    FTC_SNode  *psnode = (FTC_SNode*)ftcpsnode;
+    FTC_GQuery  gquery = (FTC_GQuery)ftcgquery;
+
+
+    return FTC_SNode_New( psnode, gquery, cache );
+  }
+
+
+  FT_LOCAL_DEF( FT_Offset )
+  ftc_snode_weight( FTC_Node   ftcsnode,
+                    FTC_Cache  cache )
+  {
+    FTC_SNode  snode = (FTC_SNode)ftcsnode;
+    FT_UInt    count = snode->count;
+    FTC_SBit   sbit  = snode->sbits;
+    FT_Int     pitch;
+    FT_Offset  size;
+
+    FT_UNUSED( cache );
+
+
+    FT_ASSERT( snode->count <= FTC_SBIT_ITEMS_PER_NODE );
+
+    /* the node itself */
+    size = sizeof ( *snode );
+
+    for ( ; count > 0; count--, sbit++ )
+    {
+      if ( sbit->buffer )
+      {
+        pitch = sbit->pitch;
+        if ( pitch < 0 )
+          pitch = -pitch;
+
+        /* add the size of a given glyph image */
+        size += pitch * sbit->height;
+      }
+    }
+
+    return size;
+  }
+
+
+#if 0
+
+  FT_LOCAL_DEF( FT_Offset )
+  FTC_SNode_Weight( FTC_SNode  snode )
+  {
+    return ftc_snode_weight( FTC_NODE( snode ), NULL );
+  }
+
+#endif /* 0 */
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  ftc_snode_compare( FTC_Node    ftcsnode,
+                     FT_Pointer  ftcgquery,
+                     FTC_Cache   cache,
+                     FT_Bool*    list_changed )
+  {
+    FTC_SNode   snode  = (FTC_SNode)ftcsnode;
+    FTC_GQuery  gquery = (FTC_GQuery)ftcgquery;
+    FTC_GNode   gnode  = FTC_GNODE( snode );
+    FT_UInt     gindex = gquery->gindex;
+    FT_Bool     result;
+
+
+    if (list_changed)
+      *list_changed = FALSE;
+    result = FT_BOOL( gnode->family == gquery->family                    &&
+                      (FT_UInt)( gindex - gnode->gindex ) < snode->count );
+    if ( result )
+    {
+      /* check if we need to load the glyph bitmap now */
+      FTC_SBit  sbit = snode->sbits + ( gindex - gnode->gindex );
+
+
+      /*
+       *  The following code illustrates what to do when you want to
+       *  perform operations that may fail within a lookup function.
+       *
+       *  Here, we want to load a small bitmap on-demand; we thus
+       *  need to call the `ftc_snode_load' function which may return
+       *  a non-zero error code only when we are out of memory (OOM).
+       *
+       *  The correct thing to do is to use @FTC_CACHE_TRYLOOP and
+       *  @FTC_CACHE_TRYLOOP_END in order to implement a retry loop
+       *  that is capable of flushing the cache incrementally when
+       *  an OOM errors occur.
+       *
+       *  However, we need to `lock' the node before this operation to
+       *  prevent it from being flushed within the loop.
+       *
+       *  When we exit the loop, we unlock the node, then check the `error'
+       *  variable.  If it is non-zero, this means that the cache was
+       *  completely flushed and that no usable memory was found to load
+       *  the bitmap.
+       *
+       *  We then prefer to return a value of 0 (i.e., NO MATCH).  This
+       *  ensures that the caller will try to allocate a new node.
+       *  This operation consequently _fail_ and the lookup function
+       *  returns the appropriate OOM error code.
+       *
+       *  Note that `buffer == NULL && width == 255' is a hack used to
+       *  tag `unavailable' bitmaps in the array.  We should never try
+       *  to load these.
+       *
+       */
+
+      if ( sbit->buffer == NULL && sbit->width == 255 )
+      {
+        FT_ULong  size;
+        FT_Error  error;
+
+
+        ftcsnode->ref_count++;  /* lock node to prevent flushing */
+                                /* in retry loop                 */
+
+        FTC_CACHE_TRYLOOP( cache )
+        {
+          error = ftc_snode_load( snode, cache->manager, gindex, &size );
+        }
+        FTC_CACHE_TRYLOOP_END( list_changed );
+
+        ftcsnode->ref_count--;  /* unlock the node */
+
+        if ( error )
+          result = 0;
+        else
+          cache->manager->cur_weight += size;
+      }
+    }
+
+    return result;
+  }
+
+
+#ifdef FTC_INLINE
+
+  FT_LOCAL_DEF( FT_Bool )
+  FTC_SNode_Compare( FTC_SNode   snode,
+                     FTC_GQuery  gquery,
+                     FTC_Cache   cache,
+                     FT_Bool*    list_changed )
+  {
+    return ftc_snode_compare( FTC_NODE( snode ), gquery,
+                              cache, list_changed );
+  }
+
+#endif
+
+/* END */
diff --git a/src/cache/ftcsbits.h b/src/cache/ftcsbits.h
new file mode 100644 (file)
index 0000000..df55dca
--- /dev/null
@@ -0,0 +1,103 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftcsbits.h                                                             */
+/*                                                                         */
+/*    A small-bitmap cache (specification).                                */
+/*                                                                         */
+/*  Copyright 2000-2001, 2002, 2003, 2006, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTCSBITS_H__
+#define __FTCSBITS_H__
+
+
+#include <ft2build.h>
+#include FT_CACHE_H
+#include "ftcglyph.h"
+
+
+FT_BEGIN_HEADER
+
+#define FTC_SBIT_ITEMS_PER_NODE  16
+
+  typedef struct  FTC_SNodeRec_
+  {
+    FTC_GNodeRec  gnode;
+    FT_UInt       count;
+    FTC_SBitRec   sbits[FTC_SBIT_ITEMS_PER_NODE];
+
+  } FTC_SNodeRec, *FTC_SNode;
+
+
+#define FTC_SNODE( x )         ( (FTC_SNode)( x ) )
+#define FTC_SNODE_GINDEX( x )  FTC_GNODE( x )->gindex
+#define FTC_SNODE_FAMILY( x )  FTC_GNODE( x )->family
+
+  typedef FT_UInt
+  (*FTC_SFamily_GetCountFunc)( FTC_Family   family,
+                               FTC_Manager  manager );
+
+  typedef FT_Error
+  (*FTC_SFamily_LoadGlyphFunc)( FTC_Family   family,
+                                FT_UInt      gindex,
+                                FTC_Manager  manager,
+                                FT_Face     *aface );
+
+  typedef struct  FTC_SFamilyClassRec_
+  {
+    FTC_MruListClassRec        clazz;
+    FTC_SFamily_GetCountFunc   family_get_count;
+    FTC_SFamily_LoadGlyphFunc  family_load_glyph;
+
+  } FTC_SFamilyClassRec;
+
+  typedef const FTC_SFamilyClassRec*  FTC_SFamilyClass;
+
+#define FTC_SFAMILY_CLASS( x )  ((FTC_SFamilyClass)(x))
+
+#define FTC_CACHE__SFAMILY_CLASS( x )  \
+          FTC_SFAMILY_CLASS( FTC_CACHE__GCACHE_CLASS( x )->family_class )
+
+
+  FT_LOCAL( void )
+  FTC_SNode_Free( FTC_SNode  snode,
+                  FTC_Cache  cache );
+
+  FT_LOCAL( FT_Error )
+  FTC_SNode_New( FTC_SNode   *psnode,
+                 FTC_GQuery   gquery,
+                 FTC_Cache    cache );
+
+#if 0
+  FT_LOCAL( FT_ULong )
+  FTC_SNode_Weight( FTC_SNode  inode );
+#endif
+
+
+#ifdef FTC_INLINE
+
+  FT_LOCAL( FT_Bool )
+  FTC_SNode_Compare( FTC_SNode   snode,
+                     FTC_GQuery  gquery,
+                     FTC_Cache   cache,
+                     FT_Bool*    list_changed);
+
+#endif
+
+  /* */
+
+FT_END_HEADER
+
+#endif /* __FTCSBITS_H__ */
+
+
+/* END */
diff --git a/src/cache/rules.mk b/src/cache/rules.mk
new file mode 100644 (file)
index 0000000..ed75a6a
--- /dev/null
@@ -0,0 +1,80 @@
+#
+# FreeType 2 Cache configuration rules
+#
+
+
+# Copyright 2000, 2001, 2003, 2004, 2006, 2008 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.
+
+
+# Cache driver directory
+#
+CACHE_DIR   := $(SRC_DIR)/cache
+
+# compilation flags for the driver
+#
+CACHE_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CACHE_DIR))
+
+
+# Cache driver sources (i.e., C files)
+#
+CACHE_DRV_SRC := $(CACHE_DIR)/ftcbasic.c \
+                 $(CACHE_DIR)/ftccache.c \
+                 $(CACHE_DIR)/ftccmap.c  \
+                 $(CACHE_DIR)/ftcglyph.c \
+                 $(CACHE_DIR)/ftcimage.c \
+                 $(CACHE_DIR)/ftcmanag.c \
+                 $(CACHE_DIR)/ftcmru.c   \
+                 $(CACHE_DIR)/ftcsbits.c
+
+# Cache driver headers
+#
+CACHE_DRV_H := $(CACHE_DIR)/ftccache.h \
+               $(CACHE_DIR)/ftccback.h \
+               $(CACHE_DIR)/ftcerror.h \
+               $(CACHE_DIR)/ftcglyph.h \
+               $(CACHE_DIR)/ftcimage.h \
+               $(CACHE_DIR)/ftcmanag.h \
+               $(CACHE_DIR)/ftcmru.h   \
+               $(CACHE_DIR)/ftcsbits.h
+
+
+# Cache driver object(s)
+#
+#   CACHE_DRV_OBJ_M is used during `multi' builds.
+#   CACHE_DRV_OBJ_S is used during `single' builds.
+#
+CACHE_DRV_OBJ_M := $(CACHE_DRV_SRC:$(CACHE_DIR)/%.c=$(OBJ_DIR)/%.$O)
+CACHE_DRV_OBJ_S := $(OBJ_DIR)/ftcache.$O
+
+# Cache driver source file for single build
+#
+CACHE_DRV_SRC_S := $(CACHE_DIR)/ftcache.c
+
+
+# Cache driver - single object
+#
+$(CACHE_DRV_OBJ_S): $(CACHE_DRV_SRC_S) $(CACHE_DRV_SRC) \
+                   $(FREETYPE_H) $(CACHE_DRV_H)
+       $(CACHE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CACHE_DRV_SRC_S))
+
+
+# Cache driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(CACHE_DIR)/%.c $(FREETYPE_H) $(CACHE_DRV_H)
+       $(CACHE_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(CACHE_DRV_OBJ_S)
+DRV_OBJS_M += $(CACHE_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/cff/Jamfile b/src/cff/Jamfile
new file mode 100644 (file)
index 0000000..6705d3c
--- /dev/null
@@ -0,0 +1,29 @@
+# FreeType 2 src/cff Jamfile
+#
+# Copyright 2001, 2002 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) cff ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = cffdrivr cffgload cffload cffobjs cffparse cffcmap cffpic ;
+  }
+  else
+  {
+    _sources = cff ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/cff Jamfile
diff --git a/src/cff/cff.c b/src/cff/cff.c
new file mode 100644 (file)
index 0000000..fccfd44
--- /dev/null
@@ -0,0 +1,30 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cff.c                                                                  */
+/*                                                                         */
+/*    FreeType OpenType driver component (body only).                      */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include <ft2build.h>
+#include "cffpic.c"
+#include "cffdrivr.c"
+#include "cffparse.c"
+#include "cffload.c"
+#include "cffobjs.c"
+#include "cffgload.c"
+#include "cffcmap.c"
+
+/* END */
diff --git a/src/cff/cffcmap.c b/src/cff/cffcmap.c
new file mode 100644 (file)
index 0000000..1298371
--- /dev/null
@@ -0,0 +1,208 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffcmap.c                                                              */
+/*                                                                         */
+/*    CFF character mapping table (cmap) support (body).                   */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004, 2005, 2006, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "cffcmap.h"
+#include "cffload.h"
+
+#include "cfferrs.h"
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****           CFF STANDARD (AND EXPERT) ENCODING CMAPS            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_CALLBACK_DEF( FT_Error )
+  cff_cmap_encoding_init( CFF_CMapStd  cmap )
+  {
+    TT_Face       face     = (TT_Face)FT_CMAP_FACE( cmap );
+    CFF_Font      cff      = (CFF_Font)face->extra.data;
+    CFF_Encoding  encoding = &cff->encoding;
+
+
+    cmap->gids  = encoding->codes;
+
+    return 0;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  cff_cmap_encoding_done( CFF_CMapStd  cmap )
+  {
+    cmap->gids  = NULL;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  cff_cmap_encoding_char_index( CFF_CMapStd  cmap,
+                                FT_UInt32    char_code )
+  {
+    FT_UInt  result = 0;
+
+
+    if ( char_code < 256 )
+      result = cmap->gids[char_code];
+
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  cff_cmap_encoding_char_next( CFF_CMapStd   cmap,
+                               FT_UInt32    *pchar_code )
+  {
+    FT_UInt    result    = 0;
+    FT_UInt32  char_code = *pchar_code;
+
+
+    *pchar_code = 0;
+
+    if ( char_code < 255 )
+    {
+      FT_UInt  code = (FT_UInt)(char_code + 1);
+
+
+      for (;;)
+      {
+        if ( code >= 256 )
+          break;
+
+        result = cmap->gids[code];
+        if ( result != 0 )
+        {
+          *pchar_code = code;
+          break;
+        }
+
+        code++;
+      }
+    }
+    return result;
+  }
+
+
+  FT_DEFINE_CMAP_CLASS(cff_cmap_encoding_class_rec,
+    sizeof ( CFF_CMapStdRec ),
+
+    (FT_CMap_InitFunc)     cff_cmap_encoding_init,
+    (FT_CMap_DoneFunc)     cff_cmap_encoding_done,
+    (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index,
+    (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next,
+
+    NULL, NULL, NULL, NULL, NULL
+  )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****              CFF SYNTHETIC UNICODE ENCODING CMAP              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_CALLBACK_DEF( const char* )
+  cff_sid_to_glyph_name( TT_Face  face,
+                         FT_UInt  idx )
+  {
+    CFF_Font     cff     = (CFF_Font)face->extra.data;
+    CFF_Charset  charset = &cff->charset;
+    FT_UInt      sid     = charset->sids[idx];
+
+
+    return cff_index_get_sid_string( cff, sid );
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  cff_cmap_unicode_init( PS_Unicodes  unicodes )
+  {
+    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
+    FT_Memory           memory  = FT_FACE_MEMORY( face );
+    CFF_Font            cff     = (CFF_Font)face->extra.data;
+    CFF_Charset         charset = &cff->charset;
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
+
+
+    /* can't build Unicode map for CID-keyed font */
+    /* because we don't know glyph names.         */
+    if ( !charset->sids )
+      return CFF_Err_No_Unicode_Glyph_Name;
+
+    return psnames->unicodes_init( memory,
+                                   unicodes,
+                                   cff->num_glyphs,
+                                   (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name,
+                                   (PS_FreeGlyphNameFunc)NULL,
+                                   (FT_Pointer)face );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  cff_cmap_unicode_done( PS_Unicodes  unicodes )
+  {
+    FT_Face    face   = FT_CMAP_FACE( unicodes );
+    FT_Memory  memory = FT_FACE_MEMORY( face );
+
+
+    FT_FREE( unicodes->maps );
+    unicodes->num_maps = 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  cff_cmap_unicode_char_index( PS_Unicodes  unicodes,
+                               FT_UInt32    char_code )
+  {
+    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
+    CFF_Font            cff     = (CFF_Font)face->extra.data;
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
+
+
+    return psnames->unicodes_char_index( unicodes, char_code );
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  cff_cmap_unicode_char_next( PS_Unicodes  unicodes,
+                              FT_UInt32   *pchar_code )
+  {
+    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
+    CFF_Font            cff     = (CFF_Font)face->extra.data;
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
+
+
+    return psnames->unicodes_char_next( unicodes, pchar_code );
+  }
+
+
+  FT_DEFINE_CMAP_CLASS(cff_cmap_unicode_class_rec,
+    sizeof ( PS_UnicodesRec ),
+
+    (FT_CMap_InitFunc)     cff_cmap_unicode_init,
+    (FT_CMap_DoneFunc)     cff_cmap_unicode_done,
+    (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index,
+    (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next,
+
+    NULL, NULL, NULL, NULL, NULL
+  )
+
+/* END */
diff --git a/src/cff/cffcmap.h b/src/cff/cffcmap.h
new file mode 100644 (file)
index 0000000..3f7f67b
--- /dev/null
@@ -0,0 +1,67 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffcmap.h                                                              */
+/*                                                                         */
+/*    CFF character mapping table (cmap) support (specification).          */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CFFCMAP_H__
+#define __CFFCMAP_H__
+
+#include "cffobjs.h"
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****          TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* standard (and expert) encoding cmaps */
+  typedef struct CFF_CMapStdRec_*  CFF_CMapStd;
+
+  typedef struct  CFF_CMapStdRec_
+  {
+    FT_CMapRec  cmap;
+    FT_UShort*  gids;   /* up to 256 elements */
+
+  } CFF_CMapStdRec;
+
+
+  FT_DECLARE_CMAP_CLASS(cff_cmap_encoding_class_rec)
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****               CFF SYNTHETIC UNICODE ENCODING CMAP             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* unicode (synthetic) cmaps */
+
+  FT_DECLARE_CMAP_CLASS(cff_cmap_unicode_class_rec)
+
+
+FT_END_HEADER
+
+#endif /* __CFFCMAP_H__ */
+
+
+/* END */
diff --git a/src/cff/cffdrivr.c b/src/cff/cffdrivr.c
new file mode 100644 (file)
index 0000000..eb4c14e
--- /dev/null
@@ -0,0 +1,688 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffdrivr.c                                                             */
+/*                                                                         */
+/*    OpenType font driver implementation (body).                          */
+/*                                                                         */
+/*  Copyright 1996-2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_SFNT_H
+#include FT_SERVICE_CID_H
+#include FT_SERVICE_POSTSCRIPT_INFO_H
+#include FT_SERVICE_POSTSCRIPT_NAME_H
+#include FT_SERVICE_TT_CMAP_H
+
+#include "cffdrivr.h"
+#include "cffgload.h"
+#include "cffload.h"
+#include "cffcmap.h"
+#include "cffparse.h"
+
+#include "cfferrs.h"
+#include "cffpic.h"
+
+#include FT_SERVICE_XFREE86_NAME_H
+#include FT_SERVICE_GLYPH_DICT_H
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cffdriver
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                          F A C E S                              ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#undef  PAIR_TAG
+#define PAIR_TAG( left, right )  ( ( (FT_ULong)left << 16 ) | \
+                                     (FT_ULong)right        )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_get_kerning                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A driver method used to return the kerning vector between two      */
+  /*    glyphs of the same face.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face        :: A handle to the source face object.                 */
+  /*                                                                       */
+  /*    left_glyph  :: The index of the left glyph in the kern pair.       */
+  /*                                                                       */
+  /*    right_glyph :: The index of the right glyph in the kern pair.      */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    kerning     :: The kerning vector.  This is in font units for      */
+  /*                   scalable formats, and in pixels for fixed-sizes     */
+  /*                   formats.                                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only horizontal layouts (left-to-right & right-to-left) are        */
+  /*    supported by this function.  Other layouts, or more sophisticated  */
+  /*    kernings, are out of scope of this method (the basic driver        */
+  /*    interface is meant to be simple).                                  */
+  /*                                                                       */
+  /*    They can be implemented by format-specific interfaces.             */
+  /*                                                                       */
+  FT_CALLBACK_DEF( FT_Error )
+  cff_get_kerning( FT_Face     ttface,          /* TT_Face */
+                   FT_UInt     left_glyph,
+                   FT_UInt     right_glyph,
+                   FT_Vector*  kerning )
+  {
+    TT_Face       face = (TT_Face)ttface;
+    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
+
+
+    kerning->x = 0;
+    kerning->y = 0;
+
+    if ( sfnt )
+      kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );
+
+    return CFF_Err_Ok;
+  }
+
+
+#undef PAIR_TAG
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_glyph_load                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A driver method used to load a glyph within a given glyph slot.    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    slot        :: A handle to the target slot object where the glyph  */
+  /*                   will be loaded.                                     */
+  /*                                                                       */
+  /*    size        :: A handle to the source face size at which the glyph */
+  /*                   must be scaled, loaded, etc.                        */
+  /*                                                                       */
+  /*    glyph_index :: The index of the glyph in the font file.            */
+  /*                                                                       */
+  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
+  /*                   FT_LOAD_??? constants can be used to control the    */
+  /*                   glyph loading process (e.g., whether the outline    */
+  /*                   should be scaled, whether to load bitmaps or not,   */
+  /*                   whether to hint the outline, etc).                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_CALLBACK_DEF( FT_Error )
+  cff_glyph_load( FT_GlyphSlot  cffslot,      /* CFF_GlyphSlot */
+                  FT_Size       cffsize,      /* CFF_Size      */
+                  FT_UInt       glyph_index,
+                  FT_Int32      load_flags )
+  {
+    FT_Error       error;
+    CFF_GlyphSlot  slot = (CFF_GlyphSlot)cffslot;
+    CFF_Size       size = (CFF_Size)cffsize;
+
+
+    if ( !slot )
+      return CFF_Err_Invalid_Slot_Handle;
+
+    /* check whether we want a scaled outline or bitmap */
+    if ( !size )
+      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
+
+    /* reset the size object if necessary */
+    if ( load_flags & FT_LOAD_NO_SCALE )
+      size = NULL;
+
+    if ( size )
+    {
+      /* these two objects must have the same parent */
+      if ( cffsize->face != cffslot->face )
+        return CFF_Err_Invalid_Face_Handle;
+    }
+
+    /* now load the glyph outline if necessary */
+    error = cff_slot_load( slot, size, glyph_index, load_flags );
+
+    /* force drop-out mode to 2 - irrelevant now */
+    /* slot->outline.dropout_mode = 2; */
+
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  cff_get_advances( FT_Face    face,
+                    FT_UInt    start,
+                    FT_UInt    count,
+                    FT_Int32   flags,
+                    FT_Fixed*  advances )
+  {
+    FT_UInt       nn;
+    FT_Error      error = CFF_Err_Ok;
+    FT_GlyphSlot  slot  = face->glyph;
+
+
+    flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
+
+    for ( nn = 0; nn < count; nn++ )
+    {
+      error = cff_glyph_load( slot, face->size, start + nn, flags );
+      if ( error )
+        break;
+
+      advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
+                     ? slot->linearVertAdvance
+                     : slot->linearHoriAdvance;
+    }
+
+    return error;
+  }
+
+
+  /*
+   *  GLYPH DICT SERVICE
+   *
+   */
+
+  static FT_Error
+  cff_get_glyph_name( CFF_Face    face,
+                      FT_UInt     glyph_index,
+                      FT_Pointer  buffer,
+                      FT_UInt     buffer_max )
+  {
+    CFF_Font    font   = (CFF_Font)face->extra.data;
+    FT_String*  gname;
+    FT_UShort   sid;
+    FT_Error    error;
+
+
+    if ( !font->psnames )
+    {
+      FT_ERROR(( "cff_get_glyph_name:"
+                 " cannot get glyph name from CFF & CEF fonts\n"
+                 "                   "
+                 " without the `PSNames' module\n" ));
+      error = CFF_Err_Missing_Module;
+      goto Exit;
+    }
+
+    /* first, locate the sid in the charset table */
+    sid = font->charset.sids[glyph_index];
+
+    /* now, lookup the name itself */
+    gname = cff_index_get_sid_string( font, sid );
+
+    if ( gname )
+      FT_STRCPYN( buffer, gname, buffer_max );
+
+    error = CFF_Err_Ok;
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_UInt
+  cff_get_name_index( CFF_Face    face,
+                      FT_String*  glyph_name )
+  {
+    CFF_Font            cff;
+    CFF_Charset         charset;
+    FT_Service_PsCMaps  psnames;
+    FT_String*          name;
+    FT_UShort           sid;
+    FT_UInt             i;
+
+
+    cff     = (CFF_FontRec *)face->extra.data;
+    charset = &cff->charset;
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
+    if ( !psnames )
+      return 0;
+
+    for ( i = 0; i < cff->num_glyphs; i++ )
+    {
+      sid = charset->sids[i];
+
+      if ( sid > 390 )
+        name = cff_index_get_string( cff, sid - 391 );
+      else
+        name = (FT_String *)psnames->adobe_std_strings( sid );
+
+      if ( !name )
+        continue;
+
+      if ( !ft_strcmp( glyph_name, name ) )
+        return i;
+    }
+
+    return 0;
+  }
+
+
+  FT_DEFINE_SERVICE_GLYPHDICTREC(cff_service_glyph_dict,
+    (FT_GlyphDict_GetNameFunc)  cff_get_glyph_name,
+    (FT_GlyphDict_NameIndexFunc)cff_get_name_index
+  )
+
+
+  /*
+   *  POSTSCRIPT INFO SERVICE
+   *
+   */
+
+  static FT_Int
+  cff_ps_has_glyph_names( FT_Face  face )
+  {
+    return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0;
+  }
+
+
+  static FT_Error
+  cff_ps_get_font_info( CFF_Face         face,
+                        PS_FontInfoRec*  afont_info )
+  {
+    CFF_Font  cff   = (CFF_Font)face->extra.data;
+    FT_Error  error = CFF_Err_Ok;
+
+
+    if ( cff && cff->font_info == NULL )
+    {
+      CFF_FontRecDict  dict   = &cff->top_font.font_dict;
+      PS_FontInfoRec  *font_info = NULL;
+      FT_Memory        memory = face->root.memory;
+
+
+      if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) )
+        goto Fail;
+
+      font_info->version     = cff_index_get_sid_string( cff,
+                                                         dict->version );
+      font_info->notice      = cff_index_get_sid_string( cff,
+                                                         dict->notice );
+      font_info->full_name   = cff_index_get_sid_string( cff,
+                                                         dict->full_name );
+      font_info->family_name = cff_index_get_sid_string( cff,
+                                                         dict->family_name );
+      font_info->weight      = cff_index_get_sid_string( cff,
+                                                         dict->weight );
+      font_info->italic_angle        = dict->italic_angle;
+      font_info->is_fixed_pitch      = dict->is_fixed_pitch;
+      font_info->underline_position  = (FT_Short)dict->underline_position;
+      font_info->underline_thickness = (FT_Short)dict->underline_thickness;
+
+      cff->font_info = font_info;
+    }
+
+    if ( cff )
+      *afont_info = *cff->font_info;
+
+  Fail:
+    return error;
+  }
+
+
+  FT_DEFINE_SERVICE_PSINFOREC(cff_service_ps_info,
+    (PS_GetFontInfoFunc)   cff_ps_get_font_info,
+    (PS_GetFontExtraFunc)  NULL,
+    (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names,
+    (PS_GetFontPrivateFunc)NULL,        /* unsupported with CFF fonts */
+    (PS_GetFontValueFunc)  NULL         /* not implemented            */
+  )
+
+
+  /*
+   *  POSTSCRIPT NAME SERVICE
+   *
+   */
+
+  static const char*
+  cff_get_ps_name( CFF_Face  face )
+  {
+    CFF_Font  cff = (CFF_Font)face->extra.data;
+
+
+    return (const char*)cff->font_name;
+  }
+
+
+  FT_DEFINE_SERVICE_PSFONTNAMEREC(cff_service_ps_name,
+    (FT_PsName_GetFunc)cff_get_ps_name
+  )
+
+
+  /*
+   * TT CMAP INFO
+   *
+   * If the charmap is a synthetic Unicode encoding cmap or
+   * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO
+   * service defined in SFNT module.
+   *
+   * Otherwise call the service function in the sfnt module.
+   *
+   */
+  static FT_Error
+  cff_get_cmap_info( FT_CharMap    charmap,
+                     TT_CMapInfo  *cmap_info )
+  {
+    FT_CMap   cmap  = FT_CMAP( charmap );
+    FT_Error  error = CFF_Err_Ok;
+    FT_Face    face    = FT_CMAP_FACE( cmap );
+    FT_Library library = FT_FACE_LIBRARY( face );
+
+
+    cmap_info->language = 0;
+    cmap_info->format   = 0;
+
+    if ( cmap->clazz != &FT_CFF_CMAP_ENCODING_CLASS_REC_GET &&
+         cmap->clazz != &FT_CFF_CMAP_UNICODE_CLASS_REC_GET  )
+    {
+      FT_Module           sfnt    = FT_Get_Module( library, "sfnt" );
+      FT_Service_TTCMaps  service =
+        (FT_Service_TTCMaps)ft_module_get_service( sfnt,
+                                                   FT_SERVICE_ID_TT_CMAP );
+
+
+      if ( service && service->get_cmap_info )
+        error = service->get_cmap_info( charmap, cmap_info );
+    }
+
+    return error;
+  }
+
+
+  FT_DEFINE_SERVICE_TTCMAPSREC(cff_service_get_cmap_info,
+    (TT_CMap_Info_GetFunc)cff_get_cmap_info
+  )
+
+
+  /*
+   *  CID INFO SERVICE
+   *
+   */
+  static FT_Error
+  cff_get_ros( CFF_Face      face,
+               const char*  *registry,
+               const char*  *ordering,
+               FT_Int       *supplement )
+  {
+    FT_Error  error = CFF_Err_Ok;
+    CFF_Font  cff   = (CFF_Font)face->extra.data;
+
+
+    if ( cff )
+    {
+      CFF_FontRecDict  dict = &cff->top_font.font_dict;
+
+
+      if ( dict->cid_registry == 0xFFFFU )
+      {
+        error = CFF_Err_Invalid_Argument;
+        goto Fail;
+      }
+
+      if ( registry )
+      {
+        if ( cff->registry == NULL )
+          cff->registry = cff_index_get_sid_string( cff,
+                                                    dict->cid_registry );
+        *registry = cff->registry;
+      }
+
+      if ( ordering )
+      {
+        if ( cff->ordering == NULL )
+          cff->ordering = cff_index_get_sid_string( cff,
+                                                    dict->cid_ordering );
+        *ordering = cff->ordering;
+      }
+
+      /*
+       * XXX: According to Adobe TechNote #5176, the supplement in CFF
+       *      can be a real number. We truncate it to fit public API
+       *      since freetype-2.3.6.
+       */
+      if ( supplement )
+      {
+        if ( dict->cid_supplement < FT_INT_MIN ||
+             dict->cid_supplement > FT_INT_MAX )
+          FT_TRACE1(( "cff_get_ros: too large supplement %d is truncated\n",
+                      dict->cid_supplement ));
+        *supplement = (FT_Int)dict->cid_supplement;
+      }
+    }
+
+  Fail:
+    return error;
+  }
+
+
+  static FT_Error
+  cff_get_is_cid( CFF_Face  face,
+                  FT_Bool  *is_cid )
+  {
+    FT_Error  error = CFF_Err_Ok;
+    CFF_Font  cff   = (CFF_Font)face->extra.data;
+
+
+    *is_cid = 0;
+
+    if ( cff )
+    {
+      CFF_FontRecDict  dict = &cff->top_font.font_dict;
+
+
+      if ( dict->cid_registry != 0xFFFFU )
+        *is_cid = 1;
+    }
+
+    return error;
+  }
+
+
+  static FT_Error
+  cff_get_cid_from_glyph_index( CFF_Face  face,
+                                FT_UInt   glyph_index,
+                                FT_UInt  *cid )
+  {
+    FT_Error  error = CFF_Err_Ok;
+    CFF_Font  cff;
+
+
+    cff = (CFF_Font)face->extra.data;
+
+    if ( cff )
+    {
+      FT_UInt          c;
+      CFF_FontRecDict  dict = &cff->top_font.font_dict;
+
+
+      if ( dict->cid_registry == 0xFFFFU )
+      {
+        error = CFF_Err_Invalid_Argument;
+        goto Fail;
+      }
+
+      if ( glyph_index > cff->num_glyphs )
+      {
+        error = CFF_Err_Invalid_Argument;
+        goto Fail;
+      }
+
+      c = cff->charset.sids[glyph_index];
+
+      if ( cid )
+        *cid = c;
+    }
+
+  Fail:
+    return error;
+  }
+
+
+  FT_DEFINE_SERVICE_CIDREC(cff_service_cid_info,
+    (FT_CID_GetRegistryOrderingSupplementFunc)cff_get_ros,
+    (FT_CID_GetIsInternallyCIDKeyedFunc)      cff_get_is_cid,
+    (FT_CID_GetCIDFromGlyphIndexFunc)         cff_get_cid_from_glyph_index
+  )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                D R I V E R  I N T E R F A C E                   ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES
+  FT_DEFINE_SERVICEDESCREC6(cff_services,
+    FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_CFF,
+    FT_SERVICE_ID_POSTSCRIPT_INFO,      &FT_CFF_SERVICE_PS_INFO_GET,
+    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_CFF_SERVICE_PS_NAME_GET,
+    FT_SERVICE_ID_GLYPH_DICT,           &FT_CFF_SERVICE_GLYPH_DICT_GET,
+    FT_SERVICE_ID_TT_CMAP,              &FT_CFF_SERVICE_GET_CMAP_INFO_GET,
+    FT_SERVICE_ID_CID,                  &FT_CFF_SERVICE_CID_INFO_GET
+  )
+#else
+  FT_DEFINE_SERVICEDESCREC5(cff_services,
+    FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_CFF,
+    FT_SERVICE_ID_POSTSCRIPT_INFO,      &FT_CFF_SERVICE_PS_INFO_GET,
+    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_CFF_SERVICE_PS_NAME_GET,
+    FT_SERVICE_ID_TT_CMAP,              &FT_CFF_SERVICE_GET_CMAP_INFO_GET,
+    FT_SERVICE_ID_CID,                  &FT_CFF_SERVICE_CID_INFO_GET
+  )
+#endif
+
+  FT_CALLBACK_DEF( FT_Module_Interface )
+  cff_get_interface( FT_Module    driver,       /* CFF_Driver */
+                     const char*  module_interface )
+  {
+    FT_Library           library;
+    FT_Module            sfnt;
+    FT_Module_Interface  result;
+
+
+    /* FT_CFF_SERVICES_GET derefers `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+    if ( !driver )
+      return NULL;
+    library = driver->library;
+    if ( !library )
+      return NULL;
+#endif
+
+    result = ft_service_list_lookup( FT_CFF_SERVICES_GET, module_interface );
+    if ( result != NULL )
+      return result;
+
+    /* `driver' is not yet evaluated in non-PIC mode */
+#ifndef FT_CONFIG_OPTION_PIC
+    if ( !driver )
+      return NULL;
+    library = driver->library;
+    if ( !library )
+      return NULL;
+#endif
+
+    /* we pass our request to the `sfnt' module */
+    sfnt = FT_Get_Module( library, "sfnt" );
+
+    return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0;
+  }
+
+
+  /* The FT_DriverInterface structure is defined in ftdriver.h. */
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#define CFF_SIZE_SELECT cff_size_select
+#else
+#define CFF_SIZE_SELECT 0
+#endif
+
+  FT_DEFINE_DRIVER( cff_driver_class,
+
+      FT_MODULE_FONT_DRIVER       |
+      FT_MODULE_DRIVER_SCALABLE   |
+      FT_MODULE_DRIVER_HAS_HINTER,
+
+      sizeof ( CFF_DriverRec ),
+      "cff",
+      0x10000L,
+      0x20000L,
+
+      0,   /* module-specific interface */
+
+      cff_driver_init,
+      cff_driver_done,
+      cff_get_interface,
+
+    /* now the specific driver fields */
+    sizeof ( TT_FaceRec ),
+    sizeof ( CFF_SizeRec ),
+    sizeof ( CFF_GlyphSlotRec ),
+
+    cff_face_init,
+    cff_face_done,
+    cff_size_init,
+    cff_size_done,
+    cff_slot_init,
+    cff_slot_done,
+
+    ft_stub_set_char_sizes,  /* FT_CONFIG_OPTION_OLD_INTERNALS */
+    ft_stub_set_pixel_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+    cff_glyph_load,
+
+    cff_get_kerning,
+    0,                       /* FT_Face_AttachFunc */
+    cff_get_advances,
+
+    cff_size_request,
+
+    CFF_SIZE_SELECT
+  )
+
+
+/* END */
diff --git a/src/cff/cffdrivr.h b/src/cff/cffdrivr.h
new file mode 100644 (file)
index 0000000..50e8138
--- /dev/null
@@ -0,0 +1,38 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffdrivr.h                                                             */
+/*                                                                         */
+/*    High-level OpenType driver interface (specification).                */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CFFDRIVER_H__
+#define __CFFDRIVER_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DRIVER_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_DECLARE_DRIVER( cff_driver_class )
+
+
+FT_END_HEADER
+
+#endif /* __CFFDRIVER_H__ */
+
+
+/* END */
diff --git a/src/cff/cfferrs.h b/src/cff/cfferrs.h
new file mode 100644 (file)
index 0000000..801d73e
--- /dev/null
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cfferrs.h                                                              */
+/*                                                                         */
+/*    CFF error codes (specification only).                                */
+/*                                                                         */
+/*  Copyright 2001, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the CFF error enumeration constants.      */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __CFFERRS_H__
+#define __CFFERRS_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  CFF_Err_
+#define FT_ERR_BASE    FT_Mod_Err_CFF
+
+
+#include FT_ERRORS_H
+
+#endif /* __CFFERRS_H__ */
+
+
+/* END */
diff --git a/src/cff/cffgload.c b/src/cff/cffgload.c
new file mode 100644 (file)
index 0000000..84847fd
--- /dev/null
@@ -0,0 +1,2972 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffgload.c                                                             */
+/*                                                                         */
+/*    OpenType Glyph Loader (body).                                        */
+/*                                                                         */
+/*  Copyright 1996-2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_SFNT_H
+#include FT_OUTLINE_H
+
+#include "cffobjs.h"
+#include "cffload.h"
+#include "cffgload.h"
+
+#include "cfferrs.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cffgload
+
+
+  typedef enum  CFF_Operator_
+  {
+    cff_op_unknown = 0,
+
+    cff_op_rmoveto,
+    cff_op_hmoveto,
+    cff_op_vmoveto,
+
+    cff_op_rlineto,
+    cff_op_hlineto,
+    cff_op_vlineto,
+
+    cff_op_rrcurveto,
+    cff_op_hhcurveto,
+    cff_op_hvcurveto,
+    cff_op_rcurveline,
+    cff_op_rlinecurve,
+    cff_op_vhcurveto,
+    cff_op_vvcurveto,
+
+    cff_op_flex,
+    cff_op_hflex,
+    cff_op_hflex1,
+    cff_op_flex1,
+
+    cff_op_endchar,
+
+    cff_op_hstem,
+    cff_op_vstem,
+    cff_op_hstemhm,
+    cff_op_vstemhm,
+
+    cff_op_hintmask,
+    cff_op_cntrmask,
+    cff_op_dotsection,  /* deprecated, acts as no-op */
+
+    cff_op_abs,
+    cff_op_add,
+    cff_op_sub,
+    cff_op_div,
+    cff_op_neg,
+    cff_op_random,
+    cff_op_mul,
+    cff_op_sqrt,
+
+    cff_op_blend,
+
+    cff_op_drop,
+    cff_op_exch,
+    cff_op_index,
+    cff_op_roll,
+    cff_op_dup,
+
+    cff_op_put,
+    cff_op_get,
+    cff_op_store,
+    cff_op_load,
+
+    cff_op_and,
+    cff_op_or,
+    cff_op_not,
+    cff_op_eq,
+    cff_op_ifelse,
+
+    cff_op_callsubr,
+    cff_op_callgsubr,
+    cff_op_return,
+
+    /* Type 1 opcodes: invalid but seen in real life */
+    cff_op_hsbw,
+    cff_op_closepath,
+    cff_op_callothersubr,
+    cff_op_pop,
+    cff_op_seac,
+    cff_op_sbw,
+    cff_op_setcurrentpoint,
+
+    /* do not remove */
+    cff_op_max
+
+  } CFF_Operator;
+
+
+#define CFF_COUNT_CHECK_WIDTH  0x80
+#define CFF_COUNT_EXACT        0x40
+#define CFF_COUNT_CLEAR_STACK  0x20
+
+  /* count values which have the `CFF_COUNT_CHECK_WIDTH' flag set are  */
+  /* used for checking the width and requested numbers of arguments    */
+  /* only; they are set to zero afterwards                             */
+
+  /* the other two flags are informative only and unused currently     */
+
+  static const FT_Byte  cff_argument_counts[] =
+  {
+    0,  /* unknown */
+
+    2 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, /* rmoveto */
+    1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,
+    1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT,
+
+    0 | CFF_COUNT_CLEAR_STACK, /* rlineto */
+    0 | CFF_COUNT_CLEAR_STACK,
+    0 | CFF_COUNT_CLEAR_STACK,
+
+    0 | CFF_COUNT_CLEAR_STACK, /* rrcurveto */
+    0 | CFF_COUNT_CLEAR_STACK,
+    0 | CFF_COUNT_CLEAR_STACK,
+    0 | CFF_COUNT_CLEAR_STACK,
+    0 | CFF_COUNT_CLEAR_STACK,
+    0 | CFF_COUNT_CLEAR_STACK,
+    0 | CFF_COUNT_CLEAR_STACK,
+
+    13, /* flex */
+    7,
+    9,
+    11,
+
+    0 | CFF_COUNT_CHECK_WIDTH, /* endchar */
+
+    2 | CFF_COUNT_CHECK_WIDTH, /* hstem */
+    2 | CFF_COUNT_CHECK_WIDTH,
+    2 | CFF_COUNT_CHECK_WIDTH,
+    2 | CFF_COUNT_CHECK_WIDTH,
+
+    0 | CFF_COUNT_CHECK_WIDTH, /* hintmask */
+    0 | CFF_COUNT_CHECK_WIDTH, /* cntrmask */
+    0, /* dotsection */
+
+    1, /* abs */
+    2,
+    2,
+    2,
+    1,
+    0,
+    2,
+    1,
+
+    1, /* blend */
+
+    1, /* drop */
+    2,
+    1,
+    2,
+    1,
+
+    2, /* put */
+    1,
+    4,
+    3,
+
+    2, /* and */
+    2,
+    1,
+    2,
+    4,
+
+    1, /* callsubr */
+    1,
+    0,
+
+    2, /* hsbw */
+    0,
+    0,
+    0,
+    5, /* seac */
+    4, /* sbw */
+    2  /* setcurrentpoint */
+  };
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /**********                                                      *********/
+  /**********                                                      *********/
+  /**********             GENERIC CHARSTRING PARSING               *********/
+  /**********                                                      *********/
+  /**********                                                      *********/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_builder_init                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a given glyph builder.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    builder :: A pointer to the glyph builder to initialize.           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face    :: The current face object.                                */
+  /*                                                                       */
+  /*    size    :: The current size object.                                */
+  /*                                                                       */
+  /*    glyph   :: The current glyph object.                               */
+  /*                                                                       */
+  /*    hinting :: Whether hinting is active.                              */
+  /*                                                                       */
+  static void
+  cff_builder_init( CFF_Builder*   builder,
+                    TT_Face        face,
+                    CFF_Size       size,
+                    CFF_GlyphSlot  glyph,
+                    FT_Bool        hinting )
+  {
+    builder->path_begun  = 0;
+    builder->load_points = 1;
+
+    builder->face   = face;
+    builder->glyph  = glyph;
+    builder->memory = face->root.memory;
+
+    if ( glyph )
+    {
+      FT_GlyphLoader  loader = glyph->root.internal->loader;
+
+
+      builder->loader  = loader;
+      builder->base    = &loader->base.outline;
+      builder->current = &loader->current.outline;
+      FT_GlyphLoader_Rewind( loader );
+
+      builder->hints_globals = 0;
+      builder->hints_funcs   = 0;
+
+      if ( hinting && size )
+      {
+        CFF_Internal  internal = (CFF_Internal)size->root.internal;
+
+
+        builder->hints_globals = (void *)internal->topfont;
+        builder->hints_funcs   = glyph->root.internal->glyph_hints;
+      }
+    }
+
+    builder->pos_x = 0;
+    builder->pos_y = 0;
+
+    builder->left_bearing.x = 0;
+    builder->left_bearing.y = 0;
+    builder->advance.x      = 0;
+    builder->advance.y      = 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_builder_done                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalizes a given glyph builder.  Its contents can still be used   */
+  /*    after the call, but the function saves important information       */
+  /*    within the corresponding glyph slot.                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    builder :: A pointer to the glyph builder to finalize.             */
+  /*                                                                       */
+  static void
+  cff_builder_done( CFF_Builder*  builder )
+  {
+    CFF_GlyphSlot  glyph = builder->glyph;
+
+
+    if ( glyph )
+      glyph->root.outline = *builder->base;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_compute_bias                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Computes the bias value in dependence of the number of glyph       */
+  /*    subroutines.                                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    in_charstring_type :: The `CharstringType' value of the top DICT   */
+  /*                          dictionary.                                  */
+  /*                                                                       */
+  /*    num_subrs          :: The number of glyph subroutines.             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The bias value.                                                    */
+  static FT_Int
+  cff_compute_bias( FT_Int   in_charstring_type,
+                    FT_UInt  num_subrs )
+  {
+    FT_Int  result;
+
+
+    if ( in_charstring_type == 1 )
+      result = 0;
+    else if ( num_subrs < 1240 )
+      result = 107;
+    else if ( num_subrs < 33900U )
+      result = 1131;
+    else
+      result = 32768U;
+
+    return result;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_decoder_init                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a given glyph decoder.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    decoder :: A pointer to the glyph builder to initialize.           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face      :: The current face object.                              */
+  /*                                                                       */
+  /*    size      :: The current size object.                              */
+  /*                                                                       */
+  /*    slot      :: The current glyph object.                             */
+  /*                                                                       */
+  /*    hinting   :: Whether hinting is active.                            */
+  /*                                                                       */
+  /*    hint_mode :: The hinting mode.                                     */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  cff_decoder_init( CFF_Decoder*    decoder,
+                    TT_Face         face,
+                    CFF_Size        size,
+                    CFF_GlyphSlot   slot,
+                    FT_Bool         hinting,
+                    FT_Render_Mode  hint_mode )
+  {
+    CFF_Font  cff = (CFF_Font)face->extra.data;
+
+
+    /* clear everything */
+    FT_MEM_ZERO( decoder, sizeof ( *decoder ) );
+
+    /* initialize builder */
+    cff_builder_init( &decoder->builder, face, size, slot, hinting );
+
+    /* initialize Type2 decoder */
+    decoder->cff          = cff;
+    decoder->num_globals  = cff->global_subrs_index.count;
+    decoder->globals      = cff->global_subrs;
+    decoder->globals_bias = cff_compute_bias(
+                              cff->top_font.font_dict.charstring_type,
+                              decoder->num_globals );
+
+    decoder->hint_mode    = hint_mode;
+  }
+
+
+  /* this function is used to select the subfont */
+  /* and the locals subrs array                  */
+  FT_LOCAL_DEF( FT_Error )
+  cff_decoder_prepare( CFF_Decoder*  decoder,
+                       CFF_Size      size,
+                       FT_UInt       glyph_index )
+  {
+    CFF_Builder  *builder = &decoder->builder;
+    CFF_Font      cff     = (CFF_Font)builder->face->extra.data;
+    CFF_SubFont   sub     = &cff->top_font;
+    FT_Error      error   = CFF_Err_Ok;
+
+
+    /* manage CID fonts */
+    if ( cff->num_subfonts )
+    {
+      FT_Byte  fd_index = cff_fd_select_get( &cff->fd_select, glyph_index );
+
+
+      if ( fd_index >= cff->num_subfonts )
+      {
+        FT_TRACE4(( "cff_decoder_prepare: invalid CID subfont index\n" ));
+        error = CFF_Err_Invalid_File_Format;
+        goto Exit;
+      }
+
+      FT_TRACE3(( "glyph index %d (subfont %d):\n", glyph_index, fd_index ));
+
+      sub = cff->subfonts[fd_index];
+
+      if ( builder->hints_funcs && size )
+      {
+        CFF_Internal  internal = (CFF_Internal)size->root.internal;
+
+
+        /* for CFFs without subfonts, this value has already been set */
+        builder->hints_globals = (void *)internal->subfonts[fd_index];
+      }
+    }
+#ifdef FT_DEBUG_LEVEL_TRACE
+    else
+      FT_TRACE3(( "glyph index %d:\n", glyph_index ));
+#endif
+
+    decoder->num_locals    = sub->local_subrs_index.count;
+    decoder->locals        = sub->local_subrs;
+    decoder->locals_bias   = cff_compute_bias(
+                               decoder->cff->top_font.font_dict.charstring_type,
+                               decoder->num_locals );
+
+    decoder->glyph_width   = sub->private_dict.default_width;
+    decoder->nominal_width = sub->private_dict.nominal_width;
+
+  Exit:
+    return error;
+  }
+
+
+  /* check that there is enough space for `count' more points */
+  static FT_Error
+  check_points( CFF_Builder*  builder,
+                FT_Int        count )
+  {
+    return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 );
+  }
+
+
+  /* add a new point, do not check space */
+  static void
+  cff_builder_add_point( CFF_Builder*  builder,
+                         FT_Pos        x,
+                         FT_Pos        y,
+                         FT_Byte       flag )
+  {
+    FT_Outline*  outline = builder->current;
+
+
+    if ( builder->load_points )
+    {
+      FT_Vector*  point   = outline->points + outline->n_points;
+      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points;
+
+
+      point->x = x >> 16;
+      point->y = y >> 16;
+      *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );
+    }
+
+    outline->n_points++;
+  }
+
+
+  /* check space for a new on-curve point, then add it */
+  static FT_Error
+  cff_builder_add_point1( CFF_Builder*  builder,
+                          FT_Pos        x,
+                          FT_Pos        y )
+  {
+    FT_Error  error;
+
+
+    error = check_points( builder, 1 );
+    if ( !error )
+      cff_builder_add_point( builder, x, y, 1 );
+
+    return error;
+  }
+
+
+  /* check space for a new contour, then add it */
+  static FT_Error
+  cff_builder_add_contour( CFF_Builder*  builder )
+  {
+    FT_Outline*  outline = builder->current;
+    FT_Error     error;
+
+
+    if ( !builder->load_points )
+    {
+      outline->n_contours++;
+      return CFF_Err_Ok;
+    }
+
+    error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 );
+    if ( !error )
+    {
+      if ( outline->n_contours > 0 )
+        outline->contours[outline->n_contours - 1] =
+          (short)( outline->n_points - 1 );
+
+      outline->n_contours++;
+    }
+
+    return error;
+  }
+
+
+  /* if a path was begun, add its first on-curve point */
+  static FT_Error
+  cff_builder_start_point( CFF_Builder*  builder,
+                           FT_Pos        x,
+                           FT_Pos        y )
+  {
+    FT_Error  error = CFF_Err_Ok;
+
+
+    /* test whether we are building a new contour */
+    if ( !builder->path_begun )
+    {
+      builder->path_begun = 1;
+      error = cff_builder_add_contour( builder );
+      if ( !error )
+        error = cff_builder_add_point1( builder, x, y );
+    }
+
+    return error;
+  }
+
+
+  /* close the current contour */
+  static void
+  cff_builder_close_contour( CFF_Builder*  builder )
+  {
+    FT_Outline*  outline = builder->current;
+    FT_Int       first;
+
+
+    if ( !outline )
+      return;
+
+    first = outline->n_contours <= 1
+            ? 0 : outline->contours[outline->n_contours - 2] + 1;
+
+    /* We must not include the last point in the path if it */
+    /* is located on the first point.                       */
+    if ( outline->n_points > 1 )
+    {
+      FT_Vector*  p1      = outline->points + first;
+      FT_Vector*  p2      = outline->points + outline->n_points - 1;
+      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points - 1;
+
+
+      /* `delete' last point only if it coincides with the first    */
+      /* point and if it is not a control point (which can happen). */
+      if ( p1->x == p2->x && p1->y == p2->y )
+        if ( *control == FT_CURVE_TAG_ON )
+          outline->n_points--;
+    }
+
+    if ( outline->n_contours > 0 )
+    {
+      /* Don't add contours only consisting of one point, i.e., */
+      /* check whether begin point and last point are the same. */
+      if ( first == outline->n_points - 1 )
+      {
+        outline->n_contours--;
+        outline->n_points--;
+      }
+      else
+        outline->contours[outline->n_contours - 1] =
+          (short)( outline->n_points - 1 );
+    }
+  }
+
+
+  static FT_Int
+  cff_lookup_glyph_by_stdcharcode( CFF_Font  cff,
+                                   FT_Int    charcode )
+  {
+    FT_UInt    n;
+    FT_UShort  glyph_sid;
+
+
+    /* CID-keyed fonts don't have glyph names */
+    if ( !cff->charset.sids )
+      return -1;
+
+    /* check range of standard char code */
+    if ( charcode < 0 || charcode > 255 )
+      return -1;
+
+    /* Get code to SID mapping from `cff_standard_encoding'. */
+    glyph_sid = cff_get_standard_encoding( (FT_UInt)charcode );
+
+    for ( n = 0; n < cff->num_glyphs; n++ )
+    {
+      if ( cff->charset.sids[n] == glyph_sid )
+        return n;
+    }
+
+    return -1;
+  }
+
+
+  static FT_Error
+  cff_get_glyph_data( TT_Face    face,
+                      FT_UInt    glyph_index,
+                      FT_Byte**  pointer,
+                      FT_ULong*  length )
+  {
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    /* For incremental fonts get the character data using the */
+    /* callback function.                                     */
+    if ( face->root.internal->incremental_interface )
+    {
+      FT_Data   data;
+      FT_Error  error =
+                  face->root.internal->incremental_interface->funcs->get_glyph_data(
+                    face->root.internal->incremental_interface->object,
+                    glyph_index, &data );
+
+
+      *pointer = (FT_Byte*)data.pointer;
+      *length = data.length;
+
+      return error;
+    }
+    else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+    {
+      CFF_Font  cff  = (CFF_Font)(face->extra.data);
+
+
+      return cff_index_access_element( &cff->charstrings_index, glyph_index,
+                                       pointer, length );
+    }
+  }
+
+
+  static void
+  cff_free_glyph_data( TT_Face    face,
+                       FT_Byte**  pointer,
+                       FT_ULong   length )
+  {
+#ifndef FT_CONFIG_OPTION_INCREMENTAL
+    FT_UNUSED( length );
+#endif
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    /* For incremental fonts get the character data using the */
+    /* callback function.                                     */
+    if ( face->root.internal->incremental_interface )
+    {
+      FT_Data data;
+
+
+      data.pointer = *pointer;
+      data.length  = length;
+
+      face->root.internal->incremental_interface->funcs->free_glyph_data(
+        face->root.internal->incremental_interface->object, &data );
+    }
+    else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+    {
+      CFF_Font  cff = (CFF_Font)(face->extra.data);
+
+
+      cff_index_forget_element( &cff->charstrings_index, pointer );
+    }
+  }
+
+
+  static FT_Error
+  cff_operator_seac( CFF_Decoder*  decoder,
+                     FT_Pos        asb,
+                     FT_Pos        adx,
+                     FT_Pos        ady,
+                     FT_Int        bchar,
+                     FT_Int        achar )
+  {
+    FT_Error      error;
+    CFF_Builder*  builder = &decoder->builder;
+    FT_Int        bchar_index, achar_index;
+    TT_Face       face = decoder->builder.face;
+    FT_Vector     left_bearing, advance;
+    FT_Byte*      charstring;
+    FT_ULong      charstring_len;
+    FT_Pos        glyph_width;
+
+
+    if ( decoder->seac )
+    {
+      FT_ERROR(( "cff_operator_seac: invalid nested seac\n" ));
+      return CFF_Err_Syntax_Error;
+    }
+
+    adx += decoder->builder.left_bearing.x;
+    ady += decoder->builder.left_bearing.y;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    /* Incremental fonts don't necessarily have valid charsets.        */
+    /* They use the character code, not the glyph index, in this case. */
+    if ( face->root.internal->incremental_interface )
+    {
+      bchar_index = bchar;
+      achar_index = achar;
+    }
+    else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+    {
+      CFF_Font cff = (CFF_Font)(face->extra.data);
+
+
+      bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar );
+      achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar );
+    }
+
+    if ( bchar_index < 0 || achar_index < 0 )
+    {
+      FT_ERROR(( "cff_operator_seac:"
+                 " invalid seac character code arguments\n" ));
+      return CFF_Err_Syntax_Error;
+    }
+
+    /* If we are trying to load a composite glyph, do not load the */
+    /* accent character and return the array of subglyphs.         */
+    if ( builder->no_recurse )
+    {
+      FT_GlyphSlot    glyph  = (FT_GlyphSlot)builder->glyph;
+      FT_GlyphLoader  loader = glyph->internal->loader;
+      FT_SubGlyph     subg;
+
+
+      /* reallocate subglyph array if necessary */
+      error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 );
+      if ( error )
+        goto Exit;
+
+      subg = loader->current.subglyphs;
+
+      /* subglyph 0 = base character */
+      subg->index = bchar_index;
+      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES |
+                    FT_SUBGLYPH_FLAG_USE_MY_METRICS;
+      subg->arg1  = 0;
+      subg->arg2  = 0;
+      subg++;
+
+      /* subglyph 1 = accent character */
+      subg->index = achar_index;
+      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES;
+      subg->arg1  = (FT_Int)( adx >> 16 );
+      subg->arg2  = (FT_Int)( ady >> 16 );
+
+      /* set up remaining glyph fields */
+      glyph->num_subglyphs = 2;
+      glyph->subglyphs     = loader->base.subglyphs;
+      glyph->format        = FT_GLYPH_FORMAT_COMPOSITE;
+
+      loader->current.num_subglyphs = 2;
+    }
+
+    FT_GlyphLoader_Prepare( builder->loader );
+
+    /* First load `bchar' in builder */
+    error = cff_get_glyph_data( face, bchar_index,
+                                &charstring, &charstring_len );
+    if ( !error )
+    {
+      /* the seac operator must not be nested */
+      decoder->seac = TRUE;
+      error = cff_decoder_parse_charstrings( decoder, charstring,
+                                             charstring_len );
+      decoder->seac = FALSE;
+
+      cff_free_glyph_data( face, &charstring, charstring_len );
+
+      if ( error )
+        goto Exit;
+    }
+
+    /* Save the left bearing, advance and glyph width of the base */
+    /* character as they will be erased by the next load.         */
+
+    left_bearing = builder->left_bearing;
+    advance      = builder->advance;
+    glyph_width  = decoder->glyph_width;
+
+    builder->left_bearing.x = 0;
+    builder->left_bearing.y = 0;
+
+    builder->pos_x = adx - asb;
+    builder->pos_y = ady;
+
+    /* Now load `achar' on top of the base outline. */
+    error = cff_get_glyph_data( face, achar_index,
+                                &charstring, &charstring_len );
+    if ( !error )
+    {
+      /* the seac operator must not be nested */
+      decoder->seac = TRUE;
+      error = cff_decoder_parse_charstrings( decoder, charstring,
+                                             charstring_len );
+      decoder->seac = FALSE;
+
+      cff_free_glyph_data( face, &charstring, charstring_len );
+
+      if ( error )
+        goto Exit;
+    }
+
+    /* Restore the left side bearing, advance and glyph width */
+    /* of the base character.                                 */
+    builder->left_bearing = left_bearing;
+    builder->advance      = advance;
+    decoder->glyph_width  = glyph_width;
+
+    builder->pos_x = 0;
+    builder->pos_y = 0;
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cff_decoder_parse_charstrings                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Parses a given Type 2 charstrings program.                         */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    decoder         :: The current Type 1 decoder.                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    charstring_base :: The base of the charstring stream.              */
+  /*                                                                       */
+  /*    charstring_len  :: The length in bytes of the charstring stream.   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  cff_decoder_parse_charstrings( CFF_Decoder*  decoder,
+                                 FT_Byte*      charstring_base,
+                                 FT_ULong      charstring_len )
+  {
+    FT_Error           error;
+    CFF_Decoder_Zone*  zone;
+    FT_Byte*           ip;
+    FT_Byte*           limit;
+    CFF_Builder*       builder = &decoder->builder;
+    FT_Pos             x, y;
+    FT_Fixed           seed;
+    FT_Fixed*          stack;
+    FT_Int             charstring_type =
+                         decoder->cff->top_font.font_dict.charstring_type;
+
+    T2_Hints_Funcs     hinter;
+
+
+    /* set default width */
+    decoder->num_hints  = 0;
+    decoder->read_width = 1;
+
+    /* compute random seed from stack address of parameter */
+    seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed              ^
+                         (FT_PtrDist)(char*)&decoder           ^
+                         (FT_PtrDist)(char*)&charstring_base ) &
+                         FT_ULONG_MAX ) ;
+    seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL;
+    if ( seed == 0 )
+      seed = 0x7384;
+
+    /* initialize the decoder */
+    decoder->top  = decoder->stack;
+    decoder->zone = decoder->zones;
+    zone          = decoder->zones;
+    stack         = decoder->top;
+
+    hinter = (T2_Hints_Funcs)builder->hints_funcs;
+
+    builder->path_begun = 0;
+
+    zone->base           = charstring_base;
+    limit = zone->limit  = charstring_base + charstring_len;
+    ip    = zone->cursor = zone->base;
+
+    error = CFF_Err_Ok;
+
+    x = builder->pos_x;
+    y = builder->pos_y;
+
+    /* begin hints recording session, if any */
+    if ( hinter )
+      hinter->open( hinter->hints );
+
+    /* now execute loop */
+    while ( ip < limit )
+    {
+      CFF_Operator  op;
+      FT_Byte       v;
+
+
+      /********************************************************************/
+      /*                                                                  */
+      /* Decode operator or operand                                       */
+      /*                                                                  */
+      v = *ip++;
+      if ( v >= 32 || v == 28 )
+      {
+        FT_Int    shift = 16;
+        FT_Int32  val;
+
+
+        /* this is an operand, push it on the stack */
+        if ( v == 28 )
+        {
+          if ( ip + 1 >= limit )
+            goto Syntax_Error;
+          val = (FT_Short)( ( (FT_Short)ip[0] << 8 ) | ip[1] );
+          ip += 2;
+        }
+        else if ( v < 247 )
+          val = (FT_Int32)v - 139;
+        else if ( v < 251 )
+        {
+          if ( ip >= limit )
+            goto Syntax_Error;
+          val = ( (FT_Int32)v - 247 ) * 256 + *ip++ + 108;
+        }
+        else if ( v < 255 )
+        {
+          if ( ip >= limit )
+            goto Syntax_Error;
+          val = -( (FT_Int32)v - 251 ) * 256 - *ip++ - 108;
+        }
+        else
+        {
+          if ( ip + 3 >= limit )
+            goto Syntax_Error;
+          val = ( (FT_Int32)ip[0] << 24 ) |
+                ( (FT_Int32)ip[1] << 16 ) |
+                ( (FT_Int32)ip[2] <<  8 ) |
+                            ip[3];
+          ip    += 4;
+          if ( charstring_type == 2 )
+            shift = 0;
+        }
+        if ( decoder->top - stack >= CFF_MAX_OPERANDS )
+          goto Stack_Overflow;
+
+        val           <<= shift;
+        *decoder->top++ = val;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        if ( !( val & 0xFFFFL ) )
+          FT_TRACE4(( " %ld", (FT_Int32)( val >> 16 ) ));
+        else
+          FT_TRACE4(( " %.2f", val / 65536.0 ));
+#endif
+
+      }
+      else
+      {
+        /* The specification says that normally arguments are to be taken */
+        /* from the bottom of the stack.  However, this seems not to be   */
+        /* correct, at least for Acroread 7.0.8 on GNU/Linux: It pops the */
+        /* arguments similar to a PS interpreter.                         */
+
+        FT_Fixed*  args     = decoder->top;
+        FT_Int     num_args = (FT_Int)( args - decoder->stack );
+        FT_Int     req_args;
+
+
+        /* find operator */
+        op = cff_op_unknown;
+
+        switch ( v )
+        {
+        case 1:
+          op = cff_op_hstem;
+          break;
+        case 3:
+          op = cff_op_vstem;
+          break;
+        case 4:
+          op = cff_op_vmoveto;
+          break;
+        case 5:
+          op = cff_op_rlineto;
+          break;
+        case 6:
+          op = cff_op_hlineto;
+          break;
+        case 7:
+          op = cff_op_vlineto;
+          break;
+        case 8:
+          op = cff_op_rrcurveto;
+          break;
+        case 9:
+          op = cff_op_closepath;
+          break;
+        case 10:
+          op = cff_op_callsubr;
+          break;
+        case 11:
+          op = cff_op_return;
+          break;
+        case 12:
+          {
+            if ( ip >= limit )
+              goto Syntax_Error;
+            v = *ip++;
+
+            switch ( v )
+            {
+            case 0:
+              op = cff_op_dotsection;
+              break;
+            case 1: /* this is actually the Type1 vstem3 operator */
+              op = cff_op_vstem;
+              break;
+            case 2: /* this is actually the Type1 hstem3 operator */
+              op = cff_op_hstem;
+              break;
+            case 3:
+              op = cff_op_and;
+              break;
+            case 4:
+              op = cff_op_or;
+              break;
+            case 5:
+              op = cff_op_not;
+              break;
+            case 6:
+              op = cff_op_seac;
+              break;
+            case 7:
+              op = cff_op_sbw;
+              break;
+            case 8:
+              op = cff_op_store;
+              break;
+            case 9:
+              op = cff_op_abs;
+              break;
+            case 10:
+              op = cff_op_add;
+              break;
+            case 11:
+              op = cff_op_sub;
+              break;
+            case 12:
+              op = cff_op_div;
+              break;
+            case 13:
+              op = cff_op_load;
+              break;
+            case 14:
+              op = cff_op_neg;
+              break;
+            case 15:
+              op = cff_op_eq;
+              break;
+            case 16:
+              op = cff_op_callothersubr;
+              break;
+            case 17:
+              op = cff_op_pop;
+              break;
+            case 18:
+              op = cff_op_drop;
+              break;
+            case 20:
+              op = cff_op_put;
+              break;
+            case 21:
+              op = cff_op_get;
+              break;
+            case 22:
+              op = cff_op_ifelse;
+              break;
+            case 23:
+              op = cff_op_random;
+              break;
+            case 24:
+              op = cff_op_mul;
+              break;
+            case 26:
+              op = cff_op_sqrt;
+              break;
+            case 27:
+              op = cff_op_dup;
+              break;
+            case 28:
+              op = cff_op_exch;
+              break;
+            case 29:
+              op = cff_op_index;
+              break;
+            case 30:
+              op = cff_op_roll;
+              break;
+            case 33:
+              op = cff_op_setcurrentpoint;
+              break;
+            case 34:
+              op = cff_op_hflex;
+              break;
+            case 35:
+              op = cff_op_flex;
+              break;
+            case 36:
+              op = cff_op_hflex1;
+              break;
+            case 37:
+              op = cff_op_flex1;
+              break;
+            default:
+              FT_TRACE4(( " unknown op (12, %d)\n", v ));
+              break;
+            }
+          }
+          break;
+        case 13:
+          op = cff_op_hsbw;
+          break;
+        case 14:
+          op = cff_op_endchar;
+          break;
+        case 16:
+          op = cff_op_blend;
+          break;
+        case 18:
+          op = cff_op_hstemhm;
+          break;
+        case 19:
+          op = cff_op_hintmask;
+          break;
+        case 20:
+          op = cff_op_cntrmask;
+          break;
+        case 21:
+          op = cff_op_rmoveto;
+          break;
+        case 22:
+          op = cff_op_hmoveto;
+          break;
+        case 23:
+          op = cff_op_vstemhm;
+          break;
+        case 24:
+          op = cff_op_rcurveline;
+          break;
+        case 25:
+          op = cff_op_rlinecurve;
+          break;
+        case 26:
+          op = cff_op_vvcurveto;
+          break;
+        case 27:
+          op = cff_op_hhcurveto;
+          break;
+        case 29:
+          op = cff_op_callgsubr;
+          break;
+        case 30:
+          op = cff_op_vhcurveto;
+          break;
+        case 31:
+          op = cff_op_hvcurveto;
+          break;
+        default:
+          FT_TRACE4(( " unknown op (%d)\n", v ));
+          break;
+        }
+
+        if ( op == cff_op_unknown )
+          continue;
+
+        /* check arguments */
+        req_args = cff_argument_counts[op];
+        if ( req_args & CFF_COUNT_CHECK_WIDTH )
+        {
+          if ( num_args > 0 && decoder->read_width )
+          {
+            /* If `nominal_width' is non-zero, the number is really a      */
+            /* difference against `nominal_width'.  Else, the number here  */
+            /* is truly a width, not a difference against `nominal_width'. */
+            /* If the font does not set `nominal_width', then              */
+            /* `nominal_width' defaults to zero, and so we can set         */
+            /* `glyph_width' to `nominal_width' plus number on the stack   */
+            /* -- for either case.                                         */
+
+            FT_Int  set_width_ok;
+
+
+            switch ( op )
+            {
+            case cff_op_hmoveto:
+            case cff_op_vmoveto:
+              set_width_ok = num_args & 2;
+              break;
+
+            case cff_op_hstem:
+            case cff_op_vstem:
+            case cff_op_hstemhm:
+            case cff_op_vstemhm:
+            case cff_op_rmoveto:
+            case cff_op_hintmask:
+            case cff_op_cntrmask:
+              set_width_ok = num_args & 1;
+              break;
+
+            case cff_op_endchar:
+              /* If there is a width specified for endchar, we either have */
+              /* 1 argument or 5 arguments.  We like to argue.             */
+              set_width_ok = ( num_args == 5 ) || ( num_args == 1 );
+              break;
+
+            default:
+              set_width_ok = 0;
+              break;
+            }
+
+            if ( set_width_ok )
+            {
+              decoder->glyph_width = decoder->nominal_width +
+                                       ( stack[0] >> 16 );
+
+              if ( decoder->width_only )
+              {
+                /* we only want the advance width; stop here */
+                break;
+              }
+
+              /* Consumed an argument. */
+              num_args--;
+            }
+          }
+
+          decoder->read_width = 0;
+          req_args            = 0;
+        }
+
+        req_args &= 0x000F;
+        if ( num_args < req_args )
+          goto Stack_Underflow;
+        args     -= req_args;
+        num_args -= req_args;
+
+        /* At this point, `args' points to the first argument of the  */
+        /* operand in case `req_args' isn't zero.  Otherwise, we have */
+        /* to adjust `args' manually.                                 */
+
+        /* Note that we only pop arguments from the stack which we    */
+        /* really need and can digest so that we can continue in case */
+        /* of superfluous stack elements.                             */
+
+        switch ( op )
+        {
+        case cff_op_hstem:
+        case cff_op_vstem:
+        case cff_op_hstemhm:
+        case cff_op_vstemhm:
+          /* the number of arguments is always even here */
+          FT_TRACE4((
+              op == cff_op_hstem   ? " hstem\n"   :
+            ( op == cff_op_vstem   ? " vstem\n"   :
+            ( op == cff_op_hstemhm ? " hstemhm\n" : " vstemhm\n" ) ) ));
+
+          if ( hinter )
+            hinter->stems( hinter->hints,
+                           ( op == cff_op_hstem || op == cff_op_hstemhm ),
+                           num_args / 2,
+                           args - ( num_args & ~1 ) );
+
+          decoder->num_hints += num_args / 2;
+          args = stack;
+          break;
+
+        case cff_op_hintmask:
+        case cff_op_cntrmask:
+          FT_TRACE4(( op == cff_op_hintmask ? " hintmask" : " cntrmask" ));
+
+          /* implement vstem when needed --                        */
+          /* the specification doesn't say it, but this also works */
+          /* with the 'cntrmask' operator                          */
+          /*                                                       */
+          if ( num_args > 0 )
+          {
+            if ( hinter )
+              hinter->stems( hinter->hints,
+                             0,
+                             num_args / 2,
+                             args - ( num_args & ~1 ) );
+
+            decoder->num_hints += num_args / 2;
+          }
+
+          /* In a valid charstring there must be at least one byte */
+          /* after `hintmask' or `cntrmask' (e.g., for a `return'  */
+          /* instruction).  Additionally, there must be space for  */
+          /* `num_hints' bits.                                     */
+
+          if ( ( ip + ( ( decoder->num_hints + 7 ) >> 3 ) ) >= limit )
+            goto Syntax_Error;
+
+          if ( hinter )
+          {
+            if ( op == cff_op_hintmask )
+              hinter->hintmask( hinter->hints,
+                                builder->current->n_points,
+                                decoder->num_hints,
+                                ip );
+            else
+              hinter->counter( hinter->hints,
+                               decoder->num_hints,
+                               ip );
+          }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+          {
+            FT_UInt maskbyte;
+
+
+            FT_TRACE4(( " (maskbytes:" ));
+
+            for ( maskbyte = 0;
+                  maskbyte < (FT_UInt)( ( decoder->num_hints + 7 ) >> 3 );
+                  maskbyte++, ip++ )
+              FT_TRACE4(( " 0x%02X", *ip ));
+
+            FT_TRACE4(( ")\n" ));
+          }
+#else
+          ip += ( decoder->num_hints + 7 ) >> 3;
+#endif
+          args = stack;
+          break;
+
+        case cff_op_rmoveto:
+          FT_TRACE4(( " rmoveto\n" ));
+
+          cff_builder_close_contour( builder );
+          builder->path_begun = 0;
+          x   += args[-2];
+          y   += args[-1];
+          args = stack;
+          break;
+
+        case cff_op_vmoveto:
+          FT_TRACE4(( " vmoveto\n" ));
+
+          cff_builder_close_contour( builder );
+          builder->path_begun = 0;
+          y   += args[-1];
+          args = stack;
+          break;
+
+        case cff_op_hmoveto:
+          FT_TRACE4(( " hmoveto\n" ));
+
+          cff_builder_close_contour( builder );
+          builder->path_begun = 0;
+          x   += args[-1];
+          args = stack;
+          break;
+
+        case cff_op_rlineto:
+          FT_TRACE4(( " rlineto\n" ));
+
+          if ( cff_builder_start_point ( builder, x, y ) ||
+               check_points( builder, num_args / 2 )     )
+            goto Fail;
+
+          if ( num_args < 2 )
+            goto Stack_Underflow;
+
+          args -= num_args & ~1;
+          while ( args < decoder->top )
+          {
+            x += args[0];
+            y += args[1];
+            cff_builder_add_point( builder, x, y, 1 );
+            args += 2;
+          }
+          args = stack;
+          break;
+
+        case cff_op_hlineto:
+        case cff_op_vlineto:
+          {
+            FT_Int  phase = ( op == cff_op_hlineto );
+
+
+            FT_TRACE4(( op == cff_op_hlineto ? " hlineto\n"
+                                             : " vlineto\n" ));
+
+            if ( num_args < 0 )
+              goto Stack_Underflow;
+
+            /* there exist subsetted fonts (found in PDFs) */
+            /* which call `hlineto' without arguments      */
+            if ( num_args == 0 )
+              break;
+
+            if ( cff_builder_start_point ( builder, x, y ) ||
+                 check_points( builder, num_args )         )
+              goto Fail;
+
+            args = stack;
+            while ( args < decoder->top )
+            {
+              if ( phase )
+                x += args[0];
+              else
+                y += args[0];
+
+              if ( cff_builder_add_point1( builder, x, y ) )
+                goto Fail;
+
+              args++;
+              phase ^= 1;
+            }
+            args = stack;
+          }
+          break;
+
+        case cff_op_rrcurveto:
+          {
+            FT_Int  nargs;
+
+
+            FT_TRACE4(( " rrcurveto\n" ));
+
+            if ( num_args < 6 )
+              goto Stack_Underflow;
+
+            nargs = num_args - num_args % 6;
+
+            if ( cff_builder_start_point ( builder, x, y ) ||
+                 check_points( builder, nargs / 2 )     )
+              goto Fail;
+
+            args -= nargs;
+            while ( args < decoder->top )
+            {
+              x += args[0];
+              y += args[1];
+              cff_builder_add_point( builder, x, y, 0 );
+              x += args[2];
+              y += args[3];
+              cff_builder_add_point( builder, x, y, 0 );
+              x += args[4];
+              y += args[5];
+              cff_builder_add_point( builder, x, y, 1 );
+              args += 6;
+            }
+            args = stack;
+          }
+          break;
+
+        case cff_op_vvcurveto:
+          {
+            FT_Int  nargs;
+
+
+            FT_TRACE4(( " vvcurveto\n" ));
+
+            if ( num_args < 4 )
+              goto Stack_Underflow;
+
+            /* if num_args isn't of the form 4n or 4n+1, */
+            /* we enforce it by clearing the second bit  */
+
+            nargs = num_args & ~2;
+
+            if ( cff_builder_start_point( builder, x, y ) )
+              goto Fail;
+
+            args -= nargs;
+
+            if ( nargs & 1 )
+            {
+              x += args[0];
+              args++;
+              nargs--;
+            }
+
+            if ( check_points( builder, 3 * ( nargs / 4 ) ) )
+              goto Fail;
+
+            while ( args < decoder->top )
+            {
+              y += args[0];
+              cff_builder_add_point( builder, x, y, 0 );
+              x += args[1];
+              y += args[2];
+              cff_builder_add_point( builder, x, y, 0 );
+              y += args[3];
+              cff_builder_add_point( builder, x, y, 1 );
+              args += 4;
+            }
+            args = stack;
+          }
+          break;
+
+        case cff_op_hhcurveto:
+          {
+            FT_Int  nargs;
+
+
+            FT_TRACE4(( " hhcurveto\n" ));
+
+            if ( num_args < 4 )
+              goto Stack_Underflow;
+
+            /* if num_args isn't of the form 4n or 4n+1, */
+            /* we enforce it by clearing the second bit  */
+
+            nargs = num_args & ~2;
+
+            if ( cff_builder_start_point( builder, x, y ) )
+              goto Fail;
+
+            args -= nargs;
+            if ( nargs & 1 )
+            {
+              y += args[0];
+              args++;
+              nargs--;
+            }
+
+            if ( check_points( builder, 3 * ( nargs / 4 ) ) )
+              goto Fail;
+
+            while ( args < decoder->top )
+            {
+              x += args[0];
+              cff_builder_add_point( builder, x, y, 0 );
+              x += args[1];
+              y += args[2];
+              cff_builder_add_point( builder, x, y, 0 );
+              x += args[3];
+              cff_builder_add_point( builder, x, y, 1 );
+              args += 4;
+            }
+            args = stack;
+          }
+          break;
+
+        case cff_op_vhcurveto:
+        case cff_op_hvcurveto:
+          {
+            FT_Int  phase;
+            FT_Int  nargs;
+
+
+            FT_TRACE4(( op == cff_op_vhcurveto ? " vhcurveto\n"
+                                               : " hvcurveto\n" ));
+
+            if ( cff_builder_start_point( builder, x, y ) )
+              goto Fail;
+
+            if ( num_args < 4 )
+              goto Stack_Underflow;
+
+            /* if num_args isn't of the form 8n, 8n+1, 8n+4, or 8n+5, */
+            /* we enforce it by clearing the second bit               */
+
+            nargs = num_args & ~2;
+
+            args -= nargs;
+            if ( check_points( builder, ( nargs / 4 ) * 3 ) )
+              goto Stack_Underflow;
+
+            phase = ( op == cff_op_hvcurveto );
+
+            while ( nargs >= 4 )
+            {
+              nargs -= 4;
+              if ( phase )
+              {
+                x += args[0];
+                cff_builder_add_point( builder, x, y, 0 );
+                x += args[1];
+                y += args[2];
+                cff_builder_add_point( builder, x, y, 0 );
+                y += args[3];
+                if ( nargs == 1 )
+                  x += args[4];
+                cff_builder_add_point( builder, x, y, 1 );
+              }
+              else
+              {
+                y += args[0];
+                cff_builder_add_point( builder, x, y, 0 );
+                x += args[1];
+                y += args[2];
+                cff_builder_add_point( builder, x, y, 0 );
+                x += args[3];
+                if ( nargs == 1 )
+                  y += args[4];
+                cff_builder_add_point( builder, x, y, 1 );
+              }
+              args  += 4;
+              phase ^= 1;
+            }
+            args = stack;
+          }
+          break;
+
+        case cff_op_rlinecurve:
+          {
+            FT_Int  num_lines;
+            FT_Int  nargs;
+
+
+            FT_TRACE4(( " rlinecurve\n" ));
+
+            if ( num_args < 8 )
+              goto Stack_Underflow;
+
+            nargs     = num_args & ~1;
+            num_lines = ( nargs - 6 ) / 2;
+
+            if ( cff_builder_start_point( builder, x, y ) ||
+                 check_points( builder, num_lines + 3 )   )
+              goto Fail;
+
+            args -= nargs;
+
+            /* first, add the line segments */
+            while ( num_lines > 0 )
+            {
+              x += args[0];
+              y += args[1];
+              cff_builder_add_point( builder, x, y, 1 );
+              args += 2;
+              num_lines--;
+            }
+
+            /* then the curve */
+            x += args[0];
+            y += args[1];
+            cff_builder_add_point( builder, x, y, 0 );
+            x += args[2];
+            y += args[3];
+            cff_builder_add_point( builder, x, y, 0 );
+            x += args[4];
+            y += args[5];
+            cff_builder_add_point( builder, x, y, 1 );
+            args = stack;
+          }
+          break;
+
+        case cff_op_rcurveline:
+          {
+            FT_Int  num_curves;
+            FT_Int  nargs;
+
+
+            FT_TRACE4(( " rcurveline\n" ));
+
+            if ( num_args < 8 )
+              goto Stack_Underflow;
+
+            nargs      = num_args - 2;
+            nargs      = nargs - nargs % 6 + 2;
+            num_curves = ( nargs - 2 ) / 6;
+
+            if ( cff_builder_start_point ( builder, x, y ) ||
+                 check_points( builder, num_curves * 3 + 2 ) )
+              goto Fail;
+
+            args -= nargs;
+
+            /* first, add the curves */
+            while ( num_curves > 0 )
+            {
+              x += args[0];
+              y += args[1];
+              cff_builder_add_point( builder, x, y, 0 );
+              x += args[2];
+              y += args[3];
+              cff_builder_add_point( builder, x, y, 0 );
+              x += args[4];
+              y += args[5];
+              cff_builder_add_point( builder, x, y, 1 );
+              args += 6;
+              num_curves--;
+            }
+
+            /* then the final line */
+            x += args[0];
+            y += args[1];
+            cff_builder_add_point( builder, x, y, 1 );
+            args = stack;
+          }
+          break;
+
+        case cff_op_hflex1:
+          {
+            FT_Pos start_y;
+
+
+            FT_TRACE4(( " hflex1\n" ));
+
+            /* adding five more points: 4 control points, 1 on-curve point */
+            /* -- make sure we have enough space for the start point if it */
+            /* needs to be added                                           */
+            if ( cff_builder_start_point( builder, x, y ) ||
+                 check_points( builder, 6 )               )
+              goto Fail;
+
+            /* record the starting point's y position for later use */
+            start_y = y;
+
+            /* first control point */
+            x += args[0];
+            y += args[1];
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* second control point */
+            x += args[2];
+            y += args[3];
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* join point; on curve, with y-value the same as the last */
+            /* control point's y-value                                 */
+            x += args[4];
+            cff_builder_add_point( builder, x, y, 1 );
+
+            /* third control point, with y-value the same as the join */
+            /* point's y-value                                        */
+            x += args[5];
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* fourth control point */
+            x += args[6];
+            y += args[7];
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* ending point, with y-value the same as the start   */
+            x += args[8];
+            y  = start_y;
+            cff_builder_add_point( builder, x, y, 1 );
+
+            args = stack;
+            break;
+          }
+
+        case cff_op_hflex:
+          {
+            FT_Pos start_y;
+
+
+            FT_TRACE4(( " hflex\n" ));
+
+            /* adding six more points; 4 control points, 2 on-curve points */
+            if ( cff_builder_start_point( builder, x, y ) ||
+                 check_points( builder, 6 )               )
+              goto Fail;
+
+            /* record the starting point's y-position for later use */
+            start_y = y;
+
+            /* first control point */
+            x += args[0];
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* second control point */
+            x += args[1];
+            y += args[2];
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* join point; on curve, with y-value the same as the last */
+            /* control point's y-value                                 */
+            x += args[3];
+            cff_builder_add_point( builder, x, y, 1 );
+
+            /* third control point, with y-value the same as the join */
+            /* point's y-value                                        */
+            x += args[4];
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* fourth control point */
+            x += args[5];
+            y  = start_y;
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* ending point, with y-value the same as the start point's */
+            /* y-value -- we don't add this point, though               */
+            x += args[6];
+            cff_builder_add_point( builder, x, y, 1 );
+
+            args = stack;
+            break;
+          }
+
+        case cff_op_flex1:
+          {
+            FT_Pos     start_x, start_y; /* record start x, y values for */
+                                         /* alter use                    */
+            FT_Fixed   dx = 0, dy = 0;   /* used in horizontal/vertical  */
+                                         /* algorithm below              */
+            FT_Int     horizontal, count;
+            FT_Fixed*  temp;
+
+
+            FT_TRACE4(( " flex1\n" ));
+
+            /* adding six more points; 4 control points, 2 on-curve points */
+            if ( cff_builder_start_point( builder, x, y ) ||
+                 check_points( builder, 6 )               )
+              goto Fail;
+
+            /* record the starting point's x, y position for later use */
+            start_x = x;
+            start_y = y;
+
+            /* XXX: figure out whether this is supposed to be a horizontal */
+            /*      or vertical flex; the Type 2 specification is vague... */
+
+            temp = args;
+
+            /* grab up to the last argument */
+            for ( count = 5; count > 0; count-- )
+            {
+              dx += temp[0];
+              dy += temp[1];
+              temp += 2;
+            }
+
+            if ( dx < 0 )
+              dx = -dx;
+            if ( dy < 0 )
+              dy = -dy;
+
+            /* strange test, but here it is... */
+            horizontal = ( dx > dy );
+
+            for ( count = 5; count > 0; count-- )
+            {
+              x += args[0];
+              y += args[1];
+              cff_builder_add_point( builder, x, y,
+                                     (FT_Bool)( count == 3 ) );
+              args += 2;
+            }
+
+            /* is last operand an x- or y-delta? */
+            if ( horizontal )
+            {
+              x += args[0];
+              y  = start_y;
+            }
+            else
+            {
+              x  = start_x;
+              y += args[0];
+            }
+
+            cff_builder_add_point( builder, x, y, 1 );
+
+            args = stack;
+            break;
+           }
+
+        case cff_op_flex:
+          {
+            FT_UInt  count;
+
+
+            FT_TRACE4(( " flex\n" ));
+
+            if ( cff_builder_start_point( builder, x, y ) ||
+                 check_points( builder, 6 )               )
+              goto Fail;
+
+            for ( count = 6; count > 0; count-- )
+            {
+              x += args[0];
+              y += args[1];
+              cff_builder_add_point( builder, x, y,
+                                     (FT_Bool)( count == 4 || count == 1 ) );
+              args += 2;
+            }
+
+            args = stack;
+          }
+          break;
+
+        case cff_op_seac:
+            FT_TRACE4(( " seac\n" ));
+
+            error = cff_operator_seac( decoder,
+                                       args[0], args[1], args[2],
+                                       (FT_Int)( args[3] >> 16 ),
+                                       (FT_Int)( args[4] >> 16 ) );
+
+            /* add current outline to the glyph slot */
+            FT_GlyphLoader_Add( builder->loader );
+
+            /* return now! */
+            FT_TRACE4(( "\n" ));
+            return error;
+
+        case cff_op_endchar:
+          FT_TRACE4(( " endchar\n" ));
+
+          /* We are going to emulate the seac operator. */
+          if ( num_args >= 4 )
+          {
+            /* Save glyph width so that the subglyphs don't overwrite it. */
+            FT_Pos  glyph_width = decoder->glyph_width;
+
+
+            error = cff_operator_seac( decoder,
+                                       0L, args[-4], args[-3],
+                                       (FT_Int)( args[-2] >> 16 ),
+                                       (FT_Int)( args[-1] >> 16 ) );
+
+            decoder->glyph_width = glyph_width;
+          }
+          else
+          {
+            if ( !error )
+              error = CFF_Err_Ok;
+
+            cff_builder_close_contour( builder );
+
+            /* close hints recording session */
+            if ( hinter )
+            {
+              if ( hinter->close( hinter->hints,
+                                  builder->current->n_points ) )
+                goto Syntax_Error;
+
+              /* apply hints to the loaded glyph outline now */
+              hinter->apply( hinter->hints,
+                             builder->current,
+                             (PSH_Globals)builder->hints_globals,
+                             decoder->hint_mode );
+            }
+
+            /* add current outline to the glyph slot */
+            FT_GlyphLoader_Add( builder->loader );
+          }
+
+          /* return now! */
+          FT_TRACE4(( "\n" ));
+          return error;
+
+        case cff_op_abs:
+          FT_TRACE4(( " abs\n" ));
+
+          if ( args[0] < 0 )
+            args[0] = -args[0];
+          args++;
+          break;
+
+        case cff_op_add:
+          FT_TRACE4(( " add\n" ));
+
+          args[0] += args[1];
+          args++;
+          break;
+
+        case cff_op_sub:
+          FT_TRACE4(( " sub\n" ));
+
+          args[0] -= args[1];
+          args++;
+          break;
+
+        case cff_op_div:
+          FT_TRACE4(( " div\n" ));
+
+          args[0] = FT_DivFix( args[0], args[1] );
+          args++;
+          break;
+
+        case cff_op_neg:
+          FT_TRACE4(( " neg\n" ));
+
+          args[0] = -args[0];
+          args++;
+          break;
+
+        case cff_op_random:
+          {
+            FT_Fixed  Rand;
+
+
+            FT_TRACE4(( " rand\n" ));
+
+            Rand = seed;
+            if ( Rand >= 0x8000L )
+              Rand++;
+
+            args[0] = Rand;
+            seed    = FT_MulFix( seed, 0x10000L - seed );
+            if ( seed == 0 )
+              seed += 0x2873;
+            args++;
+          }
+          break;
+
+        case cff_op_mul:
+          FT_TRACE4(( " mul\n" ));
+
+          args[0] = FT_MulFix( args[0], args[1] );
+          args++;
+          break;
+
+        case cff_op_sqrt:
+          FT_TRACE4(( " sqrt\n" ));
+
+          if ( args[0] > 0 )
+          {
+            FT_Int    count = 9;
+            FT_Fixed  root  = args[0];
+            FT_Fixed  new_root;
+
+
+            for (;;)
+            {
+              new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1;
+              if ( new_root == root || count <= 0 )
+                break;
+              root = new_root;
+            }
+            args[0] = new_root;
+          }
+          else
+            args[0] = 0;
+          args++;
+          break;
+
+        case cff_op_drop:
+          /* nothing */
+          FT_TRACE4(( " drop\n" ));
+
+          break;
+
+        case cff_op_exch:
+          {
+            FT_Fixed  tmp;
+
+
+            FT_TRACE4(( " exch\n" ));
+
+            tmp     = args[0];
+            args[0] = args[1];
+            args[1] = tmp;
+            args   += 2;
+          }
+          break;
+
+        case cff_op_index:
+          {
+            FT_Int  idx = (FT_Int)( args[0] >> 16 );
+
+
+            FT_TRACE4(( " index\n" ));
+
+            if ( idx < 0 )
+              idx = 0;
+            else if ( idx > num_args - 2 )
+              idx = num_args - 2;
+            args[0] = args[-( idx + 1 )];
+            args++;
+          }
+          break;
+
+        case cff_op_roll:
+          {
+            FT_Int  count = (FT_Int)( args[0] >> 16 );
+            FT_Int  idx   = (FT_Int)( args[1] >> 16 );
+
+
+            FT_TRACE4(( " roll\n" ));
+
+            if ( count <= 0 )
+              count = 1;
+
+            args -= count;
+            if ( args < stack )
+              goto Stack_Underflow;
+
+            if ( idx >= 0 )
+            {
+              while ( idx > 0 )
+              {
+                FT_Fixed  tmp = args[count - 1];
+                FT_Int    i;
+
+
+                for ( i = count - 2; i >= 0; i-- )
+                  args[i + 1] = args[i];
+                args[0] = tmp;
+                idx--;
+              }
+            }
+            else
+            {
+              while ( idx < 0 )
+              {
+                FT_Fixed  tmp = args[0];
+                FT_Int    i;
+
+
+                for ( i = 0; i < count - 1; i++ )
+                  args[i] = args[i + 1];
+                args[count - 1] = tmp;
+                idx++;
+              }
+            }
+            args += count;
+          }
+          break;
+
+        case cff_op_dup:
+          FT_TRACE4(( " dup\n" ));
+
+          args[1] = args[0];
+          args += 2;
+          break;
+
+        case cff_op_put:
+          {
+            FT_Fixed  val = args[0];
+            FT_Int    idx = (FT_Int)( args[1] >> 16 );
+
+
+            FT_TRACE4(( " put\n" ));
+
+            if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )
+              decoder->buildchar[idx] = val;
+          }
+          break;
+
+        case cff_op_get:
+          {
+            FT_Int    idx = (FT_Int)( args[0] >> 16 );
+            FT_Fixed  val = 0;
+
+
+            FT_TRACE4(( " get\n" ));
+
+            if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS )
+              val = decoder->buildchar[idx];
+
+            args[0] = val;
+            args++;
+          }
+          break;
+
+        case cff_op_store:
+          FT_TRACE4(( " store\n"));
+
+          goto Unimplemented;
+
+        case cff_op_load:
+          FT_TRACE4(( " load\n" ));
+
+          goto Unimplemented;
+
+        case cff_op_dotsection:
+          /* this operator is deprecated and ignored by the parser */
+          FT_TRACE4(( " dotsection\n" ));
+          break;
+
+        case cff_op_closepath:
+          /* this is an invalid Type 2 operator; however, there        */
+          /* exist fonts which are incorrectly converted from probably */
+          /* Type 1 to CFF, and some parsers seem to accept it         */
+
+          FT_TRACE4(( " closepath (invalid op)\n" ));
+
+          args = stack;
+          break;
+
+        case cff_op_hsbw:
+          /* this is an invalid Type 2 operator; however, there        */
+          /* exist fonts which are incorrectly converted from probably */
+          /* Type 1 to CFF, and some parsers seem to accept it         */
+
+          FT_TRACE4(( " hsbw (invalid op)\n" ));
+
+          decoder->glyph_width = decoder->nominal_width + ( args[1] >> 16 );
+
+          decoder->builder.left_bearing.x = args[0];
+          decoder->builder.left_bearing.y = 0;
+
+          x    = decoder->builder.pos_x + args[0];
+          y    = decoder->builder.pos_y;
+          args = stack;
+          break;
+
+        case cff_op_sbw:
+          /* this is an invalid Type 2 operator; however, there        */
+          /* exist fonts which are incorrectly converted from probably */
+          /* Type 1 to CFF, and some parsers seem to accept it         */
+
+          FT_TRACE4(( " sbw (invalid op)\n" ));
+
+          decoder->glyph_width = decoder->nominal_width + ( args[2] >> 16 );
+
+          decoder->builder.left_bearing.x = args[0];
+          decoder->builder.left_bearing.y = args[1];
+
+          x    = decoder->builder.pos_x + args[0];
+          y    = decoder->builder.pos_y + args[1];
+          args = stack;
+          break;
+
+        case cff_op_setcurrentpoint:
+          /* this is an invalid Type 2 operator; however, there        */
+          /* exist fonts which are incorrectly converted from probably */
+          /* Type 1 to CFF, and some parsers seem to accept it         */
+
+          FT_TRACE4(( " setcurrentpoint (invalid op)\n" ));
+
+          x    = decoder->builder.pos_x + args[0];
+          y    = decoder->builder.pos_y + args[1];
+          args = stack;
+          break;
+
+        case cff_op_callothersubr:
+          /* this is an invalid Type 2 operator; however, there        */
+          /* exist fonts which are incorrectly converted from probably */
+          /* Type 1 to CFF, and some parsers seem to accept it         */
+
+          FT_TRACE4(( " callothersubr (invalid op)\n" ));
+
+          /* subsequent `pop' operands should add the arguments,       */
+          /* this is the implementation described for `unknown' other  */
+          /* subroutines in the Type1 spec.                            */
+          /*                                                           */
+          /* XXX Fix return arguments (see discussion below).          */
+          args -= 2 + ( args[-2] >> 16 );
+          if ( args < stack )
+            goto Stack_Underflow;
+          break;
+
+        case cff_op_pop:
+          /* this is an invalid Type 2 operator; however, there        */
+          /* exist fonts which are incorrectly converted from probably */
+          /* Type 1 to CFF, and some parsers seem to accept it         */
+
+          FT_TRACE4(( " pop (invalid op)\n" ));
+
+          /* XXX Increasing `args' is wrong: After a certain number of */
+          /* `pop's we get a stack overflow.  Reason for doing it is   */
+          /* code like this (actually found in a CFF font):            */
+          /*                                                           */
+          /*   17 1 3 callothersubr                                    */
+          /*   pop                                                     */
+          /*   callsubr                                                */
+          /*                                                           */
+          /* Since we handle `callothersubr' as a no-op, and           */
+          /* `callsubr' needs at least one argument, `pop' can't be a  */
+          /* no-op too as it basically should be.                      */
+          /*                                                           */
+          /* The right solution would be to provide real support for   */
+          /* `callothersubr' as done in `t1decode.c', however, given   */
+          /* the fact that CFF fonts with `pop' are invalid, it is     */
+          /* questionable whether it is worth the time.                */
+          args++;
+          break;
+
+        case cff_op_and:
+          {
+            FT_Fixed  cond = args[0] && args[1];
+
+
+            FT_TRACE4(( " and\n" ));
+
+            args[0] = cond ? 0x10000L : 0;
+            args++;
+          }
+          break;
+
+        case cff_op_or:
+          {
+            FT_Fixed  cond = args[0] || args[1];
+
+
+            FT_TRACE4(( " or\n" ));
+
+            args[0] = cond ? 0x10000L : 0;
+            args++;
+          }
+          break;
+
+        case cff_op_eq:
+          {
+            FT_Fixed  cond = !args[0];
+
+
+            FT_TRACE4(( " eq\n" ));
+
+            args[0] = cond ? 0x10000L : 0;
+            args++;
+          }
+          break;
+
+        case cff_op_ifelse:
+          {
+            FT_Fixed  cond = ( args[2] <= args[3] );
+
+
+            FT_TRACE4(( " ifelse\n" ));
+
+            if ( !cond )
+              args[0] = args[1];
+            args++;
+          }
+          break;
+
+        case cff_op_callsubr:
+          {
+            FT_UInt  idx = (FT_UInt)( ( args[0] >> 16 ) +
+                                      decoder->locals_bias );
+
+
+            FT_TRACE4(( " callsubr(%d)\n", idx ));
+
+            if ( idx >= decoder->num_locals )
+            {
+              FT_ERROR(( "cff_decoder_parse_charstrings:"
+                         " invalid local subr index\n" ));
+              goto Syntax_Error;
+            }
+
+            if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )
+            {
+              FT_ERROR(( "cff_decoder_parse_charstrings:"
+                         " too many nested subrs\n" ));
+              goto Syntax_Error;
+            }
+
+            zone->cursor = ip;  /* save current instruction pointer */
+
+            zone++;
+            zone->base   = decoder->locals[idx];
+            zone->limit  = decoder->locals[idx + 1];
+            zone->cursor = zone->base;
+
+            if ( !zone->base || zone->limit == zone->base )
+            {
+              FT_ERROR(( "cff_decoder_parse_charstrings:"
+                         " invoking empty subrs\n" ));
+              goto Syntax_Error;
+            }
+
+            decoder->zone = zone;
+            ip            = zone->base;
+            limit         = zone->limit;
+          }
+          break;
+
+        case cff_op_callgsubr:
+          {
+            FT_UInt  idx = (FT_UInt)( ( args[0] >> 16 ) +
+                                      decoder->globals_bias );
+
+
+            FT_TRACE4(( " callgsubr(%d)\n", idx ));
+
+            if ( idx >= decoder->num_globals )
+            {
+              FT_ERROR(( "cff_decoder_parse_charstrings:"
+                         " invalid global subr index\n" ));
+              goto Syntax_Error;
+            }
+
+            if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS )
+            {
+              FT_ERROR(( "cff_decoder_parse_charstrings:"
+                         " too many nested subrs\n" ));
+              goto Syntax_Error;
+            }
+
+            zone->cursor = ip;  /* save current instruction pointer */
+
+            zone++;
+            zone->base   = decoder->globals[idx];
+            zone->limit  = decoder->globals[idx + 1];
+            zone->cursor = zone->base;
+
+            if ( !zone->base || zone->limit == zone->base )
+            {
+              FT_ERROR(( "cff_decoder_parse_charstrings:"
+                         " invoking empty subrs\n" ));
+              goto Syntax_Error;
+            }
+
+            decoder->zone = zone;
+            ip            = zone->base;
+            limit         = zone->limit;
+          }
+          break;
+
+        case cff_op_return:
+          FT_TRACE4(( " return\n" ));
+
+          if ( decoder->zone <= decoder->zones )
+          {
+            FT_ERROR(( "cff_decoder_parse_charstrings:"
+                       " unexpected return\n" ));
+            goto Syntax_Error;
+          }
+
+          decoder->zone--;
+          zone  = decoder->zone;
+          ip    = zone->cursor;
+          limit = zone->limit;
+          break;
+
+        default:
+        Unimplemented:
+          FT_ERROR(( "Unimplemented opcode: %d", ip[-1] ));
+
+          if ( ip[-1] == 12 )
+            FT_ERROR(( " %d", ip[0] ));
+          FT_ERROR(( "\n" ));
+
+          return CFF_Err_Unimplemented_Feature;
+        }
+
+        decoder->top = args;
+
+        if ( decoder->top - stack >= CFF_MAX_OPERANDS )
+          goto Stack_Overflow;
+
+      } /* general operator processing */
+
+    } /* while ip < limit */
+
+    FT_TRACE4(( "..end..\n\n" ));
+
+  Fail:
+    return error;
+
+  Syntax_Error:
+    FT_TRACE4(( "cff_decoder_parse_charstrings: syntax error\n" ));
+    return CFF_Err_Invalid_File_Format;
+
+  Stack_Underflow:
+    FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow\n" ));
+    return CFF_Err_Too_Few_Arguments;
+
+  Stack_Overflow:
+    FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow\n" ));
+    return CFF_Err_Stack_Overflow;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /**********                                                      *********/
+  /**********                                                      *********/
+  /**********            COMPUTE THE MAXIMUM ADVANCE WIDTH         *********/
+  /**********                                                      *********/
+  /**********    The following code is in charge of computing      *********/
+  /**********    the maximum advance width of the font.  It        *********/
+  /**********    quickly processes each glyph charstring to        *********/
+  /**********    extract the value from either a `sbw' or `seac'   *********/
+  /**********    operator.                                         *********/
+  /**********                                                      *********/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#if 0 /* unused until we support pure CFF fonts */
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_compute_max_advance( TT_Face  face,
+                           FT_Int*  max_advance )
+  {
+    FT_Error     error = CFF_Err_Ok;
+    CFF_Decoder  decoder;
+    FT_Int       glyph_index;
+    CFF_Font     cff = (CFF_Font)face->other;
+
+
+    *max_advance = 0;
+
+    /* Initialize load decoder */
+    cff_decoder_init( &decoder, face, 0, 0, 0, 0 );
+
+    decoder.builder.metrics_only = 1;
+    decoder.builder.load_points  = 0;
+
+    /* For each glyph, parse the glyph charstring and extract */
+    /* the advance width.                                     */
+    for ( glyph_index = 0; glyph_index < face->root.num_glyphs;
+          glyph_index++ )
+    {
+      FT_Byte*  charstring;
+      FT_ULong  charstring_len;
+
+
+      /* now get load the unscaled outline */
+      error = cff_get_glyph_data( face, glyph_index,
+                                  &charstring, &charstring_len );
+      if ( !error )
+      {
+        error = cff_decoder_prepare( &decoder, size, glyph_index );
+        if ( !error )
+          error = cff_decoder_parse_charstrings( &decoder,
+                                                 charstring,
+                                                 charstring_len );
+
+        cff_free_glyph_data( face, &charstring, &charstring_len );
+      }
+
+      /* ignore the error if one has occurred -- skip to next glyph */
+      error = CFF_Err_Ok;
+    }
+
+    *max_advance = decoder.builder.advance.x;
+
+    return CFF_Err_Ok;
+  }
+
+
+#endif /* 0 */
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_slot_load( CFF_GlyphSlot  glyph,
+                 CFF_Size       size,
+                 FT_UInt        glyph_index,
+                 FT_Int32       load_flags )
+  {
+    FT_Error     error;
+    CFF_Decoder  decoder;
+    TT_Face      face = (TT_Face)glyph->root.face;
+    FT_Bool      hinting, force_scaling;
+    CFF_Font     cff  = (CFF_Font)face->extra.data;
+
+    FT_Matrix    font_matrix;
+    FT_Vector    font_offset;
+
+
+    force_scaling = FALSE;
+
+    /* in a CID-keyed font, consider `glyph_index' as a CID and map */
+    /* it immediately to the real glyph_index -- if it isn't a      */
+    /* subsetted font, glyph_indices and CIDs are identical, though */
+    if ( cff->top_font.font_dict.cid_registry != 0xFFFFU &&
+         cff->charset.cids                               )
+    {
+      /* don't handle CID 0 (.notdef) which is directly mapped to GID 0 */
+      if ( glyph_index != 0 )
+      {
+        glyph_index = cff_charset_cid_to_gindex( &cff->charset,
+                                                 glyph_index );
+        if ( glyph_index == 0 )
+          return CFF_Err_Invalid_Argument;
+      }
+    }
+    else if ( glyph_index >= cff->num_glyphs )
+      return CFF_Err_Invalid_Argument;
+
+    if ( load_flags & FT_LOAD_NO_RECURSE )
+      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
+
+    glyph->x_scale = 0x10000L;
+    glyph->y_scale = 0x10000L;
+    if ( size )
+    {
+      glyph->x_scale = size->root.metrics.x_scale;
+      glyph->y_scale = size->root.metrics.y_scale;
+    }
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+    /* try to load embedded bitmap if any              */
+    /*                                                 */
+    /* XXX: The convention should be emphasized in     */
+    /*      the documents because it can be confusing. */
+    if ( size )
+    {
+      CFF_Face      cff_face = (CFF_Face)size->root.face;
+      SFNT_Service  sfnt     = (SFNT_Service)cff_face->sfnt;
+      FT_Stream     stream   = cff_face->root.stream;
+
+
+      if ( size->strike_index != 0xFFFFFFFFUL      &&
+           sfnt->load_eblc                         &&
+           ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
+      {
+        TT_SBit_MetricsRec  metrics;
+
+
+        error = sfnt->load_sbit_image( face,
+                                       size->strike_index,
+                                       glyph_index,
+                                       (FT_Int)load_flags,
+                                       stream,
+                                       &glyph->root.bitmap,
+                                       &metrics );
+
+        if ( !error )
+        {
+          glyph->root.outline.n_points   = 0;
+          glyph->root.outline.n_contours = 0;
+
+          glyph->root.metrics.width  = (FT_Pos)metrics.width  << 6;
+          glyph->root.metrics.height = (FT_Pos)metrics.height << 6;
+
+          glyph->root.metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6;
+          glyph->root.metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6;
+          glyph->root.metrics.horiAdvance  = (FT_Pos)metrics.horiAdvance  << 6;
+
+          glyph->root.metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6;
+          glyph->root.metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6;
+          glyph->root.metrics.vertAdvance  = (FT_Pos)metrics.vertAdvance  << 6;
+
+          glyph->root.format = FT_GLYPH_FORMAT_BITMAP;
+
+          if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+          {
+            glyph->root.bitmap_left = metrics.vertBearingX;
+            glyph->root.bitmap_top  = metrics.vertBearingY;
+          }
+          else
+          {
+            glyph->root.bitmap_left = metrics.horiBearingX;
+            glyph->root.bitmap_top  = metrics.horiBearingY;
+          }
+          return error;
+        }
+      }
+    }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+    /* return immediately if we only want the embedded bitmaps */
+    if ( load_flags & FT_LOAD_SBITS_ONLY )
+      return CFF_Err_Invalid_Argument;
+
+    /* if we have a CID subfont, use its matrix (which has already */
+    /* been multiplied with the root matrix)                       */
+
+    /* this scaling is only relevant if the PS hinter isn't active */
+    if ( cff->num_subfonts )
+    {
+      FT_ULong  top_upm, sub_upm;
+      FT_Byte   fd_index = cff_fd_select_get( &cff->fd_select,
+                                              glyph_index );
+
+      if ( fd_index >= cff->num_subfonts )
+        fd_index = (FT_Byte)( cff->num_subfonts - 1 );
+
+      top_upm = cff->top_font.font_dict.units_per_em;
+      sub_upm = cff->subfonts[fd_index]->font_dict.units_per_em;
+
+
+      font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix;
+      font_offset = cff->subfonts[fd_index]->font_dict.font_offset;
+
+      if ( top_upm != sub_upm )
+      {
+        glyph->x_scale = FT_MulDiv( glyph->x_scale, top_upm, sub_upm );
+        glyph->y_scale = FT_MulDiv( glyph->y_scale, top_upm, sub_upm );
+
+        force_scaling = TRUE;
+      }
+    }
+    else
+    {
+      font_matrix = cff->top_font.font_dict.font_matrix;
+      font_offset = cff->top_font.font_dict.font_offset;
+    }
+
+    glyph->root.outline.n_points   = 0;
+    glyph->root.outline.n_contours = 0;
+
+    hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 &&
+                       ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
+
+    glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;  /* by default */
+
+    {
+      FT_Byte*  charstring;
+      FT_ULong  charstring_len;
+
+
+      cff_decoder_init( &decoder, face, size, glyph, hinting,
+                        FT_LOAD_TARGET_MODE( load_flags ) );
+
+      if ( load_flags & FT_LOAD_ADVANCE_ONLY )
+        decoder.width_only = TRUE;
+
+      decoder.builder.no_recurse =
+        (FT_Bool)( load_flags & FT_LOAD_NO_RECURSE );
+
+      /* now load the unscaled outline */
+      error = cff_get_glyph_data( face, glyph_index,
+                                  &charstring, &charstring_len );
+      if ( error )
+        goto Glyph_Build_Finished;
+
+      error = cff_decoder_prepare( &decoder, size, glyph_index );
+      if ( error )
+        goto Glyph_Build_Finished;
+
+      error = cff_decoder_parse_charstrings( &decoder,
+                                             charstring,
+                                             charstring_len );
+
+      cff_free_glyph_data( face, &charstring, charstring_len );
+
+      if ( error )
+        goto Glyph_Build_Finished;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+      /* Control data and length may not be available for incremental */
+      /* fonts.                                                       */
+      if ( face->root.internal->incremental_interface )
+      {
+        glyph->root.control_data = 0;
+        glyph->root.control_len = 0;
+      }
+      else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+      /* We set control_data and control_len if charstrings is loaded. */
+      /* See how charstring loads at cff_index_access_element() in     */
+      /* cffload.c.                                                    */
+      {
+        CFF_Index  csindex = &cff->charstrings_index;
+
+
+        if ( csindex->offsets )
+        {
+          glyph->root.control_data = csindex->bytes +
+                                     csindex->offsets[glyph_index] - 1;
+          glyph->root.control_len  = charstring_len;
+        }
+      }
+
+  Glyph_Build_Finished:
+      /* save new glyph tables, if no error */
+      if ( !error )
+        cff_builder_done( &decoder.builder );
+      /* XXX: anything to do for broken glyph entry? */
+    }
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+    /* Incremental fonts can optionally override the metrics. */
+    if ( !error                                                               &&
+         face->root.internal->incremental_interface                           &&
+         face->root.internal->incremental_interface->funcs->get_glyph_metrics )
+    {
+      FT_Incremental_MetricsRec  metrics;
+
+
+      metrics.bearing_x = decoder.builder.left_bearing.x;
+      metrics.bearing_y = 0;
+      metrics.advance   = decoder.builder.advance.x;
+      metrics.advance_v = decoder.builder.advance.y;
+
+      error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
+                face->root.internal->incremental_interface->object,
+                glyph_index, FALSE, &metrics );
+
+      decoder.builder.left_bearing.x = metrics.bearing_x;
+      decoder.builder.advance.x      = metrics.advance;
+      decoder.builder.advance.y      = metrics.advance_v;
+    }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+    if ( !error )
+    {
+      /* Now, set the metrics -- this is rather simple, as   */
+      /* the left side bearing is the xMin, and the top side */
+      /* bearing the yMax.                                   */
+
+      /* For composite glyphs, return only left side bearing and */
+      /* advance width.                                          */
+      if ( load_flags & FT_LOAD_NO_RECURSE )
+      {
+        FT_Slot_Internal  internal = glyph->root.internal;
+
+
+        glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x;
+        glyph->root.metrics.horiAdvance  = decoder.glyph_width;
+        internal->glyph_matrix           = font_matrix;
+        internal->glyph_delta            = font_offset;
+        internal->glyph_transformed      = 1;
+      }
+      else
+      {
+        FT_BBox            cbox;
+        FT_Glyph_Metrics*  metrics = &glyph->root.metrics;
+        FT_Vector          advance;
+        FT_Bool            has_vertical_info;
+
+
+        /* copy the _unscaled_ advance width */
+        metrics->horiAdvance                    = decoder.glyph_width;
+        glyph->root.linearHoriAdvance           = decoder.glyph_width;
+        glyph->root.internal->glyph_transformed = 0;
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+        has_vertical_info = FT_BOOL( face->vertical_info                   &&
+                                     face->vertical.number_Of_VMetrics > 0 &&
+                                     face->vertical.long_metrics           );
+#else
+        has_vertical_info = FT_BOOL( face->vertical_info                   &&
+                                     face->vertical.number_Of_VMetrics > 0 );
+#endif
+
+        /* get the vertical metrics from the vtmx table if we have one */
+        if ( has_vertical_info )
+        {
+          FT_Short   vertBearingY = 0;
+          FT_UShort  vertAdvance  = 0;
+
+
+          ( (SFNT_Service)face->sfnt )->get_metrics( face, 1,
+                                                     glyph_index,
+                                                     &vertBearingY,
+                                                     &vertAdvance );
+          metrics->vertBearingY = vertBearingY;
+          metrics->vertAdvance  = vertAdvance;
+        }
+        else
+        {
+          /* make up vertical ones */
+          if ( face->os2.version != 0xFFFFU )
+            metrics->vertAdvance = (FT_Pos)( face->os2.sTypoAscender -
+                                             face->os2.sTypoDescender );
+          else
+            metrics->vertAdvance = (FT_Pos)( face->horizontal.Ascender -
+                                             face->horizontal.Descender );
+        }
+
+        glyph->root.linearVertAdvance = metrics->vertAdvance;
+
+        glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;
+
+        glyph->root.outline.flags = 0;
+        if ( size && size->root.metrics.y_ppem < 24 )
+          glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
+        glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL;
+
+        if ( !( font_matrix.xx == 0x10000L &&
+                font_matrix.yy == 0x10000L &&
+                font_matrix.xy == 0        &&
+                font_matrix.yx == 0        ) )
+          FT_Outline_Transform( &glyph->root.outline, &font_matrix );
+
+        if ( !( font_offset.x == 0 &&
+                font_offset.y == 0 ) )
+          FT_Outline_Translate( &glyph->root.outline,
+                                font_offset.x, font_offset.y );
+
+        advance.x = metrics->horiAdvance;
+        advance.y = 0;
+        FT_Vector_Transform( &advance, &font_matrix );
+        metrics->horiAdvance = advance.x + font_offset.x;
+
+        advance.x = 0;
+        advance.y = metrics->vertAdvance;
+        FT_Vector_Transform( &advance, &font_matrix );
+        metrics->vertAdvance = advance.y + font_offset.y;
+
+        if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling )
+        {
+          /* scale the outline and the metrics */
+          FT_Int       n;
+          FT_Outline*  cur     = &glyph->root.outline;
+          FT_Vector*   vec     = cur->points;
+          FT_Fixed     x_scale = glyph->x_scale;
+          FT_Fixed     y_scale = glyph->y_scale;
+
+
+          /* First of all, scale the points */
+          if ( !hinting || !decoder.builder.hints_funcs )
+            for ( n = cur->n_points; n > 0; n--, vec++ )
+            {
+              vec->x = FT_MulFix( vec->x, x_scale );
+              vec->y = FT_MulFix( vec->y, y_scale );
+            }
+
+          /* Then scale the metrics */
+          metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
+          metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
+        }
+
+        /* compute the other metrics */
+        FT_Outline_Get_CBox( &glyph->root.outline, &cbox );
+
+        metrics->width  = cbox.xMax - cbox.xMin;
+        metrics->height = cbox.yMax - cbox.yMin;
+
+        metrics->horiBearingX = cbox.xMin;
+        metrics->horiBearingY = cbox.yMax;
+
+        if ( has_vertical_info )
+          metrics->vertBearingX = metrics->horiBearingX -
+                                    metrics->horiAdvance / 2;
+        else
+        {
+          if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+            ft_synthesize_vertical_metrics( metrics,
+                                            metrics->vertAdvance );
+        }
+      }
+    }
+
+    return error;
+  }
+
+
+/* END */
diff --git a/src/cff/cffgload.h b/src/cff/cffgload.h
new file mode 100644 (file)
index 0000000..38937be
--- /dev/null
@@ -0,0 +1,201 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffgload.h                                                             */
+/*                                                                         */
+/*    OpenType Glyph Loader (specification).                               */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CFFGLOAD_H__
+#define __CFFGLOAD_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include "cffobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#define CFF_MAX_OPERANDS        48
+#define CFF_MAX_SUBRS_CALLS     32
+#define CFF_MAX_TRANS_ELEMENTS  32
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Structure>                                                           */
+  /*    CFF_Builder                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*     A structure used during glyph loading to store its outline.       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    memory        :: The current memory object.                        */
+  /*                                                                       */
+  /*    face          :: The current face object.                          */
+  /*                                                                       */
+  /*    glyph         :: The current glyph slot.                           */
+  /*                                                                       */
+  /*    loader        :: The current glyph loader.                         */
+  /*                                                                       */
+  /*    base          :: The base glyph outline.                           */
+  /*                                                                       */
+  /*    current       :: The current glyph outline.                        */
+  /*                                                                       */
+  /*    pos_x         :: The horizontal translation (if composite glyph).  */
+  /*                                                                       */
+  /*    pos_y         :: The vertical translation (if composite glyph).    */
+  /*                                                                       */
+  /*    left_bearing  :: The left side bearing point.                      */
+  /*                                                                       */
+  /*    advance       :: The horizontal advance vector.                    */
+  /*                                                                       */
+  /*    bbox          :: Unused.                                           */
+  /*                                                                       */
+  /*    path_begun    :: A flag which indicates that a new path has begun. */
+  /*                                                                       */
+  /*    load_points   :: If this flag is not set, no points are loaded.    */
+  /*                                                                       */
+  /*    no_recurse    :: Set but not used.                                 */
+  /*                                                                       */
+  /*    metrics_only  :: A boolean indicating that we only want to compute */
+  /*                     the metrics of a given glyph, not load all of its */
+  /*                     points.                                           */
+  /*                                                                       */
+  /*    hints_funcs   :: Auxiliary pointer for hinting.                    */
+  /*                                                                       */
+  /*    hints_globals :: Auxiliary pointer for hinting.                    */
+  /*                                                                       */
+  typedef struct  CFF_Builder_
+  {
+    FT_Memory       memory;
+    TT_Face         face;
+    CFF_GlyphSlot   glyph;
+    FT_GlyphLoader  loader;
+    FT_Outline*     base;
+    FT_Outline*     current;
+
+    FT_Pos          pos_x;
+    FT_Pos          pos_y;
+
+    FT_Vector       left_bearing;
+    FT_Vector       advance;
+
+    FT_BBox         bbox;          /* bounding box */
+    FT_Bool         path_begun;
+    FT_Bool         load_points;
+    FT_Bool         no_recurse;
+
+    FT_Bool         metrics_only;
+
+    void*           hints_funcs;    /* hinter-specific */
+    void*           hints_globals;  /* hinter-specific */
+
+  } CFF_Builder;
+
+
+  /* execution context charstring zone */
+
+  typedef struct  CFF_Decoder_Zone_
+  {
+    FT_Byte*  base;
+    FT_Byte*  limit;
+    FT_Byte*  cursor;
+
+  } CFF_Decoder_Zone;
+
+
+  typedef struct  CFF_Decoder_
+  {
+    CFF_Builder        builder;
+    CFF_Font           cff;
+
+    FT_Fixed           stack[CFF_MAX_OPERANDS + 1];
+    FT_Fixed*          top;
+
+    CFF_Decoder_Zone   zones[CFF_MAX_SUBRS_CALLS + 1];
+    CFF_Decoder_Zone*  zone;
+
+    FT_Int             flex_state;
+    FT_Int             num_flex_vectors;
+    FT_Vector          flex_vectors[7];
+
+    FT_Pos             glyph_width;
+    FT_Pos             nominal_width;
+
+    FT_Bool            read_width;
+    FT_Bool            width_only;
+    FT_Int             num_hints;
+    FT_Fixed           buildchar[CFF_MAX_TRANS_ELEMENTS];
+
+    FT_UInt            num_locals;
+    FT_UInt            num_globals;
+
+    FT_Int             locals_bias;
+    FT_Int             globals_bias;
+
+    FT_Byte**          locals;
+    FT_Byte**          globals;
+
+    FT_Byte**          glyph_names;   /* for pure CFF fonts only  */
+    FT_UInt            num_glyphs;    /* number of glyphs in font */
+
+    FT_Render_Mode     hint_mode;
+
+    FT_Bool            seac;
+
+  } CFF_Decoder;
+
+
+  FT_LOCAL( void )
+  cff_decoder_init( CFF_Decoder*    decoder,
+                    TT_Face         face,
+                    CFF_Size        size,
+                    CFF_GlyphSlot   slot,
+                    FT_Bool         hinting,
+                    FT_Render_Mode  hint_mode );
+
+  FT_LOCAL( FT_Error )
+  cff_decoder_prepare( CFF_Decoder*  decoder,
+                       CFF_Size      size,
+                       FT_UInt       glyph_index );
+
+#if 0  /* unused until we support pure CFF fonts */
+
+  /* Compute the maximum advance width of a font through quick parsing */
+  FT_LOCAL( FT_Error )
+  cff_compute_max_advance( TT_Face  face,
+                           FT_Int*  max_advance );
+
+#endif /* 0 */
+
+  FT_LOCAL( FT_Error )
+  cff_decoder_parse_charstrings( CFF_Decoder*  decoder,
+                                 FT_Byte*      charstring_base,
+                                 FT_ULong      charstring_len );
+
+  FT_LOCAL( FT_Error )
+  cff_slot_load( CFF_GlyphSlot  glyph,
+                 CFF_Size       size,
+                 FT_UInt        glyph_index,
+                 FT_Int32       load_flags );
+
+
+FT_END_HEADER
+
+#endif /* __CFFGLOAD_H__ */
+
+
+/* END */
diff --git a/src/cff/cffload.c b/src/cff/cffload.c
new file mode 100644 (file)
index 0000000..2be6ba0
--- /dev/null
@@ -0,0 +1,1666 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffload.c                                                              */
+/*                                                                         */
+/*    OpenType and CFF data/program tables loader (body).                  */
+/*                                                                         */
+/*  Copyright 1996-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_STREAM_H
+#include FT_TRUETYPE_TAGS_H
+#include FT_TYPE1_TABLES_H
+
+#include "cffload.h"
+#include "cffparse.h"
+
+#include "cfferrs.h"
+
+
+#if 1
+
+  static const FT_UShort  cff_isoadobe_charset[229] =
+  {
+      0,   1,   2,   3,   4,   5,   6,   7,
+      8,   9,  10,  11,  12,  13,  14,  15,
+     16,  17,  18,  19,  20,  21,  22,  23,
+     24,  25,  26,  27,  28,  29,  30,  31,
+     32,  33,  34,  35,  36,  37,  38,  39,
+     40,  41,  42,  43,  44,  45,  46,  47,
+     48,  49,  50,  51,  52,  53,  54,  55,
+     56,  57,  58,  59,  60,  61,  62,  63,
+     64,  65,  66,  67,  68,  69,  70,  71,
+     72,  73,  74,  75,  76,  77,  78,  79,
+     80,  81,  82,  83,  84,  85,  86,  87,
+     88,  89,  90,  91,  92,  93,  94,  95,
+     96,  97,  98,  99, 100, 101, 102, 103,
+    104, 105, 106, 107, 108, 109, 110, 111,
+    112, 113, 114, 115, 116, 117, 118, 119,
+    120, 121, 122, 123, 124, 125, 126, 127,
+    128, 129, 130, 131, 132, 133, 134, 135,
+    136, 137, 138, 139, 140, 141, 142, 143,
+    144, 145, 146, 147, 148, 149, 150, 151,
+    152, 153, 154, 155, 156, 157, 158, 159,
+    160, 161, 162, 163, 164, 165, 166, 167,
+    168, 169, 170, 171, 172, 173, 174, 175,
+    176, 177, 178, 179, 180, 181, 182, 183,
+    184, 185, 186, 187, 188, 189, 190, 191,
+    192, 193, 194, 195, 196, 197, 198, 199,
+    200, 201, 202, 203, 204, 205, 206, 207,
+    208, 209, 210, 211, 212, 213, 214, 215,
+    216, 217, 218, 219, 220, 221, 222, 223,
+    224, 225, 226, 227, 228
+  };
+
+  static const FT_UShort  cff_expert_charset[166] =
+  {
+      0,   1, 229, 230, 231, 232, 233, 234,
+    235, 236, 237, 238,  13,  14,  15,  99,
+    239, 240, 241, 242, 243, 244, 245, 246,
+    247, 248,  27,  28, 249, 250, 251, 252,
+    253, 254, 255, 256, 257, 258, 259, 260,
+    261, 262, 263, 264, 265, 266, 109, 110,
+    267, 268, 269, 270, 271, 272, 273, 274,
+    275, 276, 277, 278, 279, 280, 281, 282,
+    283, 284, 285, 286, 287, 288, 289, 290,
+    291, 292, 293, 294, 295, 296, 297, 298,
+    299, 300, 301, 302, 303, 304, 305, 306,
+    307, 308, 309, 310, 311, 312, 313, 314,
+    315, 316, 317, 318, 158, 155, 163, 319,
+    320, 321, 322, 323, 324, 325, 326, 150,
+    164, 169, 327, 328, 329, 330, 331, 332,
+    333, 334, 335, 336, 337, 338, 339, 340,
+    341, 342, 343, 344, 345, 346, 347, 348,
+    349, 350, 351, 352, 353, 354, 355, 356,
+    357, 358, 359, 360, 361, 362, 363, 364,
+    365, 366, 367, 368, 369, 370, 371, 372,
+    373, 374, 375, 376, 377, 378
+  };
+
+  static const FT_UShort  cff_expertsubset_charset[87] =
+  {
+      0,   1, 231, 232, 235, 236, 237, 238,
+     13,  14,  15,  99, 239, 240, 241, 242,
+    243, 244, 245, 246, 247, 248,  27,  28,
+    249, 250, 251, 253, 254, 255, 256, 257,
+    258, 259, 260, 261, 262, 263, 264, 265,
+    266, 109, 110, 267, 268, 269, 270, 272,
+    300, 301, 302, 305, 314, 315, 158, 155,
+    163, 320, 321, 322, 323, 324, 325, 326,
+    150, 164, 169, 327, 328, 329, 330, 331,
+    332, 333, 334, 335, 336, 337, 338, 339,
+    340, 341, 342, 343, 344, 345, 346
+  };
+
+  static const FT_UShort  cff_standard_encoding[256] =
+  {
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      1,   2,   3,   4,   5,   6,   7,   8,
+      9,  10,  11,  12,  13,  14,  15,  16,
+     17,  18,  19,  20,  21,  22,  23,  24,
+     25,  26,  27,  28,  29,  30,  31,  32,
+     33,  34,  35,  36,  37,  38,  39,  40,
+     41,  42,  43,  44,  45,  46,  47,  48,
+     49,  50,  51,  52,  53,  54,  55,  56,
+     57,  58,  59,  60,  61,  62,  63,  64,
+     65,  66,  67,  68,  69,  70,  71,  72,
+     73,  74,  75,  76,  77,  78,  79,  80,
+     81,  82,  83,  84,  85,  86,  87,  88,
+     89,  90,  91,  92,  93,  94,  95,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,  96,  97,  98,  99, 100, 101, 102,
+    103, 104, 105, 106, 107, 108, 109, 110,
+      0, 111, 112, 113, 114,   0, 115, 116,
+    117, 118, 119, 120, 121, 122,   0, 123,
+      0, 124, 125, 126, 127, 128, 129, 130,
+    131,   0, 132, 133,   0, 134, 135, 136,
+    137,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0, 138,   0, 139,   0,   0,   0,   0,
+    140, 141, 142, 143,   0,   0,   0,   0,
+      0, 144,   0,   0,   0, 145,   0,   0,
+    146, 147, 148, 149,   0,   0,   0,   0
+  };
+
+  static const FT_UShort  cff_expert_encoding[256] =
+  {
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      1, 229, 230,   0, 231, 232, 233, 234,
+    235, 236, 237, 238,  13,  14,  15,  99,
+    239, 240, 241, 242, 243, 244, 245, 246,
+    247, 248,  27,  28, 249, 250, 251, 252,
+      0, 253, 254, 255, 256, 257,   0,   0,
+      0, 258,   0,   0, 259, 260, 261, 262,
+      0,   0, 263, 264, 265,   0, 266, 109,
+    110, 267, 268, 269,   0, 270, 271, 272,
+    273, 274, 275, 276, 277, 278, 279, 280,
+    281, 282, 283, 284, 285, 286, 287, 288,
+    289, 290, 291, 292, 293, 294, 295, 296,
+    297, 298, 299, 300, 301, 302, 303,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0,   0,   0,   0,   0,   0,   0,   0,
+      0, 304, 305, 306,   0,   0, 307, 308,
+    309, 310, 311,   0, 312,   0,   0, 312,
+      0,   0, 314, 315,   0,   0, 316, 317,
+    318,   0,   0,   0, 158, 155, 163, 319,
+    320, 321, 322, 323, 324, 325,   0,   0,
+    326, 150, 164, 169, 327, 328, 329, 330,
+    331, 332, 333, 334, 335, 336, 337, 338,
+    339, 340, 341, 342, 343, 344, 345, 346,
+    347, 348, 349, 350, 351, 352, 353, 354,
+    355, 356, 357, 358, 359, 360, 361, 362,
+    363, 364, 365, 366, 367, 368, 369, 370,
+    371, 372, 373, 374, 375, 376, 377, 378
+  };
+
+#endif /* 1 */
+
+
+  FT_LOCAL_DEF( FT_UShort )
+  cff_get_standard_encoding( FT_UInt  charcode )
+  {
+    return (FT_UShort)( charcode < 256 ? cff_standard_encoding[charcode]
+                                       : 0 );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cffload
+
+
+  /* read an offset from the index's stream current position */
+  static FT_ULong
+  cff_index_read_offset( CFF_Index  idx,
+                         FT_Error  *errorp )
+  {
+    FT_Error   error;
+    FT_Stream  stream = idx->stream;
+    FT_Byte    tmp[4];
+    FT_ULong   result = 0;
+
+
+    if ( !FT_STREAM_READ( tmp, idx->off_size ) )
+    {
+      FT_Int  nn;
+
+
+      for ( nn = 0; nn < idx->off_size; nn++ )
+        result = ( result << 8 ) | tmp[nn];
+    }
+
+    *errorp = error;
+    return result;
+  }
+
+
+  static FT_Error
+  cff_index_init( CFF_Index  idx,
+                  FT_Stream  stream,
+                  FT_Bool    load )
+  {
+    FT_Error   error;
+    FT_Memory  memory = stream->memory;
+    FT_UShort  count;
+
+
+    FT_MEM_ZERO( idx, sizeof ( *idx ) );
+
+    idx->stream = stream;
+    idx->start  = FT_STREAM_POS();
+    if ( !FT_READ_USHORT( count ) &&
+         count > 0                )
+    {
+      FT_Byte   offsize;
+      FT_ULong  size;
+
+
+      /* there is at least one element; read the offset size,           */
+      /* then access the offset table to compute the index's total size */
+      if ( FT_READ_BYTE( offsize ) )
+        goto Exit;
+
+      if ( offsize < 1 || offsize > 4 )
+      {
+        error = CFF_Err_Invalid_Table;
+        goto Exit;
+      }
+
+      idx->count    = count;
+      idx->off_size = offsize;
+      size          = (FT_ULong)( count + 1 ) * offsize;
+
+      idx->data_offset = idx->start + 3 + size;
+
+      if ( FT_STREAM_SKIP( size - offsize ) )
+        goto Exit;
+
+      size = cff_index_read_offset( idx, &error );
+      if ( error )
+        goto Exit;
+
+      if ( size == 0 )
+      {
+        error = CFF_Err_Invalid_Table;
+        goto Exit;
+      }
+
+      idx->data_size = --size;
+
+      if ( load )
+      {
+        /* load the data */
+        if ( FT_FRAME_EXTRACT( size, idx->bytes ) )
+          goto Exit;
+      }
+      else
+      {
+        /* skip the data */
+        if ( FT_STREAM_SKIP( size ) )
+          goto Exit;
+      }
+    }
+
+  Exit:
+    if ( error )
+      FT_FREE( idx->offsets );
+
+    return error;
+  }
+
+
+  static void
+  cff_index_done( CFF_Index  idx )
+  {
+    if ( idx->stream )
+    {
+      FT_Stream  stream = idx->stream;
+      FT_Memory  memory = stream->memory;
+
+
+      if ( idx->bytes )
+        FT_FRAME_RELEASE( idx->bytes );
+
+      FT_FREE( idx->offsets );
+      FT_MEM_ZERO( idx, sizeof ( *idx ) );
+    }
+  }
+
+
+  static FT_Error
+  cff_index_load_offsets( CFF_Index  idx )
+  {
+    FT_Error   error  = CFF_Err_Ok;
+    FT_Stream  stream = idx->stream;
+    FT_Memory  memory = stream->memory;
+
+
+    if ( idx->count > 0 && idx->offsets == NULL )
+    {
+      FT_Byte    offsize = idx->off_size;
+      FT_ULong   data_size;
+      FT_Byte*   p;
+      FT_Byte*   p_end;
+      FT_ULong*  poff;
+
+
+      data_size = (FT_ULong)( idx->count + 1 ) * offsize;
+
+      if ( FT_NEW_ARRAY( idx->offsets, idx->count + 1 ) ||
+           FT_STREAM_SEEK( idx->start + 3 )             ||
+           FT_FRAME_ENTER( data_size )                  )
+        goto Exit;
+
+      poff   = idx->offsets;
+      p      = (FT_Byte*)stream->cursor;
+      p_end  = p + data_size;
+
+      switch ( offsize )
+      {
+      case 1:
+        for ( ; p < p_end; p++, poff++ )
+          poff[0] = p[0];
+        break;
+
+      case 2:
+        for ( ; p < p_end; p += 2, poff++ )
+          poff[0] = FT_PEEK_USHORT( p );
+        break;
+
+      case 3:
+        for ( ; p < p_end; p += 3, poff++ )
+          poff[0] = FT_PEEK_OFF3( p );
+        break;
+
+      default:
+        for ( ; p < p_end; p += 4, poff++ )
+          poff[0] = FT_PEEK_ULONG( p );
+      }
+
+      FT_FRAME_EXIT();
+    }
+
+  Exit:
+    if ( error )
+      FT_FREE( idx->offsets );
+
+    return error;
+  }
+
+
+  /* Allocate a table containing pointers to an index's elements. */
+  /* The `pool' argument makes this function convert the index    */
+  /* entries to C-style strings (this is, NULL-terminated).       */
+  static FT_Error
+  cff_index_get_pointers( CFF_Index   idx,
+                          FT_Byte***  table,
+                          FT_Byte**   pool )
+  {
+    FT_Error   error     = CFF_Err_Ok;
+    FT_Memory  memory    = idx->stream->memory;
+    FT_Byte**  t = NULL;
+    FT_Byte*   new_bytes = NULL;
+
+
+    *table = NULL;
+
+    if ( idx->offsets == NULL )
+    {
+      error = cff_index_load_offsets( idx );
+      if ( error )
+        goto Exit;
+    }
+
+    if ( idx->count > 0                                        &&
+         !FT_NEW_ARRAY( t, idx->count + 1 )                    &&
+         ( !pool || !FT_ALLOC( new_bytes,
+                               idx->data_size + idx->count ) ) )
+    {
+      FT_ULong  n, cur_offset;
+      FT_ULong  extra = 0;
+      FT_Byte*  org_bytes = idx->bytes;
+
+
+      /* at this point, `idx->offsets' can't be NULL */
+      cur_offset = idx->offsets[0] - 1;
+
+      /* sanity check */
+      if ( cur_offset >= idx->data_size )
+      {
+        FT_TRACE0(( "cff_index_get_pointers:"
+                    " invalid first offset value %d set to zero\n",
+                    cur_offset ));
+        cur_offset = 0;
+      }
+
+      if ( !pool )
+        t[0] = org_bytes + cur_offset;
+      else
+        t[0] = new_bytes + cur_offset;
+
+      for ( n = 1; n <= idx->count; n++ )
+      {
+        FT_ULong  next_offset = idx->offsets[n] - 1;
+
+
+        /* empty slot + two sanity checks for invalid offset tables */
+        if ( next_offset == 0                                    ||
+             next_offset < cur_offset                            ||
+             ( next_offset >= idx->data_size && n < idx->count ) )
+          next_offset = cur_offset;
+
+        if ( !pool )
+          t[n] = org_bytes + next_offset;
+        else
+        {
+          t[n] = new_bytes + next_offset + extra;
+
+          if ( next_offset != cur_offset )
+          {
+            FT_MEM_COPY( t[n - 1], org_bytes + cur_offset, t[n] - t[n - 1] );
+            t[n][0] = '\0';
+            t[n]   += 1;
+            extra++;
+          }
+        }
+
+        cur_offset = next_offset;
+      }
+      *table = t;
+
+      if ( pool )
+        *pool = new_bytes;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_index_access_element( CFF_Index  idx,
+                            FT_UInt    element,
+                            FT_Byte**  pbytes,
+                            FT_ULong*  pbyte_len )
+  {
+    FT_Error  error = CFF_Err_Ok;
+
+
+    if ( idx && idx->count > element )
+    {
+      /* compute start and end offsets */
+      FT_Stream  stream = idx->stream;
+      FT_ULong   off1, off2 = 0;
+
+
+      /* load offsets from file or the offset table */
+      if ( !idx->offsets )
+      {
+        FT_ULong  pos = element * idx->off_size;
+
+
+        if ( FT_STREAM_SEEK( idx->start + 3 + pos ) )
+          goto Exit;
+
+        off1 = cff_index_read_offset( idx, &error );
+        if ( error )
+          goto Exit;
+
+        if ( off1 != 0 )
+        {
+          do
+          {
+            element++;
+            off2 = cff_index_read_offset( idx, &error );
+          }
+          while ( off2 == 0 && element < idx->count );
+        }
+      }
+      else   /* use offsets table */
+      {
+        off1 = idx->offsets[element];
+        if ( off1 )
+        {
+          do
+          {
+            element++;
+            off2 = idx->offsets[element];
+
+          } while ( off2 == 0 && element < idx->count );
+        }
+      }
+
+      /* XXX: should check off2 does not exceed the end of this entry; */
+      /*      at present, only truncate off2 at the end of this stream */
+      if ( off2 > stream->size + 1                    ||
+           idx->data_offset > stream->size - off2 + 1 )
+      {
+        FT_ERROR(( "cff_index_access_element:"
+                   " offset to next entry (%d)"
+                   " exceeds the end of stream (%d)\n",
+                   off2, stream->size - idx->data_offset + 1 ));
+        off2 = stream->size - idx->data_offset + 1;
+      }
+
+      /* access element */
+      if ( off1 && off2 > off1 )
+      {
+        *pbyte_len = off2 - off1;
+
+        if ( idx->bytes )
+        {
+          /* this index was completely loaded in memory, that's easy */
+          *pbytes = idx->bytes + off1 - 1;
+        }
+        else
+        {
+          /* this index is still on disk/file, access it through a frame */
+          if ( FT_STREAM_SEEK( idx->data_offset + off1 - 1 ) ||
+               FT_FRAME_EXTRACT( off2 - off1, *pbytes )      )
+            goto Exit;
+        }
+      }
+      else
+      {
+        /* empty index element */
+        *pbytes    = 0;
+        *pbyte_len = 0;
+      }
+    }
+    else
+      error = CFF_Err_Invalid_Argument;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cff_index_forget_element( CFF_Index  idx,
+                            FT_Byte**  pbytes )
+  {
+    if ( idx->bytes == 0 )
+    {
+      FT_Stream  stream = idx->stream;
+
+
+      FT_FRAME_RELEASE( *pbytes );
+    }
+  }
+
+
+  /* get an entry from Name INDEX */
+  FT_LOCAL_DEF( FT_String* )
+  cff_index_get_name( CFF_Font  font,
+                      FT_UInt   element )
+  {
+    CFF_Index   idx = &font->name_index;
+    FT_Memory   memory = idx->stream->memory;
+    FT_Byte*    bytes;
+    FT_ULong    byte_len;
+    FT_Error    error;
+    FT_String*  name = 0;
+
+
+    error = cff_index_access_element( idx, element, &bytes, &byte_len );
+    if ( error )
+      goto Exit;
+
+    if ( !FT_ALLOC( name, byte_len + 1 ) )
+    {
+      FT_MEM_COPY( name, bytes, byte_len );
+      name[byte_len] = 0;
+    }
+    cff_index_forget_element( idx, &bytes );
+
+  Exit:
+    return name;
+  }
+
+
+  /* get an entry from String INDEX */
+  FT_LOCAL_DEF( FT_String* )
+  cff_index_get_string( CFF_Font  font,
+                        FT_UInt   element )
+  {
+    return ( element < font->num_strings )
+             ? (FT_String*)font->strings[element]
+             : NULL;
+  }
+
+
+  FT_LOCAL_DEF( FT_String* )
+  cff_index_get_sid_string( CFF_Font  font,
+                            FT_UInt   sid )
+  {
+    /* value 0xFFFFU indicates a missing dictionary entry */
+    if ( sid == 0xFFFFU )
+      return NULL;
+
+    /* if it is not a standard string, return it */
+    if ( sid > 390 )
+      return cff_index_get_string( font, sid - 391 );
+
+    /* CID-keyed CFF fonts don't have glyph names */
+    if ( !font->psnames )
+      return NULL;
+
+    /* this is a standard string */
+    return (FT_String *)font->psnames->adobe_std_strings( sid );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***   FD Select table support                                         ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  static void
+  CFF_Done_FD_Select( CFF_FDSelect  fdselect,
+                      FT_Stream     stream )
+  {
+    if ( fdselect->data )
+      FT_FRAME_RELEASE( fdselect->data );
+
+    fdselect->data_size   = 0;
+    fdselect->format      = 0;
+    fdselect->range_count = 0;
+  }
+
+
+  static FT_Error
+  CFF_Load_FD_Select( CFF_FDSelect  fdselect,
+                      FT_UInt       num_glyphs,
+                      FT_Stream     stream,
+                      FT_ULong      offset )
+  {
+    FT_Error  error;
+    FT_Byte   format;
+    FT_UInt   num_ranges;
+
+
+    /* read format */
+    if ( FT_STREAM_SEEK( offset ) || FT_READ_BYTE( format ) )
+      goto Exit;
+
+    fdselect->format      = format;
+    fdselect->cache_count = 0;   /* clear cache */
+
+    switch ( format )
+    {
+    case 0:     /* format 0, that's simple */
+      fdselect->data_size = num_glyphs;
+      goto Load_Data;
+
+    case 3:     /* format 3, a tad more complex */
+      if ( FT_READ_USHORT( num_ranges ) )
+        goto Exit;
+
+      fdselect->data_size = num_ranges * 3 + 2;
+
+    Load_Data:
+      if ( FT_FRAME_EXTRACT( fdselect->data_size, fdselect->data ) )
+        goto Exit;
+      break;
+
+    default:    /* hmm... that's wrong */
+      error = CFF_Err_Invalid_File_Format;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Byte )
+  cff_fd_select_get( CFF_FDSelect  fdselect,
+                     FT_UInt       glyph_index )
+  {
+    FT_Byte  fd = 0;
+
+
+    switch ( fdselect->format )
+    {
+    case 0:
+      fd = fdselect->data[glyph_index];
+      break;
+
+    case 3:
+      /* first, compare to cache */
+      if ( (FT_UInt)( glyph_index - fdselect->cache_first ) <
+                        fdselect->cache_count )
+      {
+        fd = fdselect->cache_fd;
+        break;
+      }
+
+      /* then, lookup the ranges array */
+      {
+        FT_Byte*  p       = fdselect->data;
+        FT_Byte*  p_limit = p + fdselect->data_size;
+        FT_Byte   fd2;
+        FT_UInt   first, limit;
+
+
+        first = FT_NEXT_USHORT( p );
+        do
+        {
+          if ( glyph_index < first )
+            break;
+
+          fd2   = *p++;
+          limit = FT_NEXT_USHORT( p );
+
+          if ( glyph_index < limit )
+          {
+            fd = fd2;
+
+            /* update cache */
+            fdselect->cache_first = first;
+            fdselect->cache_count = limit-first;
+            fdselect->cache_fd    = fd2;
+            break;
+          }
+          first = limit;
+
+        } while ( p < p_limit );
+      }
+      break;
+
+    default:
+      ;
+    }
+
+    return fd;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /***                                                                   ***/
+  /***   CFF font support                                                ***/
+  /***                                                                   ***/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static FT_Error
+  cff_charset_compute_cids( CFF_Charset  charset,
+                            FT_UInt      num_glyphs,
+                            FT_Memory    memory )
+  {
+    FT_Error   error   = CFF_Err_Ok;
+    FT_UInt    i;
+    FT_Long    j;
+    FT_UShort  max_cid = 0;
+
+
+    if ( charset->max_cid > 0 )
+      goto Exit;
+
+    for ( i = 0; i < num_glyphs; i++ )
+    {
+      if ( charset->sids[i] > max_cid )
+        max_cid = charset->sids[i];
+    }
+
+    if ( FT_NEW_ARRAY( charset->cids, (FT_ULong)max_cid + 1 ) )
+      goto Exit;
+
+    /* When multiple GIDs map to the same CID, we choose the lowest */
+    /* GID.  This is not described in any spec, but it matches the  */
+    /* behaviour of recent Acroread versions.                       */
+    for ( j = num_glyphs - 1; j >= 0 ; j-- )
+      charset->cids[charset->sids[j]] = (FT_UShort)j;
+
+    charset->max_cid    = max_cid;
+    charset->num_glyphs = num_glyphs;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_UInt )
+  cff_charset_cid_to_gindex( CFF_Charset  charset,
+                             FT_UInt      cid )
+  {
+    FT_UInt  result = 0;
+
+
+    if ( cid <= charset->max_cid )
+      result = charset->cids[cid];
+
+    return result;
+  }
+
+
+  static void
+  cff_charset_free_cids( CFF_Charset  charset,
+                         FT_Memory    memory )
+  {
+    FT_FREE( charset->cids );
+    charset->max_cid = 0;
+  }
+
+
+  static void
+  cff_charset_done( CFF_Charset  charset,
+                    FT_Stream    stream )
+  {
+    FT_Memory  memory = stream->memory;
+
+
+    cff_charset_free_cids( charset, memory );
+
+    FT_FREE( charset->sids );
+    charset->format = 0;
+    charset->offset = 0;
+  }
+
+
+  static FT_Error
+  cff_charset_load( CFF_Charset  charset,
+                    FT_UInt      num_glyphs,
+                    FT_Stream    stream,
+                    FT_ULong     base_offset,
+                    FT_ULong     offset,
+                    FT_Bool      invert )
+  {
+    FT_Memory  memory = stream->memory;
+    FT_Error   error  = CFF_Err_Ok;
+    FT_UShort  glyph_sid;
+
+
+    /* If the the offset is greater than 2, we have to parse the */
+    /* charset table.                                            */
+    if ( offset > 2 )
+    {
+      FT_UInt  j;
+
+
+      charset->offset = base_offset + offset;
+
+      /* Get the format of the table. */
+      if ( FT_STREAM_SEEK( charset->offset ) ||
+           FT_READ_BYTE( charset->format )   )
+        goto Exit;
+
+      /* Allocate memory for sids. */
+      if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
+        goto Exit;
+
+      /* assign the .notdef glyph */
+      charset->sids[0] = 0;
+
+      switch ( charset->format )
+      {
+      case 0:
+        if ( num_glyphs > 0 )
+        {
+          if ( FT_FRAME_ENTER( ( num_glyphs - 1 ) * 2 ) )
+            goto Exit;
+
+          for ( j = 1; j < num_glyphs; j++ )
+            charset->sids[j] = FT_GET_USHORT();
+
+          FT_FRAME_EXIT();
+        }
+        break;
+
+      case 1:
+      case 2:
+        {
+          FT_UInt  nleft;
+          FT_UInt  i;
+
+
+          j = 1;
+
+          while ( j < num_glyphs )
+          {
+            /* Read the first glyph sid of the range. */
+            if ( FT_READ_USHORT( glyph_sid ) )
+              goto Exit;
+
+            /* Read the number of glyphs in the range.  */
+            if ( charset->format == 2 )
+            {
+              if ( FT_READ_USHORT( nleft ) )
+                goto Exit;
+            }
+            else
+            {
+              if ( FT_READ_BYTE( nleft ) )
+                goto Exit;
+            }
+
+            /* try to rescue some of the SIDs if `nleft' is too large */
+            if ( glyph_sid > 0xFFFFL - nleft )
+            {
+              FT_ERROR(( "cff_charset_load: invalid SID range trimmed"
+                         " nleft=%d -> %d\n", nleft, 0xFFFFL - glyph_sid ));
+              nleft = ( FT_UInt )( 0xFFFFL - glyph_sid );
+            }
+
+            /* Fill in the range of sids -- `nleft + 1' glyphs. */
+            for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ )
+              charset->sids[j] = glyph_sid;
+          }
+        }
+        break;
+
+      default:
+        FT_ERROR(( "cff_charset_load: invalid table format\n" ));
+        error = CFF_Err_Invalid_File_Format;
+        goto Exit;
+      }
+    }
+    else
+    {
+      /* Parse default tables corresponding to offset == 0, 1, or 2.  */
+      /* CFF specification intimates the following:                   */
+      /*                                                              */
+      /* In order to use a predefined charset, the following must be  */
+      /* true: The charset constructed for the glyphs in the font's   */
+      /* charstrings dictionary must match the predefined charset in  */
+      /* the first num_glyphs.                                        */
+
+      charset->offset = offset;  /* record charset type */
+
+      switch ( (FT_UInt)offset )
+      {
+      case 0:
+        if ( num_glyphs > 229 )
+        {
+          FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
+                     "predefined charset (Adobe ISO-Latin)\n" ));
+          error = CFF_Err_Invalid_File_Format;
+          goto Exit;
+        }
+
+        /* Allocate memory for sids. */
+        if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
+          goto Exit;
+
+        /* Copy the predefined charset into the allocated memory. */
+        FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs );
+
+        break;
+
+      case 1:
+        if ( num_glyphs > 166 )
+        {
+          FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
+                     "predefined charset (Adobe Expert)\n" ));
+          error = CFF_Err_Invalid_File_Format;
+          goto Exit;
+        }
+
+        /* Allocate memory for sids. */
+        if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
+          goto Exit;
+
+        /* Copy the predefined charset into the allocated memory.     */
+        FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs );
+
+        break;
+
+      case 2:
+        if ( num_glyphs > 87 )
+        {
+          FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
+                     "predefined charset (Adobe Expert Subset)\n" ));
+          error = CFF_Err_Invalid_File_Format;
+          goto Exit;
+        }
+
+        /* Allocate memory for sids. */
+        if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
+          goto Exit;
+
+        /* Copy the predefined charset into the allocated memory.     */
+        FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs );
+
+        break;
+
+      default:
+        error = CFF_Err_Invalid_File_Format;
+        goto Exit;
+      }
+    }
+
+    /* we have to invert the `sids' array for subsetted CID-keyed fonts */
+    if ( invert )
+      error = cff_charset_compute_cids( charset, num_glyphs, memory );
+
+  Exit:
+    /* Clean up if there was an error. */
+    if ( error )
+    {
+      FT_FREE( charset->sids );
+      FT_FREE( charset->cids );
+      charset->format = 0;
+      charset->offset = 0;
+      charset->sids   = 0;
+    }
+
+    return error;
+  }
+
+
+  static void
+  cff_encoding_done( CFF_Encoding  encoding )
+  {
+    encoding->format = 0;
+    encoding->offset = 0;
+    encoding->count  = 0;
+  }
+
+
+  static FT_Error
+  cff_encoding_load( CFF_Encoding  encoding,
+                     CFF_Charset   charset,
+                     FT_UInt       num_glyphs,
+                     FT_Stream     stream,
+                     FT_ULong      base_offset,
+                     FT_ULong      offset )
+  {
+    FT_Error   error = CFF_Err_Ok;
+    FT_UInt    count;
+    FT_UInt    j;
+    FT_UShort  glyph_sid;
+    FT_UInt    glyph_code;
+
+
+    /* Check for charset->sids.  If we do not have this, we fail. */
+    if ( !charset->sids )
+    {
+      error = CFF_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    /* Zero out the code to gid/sid mappings. */
+    for ( j = 0; j < 256; j++ )
+    {
+      encoding->sids [j] = 0;
+      encoding->codes[j] = 0;
+    }
+
+    /* Note: The encoding table in a CFF font is indexed by glyph index;  */
+    /* the first encoded glyph index is 1.  Hence, we read the character  */
+    /* code (`glyph_code') at index j and make the assignment:            */
+    /*                                                                    */
+    /*    encoding->codes[glyph_code] = j + 1                             */
+    /*                                                                    */
+    /* We also make the assignment:                                       */
+    /*                                                                    */
+    /*    encoding->sids[glyph_code] = charset->sids[j + 1]               */
+    /*                                                                    */
+    /* This gives us both a code to GID and a code to SID mapping.        */
+
+    if ( offset > 1 )
+    {
+      encoding->offset = base_offset + offset;
+
+      /* we need to parse the table to determine its size */
+      if ( FT_STREAM_SEEK( encoding->offset ) ||
+           FT_READ_BYTE( encoding->format )   ||
+           FT_READ_BYTE( count )              )
+        goto Exit;
+
+      switch ( encoding->format & 0x7F )
+      {
+      case 0:
+        {
+          FT_Byte*  p;
+
+
+          /* By convention, GID 0 is always ".notdef" and is never */
+          /* coded in the font.  Hence, the number of codes found  */
+          /* in the table is `count+1'.                            */
+          /*                                                       */
+          encoding->count = count + 1;
+
+          if ( FT_FRAME_ENTER( count ) )
+            goto Exit;
+
+          p = (FT_Byte*)stream->cursor;
+
+          for ( j = 1; j <= count; j++ )
+          {
+            glyph_code = *p++;
+
+            /* Make sure j is not too big. */
+            if ( j < num_glyphs )
+            {
+              /* Assign code to GID mapping. */
+              encoding->codes[glyph_code] = (FT_UShort)j;
+
+              /* Assign code to SID mapping. */
+              encoding->sids[glyph_code] = charset->sids[j];
+            }
+          }
+
+          FT_FRAME_EXIT();
+        }
+        break;
+
+      case 1:
+        {
+          FT_UInt  nleft;
+          FT_UInt  i = 1;
+          FT_UInt  k;
+
+
+          encoding->count = 0;
+
+          /* Parse the Format1 ranges. */
+          for ( j = 0;  j < count; j++, i += nleft )
+          {
+            /* Read the first glyph code of the range. */
+            if ( FT_READ_BYTE( glyph_code ) )
+              goto Exit;
+
+            /* Read the number of codes in the range. */
+            if ( FT_READ_BYTE( nleft ) )
+              goto Exit;
+
+            /* Increment nleft, so we read `nleft + 1' codes/sids. */
+            nleft++;
+
+            /* compute max number of character codes */
+            if ( (FT_UInt)nleft > encoding->count )
+              encoding->count = nleft;
+
+            /* Fill in the range of codes/sids. */
+            for ( k = i; k < nleft + i; k++, glyph_code++ )
+            {
+              /* Make sure k is not too big. */
+              if ( k < num_glyphs && glyph_code < 256 )
+              {
+                /* Assign code to GID mapping. */
+                encoding->codes[glyph_code] = (FT_UShort)k;
+
+                /* Assign code to SID mapping. */
+                encoding->sids[glyph_code] = charset->sids[k];
+              }
+            }
+          }
+
+          /* simple check; one never knows what can be found in a font */
+          if ( encoding->count > 256 )
+            encoding->count = 256;
+        }
+        break;
+
+      default:
+        FT_ERROR(( "cff_encoding_load: invalid table format\n" ));
+        error = CFF_Err_Invalid_File_Format;
+        goto Exit;
+      }
+
+      /* Parse supplemental encodings, if any. */
+      if ( encoding->format & 0x80 )
+      {
+        FT_UInt  gindex;
+
+
+        /* count supplements */
+        if ( FT_READ_BYTE( count ) )
+          goto Exit;
+
+        for ( j = 0; j < count; j++ )
+        {
+          /* Read supplemental glyph code. */
+          if ( FT_READ_BYTE( glyph_code ) )
+            goto Exit;
+
+          /* Read the SID associated with this glyph code. */
+          if ( FT_READ_USHORT( glyph_sid ) )
+            goto Exit;
+
+          /* Assign code to SID mapping. */
+          encoding->sids[glyph_code] = glyph_sid;
+
+          /* First, look up GID which has been assigned to */
+          /* SID glyph_sid.                                */
+          for ( gindex = 0; gindex < num_glyphs; gindex++ )
+          {
+            if ( charset->sids[gindex] == glyph_sid )
+            {
+              encoding->codes[glyph_code] = (FT_UShort)gindex;
+              break;
+            }
+          }
+        }
+      }
+    }
+    else
+    {
+      /* We take into account the fact a CFF font can use a predefined */
+      /* encoding without containing all of the glyphs encoded by this */
+      /* encoding (see the note at the end of section 12 in the CFF    */
+      /* specification).                                               */
+
+      switch ( (FT_UInt)offset )
+      {
+      case 0:
+        /* First, copy the code to SID mapping. */
+        FT_ARRAY_COPY( encoding->sids, cff_standard_encoding, 256 );
+        goto Populate;
+
+      case 1:
+        /* First, copy the code to SID mapping. */
+        FT_ARRAY_COPY( encoding->sids, cff_expert_encoding, 256 );
+
+      Populate:
+        /* Construct code to GID mapping from code to SID mapping */
+        /* and charset.                                           */
+
+        encoding->count = 0;
+
+        error = cff_charset_compute_cids( charset, num_glyphs,
+                                          stream->memory );
+        if ( error )
+          goto Exit;
+
+        for ( j = 0; j < 256; j++ )
+        {
+          FT_UInt  sid = encoding->sids[j];
+          FT_UInt  gid = 0;
+
+
+          if ( sid )
+            gid = cff_charset_cid_to_gindex( charset, sid );
+
+          if ( gid != 0 )
+          {
+            encoding->codes[j] = (FT_UShort)gid;
+            encoding->count    = j + 1;
+          }
+          else
+          {
+            encoding->codes[j] = 0;
+            encoding->sids [j] = 0;
+          }
+        }
+        break;
+
+      default:
+        FT_ERROR(( "cff_encoding_load: invalid table format\n" ));
+        error = CFF_Err_Invalid_File_Format;
+        goto Exit;
+      }
+    }
+
+  Exit:
+
+    /* Clean up if there was an error. */
+    return error;
+  }
+
+
+  static FT_Error
+  cff_subfont_load( CFF_SubFont  font,
+                    CFF_Index    idx,
+                    FT_UInt      font_index,
+                    FT_Stream    stream,
+                    FT_ULong     base_offset,
+                    FT_Library   library )
+  {
+    FT_Error         error;
+    CFF_ParserRec    parser;
+    FT_Byte*         dict = NULL;
+    FT_ULong         dict_len;
+    CFF_FontRecDict  top  = &font->font_dict;
+    CFF_Private      priv = &font->private_dict;
+
+
+    cff_parser_init( &parser, CFF_CODE_TOPDICT, &font->font_dict, library );
+
+    /* set defaults */
+    FT_MEM_ZERO( top, sizeof ( *top ) );
+
+    top->underline_position  = -100L << 16;
+    top->underline_thickness = 50L << 16;
+    top->charstring_type     = 2;
+    top->font_matrix.xx      = 0x10000L;
+    top->font_matrix.yy      = 0x10000L;
+    top->cid_count           = 8720;
+
+    /* we use the implementation specific SID value 0xFFFF to indicate */
+    /* missing entries                                                 */
+    top->version             = 0xFFFFU;
+    top->notice              = 0xFFFFU;
+    top->copyright           = 0xFFFFU;
+    top->full_name           = 0xFFFFU;
+    top->family_name         = 0xFFFFU;
+    top->weight              = 0xFFFFU;
+    top->embedded_postscript = 0xFFFFU;
+
+    top->cid_registry        = 0xFFFFU;
+    top->cid_ordering        = 0xFFFFU;
+    top->cid_font_name       = 0xFFFFU;
+
+    error = cff_index_access_element( idx, font_index, &dict, &dict_len );
+    if ( !error )
+    {
+      FT_TRACE4(( " top dictionary:\n" ));
+      error = cff_parser_run( &parser, dict, dict + dict_len );
+    }
+
+    cff_index_forget_element( idx, &dict );
+
+    if ( error )
+      goto Exit;
+
+    /* if it is a CID font, we stop there */
+    if ( top->cid_registry != 0xFFFFU )
+      goto Exit;
+
+    /* parse the private dictionary, if any */
+    if ( top->private_offset && top->private_size )
+    {
+      /* set defaults */
+      FT_MEM_ZERO( priv, sizeof ( *priv ) );
+
+      priv->blue_shift       = 7;
+      priv->blue_fuzz        = 1;
+      priv->lenIV            = -1;
+      priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L );
+      priv->blue_scale       = (FT_Fixed)( 0.039625 * 0x10000L * 1000 );
+
+      cff_parser_init( &parser, CFF_CODE_PRIVATE, priv, library );
+
+      if ( FT_STREAM_SEEK( base_offset + font->font_dict.private_offset ) ||
+           FT_FRAME_ENTER( font->font_dict.private_size )                 )
+        goto Exit;
+
+      FT_TRACE4(( " private dictionary:\n" ));
+      error = cff_parser_run( &parser,
+                              (FT_Byte*)stream->cursor,
+                              (FT_Byte*)stream->limit );
+      FT_FRAME_EXIT();
+      if ( error )
+        goto Exit;
+
+      /* ensure that `num_blue_values' is even */
+      priv->num_blue_values &= ~1;
+    }
+
+    /* read the local subrs, if any */
+    if ( priv->local_subrs_offset )
+    {
+      if ( FT_STREAM_SEEK( base_offset + top->private_offset +
+                           priv->local_subrs_offset ) )
+        goto Exit;
+
+      error = cff_index_init( &font->local_subrs_index, stream, 1 );
+      if ( error )
+        goto Exit;
+
+      error = cff_index_get_pointers( &font->local_subrs_index,
+                                      &font->local_subrs, NULL );
+      if ( error )
+        goto Exit;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static void
+  cff_subfont_done( FT_Memory    memory,
+                    CFF_SubFont  subfont )
+  {
+    if ( subfont )
+    {
+      cff_index_done( &subfont->local_subrs_index );
+      FT_FREE( subfont->local_subrs );
+    }
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_font_load( FT_Library library,
+                 FT_Stream  stream,
+                 FT_Int     face_index,
+                 CFF_Font   font,
+                 FT_Bool    pure_cff )
+  {
+    static const FT_Frame_Field  cff_header_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  CFF_FontRec
+
+      FT_FRAME_START( 4 ),
+        FT_FRAME_BYTE( version_major ),
+        FT_FRAME_BYTE( version_minor ),
+        FT_FRAME_BYTE( header_size ),
+        FT_FRAME_BYTE( absolute_offsize ),
+      FT_FRAME_END
+    };
+
+    FT_Error         error;
+    FT_Memory        memory = stream->memory;
+    FT_ULong         base_offset;
+    CFF_FontRecDict  dict;
+    CFF_IndexRec     string_index;
+
+
+    FT_ZERO( font );
+    FT_ZERO( &string_index );
+
+    font->stream = stream;
+    font->memory = memory;
+    dict         = &font->top_font.font_dict;
+    base_offset  = FT_STREAM_POS();
+
+    /* read CFF font header */
+    if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) )
+      goto Exit;
+
+    /* check format */
+    if ( font->version_major   != 1 ||
+         font->header_size      < 4 ||
+         font->absolute_offsize > 4 )
+    {
+      FT_TRACE2(( "  not a CFF font header\n" ));
+      error = CFF_Err_Unknown_File_Format;
+      goto Exit;
+    }
+
+    /* skip the rest of the header */
+    if ( FT_STREAM_SKIP( font->header_size - 4 ) )
+      goto Exit;
+
+    /* read the name, top dict, string and global subrs index */
+    if ( FT_SET_ERROR( cff_index_init( &font->name_index,
+                                       stream, 0 ) )                  ||
+         FT_SET_ERROR( cff_index_init( &font->font_dict_index,
+                                       stream, 0 ) )                  ||
+         FT_SET_ERROR( cff_index_init( &string_index,
+                                       stream, 1 ) )                  ||
+         FT_SET_ERROR( cff_index_init( &font->global_subrs_index,
+                                       stream, 1 ) )                  ||
+         FT_SET_ERROR( cff_index_get_pointers( &string_index,
+                                               &font->strings,
+                                               &font->string_pool ) ) )
+      goto Exit;
+
+    font->num_strings = string_index.count;
+
+    /* well, we don't really forget the `disabled' fonts... */
+    font->num_faces = font->name_index.count;
+    if ( face_index >= (FT_Int)font->num_faces )
+    {
+      FT_ERROR(( "cff_font_load: incorrect face index = %d\n",
+                 face_index ));
+      error = CFF_Err_Invalid_Argument;
+    }
+
+    /* in case of a font format check, simply exit now */
+    if ( face_index < 0 )
+      goto Exit;
+
+    /* now, parse the top-level font dictionary */
+    FT_TRACE4(( "parsing top-level\n" ));
+    error = cff_subfont_load( &font->top_font,
+                              &font->font_dict_index,
+                              face_index,
+                              stream,
+                              base_offset,
+                              library );
+    if ( error )
+      goto Exit;
+
+    if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) )
+      goto Exit;
+
+    error = cff_index_init( &font->charstrings_index, stream, 0 );
+    if ( error )
+      goto Exit;
+
+    /* now, check for a CID font */
+    if ( dict->cid_registry != 0xFFFFU )
+    {
+      CFF_IndexRec  fd_index;
+      CFF_SubFont   sub = NULL;
+      FT_UInt       idx;
+
+
+      /* this is a CID-keyed font, we must now allocate a table of */
+      /* sub-fonts, then load each of them separately              */
+      if ( FT_STREAM_SEEK( base_offset + dict->cid_fd_array_offset ) )
+        goto Exit;
+
+      error = cff_index_init( &fd_index, stream, 0 );
+      if ( error )
+        goto Exit;
+
+      if ( fd_index.count > CFF_MAX_CID_FONTS )
+      {
+        FT_TRACE0(( "cff_font_load: FD array too large in CID font\n" ));
+        goto Fail_CID;
+      }
+
+      /* allocate & read each font dict independently */
+      font->num_subfonts = fd_index.count;
+      if ( FT_NEW_ARRAY( sub, fd_index.count ) )
+        goto Fail_CID;
+
+      /* set up pointer table */
+      for ( idx = 0; idx < fd_index.count; idx++ )
+        font->subfonts[idx] = sub + idx;
+
+      /* now load each subfont independently */
+      for ( idx = 0; idx < fd_index.count; idx++ )
+      {
+        sub = font->subfonts[idx];
+        FT_TRACE4(( "parsing subfont %u\n", idx ));
+        error = cff_subfont_load( sub, &fd_index, idx,
+                                  stream, base_offset, library );
+        if ( error )
+          goto Fail_CID;
+      }
+
+      /* now load the FD Select array */
+      error = CFF_Load_FD_Select( &font->fd_select,
+                                  font->charstrings_index.count,
+                                  stream,
+                                  base_offset + dict->cid_fd_select_offset );
+
+    Fail_CID:
+      cff_index_done( &fd_index );
+
+      if ( error )
+        goto Exit;
+    }
+    else
+      font->num_subfonts = 0;
+
+    /* read the charstrings index now */
+    if ( dict->charstrings_offset == 0 )
+    {
+      FT_ERROR(( "cff_font_load: no charstrings offset\n" ));
+      error = CFF_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    font->num_glyphs = font->charstrings_index.count;
+
+    error = cff_index_get_pointers( &font->global_subrs_index,
+                                    &font->global_subrs, NULL );
+
+    if ( error )
+      goto Exit;
+
+    /* read the Charset and Encoding tables if available */
+    if ( font->num_glyphs > 0 )
+    {
+      FT_Bool  invert = FT_BOOL( dict->cid_registry != 0xFFFFU && pure_cff );
+
+
+      error = cff_charset_load( &font->charset, font->num_glyphs, stream,
+                                base_offset, dict->charset_offset, invert );
+      if ( error )
+        goto Exit;
+
+      /* CID-keyed CFFs don't have an encoding */
+      if ( dict->cid_registry == 0xFFFFU )
+      {
+        error = cff_encoding_load( &font->encoding,
+                                   &font->charset,
+                                   font->num_glyphs,
+                                   stream,
+                                   base_offset,
+                                   dict->encoding_offset );
+        if ( error )
+          goto Exit;
+      }
+    }
+
+    /* get the font name (/CIDFontName for CID-keyed fonts, */
+    /* /FontName otherwise)                                 */
+    font->font_name = cff_index_get_name( font, face_index );
+
+  Exit:
+    cff_index_done( &string_index );
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cff_font_done( CFF_Font  font )
+  {
+    FT_Memory  memory = font->memory;
+    FT_UInt    idx;
+
+
+    cff_index_done( &font->global_subrs_index );
+    cff_index_done( &font->font_dict_index );
+    cff_index_done( &font->name_index );
+    cff_index_done( &font->charstrings_index );
+
+    /* release font dictionaries, but only if working with */
+    /* a CID keyed CFF font                                */
+    if ( font->num_subfonts > 0 )
+    {
+      for ( idx = 0; idx < font->num_subfonts; idx++ )
+        cff_subfont_done( memory, font->subfonts[idx] );
+
+      /* the subfonts array has been allocated as a single block */
+      FT_FREE( font->subfonts[0] );
+    }
+
+    cff_encoding_done( &font->encoding );
+    cff_charset_done( &font->charset, font->stream );
+
+    cff_subfont_done( memory, &font->top_font );
+
+    CFF_Done_FD_Select( &font->fd_select, font->stream );
+
+    FT_FREE( font->font_info );
+
+    FT_FREE( font->font_name );
+    FT_FREE( font->global_subrs );
+    FT_FREE( font->strings );
+    FT_FREE( font->string_pool );
+  }
+
+
+/* END */
diff --git a/src/cff/cffload.h b/src/cff/cffload.h
new file mode 100644 (file)
index 0000000..8049619
--- /dev/null
@@ -0,0 +1,83 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffload.h                                                              */
+/*                                                                         */
+/*    OpenType & CFF data/program tables loader (specification).           */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2007, 2008, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CFFLOAD_H__
+#define __CFFLOAD_H__
+
+
+#include <ft2build.h>
+#include "cfftypes.h"
+
+
+FT_BEGIN_HEADER
+
+  FT_LOCAL( FT_UShort )
+  cff_get_standard_encoding( FT_UInt  charcode );
+
+
+  FT_LOCAL( FT_String* )
+  cff_index_get_string( CFF_Font  font,
+                        FT_UInt   element );
+
+  FT_LOCAL( FT_String* )
+  cff_index_get_sid_string( CFF_Font  font,
+                            FT_UInt   sid );
+
+
+  FT_LOCAL( FT_Error )
+  cff_index_access_element( CFF_Index  idx,
+                            FT_UInt    element,
+                            FT_Byte**  pbytes,
+                            FT_ULong*  pbyte_len );
+
+  FT_LOCAL( void )
+  cff_index_forget_element( CFF_Index  idx,
+                            FT_Byte**  pbytes );
+
+  FT_LOCAL( FT_String* )
+  cff_index_get_name( CFF_Font  font,
+                      FT_UInt   element );
+
+
+  FT_LOCAL( FT_UInt )
+  cff_charset_cid_to_gindex( CFF_Charset  charset,
+                             FT_UInt      cid );
+
+
+  FT_LOCAL( FT_Error )
+  cff_font_load( FT_Library library,
+                 FT_Stream  stream,
+                 FT_Int     face_index,
+                 CFF_Font   font,
+                 FT_Bool    pure_cff );
+
+  FT_LOCAL( void )
+  cff_font_done( CFF_Font  font );
+
+
+  FT_LOCAL( FT_Byte )
+  cff_fd_select_get( CFF_FDSelect  fdselect,
+                     FT_UInt       glyph_index );
+
+
+FT_END_HEADER
+
+#endif /* __CFFLOAD_H__ */
+
+
+/* END */
diff --git a/src/cff/cffobjs.c b/src/cff/cffobjs.c
new file mode 100644 (file)
index 0000000..6ad0e50
--- /dev/null
@@ -0,0 +1,1074 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffobjs.c                                                              */
+/*                                                                         */
+/*    OpenType objects manager (body).                                     */
+/*                                                                         */
+/*  Copyright 1996-2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_CALC_H
+#include FT_INTERNAL_STREAM_H
+#include FT_ERRORS_H
+#include FT_TRUETYPE_IDS_H
+#include FT_TRUETYPE_TAGS_H
+#include FT_INTERNAL_SFNT_H
+#include "cffobjs.h"
+#include "cffload.h"
+#include "cffcmap.h"
+#include "cfferrs.h"
+#include "cffpic.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cffobjs
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                            SIZE FUNCTIONS                             */
+  /*                                                                       */
+  /*  Note that we store the global hints in the size's `internal' root    */
+  /*  field.                                                               */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static PSH_Globals_Funcs
+  cff_size_get_globals_funcs( CFF_Size  size )
+  {
+    CFF_Face          face     = (CFF_Face)size->root.face;
+    CFF_Font          font     = (CFF_Font)face->extra.data;
+    PSHinter_Service  pshinter = font->pshinter;
+    FT_Module         module;
+
+
+    module = FT_Get_Module( size->root.face->driver->root.library,
+                            "pshinter" );
+    return ( module && pshinter && pshinter->get_globals_funcs )
+           ? pshinter->get_globals_funcs( module )
+           : 0;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cff_size_done( FT_Size  cffsize )        /* CFF_Size */
+  {
+    CFF_Size      size     = (CFF_Size)cffsize;
+    CFF_Face      face     = (CFF_Face)size->root.face;
+    CFF_Font      font     = (CFF_Font)face->extra.data;
+    CFF_Internal  internal = (CFF_Internal)cffsize->internal;
+
+
+    if ( internal )
+    {
+      PSH_Globals_Funcs  funcs;
+
+
+      funcs = cff_size_get_globals_funcs( size );
+      if ( funcs )
+      {
+        FT_UInt  i;
+
+
+        funcs->destroy( internal->topfont );
+
+        for ( i = font->num_subfonts; i > 0; i-- )
+          funcs->destroy( internal->subfonts[i - 1] );
+      }
+
+      /* `internal' is freed by destroy_size (in ftobjs.c) */
+    }
+  }
+
+
+  /* CFF and Type 1 private dictionaries have slightly different      */
+  /* structures; we need to synthesize a Type 1 dictionary on the fly */
+
+  static void
+  cff_make_private_dict( CFF_SubFont  subfont,
+                         PS_Private   priv )
+  {
+    CFF_Private  cpriv = &subfont->private_dict;
+    FT_UInt      n, count;
+
+
+    FT_MEM_ZERO( priv, sizeof ( *priv ) );
+
+    count = priv->num_blue_values = cpriv->num_blue_values;
+    for ( n = 0; n < count; n++ )
+      priv->blue_values[n] = (FT_Short)cpriv->blue_values[n];
+
+    count = priv->num_other_blues = cpriv->num_other_blues;
+    for ( n = 0; n < count; n++ )
+      priv->other_blues[n] = (FT_Short)cpriv->other_blues[n];
+
+    count = priv->num_family_blues = cpriv->num_family_blues;
+    for ( n = 0; n < count; n++ )
+      priv->family_blues[n] = (FT_Short)cpriv->family_blues[n];
+
+    count = priv->num_family_other_blues = cpriv->num_family_other_blues;
+    for ( n = 0; n < count; n++ )
+      priv->family_other_blues[n] = (FT_Short)cpriv->family_other_blues[n];
+
+    priv->blue_scale = cpriv->blue_scale;
+    priv->blue_shift = (FT_Int)cpriv->blue_shift;
+    priv->blue_fuzz  = (FT_Int)cpriv->blue_fuzz;
+
+    priv->standard_width[0]  = (FT_UShort)cpriv->standard_width;
+    priv->standard_height[0] = (FT_UShort)cpriv->standard_height;
+
+    count = priv->num_snap_widths = cpriv->num_snap_widths;
+    for ( n = 0; n < count; n++ )
+      priv->snap_widths[n] = (FT_Short)cpriv->snap_widths[n];
+
+    count = priv->num_snap_heights = cpriv->num_snap_heights;
+    for ( n = 0; n < count; n++ )
+      priv->snap_heights[n] = (FT_Short)cpriv->snap_heights[n];
+
+    priv->force_bold     = cpriv->force_bold;
+    priv->language_group = cpriv->language_group;
+    priv->lenIV          = cpriv->lenIV;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_size_init( FT_Size  cffsize )         /* CFF_Size */
+  {
+    CFF_Size           size  = (CFF_Size)cffsize;
+    FT_Error           error = CFF_Err_Ok;
+    PSH_Globals_Funcs  funcs = cff_size_get_globals_funcs( size );
+
+
+    if ( funcs )
+    {
+      CFF_Face      face     = (CFF_Face)cffsize->face;
+      CFF_Font      font     = (CFF_Font)face->extra.data;
+      CFF_Internal  internal = NULL;
+
+      PS_PrivateRec  priv;
+      FT_Memory      memory = cffsize->face->memory;
+
+      FT_UInt  i;
+
+
+      if ( FT_NEW( internal ) )
+        goto Exit;
+
+      cff_make_private_dict( &font->top_font, &priv );
+      error = funcs->create( cffsize->face->memory, &priv,
+                             &internal->topfont );
+      if ( error )
+        goto Exit;
+
+      for ( i = font->num_subfonts; i > 0; i-- )
+      {
+        CFF_SubFont  sub = font->subfonts[i - 1];
+
+
+        cff_make_private_dict( sub, &priv );
+        error = funcs->create( cffsize->face->memory, &priv,
+                               &internal->subfonts[i - 1] );
+        if ( error )
+          goto Exit;
+      }
+
+      cffsize->internal = (FT_Size_Internal)(void*)internal;
+    }
+
+    size->strike_index = 0xFFFFFFFFUL;
+
+  Exit:
+    return error;
+  }
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_size_select( FT_Size   size,
+                   FT_ULong  strike_index )
+  {
+    CFF_Size           cffsize = (CFF_Size)size;
+    PSH_Globals_Funcs  funcs;
+
+
+    cffsize->strike_index = strike_index;
+
+    FT_Select_Metrics( size->face, strike_index );
+
+    funcs = cff_size_get_globals_funcs( cffsize );
+
+    if ( funcs )
+    {
+      CFF_Face      face     = (CFF_Face)size->face;
+      CFF_Font      font     = (CFF_Font)face->extra.data;
+      CFF_Internal  internal = (CFF_Internal)size->internal;
+
+      FT_ULong  top_upm  = font->top_font.font_dict.units_per_em;
+      FT_UInt   i;
+
+
+      funcs->set_scale( internal->topfont,
+                        size->metrics.x_scale, size->metrics.y_scale,
+                        0, 0 );
+
+      for ( i = font->num_subfonts; i > 0; i-- )
+      {
+        CFF_SubFont  sub     = font->subfonts[i - 1];
+        FT_ULong     sub_upm = sub->font_dict.units_per_em;
+        FT_Pos       x_scale, y_scale;
+
+
+        if ( top_upm != sub_upm )
+        {
+          x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm );
+          y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm );
+        }
+        else
+        {
+          x_scale = size->metrics.x_scale;
+          y_scale = size->metrics.y_scale;
+        }
+
+        funcs->set_scale( internal->subfonts[i - 1],
+                          x_scale, y_scale, 0, 0 );
+      }
+    }
+
+    return CFF_Err_Ok;
+  }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_size_request( FT_Size          size,
+                    FT_Size_Request  req )
+  {
+    CFF_Size           cffsize = (CFF_Size)size;
+    PSH_Globals_Funcs  funcs;
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+    if ( FT_HAS_FIXED_SIZES( size->face ) )
+    {
+      CFF_Face      cffface = (CFF_Face)size->face;
+      SFNT_Service  sfnt    = (SFNT_Service)cffface->sfnt;
+      FT_ULong      strike_index;
+
+
+      if ( sfnt->set_sbit_strike( cffface, req, &strike_index ) )
+        cffsize->strike_index = 0xFFFFFFFFUL;
+      else
+        return cff_size_select( size, strike_index );
+    }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+    FT_Request_Metrics( size->face, req );
+
+    funcs = cff_size_get_globals_funcs( cffsize );
+
+    if ( funcs )
+    {
+      CFF_Face      cffface  = (CFF_Face)size->face;
+      CFF_Font      font     = (CFF_Font)cffface->extra.data;
+      CFF_Internal  internal = (CFF_Internal)size->internal;
+
+      FT_ULong  top_upm  = font->top_font.font_dict.units_per_em;
+      FT_UInt   i;
+
+
+      funcs->set_scale( internal->topfont,
+                        size->metrics.x_scale, size->metrics.y_scale,
+                        0, 0 );
+
+      for ( i = font->num_subfonts; i > 0; i-- )
+      {
+        CFF_SubFont  sub     = font->subfonts[i - 1];
+        FT_ULong     sub_upm = sub->font_dict.units_per_em;
+        FT_Pos       x_scale, y_scale;
+
+
+        if ( top_upm != sub_upm )
+        {
+          x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm );
+          y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm );
+        }
+        else
+        {
+          x_scale = size->metrics.x_scale;
+          y_scale = size->metrics.y_scale;
+        }
+
+        funcs->set_scale( internal->subfonts[i - 1],
+                          x_scale, y_scale, 0, 0 );
+      }
+    }
+
+    return CFF_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                            SLOT  FUNCTIONS                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  cff_slot_done( FT_GlyphSlot  slot )
+  {
+    slot->internal->glyph_hints = 0;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_slot_init( FT_GlyphSlot  slot )
+  {
+    CFF_Face          face     = (CFF_Face)slot->face;
+    CFF_Font          font     = (CFF_Font)face->extra.data;
+    PSHinter_Service  pshinter = font->pshinter;
+
+
+    if ( pshinter )
+    {
+      FT_Module  module;
+
+
+      module = FT_Get_Module( slot->face->driver->root.library,
+                              "pshinter" );
+      if ( module )
+      {
+        T2_Hints_Funcs  funcs;
+
+
+        funcs = pshinter->get_t2_funcs( module );
+        slot->internal->glyph_hints = (void*)funcs;
+      }
+    }
+
+    return CFF_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                           FACE  FUNCTIONS                             */
+  /*                                                                       */
+  /*************************************************************************/
+
+  static FT_String*
+  cff_strcpy( FT_Memory         memory,
+              const FT_String*  source )
+  {
+    FT_Error    error;
+    FT_String*  result;
+
+
+    (void)FT_STRDUP( result, source );
+
+    FT_UNUSED( error );
+
+    return result;
+  }
+
+
+  /* Strip all subset prefixes of the form `ABCDEF+'.  Usually, there */
+  /* is only one, but font names like `APCOOG+JFABTD+FuturaBQ-Bold'   */
+  /* have been seen in the wild.                                      */
+
+  static void
+  remove_subset_prefix( FT_String*  name )
+  {
+    FT_Int32  idx             = 0;
+    FT_Int32  length          = strlen( name ) + 1;
+    FT_Bool   continue_search = 1;
+
+
+    while ( continue_search )
+    {
+      if ( length >= 7 && name[6] == '+' )
+      {
+        for ( idx = 0; idx < 6; idx++ )
+        {
+          /* ASCII uppercase letters */
+          if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) )
+            continue_search = 0;
+        }
+
+        if ( continue_search )
+        {
+          for ( idx = 7; idx < length; idx++ )
+            name[idx - 7] = name[idx];
+          length -= 7;
+        }
+      }
+      else
+        continue_search = 0;
+    }
+  }
+
+
+  /* Remove the style part from the family name (if present). */
+
+  static void
+  remove_style( FT_String*        family_name,
+                const FT_String*  style_name )
+  {
+    FT_Int32  family_name_length, style_name_length;
+
+
+    family_name_length = strlen( family_name );
+    style_name_length  = strlen( style_name );
+
+    if ( family_name_length > style_name_length )
+    {
+      FT_Int  idx;
+
+
+      for ( idx = 1; idx <= style_name_length; ++idx )
+      {
+        if ( family_name[family_name_length - idx] !=
+             style_name[style_name_length - idx] )
+          break;
+      }
+
+      if ( idx > style_name_length )
+      {
+        /* family_name ends with style_name; remove it */
+        idx = family_name_length - style_name_length - 1;
+
+        /* also remove special characters     */
+        /* between real family name and style */
+        while ( idx > 0                     &&
+                ( family_name[idx] == '-' ||
+                  family_name[idx] == ' ' ||
+                  family_name[idx] == '_' ||
+                  family_name[idx] == '+' ) )
+          --idx;
+
+        if ( idx > 0 )
+          family_name[idx + 1] = '\0';
+      }
+    }
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_face_init( FT_Stream      stream,
+                 FT_Face        cffface,        /* CFF_Face */
+                 FT_Int         face_index,
+                 FT_Int         num_params,
+                 FT_Parameter*  params )
+  {
+    CFF_Face            face        = (CFF_Face)cffface;
+    FT_Error            error;
+    SFNT_Service        sfnt;
+    FT_Service_PsCMaps  psnames;
+    PSHinter_Service    pshinter;
+    FT_Bool             pure_cff    = 1;
+    FT_Bool             sfnt_format = 0;
+    FT_Library          library     = cffface->driver->root.library;
+
+
+    sfnt = (SFNT_Service)FT_Get_Module_Interface(
+             library, "sfnt" );
+    if ( !sfnt )
+    {
+      FT_ERROR(( "cff_face_init: cannot access `sfnt' module\n" ));
+      error = CFF_Err_Missing_Module;
+      goto Exit;
+    }
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
+
+    pshinter = (PSHinter_Service)FT_Get_Module_Interface(
+                 library, "pshinter" );
+
+    FT_TRACE2(( "CFF driver\n" ));
+
+    /* create input stream from resource */
+    if ( FT_STREAM_SEEK( 0 ) )
+      goto Exit;
+
+    /* check whether we have a valid OpenType file */
+    error = sfnt->init_face( stream, face, face_index, num_params, params );
+    if ( !error )
+    {
+      if ( face->format_tag != TTAG_OTTO )  /* `OTTO'; OpenType/CFF font */
+      {
+        FT_TRACE2(( "  not an OpenType/CFF font\n" ));
+        error = CFF_Err_Unknown_File_Format;
+        goto Exit;
+      }
+
+      /* if we are performing a simple font format check, exit immediately */
+      if ( face_index < 0 )
+        return CFF_Err_Ok;
+
+      /* UNDOCUMENTED!  A CFF in an SFNT can have only a single font. */
+      if ( face_index > 0 )
+      {
+        FT_ERROR(( "cff_face_init: invalid face index\n" ));
+        error = CFF_Err_Invalid_Argument;
+        goto Exit;
+      }
+
+      sfnt_format = 1;
+
+      /* now, the font can be either an OpenType/CFF font, or an SVG CEF */
+      /* font; in the latter case it doesn't have a `head' table         */
+      error = face->goto_table( face, TTAG_head, stream, 0 );
+      if ( !error )
+      {
+        pure_cff = 0;
+
+        /* load font directory */
+        error = sfnt->load_face( stream, face, 0, num_params, params );
+        if ( error )
+          goto Exit;
+      }
+      else
+      {
+        /* load the `cmap' table explicitly */
+        error = sfnt->load_cmap( face, stream );
+        if ( error )
+          goto Exit;
+
+        /* XXX: we don't load the GPOS table, as OpenType Layout     */
+        /* support will be added later to a layout library on top of */
+        /* FreeType 2                                                */
+      }
+
+      /* now load the CFF part of the file */
+      error = face->goto_table( face, TTAG_CFF, stream, 0 );
+      if ( error )
+        goto Exit;
+    }
+    else
+    {
+      /* rewind to start of file; we are going to load a pure-CFF font */
+      if ( FT_STREAM_SEEK( 0 ) )
+        goto Exit;
+      error = CFF_Err_Ok;
+    }
+
+    /* now load and parse the CFF table in the file */
+    {
+      CFF_Font         cff = NULL;
+      CFF_FontRecDict  dict;
+      FT_Memory        memory = cffface->memory;
+      FT_Int32         flags;
+      FT_UInt          i;
+
+
+      if ( FT_NEW( cff ) )
+        goto Exit;
+
+      face->extra.data = cff;
+      error = cff_font_load( library, stream, face_index, cff, pure_cff );
+      if ( error )
+        goto Exit;
+
+      cff->pshinter = pshinter;
+      cff->psnames  = psnames;
+
+      cffface->face_index = face_index;
+
+      /* Complement the root flags with some interesting information. */
+      /* Note that this is only necessary for pure CFF and CEF fonts; */
+      /* SFNT based fonts use the `name' table instead.               */
+
+      cffface->num_glyphs = cff->num_glyphs;
+
+      dict = &cff->top_font.font_dict;
+
+      /* we need the `PSNames' module for CFF and CEF formats */
+      /* which aren't CID-keyed                               */
+      if ( dict->cid_registry == 0xFFFFU && !psnames )
+      {
+        FT_ERROR(( "cff_face_init:"
+                   " cannot open CFF & CEF fonts\n"
+                   "              "
+                   " without the `PSNames' module\n" ));
+        error = CFF_Err_Missing_Module;
+        goto Exit;
+      }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+      {
+        FT_UInt     idx;
+        FT_String*  s;
+
+
+        FT_TRACE4(( "SIDs\n" ));
+
+        /* dump string index, including default strings for convenience */
+        for ( idx = 0; idx < cff->num_strings + 390; idx++ )
+        {
+          s = cff_index_get_sid_string( cff, idx );
+          if ( s )
+            FT_TRACE4(("  %5d %s\n", idx, s ));
+        }
+      }
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+      if ( !dict->has_font_matrix )
+        dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM;
+
+      /* Normalize the font matrix so that `matrix->xx' is 1; the */
+      /* scaling is done with `units_per_em' then (at this point, */
+      /* it already contains the scaling factor, but without      */
+      /* normalization of the matrix).                            */
+      /*                                                          */
+      /* Note that the offsets must be expressed in integer font  */
+      /* units.                                                   */
+
+      {
+        FT_Matrix*  matrix = &dict->font_matrix;
+        FT_Vector*  offset = &dict->font_offset;
+        FT_ULong*   upm    = &dict->units_per_em;
+        FT_Fixed    temp   = FT_ABS( matrix->yy );
+
+
+        if ( temp != 0x10000L )
+        {
+          *upm = FT_DivFix( *upm, temp );
+
+          matrix->xx = FT_DivFix( matrix->xx, temp );
+          matrix->yx = FT_DivFix( matrix->yx, temp );
+          matrix->xy = FT_DivFix( matrix->xy, temp );
+          matrix->yy = FT_DivFix( matrix->yy, temp );
+          offset->x  = FT_DivFix( offset->x,  temp );
+          offset->y  = FT_DivFix( offset->y,  temp );
+        }
+
+        offset->x >>= 16;
+        offset->y >>= 16;
+      }
+
+      for ( i = cff->num_subfonts; i > 0; i-- )
+      {
+        CFF_FontRecDict  sub = &cff->subfonts[i - 1]->font_dict;
+        CFF_FontRecDict  top = &cff->top_font.font_dict;
+
+        FT_Matrix*  matrix;
+        FT_Vector*  offset;
+        FT_ULong*   upm;
+        FT_Fixed    temp;
+
+
+        if ( sub->has_font_matrix )
+        {
+          FT_Long  scaling;
+
+
+          /* if we have a top-level matrix, */
+          /* concatenate the subfont matrix */
+
+          if ( top->has_font_matrix )
+          {
+            if ( top->units_per_em > 1 && sub->units_per_em > 1 )
+              scaling = FT_MIN( top->units_per_em, sub->units_per_em );
+            else
+              scaling = 1;
+
+            FT_Matrix_Multiply_Scaled( &top->font_matrix,
+                                       &sub->font_matrix,
+                                       scaling );
+            FT_Vector_Transform_Scaled( &sub->font_offset,
+                                        &top->font_matrix,
+                                        scaling );
+
+            sub->units_per_em = FT_MulDiv( sub->units_per_em,
+                                           top->units_per_em,
+                                           scaling );
+          }
+        }
+        else
+        {
+          sub->font_matrix = top->font_matrix;
+          sub->font_offset = top->font_offset;
+
+          sub->units_per_em = top->units_per_em;
+        }
+
+        matrix = &sub->font_matrix;
+        offset = &sub->font_offset;
+        upm    = &sub->units_per_em;
+        temp   = FT_ABS( matrix->yy );
+
+        if ( temp != 0x10000L )
+        {
+          *upm = FT_DivFix( *upm, temp );
+
+          matrix->xx = FT_DivFix( matrix->xx, temp );
+          matrix->yx = FT_DivFix( matrix->yx, temp );
+          matrix->xy = FT_DivFix( matrix->xy, temp );
+          matrix->yy = FT_DivFix( matrix->yy, temp );
+          offset->x  = FT_DivFix( offset->x,  temp );
+          offset->y  = FT_DivFix( offset->y,  temp );
+        }
+
+        offset->x >>= 16;
+        offset->y >>= 16;
+      }
+
+      if ( pure_cff )
+      {
+        char*  style_name = NULL;
+
+
+        /* set up num_faces */
+        cffface->num_faces = cff->num_faces;
+
+        /* compute number of glyphs */
+        if ( dict->cid_registry != 0xFFFFU )
+          cffface->num_glyphs = cff->charset.max_cid + 1;
+        else
+          cffface->num_glyphs = cff->charstrings_index.count;
+
+        /* set global bbox, as well as EM size */
+        cffface->bbox.xMin =   dict->font_bbox.xMin            >> 16;
+        cffface->bbox.yMin =   dict->font_bbox.yMin            >> 16;
+        /* no `U' suffix here to 0xFFFF! */
+        cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFF ) >> 16;
+        cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFF ) >> 16;
+
+        cffface->units_per_EM = (FT_UShort)( dict->units_per_em );
+
+        cffface->ascender  = (FT_Short)( cffface->bbox.yMax );
+        cffface->descender = (FT_Short)( cffface->bbox.yMin );
+
+        cffface->height = (FT_Short)( ( cffface->units_per_EM * 12 ) / 10 );
+        if ( cffface->height < cffface->ascender - cffface->descender )
+          cffface->height = (FT_Short)( cffface->ascender - cffface->descender );
+
+        cffface->underline_position  =
+          (FT_Short)( dict->underline_position >> 16 );
+        cffface->underline_thickness =
+          (FT_Short)( dict->underline_thickness >> 16 );
+
+        /* retrieve font family & style name */
+        cffface->family_name = cff_index_get_name( cff, face_index );
+        if ( cffface->family_name )
+        {
+          char*  full   = cff_index_get_sid_string( cff,
+                                                    dict->full_name );
+          char*  fullp  = full;
+          char*  family = cffface->family_name;
+          char*  family_name = NULL;
+
+
+          remove_subset_prefix( cffface->family_name );
+
+          if ( dict->family_name )
+          {
+            family_name = cff_index_get_sid_string( cff,
+                                                    dict->family_name );
+            if ( family_name )
+              family = family_name;
+          }
+
+          /* We try to extract the style name from the full name.   */
+          /* We need to ignore spaces and dashes during the search. */
+          if ( full && family )
+          {
+            while ( *fullp )
+            {
+              /* skip common characters at the start of both strings */
+              if ( *fullp == *family )
+              {
+                family++;
+                fullp++;
+                continue;
+              }
+
+              /* ignore spaces and dashes in full name during comparison */
+              if ( *fullp == ' ' || *fullp == '-' )
+              {
+                fullp++;
+                continue;
+              }
+
+              /* ignore spaces and dashes in family name during comparison */
+              if ( *family == ' ' || *family == '-' )
+              {
+                family++;
+                continue;
+              }
+
+              if ( !*family && *fullp )
+              {
+                /* The full name begins with the same characters as the  */
+                /* family name, with spaces and dashes removed.  In this */
+                /* case, the remaining string in `fullp' will be used as */
+                /* the style name.                                       */
+                style_name = cff_strcpy( memory, fullp );
+
+                /* remove the style part from the family name (if present) */
+                remove_style( cffface->family_name, style_name );
+              }
+              break;
+            }
+          }
+        }
+        else
+        {
+          char  *cid_font_name =
+                   cff_index_get_sid_string( cff,
+                                             dict->cid_font_name );
+
+
+          /* do we have a `/FontName' for a CID-keyed font? */
+          if ( cid_font_name )
+            cffface->family_name = cff_strcpy( memory, cid_font_name );
+        }
+
+        if ( style_name )
+          cffface->style_name = style_name;
+        else
+          /* assume "Regular" style if we don't know better */
+          cffface->style_name = cff_strcpy( memory, (char *)"Regular" );
+
+        /*******************************************************************/
+        /*                                                                 */
+        /* Compute face flags.                                             */
+        /*                                                                 */
+        flags = FT_FACE_FLAG_SCALABLE   | /* scalable outlines */
+                FT_FACE_FLAG_HORIZONTAL | /* horizontal data   */
+                FT_FACE_FLAG_HINTER;      /* has native hinter */
+
+        if ( sfnt_format )
+          flags |= FT_FACE_FLAG_SFNT;
+
+        /* fixed width font? */
+        if ( dict->is_fixed_pitch )
+          flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+  /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */
+#if 0
+        /* kerning available? */
+        if ( face->kern_pairs )
+          flags |= FT_FACE_FLAG_KERNING;
+#endif
+
+        cffface->face_flags = flags;
+
+        /*******************************************************************/
+        /*                                                                 */
+        /* Compute style flags.                                            */
+        /*                                                                 */
+        flags = 0;
+
+        if ( dict->italic_angle )
+          flags |= FT_STYLE_FLAG_ITALIC;
+
+        {
+          char  *weight = cff_index_get_sid_string( cff,
+                                                    dict->weight );
+
+
+          if ( weight )
+            if ( !ft_strcmp( weight, "Bold"  ) ||
+                 !ft_strcmp( weight, "Black" ) )
+              flags |= FT_STYLE_FLAG_BOLD;
+        }
+
+        /* double check */
+        if ( !(flags & FT_STYLE_FLAG_BOLD) && cffface->style_name )
+          if ( !ft_strncmp( cffface->style_name, "Bold", 4 )  ||
+               !ft_strncmp( cffface->style_name, "Black", 5 ) )
+            flags |= FT_STYLE_FLAG_BOLD;
+
+        cffface->style_flags = flags;
+      }
+
+
+#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES
+      /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */
+      /* has unset this flag because of the 3.0 `post' table.          */
+      if ( dict->cid_registry == 0xFFFFU )
+        cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;
+#endif
+
+      if ( dict->cid_registry != 0xFFFFU && pure_cff )
+        cffface->face_flags |= FT_FACE_FLAG_CID_KEYED;
+
+
+      /*******************************************************************/
+      /*                                                                 */
+      /* Compute char maps.                                              */
+      /*                                                                 */
+
+      /* Try to synthesize a Unicode charmap if there is none available */
+      /* already.  If an OpenType font contains a Unicode "cmap", we    */
+      /* will use it, whatever be in the CFF part of the file.          */
+      {
+        FT_CharMapRec  cmaprec;
+        FT_CharMap     cmap;
+        FT_UInt        nn;
+        CFF_Encoding   encoding = &cff->encoding;
+
+
+        for ( nn = 0; nn < (FT_UInt)cffface->num_charmaps; nn++ )
+        {
+          cmap = cffface->charmaps[nn];
+
+          /* Windows Unicode? */
+          if ( cmap->platform_id == TT_PLATFORM_MICROSOFT &&
+               cmap->encoding_id == TT_MS_ID_UNICODE_CS   )
+            goto Skip_Unicode;
+
+          /* Apple Unicode platform id? */
+          if ( cmap->platform_id == TT_PLATFORM_APPLE_UNICODE )
+            goto Skip_Unicode; /* Apple Unicode */
+        }
+
+        /* since CID-keyed fonts don't contain glyph names, we can't */
+        /* construct a cmap                                          */
+        if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU )
+          goto Exit;
+
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+        if ( nn + 1 > FT_MAX_CHARMAP_CACHEABLE )
+        {
+          FT_ERROR(( "cff_face_init: no Unicode cmap is found, "
+                     "and too many subtables (%d) to add synthesized cmap\n",
+                     nn ));
+          goto Exit;
+        }
+#endif
+
+        /* we didn't find a Unicode charmap -- synthesize one */
+        cmaprec.face        = cffface;
+        cmaprec.platform_id = TT_PLATFORM_MICROSOFT;
+        cmaprec.encoding_id = TT_MS_ID_UNICODE_CS;
+        cmaprec.encoding    = FT_ENCODING_UNICODE;
+
+        nn = (FT_UInt)cffface->num_charmaps;
+
+        error = FT_CMap_New( &FT_CFF_CMAP_UNICODE_CLASS_REC_GET, NULL,
+                             &cmaprec, NULL );
+        if ( error && FT_Err_No_Unicode_Glyph_Name != error )
+          goto Exit;
+        error = FT_Err_Ok;
+
+        /* if no Unicode charmap was previously selected, select this one */
+        if ( cffface->charmap == NULL && nn != (FT_UInt)cffface->num_charmaps )
+          cffface->charmap = cffface->charmaps[nn];
+
+      Skip_Unicode:
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+        if ( nn > FT_MAX_CHARMAP_CACHEABLE )
+        {
+          FT_ERROR(( "cff_face_init: Unicode cmap is found, "
+                     "but too many preceding subtables (%d) to access\n",
+                     nn - 1 ));
+          goto Exit;
+        }
+#endif
+        if ( encoding->count > 0 )
+        {
+          FT_CMap_Class  clazz;
+
+
+          cmaprec.face        = cffface;
+          cmaprec.platform_id = TT_PLATFORM_ADOBE;  /* Adobe platform id */
+
+          if ( encoding->offset == 0 )
+          {
+            cmaprec.encoding_id = TT_ADOBE_ID_STANDARD;
+            cmaprec.encoding    = FT_ENCODING_ADOBE_STANDARD;
+            clazz               = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET;
+          }
+          else if ( encoding->offset == 1 )
+          {
+            cmaprec.encoding_id = TT_ADOBE_ID_EXPERT;
+            cmaprec.encoding    = FT_ENCODING_ADOBE_EXPERT;
+            clazz               = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET;
+          }
+          else
+          {
+            cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM;
+            cmaprec.encoding    = FT_ENCODING_ADOBE_CUSTOM;
+            clazz               = &FT_CFF_CMAP_ENCODING_CLASS_REC_GET;
+          }
+
+          error = FT_CMap_New( clazz, NULL, &cmaprec, NULL );
+        }
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cff_face_done( FT_Face  cffface )         /* CFF_Face */
+  {
+    CFF_Face      face = (CFF_Face)cffface;
+    FT_Memory     memory;
+    SFNT_Service  sfnt;
+
+
+    if ( !face )
+      return;
+
+    memory = cffface->memory;
+    sfnt   = (SFNT_Service)face->sfnt;
+
+    if ( sfnt )
+      sfnt->done_face( face );
+
+    {
+      CFF_Font  cff = (CFF_Font)face->extra.data;
+
+
+      if ( cff )
+      {
+        cff_font_done( cff );
+        FT_FREE( face->extra.data );
+      }
+    }
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_driver_init( FT_Module  module )
+  {
+    FT_UNUSED( module );
+
+    return CFF_Err_Ok;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cff_driver_done( FT_Module  module )
+  {
+    FT_UNUSED( module );
+  }
+
+
+/* END */
diff --git a/src/cff/cffobjs.h b/src/cff/cffobjs.h
new file mode 100644 (file)
index 0000000..3c81cee
--- /dev/null
@@ -0,0 +1,181 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffobjs.h                                                              */
+/*                                                                         */
+/*    OpenType objects manager (specification).                            */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2006, 2007, 2008 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CFFOBJS_H__
+#define __CFFOBJS_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include "cfftypes.h"
+#include FT_INTERNAL_TRUETYPE_TYPES_H
+#include FT_SERVICE_POSTSCRIPT_CMAPS_H
+#include FT_INTERNAL_POSTSCRIPT_HINTS_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CFF_Driver                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an OpenType driver object.                             */
+  /*                                                                       */
+  typedef struct CFF_DriverRec_*  CFF_Driver;
+
+  typedef TT_Face  CFF_Face;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CFF_Size                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an OpenType size object.                               */
+  /*                                                                       */
+  typedef struct  CFF_SizeRec_
+  {
+    FT_SizeRec  root;
+    FT_ULong    strike_index;    /* 0xFFFFFFFF to indicate invalid */
+
+  } CFF_SizeRec, *CFF_Size;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CFF_GlyphSlot                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to an OpenType glyph slot object.                         */
+  /*                                                                       */
+  typedef struct  CFF_GlyphSlotRec_
+  {
+    FT_GlyphSlotRec  root;
+
+    FT_Bool          hint;
+    FT_Bool          scaled;
+
+    FT_Fixed         x_scale;
+    FT_Fixed         y_scale;
+
+  } CFF_GlyphSlotRec, *CFF_GlyphSlot;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CFF_Internal                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The interface to the `internal' field of `FT_Size'.                */
+  /*                                                                       */
+  typedef struct  CFF_InternalRec_
+  {
+    PSH_Globals  topfont;
+    PSH_Globals  subfonts[CFF_MAX_CID_FONTS];
+
+  } CFF_InternalRec, *CFF_Internal;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Subglyph transformation record.                                       */
+  /*                                                                       */
+  typedef struct  CFF_Transform_
+  {
+    FT_Fixed    xx, xy;     /* transformation matrix coefficients */
+    FT_Fixed    yx, yy;
+    FT_F26Dot6  ox, oy;     /* offsets        */
+
+  } CFF_Transform;
+
+
+  /***********************************************************************/
+  /*                                                                     */
+  /* TrueType driver class.                                              */
+  /*                                                                     */
+  typedef struct  CFF_DriverRec_
+  {
+    FT_DriverRec  root;
+    void*         extension_component;
+
+  } CFF_DriverRec;
+
+
+  FT_LOCAL( FT_Error )
+  cff_size_init( FT_Size  size );           /* CFF_Size */
+
+  FT_LOCAL( void )
+  cff_size_done( FT_Size  size );           /* CFF_Size */
+
+  FT_LOCAL( FT_Error )
+  cff_size_request( FT_Size          size,
+                    FT_Size_Request  req );
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+  FT_LOCAL( FT_Error )
+  cff_size_select( FT_Size   size,
+                   FT_ULong  strike_index );
+
+#endif
+
+  FT_LOCAL( void )
+  cff_slot_done( FT_GlyphSlot  slot );
+
+  FT_LOCAL( FT_Error )
+  cff_slot_init( FT_GlyphSlot  slot );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Face functions                                                        */
+  /*                                                                       */
+  FT_LOCAL( FT_Error )
+  cff_face_init( FT_Stream      stream,
+                 FT_Face        face,           /* CFF_Face */
+                 FT_Int         face_index,
+                 FT_Int         num_params,
+                 FT_Parameter*  params );
+
+  FT_LOCAL( void )
+  cff_face_done( FT_Face  face );               /* CFF_Face */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Driver functions                                                      */
+  /*                                                                       */
+  FT_LOCAL( FT_Error )
+  cff_driver_init( FT_Module  module );
+
+  FT_LOCAL( void )
+  cff_driver_done( FT_Module  module );
+
+
+FT_END_HEADER
+
+#endif /* __CFFOBJS_H__ */
+
+
+/* END */
diff --git a/src/cff/cffparse.c b/src/cff/cffparse.c
new file mode 100644 (file)
index 0000000..61fa87c
--- /dev/null
@@ -0,0 +1,1112 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffparse.c                                                             */
+/*                                                                         */
+/*    CFF token stream parser (body)                                       */
+/*                                                                         */
+/*  Copyright 1996-2004, 2007-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include "cffparse.h"
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_DEBUG_H
+
+#include "cfferrs.h"
+#include "cffpic.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cffparse
+
+
+  FT_LOCAL_DEF( void )
+  cff_parser_init( CFF_Parser  parser,
+                   FT_UInt     code,
+                   void*       object,
+                   FT_Library  library)
+  {
+    FT_MEM_ZERO( parser, sizeof ( *parser ) );
+
+    parser->top         = parser->stack;
+    parser->object_code = code;
+    parser->object      = object;
+    parser->library     = library;
+  }
+
+
+  /* read an integer */
+  static FT_Long
+  cff_parse_integer( FT_Byte*  start,
+                     FT_Byte*  limit )
+  {
+    FT_Byte*  p   = start;
+    FT_Int    v   = *p++;
+    FT_Long   val = 0;
+
+
+    if ( v == 28 )
+    {
+      if ( p + 2 > limit )
+        goto Bad;
+
+      val = (FT_Short)( ( (FT_Int)p[0] << 8 ) | p[1] );
+      p  += 2;
+    }
+    else if ( v == 29 )
+    {
+      if ( p + 4 > limit )
+        goto Bad;
+
+      val = ( (FT_Long)p[0] << 24 ) |
+            ( (FT_Long)p[1] << 16 ) |
+            ( (FT_Long)p[2] <<  8 ) |
+                       p[3];
+      p += 4;
+    }
+    else if ( v < 247 )
+    {
+      val = v - 139;
+    }
+    else if ( v < 251 )
+    {
+      if ( p + 1 > limit )
+        goto Bad;
+
+      val = ( v - 247 ) * 256 + p[0] + 108;
+      p++;
+    }
+    else
+    {
+      if ( p + 1 > limit )
+        goto Bad;
+
+      val = -( v - 251 ) * 256 - p[0] - 108;
+      p++;
+    }
+
+  Exit:
+    return val;
+
+  Bad:
+    val = 0;
+    goto Exit;
+  }
+
+
+  static const FT_Long power_tens[] =
+  {
+    1L,
+    10L,
+    100L,
+    1000L,
+    10000L,
+    100000L,
+    1000000L,
+    10000000L,
+    100000000L,
+    1000000000L
+  };
+
+
+  /* read a real */
+  static FT_Fixed
+  cff_parse_real( FT_Byte*  start,
+                  FT_Byte*  limit,
+                  FT_Long   power_ten,
+                  FT_Long*  scaling )
+  {
+    FT_Byte*  p = start;
+    FT_UInt   nib;
+    FT_UInt   phase;
+
+    FT_Long   result, number, exponent;
+    FT_Int    sign = 0, exponent_sign = 0;
+    FT_Long   exponent_add, integer_length, fraction_length;
+
+
+    if ( scaling )
+      *scaling = 0;
+
+    result = 0;
+
+    number   = 0;
+    exponent = 0;
+
+    exponent_add    = 0;
+    integer_length  = 0;
+    fraction_length = 0;
+
+    /* First of all, read the integer part. */
+    phase = 4;
+
+    for (;;)
+    {
+      /* If we entered this iteration with phase == 4, we need to */
+      /* read a new byte.  This also skips past the initial 0x1E. */
+      if ( phase )
+      {
+        p++;
+
+        /* Make sure we don't read past the end. */
+        if ( p >= limit )
+          goto Exit;
+      }
+
+      /* Get the nibble. */
+      nib   = ( p[0] >> phase ) & 0xF;
+      phase = 4 - phase;
+
+      if ( nib == 0xE )
+        sign = 1;
+      else if ( nib > 9 )
+        break;
+      else
+      {
+        /* Increase exponent if we can't add the digit. */
+        if ( number >= 0xCCCCCCCL )
+          exponent_add++;
+        /* Skip leading zeros. */
+        else if ( nib || number )
+        {
+          integer_length++;
+          number = number * 10 + nib;
+        }
+      }
+    }
+
+    /* Read fraction part, if any. */
+    if ( nib == 0xa )
+      for (;;)
+      {
+        /* If we entered this iteration with phase == 4, we need */
+        /* to read a new byte.                                   */
+        if ( phase )
+        {
+          p++;
+
+          /* Make sure we don't read past the end. */
+          if ( p >= limit )
+            goto Exit;
+        }
+
+        /* Get the nibble. */
+        nib   = ( p[0] >> phase ) & 0xF;
+        phase = 4 - phase;
+        if ( nib >= 10 )
+          break;
+
+        /* Skip leading zeros if possible. */
+        if ( !nib && !number )
+          exponent_add--;
+        /* Only add digit if we don't overflow. */
+        else if ( number < 0xCCCCCCCL && fraction_length < 9 )
+        {
+          fraction_length++;
+          number = number * 10 + nib;
+        }
+      }
+
+    /* Read exponent, if any. */
+    if ( nib == 12 )
+    {
+      exponent_sign = 1;
+      nib           = 11;
+    }
+
+    if ( nib == 11 )
+    {
+      for (;;)
+      {
+        /* If we entered this iteration with phase == 4, */
+        /* we need to read a new byte.                   */
+        if ( phase )
+        {
+          p++;
+
+          /* Make sure we don't read past the end. */
+          if ( p >= limit )
+            goto Exit;
+        }
+
+        /* Get the nibble. */
+        nib   = ( p[0] >> phase ) & 0xF;
+        phase = 4 - phase;
+        if ( nib >= 10 )
+          break;
+
+        exponent = exponent * 10 + nib;
+
+        /* Arbitrarily limit exponent. */
+        if ( exponent > 1000 )
+          goto Exit;
+      }
+
+      if ( exponent_sign )
+        exponent = -exponent;
+    }
+
+    /* We don't check `power_ten' and `exponent_add'. */
+    exponent += power_ten + exponent_add;
+
+    if ( scaling )
+    {
+      /* Only use `fraction_length'. */
+      fraction_length += integer_length;
+      exponent        += integer_length;
+
+      if ( fraction_length <= 5 )
+      {
+        if ( number > 0x7FFFL )
+        {
+          result   = FT_DivFix( number, 10 );
+          *scaling = exponent - fraction_length + 1;
+        }
+        else
+        {
+          if ( exponent > 0 )
+          {
+            FT_Long  new_fraction_length, shift;
+
+
+            /* Make `scaling' as small as possible. */
+            new_fraction_length = FT_MIN( exponent, 5 );
+            exponent           -= new_fraction_length;
+            shift               = new_fraction_length - fraction_length;
+
+            number *= power_tens[shift];
+            if ( number > 0x7FFFL )
+            {
+              number   /= 10;
+              exponent += 1;
+            }
+          }
+          else
+            exponent -= fraction_length;
+
+          result   = number << 16;
+          *scaling = exponent;
+        }
+      }
+      else
+      {
+        if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL )
+        {
+          result   = FT_DivFix( number, power_tens[fraction_length - 4] );
+          *scaling = exponent - 4;
+        }
+        else
+        {
+          result   = FT_DivFix( number, power_tens[fraction_length - 5] );
+          *scaling = exponent - 5;
+        }
+      }
+    }
+    else
+    {
+      integer_length  += exponent;
+      fraction_length -= exponent;
+
+      /* Check for overflow and underflow. */
+      if ( FT_ABS( integer_length ) > 5 )
+        goto Exit;
+
+      /* Remove non-significant digits. */
+      if ( integer_length < 0 )
+      {
+        number          /= power_tens[-integer_length];
+        fraction_length += integer_length;
+      }
+
+      /* this can only happen if exponent was non-zero */
+      if ( fraction_length == 10 )
+      {
+        number          /= 10;
+        fraction_length -= 1;
+      }
+
+      /* Convert into 16.16 format. */
+      if ( fraction_length > 0 )
+      {
+        if ( ( number / power_tens[fraction_length] ) > 0x7FFFL )
+          goto Exit;
+
+        result = FT_DivFix( number, power_tens[fraction_length] );
+      }
+      else
+      {
+        number *= power_tens[-fraction_length];
+
+        if ( number > 0x7FFFL )
+          goto Exit;
+
+        result = number << 16;
+      }
+    }
+
+    if ( sign )
+      result = -result;
+
+  Exit:
+    return result;
+  }
+
+
+  /* read a number, either integer or real */
+  static FT_Long
+  cff_parse_num( FT_Byte**  d )
+  {
+    return **d == 30 ? ( cff_parse_real( d[0], d[1], 0, NULL ) >> 16 )
+                     :   cff_parse_integer( d[0], d[1] );
+  }
+
+
+  /* read a floating point number, either integer or real */
+  static FT_Fixed
+  cff_parse_fixed( FT_Byte**  d )
+  {
+    return **d == 30 ? cff_parse_real( d[0], d[1], 0, NULL )
+                     : cff_parse_integer( d[0], d[1] ) << 16;
+  }
+
+
+  /* read a floating point number, either integer or real, */
+  /* but return `10^scaling' times the number read in      */
+  static FT_Fixed
+  cff_parse_fixed_scaled( FT_Byte**  d,
+                          FT_Long    scaling )
+  {
+    return **d == 30 ? cff_parse_real( d[0], d[1], scaling, NULL )
+                     : ( cff_parse_integer( d[0], d[1] ) *
+                           power_tens[scaling] ) << 16;
+  }
+
+
+  /* read a floating point number, either integer or real,     */
+  /* and return it as precise as possible -- `scaling' returns */
+  /* the scaling factor (as a power of 10)                     */
+  static FT_Fixed
+  cff_parse_fixed_dynamic( FT_Byte**  d,
+                           FT_Long*   scaling )
+  {
+    FT_ASSERT( scaling );
+
+    if ( **d == 30 )
+      return cff_parse_real( d[0], d[1], 0, scaling );
+    else
+    {
+      FT_Long  number;
+      FT_Int   integer_length;
+
+
+      number = cff_parse_integer( d[0], d[1] );
+
+      if ( number > 0x7FFFL )
+      {
+        for ( integer_length = 5; integer_length < 10; integer_length++ )
+          if ( number < power_tens[integer_length] )
+            break;
+
+        if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL )
+        {
+          *scaling = integer_length - 4;
+          return FT_DivFix( number, power_tens[integer_length - 4] );
+        }
+        else
+        {
+          *scaling = integer_length - 5;
+          return FT_DivFix( number, power_tens[integer_length - 5] );
+        }
+      }
+      else
+      {
+        *scaling = 0;
+        return number << 16;
+      }
+    }
+  }
+
+
+  static FT_Error
+  cff_parse_font_matrix( CFF_Parser  parser )
+  {
+    CFF_FontRecDict  dict   = (CFF_FontRecDict)parser->object;
+    FT_Matrix*       matrix = &dict->font_matrix;
+    FT_Vector*       offset = &dict->font_offset;
+    FT_ULong*        upm    = &dict->units_per_em;
+    FT_Byte**        data   = parser->stack;
+    FT_Error         error  = CFF_Err_Stack_Underflow;
+
+
+    if ( parser->top >= parser->stack + 6 )
+    {
+      FT_Long  scaling;
+
+
+      error = CFF_Err_Ok;
+
+      dict->has_font_matrix = TRUE;
+
+      /* We expect a well-formed font matrix, this is, the matrix elements */
+      /* `xx' and `yy' are of approximately the same magnitude.  To avoid  */
+      /* loss of precision, we use the magnitude of element `xx' to scale  */
+      /* all other elements.  The scaling factor is then contained in the  */
+      /* `units_per_em' value.                                             */
+
+      matrix->xx = cff_parse_fixed_dynamic( data++, &scaling );
+
+      scaling = -scaling;
+
+      if ( scaling < 0 || scaling > 9 )
+      {
+        /* Return default matrix in case of unlikely values. */
+
+        FT_TRACE1(( "cff_parse_font_matrix:"
+                    " strange scaling value for xx element (%d),\n"
+                    "                      "
+                    " using default matrix\n", scaling ));
+
+        matrix->xx = 0x10000L;
+        matrix->yx = 0;
+        matrix->xy = 0;
+        matrix->yy = 0x10000L;
+        offset->x  = 0;
+        offset->y  = 0;
+        *upm       = 1;
+
+        goto Exit;
+      }
+
+      matrix->yx = cff_parse_fixed_scaled( data++, scaling );
+      matrix->xy = cff_parse_fixed_scaled( data++, scaling );
+      matrix->yy = cff_parse_fixed_scaled( data++, scaling );
+      offset->x  = cff_parse_fixed_scaled( data++, scaling );
+      offset->y  = cff_parse_fixed_scaled( data,   scaling );
+
+      *upm = power_tens[scaling];
+
+      FT_TRACE4(( " [%f %f %f %f %f %f]\n",
+                  (double)matrix->xx / *upm / 65536,
+                  (double)matrix->xy / *upm / 65536,
+                  (double)matrix->yx / *upm / 65536,
+                  (double)matrix->yy / *upm / 65536,
+                  (double)offset->x  / *upm / 65536,
+                  (double)offset->y  / *upm / 65536 ));
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  cff_parse_font_bbox( CFF_Parser  parser )
+  {
+    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;
+    FT_BBox*         bbox = &dict->font_bbox;
+    FT_Byte**        data = parser->stack;
+    FT_Error         error;
+
+
+    error = CFF_Err_Stack_Underflow;
+
+    if ( parser->top >= parser->stack + 4 )
+    {
+      bbox->xMin = FT_RoundFix( cff_parse_fixed( data++ ) );
+      bbox->yMin = FT_RoundFix( cff_parse_fixed( data++ ) );
+      bbox->xMax = FT_RoundFix( cff_parse_fixed( data++ ) );
+      bbox->yMax = FT_RoundFix( cff_parse_fixed( data   ) );
+      error = CFF_Err_Ok;
+
+      FT_TRACE4(( " [%d %d %d %d]\n",
+                  bbox->xMin / 65536,
+                  bbox->yMin / 65536,
+                  bbox->xMax / 65536,
+                  bbox->yMax / 65536 ));
+    }
+
+    return error;
+  }
+
+
+  static FT_Error
+  cff_parse_private_dict( CFF_Parser  parser )
+  {
+    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;
+    FT_Byte**        data = parser->stack;
+    FT_Error         error;
+
+
+    error = CFF_Err_Stack_Underflow;
+
+    if ( parser->top >= parser->stack + 2 )
+    {
+      dict->private_size   = cff_parse_num( data++ );
+      dict->private_offset = cff_parse_num( data   );
+      FT_TRACE4(( " %lu %lu\n",
+                  dict->private_size, dict->private_offset ));
+
+      error = CFF_Err_Ok;
+    }
+
+    return error;
+  }
+
+
+  static FT_Error
+  cff_parse_cid_ros( CFF_Parser  parser )
+  {
+    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;
+    FT_Byte**        data = parser->stack;
+    FT_Error         error;
+
+
+    error = CFF_Err_Stack_Underflow;
+
+    if ( parser->top >= parser->stack + 3 )
+    {
+      dict->cid_registry = (FT_UInt)cff_parse_num( data++ );
+      dict->cid_ordering = (FT_UInt)cff_parse_num( data++ );
+      if ( **data == 30 )
+        FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" ));
+      dict->cid_supplement = cff_parse_num( data );
+      if ( dict->cid_supplement < 0 )
+        FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n",
+                   dict->cid_supplement ));
+      error = CFF_Err_Ok;
+
+      FT_TRACE4(( " %d %d %d\n",
+                  dict->cid_registry,
+                  dict->cid_ordering,
+                  dict->cid_supplement ));
+    }
+
+    return error;
+  }
+
+
+#define CFF_FIELD_NUM( code, name, id )             \
+          CFF_FIELD( code, name, id, cff_kind_num )
+#define CFF_FIELD_FIXED( code, name, id )             \
+          CFF_FIELD( code, name, id, cff_kind_fixed )
+#define CFF_FIELD_FIXED_1000( code, name, id )                 \
+          CFF_FIELD( code, name, id, cff_kind_fixed_thousand )
+#define CFF_FIELD_STRING( code, name, id )             \
+          CFF_FIELD( code, name, id, cff_kind_string )
+#define CFF_FIELD_BOOL( code, name, id )             \
+          CFF_FIELD( code, name, id, cff_kind_bool )
+
+#define CFFCODE_TOPDICT  0x1000
+#define CFFCODE_PRIVATE  0x2000
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+
+#undef  CFF_FIELD
+#undef  CFF_FIELD_DELTA
+
+
+#ifndef FT_DEBUG_LEVEL_TRACE
+
+
+#define CFF_FIELD_CALLBACK( code, name, id ) \
+          {                                  \
+            cff_kind_callback,               \
+            code | CFFCODE,                  \
+            0, 0,                            \
+            cff_parse_ ## name,              \
+            0, 0                             \
+          },
+
+#define CFF_FIELD( code, name, id, kind ) \
+          {                               \
+            kind,                         \
+            code | CFFCODE,               \
+            FT_FIELD_OFFSET( name ),      \
+            FT_FIELD_SIZE( name ),        \
+            0, 0, 0                       \
+          },
+
+#define CFF_FIELD_DELTA( code, name, max, id ) \
+          {                                    \
+            cff_kind_delta,                    \
+            code | CFFCODE,                    \
+            FT_FIELD_OFFSET( name ),           \
+            FT_FIELD_SIZE_DELTA( name ),       \
+            0,                                 \
+            max,                               \
+            FT_FIELD_OFFSET( num_ ## name )    \
+          },
+
+  static const CFF_Field_Handler  cff_field_handlers[] =
+  {
+
+#include "cfftoken.h"
+
+    { 0, 0, 0, 0, 0, 0, 0 }
+  };
+
+
+#else /* FT_DEBUG_LEVEL_TRACE */
+
+
+
+#define CFF_FIELD_CALLBACK( code, name, id ) \
+          {                                  \
+            cff_kind_callback,               \
+            code | CFFCODE,                  \
+            0, 0,                            \
+            cff_parse_ ## name,              \
+            0, 0,                            \
+            id                               \
+          },
+
+#define CFF_FIELD( code, name, id, kind ) \
+          {                               \
+            kind,                         \
+            code | CFFCODE,               \
+            FT_FIELD_OFFSET( name ),      \
+            FT_FIELD_SIZE( name ),        \
+            0, 0, 0,                      \
+            id                            \
+          },
+
+#define CFF_FIELD_DELTA( code, name, max, id ) \
+          {                                    \
+            cff_kind_delta,                    \
+            code | CFFCODE,                    \
+            FT_FIELD_OFFSET( name ),           \
+            FT_FIELD_SIZE_DELTA( name ),       \
+            0,                                 \
+            max,                               \
+            FT_FIELD_OFFSET( num_ ## name ),   \
+            id                                 \
+          },
+
+  static const CFF_Field_Handler  cff_field_handlers[] =
+  {
+
+#include "cfftoken.h"
+
+    { 0, 0, 0, 0, 0, 0, 0, 0 }
+  };
+
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+
+  void
+  FT_Destroy_Class_cff_field_handlers( FT_Library          library,
+                                       CFF_Field_Handler*  clazz )
+  {
+    FT_Memory  memory = library->memory;
+
+
+    if ( clazz )
+      FT_FREE( clazz );
+  }
+
+
+  FT_Error
+  FT_Create_Class_cff_field_handlers( FT_Library           library,
+                                      CFF_Field_Handler**  output_class )
+  {
+    CFF_Field_Handler*  clazz;
+    FT_Error            error;
+    FT_Memory           memory = library->memory;
+
+    int  i = 0;
+
+
+#undef CFF_FIELD
+#define CFF_FIELD( code, name, id, kind ) i++;
+#undef CFF_FIELD_DELTA
+#define CFF_FIELD_DELTA( code, name, max, id ) i++;
+#undef CFF_FIELD_CALLBACK
+#define CFF_FIELD_CALLBACK( code, name, id ) i++;
+
+#include "cfftoken.h"
+
+    i++; /* { 0, 0, 0, 0, 0, 0, 0 } */
+
+    if ( FT_ALLOC( clazz, sizeof ( CFF_Field_Handler ) * i ) )
+      return error;
+
+    i = 0;
+
+
+#ifndef FT_DEBUG_LEVEL_TRACE
+
+
+#undef CFF_FIELD_CALLBACK
+#define CFF_FIELD_CALLBACK( code_, name_, id_ )        \
+          clazz[i].kind         = cff_kind_callback;   \
+          clazz[i].code         = code_ | CFFCODE;     \
+          clazz[i].offset       = 0;                   \
+          clazz[i].size         = 0;                   \
+          clazz[i].reader       = cff_parse_ ## name_; \
+          clazz[i].array_max    = 0;                   \
+          clazz[i].count_offset = 0;                   \
+          i++;
+
+#undef  CFF_FIELD
+#define CFF_FIELD( code_, name_, id_, kind_ )               \
+          clazz[i].kind         = kind_;                    \
+          clazz[i].code         = code_ | CFFCODE;          \
+          clazz[i].offset       = FT_FIELD_OFFSET( name_ ); \
+          clazz[i].size         = FT_FIELD_SIZE( name_ );   \
+          clazz[i].reader       = 0;                        \
+          clazz[i].array_max    = 0;                        \
+          clazz[i].count_offset = 0;                        \
+          i++;                                              \
+
+#undef  CFF_FIELD_DELTA
+#define CFF_FIELD_DELTA( code_, name_, max_, id_ )                  \
+          clazz[i].kind         = cff_kind_delta;                   \
+          clazz[i].code         = code_ | CFFCODE;                  \
+          clazz[i].offset       = FT_FIELD_OFFSET( name_ );         \
+          clazz[i].size         = FT_FIELD_SIZE_DELTA( name_ );     \
+          clazz[i].reader       = 0;                                \
+          clazz[i].array_max    = max_;                             \
+          clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
+          i++;
+
+#include "cfftoken.h"
+
+    clazz[i].kind         = 0;
+    clazz[i].code         = 0;
+    clazz[i].offset       = 0;
+    clazz[i].size         = 0;
+    clazz[i].reader       = 0;
+    clazz[i].array_max    = 0;
+    clazz[i].count_offset = 0;
+
+
+#else /* FT_DEBUG_LEVEL_TRACE */
+
+
+#undef CFF_FIELD_CALLBACK
+#define CFF_FIELD_CALLBACK( code_, name_, id_ )        \
+          clazz[i].kind         = cff_kind_callback;   \
+          clazz[i].code         = code_ | CFFCODE;     \
+          clazz[i].offset       = 0;                   \
+          clazz[i].size         = 0;                   \
+          clazz[i].reader       = cff_parse_ ## name_; \
+          clazz[i].array_max    = 0;                   \
+          clazz[i].count_offset = 0;                   \
+          clazz[i].id           = id_;                 \
+          i++;
+
+#undef  CFF_FIELD
+#define CFF_FIELD( code_, name_, id_, kind_ )               \
+          clazz[i].kind         = kind_;                    \
+          clazz[i].code         = code_ | CFFCODE;          \
+          clazz[i].offset       = FT_FIELD_OFFSET( name_ ); \
+          clazz[i].size         = FT_FIELD_SIZE( name_ );   \
+          clazz[i].reader       = 0;                        \
+          clazz[i].array_max    = 0;                        \
+          clazz[i].count_offset = 0;                        \
+          clazz[i].id           = id_;                      \
+          i++;                                              \
+
+#undef  CFF_FIELD_DELTA
+#define CFF_FIELD_DELTA( code_, name_, max_, id_ )                  \
+          clazz[i].kind         = cff_kind_delta;                   \
+          clazz[i].code         = code_ | CFFCODE;                  \
+          clazz[i].offset       = FT_FIELD_OFFSET( name_ );         \
+          clazz[i].size         = FT_FIELD_SIZE_DELTA( name_ );     \
+          clazz[i].reader       = 0;                                \
+          clazz[i].array_max    = max_;                             \
+          clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
+          clazz[i].id           = id_;                              \
+          i++;
+
+#include "cfftoken.h"
+
+    clazz[i].kind         = 0;
+    clazz[i].code         = 0;
+    clazz[i].offset       = 0;
+    clazz[i].size         = 0;
+    clazz[i].reader       = 0;
+    clazz[i].array_max    = 0;
+    clazz[i].count_offset = 0;
+    clazz[i].id           = 0;
+
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+    *output_class = clazz;
+
+    return CFF_Err_Ok;
+  }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cff_parser_run( CFF_Parser  parser,
+                  FT_Byte*    start,
+                  FT_Byte*    limit )
+  {
+    FT_Byte*    p       = start;
+    FT_Error    error   = CFF_Err_Ok;
+    FT_Library  library = parser->library;
+    FT_UNUSED( library );
+
+
+    parser->top    = parser->stack;
+    parser->start  = start;
+    parser->limit  = limit;
+    parser->cursor = start;
+
+    while ( p < limit )
+    {
+      FT_UInt  v = *p;
+
+
+      if ( v >= 27 && v != 31 )
+      {
+        /* it's a number; we will push its position on the stack */
+        if ( parser->top - parser->stack >= CFF_MAX_STACK_DEPTH )
+          goto Stack_Overflow;
+
+        *parser->top ++ = p;
+
+        /* now, skip it */
+        if ( v == 30 )
+        {
+          /* skip real number */
+          p++;
+          for (;;)
+          {
+            /* An unterminated floating point number at the */
+            /* end of a dictionary is invalid but harmless. */
+            if ( p >= limit )
+              goto Exit;
+            v = p[0] >> 4;
+            if ( v == 15 )
+              break;
+            v = p[0] & 0xF;
+            if ( v == 15 )
+              break;
+            p++;
+          }
+        }
+        else if ( v == 28 )
+          p += 2;
+        else if ( v == 29 )
+          p += 4;
+        else if ( v > 246 )
+          p += 1;
+      }
+      else
+      {
+        /* This is not a number, hence it's an operator.  Compute its code */
+        /* and look for it in our current list.                            */
+
+        FT_UInt                   code;
+        FT_UInt                   num_args = (FT_UInt)
+                                             ( parser->top - parser->stack );
+        const CFF_Field_Handler*  field;
+
+
+        *parser->top = p;
+        code = v;
+        if ( v == 12 )
+        {
+          /* two byte operator */
+          p++;
+          if ( p >= limit )
+            goto Syntax_Error;
+
+          code = 0x100 | p[0];
+        }
+        code = code | parser->object_code;
+
+        for ( field = FT_CFF_FIELD_HANDLERS_GET; field->kind; field++ )
+        {
+          if ( field->code == (FT_Int)code )
+          {
+            /* we found our field's handler; read it */
+            FT_Long   val;
+            FT_Byte*  q = (FT_Byte*)parser->object + field->offset;
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+            FT_TRACE4(( "  %s", field->id ));
+#endif
+
+            /* check that we have enough arguments -- except for */
+            /* delta encoded arrays, which can be empty          */
+            if ( field->kind != cff_kind_delta && num_args < 1 )
+              goto Stack_Underflow;
+
+            switch ( field->kind )
+            {
+            case cff_kind_bool:
+            case cff_kind_string:
+            case cff_kind_num:
+              val = cff_parse_num( parser->stack );
+              goto Store_Number;
+
+            case cff_kind_fixed:
+              val = cff_parse_fixed( parser->stack );
+              goto Store_Number;
+
+            case cff_kind_fixed_thousand:
+              val = cff_parse_fixed_scaled( parser->stack, 3 );
+
+            Store_Number:
+              switch ( field->size )
+              {
+              case (8 / FT_CHAR_BIT):
+                *(FT_Byte*)q = (FT_Byte)val;
+                break;
+
+              case (16 / FT_CHAR_BIT):
+                *(FT_Short*)q = (FT_Short)val;
+                break;
+
+              case (32 / FT_CHAR_BIT):
+                *(FT_Int32*)q = (FT_Int)val;
+                break;
+
+              default:  /* for 64-bit systems */
+                *(FT_Long*)q = val;
+              }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+              switch ( field->kind )
+              {
+              case cff_kind_bool:
+                FT_TRACE4(( " %s\n", val ? "true" : "false" ));
+                break;
+
+              case cff_kind_string:
+                FT_TRACE4(( " %ld (SID)\n", val ));
+                break;
+
+              case cff_kind_num:
+                FT_TRACE4(( " %ld\n", val ));
+                break;
+
+              case cff_kind_fixed:
+                FT_TRACE4(( " %f\n", (double)val / 65536 ));
+                break;
+
+              case cff_kind_fixed_thousand:
+                FT_TRACE4(( " %f\n", (double)val / 65536 / 1000 ));
+
+              default:
+                ; /* never reached */
+              }
+#endif
+
+              break;
+
+            case cff_kind_delta:
+              {
+                FT_Byte*   qcount = (FT_Byte*)parser->object +
+                                      field->count_offset;
+
+                FT_Byte**  data = parser->stack;
+
+
+                if ( num_args > field->array_max )
+                  num_args = field->array_max;
+
+                FT_TRACE4(( " [" ));
+
+                /* store count */
+                *qcount = (FT_Byte)num_args;
+
+                val = 0;
+                while ( num_args > 0 )
+                {
+                  val += cff_parse_num( data++ );
+                  switch ( field->size )
+                  {
+                  case (8 / FT_CHAR_BIT):
+                    *(FT_Byte*)q = (FT_Byte)val;
+                    break;
+
+                  case (16 / FT_CHAR_BIT):
+                    *(FT_Short*)q = (FT_Short)val;
+                    break;
+
+                  case (32 / FT_CHAR_BIT):
+                    *(FT_Int32*)q = (FT_Int)val;
+                    break;
+
+                  default:  /* for 64-bit systems */
+                    *(FT_Long*)q = val;
+                  }
+
+                  FT_TRACE4(( " %ld", val ));
+
+                  q += field->size;
+                  num_args--;
+                }
+
+                FT_TRACE4(( "]\n" ));
+              }
+              break;
+
+            default:  /* callback */
+              error = field->reader( parser );
+              if ( error )
+                goto Exit;
+            }
+            goto Found;
+          }
+        }
+
+        /* this is an unknown operator, or it is unsupported; */
+        /* we will ignore it for now.                         */
+
+      Found:
+        /* clear stack */
+        parser->top = parser->stack;
+      }
+      p++;
+    }
+
+  Exit:
+    return error;
+
+  Stack_Overflow:
+    error = CFF_Err_Invalid_Argument;
+    goto Exit;
+
+  Stack_Underflow:
+    error = CFF_Err_Invalid_Argument;
+    goto Exit;
+
+  Syntax_Error:
+    error = CFF_Err_Invalid_Argument;
+    goto Exit;
+  }
+
+
+/* END */
diff --git a/src/cff/cffparse.h b/src/cff/cffparse.h
new file mode 100644 (file)
index 0000000..61d91ed
--- /dev/null
@@ -0,0 +1,106 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffparse.h                                                             */
+/*                                                                         */
+/*    CFF token stream parser (specification)                              */
+/*                                                                         */
+/*  Copyright 1996-2003, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CFF_PARSE_H__
+#define __CFF_PARSE_H__
+
+
+#include <ft2build.h>
+#include "cfftypes.h"
+#include FT_INTERNAL_OBJECTS_H
+
+
+FT_BEGIN_HEADER
+
+
+#define CFF_MAX_STACK_DEPTH  96
+
+#define CFF_CODE_TOPDICT  0x1000
+#define CFF_CODE_PRIVATE  0x2000
+
+
+  typedef struct  CFF_ParserRec_
+  {
+    FT_Library library;
+    FT_Byte*   start;
+    FT_Byte*   limit;
+    FT_Byte*   cursor;
+
+    FT_Byte*   stack[CFF_MAX_STACK_DEPTH + 1];
+    FT_Byte**  top;
+
+    FT_UInt    object_code;
+    void*      object;
+
+  } CFF_ParserRec, *CFF_Parser;
+
+
+  FT_LOCAL( void )
+  cff_parser_init( CFF_Parser  parser,
+                   FT_UInt     code,
+                   void*       object,
+                   FT_Library  library);
+
+  FT_LOCAL( FT_Error )
+  cff_parser_run( CFF_Parser  parser,
+                  FT_Byte*    start,
+                  FT_Byte*    limit );
+
+
+  enum
+  {
+    cff_kind_none = 0,
+    cff_kind_num,
+    cff_kind_fixed,
+    cff_kind_fixed_thousand,
+    cff_kind_string,
+    cff_kind_bool,
+    cff_kind_delta,
+    cff_kind_callback,
+
+    cff_kind_max  /* do not remove */
+  };
+
+
+  /* now generate handlers for the most simple fields */
+  typedef FT_Error  (*CFF_Field_Reader)( CFF_Parser  parser );
+
+  typedef struct  CFF_Field_Handler_
+  {
+    int               kind;
+    int               code;
+    FT_UInt           offset;
+    FT_Byte           size;
+    CFF_Field_Reader  reader;
+    FT_UInt           array_max;
+    FT_UInt           count_offset;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+    const char*       id;
+#endif
+
+  } CFF_Field_Handler;
+
+
+FT_END_HEADER
+
+
+#endif /* __CFF_PARSE_H__ */
+
+
+/* END */
diff --git a/src/cff/cffpic.c b/src/cff/cffpic.c
new file mode 100644 (file)
index 0000000..1c19d58
--- /dev/null
@@ -0,0 +1,148 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffpic.c                                                               */
+/*                                                                         */
+/*    The FreeType position independent code services for cff module.      */
+/*                                                                         */
+/*  Copyright 2009, 2010 by                                                */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_INTERNAL_OBJECTS_H
+#include "cffcmap.h"
+#include "cffpic.h"
+#include "cfferrs.h"
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* forward declaration of PIC init functions from cffdrivr.c */
+  FT_Error
+  FT_Create_Class_cff_services(
+    FT_Library           library,
+    FT_ServiceDescRec**  output_class );
+
+  void
+  FT_Destroy_Class_cff_services(
+    FT_Library          library,
+    FT_ServiceDescRec*  clazz );
+
+  void
+  FT_Init_Class_cff_service_ps_info(
+    FT_Library             library,
+    FT_Service_PsInfoRec*  clazz );
+
+  void
+  FT_Init_Class_cff_service_glyph_dict(
+    FT_Library                library,
+    FT_Service_GlyphDictRec*  clazz );
+
+  void
+  FT_Init_Class_cff_service_ps_name(
+    FT_Library                 library,
+    FT_Service_PsFontNameRec*  clazz );
+
+  void
+  FT_Init_Class_cff_service_get_cmap_info(
+    FT_Library              library,
+    FT_Service_TTCMapsRec*  clazz );
+
+  void
+  FT_Init_Class_cff_service_cid_info(
+    FT_Library          library,
+    FT_Service_CIDRec*  clazz );
+
+  /* forward declaration of PIC init functions from cffparse.c */
+  FT_Error
+  FT_Create_Class_cff_field_handlers(
+    FT_Library           library,
+    CFF_Field_Handler**  output_class );
+
+  void
+  FT_Destroy_Class_cff_field_handlers(
+    FT_Library          library,
+    CFF_Field_Handler*  clazz );
+
+  void
+  cff_driver_class_pic_free( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Memory  memory = library->memory;
+
+
+    if ( pic_container->cff )
+    {
+      CffModulePIC*  container = ( CffModulePIC* )pic_container->cff;
+
+
+      if ( container->cff_services )
+        FT_Destroy_Class_cff_services( library,
+                                       container->cff_services );
+      container->cff_services = NULL;
+      if ( container->cff_field_handlers )
+        FT_Destroy_Class_cff_field_handlers(
+          library, container->cff_field_handlers );
+      container->cff_field_handlers = NULL;
+      FT_FREE( container );
+      pic_container->cff = NULL;
+    }
+  }
+
+
+  FT_Error
+  cff_driver_class_pic_init( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Error           error         = CFF_Err_Ok;
+    CffModulePIC*      container;
+    FT_Memory          memory        = library->memory;
+
+
+    /* allocate pointer, clear and set global container pointer */
+    if ( FT_ALLOC ( container, sizeof ( *container ) ) )
+      return error;
+    FT_MEM_SET( container, 0, sizeof ( *container ) );
+    pic_container->cff = container;
+
+    /* initialize pointer table - this is how the module usually expects this data */
+    error = FT_Create_Class_cff_services( library,
+                                          &container->cff_services );
+    if ( error )
+      goto Exit;
+    error = FT_Create_Class_cff_field_handlers(
+              library, &container->cff_field_handlers );
+    if ( error )
+      goto Exit;
+    FT_Init_Class_cff_service_ps_info(
+      library, &container->cff_service_ps_info );
+    FT_Init_Class_cff_service_glyph_dict(
+      library, &container->cff_service_glyph_dict );
+    FT_Init_Class_cff_service_ps_name(
+      library, &container->cff_service_ps_name );
+    FT_Init_Class_cff_service_get_cmap_info(
+      library, &container->cff_service_get_cmap_info );
+    FT_Init_Class_cff_service_cid_info(
+      library, &container->cff_service_cid_info );
+    FT_Init_Class_cff_cmap_encoding_class_rec(
+      library, &container->cff_cmap_encoding_class_rec );
+    FT_Init_Class_cff_cmap_unicode_class_rec(
+      library, &container->cff_cmap_unicode_class_rec );
+Exit:
+    if ( error )
+      cff_driver_class_pic_free( library );
+    return error;
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/src/cff/cffpic.h b/src/cff/cffpic.h
new file mode 100644 (file)
index 0000000..342edd8
--- /dev/null
@@ -0,0 +1,87 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffpic.h                                                               */
+/*                                                                         */
+/*    The FreeType position independent code services for cff module.      */
+/*                                                                         */
+/*  Copyright 2009 by                                                      */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CFFPIC_H__
+#define __CFFPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include FT_INTERNAL_PIC_H
+
+#ifndef FT_CONFIG_OPTION_PIC
+#define FT_CFF_SERVICE_PS_INFO_GET         cff_service_ps_info
+#define FT_CFF_SERVICE_GLYPH_DICT_GET      cff_service_glyph_dict
+#define FT_CFF_SERVICE_PS_NAME_GET         cff_service_ps_name
+#define FT_CFF_SERVICE_GET_CMAP_INFO_GET   cff_service_get_cmap_info
+#define FT_CFF_SERVICE_CID_INFO_GET        cff_service_cid_info
+#define FT_CFF_SERVICES_GET                cff_services
+#define FT_CFF_CMAP_ENCODING_CLASS_REC_GET cff_cmap_encoding_class_rec
+#define FT_CFF_CMAP_UNICODE_CLASS_REC_GET  cff_cmap_unicode_class_rec
+#define FT_CFF_FIELD_HANDLERS_GET          cff_field_handlers
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include FT_SERVICE_GLYPH_DICT_H
+#include "cffparse.h"
+#include FT_SERVICE_POSTSCRIPT_INFO_H
+#include FT_SERVICE_POSTSCRIPT_NAME_H
+#include FT_SERVICE_TT_CMAP_H
+#include FT_SERVICE_CID_H
+
+  typedef struct CffModulePIC_
+  {
+    FT_ServiceDescRec* cff_services;
+    CFF_Field_Handler* cff_field_handlers;
+    FT_Service_PsInfoRec cff_service_ps_info;
+    FT_Service_GlyphDictRec cff_service_glyph_dict;
+    FT_Service_PsFontNameRec cff_service_ps_name;
+    FT_Service_TTCMapsRec  cff_service_get_cmap_info;
+    FT_Service_CIDRec  cff_service_cid_info;
+    FT_CMap_ClassRec cff_cmap_encoding_class_rec;
+    FT_CMap_ClassRec cff_cmap_unicode_class_rec;
+  } CffModulePIC;
+
+#define GET_PIC(lib)                       ((CffModulePIC*)((lib)->pic_container.cff))
+#define FT_CFF_SERVICE_PS_INFO_GET         (GET_PIC(library)->cff_service_ps_info)
+#define FT_CFF_SERVICE_GLYPH_DICT_GET      (GET_PIC(library)->cff_service_glyph_dict)
+#define FT_CFF_SERVICE_PS_NAME_GET         (GET_PIC(library)->cff_service_ps_name)
+#define FT_CFF_SERVICE_GET_CMAP_INFO_GET   (GET_PIC(library)->cff_service_get_cmap_info)
+#define FT_CFF_SERVICE_CID_INFO_GET        (GET_PIC(library)->cff_service_cid_info)
+#define FT_CFF_SERVICES_GET                (GET_PIC(library)->cff_services)
+#define FT_CFF_CMAP_ENCODING_CLASS_REC_GET (GET_PIC(library)->cff_cmap_encoding_class_rec)
+#define FT_CFF_CMAP_UNICODE_CLASS_REC_GET  (GET_PIC(library)->cff_cmap_unicode_class_rec)
+#define FT_CFF_FIELD_HANDLERS_GET          (GET_PIC(library)->cff_field_handlers)
+
+  /* see cffpic.c for the implementation */
+  void
+  cff_driver_class_pic_free( FT_Library  library );
+
+  FT_Error
+  cff_driver_class_pic_init( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __CFFPIC_H__ */
+
+
+/* END */
diff --git a/src/cff/cfftoken.h b/src/cff/cfftoken.h
new file mode 100644 (file)
index 0000000..bcb4276
--- /dev/null
@@ -0,0 +1,97 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cfftoken.h                                                             */
+/*                                                                         */
+/*    CFF token definitions (specification only).                          */
+/*                                                                         */
+/*  Copyright 1996-2003, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  CFF_FontRecDictRec
+
+#undef  CFFCODE
+#define CFFCODE       CFFCODE_TOPDICT
+
+  CFF_FIELD_STRING  ( 0,     version,             "Version" )
+  CFF_FIELD_STRING  ( 1,     notice,              "Notice" )
+  CFF_FIELD_STRING  ( 0x100, copyright,           "Copyright" )
+  CFF_FIELD_STRING  ( 2,     full_name,           "FullName" )
+  CFF_FIELD_STRING  ( 3,     family_name,         "FamilyName" )
+  CFF_FIELD_STRING  ( 4,     weight,              "Weight" )
+  CFF_FIELD_BOOL    ( 0x101, is_fixed_pitch,      "isFixedPitch" )
+  CFF_FIELD_FIXED   ( 0x102, italic_angle,        "ItalicAngle" )
+  CFF_FIELD_FIXED   ( 0x103, underline_position,  "UnderlinePosition" )
+  CFF_FIELD_FIXED   ( 0x104, underline_thickness, "UnderlineThickness" )
+  CFF_FIELD_NUM     ( 0x105, paint_type,          "PaintType" )
+  CFF_FIELD_NUM     ( 0x106, charstring_type,     "CharstringType" )
+  CFF_FIELD_CALLBACK( 0x107, font_matrix,         "FontMatrix" )
+  CFF_FIELD_NUM     ( 13,    unique_id,           "UniqueID" )
+  CFF_FIELD_CALLBACK( 5,     font_bbox,           "FontBBox" )
+  CFF_FIELD_NUM     ( 0x108, stroke_width,        "StrokeWidth" )
+  CFF_FIELD_NUM     ( 15,    charset_offset,      "charset" )
+  CFF_FIELD_NUM     ( 16,    encoding_offset,     "Encoding" )
+  CFF_FIELD_NUM     ( 17,    charstrings_offset,  "CharStrings" )
+  CFF_FIELD_CALLBACK( 18,    private_dict,        "Private" )
+  CFF_FIELD_NUM     ( 0x114, synthetic_base,      "SyntheticBase" )
+  CFF_FIELD_STRING  ( 0x115, embedded_postscript, "PostScript" )
+
+#if 0
+  CFF_FIELD_STRING  ( 0x116, base_font_name,      "BaseFontName" )
+  CFF_FIELD_DELTA   ( 0x117, base_font_blend, 16, "BaseFontBlend" )
+  CFF_FIELD_CALLBACK( 0x118, multiple_master,     "MultipleMaster" )
+  CFF_FIELD_CALLBACK( 0x119, blend_axis_types,    "BlendAxisTypes" )
+#endif
+
+  CFF_FIELD_CALLBACK( 0x11E, cid_ros,              "ROS" )
+  CFF_FIELD_NUM     ( 0x11F, cid_font_version,     "CIDFontVersion" )
+  CFF_FIELD_NUM     ( 0x120, cid_font_revision,    "CIDFontRevision" )
+  CFF_FIELD_NUM     ( 0x121, cid_font_type,        "CIDFontType" )
+  CFF_FIELD_NUM     ( 0x122, cid_count,            "CIDCount" )
+  CFF_FIELD_NUM     ( 0x123, cid_uid_base,         "UIDBase" )
+  CFF_FIELD_NUM     ( 0x124, cid_fd_array_offset,  "FDArray" )
+  CFF_FIELD_NUM     ( 0x125, cid_fd_select_offset, "FDSelect" )
+  CFF_FIELD_STRING  ( 0x126, cid_font_name,        "FontName" )
+
+#if 0
+  CFF_FIELD_NUM     ( 0x127, chameleon, "Chameleon" )
+#endif
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  CFF_PrivateRec
+#undef  CFFCODE
+#define CFFCODE       CFFCODE_PRIVATE
+
+  CFF_FIELD_DELTA     ( 6,     blue_values, 14,        "BlueValues" )
+  CFF_FIELD_DELTA     ( 7,     other_blues, 10,        "OtherBlues" )
+  CFF_FIELD_DELTA     ( 8,     family_blues, 14,       "FamilyBlues" )
+  CFF_FIELD_DELTA     ( 9,     family_other_blues, 10, "FamilyOtherBlues" )
+  CFF_FIELD_FIXED_1000( 0x109, blue_scale,             "BlueScale" )
+  CFF_FIELD_NUM       ( 0x10A, blue_shift,             "BlueShift" )
+  CFF_FIELD_NUM       ( 0x10B, blue_fuzz,              "BlueFuzz" )
+  CFF_FIELD_NUM       ( 10,    standard_width,         "StdHW" )
+  CFF_FIELD_NUM       ( 11,    standard_height,        "StdVW" )
+  CFF_FIELD_DELTA     ( 0x10C, snap_widths, 13,        "StemSnapH" )
+  CFF_FIELD_DELTA     ( 0x10D, snap_heights, 13,       "StemSnapV" )
+  CFF_FIELD_BOOL      ( 0x10E, force_bold,             "ForceBold" )
+  CFF_FIELD_FIXED     ( 0x10F, force_bold_threshold,   "ForceBoldThreshold" )
+  CFF_FIELD_NUM       ( 0x110, lenIV,                  "lenIV" )
+  CFF_FIELD_NUM       ( 0x111, language_group,         "LanguageGroup" )
+  CFF_FIELD_FIXED     ( 0x112, expansion_factor,       "ExpansionFactor" )
+  CFF_FIELD_NUM       ( 0x113, initial_random_seed,    "initialRandomSeed" )
+  CFF_FIELD_NUM       ( 19,    local_subrs_offset,     "Subrs" )
+  CFF_FIELD_NUM       ( 20,    default_width,          "defaultWidthX" )
+  CFF_FIELD_NUM       ( 21,    nominal_width,          "nominalWidthX" )
+
+
+/* END */
diff --git a/src/cff/cfftypes.h b/src/cff/cfftypes.h
new file mode 100644 (file)
index 0000000..7c99036
--- /dev/null
@@ -0,0 +1,281 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cfftypes.h                                                             */
+/*                                                                         */
+/*    Basic OpenType/CFF type definitions and interface (specification     */
+/*    only).                                                               */
+/*                                                                         */
+/*  Copyright 1996-2003, 2006-2008, 2010-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CFFTYPES_H__
+#define __CFFTYPES_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_TYPE1_TABLES_H
+#include FT_INTERNAL_SERVICE_H
+#include FT_SERVICE_POSTSCRIPT_CMAPS_H
+#include FT_INTERNAL_POSTSCRIPT_HINTS_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CFF_IndexRec                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A structure used to model a CFF Index table.                       */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    stream      :: The source input stream.                            */
+  /*                                                                       */
+  /*    start       :: The position of the first index byte in the         */
+  /*                   input stream.                                       */
+  /*                                                                       */
+  /*    count       :: The number of elements in the index.                */
+  /*                                                                       */
+  /*    off_size    :: The size in bytes of object offsets in index.       */
+  /*                                                                       */
+  /*    data_offset :: The position of first data byte in the index's      */
+  /*                   bytes.                                              */
+  /*                                                                       */
+  /*    data_size   :: The size of the data table in this index.           */
+  /*                                                                       */
+  /*    offsets     :: A table of element offsets in the index.  Must be   */
+  /*                   loaded explicitly.                                  */
+  /*                                                                       */
+  /*    bytes       :: If the index is loaded in memory, its bytes.        */
+  /*                                                                       */
+  typedef struct  CFF_IndexRec_
+  {
+    FT_Stream  stream;
+    FT_ULong   start;
+    FT_UInt    count;
+    FT_Byte    off_size;
+    FT_ULong   data_offset;
+    FT_ULong   data_size;
+
+    FT_ULong*  offsets;
+    FT_Byte*   bytes;
+
+  } CFF_IndexRec, *CFF_Index;
+
+
+  typedef struct  CFF_EncodingRec_
+  {
+    FT_UInt     format;
+    FT_ULong    offset;
+
+    FT_UInt     count;
+    FT_UShort   sids [256];  /* avoid dynamic allocations */
+    FT_UShort   codes[256];
+
+  } CFF_EncodingRec, *CFF_Encoding;
+
+
+  typedef struct  CFF_CharsetRec_
+  {
+
+    FT_UInt     format;
+    FT_ULong    offset;
+
+    FT_UShort*  sids;
+    FT_UShort*  cids;       /* the inverse mapping of `sids'; only needed */
+                            /* for CID-keyed fonts                        */
+    FT_UInt     max_cid;
+    FT_UInt     num_glyphs;
+
+  } CFF_CharsetRec, *CFF_Charset;
+
+
+  typedef struct  CFF_FontRecDictRec_
+  {
+    FT_UInt    version;
+    FT_UInt    notice;
+    FT_UInt    copyright;
+    FT_UInt    full_name;
+    FT_UInt    family_name;
+    FT_UInt    weight;
+    FT_Bool    is_fixed_pitch;
+    FT_Fixed   italic_angle;
+    FT_Fixed   underline_position;
+    FT_Fixed   underline_thickness;
+    FT_Int     paint_type;
+    FT_Int     charstring_type;
+    FT_Matrix  font_matrix;
+    FT_Bool    has_font_matrix;
+    FT_ULong   units_per_em;  /* temporarily used as scaling value also */
+    FT_Vector  font_offset;
+    FT_ULong   unique_id;
+    FT_BBox    font_bbox;
+    FT_Pos     stroke_width;
+    FT_ULong   charset_offset;
+    FT_ULong   encoding_offset;
+    FT_ULong   charstrings_offset;
+    FT_ULong   private_offset;
+    FT_ULong   private_size;
+    FT_Long    synthetic_base;
+    FT_UInt    embedded_postscript;
+
+    /* these should only be used for the top-level font dictionary */
+    FT_UInt    cid_registry;
+    FT_UInt    cid_ordering;
+    FT_Long    cid_supplement;
+
+    FT_Long    cid_font_version;
+    FT_Long    cid_font_revision;
+    FT_Long    cid_font_type;
+    FT_ULong   cid_count;
+    FT_ULong   cid_uid_base;
+    FT_ULong   cid_fd_array_offset;
+    FT_ULong   cid_fd_select_offset;
+    FT_UInt    cid_font_name;
+
+  } CFF_FontRecDictRec, *CFF_FontRecDict;
+
+
+  typedef struct  CFF_PrivateRec_
+  {
+    FT_Byte   num_blue_values;
+    FT_Byte   num_other_blues;
+    FT_Byte   num_family_blues;
+    FT_Byte   num_family_other_blues;
+
+    FT_Pos    blue_values[14];
+    FT_Pos    other_blues[10];
+    FT_Pos    family_blues[14];
+    FT_Pos    family_other_blues[10];
+
+    FT_Fixed  blue_scale;
+    FT_Pos    blue_shift;
+    FT_Pos    blue_fuzz;
+    FT_Pos    standard_width;
+    FT_Pos    standard_height;
+
+    FT_Byte   num_snap_widths;
+    FT_Byte   num_snap_heights;
+    FT_Pos    snap_widths[13];
+    FT_Pos    snap_heights[13];
+    FT_Bool   force_bold;
+    FT_Fixed  force_bold_threshold;
+    FT_Int    lenIV;
+    FT_Int    language_group;
+    FT_Fixed  expansion_factor;
+    FT_Long   initial_random_seed;
+    FT_ULong  local_subrs_offset;
+    FT_Pos    default_width;
+    FT_Pos    nominal_width;
+
+  } CFF_PrivateRec, *CFF_Private;
+
+
+  typedef struct  CFF_FDSelectRec_
+  {
+    FT_Byte   format;
+    FT_UInt   range_count;
+
+    /* that's the table, taken from the file `as is' */
+    FT_Byte*  data;
+    FT_UInt   data_size;
+
+    /* small cache for format 3 only */
+    FT_UInt   cache_first;
+    FT_UInt   cache_count;
+    FT_Byte   cache_fd;
+
+  } CFF_FDSelectRec, *CFF_FDSelect;
+
+
+  /* A SubFont packs a font dict and a private dict together.  They are */
+  /* needed to support CID-keyed CFF fonts.                             */
+  typedef struct  CFF_SubFontRec_
+  {
+    CFF_FontRecDictRec  font_dict;
+    CFF_PrivateRec      private_dict;
+
+    CFF_IndexRec        local_subrs_index;
+    FT_Byte**           local_subrs; /* array of pointers into Local Subrs INDEX data */
+
+  } CFF_SubFontRec, *CFF_SubFont;
+
+
+#define CFF_MAX_CID_FONTS  256
+
+
+  typedef struct  CFF_FontRec_
+  {
+    FT_Stream        stream;
+    FT_Memory        memory;
+    FT_UInt          num_faces;
+    FT_UInt          num_glyphs;
+
+    FT_Byte          version_major;
+    FT_Byte          version_minor;
+    FT_Byte          header_size;
+    FT_Byte          absolute_offsize;
+
+
+    CFF_IndexRec     name_index;
+    CFF_IndexRec     top_dict_index;
+    CFF_IndexRec     global_subrs_index;
+
+    CFF_EncodingRec  encoding;
+    CFF_CharsetRec   charset;
+
+    CFF_IndexRec     charstrings_index;
+    CFF_IndexRec     font_dict_index;
+    CFF_IndexRec     private_index;
+    CFF_IndexRec     local_subrs_index;
+
+    FT_String*       font_name;
+
+    /* array of pointers into Global Subrs INDEX data */
+    FT_Byte**        global_subrs;
+
+    /* array of pointers into String INDEX data stored at string_pool */
+    FT_UInt          num_strings;
+    FT_Byte**        strings;
+    FT_Byte*         string_pool;
+
+    CFF_SubFontRec   top_font;
+    FT_UInt          num_subfonts;
+    CFF_SubFont      subfonts[CFF_MAX_CID_FONTS];
+
+    CFF_FDSelectRec  fd_select;
+
+    /* interface to PostScript hinter */
+    PSHinter_Service  pshinter;
+
+    /* interface to Postscript Names service */
+    FT_Service_PsCMaps  psnames;
+
+    /* since version 2.3.0 */
+    PS_FontInfoRec*  font_info;   /* font info dictionary */
+
+    /* since version 2.3.6 */
+    FT_String*       registry;
+    FT_String*       ordering;
+
+  } CFF_FontRec, *CFF_Font;
+
+
+FT_END_HEADER
+
+#endif /* __CFFTYPES_H__ */
+
+
+/* END */
diff --git a/src/cff/module.mk b/src/cff/module.mk
new file mode 100644 (file)
index 0000000..ef1391c
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# FreeType 2 CFF module definition
+#
+
+
+# Copyright 1996-2000, 2006 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.
+
+
+FTMODULE_H_COMMANDS += CFF_DRIVER
+
+define CFF_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, cff_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)cff       $(ECHO_DRIVER_DESC)OpenType fonts with extension *.otf$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/src/cff/rules.mk b/src/cff/rules.mk
new file mode 100644 (file)
index 0000000..ca7aa5d
--- /dev/null
@@ -0,0 +1,73 @@
+#
+# FreeType 2 OpenType/CFF driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003, 2011 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.
+
+
+# OpenType driver directory
+#
+CFF_DIR := $(SRC_DIR)/cff
+
+
+CFF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CFF_DIR))
+
+
+# CFF driver sources (i.e., C files)
+#
+CFF_DRV_SRC := $(CFF_DIR)/cffcmap.c  \
+               $(CFF_DIR)/cffdrivr.c \
+               $(CFF_DIR)/cffgload.c \
+               $(CFF_DIR)/cffload.c  \
+               $(CFF_DIR)/cffobjs.c  \
+               $(CFF_DIR)/cffparse.c \
+               $(CFF_DIR)/cffpic.c
+
+# CFF driver headers
+#
+CFF_DRV_H := $(CFF_DRV_SRC:%.c=%.h) \
+             $(CFF_DIR)/cfferrs.h   \
+             $(CFF_DIR)/cfftoken.h  \
+             $(CFF_DIR)/cfftypes.h
+
+
+# CFF driver object(s)
+#
+#   CFF_DRV_OBJ_M is used during `multi' builds
+#   CFF_DRV_OBJ_S is used during `single' builds
+#
+CFF_DRV_OBJ_M := $(CFF_DRV_SRC:$(CFF_DIR)/%.c=$(OBJ_DIR)/%.$O)
+CFF_DRV_OBJ_S := $(OBJ_DIR)/cff.$O
+
+# CFF driver source file for single build
+#
+CFF_DRV_SRC_S := $(CFF_DIR)/cff.c
+
+
+# CFF driver - single object
+#
+$(CFF_DRV_OBJ_S): $(CFF_DRV_SRC_S) $(CFF_DRV_SRC) $(FREETYPE_H) $(CFF_DRV_H)
+       $(CFF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CFF_DRV_SRC_S))
+
+
+# CFF driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(CFF_DIR)/%.c $(FREETYPE_H) $(CFF_DRV_H)
+       $(CFF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(CFF_DRV_OBJ_S)
+DRV_OBJS_M += $(CFF_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/cid/Jamfile b/src/cid/Jamfile
new file mode 100644 (file)
index 0000000..ebeaed5
--- /dev/null
@@ -0,0 +1,29 @@
+# FreeType 2 src/cid Jamfile
+#
+# Copyright 2001 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) cid ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = cidobjs cidload cidgload cidriver cidparse ;
+  }
+  else
+  {
+    _sources = type1cid ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/cid Jamfile
diff --git a/src/cid/ciderrs.h b/src/cid/ciderrs.h
new file mode 100644 (file)
index 0000000..ef13155
--- /dev/null
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ciderrs.h                                                              */
+/*                                                                         */
+/*    CID error codes (specification only).                                */
+/*                                                                         */
+/*  Copyright 2001, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the CID error enumeration constants.      */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __CIDERRS_H__
+#define __CIDERRS_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  CID_Err_
+#define FT_ERR_BASE    FT_Mod_Err_CID
+
+#include FT_ERRORS_H
+
+#endif /* __CIDERRS_H__ */
+
+
+/* END */
diff --git a/src/cid/cidgload.c b/src/cid/cidgload.c
new file mode 100644 (file)
index 0000000..bd84023
--- /dev/null
@@ -0,0 +1,442 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidgload.c                                                             */
+/*                                                                         */
+/*    CID-keyed Type1 Glyph Loader (body).                                 */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include "cidload.h"
+#include "cidgload.h"
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_OUTLINE_H
+#include FT_INTERNAL_CALC_H
+
+#include "ciderrs.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cidgload
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  cid_load_glyph( T1_Decoder  decoder,
+                  FT_UInt     glyph_index )
+  {
+    CID_Face       face = (CID_Face)decoder->builder.face;
+    CID_FaceInfo   cid  = &face->cid;
+    FT_Byte*       p;
+    FT_UInt        fd_select;
+    FT_Stream      stream       = face->cid_stream;
+    FT_Error       error        = CID_Err_Ok;
+    FT_Byte*       charstring   = 0;
+    FT_Memory      memory       = face->root.memory;
+    FT_ULong       glyph_length = 0;
+    PSAux_Service  psaux        = (PSAux_Service)face->psaux;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    FT_Incremental_InterfaceRec *inc =
+                                  face->root.internal->incremental_interface;
+#endif
+
+
+    FT_TRACE4(( "cid_load_glyph: glyph index %d\n", glyph_index ));
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+    /* For incremental fonts get the character data using */
+    /* the callback function.                             */
+    if ( inc )
+    {
+      FT_Data  glyph_data;
+
+
+      error = inc->funcs->get_glyph_data( inc->object,
+                                          glyph_index, &glyph_data );
+      if ( error )
+        goto Exit;
+
+      p         = (FT_Byte*)glyph_data.pointer;
+      fd_select = (FT_UInt)cid_get_offset( &p, (FT_Byte)cid->fd_bytes );
+
+      if ( glyph_data.length != 0 )
+      {
+        glyph_length = glyph_data.length - cid->fd_bytes;
+        (void)FT_ALLOC( charstring, glyph_length );
+        if ( !error )
+          ft_memcpy( charstring, glyph_data.pointer + cid->fd_bytes,
+                     glyph_length );
+      }
+
+      inc->funcs->free_glyph_data( inc->object, &glyph_data );
+
+      if ( error )
+        goto Exit;
+    }
+
+    else
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+    /* For ordinary fonts read the CID font dictionary index */
+    /* and charstring offset from the CIDMap.                */
+    {
+      FT_UInt   entry_len = cid->fd_bytes + cid->gd_bytes;
+      FT_ULong  off1;
+
+
+      if ( FT_STREAM_SEEK( cid->data_offset + cid->cidmap_offset +
+                           glyph_index * entry_len )               ||
+           FT_FRAME_ENTER( 2 * entry_len )                         )
+        goto Exit;
+
+      p            = (FT_Byte*)stream->cursor;
+      fd_select    = (FT_UInt) cid_get_offset( &p, (FT_Byte)cid->fd_bytes );
+      off1         = (FT_ULong)cid_get_offset( &p, (FT_Byte)cid->gd_bytes );
+      p           += cid->fd_bytes;
+      glyph_length = cid_get_offset( &p, (FT_Byte)cid->gd_bytes ) - off1;
+      FT_FRAME_EXIT();
+
+      if ( fd_select >= (FT_UInt)cid->num_dicts )
+      {
+        error = CID_Err_Invalid_Offset;
+        goto Exit;
+      }
+      if ( glyph_length == 0 )
+        goto Exit;
+      if ( FT_ALLOC( charstring, glyph_length ) )
+        goto Exit;
+      if ( FT_STREAM_READ_AT( cid->data_offset + off1,
+                              charstring, glyph_length ) )
+        goto Exit;
+    }
+
+    /* Now set up the subrs array and parse the charstrings. */
+    {
+      CID_FaceDict  dict;
+      CID_Subrs     cid_subrs = face->subrs + fd_select;
+      FT_Int        cs_offset;
+
+
+      /* Set up subrs */
+      decoder->num_subrs = cid_subrs->num_subrs;
+      decoder->subrs     = cid_subrs->code;
+      decoder->subrs_len = 0;
+
+      /* Set up font matrix */
+      dict                 = cid->font_dicts + fd_select;
+
+      decoder->font_matrix = dict->font_matrix;
+      decoder->font_offset = dict->font_offset;
+      decoder->lenIV       = dict->private_dict.lenIV;
+
+      /* Decode the charstring. */
+
+      /* Adjustment for seed bytes. */
+      cs_offset = ( decoder->lenIV >= 0 ? decoder->lenIV : 0 );
+
+      /* Decrypt only if lenIV >= 0. */
+      if ( decoder->lenIV >= 0 )
+        psaux->t1_decrypt( charstring, glyph_length, 4330 );
+
+      error = decoder->funcs.parse_charstrings(
+                decoder, charstring + cs_offset,
+                (FT_Int)glyph_length - cs_offset );
+    }
+
+    FT_FREE( charstring );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+    /* Incremental fonts can optionally override the metrics. */
+    if ( !error && inc && inc->funcs->get_glyph_metrics )
+    {
+      FT_Incremental_MetricsRec  metrics;
+
+
+      metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x );
+      metrics.bearing_y = 0;
+      metrics.advance   = FIXED_TO_INT( decoder->builder.advance.x );
+      metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y );
+
+      error = inc->funcs->get_glyph_metrics( inc->object,
+                                             glyph_index, FALSE, &metrics );
+
+      decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x );
+      decoder->builder.advance.x      = INT_TO_FIXED( metrics.advance );
+      decoder->builder.advance.y      = INT_TO_FIXED( metrics.advance_v );
+    }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+  Exit:
+    return error;
+  }
+
+
+#if 0
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /**********                                                      *********/
+  /**********                                                      *********/
+  /**********            COMPUTE THE MAXIMUM ADVANCE WIDTH         *********/
+  /**********                                                      *********/
+  /**********    The following code is in charge of computing      *********/
+  /**********    the maximum advance width of the font.  It        *********/
+  /**********    quickly processes each glyph charstring to        *********/
+  /**********    extract the value from either a `sbw' or `seac'   *********/
+  /**********    operator.                                         *********/
+  /**********                                                      *********/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cid_face_compute_max_advance( CID_Face  face,
+                                FT_Int*   max_advance )
+  {
+    FT_Error       error;
+    T1_DecoderRec  decoder;
+    FT_Int         glyph_index;
+
+    PSAux_Service  psaux = (PSAux_Service)face->psaux;
+
+
+    *max_advance = 0;
+
+    /* Initialize load decoder */
+    error = psaux->t1_decoder_funcs->init( &decoder,
+                                           (FT_Face)face,
+                                           0, /* size       */
+                                           0, /* glyph slot */
+                                           0, /* glyph names! XXX */
+                                           0, /* blend == 0 */
+                                           0, /* hinting == 0 */
+                                           cid_load_glyph );
+    if ( error )
+      return error;
+
+    /* TODO: initialize decoder.len_buildchar and decoder.buildchar */
+    /*       if we ever support CID-keyed multiple master fonts     */
+
+    decoder.builder.metrics_only = 1;
+    decoder.builder.load_points  = 0;
+
+    /* for each glyph, parse the glyph charstring and extract */
+    /* the advance width                                      */
+    for ( glyph_index = 0; glyph_index < face->root.num_glyphs;
+          glyph_index++ )
+    {
+      /* now get load the unscaled outline */
+      error = cid_load_glyph( &decoder, glyph_index );
+      /* ignore the error if one occurred - skip to next glyph */
+    }
+
+    *max_advance = FIXED_TO_INT( decoder.builder.advance.x );
+
+    psaux->t1_decoder_funcs->done( &decoder );
+
+    return CID_Err_Ok;
+  }
+
+
+#endif /* 0 */
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cid_slot_load_glyph( FT_GlyphSlot  cidglyph,      /* CID_GlyphSlot */
+                       FT_Size       cidsize,       /* CID_Size      */
+                       FT_UInt       glyph_index,
+                       FT_Int32      load_flags )
+  {
+    CID_GlyphSlot  glyph = (CID_GlyphSlot)cidglyph;
+    FT_Error       error;
+    T1_DecoderRec  decoder;
+    CID_Face       face = (CID_Face)cidglyph->face;
+    FT_Bool        hinting;
+
+    PSAux_Service  psaux = (PSAux_Service)face->psaux;
+    FT_Matrix      font_matrix;
+    FT_Vector      font_offset;
+
+
+    if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
+    {
+      error = CID_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    if ( load_flags & FT_LOAD_NO_RECURSE )
+      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
+
+    glyph->x_scale = cidsize->metrics.x_scale;
+    glyph->y_scale = cidsize->metrics.y_scale;
+
+    cidglyph->outline.n_points   = 0;
+    cidglyph->outline.n_contours = 0;
+
+    hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 &&
+                       ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
+
+    cidglyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+    error = psaux->t1_decoder_funcs->init( &decoder,
+                                           cidglyph->face,
+                                           cidsize,
+                                           cidglyph,
+                                           0, /* glyph names -- XXX */
+                                           0, /* blend == 0 */
+                                           hinting,
+                                           FT_LOAD_TARGET_MODE( load_flags ),
+                                           cid_load_glyph );
+    if ( error )
+      goto Exit;
+
+    /* TODO: initialize decoder.len_buildchar and decoder.buildchar */
+    /*       if we ever support CID-keyed multiple master fonts     */
+
+    /* set up the decoder */
+    decoder.builder.no_recurse = FT_BOOL(
+      ( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ) );
+
+    error = cid_load_glyph( &decoder, glyph_index );
+    if ( error )
+      goto Exit;
+
+    font_matrix = decoder.font_matrix;
+    font_offset = decoder.font_offset;
+
+    /* save new glyph tables */
+    psaux->t1_decoder_funcs->done( &decoder );
+
+    /* now set the metrics -- this is rather simple, as    */
+    /* the left side bearing is the xMin, and the top side */
+    /* bearing the yMax                                    */
+    cidglyph->outline.flags &= FT_OUTLINE_OWNER;
+    cidglyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;
+
+    /* for composite glyphs, return only left side bearing and */
+    /* advance width                                           */
+    if ( load_flags & FT_LOAD_NO_RECURSE )
+    {
+      FT_Slot_Internal  internal = cidglyph->internal;
+
+
+      cidglyph->metrics.horiBearingX =
+        FIXED_TO_INT( decoder.builder.left_bearing.x );
+      cidglyph->metrics.horiAdvance =
+        FIXED_TO_INT( decoder.builder.advance.x );
+
+      internal->glyph_matrix      = font_matrix;
+      internal->glyph_delta       = font_offset;
+      internal->glyph_transformed = 1;
+    }
+    else
+    {
+      FT_BBox            cbox;
+      FT_Glyph_Metrics*  metrics = &cidglyph->metrics;
+      FT_Vector          advance;
+
+
+      /* copy the _unscaled_ advance width */
+      metrics->horiAdvance =
+        FIXED_TO_INT( decoder.builder.advance.x );
+      cidglyph->linearHoriAdvance =
+        FIXED_TO_INT( decoder.builder.advance.x );
+      cidglyph->internal->glyph_transformed = 0;
+
+      /* make up vertical ones */
+      metrics->vertAdvance        = ( face->cid.font_bbox.yMax -
+                                      face->cid.font_bbox.yMin ) >> 16;
+      cidglyph->linearVertAdvance = metrics->vertAdvance;
+
+      cidglyph->format            = FT_GLYPH_FORMAT_OUTLINE;
+
+      if ( cidsize->metrics.y_ppem < 24 )
+        cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
+      /* apply the font matrix */
+      FT_Outline_Transform( &cidglyph->outline, &font_matrix );
+
+      FT_Outline_Translate( &cidglyph->outline,
+                            font_offset.x,
+                            font_offset.y );
+
+      advance.x = metrics->horiAdvance;
+      advance.y = 0;
+      FT_Vector_Transform( &advance, &font_matrix );
+      metrics->horiAdvance = advance.x + font_offset.x;
+
+      advance.x = 0;
+      advance.y = metrics->vertAdvance;
+      FT_Vector_Transform( &advance, &font_matrix );
+      metrics->vertAdvance = advance.y + font_offset.y;
+
+      if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )
+      {
+        /* scale the outline and the metrics */
+        FT_Int       n;
+        FT_Outline*  cur = decoder.builder.base;
+        FT_Vector*   vec = cur->points;
+        FT_Fixed     x_scale = glyph->x_scale;
+        FT_Fixed     y_scale = glyph->y_scale;
+
+
+        /* First of all, scale the points */
+        if ( !hinting || !decoder.builder.hints_funcs )
+          for ( n = cur->n_points; n > 0; n--, vec++ )
+          {
+            vec->x = FT_MulFix( vec->x, x_scale );
+            vec->y = FT_MulFix( vec->y, y_scale );
+          }
+
+        /* Then scale the metrics */
+        metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
+        metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
+      }
+
+      /* compute the other metrics */
+      FT_Outline_Get_CBox( &cidglyph->outline, &cbox );
+
+      metrics->width  = cbox.xMax - cbox.xMin;
+      metrics->height = cbox.yMax - cbox.yMin;
+
+      metrics->horiBearingX = cbox.xMin;
+      metrics->horiBearingY = cbox.yMax;
+
+      if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+      {
+        /* make up vertical ones */
+        ft_synthesize_vertical_metrics( metrics,
+                                        metrics->vertAdvance );
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+/* END */
diff --git a/src/cid/cidgload.h b/src/cid/cidgload.h
new file mode 100644 (file)
index 0000000..a0a91bf
--- /dev/null
@@ -0,0 +1,51 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidgload.h                                                             */
+/*                                                                         */
+/*    OpenType Glyph Loader (specification).                               */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2004 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CIDGLOAD_H__
+#define __CIDGLOAD_H__
+
+
+#include <ft2build.h>
+#include "cidobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#if 0
+
+  /* Compute the maximum advance width of a font through quick parsing */
+  FT_LOCAL( FT_Error )
+  cid_face_compute_max_advance( CID_Face  face,
+                                FT_Int*   max_advance );
+
+#endif /* 0 */
+
+  FT_LOCAL( FT_Error )
+  cid_slot_load_glyph( FT_GlyphSlot  glyph,         /* CID_Glyph_Slot */
+                       FT_Size       size,          /* CID_Size       */
+                       FT_UInt       glyph_index,
+                       FT_Int32      load_flags );
+
+
+FT_END_HEADER
+
+#endif /* __CIDGLOAD_H__ */
+
+
+/* END */
diff --git a/src/cid/cidload.c b/src/cid/cidload.c
new file mode 100644 (file)
index 0000000..3b840b7
--- /dev/null
@@ -0,0 +1,690 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidload.c                                                              */
+/*                                                                         */
+/*    CID-keyed Type1 font loader (body).                                  */
+/*                                                                         */
+/*  Copyright 1996-2006, 2009, 2011-2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_CONFIG_CONFIG_H
+#include FT_MULTIPLE_MASTERS_H
+#include FT_INTERNAL_TYPE1_TYPES_H
+
+#include "cidload.h"
+
+#include "ciderrs.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cidload
+
+
+  /* read a single offset */
+  FT_LOCAL_DEF( FT_Long )
+  cid_get_offset( FT_Byte*  *start,
+                  FT_Byte    offsize )
+  {
+    FT_Long   result;
+    FT_Byte*  p = *start;
+
+
+    for ( result = 0; offsize > 0; offsize-- )
+    {
+      result <<= 8;
+      result  |= *p++;
+    }
+
+    *start = p;
+    return result;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    TYPE 1 SYMBOL PARSING                      *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  static FT_Error
+  cid_load_keyword( CID_Face        face,
+                    CID_Loader*     loader,
+                    const T1_Field  keyword )
+  {
+    FT_Error      error;
+    CID_Parser*   parser = &loader->parser;
+    FT_Byte*      object;
+    void*         dummy_object;
+    CID_FaceInfo  cid = &face->cid;
+
+
+    /* if the keyword has a dedicated callback, call it */
+    if ( keyword->type == T1_FIELD_TYPE_CALLBACK )
+    {
+      keyword->reader( (FT_Face)face, parser );
+      error = parser->root.error;
+      goto Exit;
+    }
+
+    /* we must now compute the address of our target object */
+    switch ( keyword->location )
+    {
+    case T1_FIELD_LOCATION_CID_INFO:
+      object = (FT_Byte*)cid;
+      break;
+
+    case T1_FIELD_LOCATION_FONT_INFO:
+      object = (FT_Byte*)&cid->font_info;
+      break;
+
+    case T1_FIELD_LOCATION_FONT_EXTRA:
+      object = (FT_Byte*)&face->font_extra;
+      break;
+
+    case T1_FIELD_LOCATION_BBOX:
+      object = (FT_Byte*)&cid->font_bbox;
+      break;
+
+    default:
+      {
+        CID_FaceDict  dict;
+
+
+        if ( parser->num_dict < 0 || parser->num_dict >= cid->num_dicts )
+        {
+          FT_ERROR(( "cid_load_keyword: invalid use of `%s'\n",
+                     keyword->ident ));
+          error = CID_Err_Syntax_Error;
+          goto Exit;
+        }
+
+        dict = cid->font_dicts + parser->num_dict;
+        switch ( keyword->location )
+        {
+        case T1_FIELD_LOCATION_PRIVATE:
+          object = (FT_Byte*)&dict->private_dict;
+          break;
+
+        default:
+          object = (FT_Byte*)dict;
+        }
+      }
+    }
+
+    dummy_object = object;
+
+    /* now, load the keyword data in the object's field(s) */
+    if ( keyword->type == T1_FIELD_TYPE_INTEGER_ARRAY ||
+         keyword->type == T1_FIELD_TYPE_FIXED_ARRAY   )
+      error = cid_parser_load_field_table( &loader->parser, keyword,
+                                           &dummy_object );
+    else
+      error = cid_parser_load_field( &loader->parser,
+                                     keyword, &dummy_object );
+  Exit:
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  cid_parse_font_matrix( CID_Face     face,
+                         CID_Parser*  parser )
+  {
+    FT_Matrix*    matrix;
+    FT_Vector*    offset;
+    CID_FaceDict  dict;
+    FT_Face       root = (FT_Face)&face->root;
+    FT_Fixed      temp[6];
+    FT_Fixed      temp_scale;
+
+
+    if ( parser->num_dict >= 0 && parser->num_dict < face->cid.num_dicts )
+    {
+      dict   = face->cid.font_dicts + parser->num_dict;
+      matrix = &dict->font_matrix;
+      offset = &dict->font_offset;
+
+      (void)cid_parser_to_fixed_array( parser, 6, temp, 3 );
+
+      temp_scale = FT_ABS( temp[3] );
+
+      /* Set units per EM based on FontMatrix values.  We set the value to */
+      /* `1000/temp_scale', because temp_scale was already multiplied by   */
+      /* 1000 (in `t1_tofixed', from psobjs.c).                            */
+      root->units_per_EM = (FT_UShort)( FT_DivFix( 0x10000L,
+                                        FT_DivFix( temp_scale, 1000 ) ) );
+
+      /* we need to scale the values by 1.0/temp[3] */
+      if ( temp_scale != 0x10000L )
+      {
+        temp[0] = FT_DivFix( temp[0], temp_scale );
+        temp[1] = FT_DivFix( temp[1], temp_scale );
+        temp[2] = FT_DivFix( temp[2], temp_scale );
+        temp[4] = FT_DivFix( temp[4], temp_scale );
+        temp[5] = FT_DivFix( temp[5], temp_scale );
+        temp[3] = 0x10000L;
+      }
+
+      matrix->xx = temp[0];
+      matrix->yx = temp[1];
+      matrix->xy = temp[2];
+      matrix->yy = temp[3];
+
+      /* note that the font offsets are expressed in integer font units */
+      offset->x  = temp[4] >> 16;
+      offset->y  = temp[5] >> 16;
+    }
+
+    return CID_Err_Ok;      /* this is a callback function; */
+                            /* we must return an error code */
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  parse_fd_array( CID_Face     face,
+                  CID_Parser*  parser )
+  {
+    CID_FaceInfo  cid    = &face->cid;
+    FT_Memory     memory = face->root.memory;
+    FT_Error      error  = CID_Err_Ok;
+    FT_Long       num_dicts;
+
+
+    num_dicts = cid_parser_to_int( parser );
+
+    if ( !cid->font_dicts )
+    {
+      FT_Int  n;
+
+
+      if ( FT_NEW_ARRAY( cid->font_dicts, num_dicts ) )
+        goto Exit;
+
+      cid->num_dicts = (FT_UInt)num_dicts;
+
+      /* don't forget to set a few defaults */
+      for ( n = 0; n < cid->num_dicts; n++ )
+      {
+        CID_FaceDict  dict = cid->font_dicts + n;
+
+
+        /* default value for lenIV */
+        dict->private_dict.lenIV = 4;
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* by mistake, `expansion_factor' appears both in PS_PrivateRec */
+  /* and CID_FaceDictRec (both are public header files and can't  */
+  /* changed); we simply copy the value                           */
+
+  FT_CALLBACK_DEF( FT_Error )
+  parse_expansion_factor( CID_Face     face,
+                          CID_Parser*  parser )
+  {
+    CID_FaceDict  dict;
+
+
+    if ( parser->num_dict >= 0 && parser->num_dict < face->cid.num_dicts )
+    {
+      dict = face->cid.font_dicts + parser->num_dict;
+
+      dict->expansion_factor              = cid_parser_to_fixed( parser, 0 );
+      dict->private_dict.expansion_factor = dict->expansion_factor;
+    }
+
+    return CID_Err_Ok;
+  }
+
+
+  static
+  const T1_FieldRec  cid_field_records[] =
+  {
+
+#include "cidtoken.h"
+
+    T1_FIELD_CALLBACK( "FDArray",         parse_fd_array, 0 )
+    T1_FIELD_CALLBACK( "FontMatrix",      cid_parse_font_matrix, 0 )
+    T1_FIELD_CALLBACK( "ExpansionFactor", parse_expansion_factor, 0 )
+
+    { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }
+  };
+
+
+  static FT_Error
+  cid_parse_dict( CID_Face     face,
+                  CID_Loader*  loader,
+                  FT_Byte*     base,
+                  FT_Long      size )
+  {
+    CID_Parser*  parser = &loader->parser;
+
+
+    parser->root.cursor = base;
+    parser->root.limit  = base + size;
+    parser->root.error  = CID_Err_Ok;
+
+    {
+      FT_Byte*  cur   = base;
+      FT_Byte*  limit = cur + size;
+
+
+      for (;;)
+      {
+        FT_Byte*  newlimit;
+
+
+        parser->root.cursor = cur;
+        cid_parser_skip_spaces( parser );
+
+        if ( parser->root.cursor >= limit )
+          newlimit = limit - 1 - 17;
+        else
+          newlimit = parser->root.cursor - 17;
+
+        /* look for `%ADOBeginFontDict' */
+        for ( ; cur < newlimit; cur++ )
+        {
+          if ( *cur == '%'                                            &&
+               ft_strncmp( (char*)cur, "%ADOBeginFontDict", 17 ) == 0 )
+          {
+            /* if /FDArray was found, then cid->num_dicts is > 0, and */
+            /* we can start increasing parser->num_dict               */
+            if ( face->cid.num_dicts > 0 )
+              parser->num_dict++;
+          }
+        }
+
+        cur = parser->root.cursor;
+        /* no error can occur in cid_parser_skip_spaces */
+        if ( cur >= limit )
+          break;
+
+        cid_parser_skip_PS_token( parser );
+        if ( parser->root.cursor >= limit || parser->root.error )
+          break;
+
+        /* look for immediates */
+        if ( *cur == '/' && cur + 2 < limit )
+        {
+          FT_PtrDist  len;
+
+
+          cur++;
+          len = parser->root.cursor - cur;
+
+          if ( len > 0 && len < 22 )
+          {
+            /* now compare the immediate name to the keyword table */
+            T1_Field  keyword = (T1_Field)cid_field_records;
+
+
+            for (;;)
+            {
+              FT_Byte*  name;
+
+
+              name = (FT_Byte*)keyword->ident;
+              if ( !name )
+                break;
+
+              if ( cur[0] == name[0]                                 &&
+                   len == (FT_PtrDist)ft_strlen( (const char*)name ) )
+              {
+                FT_PtrDist  n;
+
+
+                for ( n = 1; n < len; n++ )
+                  if ( cur[n] != name[n] )
+                    break;
+
+                if ( n >= len )
+                {
+                  /* we found it - run the parsing callback */
+                  parser->root.error = cid_load_keyword( face,
+                                                         loader,
+                                                         keyword );
+                  if ( parser->root.error )
+                    return parser->root.error;
+                  break;
+                }
+              }
+              keyword++;
+            }
+          }
+        }
+
+        cur = parser->root.cursor;
+      }
+    }
+    return parser->root.error;
+  }
+
+
+  /* read the subrmap and the subrs of each font dict */
+  static FT_Error
+  cid_read_subrs( CID_Face  face )
+  {
+    CID_FaceInfo   cid    = &face->cid;
+    FT_Memory      memory = face->root.memory;
+    FT_Stream      stream = face->cid_stream;
+    FT_Error       error;
+    FT_Int         n;
+    CID_Subrs      subr;
+    FT_UInt        max_offsets = 0;
+    FT_ULong*      offsets = 0;
+    PSAux_Service  psaux = (PSAux_Service)face->psaux;
+
+
+    if ( FT_NEW_ARRAY( face->subrs, cid->num_dicts ) )
+      goto Exit;
+
+    subr = face->subrs;
+    for ( n = 0; n < cid->num_dicts; n++, subr++ )
+    {
+      CID_FaceDict  dict  = cid->font_dicts + n;
+      FT_Int        lenIV = dict->private_dict.lenIV;
+      FT_UInt       count, num_subrs = dict->num_subrs;
+      FT_ULong      data_len;
+      FT_Byte*      p;
+
+
+      /* Check for possible overflow. */
+      if ( num_subrs == FT_UINT_MAX )
+      {
+        error = CID_Err_Syntax_Error;
+        goto Fail;
+      }
+
+      /* reallocate offsets array if needed */
+      if ( num_subrs + 1 > max_offsets )
+      {
+        FT_UInt  new_max = FT_PAD_CEIL( num_subrs + 1, 4 );
+
+
+        if ( new_max <= max_offsets )
+        {
+          error = CID_Err_Syntax_Error;
+          goto Fail;
+        }
+
+        if ( FT_RENEW_ARRAY( offsets, max_offsets, new_max ) )
+          goto Fail;
+
+        max_offsets = new_max;
+      }
+
+      /* read the subrmap's offsets */
+      if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset ) ||
+           FT_FRAME_ENTER( ( num_subrs + 1 ) * dict->sd_bytes )      )
+        goto Fail;
+
+      p = (FT_Byte*)stream->cursor;
+      for ( count = 0; count <= num_subrs; count++ )
+        offsets[count] = cid_get_offset( &p, (FT_Byte)dict->sd_bytes );
+
+      FT_FRAME_EXIT();
+
+      /* offsets must be ordered */
+      for ( count = 1; count <= num_subrs; count++ )
+        if ( offsets[count - 1] > offsets[count] )
+          goto Fail;
+
+      /* now, compute the size of subrs charstrings, */
+      /* allocate, and read them                     */
+      data_len = offsets[num_subrs] - offsets[0];
+
+      if ( FT_NEW_ARRAY( subr->code, num_subrs + 1 ) ||
+               FT_ALLOC( subr->code[0], data_len )   )
+        goto Fail;
+
+      if ( FT_STREAM_SEEK( cid->data_offset + offsets[0] ) ||
+           FT_STREAM_READ( subr->code[0], data_len )  )
+        goto Fail;
+
+      /* set up pointers */
+      for ( count = 1; count <= num_subrs; count++ )
+      {
+        FT_ULong  len;
+
+
+        len               = offsets[count] - offsets[count - 1];
+        subr->code[count] = subr->code[count - 1] + len;
+      }
+
+      /* decrypt subroutines, but only if lenIV >= 0 */
+      if ( lenIV >= 0 )
+      {
+        for ( count = 0; count < num_subrs; count++ )
+        {
+          FT_ULong  len;
+
+
+          len = offsets[count + 1] - offsets[count];
+          psaux->t1_decrypt( subr->code[count], len, 4330 );
+        }
+      }
+
+      subr->num_subrs = num_subrs;
+    }
+
+  Exit:
+    FT_FREE( offsets );
+    return error;
+
+  Fail:
+    if ( face->subrs )
+    {
+      for ( n = 0; n < cid->num_dicts; n++ )
+      {
+        if ( face->subrs[n].code )
+          FT_FREE( face->subrs[n].code[0] );
+
+        FT_FREE( face->subrs[n].code );
+      }
+      FT_FREE( face->subrs );
+    }
+    goto Exit;
+  }
+
+
+  static void
+  cid_init_loader( CID_Loader*  loader,
+                   CID_Face     face )
+  {
+    FT_UNUSED( face );
+
+    FT_MEM_ZERO( loader, sizeof ( *loader ) );
+  }
+
+
+  static  void
+  cid_done_loader( CID_Loader*  loader )
+  {
+    CID_Parser*  parser = &loader->parser;
+
+
+    /* finalize parser */
+    cid_parser_done( parser );
+  }
+
+
+  static FT_Error
+  cid_hex_to_binary( FT_Byte*  data,
+                     FT_Long   data_len,
+                     FT_ULong  offset,
+                     CID_Face  face )
+  {
+    FT_Stream  stream = face->root.stream;
+    FT_Error   error;
+
+    FT_Byte    buffer[256];
+    FT_Byte   *p, *plimit;
+    FT_Byte   *d, *dlimit;
+    FT_Byte    val;
+
+    FT_Bool    upper_nibble, done;
+
+
+    if ( FT_STREAM_SEEK( offset ) )
+      goto Exit;
+
+    d      = data;
+    dlimit = d + data_len;
+    p      = buffer;
+    plimit = p;
+
+    upper_nibble = 1;
+    done         = 0;
+
+    while ( d < dlimit )
+    {
+      if ( p >= plimit )
+      {
+        FT_ULong  oldpos = FT_STREAM_POS();
+        FT_ULong  size   = stream->size - oldpos;
+
+
+        if ( size == 0 )
+        {
+          error = CID_Err_Syntax_Error;
+          goto Exit;
+        }
+
+        if ( FT_STREAM_READ( buffer, 256 > size ? size : 256 ) )
+          goto Exit;
+        p      = buffer;
+        plimit = p + FT_STREAM_POS() - oldpos;
+      }
+
+      if ( ft_isdigit( *p ) )
+        val = (FT_Byte)( *p - '0' );
+      else if ( *p >= 'a' && *p <= 'f' )
+        val = (FT_Byte)( *p - 'a' );
+      else if ( *p >= 'A' && *p <= 'F' )
+        val = (FT_Byte)( *p - 'A' + 10 );
+      else if ( *p == ' '  ||
+                *p == '\t' ||
+                *p == '\r' ||
+                *p == '\n' ||
+                *p == '\f' ||
+                *p == '\0' )
+      {
+        p++;
+        continue;
+      }
+      else if ( *p == '>' )
+      {
+        val  = 0;
+        done = 1;
+      }
+      else
+      {
+        error = CID_Err_Syntax_Error;
+        goto Exit;
+      }
+
+      if ( upper_nibble )
+        *d = (FT_Byte)( val << 4 );
+      else
+      {
+        *d = (FT_Byte)( *d + val );
+        d++;
+      }
+
+      upper_nibble = (FT_Byte)( 1 - upper_nibble );
+
+      if ( done )
+        break;
+
+      p++;
+    }
+
+    error = CID_Err_Ok;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cid_face_open( CID_Face  face,
+                 FT_Int    face_index )
+  {
+    CID_Loader   loader;
+    CID_Parser*  parser;
+    FT_Memory    memory = face->root.memory;
+    FT_Error     error;
+
+
+    cid_init_loader( &loader, face );
+
+    parser = &loader.parser;
+    error = cid_parser_new( parser, face->root.stream, face->root.memory,
+                            (PSAux_Service)face->psaux );
+    if ( error )
+      goto Exit;
+
+    error = cid_parse_dict( face, &loader,
+                            parser->postscript,
+                            parser->postscript_len );
+    if ( error )
+      goto Exit;
+
+    if ( face_index < 0 )
+      goto Exit;
+
+    if ( FT_NEW( face->cid_stream ) )
+      goto Exit;
+
+    if ( parser->binary_length )
+    {
+      /* we must convert the data section from hexadecimal to binary */
+      if ( FT_ALLOC( face->binary_data, parser->binary_length )         ||
+           cid_hex_to_binary( face->binary_data, parser->binary_length,
+                              parser->data_offset, face )               )
+        goto Exit;
+
+      FT_Stream_OpenMemory( face->cid_stream,
+                            face->binary_data, parser->binary_length );
+      face->cid.data_offset = 0;
+    }
+    else
+    {
+      *face->cid_stream     = *face->root.stream;
+      face->cid.data_offset = loader.parser.data_offset;
+    }
+
+    error = cid_read_subrs( face );
+
+  Exit:
+    cid_done_loader( &loader );
+    return error;
+  }
+
+
+/* END */
diff --git a/src/cid/cidload.h b/src/cid/cidload.h
new file mode 100644 (file)
index 0000000..8c172ff
--- /dev/null
@@ -0,0 +1,53 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidload.h                                                              */
+/*                                                                         */
+/*    CID-keyed Type1 font loader (specification).                         */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CIDLOAD_H__
+#define __CIDLOAD_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_STREAM_H
+#include "cidparse.h"
+
+
+FT_BEGIN_HEADER
+
+
+  typedef struct  CID_Loader_
+  {
+    CID_Parser  parser;          /* parser used to read the stream */
+    FT_Int      num_chars;       /* number of characters in encoding */
+
+  } CID_Loader;
+
+
+  FT_LOCAL( FT_Long )
+  cid_get_offset( FT_Byte**  start,
+                  FT_Byte    offsize );
+
+  FT_LOCAL( FT_Error )
+  cid_face_open( CID_Face  face,
+                 FT_Int    face_index );
+
+
+FT_END_HEADER
+
+#endif /* __CIDLOAD_H__ */
+
+
+/* END */
diff --git a/src/cid/cidobjs.c b/src/cid/cidobjs.c
new file mode 100644 (file)
index 0000000..cc2a200
--- /dev/null
@@ -0,0 +1,491 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidobjs.c                                                              */
+/*                                                                         */
+/*    CID objects manager (body).                                          */
+/*                                                                         */
+/*  Copyright 1996-2006, 2008, 2010-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+
+#include "cidgload.h"
+#include "cidload.h"
+
+#include FT_SERVICE_POSTSCRIPT_CMAPS_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+#include FT_INTERNAL_POSTSCRIPT_HINTS_H
+
+#include "ciderrs.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cidobjs
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                            SLOT  FUNCTIONS                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  cid_slot_done( FT_GlyphSlot  slot )
+  {
+    slot->internal->glyph_hints = 0;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cid_slot_init( FT_GlyphSlot  slot )
+  {
+    CID_Face          face;
+    PSHinter_Service  pshinter;
+
+
+    face     = (CID_Face)slot->face;
+    pshinter = (PSHinter_Service)face->pshinter;
+
+    if ( pshinter )
+    {
+      FT_Module  module;
+
+
+      module = FT_Get_Module( slot->face->driver->root.library,
+                              "pshinter" );
+      if ( module )
+      {
+        T1_Hints_Funcs  funcs;
+
+
+        funcs = pshinter->get_t1_funcs( module );
+        slot->internal->glyph_hints = (void*)funcs;
+      }
+    }
+
+    return 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                           SIZE  FUNCTIONS                             */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static PSH_Globals_Funcs
+  cid_size_get_globals_funcs( CID_Size  size )
+  {
+    CID_Face          face     = (CID_Face)size->root.face;
+    PSHinter_Service  pshinter = (PSHinter_Service)face->pshinter;
+    FT_Module         module;
+
+
+    module = FT_Get_Module( size->root.face->driver->root.library,
+                            "pshinter" );
+    return ( module && pshinter && pshinter->get_globals_funcs )
+           ? pshinter->get_globals_funcs( module )
+           : 0;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cid_size_done( FT_Size  cidsize )         /* CID_Size */
+  {
+    CID_Size  size = (CID_Size)cidsize;
+
+
+    if ( cidsize->internal )
+    {
+      PSH_Globals_Funcs  funcs;
+
+
+      funcs = cid_size_get_globals_funcs( size );
+      if ( funcs )
+        funcs->destroy( (PSH_Globals)cidsize->internal );
+
+      cidsize->internal = 0;
+    }
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cid_size_init( FT_Size  cidsize )     /* CID_Size */
+  {
+    CID_Size           size  = (CID_Size)cidsize;
+    FT_Error           error = CID_Err_Ok;
+    PSH_Globals_Funcs  funcs = cid_size_get_globals_funcs( size );
+
+
+    if ( funcs )
+    {
+      PSH_Globals   globals;
+      CID_Face      face = (CID_Face)cidsize->face;
+      CID_FaceDict  dict = face->cid.font_dicts + face->root.face_index;
+      PS_Private    priv = &dict->private_dict;
+
+
+      error = funcs->create( cidsize->face->memory, priv, &globals );
+      if ( !error )
+        cidsize->internal = (FT_Size_Internal)(void*)globals;
+    }
+
+    return error;
+  }
+
+
+  FT_LOCAL( FT_Error )
+  cid_size_request( FT_Size          size,
+                    FT_Size_Request  req )
+  {
+    PSH_Globals_Funcs  funcs;
+
+
+    FT_Request_Metrics( size->face, req );
+
+    funcs = cid_size_get_globals_funcs( (CID_Size)size );
+
+    if ( funcs )
+      funcs->set_scale( (PSH_Globals)size->internal,
+                        size->metrics.x_scale,
+                        size->metrics.y_scale,
+                        0, 0 );
+
+    return CID_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                           FACE  FUNCTIONS                             */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cid_face_done                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalizes a given face object.                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A pointer to the face object to destroy.                   */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  cid_face_done( FT_Face  cidface )         /* CID_Face */
+  {
+    CID_Face      face = (CID_Face)cidface;
+    FT_Memory     memory;
+    CID_FaceInfo  cid;
+    PS_FontInfo   info;
+
+
+    if ( !face )
+      return;
+
+    cid    = &face->cid;
+    info   = &cid->font_info;
+    memory = cidface->memory;
+
+    /* release subrs */
+    if ( face->subrs )
+    {
+      FT_Int  n;
+
+
+      for ( n = 0; n < cid->num_dicts; n++ )
+      {
+        CID_Subrs  subr = face->subrs + n;
+
+
+        if ( subr->code )
+        {
+          FT_FREE( subr->code[0] );
+          FT_FREE( subr->code );
+        }
+      }
+
+      FT_FREE( face->subrs );
+    }
+
+    /* release FontInfo strings */
+    FT_FREE( info->version );
+    FT_FREE( info->notice );
+    FT_FREE( info->full_name );
+    FT_FREE( info->family_name );
+    FT_FREE( info->weight );
+
+    /* release font dictionaries */
+    FT_FREE( cid->font_dicts );
+    cid->num_dicts = 0;
+
+    /* release other strings */
+    FT_FREE( cid->cid_font_name );
+    FT_FREE( cid->registry );
+    FT_FREE( cid->ordering );
+
+    cidface->family_name = 0;
+    cidface->style_name  = 0;
+
+    FT_FREE( face->binary_data );
+    FT_FREE( face->cid_stream );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cid_face_init                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a given CID face object.                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream     :: The source font stream.                              */
+  /*                                                                       */
+  /*    face_index :: The index of the font face in the resource.          */
+  /*                                                                       */
+  /*    num_params :: Number of additional generic parameters.  Ignored.   */
+  /*                                                                       */
+  /*    params     :: Additional generic parameters.  Ignored.             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: The newly built face object.                         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  cid_face_init( FT_Stream      stream,
+                 FT_Face        cidface,        /* CID_Face */
+                 FT_Int         face_index,
+                 FT_Int         num_params,
+                 FT_Parameter*  params )
+  {
+    CID_Face          face = (CID_Face)cidface;
+    FT_Error          error;
+    PSAux_Service     psaux;
+    PSHinter_Service  pshinter;
+
+    FT_UNUSED( num_params );
+    FT_UNUSED( params );
+    FT_UNUSED( stream );
+
+
+    cidface->num_faces = 1;
+
+    psaux = (PSAux_Service)face->psaux;
+    if ( !psaux )
+    {
+      psaux = (PSAux_Service)FT_Get_Module_Interface(
+                FT_FACE_LIBRARY( face ), "psaux" );
+
+      if ( !psaux )
+      {
+        FT_ERROR(( "cid_face_init: cannot access `psaux' module\n" ));
+        error = CID_Err_Missing_Module;
+        goto Exit;
+      }
+
+      face->psaux = psaux;
+    }
+
+    pshinter = (PSHinter_Service)face->pshinter;
+    if ( !pshinter )
+    {
+      pshinter = (PSHinter_Service)FT_Get_Module_Interface(
+                   FT_FACE_LIBRARY( face ), "pshinter" );
+
+      face->pshinter = pshinter;
+    }
+
+    FT_TRACE2(( "CID driver\n" ));
+
+    /* open the tokenizer; this will also check the font format */
+    if ( FT_STREAM_SEEK( 0 ) )
+      goto Exit;
+
+    error = cid_face_open( face, face_index );
+    if ( error )
+      goto Exit;
+
+    /* if we just wanted to check the format, leave successfully now */
+    if ( face_index < 0 )
+      goto Exit;
+
+    /* check the face index */
+    /* XXX: handle CID fonts with more than a single face */
+    if ( face_index != 0 )
+    {
+      FT_ERROR(( "cid_face_init: invalid face index\n" ));
+      error = CID_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    /* now load the font program into the face object */
+
+    /* initialize the face object fields */
+
+    /* set up root face fields */
+    {
+      CID_FaceInfo  cid  = &face->cid;
+      PS_FontInfo   info = &cid->font_info;
+
+
+      cidface->num_glyphs   = cid->cid_count;
+      cidface->num_charmaps = 0;
+
+      cidface->face_index = face_index;
+      cidface->face_flags = FT_FACE_FLAG_SCALABLE   | /* scalable outlines */
+                            FT_FACE_FLAG_HORIZONTAL | /* horizontal data   */
+                            FT_FACE_FLAG_HINTER;      /* has native hinter */
+
+      if ( info->is_fixed_pitch )
+        cidface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+      /* XXX: TODO: add kerning with .afm support */
+
+      /* get style name -- be careful, some broken fonts only */
+      /* have a /FontName dictionary entry!                   */
+      cidface->family_name = info->family_name;
+      /* assume "Regular" style if we don't know better */
+      cidface->style_name = (char *)"Regular";
+      if ( cidface->family_name )
+      {
+        char*  full   = info->full_name;
+        char*  family = cidface->family_name;
+
+
+        if ( full )
+        {
+          while ( *full )
+          {
+            if ( *full == *family )
+            {
+              family++;
+              full++;
+            }
+            else
+            {
+              if ( *full == ' ' || *full == '-' )
+                full++;
+              else if ( *family == ' ' || *family == '-' )
+                family++;
+              else
+              {
+                if ( !*family )
+                  cidface->style_name = full;
+                break;
+              }
+            }
+          }
+        }
+      }
+      else
+      {
+        /* do we have a `/FontName'? */
+        if ( cid->cid_font_name )
+          cidface->family_name = cid->cid_font_name;
+      }
+
+      /* compute style flags */
+      cidface->style_flags = 0;
+      if ( info->italic_angle )
+        cidface->style_flags |= FT_STYLE_FLAG_ITALIC;
+      if ( info->weight )
+      {
+        if ( !ft_strcmp( info->weight, "Bold"  ) ||
+             !ft_strcmp( info->weight, "Black" ) )
+          cidface->style_flags |= FT_STYLE_FLAG_BOLD;
+      }
+
+      /* no embedded bitmap support */
+      cidface->num_fixed_sizes = 0;
+      cidface->available_sizes = 0;
+
+      cidface->bbox.xMin =   cid->font_bbox.xMin            >> 16;
+      cidface->bbox.yMin =   cid->font_bbox.yMin            >> 16;
+      /* no `U' suffix here to 0xFFFF! */
+      cidface->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFF ) >> 16;
+      cidface->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFF ) >> 16;
+
+      if ( !cidface->units_per_EM )
+        cidface->units_per_EM = 1000;
+
+      cidface->ascender  = (FT_Short)( cidface->bbox.yMax );
+      cidface->descender = (FT_Short)( cidface->bbox.yMin );
+
+      cidface->height = (FT_Short)( ( cidface->units_per_EM * 12 ) / 10 );
+      if ( cidface->height < cidface->ascender - cidface->descender )
+        cidface->height = (FT_Short)( cidface->ascender - cidface->descender );
+
+      cidface->underline_position  = (FT_Short)info->underline_position;
+      cidface->underline_thickness = (FT_Short)info->underline_thickness;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cid_driver_init                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a given CID driver object.                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    driver :: A handle to the target driver object.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  cid_driver_init( FT_Module  driver )
+  {
+    FT_UNUSED( driver );
+
+    return CID_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    cid_driver_done                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalizes a given CID driver.                                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    driver :: A handle to the target CID driver.                       */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  cid_driver_done( FT_Module  driver )
+  {
+    FT_UNUSED( driver );
+  }
+
+
+/* END */
diff --git a/src/cid/cidobjs.h b/src/cid/cidobjs.h
new file mode 100644 (file)
index 0000000..aee346d
--- /dev/null
@@ -0,0 +1,154 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidobjs.h                                                              */
+/*                                                                         */
+/*    CID objects manager (specification).                                 */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2004, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CIDOBJS_H__
+#define __CIDOBJS_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_CONFIG_CONFIG_H
+#include FT_INTERNAL_TYPE1_TYPES_H
+
+
+FT_BEGIN_HEADER
+
+
+  /* The following structures must be defined by the hinter */
+  typedef struct CID_Size_Hints_   CID_Size_Hints;
+  typedef struct CID_Glyph_Hints_  CID_Glyph_Hints;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CID_Driver                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a Type 1 driver object.                                */
+  /*                                                                       */
+  typedef struct CID_DriverRec_*  CID_Driver;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CID_Size                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a Type 1 size object.                                  */
+  /*                                                                       */
+  typedef struct CID_SizeRec_*  CID_Size;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CID_GlyphSlot                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a Type 1 glyph slot object.                            */
+  /*                                                                       */
+  typedef struct CID_GlyphSlotRec_*  CID_GlyphSlot;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    CID_CharMap                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a Type 1 character mapping object.                     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The Type 1 format doesn't use a charmap but an encoding table.     */
+  /*    The driver is responsible for making up charmap objects            */
+  /*    corresponding to these tables.                                     */
+  /*                                                                       */
+  typedef struct CID_CharMapRec_*  CID_CharMap;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* HERE BEGINS THE TYPE 1 SPECIFIC STUFF                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  typedef struct  CID_SizeRec_
+  {
+    FT_SizeRec  root;
+    FT_Bool     valid;
+
+  } CID_SizeRec;
+
+
+  typedef struct  CID_GlyphSlotRec_
+  {
+    FT_GlyphSlotRec  root;
+
+    FT_Bool          hint;
+    FT_Bool          scaled;
+
+    FT_Fixed         x_scale;
+    FT_Fixed         y_scale;
+
+  } CID_GlyphSlotRec;
+
+
+  FT_LOCAL( void )
+  cid_slot_done( FT_GlyphSlot  slot );
+
+  FT_LOCAL( FT_Error )
+  cid_slot_init( FT_GlyphSlot  slot );
+
+
+  FT_LOCAL( void )
+  cid_size_done( FT_Size  size );       /* CID_Size */
+
+  FT_LOCAL( FT_Error )
+  cid_size_init( FT_Size  size );       /* CID_Size */
+
+  FT_LOCAL( FT_Error )
+  cid_size_request( FT_Size          size,      /* CID_Size */
+                    FT_Size_Request  req );
+
+  FT_LOCAL( FT_Error )
+  cid_face_init( FT_Stream      stream,
+                 FT_Face        face,           /* CID_Face */
+                 FT_Int         face_index,
+                 FT_Int         num_params,
+                 FT_Parameter*  params );
+
+  FT_LOCAL( void )
+  cid_face_done( FT_Face  face );               /* CID_Face */
+
+
+  FT_LOCAL( FT_Error )
+  cid_driver_init( FT_Module  driver );
+
+  FT_LOCAL( void )
+  cid_driver_done( FT_Module  driver );
+
+
+FT_END_HEADER
+
+#endif /* __CIDOBJS_H__ */
+
+
+/* END */
diff --git a/src/cid/cidparse.c b/src/cid/cidparse.c
new file mode 100644 (file)
index 0000000..4d21160
--- /dev/null
@@ -0,0 +1,225 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidparse.c                                                             */
+/*                                                                         */
+/*    CID-keyed Type1 parser (body).                                       */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_STREAM_H
+
+#include "cidparse.h"
+
+#include "ciderrs.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_cidparse
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    INPUT STREAM PARSER                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cid_parser_new( CID_Parser*    parser,
+                  FT_Stream      stream,
+                  FT_Memory      memory,
+                  PSAux_Service  psaux )
+  {
+    FT_Error  error;
+    FT_ULong  base_offset, offset, ps_len;
+    FT_Byte   *cur, *limit;
+    FT_Byte   *arg1, *arg2;
+
+
+    FT_MEM_ZERO( parser, sizeof ( *parser ) );
+    psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory );
+
+    parser->stream = stream;
+
+    base_offset = FT_STREAM_POS();
+
+    /* first of all, check the font format in the header */
+    if ( FT_FRAME_ENTER( 31 ) )
+      goto Exit;
+
+    if ( ft_strncmp( (char *)stream->cursor,
+                     "%!PS-Adobe-3.0 Resource-CIDFont", 31 ) )
+    {
+      FT_TRACE2(( "  not a CID-keyed font\n" ));
+      error = CID_Err_Unknown_File_Format;
+    }
+
+    FT_FRAME_EXIT();
+    if ( error )
+      goto Exit;
+
+  Again:
+    /* now, read the rest of the file until we find */
+    /* `StartData' or `/sfnts'                      */
+    {
+      FT_Byte   buffer[256 + 10];
+      FT_Long   read_len = 256 + 10; /* same as signed FT_Stream->size */
+      FT_Byte*  p        = buffer;
+
+
+      for ( offset = FT_STREAM_POS(); ; offset += 256 )
+      {
+        FT_Long  stream_len; /* same as signed FT_Stream->size */
+
+
+        stream_len = stream->size - FT_STREAM_POS();
+        if ( stream_len == 0 )
+        {
+          FT_TRACE2(( "cid_parser_new: no `StartData' keyword found\n" ));
+          error = CID_Err_Invalid_File_Format;
+          goto Exit;
+        }
+
+        read_len = FT_MIN( read_len, stream_len );
+        if ( FT_STREAM_READ( p, read_len ) )
+          goto Exit;
+
+        if ( read_len < 256 )
+          p[read_len]  = '\0';
+
+        limit = p + read_len - 10;
+
+        for ( p = buffer; p < limit; p++ )
+        {
+          if ( p[0] == 'S' && ft_strncmp( (char*)p, "StartData", 9 ) == 0 )
+          {
+            /* save offset of binary data after `StartData' */
+            offset += p - buffer + 10;
+            goto Found;
+          }
+          else if ( p[1] == 's' && ft_strncmp( (char*)p, "/sfnts", 6 ) == 0 )
+          {
+            offset += p - buffer + 7;
+            goto Found;
+          }
+        }
+
+        FT_MEM_MOVE( buffer, p, 10 );
+        read_len = 256;
+        p = buffer + 10;
+      }
+    }
+
+  Found:
+    /* We have found the start of the binary data or the `/sfnts' token. */
+    /* Now rewind and extract the frame corresponding to this PostScript */
+    /* section.                                                          */
+
+    ps_len = offset - base_offset;
+    if ( FT_STREAM_SEEK( base_offset )                  ||
+         FT_FRAME_EXTRACT( ps_len, parser->postscript ) )
+      goto Exit;
+
+    parser->data_offset    = offset;
+    parser->postscript_len = ps_len;
+    parser->root.base      = parser->postscript;
+    parser->root.cursor    = parser->postscript;
+    parser->root.limit     = parser->root.cursor + ps_len;
+    parser->num_dict       = -1;
+
+    /* Finally, we check whether `StartData' or `/sfnts' was real --  */
+    /* it could be in a comment or string.  We also get the arguments */
+    /* of `StartData' to find out whether the data is represented in  */
+    /* binary or hex format.                                          */
+
+    arg1 = parser->root.cursor;
+    cid_parser_skip_PS_token( parser );
+    cid_parser_skip_spaces  ( parser );
+    arg2 = parser->root.cursor;
+    cid_parser_skip_PS_token( parser );
+    cid_parser_skip_spaces  ( parser );
+
+    limit = parser->root.limit;
+    cur   = parser->root.cursor;
+
+    while ( cur < limit )
+    {
+      if ( parser->root.error )
+      {
+        error = parser->root.error;
+        goto Exit;
+      }
+
+      if ( cur[0] == 'S' && ft_strncmp( (char*)cur, "StartData", 9 ) == 0 )
+      {
+        if ( ft_strncmp( (char*)arg1, "(Hex)", 5 ) == 0 )
+          parser->binary_length = ft_atol( (const char *)arg2 );
+
+        limit = parser->root.limit;
+        cur   = parser->root.cursor;
+        goto Exit;
+      }
+      else if ( cur[1] == 's' && ft_strncmp( (char*)cur, "/sfnts", 6 ) == 0 )
+      {
+        FT_TRACE2(( "cid_parser_new: cannot handle Type 11 fonts\n" ));
+        error = CID_Err_Unknown_File_Format;
+        goto Exit;
+      }
+
+      cid_parser_skip_PS_token( parser );
+      cid_parser_skip_spaces  ( parser );
+      arg1 = arg2;
+      arg2 = cur;
+      cur  = parser->root.cursor;
+    }
+
+    /* we haven't found the correct `StartData'; go back and continue */
+    /* searching                                                      */
+    FT_FRAME_RELEASE( parser->postscript );
+    if ( !FT_STREAM_SEEK( offset ) )
+      goto Again;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cid_parser_done( CID_Parser*  parser )
+  {
+    /* always free the private dictionary */
+    if ( parser->postscript )
+    {
+      FT_Stream  stream = parser->stream;
+
+
+      FT_FRAME_RELEASE( parser->postscript );
+    }
+    parser->root.funcs.done( &parser->root );
+  }
+
+
+/* END */
diff --git a/src/cid/cidparse.h b/src/cid/cidparse.h
new file mode 100644 (file)
index 0000000..ca37dea
--- /dev/null
@@ -0,0 +1,123 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidparse.h                                                             */
+/*                                                                         */
+/*    CID-keyed Type1 parser (specification).                              */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CIDPARSE_H__
+#define __CIDPARSE_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_TYPE1_TYPES_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    CID_Parser                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A CID_Parser is an object used to parse a Type 1 fonts very        */
+  /*    quickly.                                                           */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root           :: The root PS_ParserRec fields.                    */
+  /*                                                                       */
+  /*    stream         :: The current input stream.                        */
+  /*                                                                       */
+  /*    postscript     :: A pointer to the data to be parsed.              */
+  /*                                                                       */
+  /*    postscript_len :: The length of the data to be parsed.             */
+  /*                                                                       */
+  /*    data_offset    :: The start position of the binary data (i.e., the */
+  /*                      end of the data to be parsed.                    */
+  /*                                                                       */
+  /*    binary_length  :: The length of the data after the `StartData'     */
+  /*                      command if the data format is hexadecimal.       */
+  /*                                                                       */
+  /*    cid            :: A structure which holds the information about    */
+  /*                      the current font.                                */
+  /*                                                                       */
+  /*    num_dict       :: The number of font dictionaries.                 */
+  /*                                                                       */
+  typedef struct  CID_Parser_
+  {
+    PS_ParserRec  root;
+    FT_Stream     stream;
+
+    FT_Byte*      postscript;
+    FT_Long       postscript_len;
+
+    FT_ULong      data_offset;
+
+    FT_Long       binary_length;
+
+    CID_FaceInfo  cid;
+    FT_Int        num_dict;
+
+  } CID_Parser;
+
+
+  FT_LOCAL( FT_Error )
+  cid_parser_new( CID_Parser*    parser,
+                  FT_Stream      stream,
+                  FT_Memory      memory,
+                  PSAux_Service  psaux );
+
+  FT_LOCAL( void )
+  cid_parser_done( CID_Parser*  parser );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                            PARSING ROUTINES                           */
+  /*                                                                       */
+  /*************************************************************************/
+
+#define cid_parser_skip_spaces( p ) \
+          (p)->root.funcs.skip_spaces( &(p)->root )
+#define cid_parser_skip_PS_token( p ) \
+          (p)->root.funcs.skip_PS_token( &(p)->root )
+
+#define cid_parser_to_int( p )        (p)->root.funcs.to_int( &(p)->root )
+#define cid_parser_to_fixed( p, t )   (p)->root.funcs.to_fixed( &(p)->root, t )
+
+#define cid_parser_to_coord_array( p, m, c )                          \
+          (p)->root.funcs.to_coord_array( &(p)->root, m, c )
+#define cid_parser_to_fixed_array( p, m, f, t )                          \
+          (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t )
+#define cid_parser_to_token( p, t )                         \
+          (p)->root.funcs.to_token( &(p)->root, t )
+#define cid_parser_to_token_array( p, t, m, c )                          \
+          (p)->root.funcs.to_token_array( &(p)->root, t, m, c )
+
+#define cid_parser_load_field( p, f, o )                              \
+          (p)->root.funcs.load_field( &(p)->root, f, o, 0, 0 )
+#define cid_parser_load_field_table( p, f, o )                              \
+          (p)->root.funcs.load_field_table( &(p)->root, f, o, 0, 0 )
+
+
+FT_END_HEADER
+
+#endif /* __CIDPARSE_H__ */
+
+
+/* END */
diff --git a/src/cid/cidriver.c b/src/cid/cidriver.c
new file mode 100644 (file)
index 0000000..694070a
--- /dev/null
@@ -0,0 +1,241 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidriver.c                                                             */
+/*                                                                         */
+/*    CID driver interface (body).                                         */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006, 2008, 2009, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include "cidriver.h"
+#include "cidgload.h"
+#include FT_INTERNAL_DEBUG_H
+
+#include "ciderrs.h"
+
+#include FT_SERVICE_POSTSCRIPT_NAME_H
+#include FT_SERVICE_XFREE86_NAME_H
+#include FT_SERVICE_POSTSCRIPT_INFO_H
+#include FT_SERVICE_CID_H
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ciddriver
+
+
+  /*
+   *  POSTSCRIPT NAME SERVICE
+   *
+   */
+
+  static const char*
+  cid_get_postscript_name( CID_Face  face )
+  {
+    const char*  result = face->cid.cid_font_name;
+
+
+    if ( result && result[0] == '/' )
+      result++;
+
+    return result;
+  }
+
+
+  static const FT_Service_PsFontNameRec  cid_service_ps_name =
+  {
+    (FT_PsName_GetFunc) cid_get_postscript_name
+  };
+
+
+  /*
+   *  POSTSCRIPT INFO SERVICE
+   *
+   */
+
+  static FT_Error
+  cid_ps_get_font_info( FT_Face          face,
+                        PS_FontInfoRec*  afont_info )
+  {
+    *afont_info = ((CID_Face)face)->cid.font_info;
+
+    return CID_Err_Ok;
+  }
+
+  static FT_Error
+  cid_ps_get_font_extra( FT_Face          face,
+                        PS_FontExtraRec*  afont_extra )
+  {
+    *afont_extra = ((CID_Face)face)->font_extra;
+
+    return CID_Err_Ok;
+  }
+
+  static const FT_Service_PsInfoRec  cid_service_ps_info =
+  {
+    (PS_GetFontInfoFunc)   cid_ps_get_font_info,
+    (PS_GetFontExtraFunc)  cid_ps_get_font_extra,
+    (PS_HasGlyphNamesFunc) NULL,        /* unsupported with CID fonts */
+    (PS_GetFontPrivateFunc)NULL,        /* unsupported                */
+    (PS_GetFontValueFunc)  NULL         /* not implemented            */
+  };
+
+
+  /*
+   *  CID INFO SERVICE
+   *
+   */
+  static FT_Error
+  cid_get_ros( CID_Face      face,
+               const char*  *registry,
+               const char*  *ordering,
+               FT_Int       *supplement )
+  {
+    CID_FaceInfo  cid = &face->cid;
+
+
+    if ( registry )
+      *registry = cid->registry;
+
+    if ( ordering )
+      *ordering = cid->ordering;
+
+    if ( supplement )
+      *supplement = cid->supplement;
+
+    return CID_Err_Ok;
+  }
+
+
+  static FT_Error
+  cid_get_is_cid( CID_Face  face,
+                  FT_Bool  *is_cid )
+  {
+    FT_Error  error = CID_Err_Ok;
+    FT_UNUSED( face );
+
+
+    if ( is_cid )
+      *is_cid = 1; /* cid driver is only used for CID keyed fonts */
+
+    return error;
+  }
+
+
+  static FT_Error
+  cid_get_cid_from_glyph_index( CID_Face  face,
+                                FT_UInt   glyph_index,
+                                FT_UInt  *cid )
+  {
+    FT_Error  error = CID_Err_Ok;
+    FT_UNUSED( face );
+
+
+    if ( cid )
+      *cid = glyph_index; /* identity mapping */
+
+    return error;
+  }
+
+
+  static const FT_Service_CIDRec  cid_service_cid_info =
+  {
+     (FT_CID_GetRegistryOrderingSupplementFunc)cid_get_ros,
+     (FT_CID_GetIsInternallyCIDKeyedFunc)      cid_get_is_cid,
+     (FT_CID_GetCIDFromGlyphIndexFunc)         cid_get_cid_from_glyph_index
+  };
+
+
+  /*
+   *  SERVICE LIST
+   *
+   */
+
+  static const FT_ServiceDescRec  cid_services[] =
+  {
+    { FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_CID },
+    { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &cid_service_ps_name },
+    { FT_SERVICE_ID_POSTSCRIPT_INFO,      &cid_service_ps_info },
+    { FT_SERVICE_ID_CID,                  &cid_service_cid_info },
+    { NULL, NULL }
+  };
+
+
+  FT_CALLBACK_DEF( FT_Module_Interface )
+  cid_get_interface( FT_Module    module,
+                     const char*  cid_interface )
+  {
+    FT_UNUSED( module );
+
+    return ft_service_list_lookup( cid_services, cid_interface );
+  }
+
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FT_Driver_ClassRec  t1cid_driver_class =
+  {
+    /* first of all, the FT_Module_Class fields */
+    {
+      FT_MODULE_FONT_DRIVER       |
+      FT_MODULE_DRIVER_SCALABLE   |
+      FT_MODULE_DRIVER_HAS_HINTER,
+
+      sizeof ( FT_DriverRec ),
+      "t1cid",   /* module name           */
+      0x10000L,  /* version 1.0 of driver */
+      0x20000L,  /* requires FreeType 2.0 */
+
+      0,
+
+      cid_driver_init,
+      cid_driver_done,
+      cid_get_interface
+    },
+
+    /* then the other font drivers fields */
+    sizeof ( CID_FaceRec ),
+    sizeof ( CID_SizeRec ),
+    sizeof ( CID_GlyphSlotRec ),
+
+    cid_face_init,
+    cid_face_done,
+
+    cid_size_init,
+    cid_size_done,
+    cid_slot_init,
+    cid_slot_done,
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+    ft_stub_set_char_sizes,
+    ft_stub_set_pixel_sizes,
+#endif
+
+    cid_slot_load_glyph,
+
+    0,                      /* FT_Face_GetKerningFunc  */
+    0,                      /* FT_Face_AttachFunc      */
+
+    0,                      /* FT_Face_GetAdvancesFunc */
+
+    cid_size_request,
+    0                       /* FT_Size_SelectFunc      */
+  };
+
+
+/* END */
diff --git a/src/cid/cidriver.h b/src/cid/cidriver.h
new file mode 100644 (file)
index 0000000..3c45e06
--- /dev/null
@@ -0,0 +1,43 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidriver.h                                                             */
+/*                                                                         */
+/*    High-level CID driver interface (specification).                     */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __CIDRIVER_H__
+#define __CIDRIVER_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DRIVER_H
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+
+  FT_CALLBACK_TABLE
+  const FT_Driver_ClassRec  t1cid_driver_class;
+
+
+FT_END_HEADER
+
+#endif /* __CIDRIVER_H__ */
+
+
+/* END */
diff --git a/src/cid/cidtoken.h b/src/cid/cidtoken.h
new file mode 100644 (file)
index 0000000..904cb09
--- /dev/null
@@ -0,0 +1,112 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cidtoken.h                                                             */
+/*                                                                         */
+/*    CID token definitions (specification only).                          */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  CID_FaceInfoRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_CID_INFO
+
+  T1_FIELD_KEY   ( "CIDFontName",    cid_font_name, 0 )
+  T1_FIELD_FIXED ( "CIDFontVersion", cid_version,   0 )
+  T1_FIELD_NUM   ( "CIDFontType",    cid_font_type, 0 )
+  T1_FIELD_STRING( "Registry",       registry,      0 )
+  T1_FIELD_STRING( "Ordering",       ordering,      0 )
+  T1_FIELD_NUM   ( "Supplement",     supplement,    0 )
+  T1_FIELD_NUM   ( "UIDBase",        uid_base,      0 )
+  T1_FIELD_NUM   ( "CIDMapOffset",   cidmap_offset, 0 )
+  T1_FIELD_NUM   ( "FDBytes",        fd_bytes,      0 )
+  T1_FIELD_NUM   ( "GDBytes",        gd_bytes,      0 )
+  T1_FIELD_NUM   ( "CIDCount",       cid_count,     0 )
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PS_FontInfoRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FONT_INFO
+
+  T1_FIELD_STRING( "version",            version,             0 )
+  T1_FIELD_STRING( "Notice",             notice,              0 )
+  T1_FIELD_STRING( "FullName",           full_name,           0 )
+  T1_FIELD_STRING( "FamilyName",         family_name,         0 )
+  T1_FIELD_STRING( "Weight",             weight,              0 )
+  T1_FIELD_NUM   ( "ItalicAngle",        italic_angle,        0 )
+  T1_FIELD_BOOL  ( "isFixedPitch",       is_fixed_pitch,      0 )
+  T1_FIELD_NUM   ( "UnderlinePosition",  underline_position,  0 )
+  T1_FIELD_NUM   ( "UnderlineThickness", underline_thickness, 0 )
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PS_FontExtraRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FONT_EXTRA
+
+  T1_FIELD_NUM   ( "FSType",             fs_type,             0 )
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  CID_FaceDictRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FONT_DICT
+
+  T1_FIELD_NUM  ( "PaintType",          paint_type,          0 )
+  T1_FIELD_NUM  ( "FontType",           font_type,           0 )
+  T1_FIELD_NUM  ( "SubrMapOffset",      subrmap_offset,      0 )
+  T1_FIELD_NUM  ( "SDBytes",            sd_bytes,            0 )
+  T1_FIELD_NUM  ( "SubrCount",          num_subrs,           0 )
+  T1_FIELD_NUM  ( "lenBuildCharArray",  len_buildchar,       0 )
+  T1_FIELD_FIXED( "ForceBoldThreshold", forcebold_threshold, 0 )
+  T1_FIELD_FIXED( "StrokeWidth",        stroke_width,        0 )
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PS_PrivateRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_PRIVATE
+
+  T1_FIELD_NUM       ( "UniqueID",         unique_id,      0 )
+  T1_FIELD_NUM       ( "lenIV",            lenIV,          0 )
+  T1_FIELD_NUM       ( "LanguageGroup",    language_group, 0 )
+  T1_FIELD_NUM       ( "password",         password,       0 )
+
+  T1_FIELD_FIXED_1000( "BlueScale",        blue_scale,     0 )
+  T1_FIELD_NUM       ( "BlueShift",        blue_shift,     0 )
+  T1_FIELD_NUM       ( "BlueFuzz",         blue_fuzz,      0 )
+
+  T1_FIELD_NUM_TABLE ( "BlueValues",       blue_values,        14, 0 )
+  T1_FIELD_NUM_TABLE ( "OtherBlues",       other_blues,        10, 0 )
+  T1_FIELD_NUM_TABLE ( "FamilyBlues",      family_blues,       14, 0 )
+  T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10, 0 )
+
+  T1_FIELD_NUM_TABLE2( "StdHW",            standard_width,      1, 0 )
+  T1_FIELD_NUM_TABLE2( "StdVW",            standard_height,     1, 0 )
+  T1_FIELD_NUM_TABLE2( "MinFeature",       min_feature,         2, 0 )
+
+  T1_FIELD_NUM_TABLE ( "StemSnapH",        snap_widths,        12, 0 )
+  T1_FIELD_NUM_TABLE ( "StemSnapV",        snap_heights,       12, 0 )
+
+  T1_FIELD_BOOL      ( "ForceBold",        force_bold,          0 )
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  FT_BBox
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_BBOX
+
+  T1_FIELD_BBOX( "FontBBox", xMin, 0 )
+
+
+/* END */
diff --git a/src/cid/module.mk b/src/cid/module.mk
new file mode 100644 (file)
index 0000000..ce30bfd
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# FreeType 2 CID module definition
+#
+
+
+# Copyright 1996-2000, 2006 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.
+
+
+FTMODULE_H_COMMANDS += TYPE1CID_DRIVER
+
+define TYPE1CID_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, t1cid_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)cid       $(ECHO_DRIVER_DESC)Postscript CID-keyed fonts, no known extension$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/src/cid/rules.mk b/src/cid/rules.mk
new file mode 100644 (file)
index 0000000..f362744
--- /dev/null
@@ -0,0 +1,70 @@
+#
+# FreeType 2 CID driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003 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.
+
+
+# CID driver directory
+#
+CID_DIR := $(SRC_DIR)/cid
+
+
+CID_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(CID_DIR))
+
+
+# CID driver sources (i.e., C files)
+#
+CID_DRV_SRC := $(CID_DIR)/cidparse.c \
+               $(CID_DIR)/cidload.c  \
+               $(CID_DIR)/cidriver.c \
+               $(CID_DIR)/cidgload.c \
+               $(CID_DIR)/cidobjs.c
+
+# CID driver headers
+#
+CID_DRV_H := $(CID_DRV_SRC:%.c=%.h) \
+             $(CID_DIR)/cidtoken.h  \
+             $(CID_DIR)/ciderrs.h
+
+
+# CID driver object(s)
+#
+#   CID_DRV_OBJ_M is used during `multi' builds
+#   CID_DRV_OBJ_S is used during `single' builds
+#
+CID_DRV_OBJ_M := $(CID_DRV_SRC:$(CID_DIR)/%.c=$(OBJ_DIR)/%.$O)
+CID_DRV_OBJ_S := $(OBJ_DIR)/type1cid.$O
+
+# CID driver source file for single build
+#
+CID_DRV_SRC_S := $(CID_DIR)/type1cid.c
+
+
+# CID driver - single object
+#
+$(CID_DRV_OBJ_S): $(CID_DRV_SRC_S) $(CID_DRV_SRC) $(FREETYPE_H) $(CID_DRV_H)
+       $(CID_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(CID_DRV_SRC_S))
+
+
+# CID driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(CID_DIR)/%.c $(FREETYPE_H) $(CID_DRV_H)
+       $(CID_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(CID_DRV_OBJ_S)
+DRV_OBJS_M += $(CID_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/cid/type1cid.c b/src/cid/type1cid.c
new file mode 100644 (file)
index 0000000..0b866e9
--- /dev/null
@@ -0,0 +1,29 @@
+/***************************************************************************/
+/*                                                                         */
+/*  type1cid.c                                                             */
+/*                                                                         */
+/*    FreeType OpenType driver component (body only).                      */
+/*                                                                         */
+/*  Copyright 1996-2001 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include <ft2build.h>
+#include "cidparse.c"
+#include "cidload.c"
+#include "cidobjs.c"
+#include "cidriver.c"
+#include "cidgload.c"
+
+
+/* END */
diff --git a/src/gxvalid/Jamfile b/src/gxvalid/Jamfile
new file mode 100644 (file)
index 0000000..88049a6
--- /dev/null
@@ -0,0 +1,33 @@
+# FreeType 2 src/gxvalid Jamfile
+#
+# Copyright 2005 by
+# suzuki toshiya, Masatake YAMATO and Red Hat K.K.
+#
+# 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) gxvalid ;
+
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = gxvcommn gxvfeat  gxvbsln  gxvtrak  gxvopbd  gxvprop
+               gxvmort  gxvmort0 gxvmort1 gxvmort2 gxvmort4 gxvmort5
+               gxvmorx  gxvmorx0 gxvmorx1 gxvmorx2 gxvmorx4 gxvmorx5
+               gxvlcar  gxvkern  gxvmod   gxvjust  ;
+  }
+  else
+  {
+    _sources = gxvalid ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/gxvalid Jamfile
diff --git a/src/gxvalid/README b/src/gxvalid/README
new file mode 100644 (file)
index 0000000..28e535b
--- /dev/null
@@ -0,0 +1,532 @@
+gxvalid: TrueType GX validator
+==============================
+
+
+1. What is this
+---------------
+
+  `gxvalid' is a module to  validate TrueType GX tables: a collection of
+  additional tables  in TrueType  font which are  used by  `QuickDraw GX
+  Text',  Apple Advanced  Typography  (AAT).  In  addition, gxvalid  can
+  validates `kern'  tables which have  been extended for AAT.   Like the
+  otvalid  module,   gxvalid  uses  Freetype   2's  validator  framework
+  (ftvalid).
+
+  You can link gxvalid with your program; before running your own layout
+  engine, gxvalid validates a font  file.  As the result, you can remove
+  error-checking code  from the layout  engine.  It is also  possible to
+  use  gxvalid  as a  stand-alone  font  validator;  the `ftvalid'  test
+  program  included  in the  ft2demo  bundle  calls gxvalid  internally.
+  A stand-alone font validator may be useful for font developers.
+
+  This documents documents the following issues.
+
+  - supported TrueType GX tables
+  - fundamental validation limitations
+  - permissive error handling of broken GX tables
+  - `kern' table issue.
+
+
+2. Supported tables
+-------------------
+
+  The following GX tables are currently supported.
+
+    bsln
+    feat
+    just
+    kern(*)
+    lcar
+    mort
+    morx
+    opbd
+    prop
+    trak
+
+  The following GX tables are currently unsupported.
+
+    cvar
+    fdsc
+    fmtx
+    fvar
+    gvar
+    Zapf
+
+  The following GX tables won't be supported.
+
+    acnt(**)
+    hsty(***)
+
+  The following undocumented tables in TrueType fonts designed for Apple
+  platform aren't handled either.
+
+    addg
+    CVTM
+    TPNM
+    umif
+
+
+  *)   The `kern'  validator handles both  the classic and the  new kern
+       formats;  the former  is supported  on both  Microsoft  and Apple
+       platforms, while the latter is supported on Apple platforms.
+
+  **)  `acnt' tables are not supported by currently available Apple font
+       tools.
+
+  ***) There  is  one more  Apple  extension,  `hsty',  but  it  is  for
+       Newton-OS, not GX  (Newton-OS is a platform by  Apple, but it can
+       use  sfnt- housed bitmap  fonts only).   Therefore, it  should be
+       excluded  from  `Apple  platform'  in the  context  of  TrueType.
+       gxvalid ignores it as Apple font tools do so.
+
+
+  We have  checked 183  fonts bundled with  MacOS 9.1, MacOS  9.2, MacOS
+  10.0, MacOS X 10.1, MSIE  for MacOS, and AppleWorks 6.0.  In addition,
+  we have  checked 67 Dynalab fonts  (designed for MacOS)  and 189 Ricoh
+  fonts (designed for Windows and  MacOS dual platforms).  The number of
+  fonts including TrueType GX tables are as follows.
+
+    bsln:  76
+    feat: 191
+    just:  84
+    kern:  59
+    lcar:   4
+    mort: 326
+    morx:  19
+    opbd:   4
+    prop: 114
+    trak:  16
+
+  Dynalab  and Ricoh fonts  don't have  GX tables  except of  `feat' and
+  `mort'.
+
+
+3. Fundamental validation limitations
+-------------------------------------
+
+  TrueType  GX  provides  layout   information  to  libraries  for  font
+  rasterizers  and text layout.   gxvalid can  check whether  the layout
+  data in  a font is conformant  to the TrueType GX  format specified by
+  Apple.  But gxvalid cannot check  a how QuickDraw GX/AAT renderer uses
+  the stored information.
+
+  3-1. Validation of State Machine activity
+  -----------------------------------------
+
+    QuickDraw GX/AAT uses a `State Machine' to provide `stateful' layout
+    features,  and TrueType GX  stores the  state transition  diagram of
+    this `State  Machine' in a  `StateTable' data structure.   While the
+    State  Machine receives  a series  of glyph  IDs, the  State Machine
+    starts with `start  of text' state, walks around  various states and
+    generates various  layout information  to the  renderer, and finally
+    reaches the `end of text' state.
+
+    gxvalid can check essential errors like:
+
+      - possibility of state transitions to undefined states
+      - existence of glyph  IDs that the State Machine  doesn't know how
+        to handle
+      - the  State Machine  cannot compute  the layout  information from
+        given diagram
+
+    These errors  can be  checked within finite  steps, and  without the
+    State Machine itself, because these are `expression' errors of state
+    transition diagram.
+
+    There  is no  limitation  about  how long  the  State Machine  walks
+    around,  so validation  of  the algorithm  in  the state  transition
+    diagram requires infinite  steps, even if we had  a State Machine in
+    gxvalid.   Therefore, the  following errors  and problems  cannot be
+    checked.
+
+      - existence of states which the State Machine never transits to
+      - the  possibility that the  State Machine  never reaches  `end of
+        text'
+      - the possibility of stack underflow/overflow in the State Machine
+        (in  ligature  and  contextual  glyph substitutions,  the  State
+        Machine can store 16 glyphs onto its stack)
+
+    In addition, gxvalid doesn't check `temporary glyph IDs' used in the
+    chained State Machines  (in `mort' and `morx' tables).   If a layout
+    feature  is  implemented by  a  single  State  Machine, a  glyph  ID
+    converted by the State Machine is passed to the glyph renderer, thus
+    it  should not  point to  an undefined  glyph ID.   But if  a layout
+    feature is implemented by  chained State Machines, a component State
+    Machine  (if it  is  not the  final  one) is  permitted to  generate
+    undefined glyph IDs for temporary use, because it is handled by next
+    component State Machine and not  by the glyph renderer.  To validate
+    such temporary glyph IDs, gxvalid must stack all undefined glyph IDs
+    which  can occur in  the output  of the  previous State  Machine and
+    search  them in  the  `ClassTable' structure  of  the current  State
+    Machine.  It is too complex to  list all possible glyph IDs from the
+    StateTable, especially from a ligature substitution table.
+
+  3-2. Validation of relationship between multiple layout features
+  ----------------------------------------------------------------
+
+    gxvalid does  not validate the relationship  between multiple layout
+    features at all.
+
+    If  multiple layout  features  are defined  in  TrueType GX  tables,
+    possible  interactions,  overrides,  and  conflicts  between  layout
+    features are implicitly  given in the font too.   For example, there
+    are several predefined spacing control features:
+
+      - Text Spacing          (Proportional/Monospace/Half-width/Normal)
+      - Number Spacing        (Monospaced-numbers/Proportional-numbers)
+      - Kana Spacing          (Full-width/Proportional)
+      - Ideographic Spacing   (Full-width/Proportional)
+      - CJK Roman Spacing     (Half-width/Proportional/Default-roman
+                               /Full-width-roman/Proportional)
+
+    If all  layout features are  independently managed, we  can activate
+    inconsistent  typographic rules  like  `Text Spacing=Monospace'  and
+    `Ideographic Spacing=Proportional' at the same time.
+
+    The combinations  of layout features  is managed by a  32bit integer
+    (one bit each for selector  setting), so we can define relationships
+    between  up  to 32  features,  theoretically.   But  if one  feature
+    setting  affects  another   feature  setting,  we  need  typographic
+    priority  rules to  validate the  relationship.   Unfortunately, the
+    TrueType GX format specification does not give such information even
+    for predefined features.
+
+
+4. Permissive error handling of broken GX tables
+------------------------------------------------
+
+  When  Apple's font  rendering system  finds an  inconsistency,  like a
+  specification  violation or  an  unspecified value  in  a TrueType  GX
+  table, it does not always  return error.  In most cases, the rendering
+  engine silently  ignores such wrong  values or even whole  tables.  In
+  fact, MacOS is shipped with  fonts including broken GX/AAT tables, but
+  no harmful  effects due to  `officially broken' fonts are  observed by
+  end-users.
+
+  gxvalid  is designed  to continue  the validation  process as  long as
+  possible.  When gxvalid find wrong  values, gxvalid warns it at least,
+  and takes  a fallback procedure  if possible.  The  fallback procedure
+  depends on the debug level.
+
+  We used the following three tools to investigate Apple's error handling.
+
+    - FontValidator  (for MacOS 8.5 - 9.2)  resource fork font
+    - ftxvalidator   (for MacOS X 10.1 -)   dfont or naked-sfnt
+    - ftxdumperfuser (for MacOS X 10.1 -)   dfont or naked-sfnt
+
+  However, all tests were done on a PowerPC based Macintosh; at present,
+  we have not checked those tools on a m68k-based Macintosh.
+
+  In total, we checked 183 fonts  bundled to MacOS 9.1, MacOS 9.2, MacOS
+  10.0, MacOS X  10.1, MSIE for MacOS, and  AppleWorks 6.0.  These fonts
+  are distributed  officially, but many broken GX/AAT  tables were found
+  by Apple's font tools.  In the following, we list typical violation of
+  the GX specification, in fonts officially distributed with those Apple
+  systems.
+
+  4-1. broken BinSrchHeader (19/183)
+  ----------------------------------
+
+    `BinSrchHeader' is  a header of a  data array for  m68k platforms to
+    access memory efficiently.  Although  there are only two independent
+    parameters  for real  (`unitSize' and  `nUnits'),  BinSrchHeader has
+    three additional parameters which  can be calculated from `unitSize'
+    and  `nUnits',  for  fast  setup.   Apple  font  tools  ignore  them
+    silently, so gxvalid warns if it finds and inconsistency, and always
+    continues  validation.    The  additional  parameters   are  ignored
+    regardless of the consistency.
+
+      19  fonts include  such  inconsistencies; all  breaks  are in  the
+      BinSrchHeader structure of the `kern' table.
+
+  4-2. too-short LookupTable (5/183)
+  ----------------------------------
+
+    LookupTable format 0  is a simple array to get a  value from a given
+    GID (glyph  ID); the index of  this array is a  GID too.  Therefore,
+    the length  of the array is expected  to be same as  the maximum GID
+    value defined  in the `maxp' table,  but there are  some fonts whose
+    LookupTable format 0 is too  short to cover all GIDs.  FontValidator
+    ignores  this error silently,  ftxvalidator and  ftxdumperfuser both
+    warn and continue.  Similar problems are found in format 3 subtables
+    of `kern'.  gxvalid  warns always and abort if  the validation level
+    is set to FT_VALIDATE_PARANOID.
+
+      5 fonts include too-short kern format 0 subtables.
+      1 font includes too-short kern format 3 subtable.
+
+  4-3. broken LookupTable format 2 (1/183)
+  ----------------------------------------
+
+    LookupTable  format  2,  subformat  4  covers the  GID  space  by  a
+    collection  of  segments which  are  specified  by `firstGlyph'  and
+    `lastGlyph'.   Some  fonts  store  `firstGlyph' and  `lastGlyph'  in
+    reverse order,  so the segment specification is  broken.  Apple font
+    tools ignore this error silently;  a broken segment is ignored as if
+    it  did not  exist.   gxvalid  warns and  normalize  the segment  at
+    FT_VALIDATE_DEFAULT, or ignore  the segment at FT_VALIDATE_TIGHT, or
+    abort at FT_VALIDATE_PARANOID.
+
+      1 font includes broken LookupTable format 2, in the `just' table.
+
+    *) It seems  that all fonts manufactured by  ITC for AppleWorks have
+       this error.
+
+  4-4. bad bracketing in glyph property (14/183)
+  ----------------------------------------------
+
+    GX/AAT defines a  `bracketing' property of the glyphs  in the `prop'
+    table,  to control layout  features of  strings enclosed  inside and
+    outside  of   brackets.   Some  fonts   give  inappropriate  bracket
+    properties  to glyphs.   Apple  font tools  warn  about this  error;
+    gxvalid warns too and aborts at FT_VALIDATE_PARANOID.
+
+      14 fonts include wrong bracket properties.
+
+
+  4-5. invalid feature number (117/183)
+  -------------------------------------
+
+    The GX/AAT extension can  include 255 different layout features, but
+    popular      layout      features      are      predefined      (see
+    http://developer.apple.com/fonts/Registry/index.html).   Some  fonts
+    include feature  numbers which are incompatible  with the predefined
+    feature registry.
+
+    In our survey, there are 140 fonts including `feat' table.
+
+    a) 67 fonts use a feature number which should not be used.
+    b) 117 fonts set the wrong feature range (nSetting).  This is mostly
+       found in the `mort' and `morx' tables.
+
+    Apple  font tools give  no warning,  although they  cannot recognize
+    what  the feature  is.   At FT_VALIDATE_DEFAULT,  gxvalid warns  but
+    continues in both cases (a, b).  At FT_VALIDATE_TIGHT, gxvalid warns
+    and aborts for (a), but continues for (b).  At FT_VALIDATE_PARANOID,
+    gxvalid warns and aborts in both cases (a, b).
+
+  4-6. invalid prop version (10/183)
+  ----------------------------------
+
+    As most TrueType GX tables, the `prop' table must start with a 32bit
+    version identifier: 0x00010000,  0x00020000 or 0x00030000.  But some
+    fonts  store nonsense binary  data instead.   When Apple  font tools
+    find them, they abort the processing immediately, and the data which
+    follows is unhandled.  gxvalid does the same.
+
+      10 fonts include broken `prop' version.
+
+    All  of these  fonts are  classic  TrueType fonts  for the  Japanese
+    script, manufactured by Apple.
+
+  4-7. unknown resource name (2/183)
+  ------------------------------------
+
+    NOTE: THIS IS NOT A TRUETYPE GX ERROR.
+
+    If  a TrueType  font is  stored  in the  resource fork  or in  dfont
+    format, the data must be tagged as `sfnt' in the resource fork index
+    to invoke TrueType font handler for the data.  But the TrueType font
+    data  in   `Keyboard.dfont'  is  tagged   as  `kbd',  and   that  in
+    `LastResort.dfont' is tagged as  `lst'.  Apple font tools can detect
+    that the data is in  TrueType format and successfully validate them.
+    Maybe  this is possible  because they  are known  to be  dfont.  The
+    current  implementation  of the  resource  fork  driver of  FreeType
+    cannot do that, thus gxvalid cannot validate them.
+
+      2 fonts use an unknown tag for the TrueType font resource.
+
+5. `kern' table issues
+----------------------
+
+  In common terminology of TrueType, `kern' is classified as a basic and
+  platform-independent table.  But there are Apple extensions of `kern',
+  and  there is  an  extension which  requires  a GX  state machine  for
+  contextual kerning.   Therefore, gxvalid includes  a special validator
+  for  `kern' tables.   Unfortunately, there  is no  exact  algorithm to
+  check Apple's extension, so  gxvalid includes a heuristic algorithm to
+  find  the proper validation  routines for  all possible  data formats,
+  including    the   data    format   for    Microsoft.     By   calling
+  classic_kern_validate() instead of gxv_validate(), you can specify the
+  `kern' format  explicitly.  However, current  FreeType2 uses Microsoft
+  `kern' format  only, others  are ignored (and  should be handled  in a
+  library one level higher than FreeType).
+
+  5-1. History
+  ------------
+
+    The original  16bit version of `kern'  was designed by  Apple in the
+    pre-GX  era, and  it was  also approved  by  Microsoft.  Afterwards,
+    Apple designed a  new 32bit version of the  `kern' table.  According
+    to  the documentation, the  difference between  the 16bit  and 32bit
+    version is only the size of  variables in the `kern' header.  In the
+    following,  we call  the original  16bit version  as  `classic', and
+    32bit version as `new'.
+
+  5-2. Versions and dialects which should be differentiated
+  ---------------------------------------------------------
+
+    The `kern' table  consists of a table header  and several subtables.
+    The version number  which identifies a `classic' or  a `new' version
+    is  explicitly   written  in  the   table  header,  but   there  are
+    undocumented  differences between  Microsoft's and  Apple's formats.
+    It is  called a `dialect' in  the following.  There  are three cases
+    which  should  be  handled:   the  new  Apple-dialect,  the  classic
+    Apple-dialect,  and the classic  Microsoft-dialect.  An  analysis of
+    the formats and the auto detection algorithm of gxvalid is described
+    in the following.
+
+    5-2-1. Version detection: classic and new kern
+    ----------------------------------------------
+
+      According  to Apple  TrueType  specification, there  are only  two
+      differences between the classic and the new:
+
+        - The `kern' table header starts with the version number.
+          The classic version starts with 0x0000 (16bit),
+          the new version starts with 0x00010000 (32bit).
+
+        - In the  `kern' table header,  the number of  subtables follows
+          the version number.
+          In the classic version, it is stored as a 16bit value.
+          In the new version, it is stored as a 32bit value.
+
+      From Apple font tool's output (DumpKERN is also tested in addition
+      to  the  three  Apple  font  tools in  above),  there  is  another
+      undocumented difference.  In the  new version, the subtable header
+      includes a 16bit variable  named `tupleIndex' which does not exist
+      in the classic version.
+
+      The new version  can store all subtable formats (0,  1, 2, and 3),
+      but the Apple TrueType specification does not mention the subtable
+      formats available in the classic version.
+
+    5-2-2. Available subtable formats in classic version
+    ----------------------------------------------------
+
+      Although the  Apple TrueType  specification recommends to  use the
+      classic version in  the case if the font is  designed for both the
+      Apple and Microsoft platforms,  it does not document the available
+      subtable formats in the classic version.
+
+      According  to the Microsoft  TrueType specification,  the subtable
+      format  assured for  Windows  and OS/2  support  is only  subtable
+      format  0.  The  Microsoft TrueType  specification  also describes
+      subtable format  2, but does  not mention which  platforms support
+      it.  Aubtable formats 1, 3,  and higher are documented as reserved
+      for future use.  Therefore, the classic version can store subtable
+      formats 0 and 2, at least.  `ttfdump.exe', a font tool provided by
+      Microsoft,  ignores the  subtable format  written in  the subtable
+      header, and parses the table as if all subtables are in format 0.
+
+      `kern'  subtable format  1  uses  a StateTable,  so  it cannot  be
+      utilized without a GX  State Machine.  Therefore, it is reasonable
+      to assume  that format 1 (and  3) were introduced  after Apple had
+      introduced GX and moved to the new 32bit version.
+
+    5-2-3. Apple and Microsoft dialects
+    -----------------------------------
+
+      The  `kern' subtable  has  a 16bit  `coverage'  field to  describe
+      kerning attributes, but bit interpretations by Apple and Microsoft
+      are different:  For example, Apple  uses bits 0-7 to  identify the
+      subtable, while Microsoft uses bits 8-15.
+
+      In  addition, due  to the  output of  DumpKERN  and FontValidator,
+      Apple's bit interpretations of coverage in classic and new version
+      are  incompatible also.   In  summary, there  are three  dialects:
+      classic Apple  dialect, classic  Microsoft dialect, and  new Apple
+      dialect.  The classic Microsoft  dialect and the new Apple dialect
+      are documented  by each vendors' TrueType  font specification, but
+      the documentation for classic Apple dialect is not available.
+
+      For example,  in the  new Apple dialect,  bit 15 is  documented as
+      `set to  1 if  the kerning  is vertical'.  On  the other  hand, in
+      classic Microsoft dialect, bit 1 is documented as `set to 1 if the
+      kerning  is  horizontal'.   From   the  outputs  of  DumpKERN  and
+      FontValidator, classic  Apple dialect recognizes  15 as `set  to 1
+      when  the kerning  is horizontal'.   From the  results  of similar
+      experiments, classic Apple dialect  seems to be the Endian reverse
+      of the classic Microsoft dialect.
+
+      As a  conclusion it must be  noted that no font  tool can identify
+      classic Apple dialect or classic Microsoft dialect automatically.
+
+    5-2-4. gxvalid auto dialect detection algorithm
+    -----------------------------------------------
+
+      The first 16  bits of the `kern' table are  enough to identify the
+      version:
+
+        - if  the first  16  bits are  0x0000,  the `kern'  table is  in
+          classic Apple dialect or classic Microsoft dialect
+        - if the first 16 bits are  0x0001, and next 16 bits are 0x0000,
+          the kern table is in new Apple dialect.
+
+      If the `kern'  table is a classic one,  the 16bit `coverage' field
+      is checked next.   Firstly, the coverage bits are  decoded for the
+      classic Apple dialect using the following bit masks (this is based
+      on DumpKERN output):
+
+        0x8000: 1=horizontal, 0=vertical
+        0x4000: not used
+        0x2000: 1=cross-stream, 0=normal
+        0x1FF0: reserved
+        0x000F: subtable format
+
+      If  any  of  reserved  bits  are  set  or  the  subtable  bits  is
+      interpreted as format 1 or 3, we take it as `impossible in classic
+      Apple dialect' and retry, using the classic Microsoft dialect.
+
+        The most popular coverage in new Apple-dialect:         0x8000,
+        The most popular coverage in classic Apple-dialect:     0x0000,
+        The most popular coverage in classic Microsoft dialect: 0x0001.
+
+  5-3. Tested fonts
+  -----------------
+
+    We checked  59 fonts  bundled with MacOS  and 38 fonts  bundled with
+    Windows, where all font include a `kern' table.
+
+      - fonts bundled with MacOS
+        * new Apple dialect
+          format 0: 18
+          format 2:  1
+          format 3:  1
+        * classic Apple dialect
+          format 0: 14
+        * classic Microsoft dialect
+          format 0: 15
+
+      - fonts bundled with Windows
+        * classic Microsoft dialect
+          format 0: 38
+
+    It looks strange that classic Microsoft-dialect fonts are bundled to
+    MacOS: they come from MSIE for MacOS, except of MarkerFelt.dfont.
+
+
+  ACKNOWLEDGEMENT
+  ---------------
+
+  Some parts of gxvalid are  derived from both the `gxlayout' module and
+  the `otvalid'  module.  Development of  gxlayout was supported  by the
+  Information-technology Promotion Agency(IPA), Japan.
+
+  The detailed analysis of undefined  glyph ID utilization in `mort' and
+  `morx' tables is provided by George Williams.
+
+------------------------------------------------------------------------
+
+Copyright 2004, 2005, 2007 by
+suzuki toshiya, Masatake YAMATO, Red hat K.K.,
+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 README ---
diff --git a/src/gxvalid/gxvalid.c b/src/gxvalid/gxvalid.c
new file mode 100644 (file)
index 0000000..bc36e67
--- /dev/null
@@ -0,0 +1,46 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvalid.c                                                              */
+/*                                                                         */
+/*    FreeType validator for TrueTypeGX/AAT tables (body only).            */
+/*                                                                         */
+/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include <ft2build.h>
+
+#include "gxvfeat.c"
+#include "gxvcommn.c"
+#include "gxvbsln.c"
+#include "gxvtrak.c"
+#include "gxvjust.c"
+#include "gxvmort.c"
+#include "gxvmort0.c"
+#include "gxvmort1.c"
+#include "gxvmort2.c"
+#include "gxvmort4.c"
+#include "gxvmort5.c"
+#include "gxvmorx.c"
+#include "gxvmorx0.c"
+#include "gxvmorx1.c"
+#include "gxvmorx2.c"
+#include "gxvmorx4.c"
+#include "gxvmorx5.c"
+#include "gxvkern.c"
+#include "gxvopbd.c"
+#include "gxvprop.c"
+#include "gxvlcar.c"
+#include "gxvmod.c"
+
+
+/* END */
diff --git a/src/gxvalid/gxvalid.h b/src/gxvalid/gxvalid.h
new file mode 100644 (file)
index 0000000..27be9ec
--- /dev/null
@@ -0,0 +1,107 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvalid.h                                                              */
+/*                                                                         */
+/*    TrueTyeeGX/AAT table validation (specification only).                */
+/*                                                                         */
+/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __GXVALID_H__
+#define __GXVALID_H__
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#include "gxverror.h"          /* must come before FT_INTERNAL_VALIDATE_H */
+
+#include FT_INTERNAL_VALIDATE_H
+#include FT_INTERNAL_STREAM_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( void )
+  gxv_feat_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  valid );
+
+
+  FT_LOCAL( void )
+  gxv_bsln_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  valid );
+
+
+  FT_LOCAL( void )
+  gxv_trak_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_just_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_mort_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_morx_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_kern_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_kern_validate_classic( FT_Bytes      table,
+                             FT_Face       face,
+                             FT_Int        dialect_flags,
+                             FT_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_opbd_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_prop_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_lcar_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  valid );
+
+
+FT_END_HEADER
+
+
+#endif /* __GXVALID_H__ */
+
+
+/* END */
diff --git a/src/gxvalid/gxvbsln.c b/src/gxvalid/gxvbsln.c
new file mode 100644 (file)
index 0000000..3d10031
--- /dev/null
@@ -0,0 +1,333 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvbsln.c                                                              */
+/*                                                                         */
+/*    TrueTypeGX/AAT bsln table validation (body).                         */
+/*                                                                         */
+/*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvalid.h"
+#include "gxvcommn.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvbsln
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      Data and Types                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define GXV_BSLN_VALUE_COUNT  32
+#define GXV_BSLN_VALUE_EMPTY  0xFFFFU
+
+
+  typedef struct  GXV_bsln_DataRec_
+  {
+    FT_Bytes   ctlPoints_p;
+    FT_UShort  defaultBaseline;
+
+  } GXV_bsln_DataRec, *GXV_bsln_Data;
+
+
+#define GXV_BSLN_DATA( field )  GXV_TABLE_DATA( bsln, field )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      UTILITY FUNCTIONS                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  gxv_bsln_LookupValue_validate( FT_UShort            glyph,
+                                 GXV_LookupValueCPtr  value_p,
+                                 GXV_Validator        valid )
+  {
+    FT_UShort   v = value_p->u;
+    FT_UShort*  ctlPoints;
+
+    FT_UNUSED( glyph );
+
+
+    GXV_NAME_ENTER( "lookup value" );
+
+    if ( v >= GXV_BSLN_VALUE_COUNT )
+      FT_INVALID_DATA;
+
+    ctlPoints = (FT_UShort*)GXV_BSLN_DATA( ctlPoints_p );
+    if ( ctlPoints && ctlPoints[v] == GXV_BSLN_VALUE_EMPTY )
+      FT_INVALID_DATA;
+
+    GXV_EXIT;
+  }
+
+
+  /*
+    +===============+ --------+
+    | lookup header |         |
+    +===============+         |
+    | BinSrchHeader |         |
+    +===============+         |
+    | lastGlyph[0]  |         |
+    +---------------+         |
+    | firstGlyph[0] |         |    head of lookup table
+    +---------------+         |             +
+    | offset[0]     |    ->   |          offset            [byte]
+    +===============+         |             +
+    | lastGlyph[1]  |         | (glyphID - firstGlyph) * 2 [byte]
+    +---------------+         |
+    | firstGlyph[1] |         |
+    +---------------+         |
+    | offset[1]     |         |
+    +===============+         |
+                              |
+    ...                       |
+                              |
+    16bit value array         |
+    +===============+         |
+    |     value     | <-------+
+    ...
+  */
+
+  static GXV_LookupValueDesc
+  gxv_bsln_LookupFmt4_transit( FT_UShort            relative_gindex,
+                               GXV_LookupValueCPtr  base_value_p,
+                               FT_Bytes             lookuptbl_limit,
+                               GXV_Validator        valid )
+  {
+    FT_Bytes             p;
+    FT_Bytes             limit;
+    FT_UShort            offset;
+    GXV_LookupValueDesc  value;
+
+    /* XXX: check range ? */
+    offset = (FT_UShort)( base_value_p->u +
+                          ( relative_gindex * sizeof ( FT_UShort ) ) );
+
+    p     = valid->lookuptbl_head + offset;
+    limit = lookuptbl_limit;
+    GXV_LIMIT_CHECK( 2 );
+
+    value.u = FT_NEXT_USHORT( p );
+
+    return value;
+  }
+
+
+  static void
+  gxv_bsln_parts_fmt0_validate( FT_Bytes       tables,
+                                FT_Bytes       limit,
+                                GXV_Validator  valid )
+  {
+    FT_Bytes  p = tables;
+
+
+    GXV_NAME_ENTER( "parts format 0" );
+
+    /* deltas */
+    GXV_LIMIT_CHECK( 2 * GXV_BSLN_VALUE_COUNT );
+
+    valid->table_data = NULL;      /* No ctlPoints here. */
+
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_bsln_parts_fmt1_validate( FT_Bytes       tables,
+                                FT_Bytes       limit,
+                                GXV_Validator  valid )
+  {
+    FT_Bytes  p = tables;
+
+
+    GXV_NAME_ENTER( "parts format 1" );
+
+    /* deltas */
+    gxv_bsln_parts_fmt0_validate( p, limit, valid );
+
+    /* mappingData */
+    valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;
+    valid->lookupval_func   = gxv_bsln_LookupValue_validate;
+    valid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit;
+    gxv_LookupTable_validate( p + 2 * GXV_BSLN_VALUE_COUNT,
+                              limit,
+                              valid );
+
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_bsln_parts_fmt2_validate( FT_Bytes       tables,
+                                FT_Bytes       limit,
+                                GXV_Validator  valid )
+  {
+    FT_Bytes   p = tables;
+
+    FT_UShort  stdGlyph;
+    FT_UShort  ctlPoint;
+    FT_Int     i;
+
+    FT_UShort  defaultBaseline = GXV_BSLN_DATA( defaultBaseline );
+
+
+    GXV_NAME_ENTER( "parts format 2" );
+
+    GXV_LIMIT_CHECK( 2 + ( 2 * GXV_BSLN_VALUE_COUNT ) );
+
+    /* stdGlyph */
+    stdGlyph = FT_NEXT_USHORT( p );
+    GXV_TRACE(( " (stdGlyph = %u)\n", stdGlyph ));
+
+    gxv_glyphid_validate( stdGlyph, valid );
+
+    /* Record the position of ctlPoints */
+    GXV_BSLN_DATA( ctlPoints_p ) = p;
+
+    /* ctlPoints */
+    for ( i = 0; i < GXV_BSLN_VALUE_COUNT; i++ )
+    {
+      ctlPoint = FT_NEXT_USHORT( p );
+      if ( ctlPoint == GXV_BSLN_VALUE_EMPTY )
+      {
+        if ( i == defaultBaseline )
+          FT_INVALID_DATA;
+      }
+      else
+        gxv_ctlPoint_validate( stdGlyph, (FT_Short)ctlPoint, valid );
+    }
+
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_bsln_parts_fmt3_validate( FT_Bytes       tables,
+                                FT_Bytes       limit,
+                                GXV_Validator  valid)
+  {
+    FT_Bytes  p = tables;
+
+
+    GXV_NAME_ENTER( "parts format 3" );
+
+    /* stdGlyph + ctlPoints */
+    gxv_bsln_parts_fmt2_validate( p, limit, valid );
+
+    /* mappingData */
+    valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;
+    valid->lookupval_func   = gxv_bsln_LookupValue_validate;
+    valid->lookupfmt4_trans = gxv_bsln_LookupFmt4_transit;
+    gxv_LookupTable_validate( p + ( 2 + 2 * GXV_BSLN_VALUE_COUNT ),
+                              limit,
+                              valid );
+
+    GXV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         bsln TABLE                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  gxv_bsln_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  ftvalid )
+  {
+    GXV_ValidatorRec  validrec;
+    GXV_Validator     valid = &validrec;
+
+    GXV_bsln_DataRec  bslnrec;
+    GXV_bsln_Data     bsln = &bslnrec;
+
+    FT_Bytes  p     = table;
+    FT_Bytes  limit = 0;
+
+    FT_ULong   version;
+    FT_UShort  format;
+    FT_UShort  defaultBaseline;
+
+    GXV_Validate_Func  fmt_funcs_table [] =
+    {
+      gxv_bsln_parts_fmt0_validate,
+      gxv_bsln_parts_fmt1_validate,
+      gxv_bsln_parts_fmt2_validate,
+      gxv_bsln_parts_fmt3_validate,
+    };
+
+
+    valid->root       = ftvalid;
+    valid->table_data = bsln;
+    valid->face       = face;
+
+    FT_TRACE3(( "validating `bsln' table\n" ));
+    GXV_INIT;
+
+
+    GXV_LIMIT_CHECK( 4 + 2 + 2 );
+    version         = FT_NEXT_ULONG( p );
+    format          = FT_NEXT_USHORT( p );
+    defaultBaseline = FT_NEXT_USHORT( p );
+
+    /* only version 1.0 is defined (1996) */
+    if ( version != 0x00010000UL )
+      FT_INVALID_FORMAT;
+
+    /* only format 1, 2, 3 are defined (1996) */
+    GXV_TRACE(( " (format = %d)\n", format ));
+    if ( format > 3 )
+      FT_INVALID_FORMAT;
+
+    if ( defaultBaseline > 31 )
+      FT_INVALID_FORMAT;
+
+    bsln->defaultBaseline = defaultBaseline;
+
+    fmt_funcs_table[format]( p, limit, valid );
+
+    FT_TRACE4(( "\n" ));
+  }
+
+
+/* arch-tag: ebe81143-fdaa-4c68-a4d1-b57227daa3bc
+   (do not change this comment) */
+
+
+/* END */
diff --git a/src/gxvalid/gxvcommn.c b/src/gxvalid/gxvcommn.c
new file mode 100644 (file)
index 0000000..72efd6f
--- /dev/null
@@ -0,0 +1,1744 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvcommn.c                                                             */
+/*                                                                         */
+/*    TrueTypeGX/AAT common tables validation (body).                      */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2009, 2010                                       */
+/*  by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                      */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvcommn.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvcommon
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       16bit offset sorter                     *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static int
+  gxv_compare_ushort_offset( FT_UShort*  a,
+                             FT_UShort*  b )
+  {
+    if ( *a < *b )
+      return -1;
+    else if ( *a > *b )
+      return 1;
+    else
+      return 0;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_set_length_by_ushort_offset( FT_UShort*     offset,
+                                   FT_UShort**    length,
+                                   FT_UShort*     buff,
+                                   FT_UInt        nmemb,
+                                   FT_UShort      limit,
+                                   GXV_Validator  valid )
+  {
+    FT_UInt  i;
+
+
+    for ( i = 0; i < nmemb; i++ )
+      *(length[i]) = 0;
+
+    for ( i = 0; i < nmemb; i++ )
+      buff[i] = offset[i];
+    buff[nmemb] = limit;
+
+    ft_qsort( buff, ( nmemb + 1 ), sizeof ( FT_UShort ),
+              ( int(*)(const void*, const void*) )gxv_compare_ushort_offset );
+
+    if ( buff[nmemb] > limit )
+      FT_INVALID_OFFSET;
+
+    for ( i = 0; i < nmemb; i++ )
+    {
+      FT_UInt  j;
+
+
+      for ( j = 0; j < nmemb; j++ )
+        if ( buff[j] == offset[i] )
+          break;
+
+      if ( j == nmemb )
+        FT_INVALID_OFFSET;
+
+      *(length[i]) = (FT_UShort)( buff[j + 1] - buff[j] );
+
+      if ( 0 != offset[i] && 0 == *(length[i]) )
+        FT_INVALID_OFFSET;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       32bit offset sorter                     *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static int
+  gxv_compare_ulong_offset( FT_ULong*  a,
+                            FT_ULong*  b )
+  {
+    if ( *a < *b )
+      return -1;
+    else if ( *a > *b )
+      return 1;
+    else
+      return 0;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_set_length_by_ulong_offset( FT_ULong*      offset,
+                                  FT_ULong**     length,
+                                  FT_ULong*      buff,
+                                  FT_UInt        nmemb,
+                                  FT_ULong       limit,
+                                  GXV_Validator  valid)
+  {
+    FT_UInt  i;
+
+
+    for ( i = 0; i < nmemb; i++ )
+      *(length[i]) = 0;
+
+    for ( i = 0; i < nmemb; i++ )
+      buff[i] = offset[i];
+    buff[nmemb] = limit;
+
+    ft_qsort( buff, ( nmemb + 1 ), sizeof ( FT_ULong ),
+              ( int(*)(const void*, const void*) )gxv_compare_ulong_offset );
+
+    if ( buff[nmemb] > limit )
+      FT_INVALID_OFFSET;
+
+    for ( i = 0; i < nmemb; i++ )
+    {
+      FT_UInt  j;
+
+
+      for ( j = 0; j < nmemb; j++ )
+        if ( buff[j] == offset[i] )
+          break;
+
+      if ( j == nmemb )
+        FT_INVALID_OFFSET;
+
+      *(length[i]) = buff[j + 1] - buff[j];
+
+      if ( 0 != offset[i] && 0 == *(length[i]) )
+        FT_INVALID_OFFSET;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****               scan value array and get min & max              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_LOCAL_DEF( void )
+  gxv_array_getlimits_byte( FT_Bytes       table,
+                            FT_Bytes       limit,
+                            FT_Byte*       min,
+                            FT_Byte*       max,
+                            GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+
+    *min = 0xFF;
+    *max = 0x00;
+
+    while ( p < limit )
+    {
+      FT_Byte  val;
+
+
+      GXV_LIMIT_CHECK( 1 );
+      val = FT_NEXT_BYTE( p );
+
+      *min = (FT_Byte)FT_MIN( *min, val );
+      *max = (FT_Byte)FT_MAX( *max, val );
+    }
+
+    valid->subtable_length = p - table;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_array_getlimits_ushort( FT_Bytes       table,
+                              FT_Bytes       limit,
+                              FT_UShort*     min,
+                              FT_UShort*     max,
+                              GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+
+    *min = 0xFFFFU;
+    *max = 0x0000;
+
+    while ( p < limit )
+    {
+      FT_UShort  val;
+
+
+      GXV_LIMIT_CHECK( 2 );
+      val = FT_NEXT_USHORT( p );
+
+      *min = (FT_Byte)FT_MIN( *min, val );
+      *max = (FT_Byte)FT_MAX( *max, val );
+    }
+
+    valid->subtable_length = p - table;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       BINSEARCHHEADER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct  GXV_BinSrchHeader_
+  {
+    FT_UShort  unitSize;
+    FT_UShort  nUnits;
+    FT_UShort  searchRange;
+    FT_UShort  entrySelector;
+    FT_UShort  rangeShift;
+
+  } GXV_BinSrchHeader;
+
+
+  static void
+  gxv_BinSrchHeader_check_consistency( GXV_BinSrchHeader*  binSrchHeader,
+                                       GXV_Validator       valid )
+  {
+    FT_UShort  searchRange;
+    FT_UShort  entrySelector;
+    FT_UShort  rangeShift;
+
+
+    if ( binSrchHeader->unitSize == 0 )
+      FT_INVALID_DATA;
+
+    if ( binSrchHeader->nUnits == 0 )
+    {
+      if ( binSrchHeader->searchRange   == 0 &&
+           binSrchHeader->entrySelector == 0 &&
+           binSrchHeader->rangeShift    == 0 )
+        return;
+      else
+        FT_INVALID_DATA;
+    }
+
+    for ( searchRange = 1, entrySelector = 1;
+          ( searchRange * 2 ) <= binSrchHeader->nUnits &&
+            searchRange < 0x8000U;
+          searchRange *= 2, entrySelector++ )
+      ;
+
+    entrySelector--;
+    searchRange = (FT_UShort)( searchRange * binSrchHeader->unitSize );
+    rangeShift  = (FT_UShort)( binSrchHeader->nUnits * binSrchHeader->unitSize
+                               - searchRange );
+
+    if ( searchRange   != binSrchHeader->searchRange   ||
+         entrySelector != binSrchHeader->entrySelector ||
+         rangeShift    != binSrchHeader->rangeShift    )
+    {
+      GXV_TRACE(( "Inconsistency found in BinSrchHeader\n" ));
+      GXV_TRACE(( "originally: unitSize=%d, nUnits=%d, "
+                  "searchRange=%d, entrySelector=%d, "
+                  "rangeShift=%d\n",
+                  binSrchHeader->unitSize, binSrchHeader->nUnits,
+                  binSrchHeader->searchRange, binSrchHeader->entrySelector,
+                  binSrchHeader->rangeShift ));
+      GXV_TRACE(( "calculated: unitSize=%d, nUnits=%d, "
+                  "searchRange=%d, entrySelector=%d, "
+                  "rangeShift=%d\n",
+                  binSrchHeader->unitSize, binSrchHeader->nUnits,
+                  searchRange, entrySelector, rangeShift ));
+
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+    }
+  }
+
+
+  /*
+   * parser & validator of BinSrchHeader
+   * which is used in LookupTable format 2, 4, 6.
+   *
+   * Essential parameters (unitSize, nUnits) are returned by
+   * given pointer, others (searchRange, entrySelector, rangeShift)
+   * can be calculated by essential parameters, so they are just
+   * validated and discarded.
+   *
+   * However, wrong values in searchRange, entrySelector, rangeShift
+   * won't cause fatal errors, because these parameters might be
+   * only used in old m68k font driver in MacOS.
+   *   -- suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
+   */
+
+  FT_LOCAL_DEF( void )
+  gxv_BinSrchHeader_validate( FT_Bytes       table,
+                              FT_Bytes       limit,
+                              FT_UShort*     unitSize_p,
+                              FT_UShort*     nUnits_p,
+                              GXV_Validator  valid )
+  {
+    FT_Bytes           p = table;
+    GXV_BinSrchHeader  binSrchHeader;
+
+
+    GXV_NAME_ENTER( "BinSrchHeader validate" );
+
+    if ( *unitSize_p == 0 )
+    {
+      GXV_LIMIT_CHECK( 2 );
+      binSrchHeader.unitSize =  FT_NEXT_USHORT( p );
+    }
+    else
+      binSrchHeader.unitSize = *unitSize_p;
+
+    if ( *nUnits_p == 0 )
+    {
+      GXV_LIMIT_CHECK( 2 );
+      binSrchHeader.nUnits = FT_NEXT_USHORT( p );
+    }
+    else
+      binSrchHeader.nUnits = *nUnits_p;
+
+    GXV_LIMIT_CHECK( 2 + 2 + 2 );
+    binSrchHeader.searchRange   = FT_NEXT_USHORT( p );
+    binSrchHeader.entrySelector = FT_NEXT_USHORT( p );
+    binSrchHeader.rangeShift    = FT_NEXT_USHORT( p );
+    GXV_TRACE(( "nUnits %d\n", binSrchHeader.nUnits ));
+
+    gxv_BinSrchHeader_check_consistency( &binSrchHeader, valid );
+
+    if ( *unitSize_p == 0 )
+      *unitSize_p = binSrchHeader.unitSize;
+
+    if ( *nUnits_p == 0 )
+      *nUnits_p = binSrchHeader.nUnits;
+
+    valid->subtable_length = p - table;
+    GXV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         LOOKUP TABLE                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define GXV_LOOKUP_VALUE_LOAD( P, SIGNSPEC )                   \
+          ( P += 2, gxv_lookup_value_load( P - 2, SIGNSPEC ) )
+
+  static GXV_LookupValueDesc
+  gxv_lookup_value_load( FT_Bytes  p,
+                         int       signspec )
+  {
+    GXV_LookupValueDesc  v;
+
+
+    if ( signspec == GXV_LOOKUPVALUE_UNSIGNED )
+      v.u = FT_NEXT_USHORT( p );
+    else
+      v.s = FT_NEXT_SHORT( p );
+
+    return v;
+  }
+
+
+#define GXV_UNITSIZE_VALIDATE( FORMAT, UNITSIZE, NUNITS, CORRECTSIZE ) \
+          FT_BEGIN_STMNT                                               \
+            if ( UNITSIZE != CORRECTSIZE )                             \
+            {                                                          \
+              FT_ERROR(( "unitSize=%d differs from"                    \
+                         " expected unitSize=%d"                       \
+                         " in LookupTable %s\n",                       \
+                          UNITSIZE, CORRECTSIZE, FORMAT ));            \
+              if ( UNITSIZE != 0 && NUNITS != 0 )                      \
+              {                                                        \
+                FT_ERROR(( " cannot validate anymore\n" ));            \
+                FT_INVALID_FORMAT;                                     \
+              }                                                        \
+              else                                                     \
+                FT_ERROR(( " forcibly continues\n" ));                 \
+            }                                                          \
+          FT_END_STMNT
+
+
+  /* ================= Simple Array Format 0 Lookup Table ================ */
+  static void
+  gxv_LookupTable_fmt0_validate( FT_Bytes       table,
+                                 FT_Bytes       limit,
+                                 GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+    FT_UShort  i;
+
+    GXV_LookupValueDesc  value;
+
+
+    GXV_NAME_ENTER( "LookupTable format 0" );
+
+    GXV_LIMIT_CHECK( 2 * valid->face->num_glyphs );
+
+    for ( i = 0; i < valid->face->num_glyphs; i++ )
+    {
+      GXV_LIMIT_CHECK( 2 );
+      if ( p + 2 >= limit )     /* some fonts have too-short fmt0 array */
+      {
+        GXV_TRACE(( "too short, glyphs %d - %d are missing\n",
+                    i, valid->face->num_glyphs ));
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
+        break;
+      }
+
+      value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign );
+      valid->lookupval_func( i, &value, valid );
+    }
+
+    valid->subtable_length = p - table;
+    GXV_EXIT;
+  }
+
+
+  /* ================= Segment Single Format 2 Loolup Table ============== */
+  /*
+   * Apple spec says:
+   *
+   *   To guarantee that a binary search terminates, you must include one or
+   *   more special `end of search table' values at the end of the data to
+   *   be searched.  The number of termination values that need to be
+   *   included is table-specific.  The value that indicates binary search
+   *   termination is 0xFFFF.
+   *
+   * The problem is that nUnits does not include this end-marker.  It's
+   * quite difficult to discriminate whether the following 0xFFFF comes from
+   * the end-marker or some next data.
+   *
+   *   -- suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
+   */
+  static void
+  gxv_LookupTable_fmt2_skip_endmarkers( FT_Bytes       table,
+                                        FT_UShort      unitSize,
+                                        GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+
+    while ( ( p + 4 ) < valid->root->limit )
+    {
+      if ( p[0] != 0xFF || p[1] != 0xFF || /* lastGlyph */
+           p[2] != 0xFF || p[3] != 0xFF )  /* firstGlyph */
+        break;
+      p += unitSize;
+    }
+
+    valid->subtable_length = p - table;
+  }
+
+
+  static void
+  gxv_LookupTable_fmt2_validate( FT_Bytes       table,
+                                 FT_Bytes       limit,
+                                 GXV_Validator  valid )
+  {
+    FT_Bytes             p = table;
+    FT_UShort            gid;
+
+    FT_UShort            unitSize;
+    FT_UShort            nUnits;
+    FT_UShort            unit;
+    FT_UShort            lastGlyph;
+    FT_UShort            firstGlyph;
+    GXV_LookupValueDesc  value;
+
+
+    GXV_NAME_ENTER( "LookupTable format 2" );
+
+    unitSize = nUnits = 0;
+    gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, valid );
+    p += valid->subtable_length;
+
+    GXV_UNITSIZE_VALIDATE( "format2", unitSize, nUnits, 6 );
+
+    for ( unit = 0, gid = 0; unit < nUnits; unit++ )
+    {
+      GXV_LIMIT_CHECK( 2 + 2 + 2 );
+      lastGlyph  = FT_NEXT_USHORT( p );
+      firstGlyph = FT_NEXT_USHORT( p );
+      value      = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign );
+
+      gxv_glyphid_validate( firstGlyph, valid );
+      gxv_glyphid_validate( lastGlyph, valid );
+
+      if ( lastGlyph < gid )
+      {
+        GXV_TRACE(( "reverse ordered segment specification:"
+                    " lastGlyph[%d]=%d < lastGlyph[%d]=%d\n",
+                    unit, lastGlyph, unit - 1 , gid ));
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
+      }
+
+      if ( lastGlyph < firstGlyph )
+      {
+        GXV_TRACE(( "reverse ordered range specification at unit %d:",
+                    " lastGlyph %d < firstGlyph %d ",
+                    unit, lastGlyph, firstGlyph ));
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
+
+        if ( valid->root->level == FT_VALIDATE_TIGHT )
+          continue;     /* ftxvalidator silently skips such an entry */
+
+        FT_TRACE4(( "continuing with exchanged values\n" ));
+        gid        = firstGlyph;
+        firstGlyph = lastGlyph;
+        lastGlyph  = gid;
+      }
+
+      for ( gid = firstGlyph; gid <= lastGlyph; gid++ )
+        valid->lookupval_func( gid, &value, valid );
+    }
+
+    gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, valid );
+    p += valid->subtable_length;
+
+    valid->subtable_length = p - table;
+    GXV_EXIT;
+  }
+
+
+  /* ================= Segment Array Format 4 Lookup Table =============== */
+  static void
+  gxv_LookupTable_fmt4_validate( FT_Bytes       table,
+                                 FT_Bytes       limit,
+                                 GXV_Validator  valid )
+  {
+    FT_Bytes             p = table;
+    FT_UShort            unit;
+    FT_UShort            gid;
+
+    FT_UShort            unitSize;
+    FT_UShort            nUnits;
+    FT_UShort            lastGlyph;
+    FT_UShort            firstGlyph;
+    GXV_LookupValueDesc  base_value;
+    GXV_LookupValueDesc  value;
+
+
+    GXV_NAME_ENTER( "LookupTable format 4" );
+
+    unitSize = nUnits = 0;
+    gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, valid );
+    p += valid->subtable_length;
+
+    GXV_UNITSIZE_VALIDATE( "format4", unitSize, nUnits, 6 );
+
+    for ( unit = 0, gid = 0; unit < nUnits; unit++ )
+    {
+      GXV_LIMIT_CHECK( 2 + 2 );
+      lastGlyph  = FT_NEXT_USHORT( p );
+      firstGlyph = FT_NEXT_USHORT( p );
+
+      gxv_glyphid_validate( firstGlyph, valid );
+      gxv_glyphid_validate( lastGlyph, valid );
+
+      if ( lastGlyph < gid )
+      {
+        GXV_TRACE(( "reverse ordered segment specification:"
+                    " lastGlyph[%d]=%d < lastGlyph[%d]=%d\n",
+                    unit, lastGlyph, unit - 1 , gid ));
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
+      }
+
+      if ( lastGlyph < firstGlyph )
+      {
+        GXV_TRACE(( "reverse ordered range specification at unit %d:",
+                    " lastGlyph %d < firstGlyph %d ",
+                    unit, lastGlyph, firstGlyph ));
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
+
+        if ( valid->root->level == FT_VALIDATE_TIGHT )
+          continue; /* ftxvalidator silently skips such an entry */
+
+        FT_TRACE4(( "continuing with exchanged values\n" ));
+        gid        = firstGlyph;
+        firstGlyph = lastGlyph;
+        lastGlyph  = gid;
+      }
+
+      GXV_LIMIT_CHECK( 2 );
+      base_value = GXV_LOOKUP_VALUE_LOAD( p, GXV_LOOKUPVALUE_UNSIGNED );
+
+      for ( gid = firstGlyph; gid <= lastGlyph; gid++ )
+      {
+        value = valid->lookupfmt4_trans( (FT_UShort)( gid - firstGlyph ),
+                                         &base_value,
+                                         limit,
+                                         valid );
+
+        valid->lookupval_func( gid, &value, valid );
+      }
+    }
+
+    gxv_LookupTable_fmt2_skip_endmarkers( p, unitSize, valid );
+    p += valid->subtable_length;
+
+    valid->subtable_length = p - table;
+    GXV_EXIT;
+  }
+
+
+  /* ================= Segment Table Format 6 Lookup Table =============== */
+  static void
+  gxv_LookupTable_fmt6_skip_endmarkers( FT_Bytes       table,
+                                        FT_UShort      unitSize,
+                                        GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+
+    while ( p < valid->root->limit )
+    {
+      if ( p[0] != 0xFF || p[1] != 0xFF )
+        break;
+      p += unitSize;
+    }
+
+    valid->subtable_length = p - table;
+  }
+
+
+  static void
+  gxv_LookupTable_fmt6_validate( FT_Bytes       table,
+                                 FT_Bytes       limit,
+                                 GXV_Validator  valid )
+  {
+    FT_Bytes             p = table;
+    FT_UShort            unit;
+    FT_UShort            prev_glyph;
+
+    FT_UShort            unitSize;
+    FT_UShort            nUnits;
+    FT_UShort            glyph;
+    GXV_LookupValueDesc  value;
+
+
+    GXV_NAME_ENTER( "LookupTable format 6" );
+
+    unitSize = nUnits = 0;
+    gxv_BinSrchHeader_validate( p, limit, &unitSize, &nUnits, valid );
+    p += valid->subtable_length;
+
+    GXV_UNITSIZE_VALIDATE( "format6", unitSize, nUnits, 4 );
+
+    for ( unit = 0, prev_glyph = 0; unit < nUnits; unit++ )
+    {
+      GXV_LIMIT_CHECK( 2 + 2 );
+      glyph = FT_NEXT_USHORT( p );
+      value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign );
+
+      if ( gxv_glyphid_validate( glyph, valid ) )
+        GXV_TRACE(( " endmarker found within defined range"
+                    " (entry %d < nUnits=%d)\n",
+                    unit, nUnits ));
+
+      if ( prev_glyph > glyph )
+      {
+        GXV_TRACE(( "current gid 0x%04x < previous gid 0x%04x\n",
+                    glyph, prev_glyph ));
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
+      }
+      prev_glyph = glyph;
+
+      valid->lookupval_func( glyph, &value, valid );
+    }
+
+    gxv_LookupTable_fmt6_skip_endmarkers( p, unitSize, valid );
+    p += valid->subtable_length;
+
+    valid->subtable_length = p - table;
+    GXV_EXIT;
+  }
+
+
+  /* ================= Trimmed Array Format 8 Lookup Table =============== */
+  static void
+  gxv_LookupTable_fmt8_validate( FT_Bytes       table,
+                                 FT_Bytes       limit,
+                                 GXV_Validator  valid )
+  {
+    FT_Bytes              p = table;
+    FT_UShort             i;
+
+    GXV_LookupValueDesc   value;
+    FT_UShort             firstGlyph;
+    FT_UShort             glyphCount;
+
+
+    GXV_NAME_ENTER( "LookupTable format 8" );
+
+    /* firstGlyph + glyphCount */
+    GXV_LIMIT_CHECK( 2 + 2 );
+    firstGlyph = FT_NEXT_USHORT( p );
+    glyphCount = FT_NEXT_USHORT( p );
+
+    gxv_glyphid_validate( firstGlyph, valid );
+    gxv_glyphid_validate( (FT_UShort)( firstGlyph + glyphCount ), valid );
+
+    /* valueArray */
+    for ( i = 0; i < glyphCount; i++ )
+    {
+      GXV_LIMIT_CHECK( 2 );
+      value = GXV_LOOKUP_VALUE_LOAD( p, valid->lookupval_sign );
+      valid->lookupval_func( (FT_UShort)( firstGlyph + i ), &value, valid );
+    }
+
+    valid->subtable_length = p - table;
+    GXV_EXIT;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_LookupTable_validate( FT_Bytes       table,
+                            FT_Bytes       limit,
+                            GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+    FT_UShort  format;
+
+    GXV_Validate_Func  fmt_funcs_table[] =
+    {
+      gxv_LookupTable_fmt0_validate, /* 0 */
+      NULL,                          /* 1 */
+      gxv_LookupTable_fmt2_validate, /* 2 */
+      NULL,                          /* 3 */
+      gxv_LookupTable_fmt4_validate, /* 4 */
+      NULL,                          /* 5 */
+      gxv_LookupTable_fmt6_validate, /* 6 */
+      NULL,                          /* 7 */
+      gxv_LookupTable_fmt8_validate, /* 8 */
+    };
+
+    GXV_Validate_Func  func;
+
+
+    GXV_NAME_ENTER( "LookupTable" );
+
+    /* lookuptbl_head may be used in fmt4 transit function. */
+    valid->lookuptbl_head = table;
+
+    /* format */
+    GXV_LIMIT_CHECK( 2 );
+    format = FT_NEXT_USHORT( p );
+    GXV_TRACE(( " (format %d)\n", format ));
+
+    if ( format > 8 )
+      FT_INVALID_FORMAT;
+
+    func = fmt_funcs_table[format];
+    if ( func == NULL )
+      FT_INVALID_FORMAT;
+
+    func( p, limit, valid );
+    p += valid->subtable_length;
+
+    valid->subtable_length = p - table;
+
+    GXV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          Glyph ID                             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( FT_Int )
+  gxv_glyphid_validate( FT_UShort      gid,
+                        GXV_Validator  valid )
+  {
+    FT_Face  face;
+
+
+    if ( gid == 0xFFFFU )
+    {
+      GXV_EXIT;
+      return 1;
+    }
+
+    face = valid->face;
+    if ( face->num_glyphs < gid )
+    {
+      GXV_TRACE(( " gxv_glyphid_check() gid overflow: num_glyphs %d < %d\n",
+                  face->num_glyphs, gid ));
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
+    }
+
+    return 0;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                        CONTROL POINT                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  gxv_ctlPoint_validate( FT_UShort      gid,
+                         FT_Short       ctl_point,
+                         GXV_Validator  valid )
+  {
+    FT_Face       face;
+    FT_Error      error;
+
+    FT_GlyphSlot  glyph;
+    FT_Outline    outline;
+    short         n_points;
+
+
+    face = valid->face;
+
+    error = FT_Load_Glyph( face,
+                           gid,
+                           FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_TRANSFORM );
+    if ( error )
+      FT_INVALID_GLYPH_ID;
+
+    glyph    = face->glyph;
+    outline  = glyph->outline;
+    n_points = outline.n_points;
+
+
+    if ( !( ctl_point < n_points ) )
+      FT_INVALID_DATA;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          SFNT NAME                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  gxv_sfntName_validate( FT_UShort      name_index,
+                         FT_UShort      min_index,
+                         FT_UShort      max_index,
+                         GXV_Validator  valid )
+  {
+    FT_SfntName  name;
+    FT_UInt      i;
+    FT_UInt      nnames;
+
+
+    GXV_NAME_ENTER( "sfntName" );
+
+    if ( name_index < min_index || max_index < name_index )
+      FT_INVALID_FORMAT;
+
+    nnames = FT_Get_Sfnt_Name_Count( valid->face );
+    for ( i = 0; i < nnames; i++ )
+    {
+      if ( FT_Get_Sfnt_Name( valid->face, i, &name ) != GXV_Err_Ok )
+        continue ;
+
+      if ( name.name_id == name_index )
+        goto Out;
+    }
+
+    GXV_TRACE(( "  nameIndex = %d (UNTITLED)\n", name_index ));
+    FT_INVALID_DATA;
+    goto Exit;  /* make compiler happy */
+
+  Out:
+    FT_TRACE1(( "  nameIndex = %d (", name_index ));
+    GXV_TRACE_HEXDUMP_SFNTNAME( name );
+    FT_TRACE1(( ")\n" ));
+
+  Exit:
+    GXV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          STATE TABLE                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* -------------------------- Class Table --------------------------- */
+
+  /*
+   * highestClass specifies how many classes are defined in this
+   * Class Subtable.  Apple spec does not mention whether undefined
+   * holes in the class (e.g.: 0-3 are predefined, 4 is unused, 5 is used)
+   * are permitted.  At present, holes in a defined class are not checked.
+   *   -- suzuki toshiya <mpsuzuki@hiroshima-u.ac.jp>
+   */
+
+  static void
+  gxv_ClassTable_validate( FT_Bytes       table,
+                           FT_UShort*     length_p,
+                           FT_UShort      stateSize,
+                           FT_Byte*       maxClassID_p,
+                           GXV_Validator  valid )
+  {
+    FT_Bytes   p     = table;
+    FT_Bytes   limit = table + *length_p;
+    FT_UShort  firstGlyph;
+    FT_UShort  nGlyphs;
+
+
+    GXV_NAME_ENTER( "ClassTable" );
+
+    *maxClassID_p = 3;  /* Classes 0, 2, and 3 are predefined */
+
+    GXV_LIMIT_CHECK( 2 + 2 );
+    firstGlyph = FT_NEXT_USHORT( p );
+    nGlyphs    = FT_NEXT_USHORT( p );
+
+    GXV_TRACE(( " (firstGlyph = %d, nGlyphs = %d)\n", firstGlyph, nGlyphs ));
+
+    if ( !nGlyphs )
+      goto Out;
+
+    gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs ), valid );
+
+    {
+      FT_Byte    nGlyphInClass[256];
+      FT_Byte    classID;
+      FT_UShort  i;
+
+
+      ft_memset( nGlyphInClass, 0, 256 );
+
+
+      for ( i = 0; i < nGlyphs; i++ )
+      {
+        GXV_LIMIT_CHECK( 1 );
+        classID = FT_NEXT_BYTE( p );
+        switch ( classID )
+        {
+          /* following classes should not appear in class array */
+        case 0:             /* end of text */
+        case 2:             /* out of bounds */
+        case 3:             /* end of line */
+          FT_INVALID_DATA;
+          break;
+
+        case 1:             /* out of bounds */
+        default:            /* user-defined: 4 - ( stateSize - 1 ) */
+          if ( classID >= stateSize )
+            FT_INVALID_DATA;   /* assign glyph to undefined state */
+
+          nGlyphInClass[classID]++;
+          break;
+        }
+      }
+      *length_p = (FT_UShort)( p - table );
+
+      /* scan max ClassID in use */
+      for ( i = 0; i < stateSize; i++ )
+        if ( ( 3 < i ) && ( nGlyphInClass[i] > 0 ) )
+          *maxClassID_p = (FT_Byte)i;  /* XXX: Check Range? */
+    }
+
+  Out:
+    GXV_TRACE(( "Declared stateSize=0x%02x, Used maxClassID=0x%02x\n",
+                stateSize, *maxClassID_p ));
+    GXV_EXIT;
+  }
+
+
+  /* --------------------------- State Array ----------------------------- */
+
+  static void
+  gxv_StateArray_validate( FT_Bytes       table,
+                           FT_UShort*     length_p,
+                           FT_Byte        maxClassID,
+                           FT_UShort      stateSize,
+                           FT_Byte*       maxState_p,
+                           FT_Byte*       maxEntry_p,
+                           GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_Bytes  limit = table + *length_p;
+    FT_Byte   clazz;
+    FT_Byte   entry;
+
+    FT_UNUSED( stateSize ); /* for the non-debugging case */
+
+
+    GXV_NAME_ENTER( "StateArray" );
+
+    GXV_TRACE(( "parse %d bytes by stateSize=%d maxClassID=%d\n",
+                (int)(*length_p), stateSize, (int)(maxClassID) ));
+
+    /*
+     * 2 states are predefined and must be described in StateArray:
+     * state 0 (start of text), 1 (start of line)
+     */
+    GXV_LIMIT_CHECK( ( 1 + maxClassID ) * 2 );
+
+    *maxState_p = 0;
+    *maxEntry_p = 0;
+
+    /* read if enough to read another state */
+    while ( p + ( 1 + maxClassID ) <= limit )
+    {
+      (*maxState_p)++;
+      for ( clazz = 0; clazz <= maxClassID; clazz++ )
+      {
+        entry = FT_NEXT_BYTE( p );
+        *maxEntry_p = (FT_Byte)FT_MAX( *maxEntry_p, entry );
+      }
+    }
+    GXV_TRACE(( "parsed: maxState=%d, maxEntry=%d\n",
+                *maxState_p, *maxEntry_p ));
+
+    *length_p = (FT_UShort)( p - table );
+
+    GXV_EXIT;
+  }
+
+
+  /* --------------------------- Entry Table ----------------------------- */
+
+  static void
+  gxv_EntryTable_validate( FT_Bytes       table,
+                           FT_UShort*     length_p,
+                           FT_Byte        maxEntry,
+                           FT_UShort      stateArray,
+                           FT_UShort      stateArray_length,
+                           FT_Byte        maxClassID,
+                           FT_Bytes       statetable_table,
+                           FT_Bytes       statetable_limit,
+                           GXV_Validator  valid )
+  {
+    FT_Bytes  p     = table;
+    FT_Bytes  limit = table + *length_p;
+    FT_Byte   entry;
+    FT_Byte   state;
+    FT_Int    entrySize = 2 + 2 + GXV_GLYPHOFFSET_SIZE( statetable );
+
+    GXV_XStateTable_GlyphOffsetDesc  glyphOffset;
+
+
+    GXV_NAME_ENTER( "EntryTable" );
+
+    GXV_TRACE(( "maxEntry=%d entrySize=%d\n", maxEntry, entrySize ));
+
+    if ( ( maxEntry + 1 ) * entrySize > *length_p )
+    {
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_TOO_SHORT );
+
+      /* ftxvalidator and FontValidator both warn and continue */
+      maxEntry = (FT_Byte)( *length_p / entrySize - 1 );
+      GXV_TRACE(( "too large maxEntry, shrinking to %d fit EntryTable length\n",
+                  maxEntry ));
+    }
+
+    for ( entry = 0; entry <= maxEntry; entry++ )
+    {
+      FT_UShort  newState;
+      FT_UShort  flags;
+
+
+      GXV_LIMIT_CHECK( 2 + 2 );
+      newState = FT_NEXT_USHORT( p );
+      flags    = FT_NEXT_USHORT( p );
+
+
+      if ( newState < stateArray                     ||
+           stateArray + stateArray_length < newState )
+      {
+        GXV_TRACE(( " newState offset 0x%04x is out of stateArray\n",
+                    newState ));
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
+        continue;
+      }
+
+      if ( 0 != ( ( newState - stateArray ) % ( 1 + maxClassID ) ) )
+      {
+        GXV_TRACE(( " newState offset 0x%04x is not aligned to %d-classes\n",
+                    newState,  1 + maxClassID ));
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
+        continue;
+      }
+
+      state = (FT_Byte)( ( newState - stateArray ) / ( 1 + maxClassID ) );
+
+      switch ( GXV_GLYPHOFFSET_FMT( statetable ) )
+      {
+      case GXV_GLYPHOFFSET_NONE:
+        glyphOffset.uc = 0;  /* make compiler happy */
+        break;
+
+      case GXV_GLYPHOFFSET_UCHAR:
+        glyphOffset.uc = FT_NEXT_BYTE( p );
+        break;
+
+      case GXV_GLYPHOFFSET_CHAR:
+        glyphOffset.c = FT_NEXT_CHAR( p );
+        break;
+
+      case GXV_GLYPHOFFSET_USHORT:
+        glyphOffset.u = FT_NEXT_USHORT( p );
+        break;
+
+      case GXV_GLYPHOFFSET_SHORT:
+        glyphOffset.s = FT_NEXT_SHORT( p );
+        break;
+
+      case GXV_GLYPHOFFSET_ULONG:
+        glyphOffset.ul = FT_NEXT_ULONG( p );
+        break;
+
+      case GXV_GLYPHOFFSET_LONG:
+        glyphOffset.l = FT_NEXT_LONG( p );
+        break;
+
+      default:
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT );
+        goto Exit;
+      }
+
+      if ( NULL != valid->statetable.entry_validate_func )
+        valid->statetable.entry_validate_func( state,
+                                               flags,
+                                               &glyphOffset,
+                                               statetable_table,
+                                               statetable_limit,
+                                               valid );
+    }
+
+  Exit:
+    *length_p = (FT_UShort)( p - table );
+
+    GXV_EXIT;
+  }
+
+
+  /* =========================== State Table ============================= */
+
+  FT_LOCAL_DEF( void )
+  gxv_StateTable_subtable_setup( FT_UShort      table_size,
+                                 FT_UShort      classTable,
+                                 FT_UShort      stateArray,
+                                 FT_UShort      entryTable,
+                                 FT_UShort*     classTable_length_p,
+                                 FT_UShort*     stateArray_length_p,
+                                 FT_UShort*     entryTable_length_p,
+                                 GXV_Validator  valid )
+  {
+    FT_UShort   o[3];
+    FT_UShort*  l[3];
+    FT_UShort   buff[4];
+
+
+    o[0] = classTable;
+    o[1] = stateArray;
+    o[2] = entryTable;
+    l[0] = classTable_length_p;
+    l[1] = stateArray_length_p;
+    l[2] = entryTable_length_p;
+
+    gxv_set_length_by_ushort_offset( o, l, buff, 3, table_size, valid );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_StateTable_validate( FT_Bytes       table,
+                           FT_Bytes       limit,
+                           GXV_Validator  valid )
+  {
+    FT_UShort   stateSize;
+    FT_UShort   classTable;     /* offset to Class(Sub)Table */
+    FT_UShort   stateArray;     /* offset to StateArray */
+    FT_UShort   entryTable;     /* offset to EntryTable */
+
+    FT_UShort   classTable_length;
+    FT_UShort   stateArray_length;
+    FT_UShort   entryTable_length;
+    FT_Byte     maxClassID;
+    FT_Byte     maxState;
+    FT_Byte     maxEntry;
+
+    GXV_StateTable_Subtable_Setup_Func  setup_func;
+
+    FT_Bytes    p = table;
+
+
+    GXV_NAME_ENTER( "StateTable" );
+
+    GXV_TRACE(( "StateTable header\n" ));
+
+    GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 );
+    stateSize  = FT_NEXT_USHORT( p );
+    classTable = FT_NEXT_USHORT( p );
+    stateArray = FT_NEXT_USHORT( p );
+    entryTable = FT_NEXT_USHORT( p );
+
+    GXV_TRACE(( "stateSize=0x%04x\n", stateSize ));
+    GXV_TRACE(( "offset to classTable=0x%04x\n", classTable ));
+    GXV_TRACE(( "offset to stateArray=0x%04x\n", stateArray ));
+    GXV_TRACE(( "offset to entryTable=0x%04x\n", entryTable ));
+
+    if ( stateSize > 0xFF )
+      FT_INVALID_DATA;
+
+    if ( valid->statetable.optdata_load_func != NULL )
+      valid->statetable.optdata_load_func( p, limit, valid );
+
+    if ( valid->statetable.subtable_setup_func != NULL)
+      setup_func = valid->statetable.subtable_setup_func;
+    else
+      setup_func = gxv_StateTable_subtable_setup;
+
+    setup_func( (FT_UShort)( limit - table ),
+                classTable,
+                stateArray,
+                entryTable,
+                &classTable_length,
+                &stateArray_length,
+                &entryTable_length,
+                valid );
+
+    GXV_TRACE(( "StateTable Subtables\n" ));
+
+    if ( classTable != 0 )
+      gxv_ClassTable_validate( table + classTable,
+                               &classTable_length,
+                               stateSize,
+                               &maxClassID,
+                               valid );
+    else
+      maxClassID = (FT_Byte)( stateSize - 1 );
+
+    if ( stateArray != 0 )
+      gxv_StateArray_validate( table + stateArray,
+                               &stateArray_length,
+                               maxClassID,
+                               stateSize,
+                               &maxState,
+                               &maxEntry,
+                               valid );
+    else
+    {
+      maxState = 1;     /* 0:start of text, 1:start of line are predefined */
+      maxEntry = 0;
+    }
+
+    if ( maxEntry > 0 && entryTable == 0 )
+      FT_INVALID_OFFSET;
+
+    if ( entryTable != 0 )
+      gxv_EntryTable_validate( table + entryTable,
+                               &entryTable_length,
+                               maxEntry,
+                               stateArray,
+                               stateArray_length,
+                               maxClassID,
+                               table,
+                               limit,
+                               valid );
+
+    GXV_EXIT;
+  }
+
+
+  /* ================= eXtended State Table (for morx) =================== */
+
+  FT_LOCAL_DEF( void )
+  gxv_XStateTable_subtable_setup( FT_ULong       table_size,
+                                  FT_ULong       classTable,
+                                  FT_ULong       stateArray,
+                                  FT_ULong       entryTable,
+                                  FT_ULong*      classTable_length_p,
+                                  FT_ULong*      stateArray_length_p,
+                                  FT_ULong*      entryTable_length_p,
+                                  GXV_Validator  valid )
+  {
+    FT_ULong   o[3];
+    FT_ULong*  l[3];
+    FT_ULong   buff[4];
+
+
+    o[0] = classTable;
+    o[1] = stateArray;
+    o[2] = entryTable;
+    l[0] = classTable_length_p;
+    l[1] = stateArray_length_p;
+    l[2] = entryTable_length_p;
+
+    gxv_set_length_by_ulong_offset( o, l, buff, 3, table_size, valid );
+  }
+
+
+  static void
+  gxv_XClassTable_lookupval_validate( FT_UShort            glyph,
+                                      GXV_LookupValueCPtr  value_p,
+                                      GXV_Validator        valid )
+  {
+    FT_UNUSED( glyph );
+
+    if ( value_p->u >= valid->xstatetable.nClasses )
+      FT_INVALID_DATA;
+    if ( value_p->u > valid->xstatetable.maxClassID )
+      valid->xstatetable.maxClassID = value_p->u;
+  }
+
+
+  /*
+    +===============+ --------+
+    | lookup header |         |
+    +===============+         |
+    | BinSrchHeader |         |
+    +===============+         |
+    | lastGlyph[0]  |         |
+    +---------------+         |
+    | firstGlyph[0] |         |    head of lookup table
+    +---------------+         |             +
+    | offset[0]     |    ->   |          offset            [byte]
+    +===============+         |             +
+    | lastGlyph[1]  |         | (glyphID - firstGlyph) * 2 [byte]
+    +---------------+         |
+    | firstGlyph[1] |         |
+    +---------------+         |
+    | offset[1]     |         |
+    +===============+         |
+                              |
+     ....                     |
+                              |
+    16bit value array         |
+    +===============+         |
+    |     value     | <-------+
+     ....
+  */
+  static GXV_LookupValueDesc
+  gxv_XClassTable_lookupfmt4_transit( FT_UShort            relative_gindex,
+                                      GXV_LookupValueCPtr  base_value_p,
+                                      FT_Bytes             lookuptbl_limit,
+                                      GXV_Validator        valid )
+  {
+    FT_Bytes             p;
+    FT_Bytes             limit;
+    FT_UShort            offset;
+    GXV_LookupValueDesc  value;
+
+    /* XXX: check range? */
+    offset = (FT_UShort)( base_value_p->u +
+                          relative_gindex * sizeof ( FT_UShort ) );
+
+    p     = valid->lookuptbl_head + offset;
+    limit = lookuptbl_limit;
+
+    GXV_LIMIT_CHECK ( 2 );
+    value.u = FT_NEXT_USHORT( p );
+
+    return value;
+  }
+
+
+  static void
+  gxv_XStateArray_validate( FT_Bytes       table,
+                            FT_ULong*      length_p,
+                            FT_UShort      maxClassID,
+                            FT_ULong       stateSize,
+                            FT_UShort*     maxState_p,
+                            FT_UShort*     maxEntry_p,
+                            GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+    FT_Bytes   limit = table + *length_p;
+    FT_UShort  clazz;
+    FT_UShort  entry;
+
+    FT_UNUSED( stateSize ); /* for the non-debugging case */
+
+
+    GXV_NAME_ENTER( "XStateArray" );
+
+    GXV_TRACE(( "parse % 3d bytes by stateSize=% 3d maxClassID=% 3d\n",
+                (int)(*length_p), stateSize, (int)(maxClassID) ));
+
+    /*
+     * 2 states are predefined and must be described:
+     * state 0 (start of text), 1 (start of line)
+     */
+    GXV_LIMIT_CHECK( ( 1 + maxClassID ) * 2 * 2 );
+
+    *maxState_p = 0;
+    *maxEntry_p = 0;
+
+    /* read if enough to read another state */
+    while ( p + ( ( 1 + maxClassID ) * 2 ) <= limit )
+    {
+      (*maxState_p)++;
+      for ( clazz = 0; clazz <= maxClassID; clazz++ )
+      {
+        entry = FT_NEXT_USHORT( p );
+        *maxEntry_p = (FT_UShort)FT_MAX( *maxEntry_p, entry );
+      }
+    }
+    GXV_TRACE(( "parsed: maxState=%d, maxEntry=%d\n",
+                *maxState_p, *maxEntry_p ));
+
+    *length_p = p - table;
+
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_XEntryTable_validate( FT_Bytes       table,
+                            FT_ULong*      length_p,
+                            FT_UShort      maxEntry,
+                            FT_ULong       stateArray_length,
+                            FT_UShort      maxClassID,
+                            FT_Bytes       xstatetable_table,
+                            FT_Bytes       xstatetable_limit,
+                            GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+    FT_Bytes   limit = table + *length_p;
+    FT_UShort  entry;
+    FT_UShort  state;
+    FT_Int     entrySize = 2 + 2 + GXV_GLYPHOFFSET_SIZE( xstatetable );
+
+
+    GXV_NAME_ENTER( "XEntryTable" );
+    GXV_TRACE(( "maxEntry=%d entrySize=%d\n", maxEntry, entrySize ));
+
+    if ( ( p + ( maxEntry + 1 ) * entrySize ) > limit )
+      FT_INVALID_TOO_SHORT;
+
+    for (entry = 0; entry <= maxEntry ; entry++ )
+    {
+      FT_UShort                        newState_idx;
+      FT_UShort                        flags;
+      GXV_XStateTable_GlyphOffsetDesc  glyphOffset;
+
+
+      GXV_LIMIT_CHECK( 2 + 2 );
+      newState_idx = FT_NEXT_USHORT( p );
+      flags        = FT_NEXT_USHORT( p );
+
+      if ( stateArray_length < (FT_ULong)( newState_idx * 2 ) )
+      {
+        GXV_TRACE(( "  newState index 0x%04x points out of stateArray\n",
+                    newState_idx ));
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
+      }
+
+      state = (FT_UShort)( newState_idx / ( 1 + maxClassID ) );
+      if ( 0 != ( newState_idx % ( 1 + maxClassID ) ) )
+      {
+        FT_TRACE4(( "-> new state = %d (supposed)\n"
+                    "but newState index 0x%04x is not aligned to %d-classes\n",
+                    state, newState_idx,  1 + maxClassID ));
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
+      }
+
+      switch ( GXV_GLYPHOFFSET_FMT( xstatetable ) )
+      {
+      case GXV_GLYPHOFFSET_NONE:
+        glyphOffset.uc = 0; /* make compiler happy */
+        break;
+
+      case GXV_GLYPHOFFSET_UCHAR:
+        glyphOffset.uc = FT_NEXT_BYTE( p );
+        break;
+
+      case GXV_GLYPHOFFSET_CHAR:
+        glyphOffset.c = FT_NEXT_CHAR( p );
+        break;
+
+      case GXV_GLYPHOFFSET_USHORT:
+        glyphOffset.u = FT_NEXT_USHORT( p );
+        break;
+
+      case GXV_GLYPHOFFSET_SHORT:
+        glyphOffset.s = FT_NEXT_SHORT( p );
+        break;
+
+      case GXV_GLYPHOFFSET_ULONG:
+        glyphOffset.ul = FT_NEXT_ULONG( p );
+        break;
+
+      case GXV_GLYPHOFFSET_LONG:
+        glyphOffset.l = FT_NEXT_LONG( p );
+        break;
+
+      default:
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT );
+        goto Exit;
+      }
+
+      if ( NULL != valid->xstatetable.entry_validate_func )
+        valid->xstatetable.entry_validate_func( state,
+                                                flags,
+                                                &glyphOffset,
+                                                xstatetable_table,
+                                                xstatetable_limit,
+                                                valid );
+    }
+
+  Exit:
+    *length_p = p - table;
+
+    GXV_EXIT;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_XStateTable_validate( FT_Bytes       table,
+                            FT_Bytes       limit,
+                            GXV_Validator  valid )
+  {
+    /* StateHeader members */
+    FT_ULong   classTable;      /* offset to Class(Sub)Table */
+    FT_ULong   stateArray;      /* offset to StateArray */
+    FT_ULong   entryTable;      /* offset to EntryTable */
+
+    FT_ULong   classTable_length;
+    FT_ULong   stateArray_length;
+    FT_ULong   entryTable_length;
+    FT_UShort  maxState;
+    FT_UShort  maxEntry;
+
+    GXV_XStateTable_Subtable_Setup_Func  setup_func;
+
+    FT_Bytes   p = table;
+
+
+    GXV_NAME_ENTER( "XStateTable" );
+
+    GXV_TRACE(( "XStateTable header\n" ));
+
+    GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 );
+    valid->xstatetable.nClasses = FT_NEXT_ULONG( p );
+    classTable = FT_NEXT_ULONG( p );
+    stateArray = FT_NEXT_ULONG( p );
+    entryTable = FT_NEXT_ULONG( p );
+
+    GXV_TRACE(( "nClasses =0x%08x\n", valid->xstatetable.nClasses ));
+    GXV_TRACE(( "offset to classTable=0x%08x\n", classTable ));
+    GXV_TRACE(( "offset to stateArray=0x%08x\n", stateArray ));
+    GXV_TRACE(( "offset to entryTable=0x%08x\n", entryTable ));
+
+    if ( valid->xstatetable.nClasses > 0xFFFFU )
+      FT_INVALID_DATA;
+
+    GXV_TRACE(( "StateTable Subtables\n" ));
+
+    if ( valid->xstatetable.optdata_load_func != NULL )
+      valid->xstatetable.optdata_load_func( p, limit, valid );
+
+    if ( valid->xstatetable.subtable_setup_func != NULL )
+      setup_func = valid->xstatetable.subtable_setup_func;
+    else
+      setup_func = gxv_XStateTable_subtable_setup;
+
+    setup_func( limit - table,
+                classTable,
+                stateArray,
+                entryTable,
+                &classTable_length,
+                &stateArray_length,
+                &entryTable_length,
+                valid );
+
+    if ( classTable != 0 )
+    {
+      valid->xstatetable.maxClassID = 0;
+      valid->lookupval_sign         = GXV_LOOKUPVALUE_UNSIGNED;
+      valid->lookupval_func         = gxv_XClassTable_lookupval_validate;
+      valid->lookupfmt4_trans       = gxv_XClassTable_lookupfmt4_transit;
+      gxv_LookupTable_validate( table + classTable,
+                                table + classTable + classTable_length,
+                                valid );
+      if ( valid->subtable_length < classTable_length )
+        classTable_length = valid->subtable_length;
+    }
+    else
+    {
+      /* XXX: check range? */
+      valid->xstatetable.maxClassID =
+        (FT_UShort)( valid->xstatetable.nClasses - 1 );
+    }
+
+    if ( stateArray != 0 )
+      gxv_XStateArray_validate( table + stateArray,
+                                &stateArray_length,
+                                valid->xstatetable.maxClassID,
+                                valid->xstatetable.nClasses,
+                                &maxState,
+                                &maxEntry,
+                                valid );
+    else
+    {
+      maxState = 1; /* 0:start of text, 1:start of line are predefined */
+      maxEntry = 0;
+    }
+
+    if ( maxEntry > 0 && entryTable == 0 )
+      FT_INVALID_OFFSET;
+
+    if ( entryTable != 0 )
+      gxv_XEntryTable_validate( table + entryTable,
+                                &entryTable_length,
+                                maxEntry,
+                                stateArray_length,
+                                valid->xstatetable.maxClassID,
+                                table,
+                                limit,
+                                valid );
+
+    GXV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                        Table overlapping                      *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static int
+  gxv_compare_ranges( FT_Bytes  table1_start,
+                      FT_ULong  table1_length,
+                      FT_Bytes  table2_start,
+                      FT_ULong  table2_length )
+  {
+    if ( table1_start == table2_start )
+    {
+      if ( ( table1_length == 0 || table2_length == 0 ) )
+        goto Out;
+    }
+    else if ( table1_start < table2_start )
+    {
+      if ( ( table1_start + table1_length ) <= table2_start )
+        goto Out;
+    }
+    else if ( table1_start > table2_start )
+    {
+      if ( ( table1_start >= table2_start + table2_length ) )
+        goto Out;
+    }
+    return 1;
+
+  Out:
+    return 0;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_odtect_add_range( FT_Bytes          start,
+                        FT_ULong          length,
+                        const FT_String*  name,
+                        GXV_odtect_Range  odtect )
+  {
+    odtect->range[odtect->nRanges].start  = start;
+    odtect->range[odtect->nRanges].length = length;
+    odtect->range[odtect->nRanges].name   = (FT_String*)name;
+    odtect->nRanges++;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_odtect_validate( GXV_odtect_Range  odtect,
+                       GXV_Validator     valid )
+  {
+    FT_UInt  i, j;
+
+
+    GXV_NAME_ENTER( "check overlap among multi ranges" );
+
+    for ( i = 0; i < odtect->nRanges; i++ )
+      for ( j = 0; j < i; j++ )
+        if ( 0 != gxv_compare_ranges( odtect->range[i].start,
+                                      odtect->range[i].length,
+                                      odtect->range[j].start,
+                                      odtect->range[j].length ) )
+        {
+          if ( odtect->range[i].name || odtect->range[j].name )
+            GXV_TRACE(( "found overlap between range %d and range %d\n",
+                        i, j ));
+          else
+            GXV_TRACE(( "found overlap between `%s' and `%s\'\n",
+                        odtect->range[i].name,
+                        odtect->range[j].name ));
+          FT_INVALID_OFFSET;
+        }
+
+    GXV_EXIT;
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvcommn.h b/src/gxvalid/gxvcommn.h
new file mode 100644 (file)
index 0000000..1ff87e4
--- /dev/null
@@ -0,0 +1,582 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvcommn.h                                                             */
+/*                                                                         */
+/*    TrueTypeGX/AAT common tables validation (specification).             */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2012                                             */
+/*  by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                      */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*
+   * keywords in variable naming
+   * ---------------------------
+   *  table: Of type FT_Bytes, pointing to the start of this table/subtable.
+   *  limit: Of type FT_Bytes, pointing to the end of this table/subtable,
+   *         including padding for alignment.
+   *  offset: Of type FT_UInt, the number of octets from the start to target.
+   *  length: Of type FT_UInt, the number of octets from the start to the
+   *          end in this table/subtable, including padding for alignment.
+   *
+   *  _MIN, _MAX: Should be added to the tail of macros, as INT_MIN, etc.
+   */
+
+
+#ifndef __GXVCOMMN_H__
+#define __GXVCOMMN_H__
+
+
+#include <ft2build.h>
+#include "gxvalid.h"
+#include FT_INTERNAL_DEBUG_H
+#include FT_SFNT_NAMES_H
+
+
+FT_BEGIN_HEADER
+
+
+  /* some variables are not evaluated or only used in trace */
+
+#ifdef  FT_DEBUG_LEVEL_TRACE
+#define GXV_LOAD_TRACE_VARS
+#else
+#undef  GXV_LOAD_TRACE_VARS
+#endif
+
+#undef GXV_LOAD_UNUSED_VARS /* debug purpose */
+
+#define IS_PARANOID_VALIDATION          ( valid->root->level >= FT_VALIDATE_PARANOID )
+#define GXV_SET_ERR_IF_PARANOID( err )  { if ( IS_PARANOID_VALIDATION ) ( err ); }
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         VALIDATION                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct GXV_ValidatorRec_*  GXV_Validator;
+
+
+#define DUMMY_LIMIT 0
+
+  typedef void
+  (*GXV_Validate_Func)( FT_Bytes       table,
+                        FT_Bytes       limit,
+                        GXV_Validator  valid );
+
+
+  /* ====================== LookupTable Validator ======================== */
+
+  typedef union  GXV_LookupValueDesc_
+  {
+    FT_UShort u;
+    FT_Short  s;
+
+  } GXV_LookupValueDesc;
+
+  typedef const GXV_LookupValueDesc* GXV_LookupValueCPtr;
+
+  typedef enum  GXV_LookupValue_SignSpec_
+  {
+    GXV_LOOKUPVALUE_UNSIGNED = 0,
+    GXV_LOOKUPVALUE_SIGNED
+
+  } GXV_LookupValue_SignSpec;
+
+
+  typedef void
+  (*GXV_Lookup_Value_Validate_Func)( FT_UShort            glyph,
+                                     GXV_LookupValueCPtr  value_p,
+                                     GXV_Validator        valid );
+
+  typedef GXV_LookupValueDesc
+  (*GXV_Lookup_Fmt4_Transit_Func)( FT_UShort            relative_gindex,
+                                   GXV_LookupValueCPtr  base_value_p,
+                                   FT_Bytes             lookuptbl_limit,
+                                   GXV_Validator        valid );
+
+
+  /* ====================== StateTable Validator ========================= */
+
+  typedef enum  GXV_GlyphOffset_Format_
+  {
+    GXV_GLYPHOFFSET_NONE   = -1,
+    GXV_GLYPHOFFSET_UCHAR  = 2,
+    GXV_GLYPHOFFSET_CHAR,
+    GXV_GLYPHOFFSET_USHORT = 4,
+    GXV_GLYPHOFFSET_SHORT,
+    GXV_GLYPHOFFSET_ULONG  = 8,
+    GXV_GLYPHOFFSET_LONG
+
+  } GXV_GlyphOffset_Format;
+
+
+#define GXV_GLYPHOFFSET_FMT( table )           \
+        ( valid->table.entry_glyphoffset_fmt )
+
+#define GXV_GLYPHOFFSET_SIZE( table )              \
+        ( valid->table.entry_glyphoffset_fmt / 2 )
+
+
+  /* ----------------------- 16bit StateTable ---------------------------- */
+
+  typedef union  GXV_StateTable_GlyphOffsetDesc_
+  {
+    FT_Byte    uc;
+    FT_UShort  u;       /* same as GXV_LookupValueDesc */
+    FT_ULong   ul;
+    FT_Char    c;
+    FT_Short   s;       /* same as GXV_LookupValueDesc */
+    FT_Long    l;
+
+  } GXV_StateTable_GlyphOffsetDesc;
+
+  typedef const GXV_StateTable_GlyphOffsetDesc* GXV_StateTable_GlyphOffsetCPtr;
+
+  typedef void
+  (*GXV_StateTable_Subtable_Setup_Func)( FT_UShort      table_size,
+                                         FT_UShort      classTable,
+                                         FT_UShort      stateArray,
+                                         FT_UShort      entryTable,
+                                         FT_UShort*     classTable_length_p,
+                                         FT_UShort*     stateArray_length_p,
+                                         FT_UShort*     entryTable_length_p,
+                                         GXV_Validator  valid );
+
+  typedef void
+  (*GXV_StateTable_Entry_Validate_Func)(
+     FT_Byte                         state,
+     FT_UShort                       flags,
+     GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
+     FT_Bytes                        statetable_table,
+     FT_Bytes                        statetable_limit,
+     GXV_Validator                   valid );
+
+  typedef void
+  (*GXV_StateTable_OptData_Load_Func)( FT_Bytes       table,
+                                       FT_Bytes       limit,
+                                       GXV_Validator  valid );
+
+  typedef struct  GXV_StateTable_ValidatorRec_
+  {
+    GXV_GlyphOffset_Format              entry_glyphoffset_fmt;
+    void*                               optdata;
+
+    GXV_StateTable_Subtable_Setup_Func  subtable_setup_func;
+    GXV_StateTable_Entry_Validate_Func  entry_validate_func;
+    GXV_StateTable_OptData_Load_Func    optdata_load_func;
+
+  } GXV_StateTable_ValidatorRec, *GXV_StateTable_ValidatorRecData;
+
+
+  /* ---------------------- 32bit XStateTable ---------------------------- */
+
+  typedef GXV_StateTable_GlyphOffsetDesc  GXV_XStateTable_GlyphOffsetDesc;
+
+  typedef const GXV_XStateTable_GlyphOffsetDesc* GXV_XStateTable_GlyphOffsetCPtr;
+
+  typedef void
+  (*GXV_XStateTable_Subtable_Setup_Func)( FT_ULong       table_size,
+                                          FT_ULong       classTable,
+                                          FT_ULong       stateArray,
+                                          FT_ULong       entryTable,
+                                          FT_ULong*      classTable_length_p,
+                                          FT_ULong*      stateArray_length_p,
+                                          FT_ULong*      entryTable_length_p,
+                                          GXV_Validator  valid );
+
+  typedef void
+  (*GXV_XStateTable_Entry_Validate_Func)(
+     FT_UShort                       state,
+     FT_UShort                       flags,
+     GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
+     FT_Bytes                        xstatetable_table,
+     FT_Bytes                        xstatetable_limit,
+     GXV_Validator                   valid );
+
+
+  typedef GXV_StateTable_OptData_Load_Func  GXV_XStateTable_OptData_Load_Func;
+
+
+  typedef struct  GXV_XStateTable_ValidatorRec_
+  {
+    int                                  entry_glyphoffset_fmt;
+    void*                                optdata;
+
+    GXV_XStateTable_Subtable_Setup_Func  subtable_setup_func;
+    GXV_XStateTable_Entry_Validate_Func  entry_validate_func;
+    GXV_XStateTable_OptData_Load_Func    optdata_load_func;
+
+    FT_ULong                             nClasses;
+    FT_UShort                            maxClassID;
+
+  } GXV_XStateTable_ValidatorRec, *GXV_XStateTable_ValidatorRecData;
+
+
+  /* ===================================================================== */
+
+  typedef struct  GXV_ValidatorRec_
+  {
+    FT_Validator  root;
+
+    FT_Face       face;
+    void*         table_data;
+
+    FT_ULong      subtable_length;
+
+    GXV_LookupValue_SignSpec        lookupval_sign;
+    GXV_Lookup_Value_Validate_Func  lookupval_func;
+    GXV_Lookup_Fmt4_Transit_Func    lookupfmt4_trans;
+    FT_Bytes                        lookuptbl_head;
+
+    FT_UShort  min_gid;
+    FT_UShort  max_gid;
+
+    GXV_StateTable_ValidatorRec     statetable;
+    GXV_XStateTable_ValidatorRec    xstatetable;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+    FT_UInt             debug_indent;
+    const FT_String*    debug_function_name[3];
+#endif
+
+  } GXV_ValidatorRec;
+
+
+#define GXV_TABLE_DATA( tag, field )                           \
+        ( ( (GXV_ ## tag ## _Data)valid->table_data )->field )
+
+#undef  FT_INVALID_
+#define FT_INVALID_( _prefix, _error )                         \
+          ft_validator_error( valid->root, _prefix ## _error )
+
+#define GXV_LIMIT_CHECK( _count )                                     \
+          FT_BEGIN_STMNT                                              \
+            if ( p + _count > ( limit? limit : valid->root->limit ) ) \
+              FT_INVALID_TOO_SHORT;                                   \
+          FT_END_STMNT
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#define GXV_INIT  valid->debug_indent = 0
+
+#define GXV_NAME_ENTER( name )                             \
+          FT_BEGIN_STMNT                                   \
+            valid->debug_indent += 2;                      \
+            FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
+            FT_TRACE4(( "%s table\n", name ));             \
+          FT_END_STMNT
+
+#define GXV_EXIT  valid->debug_indent -= 2
+
+#define GXV_TRACE( s )                                     \
+          FT_BEGIN_STMNT                                   \
+            FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
+            FT_TRACE4( s );                                \
+          FT_END_STMNT
+
+#else /* !FT_DEBUG_LEVEL_TRACE */
+
+#define GXV_INIT                do { } while ( 0 )
+#define GXV_NAME_ENTER( name )  do { } while ( 0 )
+#define GXV_EXIT                do { } while ( 0 )
+
+#define GXV_TRACE( s )          do { } while ( 0 )
+
+#endif  /* !FT_DEBUG_LEVEL_TRACE */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    32bit alignment checking                   *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define GXV_32BIT_ALIGNMENT_VALIDATE( a ) \
+          FT_BEGIN_STMNT                  \
+            {                             \
+              if ( (a) & 3 )              \
+                FT_INVALID_OFFSET ;       \
+            }                             \
+          FT_END_STMNT
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    Dumping Binary Data                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define GXV_TRACE_HEXDUMP( p, len )                     \
+          FT_BEGIN_STMNT                                \
+            {                                           \
+              FT_Bytes  b;                              \
+                                                        \
+                                                        \
+              for ( b = p; b < (FT_Bytes)p + len; b++ ) \
+                FT_TRACE1(("\\x%02x", *b)) ;            \
+            }                                           \
+          FT_END_STMNT
+
+#define GXV_TRACE_HEXDUMP_C( p, len )                   \
+          FT_BEGIN_STMNT                                \
+            {                                           \
+              FT_Bytes  b;                              \
+                                                        \
+                                                        \
+              for ( b = p; b < (FT_Bytes)p + len; b++ ) \
+                if ( 0x40 < *b && *b < 0x7e )           \
+                  FT_TRACE1(("%c", *b)) ;               \
+                else                                    \
+                  FT_TRACE1(("\\x%02x", *b)) ;          \
+            }                                           \
+          FT_END_STMNT
+
+#define GXV_TRACE_HEXDUMP_SFNTNAME( n )               \
+          GXV_TRACE_HEXDUMP( n.string, n.string_len )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         LOOKUP TABLE                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  gxv_BinSrchHeader_validate( FT_Bytes       p,
+                              FT_Bytes       limit,
+                              FT_UShort*     unitSize_p,
+                              FT_UShort*     nUnits_p,
+                              GXV_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_LookupTable_validate( FT_Bytes       table,
+                            FT_Bytes       limit,
+                            GXV_Validator  valid );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          Glyph ID                             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( FT_Int )
+  gxv_glyphid_validate( FT_UShort      gid,
+                        GXV_Validator  valid );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                        CONTROL POINT                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  gxv_ctlPoint_validate( FT_UShort      gid,
+                         FT_Short       ctl_point,
+                         GXV_Validator  valid );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          SFNT NAME                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  gxv_sfntName_validate( FT_UShort      name_index,
+                         FT_UShort      min_index,
+                         FT_UShort      max_index,
+                         GXV_Validator  valid );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          STATE TABLE                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  gxv_StateTable_subtable_setup( FT_UShort      table_size,
+                                 FT_UShort      classTable,
+                                 FT_UShort      stateArray,
+                                 FT_UShort      entryTable,
+                                 FT_UShort*     classTable_length_p,
+                                 FT_UShort*     stateArray_length_p,
+                                 FT_UShort*     entryTable_length_p,
+                                 GXV_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_XStateTable_subtable_setup( FT_ULong       table_size,
+                                  FT_ULong       classTable,
+                                  FT_ULong       stateArray,
+                                  FT_ULong       entryTable,
+                                  FT_ULong*      classTable_length_p,
+                                  FT_ULong*      stateArray_length_p,
+                                  FT_ULong*      entryTable_length_p,
+                                  GXV_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_StateTable_validate( FT_Bytes       table,
+                           FT_Bytes       limit,
+                           GXV_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_XStateTable_validate( FT_Bytes       table,
+                            FT_Bytes       limit,
+                            GXV_Validator  valid );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                 UTILITY MACROS AND FUNCTIONS                  *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  gxv_array_getlimits_byte( FT_Bytes       table,
+                            FT_Bytes       limit,
+                            FT_Byte*       min,
+                            FT_Byte*       max,
+                            GXV_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_array_getlimits_ushort( FT_Bytes       table,
+                              FT_Bytes       limit,
+                              FT_UShort*     min,
+                              FT_UShort*     max,
+                              GXV_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_set_length_by_ushort_offset( FT_UShort*     offset,
+                                   FT_UShort**    length,
+                                   FT_UShort*     buff,
+                                   FT_UInt        nmemb,
+                                   FT_UShort      limit,
+                                   GXV_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_set_length_by_ulong_offset( FT_ULong*      offset,
+                                  FT_ULong**     length,
+                                  FT_ULong*      buff,
+                                  FT_UInt        nmemb,
+                                  FT_ULong       limit,
+                                  GXV_Validator  valid);
+
+
+#define GXV_SUBTABLE_OFFSET_CHECK( _offset )          \
+          FT_BEGIN_STMNT                              \
+            if ( (_offset) > valid->subtable_length ) \
+              FT_INVALID_OFFSET;                      \
+          FT_END_STMNT
+
+#define GXV_SUBTABLE_LIMIT_CHECK( _count )                  \
+          FT_BEGIN_STMNT                                    \
+            if ( ( p + (_count) - valid->subtable_start ) > \
+                   valid->subtable_length )                 \
+              FT_INVALID_TOO_SHORT;                         \
+          FT_END_STMNT
+
+#define GXV_USHORT_TO_SHORT( _us )                                    \
+          ( ( 0x8000U < ( _us ) ) ? ( ( _us ) - 0x8000U ) : ( _us ) )
+
+#define GXV_STATETABLE_HEADER_SIZE  ( 2 + 2 + 2 + 2 )
+#define GXV_STATEHEADER_SIZE        GXV_STATETABLE_HEADER_SIZE
+
+#define GXV_XSTATETABLE_HEADER_SIZE  ( 4 + 4 + 4 + 4 )
+#define GXV_XSTATEHEADER_SIZE        GXV_XSTATETABLE_HEADER_SIZE
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                        Table overlapping                      *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct  GXV_odtect_DataRec_
+  {
+    FT_Bytes    start;
+    FT_ULong    length;
+    FT_String*  name;
+
+  } GXV_odtect_DataRec,  *GXV_odtect_Data;
+
+  typedef struct  GXV_odtect_RangeRec_
+  {
+    FT_UInt          nRanges;
+    GXV_odtect_Data  range;
+
+  } GXV_odtect_RangeRec, *GXV_odtect_Range;
+
+
+  FT_LOCAL( void )
+  gxv_odtect_add_range( FT_Bytes          start,
+                        FT_ULong          length,
+                        const FT_String*  name,
+                        GXV_odtect_Range  odtect );
+
+  FT_LOCAL( void )
+  gxv_odtect_validate( GXV_odtect_Range  odtect,
+                       GXV_Validator     valid );
+
+
+#define GXV_ODTECT( n, odtect )                              \
+          GXV_odtect_DataRec   odtect ## _range[n];          \
+          GXV_odtect_RangeRec  odtect ## _rec = { 0, NULL }; \
+          GXV_odtect_Range     odtect = NULL
+
+#define GXV_ODTECT_INIT( odtect )                      \
+          FT_BEGIN_STMNT                               \
+            odtect ## _rec.nRanges = 0;                \
+            odtect ## _rec.range   = odtect ## _range; \
+            odtect                 = & odtect ## _rec; \
+          FT_END_STMNT
+
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __GXVCOMMN_H__ */
+
+
+/* END */
diff --git a/src/gxvalid/gxverror.h b/src/gxvalid/gxverror.h
new file mode 100644 (file)
index 0000000..7d2ef78
--- /dev/null
@@ -0,0 +1,53 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxverror.h                                                             */
+/*                                                                         */
+/*    TrueTypeGX/AAT validation module error codes (specification only).   */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2012                                             */
+/*    by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                    */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the OpenType validation module error      */
+  /* enumeration constants.                                                */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __GXVERROR_H__
+#define __GXVERROR_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  GXV_Err_
+#define FT_ERR_BASE    FT_Mod_Err_GXV
+
+#define FT_KEEP_ERR_PREFIX
+
+#include FT_ERRORS_H
+
+#endif /* __GXVERROR_H__ */
+
+
+/* END */
diff --git a/src/gxvalid/gxvfeat.c b/src/gxvalid/gxvfeat.c
new file mode 100644 (file)
index 0000000..6f75650
--- /dev/null
@@ -0,0 +1,339 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvfeat.c                                                              */
+/*                                                                         */
+/*    TrueTypeGX/AAT feat table validation (body).                         */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2008, 2012 by                                    */
+/*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvalid.h"
+#include "gxvcommn.h"
+#include "gxvfeat.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvfeat
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      Data and Types                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct  GXV_feat_DataRec_
+  {
+    FT_UInt    reserved_size;
+    FT_UShort  feature;
+    FT_UShort  setting;
+
+  } GXV_feat_DataRec, *GXV_feat_Data;
+
+
+#define GXV_FEAT_DATA( field )  GXV_TABLE_DATA( feat, field )
+
+
+  typedef enum  GXV_FeatureFlagsMask_
+  {
+    GXV_FEAT_MASK_EXCLUSIVE_SETTINGS = 0x8000U,
+    GXV_FEAT_MASK_DYNAMIC_DEFAULT    = 0x4000,
+    GXV_FEAT_MASK_UNUSED             = 0x3F00,
+    GXV_FEAT_MASK_DEFAULT_SETTING    = 0x00FF
+
+  } GXV_FeatureFlagsMask;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      UTILITY FUNCTIONS                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  gxv_feat_registry_validate( FT_UShort      feature,
+                              FT_UShort      nSettings,
+                              FT_Bool        exclusive,
+                              GXV_Validator  valid )
+  {
+    GXV_NAME_ENTER( "feature in registry" );
+
+    GXV_TRACE(( " (feature = %u)\n", feature ));
+
+    if ( feature >= gxv_feat_registry_length )
+    {
+      GXV_TRACE(( "feature number %d is out of range %d\n",
+                  feature, gxv_feat_registry_length ));
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+      goto Exit;
+    }
+
+    if ( gxv_feat_registry[feature].existence == 0 )
+    {
+      GXV_TRACE(( "feature number %d is in defined range but doesn't exist\n",
+                  feature ));
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+      goto Exit;
+    }
+
+    if ( gxv_feat_registry[feature].apple_reserved )
+    {
+      /* Don't use here. Apple is reserved. */
+      GXV_TRACE(( "feature number %d is reserved by Apple\n", feature ));
+      if ( valid->root->level >= FT_VALIDATE_TIGHT )
+        FT_INVALID_DATA;
+    }
+
+    if ( nSettings != gxv_feat_registry[feature].nSettings )
+    {
+      GXV_TRACE(( "feature %d: nSettings %d != defined nSettings %d\n",
+                  feature, nSettings,
+                  gxv_feat_registry[feature].nSettings ));
+      if ( valid->root->level >= FT_VALIDATE_TIGHT )
+        FT_INVALID_DATA;
+    }
+
+    if ( exclusive != gxv_feat_registry[feature].exclusive )
+    {
+      GXV_TRACE(( "exclusive flag %d differs from predefined value\n",
+                  exclusive ));
+      if ( valid->root->level >= FT_VALIDATE_TIGHT )
+        FT_INVALID_DATA;
+    }
+
+  Exit:
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_feat_name_index_validate( FT_Bytes       table,
+                                FT_Bytes       limit,
+                                GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+    FT_Short  nameIndex;
+
+
+    GXV_NAME_ENTER( "nameIndex" );
+
+    GXV_LIMIT_CHECK( 2 );
+    nameIndex = FT_NEXT_SHORT ( p );
+    GXV_TRACE(( " (nameIndex = %d)\n", nameIndex ));
+
+    gxv_sfntName_validate( (FT_UShort)nameIndex,
+                           255,
+                           32768U,
+                           valid );
+
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_feat_setting_validate( FT_Bytes       table,
+                             FT_Bytes       limit,
+                             FT_Bool        exclusive,
+                             GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+    FT_UShort  setting;
+
+
+    GXV_NAME_ENTER( "setting" );
+
+    GXV_LIMIT_CHECK( 2 );
+
+    setting = FT_NEXT_USHORT( p );
+
+    /* If we have exclusive setting, the setting should be odd. */
+    if ( exclusive && ( setting & 1 ) == 0 )
+      FT_INVALID_DATA;
+
+    gxv_feat_name_index_validate( p, limit, valid );
+
+    GXV_FEAT_DATA( setting ) = setting;
+
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_feat_name_validate( FT_Bytes       table,
+                          FT_Bytes       limit,
+                          GXV_Validator  valid )
+  {
+    FT_Bytes   p             = table;
+    FT_UInt    reserved_size = GXV_FEAT_DATA( reserved_size );
+
+    FT_UShort  feature;
+    FT_UShort  nSettings;
+    FT_ULong   settingTable;
+    FT_UShort  featureFlags;
+
+    FT_Bool    exclusive;
+    FT_Int     last_setting;
+    FT_UInt    i;
+
+
+    GXV_NAME_ENTER( "name" );
+
+    /* feature + nSettings + settingTable + featureFlags */
+    GXV_LIMIT_CHECK( 2 + 2 + 4 + 2 );
+
+    feature = FT_NEXT_USHORT( p );
+    GXV_FEAT_DATA( feature ) = feature;
+
+    nSettings    = FT_NEXT_USHORT( p );
+    settingTable = FT_NEXT_ULONG ( p );
+    featureFlags = FT_NEXT_USHORT( p );
+
+    if ( settingTable < reserved_size )
+      FT_INVALID_OFFSET;
+
+    if ( ( featureFlags & GXV_FEAT_MASK_UNUSED ) == 0 )
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+
+    exclusive = FT_BOOL( featureFlags & GXV_FEAT_MASK_EXCLUSIVE_SETTINGS );
+    if ( exclusive )
+    {
+      FT_Byte  dynamic_default;
+
+
+      if ( featureFlags & GXV_FEAT_MASK_DYNAMIC_DEFAULT )
+        dynamic_default = (FT_Byte)( featureFlags &
+                                     GXV_FEAT_MASK_DEFAULT_SETTING );
+      else
+        dynamic_default = 0;
+
+      /* If exclusive, check whether default setting is in the range. */
+      if ( !( dynamic_default < nSettings ) )
+        FT_INVALID_FORMAT;
+    }
+
+    gxv_feat_registry_validate( feature, nSettings, exclusive, valid );
+
+    gxv_feat_name_index_validate( p, limit, valid );
+
+    p = valid->root->base + settingTable;
+    for ( last_setting = -1, i = 0; i < nSettings; i++ )
+    {
+      gxv_feat_setting_validate( p, limit, exclusive, valid );
+
+      if ( (FT_Int)GXV_FEAT_DATA( setting ) <= last_setting )
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT );
+
+      last_setting = (FT_Int)GXV_FEAT_DATA( setting );
+      /* setting + nameIndex */
+      p += ( 2 + 2 );
+    }
+
+    GXV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         feat TABLE                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  gxv_feat_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  ftvalid )
+  {
+    GXV_ValidatorRec  validrec;
+    GXV_Validator     valid = &validrec;
+
+    GXV_feat_DataRec  featrec;
+    GXV_feat_Data     feat = &featrec;
+
+    FT_Bytes          p     = table;
+    FT_Bytes          limit = 0;
+
+    FT_UInt           featureNameCount;
+
+    FT_UInt           i;
+    FT_Int            last_feature;
+
+
+    valid->root       = ftvalid;
+    valid->table_data = feat;
+    valid->face       = face;
+
+    FT_TRACE3(( "validating `feat' table\n" ));
+    GXV_INIT;
+
+    feat->reserved_size = 0;
+
+    /* version + featureNameCount + none_0 + none_1  */
+    GXV_LIMIT_CHECK( 4 + 2 + 2 + 4 );
+    feat->reserved_size += 4 + 2 + 2 + 4;
+
+    if ( FT_NEXT_ULONG( p ) != 0x00010000UL ) /* Version */
+      FT_INVALID_FORMAT;
+
+    featureNameCount = FT_NEXT_USHORT( p );
+    GXV_TRACE(( " (featureNameCount = %d)\n", featureNameCount ));
+
+    if ( !( IS_PARANOID_VALIDATION ) )
+      p += 6; /* skip (none) and (none) */
+    else
+    {
+      if ( FT_NEXT_USHORT( p ) != 0 )
+        FT_INVALID_DATA;
+
+      if ( FT_NEXT_ULONG( p )  != 0 )
+        FT_INVALID_DATA;
+    }
+
+    feat->reserved_size += featureNameCount * ( 2 + 2 + 4 + 2 + 2 );
+
+    for ( last_feature = -1, i = 0; i < featureNameCount; i++ )
+    {
+      gxv_feat_name_validate( p, limit, valid );
+
+      if ( (FT_Int)GXV_FEAT_DATA( feature ) <= last_feature )
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_FORMAT );
+
+      last_feature = GXV_FEAT_DATA( feature );
+      p += 2 + 2 + 4 + 2 + 2;
+    }
+
+    FT_TRACE4(( "\n" ));
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvfeat.h b/src/gxvalid/gxvfeat.h
new file mode 100644 (file)
index 0000000..049d23a
--- /dev/null
@@ -0,0 +1,172 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvfeat.h                                                              */
+/*                                                                         */
+/*    TrueTypeGX/AAT feat table validation (specification).                */
+/*                                                                         */
+/*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __GXVFEAT_H__
+#define __GXVFEAT_H__
+
+
+#include "gxvalid.h"
+#include "gxvcommn.h"
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                Registry predefined by Apple                   *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* TODO: More compact format */
+  typedef struct  GXV_Feature_RegistryRec_
+  {
+    FT_Bool  existence;
+    FT_Bool  apple_reserved;
+    FT_Bool  exclusive;
+    FT_Byte  nSettings;
+
+  } GX_Feature_RegistryRec;
+
+
+#define gxv_feat_registry_length                  \
+          ( sizeof ( gxv_feat_registry ) /        \
+              sizeof ( GX_Feature_RegistryRec ) )
+
+
+  static GX_Feature_RegistryRec  gxv_feat_registry[] =
+  {
+    /* Generated from gxvfgen.c */
+    {1, 0, 0,  1},   /* All Typographic Features */
+    {1, 0, 0,  8},   /* Ligatures */
+    {1, 0, 1,  3},   /* Cursive Connection */
+    {1, 0, 1,  6},   /* Letter Case */
+    {1, 0, 0,  1},   /* Vertical Substitution */
+    {1, 0, 0,  1},   /* Linguistic Rearrangement */
+    {1, 0, 1,  2},   /* Number Spacing */
+    {1, 1, 0,  0},   /* Apple Reserved 1 */
+    {1, 0, 0,  5},   /* Smart Swashes */
+    {1, 0, 1,  3},   /* Diacritics */
+    {1, 0, 1,  4},   /* Vertical Position */
+    {1, 0, 1,  3},   /* Fractions */
+    {1, 1, 0,  0},   /* Apple Reserved 2 */
+    {1, 0, 0,  1},   /* Overlapping Characters */
+    {1, 0, 0,  6},   /* Typographic Extras */
+    {1, 0, 0,  5},   /* Mathematical Extras */
+    {1, 0, 1,  7},   /* Ornament Sets */
+    {1, 0, 1,  1},   /* Character Alternatives */
+    {1, 0, 1,  5},   /* Design Complexity */
+    {1, 0, 1,  6},   /* Style Options */
+    {1, 0, 1, 11},   /* Character Shape */
+    {1, 0, 1,  2},   /* Number Case */
+    {1, 0, 1,  4},   /* Text Spacing */
+    {1, 0, 1, 10},   /* Transliteration */
+    {1, 0, 1,  9},   /* Annotation */
+    {1, 0, 1,  2},   /* Kana Spacing */
+    {1, 0, 1,  2},   /* Ideographic Spacing */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {0, 0, 0,  0},   /* __EMPTY__ */
+    {1, 0, 1,  4},   /* Text Spacing */
+    {1, 0, 1,  2},   /* Kana Spacing */
+    {1, 0, 1,  2},   /* Ideographic Spacing */
+    {1, 0, 1,  4},   /* CJK Roman Spacing */
+  };
+
+
+#endif /* __GXVFEAT_H__ */
+
+
+/* END */
diff --git a/src/gxvalid/gxvfgen.c b/src/gxvalid/gxvfgen.c
new file mode 100644 (file)
index 0000000..e48778a
--- /dev/null
@@ -0,0 +1,482 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxfgen.c                                                               */
+/*                                                                         */
+/*    Generate feature registry data for gxv `feat' validator.             */
+/*    This program is derived from gxfeatreg.c in gxlayout.                */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2006 by Masatake YAMATO and Redhat K.K.          */
+/*                                                                         */
+/*  This file 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/*  gxfeatreg.c                                                            */
+/*                                                                         */
+/*    Database of font features pre-defined by Apple Computer, Inc.        */
+/*    http://developer.apple.com/fonts/Registry/                           */
+/*    (body).                                                              */
+/*                                                                         */
+/*  Copyright 2003 by                                                      */
+/*  Masatake YAMATO and Redhat K.K.                                        */
+/*                                                                         */
+/*  This file 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* Development of gxfeatreg.c is supported by                              */
+/* Information-technology Promotion Agency, Japan.                         */
+/*                                                                         */
+/***************************************************************************/
+
+
+/***************************************************************************/
+/*                                                                         */
+/* This file is compiled as a stand-alone executable.                      */
+/* This file is never compiled into `libfreetype2'.                        */
+/* The output of this file is used in `gxvfeat.c'.                         */
+/* ----------------------------------------------------------------------- */
+/* Compile: gcc `pkg-config --cflags freetype2` gxvfgen.c -o gxvfgen       */
+/* Run: ./gxvfgen > tmp.c                                                  */
+/*                                                                         */
+/***************************************************************************/
+
+  /*******************************************************************/
+  /* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING */
+  /*******************************************************************/
+
+  /*
+   * If you add a new setting to a feature, check the number of settings
+   * in the feature.  If the number is greater than the value defined as
+   * FEATREG_MAX_SETTING, update the value.
+   */
+#define FEATREG_MAX_SETTING  12
+
+  /*******************************************************************/
+  /* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING */
+  /*******************************************************************/
+
+
+#include <stdio.h>
+#include <string.h>
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      Data and Types                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define APPLE_RESERVED         "Apple Reserved"
+#define APPLE_RESERVED_LENGTH  14
+
+  typedef struct  GX_Feature_RegistryRec_
+  {
+    const char*  feat_name;
+    char         exclusive;
+    char*        setting_name[FEATREG_MAX_SETTING];
+
+  } GX_Feature_RegistryRec;
+
+
+#define EMPTYFEAT {0, 0, {NULL}}
+
+
+  static GX_Feature_RegistryRec featreg_table[] = {
+    {                                       /* 0 */
+      "All Typographic Features",
+      0,
+      {
+        "All Type Features",
+        NULL
+      }
+    }, {                                    /* 1 */
+      "Ligatures",
+      0,
+      {
+        "Required Ligatures",
+        "Common Ligatures",
+        "Rare Ligatures",
+        "Logos",
+        "Rebus Pictures",
+        "Diphthong Ligatures",
+        "Squared Ligatures",
+        "Squared Ligatures, Abbreviated",
+        NULL
+      }
+    }, {                                    /* 2 */
+      "Cursive Connection",
+      1,
+      {
+        "Unconnected",
+        "Partially Connected",
+        "Cursive",
+        NULL
+      }
+    }, {                                    /* 3 */
+      "Letter Case",
+      1,
+      {
+        "Upper & Lower Case",
+        "All Caps",
+        "All Lower Case",
+        "Small Caps",
+        "Initial Caps",
+        "Initial Caps & Small Caps",
+        NULL
+      }
+    }, {                                    /* 4 */
+      "Vertical Substitution",
+      0,
+      {
+        /* "Substitute Vertical Forms", */
+        "Turns on the feature",
+        NULL
+      }
+    }, {                                    /* 5 */
+      "Linguistic Rearrangement",
+      0,
+      {
+        /* "Linguistic Rearrangement", */
+        "Turns on the feature",
+        NULL
+      }
+    }, {                                    /* 6 */
+      "Number Spacing",
+      1,
+      {
+        "Monospaced Numbers",
+        "Proportional Numbers",
+        NULL
+      }
+    }, {                                    /* 7 */
+      APPLE_RESERVED " 1",
+      0,
+      {NULL}
+    }, {                                    /* 8 */
+      "Smart Swashes",
+      0,
+      {
+        "Word Initial Swashes",
+        "Word Final Swashes",
+        "Line Initial Swashes",
+        "Line Final Swashes",
+        "Non-Final Swashes",
+        NULL
+      }
+    }, {                                    /* 9 */
+      "Diacritics",
+      1,
+      {
+        "Show Diacritics",
+        "Hide Diacritics",
+        "Decompose Diacritics",
+        NULL
+      }
+    }, {                                    /* 10 */
+      "Vertical Position",
+      1,
+      {
+        /* "Normal Position", */
+        "No Vertical Position",
+        "Superiors",
+        "Inferiors",
+        "Ordinals",
+        NULL
+      }
+    }, {                                    /* 11 */
+      "Fractions",
+      1,
+      {
+        "No Fractions",
+        "Vertical Fractions",
+        "Diagonal Fractions",
+        NULL
+      }
+    }, {                                    /* 12 */
+      APPLE_RESERVED " 2",
+      0,
+      {NULL}
+    }, {                                    /* 13 */
+      "Overlapping Characters",
+      0,
+      {
+        /* "Prevent Overlap", */
+        "Turns on the feature",
+        NULL
+      }
+    }, {                                    /* 14 */
+      "Typographic Extras",
+      0,
+      {
+        "Hyphens to Em Dash",
+        "Hyphens to En Dash",
+        "Unslashed Zero",
+        "Form Interrobang",
+        "Smart Quotes",
+        "Periods to Ellipsis",
+        NULL
+      }
+    }, {                                    /* 15 */
+      "Mathematical Extras",
+      0,
+      {
+        "Hyphens to Minus",
+        "Asterisk to Multiply",
+        "Slash to Divide",
+        "Inequality Ligatures",
+        "Exponents",
+        NULL
+      }
+    }, {                                    /* 16 */
+      "Ornament Sets",
+      1,
+      {
+        "No Ornaments",
+        "Dingbats",
+        "Pi Characters",
+        "Fleurons",
+        "Decorative Borders",
+        "International Symbols",
+        "Math Symbols",
+        NULL
+      }
+    }, {                                    /* 17 */
+      "Character Alternatives",
+      1,
+      {
+        "No Alternates",
+        /* TODO */
+        NULL
+      }
+    }, {                                    /* 18 */
+      "Design Complexity",
+      1,
+      {
+        "Design Level 1",
+        "Design Level 2",
+        "Design Level 3",
+        "Design Level 4",
+        "Design Level 5",
+        /* TODO */
+        NULL
+      }
+    }, {                                    /* 19 */
+      "Style Options",
+      1,
+      {
+        "No Style Options",
+        "Display Text",
+        "Engraved Text",
+        "Illuminated Caps",
+        "Tilling Caps",
+        "Tall Caps",
+        NULL
+      }
+    }, {                                    /* 20 */
+      "Character Shape",
+      1,
+      {
+        "Traditional Characters",
+        "Simplified Characters",
+        "JIS 1978 Characters",
+        "JIS 1983 Characters",
+        "JIS 1990 Characters",
+        "Traditional Characters, Alternative Set 1",
+        "Traditional Characters, Alternative Set 2",
+        "Traditional Characters, Alternative Set 3",
+        "Traditional Characters, Alternative Set 4",
+        "Traditional Characters, Alternative Set 5",
+        "Expert Characters",
+        NULL                           /* count => 12 */
+      }
+    }, {                                    /* 21 */
+      "Number Case",
+      1,
+      {
+        "Lower Case Numbers",
+        "Upper Case Numbers",
+        NULL
+      }
+    }, {                                    /* 22 */
+      "Text Spacing",
+      1,
+      {
+        "Proportional",
+        "Monospaced",
+        "Half-width",
+        "Normal",
+        NULL
+      }
+    }, /* Here after Newer */  { /* 23 */
+      "Transliteration",
+      1,
+      {
+        "No Transliteration",
+        "Hanja To Hangul",
+        "Hiragana to Katakana",
+        "Katakana to Hiragana",
+        "Kana to Romanization",
+        "Romanization to Hiragana",
+        "Romanization to Katakana",
+        "Hanja to Hangul, Alternative Set 1",
+        "Hanja to Hangul, Alternative Set 2",
+        "Hanja to Hangul, Alternative Set 3",
+        NULL
+      }
+    }, {                                    /* 24 */
+      "Annotation",
+      1,
+      {
+        "No Annotation",
+        "Box Annotation",
+        "Rounded Box Annotation",
+        "Circle Annotation",
+        "Inverted Circle Annotation",
+        "Parenthesis Annotation",
+        "Period Annotation",
+        "Roman Numeral Annotation",
+        "Diamond Annotation",
+        NULL
+      }
+    }, {                                    /* 25 */
+      "Kana Spacing",
+      1,
+      {
+        "Full Width",
+        "Proportional",
+        NULL
+      }
+    }, {                                    /* 26 */
+      "Ideographic Spacing",
+      1,
+      {
+        "Full Width",
+        "Proportional",
+        NULL
+      }
+    }, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT,         /* 27-30 */
+    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 31-35 */
+    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 36-40 */
+    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 40-45 */
+    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 46-50 */
+    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 51-55 */
+    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 56-60 */
+    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 61-65 */
+    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 66-70 */
+    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 71-75 */
+    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 76-80 */
+    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 81-85 */
+    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 86-90 */
+    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, EMPTYFEAT, /* 91-95 */
+    EMPTYFEAT, EMPTYFEAT, EMPTYFEAT,                       /* 96-98 */
+    EMPTYFEAT, /* 99 */ {                   /* 100 => 22 */
+      "Text Spacing",
+      1,
+      {
+        "Proportional",
+        "Monospaced",
+        "Half-width",
+        "Normal",
+        NULL
+      }
+    }, {                                    /* 101 => 25 */
+      "Kana Spacing",
+      1,
+      {
+        "Full Width",
+        "Proportional",
+        NULL
+      }
+    }, {                                    /* 102 => 26 */
+      "Ideographic Spacing",
+      1,
+      {
+        "Full Width",
+        "Proportional",
+        NULL
+      }
+    }, {                                    /* 103 */
+      "CJK Roman Spacing",
+      1,
+      {
+        "Half-width",
+        "Proportional",
+        "Default Roman",
+        "Full-width Roman",
+        NULL
+      }
+    }, {                                    /* 104 => 1 */
+      "All Typographic Features",
+      0,
+      {
+        "All Type Features",
+        NULL
+      }
+    }
+  };
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         Generator                             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  int
+  main( void )
+  {
+    int  i;
+
+
+    printf( "  {\n" );
+    printf( "   /* Generated from %s */\n", __FILE__ );
+
+    for ( i = 0;
+          i < sizeof ( featreg_table ) / sizeof ( GX_Feature_RegistryRec );
+          i++ )
+    {
+      const char*  feat_name;
+      int          nSettings;
+
+
+      feat_name = featreg_table[i].feat_name;
+      for ( nSettings = 0;
+            featreg_table[i].setting_name[nSettings];
+            nSettings++)
+        ;                                   /* Do nothing */
+
+      printf( "    {%1d, %1d, %1d, %2d},   /* %s */\n",
+              feat_name ? 1 : 0,
+              ( feat_name                                                  &&
+                ( ft_strncmp( feat_name,
+                              APPLE_RESERVED, APPLE_RESERVED_LENGTH ) == 0 )
+              ) ? 1 : 0,
+              featreg_table[i].exclusive ? 1 : 0,
+              nSettings,
+              feat_name ? feat_name : "__EMPTY__" );
+    }
+
+    printf( "  };\n" );
+
+    return 0;
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvjust.c b/src/gxvalid/gxvjust.c
new file mode 100644 (file)
index 0000000..7816e0b
--- /dev/null
@@ -0,0 +1,717 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvjust.c                                                              */
+/*                                                                         */
+/*    TrueTypeGX/AAT just table validation (body).                         */
+/*                                                                         */
+/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvalid.h"
+#include "gxvcommn.h"
+
+#include FT_SFNT_NAMES_H
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvjust
+
+  /*
+   * referred `just' table format specification:
+   * http://developer.apple.com/fonts/TTRefMan/RM06/Chap6just.html
+   * last updated 2000.
+   * ----------------------------------------------
+   * [JUST HEADER]: GXV_JUST_HEADER_SIZE
+   * version     (fixed:  32bit) = 0x00010000
+   * format      (uint16: 16bit) = 0 is only defined (2000)
+   * horizOffset (uint16: 16bit)
+   * vertOffset  (uint16: 16bit)
+   * ----------------------------------------------
+   */
+
+  typedef struct  GXV_just_DataRec_
+  {
+    FT_UShort  wdc_offset_max;
+    FT_UShort  wdc_offset_min;
+    FT_UShort  pc_offset_max;
+    FT_UShort  pc_offset_min;
+
+  } GXV_just_DataRec, *GXV_just_Data;
+
+
+#define  GXV_JUST_DATA( a )  GXV_TABLE_DATA( just, a )
+
+
+  /* GX just table does not define their subset of GID */
+  static void
+  gxv_just_check_max_gid( FT_UShort         gid,
+                          const FT_String*  msg_tag,
+                          GXV_Validator     valid )
+  {
+    if ( gid < valid->face->num_glyphs )
+      return;
+
+    GXV_TRACE(( "just table includes too large %s"
+                " GID=%d > %d (in maxp)\n",
+                msg_tag, gid, valid->face->num_glyphs ));
+    GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
+  }
+
+
+  static void
+  gxv_just_wdp_entry_validate( FT_Bytes       table,
+                               FT_Bytes       limit,
+                               GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+    FT_ULong   justClass;
+#ifdef GXV_LOAD_UNUSED_VARS
+    FT_Fixed   beforeGrowLimit;
+    FT_Fixed   beforeShrinkGrowLimit;
+    FT_Fixed   afterGrowLimit;
+    FT_Fixed   afterShrinkGrowLimit;
+    FT_UShort  growFlags;
+    FT_UShort  shrinkFlags;
+#endif
+
+
+    GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 + 4 + 2 + 2 );
+    justClass             = FT_NEXT_ULONG( p );
+#ifndef GXV_LOAD_UNUSED_VARS
+    p += 4 + 4 + 4 + 4 + 2 + 2;
+#else
+    beforeGrowLimit       = FT_NEXT_ULONG( p );
+    beforeShrinkGrowLimit = FT_NEXT_ULONG( p );
+    afterGrowLimit        = FT_NEXT_ULONG( p );
+    afterShrinkGrowLimit  = FT_NEXT_ULONG( p );
+    growFlags             = FT_NEXT_USHORT( p );
+    shrinkFlags           = FT_NEXT_USHORT( p );
+#endif
+
+    /* According to Apple spec, only 7bits in justClass is used */
+    if ( ( justClass & 0xFFFFFF80 ) != 0 )
+    {
+      GXV_TRACE(( "just table includes non-zero value"
+                  " in unused justClass higher bits"
+                  " of WidthDeltaPair" ));
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+    }
+
+    valid->subtable_length = p - table;
+  }
+
+
+  static void
+  gxv_just_wdc_entry_validate( FT_Bytes       table,
+                               FT_Bytes       limit,
+                               GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_ULong  count, i;
+
+
+    GXV_LIMIT_CHECK( 4 );
+    count = FT_NEXT_ULONG( p );
+    for ( i = 0; i < count; i++ )
+    {
+      GXV_TRACE(( "validating wdc pair %d/%d\n", i + 1, count ));
+      gxv_just_wdp_entry_validate( p, limit, valid );
+      p += valid->subtable_length;
+    }
+
+    valid->subtable_length = p - table;
+  }
+
+
+  static void
+  gxv_just_widthDeltaClusters_validate( FT_Bytes       table,
+                                        FT_Bytes       limit,
+                                        GXV_Validator  valid )
+  {
+    FT_Bytes  p         = table ;
+    FT_Bytes  wdc_end   = table + GXV_JUST_DATA( wdc_offset_max );
+    FT_UInt   i;
+
+
+    GXV_NAME_ENTER( "just justDeltaClusters" );
+
+    if ( limit <= wdc_end )
+      FT_INVALID_OFFSET;
+
+    for ( i = 0; p <= wdc_end; i++ )
+    {
+      gxv_just_wdc_entry_validate( p, limit, valid );
+      p += valid->subtable_length;
+    }
+
+    valid->subtable_length = p - table;
+
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_just_actSubrecord_type0_validate( FT_Bytes       table,
+                                        FT_Bytes       limit,
+                                        GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+
+    FT_Fixed   lowerLimit;
+    FT_Fixed   upperLimit;
+#ifdef GXV_LOAD_UNUSED_VARS
+    FT_UShort  order;
+#endif
+    FT_UShort  decomposedCount;
+
+    FT_UInt    i;
+
+
+    GXV_LIMIT_CHECK( 4 + 4 + 2 + 2 );
+    lowerLimit      = FT_NEXT_ULONG( p );
+    upperLimit      = FT_NEXT_ULONG( p );
+#ifdef GXV_LOAD_UNUSED_VARS
+    order           = FT_NEXT_USHORT( p );
+#else
+    p += 2;
+#endif
+    decomposedCount = FT_NEXT_USHORT( p );
+
+    if ( lowerLimit >= upperLimit )
+    {
+      GXV_TRACE(( "just table includes invalid range spec:"
+                  " lowerLimit(%d) > upperLimit(%d)\n"     ));
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+    }
+
+    for ( i = 0; i < decomposedCount; i++ )
+    {
+      FT_UShort glyphs;
+
+
+      GXV_LIMIT_CHECK( 2 );
+      glyphs = FT_NEXT_USHORT( p );
+      gxv_just_check_max_gid( glyphs, "type0:glyphs", valid );
+    }
+
+    valid->subtable_length = p - table;
+  }
+
+
+  static void
+  gxv_just_actSubrecord_type1_validate( FT_Bytes       table,
+                                        FT_Bytes       limit,
+                                        GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+    FT_UShort  addGlyph;
+
+
+    GXV_LIMIT_CHECK( 2 );
+    addGlyph = FT_NEXT_USHORT( p );
+
+    gxv_just_check_max_gid( addGlyph, "type1:addGlyph", valid );
+
+    valid->subtable_length = p - table;
+  }
+
+
+  static void
+  gxv_just_actSubrecord_type2_validate( FT_Bytes       table,
+                                        FT_Bytes       limit,
+                                        GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+#ifdef GXV_LOAD_UNUSED_VARS
+    FT_Fixed   substThreshhold; /* Apple misspelled "Threshhold" */
+#endif
+    FT_UShort  addGlyph;
+    FT_UShort  substGlyph;
+
+
+    GXV_LIMIT_CHECK( 4 + 2 + 2 );
+#ifdef GXV_LOAD_UNUSED_VARS
+    substThreshhold = FT_NEXT_ULONG( p );
+#else
+    p += 4;
+#endif
+    addGlyph        = FT_NEXT_USHORT( p );
+    substGlyph      = FT_NEXT_USHORT( p );
+
+    if ( addGlyph != 0xFFFF )
+      gxv_just_check_max_gid( addGlyph, "type2:addGlyph", valid );
+
+    gxv_just_check_max_gid( substGlyph, "type2:substGlyph", valid );
+
+    valid->subtable_length = p - table;
+  }
+
+
+  static void
+  gxv_just_actSubrecord_type4_validate( FT_Bytes       table,
+                                        FT_Bytes       limit,
+                                        GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_ULong  variantsAxis;
+    FT_Fixed  minimumLimit;
+    FT_Fixed  noStretchValue;
+    FT_Fixed  maximumLimit;
+
+
+    GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 );
+    variantsAxis   = FT_NEXT_ULONG( p );
+    minimumLimit   = FT_NEXT_ULONG( p );
+    noStretchValue = FT_NEXT_ULONG( p );
+    maximumLimit   = FT_NEXT_ULONG( p );
+
+    valid->subtable_length = p - table;
+
+    if ( variantsAxis != 0x64756374 ) /* 'duct' */
+      GXV_TRACE(( "variantsAxis 0x%08x is non default value",
+                   variantsAxis ));
+
+    if ( minimumLimit > noStretchValue )
+      GXV_TRACE(( "type4:minimumLimit 0x%08x > noStretchValue 0x%08x\n",
+                  minimumLimit, noStretchValue ));
+    else if ( noStretchValue > maximumLimit )
+      GXV_TRACE(( "type4:noStretchValue 0x%08x > maximumLimit 0x%08x\n",
+                  noStretchValue, maximumLimit ));
+    else if ( !IS_PARANOID_VALIDATION )
+      return;
+
+    FT_INVALID_DATA;
+  }
+
+
+  static void
+  gxv_just_actSubrecord_type5_validate( FT_Bytes       table,
+                                        FT_Bytes       limit,
+                                        GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+    FT_UShort  flags;
+    FT_UShort  glyph;
+
+
+    GXV_LIMIT_CHECK( 2 + 2 );
+    flags = FT_NEXT_USHORT( p );
+    glyph = FT_NEXT_USHORT( p );
+
+    if ( flags )
+      GXV_TRACE(( "type5: nonzero value 0x%04x in unused flags\n",
+                   flags ));
+    gxv_just_check_max_gid( glyph, "type5:glyph", valid );
+
+    valid->subtable_length = p - table;
+  }
+
+
+  /* parse single actSubrecord */
+  static void
+  gxv_just_actSubrecord_validate( FT_Bytes       table,
+                                  FT_Bytes       limit,
+                                  GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+    FT_UShort  actionClass;
+    FT_UShort  actionType;
+    FT_ULong   actionLength;
+
+
+    GXV_NAME_ENTER( "just actSubrecord" );
+
+    GXV_LIMIT_CHECK( 2 + 2 + 4 );
+    actionClass  = FT_NEXT_USHORT( p );
+    actionType   = FT_NEXT_USHORT( p );
+    actionLength = FT_NEXT_ULONG( p );
+
+    /* actionClass is related with justClass using 7bit only */
+    if ( ( actionClass & 0xFF80 ) != 0 )
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+
+    if ( actionType == 0 )
+      gxv_just_actSubrecord_type0_validate( p, limit, valid );
+    else if ( actionType == 1 )
+      gxv_just_actSubrecord_type1_validate( p, limit, valid );
+    else if ( actionType == 2 )
+      gxv_just_actSubrecord_type2_validate( p, limit, valid );
+    else if ( actionType == 3 )
+      ;                         /* Stretch glyph action: no actionData */
+    else if ( actionType == 4 )
+      gxv_just_actSubrecord_type4_validate( p, limit, valid );
+    else if ( actionType == 5 )
+      gxv_just_actSubrecord_type5_validate( p, limit, valid );
+    else
+      FT_INVALID_DATA;
+
+    valid->subtable_length = actionLength;
+
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_just_pcActionRecord_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_ULong  actionCount;
+    FT_ULong  i;
+
+
+    GXV_LIMIT_CHECK( 4 );
+    actionCount = FT_NEXT_ULONG( p );
+    GXV_TRACE(( "actionCount = %d\n", actionCount ));
+
+    for ( i = 0; i < actionCount; i++ )
+    {
+      gxv_just_actSubrecord_validate( p, limit, valid );
+      p += valid->subtable_length;
+    }
+
+    valid->subtable_length = p - table;
+
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_just_pcTable_LookupValue_entry_validate( FT_UShort            glyph,
+                                               GXV_LookupValueCPtr  value_p,
+                                               GXV_Validator        valid )
+  {
+    FT_UNUSED( glyph );
+
+    if ( value_p->u > GXV_JUST_DATA( pc_offset_max ) )
+      GXV_JUST_DATA( pc_offset_max ) = value_p->u;
+    if ( value_p->u < GXV_JUST_DATA( pc_offset_max ) )
+      GXV_JUST_DATA( pc_offset_min ) = value_p->u;
+  }
+
+
+  static void
+  gxv_just_pcLookupTable_validate( FT_Bytes       table,
+                                   FT_Bytes       limit,
+                                   GXV_Validator  valid )
+  {
+    FT_Bytes p = table;
+
+
+    GXV_NAME_ENTER( "just pcLookupTable" );
+    GXV_JUST_DATA( pc_offset_max ) = 0x0000;
+    GXV_JUST_DATA( pc_offset_min ) = 0xFFFFU;
+
+    valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
+    valid->lookupval_func = gxv_just_pcTable_LookupValue_entry_validate;
+
+    gxv_LookupTable_validate( p, limit, valid );
+
+    /* subtable_length is set by gxv_LookupTable_validate() */
+
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_just_postcompTable_validate( FT_Bytes       table,
+                                   FT_Bytes       limit,
+                                   GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+
+    GXV_NAME_ENTER( "just postcompTable" );
+
+    gxv_just_pcLookupTable_validate( p, limit, valid );
+    p += valid->subtable_length;
+
+    gxv_just_pcActionRecord_validate( p, limit, valid );
+    p += valid->subtable_length;
+
+    valid->subtable_length = p - table;
+
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_just_classTable_entry_validate(
+    FT_Byte                         state,
+    FT_UShort                       flags,
+    GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
+    FT_Bytes                        table,
+    FT_Bytes                        limit,
+    GXV_Validator                   valid )
+  {
+#ifdef GXV_LOAD_UNUSED_VARS
+    /* TODO: validate markClass & currentClass */
+    FT_UShort  setMark;
+    FT_UShort  dontAdvance;
+    FT_UShort  markClass;
+    FT_UShort  currentClass;
+#endif
+
+    FT_UNUSED( state );
+    FT_UNUSED( glyphOffset_p );
+    FT_UNUSED( table );
+    FT_UNUSED( limit );
+    FT_UNUSED( valid );
+
+#ifndef GXV_LOAD_UNUSED_VARS
+    FT_UNUSED( flags );
+#else
+    setMark      = (FT_UShort)( ( flags >> 15 ) & 1    );
+    dontAdvance  = (FT_UShort)( ( flags >> 14 ) & 1    );
+    markClass    = (FT_UShort)( ( flags >> 7  ) & 0x7F );
+    currentClass = (FT_UShort)(   flags         & 0x7F );
+#endif
+  }
+
+
+  static void
+  gxv_just_justClassTable_validate ( FT_Bytes       table,
+                                     FT_Bytes       limit,
+                                     GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+    FT_UShort  length;
+    FT_UShort  coverage;
+    FT_ULong   subFeatureFlags;
+
+
+    GXV_NAME_ENTER( "just justClassTable" );
+
+    GXV_LIMIT_CHECK( 2 + 2 + 4 );
+    length          = FT_NEXT_USHORT( p );
+    coverage        = FT_NEXT_USHORT( p );
+    subFeatureFlags = FT_NEXT_ULONG( p );
+
+    GXV_TRACE(( "  justClassTable: coverage = 0x%04x (%s) ", coverage ));
+    if ( ( coverage & 0x4000 ) == 0  )
+      GXV_TRACE(( "ascending\n" ));
+    else
+      GXV_TRACE(( "descending\n" ));
+
+    if ( subFeatureFlags )
+      GXV_TRACE(( "  justClassTable: nonzero value (0x%08x)"
+                  " in unused subFeatureFlags\n", subFeatureFlags ));
+
+    valid->statetable.optdata               = NULL;
+    valid->statetable.optdata_load_func     = NULL;
+    valid->statetable.subtable_setup_func   = NULL;
+    valid->statetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE;
+    valid->statetable.entry_validate_func   =
+      gxv_just_classTable_entry_validate;
+
+    gxv_StateTable_validate( p, table + length, valid );
+
+    /* subtable_length is set by gxv_LookupTable_validate() */
+
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_just_wdcTable_LookupValue_validate( FT_UShort            glyph,
+                                          GXV_LookupValueCPtr  value_p,
+                                          GXV_Validator        valid )
+  {
+    FT_UNUSED( glyph );
+
+    if ( value_p->u > GXV_JUST_DATA( wdc_offset_max ) )
+      GXV_JUST_DATA( wdc_offset_max ) = value_p->u;
+    if ( value_p->u < GXV_JUST_DATA( wdc_offset_min ) )
+      GXV_JUST_DATA( wdc_offset_min ) = value_p->u;
+  }
+
+
+  static void
+  gxv_just_justData_lookuptable_validate( FT_Bytes       table,
+                                          FT_Bytes       limit,
+                                          GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+
+    GXV_JUST_DATA( wdc_offset_max ) = 0x0000;
+    GXV_JUST_DATA( wdc_offset_min ) = 0xFFFFU;
+
+    valid->lookupval_sign = GXV_LOOKUPVALUE_UNSIGNED;
+    valid->lookupval_func = gxv_just_wdcTable_LookupValue_validate;
+
+    gxv_LookupTable_validate( p, limit, valid );
+
+    /* subtable_length is set by gxv_LookupTable_validate() */
+
+    GXV_EXIT;
+  }
+
+
+  /*
+   * gxv_just_justData_validate() parses and validates horizData, vertData.
+   */
+  static void
+  gxv_just_justData_validate( FT_Bytes       table,
+                              FT_Bytes       limit,
+                              GXV_Validator  valid )
+  {
+    /*
+     * following 3 offsets are measured from the start of `just'
+     * (which table points to), not justData
+     */
+    FT_UShort  justClassTableOffset;
+    FT_UShort  wdcTableOffset;
+    FT_UShort  pcTableOffset;
+    FT_Bytes   p = table;
+
+    GXV_ODTECT( 4, odtect );
+
+
+    GXV_NAME_ENTER( "just justData" );
+
+    GXV_ODTECT_INIT( odtect );
+    GXV_LIMIT_CHECK( 2 + 2 + 2 );
+    justClassTableOffset = FT_NEXT_USHORT( p );
+    wdcTableOffset       = FT_NEXT_USHORT( p );
+    pcTableOffset        = FT_NEXT_USHORT( p );
+
+    GXV_TRACE(( " (justClassTableOffset = 0x%04x)\n", justClassTableOffset ));
+    GXV_TRACE(( " (wdcTableOffset = 0x%04x)\n", wdcTableOffset ));
+    GXV_TRACE(( " (pcTableOffset = 0x%04x)\n", pcTableOffset ));
+
+    gxv_just_justData_lookuptable_validate( p, limit, valid );
+    gxv_odtect_add_range( p, valid->subtable_length,
+                          "just_LookupTable", odtect );
+
+    if ( wdcTableOffset )
+    {
+      gxv_just_widthDeltaClusters_validate(
+        valid->root->base + wdcTableOffset, limit, valid );
+      gxv_odtect_add_range( valid->root->base + wdcTableOffset,
+                            valid->subtable_length, "just_wdcTable", odtect );
+    }
+
+    if ( pcTableOffset )
+    {
+      gxv_just_postcompTable_validate( valid->root->base + pcTableOffset,
+                                       limit, valid );
+      gxv_odtect_add_range( valid->root->base + pcTableOffset,
+                            valid->subtable_length, "just_pcTable", odtect );
+    }
+
+    if ( justClassTableOffset )
+    {
+      gxv_just_justClassTable_validate(
+        valid->root->base + justClassTableOffset, limit, valid );
+      gxv_odtect_add_range( valid->root->base + justClassTableOffset,
+                            valid->subtable_length, "just_justClassTable",
+                            odtect );
+    }
+
+    gxv_odtect_validate( odtect, valid );
+
+    GXV_EXIT;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_just_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  ftvalid )
+  {
+    FT_Bytes           p     = table;
+    FT_Bytes           limit = 0;
+
+    GXV_ValidatorRec   validrec;
+    GXV_Validator      valid = &validrec;
+    GXV_just_DataRec   justrec;
+    GXV_just_Data      just = &justrec;
+
+    FT_ULong           version;
+    FT_UShort          format;
+    FT_UShort          horizOffset;
+    FT_UShort          vertOffset;
+
+    GXV_ODTECT( 3, odtect );
+
+
+    GXV_ODTECT_INIT( odtect );
+
+    valid->root       = ftvalid;
+    valid->table_data = just;
+    valid->face       = face;
+
+    FT_TRACE3(( "validating `just' table\n" ));
+    GXV_INIT;
+
+    limit      = valid->root->limit;
+
+    GXV_LIMIT_CHECK( 4 + 2 + 2 + 2 );
+    version     = FT_NEXT_ULONG( p );
+    format      = FT_NEXT_USHORT( p );
+    horizOffset = FT_NEXT_USHORT( p );
+    vertOffset  = FT_NEXT_USHORT( p );
+    gxv_odtect_add_range( table, p - table, "just header", odtect );
+
+
+    /* Version 1.0 (always:2000) */
+    GXV_TRACE(( " (version = 0x%08x)\n", version ));
+    if ( version != 0x00010000UL )
+      FT_INVALID_FORMAT;
+
+    /* format 0 (always:2000) */
+    GXV_TRACE(( " (format = 0x%04x)\n", format ));
+    if ( format != 0x0000 )
+        FT_INVALID_FORMAT;
+
+    GXV_TRACE(( " (horizOffset = %d)\n", horizOffset  ));
+    GXV_TRACE(( " (vertOffset = %d)\n", vertOffset  ));
+
+
+    /* validate justData */
+    if ( 0 < horizOffset )
+    {
+      gxv_just_justData_validate( table + horizOffset, limit, valid );
+      gxv_odtect_add_range( table + horizOffset, valid->subtable_length,
+                            "horizJustData", odtect );
+    }
+
+    if ( 0 < vertOffset )
+    {
+      gxv_just_justData_validate( table + vertOffset, limit, valid );
+      gxv_odtect_add_range( table + vertOffset, valid->subtable_length,
+                            "vertJustData", odtect );
+    }
+
+    gxv_odtect_validate( odtect, valid );
+
+    FT_TRACE4(( "\n" ));
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvkern.c b/src/gxvalid/gxvkern.c
new file mode 100644 (file)
index 0000000..0ec978f
--- /dev/null
@@ -0,0 +1,922 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvkern.c                                                              */
+/*                                                                         */
+/*    TrueTypeGX/AAT kern table validation (body).                         */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2006, 2007                                       */
+/*  by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                      */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvalid.h"
+#include "gxvcommn.h"
+
+#include FT_SFNT_NAMES_H
+#include FT_SERVICE_GX_VALIDATE_H
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvkern
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      Data and Types                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef enum  GXV_kern_Version_
+  {
+    KERN_VERSION_CLASSIC = 0x0000,
+    KERN_VERSION_NEW     = 0x0001
+
+  } GXV_kern_Version;
+
+
+  typedef enum GXV_kern_Dialect_
+  {
+    KERN_DIALECT_UNKNOWN = 0,
+    KERN_DIALECT_MS      = FT_VALIDATE_MS,
+    KERN_DIALECT_APPLE   = FT_VALIDATE_APPLE,
+    KERN_DIALECT_ANY     = FT_VALIDATE_CKERN
+
+  } GXV_kern_Dialect;
+
+
+  typedef struct  GXV_kern_DataRec_
+  {
+    GXV_kern_Version  version;
+    void             *subtable_data;
+    GXV_kern_Dialect  dialect_request;
+
+  } GXV_kern_DataRec, *GXV_kern_Data;
+
+
+#define GXV_KERN_DATA( field )  GXV_TABLE_DATA( kern, field )
+
+#define KERN_IS_CLASSIC( valid )                               \
+          ( KERN_VERSION_CLASSIC == GXV_KERN_DATA( version ) )
+#define KERN_IS_NEW( valid )                                   \
+          ( KERN_VERSION_NEW     == GXV_KERN_DATA( version ) )
+
+#define KERN_DIALECT( valid )              \
+          GXV_KERN_DATA( dialect_request )
+#define KERN_ALLOWS_MS( valid )                       \
+          ( KERN_DIALECT( valid ) & KERN_DIALECT_MS )
+#define KERN_ALLOWS_APPLE( valid )                       \
+          ( KERN_DIALECT( valid ) & KERN_DIALECT_APPLE )
+
+#define GXV_KERN_HEADER_SIZE           ( KERN_IS_NEW( valid ) ? 8 : 4 )
+#define GXV_KERN_SUBTABLE_HEADER_SIZE  ( KERN_IS_NEW( valid ) ? 8 : 6 )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      SUBTABLE VALIDATORS                      *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* ============================= format 0 ============================== */
+
+  static void
+  gxv_kern_subtable_fmt0_pairs_validate( FT_Bytes       table,
+                                         FT_Bytes       limit,
+                                         FT_UShort      nPairs,
+                                         GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+    FT_UShort  i;
+
+    FT_UShort  last_gid_left  = 0;
+    FT_UShort  last_gid_right = 0;
+
+    FT_UNUSED( limit );
+
+
+    GXV_NAME_ENTER( "kern format 0 pairs" );
+
+    for ( i = 0; i < nPairs; i++ )
+    {
+      FT_UShort  gid_left;
+      FT_UShort  gid_right;
+#ifdef GXV_LOAD_UNUSED_VARS
+      FT_Short   kernValue;
+#endif
+
+
+      /* left */
+      gid_left  = FT_NEXT_USHORT( p );
+      gxv_glyphid_validate( gid_left, valid );
+
+      /* right */
+      gid_right = FT_NEXT_USHORT( p );
+      gxv_glyphid_validate( gid_right, valid );
+
+      /* Pairs of left and right GIDs must be unique and sorted. */
+      GXV_TRACE(( "left gid = %u, right gid = %u\n", gid_left, gid_right ));
+      if ( gid_left == last_gid_left )
+      {
+        if ( last_gid_right < gid_right )
+          last_gid_right = gid_right;
+        else
+          FT_INVALID_DATA;
+      }
+      else if ( last_gid_left < gid_left )
+      {
+        last_gid_left  = gid_left;
+        last_gid_right = gid_right;
+      }
+      else
+        FT_INVALID_DATA;
+
+      /* skip the kern value */
+#ifdef GXV_LOAD_UNUSED_VARS
+      kernValue = FT_NEXT_SHORT( p );
+#else
+      p += 2;
+#endif
+    }
+
+    GXV_EXIT;
+  }
+
+  static void
+  gxv_kern_subtable_fmt0_validate( FT_Bytes       table,
+                                   FT_Bytes       limit,
+                                   GXV_Validator  valid )
+  {
+    FT_Bytes   p = table + GXV_KERN_SUBTABLE_HEADER_SIZE;
+
+    FT_UShort  nPairs;
+    FT_UShort  unitSize;
+
+
+    GXV_NAME_ENTER( "kern subtable format 0" );
+
+    unitSize = 2 + 2 + 2;
+    nPairs   = 0;
+
+    /* nPairs, searchRange, entrySelector, rangeShift */
+    GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 );
+    gxv_BinSrchHeader_validate( p, limit, &unitSize, &nPairs, valid );
+    p += 2 + 2 + 2 + 2;
+
+    gxv_kern_subtable_fmt0_pairs_validate( p, limit, nPairs, valid );
+
+    GXV_EXIT;
+  }
+
+
+  /* ============================= format 1 ============================== */
+
+
+  typedef struct  GXV_kern_fmt1_StateOptRec_
+  {
+    FT_UShort  valueTable;
+    FT_UShort  valueTable_length;
+
+  } GXV_kern_fmt1_StateOptRec, *GXV_kern_fmt1_StateOptRecData;
+
+
+  static void
+  gxv_kern_subtable_fmt1_valueTable_load( FT_Bytes       table,
+                                          FT_Bytes       limit,
+                                          GXV_Validator  valid )
+  {
+    FT_Bytes                       p = table;
+    GXV_kern_fmt1_StateOptRecData  optdata =
+      (GXV_kern_fmt1_StateOptRecData)valid->statetable.optdata;
+
+
+    GXV_LIMIT_CHECK( 2 );
+    optdata->valueTable = FT_NEXT_USHORT( p );
+  }
+
+
+  /*
+   * passed tables_size covers whole StateTable, including kern fmt1 header
+   */
+  static void
+  gxv_kern_subtable_fmt1_subtable_setup( FT_UShort      table_size,
+                                         FT_UShort      classTable,
+                                         FT_UShort      stateArray,
+                                         FT_UShort      entryTable,
+                                         FT_UShort*     classTable_length_p,
+                                         FT_UShort*     stateArray_length_p,
+                                         FT_UShort*     entryTable_length_p,
+                                         GXV_Validator  valid )
+  {
+    FT_UShort  o[4];
+    FT_UShort  *l[4];
+    FT_UShort  buff[5];
+
+    GXV_kern_fmt1_StateOptRecData  optdata =
+      (GXV_kern_fmt1_StateOptRecData)valid->statetable.optdata;
+
+
+    o[0] = classTable;
+    o[1] = stateArray;
+    o[2] = entryTable;
+    o[3] = optdata->valueTable;
+    l[0] = classTable_length_p;
+    l[1] = stateArray_length_p;
+    l[2] = entryTable_length_p;
+    l[3] = &(optdata->valueTable_length);
+
+    gxv_set_length_by_ushort_offset( o, l, buff, 4, table_size, valid );
+  }
+
+
+  /*
+   * passed table & limit are of whole StateTable, not including subtables
+   */
+  static void
+  gxv_kern_subtable_fmt1_entry_validate(
+    FT_Byte                         state,
+    FT_UShort                       flags,
+    GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
+    FT_Bytes                        table,
+    FT_Bytes                        limit,
+    GXV_Validator                   valid )
+  {
+#ifdef GXV_LOAD_UNUSED_VARS
+    FT_UShort  push;
+    FT_UShort  dontAdvance;
+#endif
+    FT_UShort  valueOffset;
+#ifdef GXV_LOAD_UNUSED_VARS
+    FT_UShort  kernAction;
+    FT_UShort  kernValue;
+#endif
+
+    FT_UNUSED( state );
+    FT_UNUSED( glyphOffset_p );
+
+
+#ifdef GXV_LOAD_UNUSED_VARS
+    push        = (FT_UShort)( ( flags >> 15 ) & 1      );
+    dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1      );
+#endif
+    valueOffset = (FT_UShort)(   flags         & 0x3FFF );
+
+    {
+      GXV_kern_fmt1_StateOptRecData  vt_rec =
+        (GXV_kern_fmt1_StateOptRecData)valid->statetable.optdata;
+      FT_Bytes  p;
+
+
+      if ( valueOffset < vt_rec->valueTable )
+        FT_INVALID_OFFSET;
+
+      p     = table + valueOffset;
+      limit = table + vt_rec->valueTable + vt_rec->valueTable_length;
+
+      GXV_LIMIT_CHECK( 2 + 2 );
+#ifdef GXV_LOAD_UNUSED_VARS
+      kernAction = FT_NEXT_USHORT( p );
+      kernValue  = FT_NEXT_USHORT( p );
+#else
+      p += 4;
+#endif
+    }
+  }
+
+
+  static void
+  gxv_kern_subtable_fmt1_validate( FT_Bytes       table,
+                                   FT_Bytes       limit,
+                                   GXV_Validator  valid )
+  {
+    FT_Bytes                   p = table;
+    GXV_kern_fmt1_StateOptRec  vt_rec;
+
+
+    GXV_NAME_ENTER( "kern subtable format 1" );
+
+    valid->statetable.optdata =
+      &vt_rec;
+    valid->statetable.optdata_load_func =
+      gxv_kern_subtable_fmt1_valueTable_load;
+    valid->statetable.subtable_setup_func =
+      gxv_kern_subtable_fmt1_subtable_setup;
+    valid->statetable.entry_glyphoffset_fmt =
+      GXV_GLYPHOFFSET_NONE;
+    valid->statetable.entry_validate_func =
+      gxv_kern_subtable_fmt1_entry_validate;
+
+    gxv_StateTable_validate( p, limit, valid );
+
+    GXV_EXIT;
+  }
+
+
+  /* ================ Data for Class-Based Subtables 2, 3 ================ */
+
+  typedef enum  GXV_kern_ClassSpec_
+  {
+    GXV_KERN_CLS_L = 0,
+    GXV_KERN_CLS_R
+
+  } GXV_kern_ClassSpec;
+
+
+  /* ============================= format 2 ============================== */
+
+  /* ---------------------- format 2 specific data ----------------------- */
+
+  typedef struct  GXV_kern_subtable_fmt2_DataRec_
+  {
+    FT_UShort         rowWidth;
+    FT_UShort         array;
+    FT_UShort         offset_min[2];
+    FT_UShort         offset_max[2];
+    const FT_String*  class_tag[2];
+    GXV_odtect_Range  odtect;
+
+  } GXV_kern_subtable_fmt2_DataRec, *GXV_kern_subtable_fmt2_Data;
+
+
+#define GXV_KERN_FMT2_DATA( field )                         \
+        ( ( (GXV_kern_subtable_fmt2_DataRec *)              \
+              ( GXV_KERN_DATA( subtable_data ) ) )->field )
+
+
+  /* -------------------------- utility functions ----------------------- */
+
+  static void
+  gxv_kern_subtable_fmt2_clstbl_validate( FT_Bytes            table,
+                                          FT_Bytes            limit,
+                                          GXV_kern_ClassSpec  spec,
+                                          GXV_Validator       valid )
+  {
+    const FT_String*  tag    = GXV_KERN_FMT2_DATA( class_tag[spec] );
+    GXV_odtect_Range  odtect = GXV_KERN_FMT2_DATA( odtect );
+
+    FT_Bytes   p = table;
+    FT_UShort  firstGlyph;
+    FT_UShort  nGlyphs;
+
+
+    GXV_NAME_ENTER( "kern format 2 classTable" );
+
+    GXV_LIMIT_CHECK( 2 + 2 );
+    firstGlyph = FT_NEXT_USHORT( p );
+    nGlyphs    = FT_NEXT_USHORT( p );
+    GXV_TRACE(( " %s firstGlyph=%d, nGlyphs=%d\n",
+                tag, firstGlyph, nGlyphs ));
+
+    gxv_glyphid_validate( firstGlyph, valid );
+    gxv_glyphid_validate( (FT_UShort)( firstGlyph + nGlyphs - 1 ), valid );
+
+    gxv_array_getlimits_ushort( p, p + ( 2 * nGlyphs ),
+                                &( GXV_KERN_FMT2_DATA( offset_min[spec] ) ),
+                                &( GXV_KERN_FMT2_DATA( offset_max[spec] ) ),
+                                valid );
+
+    gxv_odtect_add_range( table, 2 * nGlyphs, tag, odtect );
+
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_kern_subtable_fmt2_validate( FT_Bytes       table,
+                                   FT_Bytes       limit,
+                                   GXV_Validator  valid )
+  {
+    GXV_ODTECT( 3, odtect );
+    GXV_kern_subtable_fmt2_DataRec  fmt2_rec =
+      { 0, 0, { 0, 0 }, { 0, 0 }, { "leftClass", "rightClass" }, NULL };
+
+    FT_Bytes   p = table + GXV_KERN_SUBTABLE_HEADER_SIZE;
+    FT_UShort  leftOffsetTable;
+    FT_UShort  rightOffsetTable;
+
+
+    GXV_NAME_ENTER( "kern subtable format 2" );
+
+    GXV_ODTECT_INIT( odtect );
+    fmt2_rec.odtect = odtect;
+    GXV_KERN_DATA( subtable_data ) = &fmt2_rec;
+
+    GXV_LIMIT_CHECK( 2 + 2 + 2 + 2 );
+    GXV_KERN_FMT2_DATA( rowWidth ) = FT_NEXT_USHORT( p );
+    leftOffsetTable                = FT_NEXT_USHORT( p );
+    rightOffsetTable               = FT_NEXT_USHORT( p );
+    GXV_KERN_FMT2_DATA( array )    = FT_NEXT_USHORT( p );
+
+    GXV_TRACE(( "rowWidth = %d\n", GXV_KERN_FMT2_DATA( rowWidth ) ));
+
+
+    GXV_LIMIT_CHECK( leftOffsetTable );
+    GXV_LIMIT_CHECK( rightOffsetTable );
+    GXV_LIMIT_CHECK( GXV_KERN_FMT2_DATA( array ) );
+
+    gxv_kern_subtable_fmt2_clstbl_validate( table + leftOffsetTable, limit,
+                                            GXV_KERN_CLS_L, valid );
+
+    gxv_kern_subtable_fmt2_clstbl_validate( table + rightOffsetTable, limit,
+                                            GXV_KERN_CLS_R, valid );
+
+    if ( GXV_KERN_FMT2_DATA( offset_min[GXV_KERN_CLS_L] ) +
+           GXV_KERN_FMT2_DATA( offset_min[GXV_KERN_CLS_R] )
+         < GXV_KERN_FMT2_DATA( array )                      )
+      FT_INVALID_OFFSET;
+
+    gxv_odtect_add_range( table + GXV_KERN_FMT2_DATA( array ),
+                          GXV_KERN_FMT2_DATA( offset_max[GXV_KERN_CLS_L] )
+                            + GXV_KERN_FMT2_DATA( offset_max[GXV_KERN_CLS_R] )
+                            - GXV_KERN_FMT2_DATA( array ),
+                          "array", odtect );
+
+    gxv_odtect_validate( odtect, valid );
+
+    GXV_EXIT;
+  }
+
+
+  /* ============================= format 3 ============================== */
+
+  static void
+  gxv_kern_subtable_fmt3_validate( FT_Bytes       table,
+                                   FT_Bytes       limit,
+                                   GXV_Validator  valid )
+  {
+    FT_Bytes   p = table + GXV_KERN_SUBTABLE_HEADER_SIZE;
+    FT_UShort  glyphCount;
+    FT_Byte    kernValueCount;
+    FT_Byte    leftClassCount;
+    FT_Byte    rightClassCount;
+    FT_Byte    flags;
+
+
+    GXV_NAME_ENTER( "kern subtable format 3" );
+
+    GXV_LIMIT_CHECK( 2 + 1 + 1 + 1 + 1 );
+    glyphCount      = FT_NEXT_USHORT( p );
+    kernValueCount  = FT_NEXT_BYTE( p );
+    leftClassCount  = FT_NEXT_BYTE( p );
+    rightClassCount = FT_NEXT_BYTE( p );
+    flags           = FT_NEXT_BYTE( p );
+
+    if ( valid->face->num_glyphs != glyphCount )
+    {
+      GXV_TRACE(( "maxGID=%d, but glyphCount=%d\n",
+                  valid->face->num_glyphs, glyphCount ));
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
+    }
+
+    if ( flags != 0 )
+      GXV_TRACE(( "kern subtable fmt3 has nonzero value"
+                  " (%d) in unused flag\n", flags ));
+    /*
+     * just skip kernValue[kernValueCount]
+     */
+    GXV_LIMIT_CHECK( 2 * kernValueCount );
+    p += 2 * kernValueCount;
+
+    /*
+     * check leftClass[gid] < leftClassCount
+     */
+    {
+      FT_Byte  min, max;
+
+
+      GXV_LIMIT_CHECK( glyphCount );
+      gxv_array_getlimits_byte( p, p + glyphCount, &min, &max, valid );
+      p += valid->subtable_length;
+
+      if ( leftClassCount < max )
+        FT_INVALID_DATA;
+    }
+
+    /*
+     * check rightClass[gid] < rightClassCount
+     */
+    {
+      FT_Byte  min, max;
+
+
+      GXV_LIMIT_CHECK( glyphCount );
+      gxv_array_getlimits_byte( p, p + glyphCount, &min, &max, valid );
+      p += valid->subtable_length;
+
+      if ( rightClassCount < max )
+        FT_INVALID_DATA;
+    }
+
+    /*
+     * check kernIndex[i, j] < kernValueCount
+     */
+    {
+      FT_UShort  i, j;
+
+
+      for ( i = 0; i < leftClassCount; i++ )
+      {
+        for ( j = 0; j < rightClassCount; j++ )
+        {
+          GXV_LIMIT_CHECK( 1 );
+          if ( kernValueCount < FT_NEXT_BYTE( p ) )
+            FT_INVALID_OFFSET;
+        }
+      }
+    }
+
+    valid->subtable_length = p - table;
+
+    GXV_EXIT;
+  }
+
+
+  static FT_Bool
+  gxv_kern_coverage_new_apple_validate( FT_UShort      coverage,
+                                        FT_UShort*     format,
+                                        GXV_Validator  valid )
+  {
+    /* new Apple-dialect */
+#ifdef GXV_LOAD_TRACE_VARS
+    FT_Bool  kernVertical;
+    FT_Bool  kernCrossStream;
+    FT_Bool  kernVariation;
+#endif
+
+    FT_UNUSED( valid );
+
+
+    /* reserved bits = 0 */
+    if ( coverage & 0x1FFC )
+      return FALSE;
+
+#ifdef GXV_LOAD_TRACE_VARS
+    kernVertical    = FT_BOOL( ( coverage >> 15 ) & 1 );
+    kernCrossStream = FT_BOOL( ( coverage >> 14 ) & 1 );
+    kernVariation   = FT_BOOL( ( coverage >> 13 ) & 1 );
+#endif
+
+    *format = (FT_UShort)( coverage & 0x0003 );
+
+    GXV_TRACE(( "new Apple-dialect: "
+                "horizontal=%d, cross-stream=%d, variation=%d, format=%d\n",
+                 !kernVertical, kernCrossStream, kernVariation, *format ));
+
+    GXV_TRACE(( "kerning values in Apple format subtable are ignored\n" ));
+
+    return TRUE;
+  }
+
+
+  static FT_Bool
+  gxv_kern_coverage_classic_apple_validate( FT_UShort      coverage,
+                                            FT_UShort*     format,
+                                            GXV_Validator  valid )
+  {
+    /* classic Apple-dialect */
+#ifdef GXV_LOAD_TRACE_VARS
+    FT_Bool  horizontal;
+    FT_Bool  cross_stream;
+#endif
+
+
+    /* check expected flags, but don't check if MS-dialect is impossible */
+    if ( !( coverage & 0xFD00 ) && KERN_ALLOWS_MS( valid ) )
+      return FALSE;
+
+    /* reserved bits = 0 */
+    if ( coverage & 0x02FC )
+      return FALSE;
+
+#ifdef GXV_LOAD_TRACE_VARS
+    horizontal   = FT_BOOL( ( coverage >> 15 ) & 1 );
+    cross_stream = FT_BOOL( ( coverage >> 13 ) & 1 );
+#endif
+
+    *format = (FT_UShort)( coverage & 0x0003 );
+
+    GXV_TRACE(( "classic Apple-dialect: "
+                "horizontal=%d, cross-stream=%d, format=%d\n",
+                 horizontal, cross_stream, *format ));
+
+    /* format 1 requires GX State Machine, too new for classic */
+    if ( *format == 1 )
+      return FALSE;
+
+    GXV_TRACE(( "kerning values in Apple format subtable are ignored\n" ));
+
+    return TRUE;
+  }
+
+
+  static FT_Bool
+  gxv_kern_coverage_classic_microsoft_validate( FT_UShort      coverage,
+                                                FT_UShort*     format,
+                                                GXV_Validator  valid )
+  {
+    /* classic Microsoft-dialect */
+#ifdef GXV_LOAD_TRACE_VARS
+    FT_Bool  horizontal;
+    FT_Bool  minimum;
+    FT_Bool  cross_stream;
+    FT_Bool  override;
+#endif
+
+    FT_UNUSED( valid );
+
+
+    /* reserved bits = 0 */
+    if ( coverage & 0xFDF0 )
+      return FALSE;
+
+#ifdef GXV_LOAD_TRACE_VARS
+    horizontal   = FT_BOOL(   coverage        & 1 );
+    minimum      = FT_BOOL( ( coverage >> 1 ) & 1 );
+    cross_stream = FT_BOOL( ( coverage >> 2 ) & 1 );
+    override     = FT_BOOL( ( coverage >> 3 ) & 1 );
+#endif
+
+    *format = (FT_UShort)( ( coverage >> 8 ) & 0x0003 );
+
+    GXV_TRACE(( "classic Microsoft-dialect: "
+                "horizontal=%d, minimum=%d, cross-stream=%d, "
+                "override=%d, format=%d\n",
+                horizontal, minimum, cross_stream, override, *format ));
+
+    if ( *format == 2 )
+      GXV_TRACE((
+        "kerning values in Microsoft format 2 subtable are ignored\n" ));
+
+    return TRUE;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            MAIN                               *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static GXV_kern_Dialect
+  gxv_kern_coverage_validate( FT_UShort      coverage,
+                              FT_UShort*     format,
+                              GXV_Validator  valid )
+  {
+    GXV_kern_Dialect  result = KERN_DIALECT_UNKNOWN;
+
+
+    GXV_NAME_ENTER( "validating coverage" );
+
+    GXV_TRACE(( "interprete coverage 0x%04x by Apple style\n", coverage ));
+
+    if ( KERN_IS_NEW( valid ) )
+    {
+      if ( gxv_kern_coverage_new_apple_validate( coverage,
+                                                 format,
+                                                 valid ) )
+      {
+        result = KERN_DIALECT_APPLE;
+        goto Exit;
+      }
+    }
+
+    if ( KERN_IS_CLASSIC( valid ) && KERN_ALLOWS_APPLE( valid ) )
+    {
+      if ( gxv_kern_coverage_classic_apple_validate( coverage,
+                                                     format,
+                                                     valid ) )
+      {
+        result = KERN_DIALECT_APPLE;
+        goto Exit;
+      }
+    }
+
+    if ( KERN_IS_CLASSIC( valid ) && KERN_ALLOWS_MS( valid ) )
+    {
+      if ( gxv_kern_coverage_classic_microsoft_validate( coverage,
+                                                         format,
+                                                         valid ) )
+      {
+        result = KERN_DIALECT_MS;
+        goto Exit;
+      }
+    }
+
+    GXV_TRACE(( "cannot interprete coverage, broken kern subtable\n" ));
+
+  Exit:
+    GXV_EXIT;
+    return result;
+  }
+
+
+  static void
+  gxv_kern_subtable_validate( FT_Bytes       table,
+                              FT_Bytes       limit,
+                              GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+#ifdef GXV_LOAD_TRACE_VARS
+    FT_UShort  version = 0;    /* MS only: subtable version, unused */
+#endif
+    FT_ULong   length;         /* MS: 16bit, Apple: 32bit*/
+    FT_UShort  coverage;
+#ifdef GXV_LOAD_TRACE_VARS
+    FT_UShort  tupleIndex = 0; /* Apple only */
+#endif
+    FT_UShort  u16[2];
+    FT_UShort  format = 255;   /* subtable format */
+
+
+    GXV_NAME_ENTER( "kern subtable" );
+
+    GXV_LIMIT_CHECK( 2 + 2 + 2 );
+    u16[0]   = FT_NEXT_USHORT( p ); /* Apple: length_hi MS: version */
+    u16[1]   = FT_NEXT_USHORT( p ); /* Apple: length_lo MS: length */
+    coverage = FT_NEXT_USHORT( p );
+
+    switch ( gxv_kern_coverage_validate( coverage, &format, valid ) )
+    {
+    case KERN_DIALECT_MS:
+#ifdef GXV_LOAD_TRACE_VARS
+      version    = u16[0];
+#endif
+      length     = u16[1];
+#ifdef GXV_LOAD_TRACE_VARS
+      tupleIndex = 0;
+#endif
+      GXV_TRACE(( "Subtable version = %d\n", version ));
+      GXV_TRACE(( "Subtable length = %d\n", length ));
+      break;
+
+    case KERN_DIALECT_APPLE:
+#ifdef GXV_LOAD_TRACE_VARS
+      version    = 0;
+#endif
+      length     = ( u16[0] << 16 ) + u16[1];
+#ifdef GXV_LOAD_TRACE_VARS
+      tupleIndex = 0;
+#endif
+      GXV_TRACE(( "Subtable length = %d\n", length ));
+
+      if ( KERN_IS_NEW( valid ) )
+      {
+        GXV_LIMIT_CHECK( 2 );
+#ifdef GXV_LOAD_TRACE_VARS
+        tupleIndex = FT_NEXT_USHORT( p );
+#else
+        p += 2;
+#endif
+        GXV_TRACE(( "Subtable tupleIndex = %d\n", tupleIndex ));
+      }
+      break;
+
+    default:
+      length = u16[1];
+      GXV_TRACE(( "cannot detect subtable dialect, "
+                  "just skip %d byte\n", length ));
+      goto Exit;
+    }
+
+    /* formats 1, 2, 3 require the position of the start of this subtable */
+    if ( format == 0 )
+      gxv_kern_subtable_fmt0_validate( table, table + length, valid );
+    else if ( format == 1 )
+      gxv_kern_subtable_fmt1_validate( table, table + length, valid );
+    else if ( format == 2 )
+      gxv_kern_subtable_fmt2_validate( table, table + length, valid );
+    else if ( format == 3 )
+      gxv_kern_subtable_fmt3_validate( table, table + length, valid );
+    else
+      FT_INVALID_DATA;
+
+  Exit:
+    valid->subtable_length = length;
+    GXV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         kern TABLE                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  gxv_kern_validate_generic( FT_Bytes          table,
+                             FT_Face           face,
+                             FT_Bool           classic_only,
+                             GXV_kern_Dialect  dialect_request,
+                             FT_Validator      ftvalid )
+  {
+    GXV_ValidatorRec   validrec;
+    GXV_Validator      valid = &validrec;
+
+    GXV_kern_DataRec   kernrec;
+    GXV_kern_Data      kern = &kernrec;
+
+    FT_Bytes           p     = table;
+    FT_Bytes           limit = 0;
+
+    FT_ULong           nTables = 0;
+    FT_UInt            i;
+
+
+    valid->root       = ftvalid;
+    valid->table_data = kern;
+    valid->face       = face;
+
+    FT_TRACE3(( "validating `kern' table\n" ));
+    GXV_INIT;
+    KERN_DIALECT( valid ) = dialect_request;
+
+    GXV_LIMIT_CHECK( 2 );
+    GXV_KERN_DATA( version ) = (GXV_kern_Version)FT_NEXT_USHORT( p );
+    GXV_TRACE(( "version 0x%04x (higher 16bit)\n",
+                GXV_KERN_DATA( version ) ));
+
+    if ( 0x0001 < GXV_KERN_DATA( version ) )
+      FT_INVALID_FORMAT;
+    else if ( KERN_IS_CLASSIC( valid ) )
+    {
+      GXV_LIMIT_CHECK( 2 );
+      nTables = FT_NEXT_USHORT( p );
+    }
+    else if ( KERN_IS_NEW( valid ) )
+    {
+      if ( classic_only )
+        FT_INVALID_FORMAT;
+
+      if ( 0x0000 != FT_NEXT_USHORT( p ) )
+        FT_INVALID_FORMAT;
+
+      GXV_LIMIT_CHECK( 4 );
+      nTables = FT_NEXT_ULONG( p );
+    }
+
+    for ( i = 0; i < nTables; i++ )
+    {
+      GXV_TRACE(( "validating subtable %d/%d\n", i, nTables ));
+      /* p should be 32bit-aligned? */
+      gxv_kern_subtable_validate( p, 0, valid );
+      p += valid->subtable_length;
+    }
+
+    FT_TRACE4(( "\n" ));
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_kern_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  ftvalid )
+  {
+    gxv_kern_validate_generic( table, face, 0, KERN_DIALECT_ANY, ftvalid );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_kern_validate_classic( FT_Bytes      table,
+                             FT_Face       face,
+                             FT_Int        dialect_flags,
+                             FT_Validator  ftvalid )
+  {
+    GXV_kern_Dialect  dialect_request;
+
+
+    dialect_request = (GXV_kern_Dialect)dialect_flags;
+    gxv_kern_validate_generic( table, face, 1, dialect_request, ftvalid );
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvlcar.c b/src/gxvalid/gxvlcar.c
new file mode 100644 (file)
index 0000000..f14fa5b
--- /dev/null
@@ -0,0 +1,223 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvlcar.c                                                              */
+/*                                                                         */
+/*    TrueTypeGX/AAT lcar table validation (body).                         */
+/*                                                                         */
+/*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvalid.h"
+#include "gxvcommn.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvlcar
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      Data and Types                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct  GXV_lcar_DataRec_
+  {
+    FT_UShort  format;
+
+  } GXV_lcar_DataRec, *GXV_lcar_Data;
+
+
+#define GXV_LCAR_DATA( FIELD )  GXV_TABLE_DATA( lcar, FIELD )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      UTILITY FUNCTIONS                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  gxv_lcar_partial_validate( FT_UShort      partial,
+                             FT_UShort      glyph,
+                             GXV_Validator  valid )
+  {
+    GXV_NAME_ENTER( "partial" );
+
+    if ( GXV_LCAR_DATA( format ) != 1 )
+      goto Exit;
+
+    gxv_ctlPoint_validate( glyph, partial, valid );
+
+  Exit:
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_lcar_LookupValue_validate( FT_UShort            glyph,
+                                 GXV_LookupValueCPtr  value_p,
+                                 GXV_Validator        valid )
+  {
+    FT_Bytes   p     = valid->root->base + value_p->u;
+    FT_Bytes   limit = valid->root->limit;
+    FT_UShort  count;
+    FT_Short   partial;
+    FT_UShort  i;
+
+
+    GXV_NAME_ENTER( "element in lookupTable" );
+
+    GXV_LIMIT_CHECK( 2 );
+    count = FT_NEXT_USHORT( p );
+
+    GXV_LIMIT_CHECK( 2 * count );
+    for ( i = 0; i < count; i++ )
+    {
+      partial = FT_NEXT_SHORT( p );
+      gxv_lcar_partial_validate( partial, glyph, valid );
+    }
+
+    GXV_EXIT;
+  }
+
+
+  /*
+    +------ lcar --------------------+
+    |                                |
+    |      +===============+         |
+    |      | looup header  |         |
+    |      +===============+         |
+    |      | BinSrchHeader |         |
+    |      +===============+         |
+    |      | lastGlyph[0]  |         |
+    |      +---------------+         |
+    |      | firstGlyph[0] |         |  head of lcar sfnt table
+    |      +---------------+         |             +
+    |      | offset[0]     |    ->   |          offset            [byte]
+    |      +===============+         |             +
+    |      | lastGlyph[1]  |         | (glyphID - firstGlyph) * 2 [byte]
+    |      +---------------+         |
+    |      | firstGlyph[1] |         |
+    |      +---------------+         |
+    |      | offset[1]     |         |
+    |      +===============+         |
+    |                                |
+    |       ....                     |
+    |                                |
+    |      16bit value array         |
+    |      +===============+         |
+    +------|     value     | <-------+
+    |       ....
+    |
+    |
+    |
+    |
+    |
+    +---->  lcar values...handled by lcar callback function
+  */
+
+  static GXV_LookupValueDesc
+  gxv_lcar_LookupFmt4_transit( FT_UShort            relative_gindex,
+                               GXV_LookupValueCPtr  base_value_p,
+                               FT_Bytes             lookuptbl_limit,
+                               GXV_Validator        valid )
+  {
+    FT_Bytes             p;
+    FT_Bytes             limit;
+    FT_UShort            offset;
+    GXV_LookupValueDesc  value;
+
+    FT_UNUSED( lookuptbl_limit );
+
+    /* XXX: check range? */
+    offset = (FT_UShort)( base_value_p->u +
+                          relative_gindex * sizeof ( FT_UShort ) );
+    p      = valid->root->base + offset;
+    limit  = valid->root->limit;
+
+    GXV_LIMIT_CHECK ( 2 );
+    value.u = FT_NEXT_USHORT( p );
+
+    return value;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          lcar TABLE                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  gxv_lcar_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  ftvalid )
+  {
+    FT_Bytes          p     = table;
+    FT_Bytes          limit = 0;
+    GXV_ValidatorRec  validrec;
+    GXV_Validator     valid = &validrec;
+
+    GXV_lcar_DataRec  lcarrec;
+    GXV_lcar_Data     lcar = &lcarrec;
+
+    FT_Fixed          version;
+
+
+    valid->root       = ftvalid;
+    valid->table_data = lcar;
+    valid->face       = face;
+
+    FT_TRACE3(( "validating `lcar' table\n" ));
+    GXV_INIT;
+
+    GXV_LIMIT_CHECK( 4 + 2 );
+    version = FT_NEXT_ULONG( p );
+    GXV_LCAR_DATA( format ) = FT_NEXT_USHORT( p );
+
+    if ( version != 0x00010000UL)
+      FT_INVALID_FORMAT;
+
+    if ( GXV_LCAR_DATA( format ) > 1 )
+      FT_INVALID_FORMAT;
+
+    valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;
+    valid->lookupval_func   = gxv_lcar_LookupValue_validate;
+    valid->lookupfmt4_trans = gxv_lcar_LookupFmt4_transit;
+    gxv_LookupTable_validate( p, limit, valid );
+
+    FT_TRACE4(( "\n" ));
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvmod.c b/src/gxvalid/gxvmod.c
new file mode 100644 (file)
index 0000000..502fe5d
--- /dev/null
@@ -0,0 +1,285 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvmod.c                                                               */
+/*                                                                         */
+/*    FreeType's TrueTypeGX/AAT validation module implementation (body).   */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2006                                             */
+/*  by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                      */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_TRUETYPE_TABLES_H
+#include FT_TRUETYPE_TAGS_H
+#include FT_GX_VALIDATE_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_SERVICE_GX_VALIDATE_H
+
+#include "gxvmod.h"
+#include "gxvalid.h"
+#include "gxvcommn.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvmodule
+
+
+  static FT_Error
+  gxv_load_table( FT_Face             face,
+                  FT_Tag              tag,
+                  FT_Byte* volatile*  table,
+                  FT_ULong*           table_len )
+  {
+    FT_Error   error;
+    FT_Memory  memory = FT_FACE_MEMORY( face );
+
+
+    error = FT_Load_Sfnt_Table( face, tag, 0, NULL, table_len );
+    if ( error == GXV_Err_Table_Missing )
+      return GXV_Err_Ok;
+    if ( error )
+      goto Exit;
+
+    if ( FT_ALLOC( *table, *table_len ) )
+      goto Exit;
+
+    error = FT_Load_Sfnt_Table( face, tag, 0, *table, table_len );
+
+  Exit:
+    return error;
+  }
+
+
+#define GXV_TABLE_DECL( _sfnt )                     \
+          FT_Byte* volatile  _sfnt          = NULL; \
+          FT_ULong            len_ ## _sfnt = 0
+
+#define GXV_TABLE_LOAD( _sfnt )                                     \
+          if ( ( FT_VALIDATE_ ## _sfnt ## _INDEX < table_count ) && \
+               ( gx_flags & FT_VALIDATE_ ## _sfnt )            )    \
+          {                                                         \
+            error = gxv_load_table( face, TTAG_ ## _sfnt,           \
+                                    &_sfnt, &len_ ## _sfnt );       \
+            if ( error )                                            \
+              goto Exit;                                            \
+          }
+
+#define GXV_TABLE_VALIDATE( _sfnt )                                  \
+          if ( _sfnt )                                               \
+          {                                                          \
+            ft_validator_init( &valid, _sfnt, _sfnt + len_ ## _sfnt, \
+                               FT_VALIDATE_DEFAULT );                \
+            if ( ft_setjmp( valid.jump_buffer ) == 0 )               \
+              gxv_ ## _sfnt ## _validate( _sfnt, face, &valid );     \
+            error = valid.error;                                     \
+            if ( error )                                             \
+              goto Exit;                                             \
+          }
+
+#define GXV_TABLE_SET( _sfnt )                                        \
+          if ( FT_VALIDATE_ ## _sfnt ## _INDEX < table_count )        \
+            tables[FT_VALIDATE_ ## _sfnt ## _INDEX] = (FT_Bytes)_sfnt
+
+
+  static FT_Error
+  gxv_validate( FT_Face   face,
+                FT_UInt   gx_flags,
+                FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],
+                FT_UInt   table_count )
+  {
+    FT_Memory volatile        memory = FT_FACE_MEMORY( face );
+
+    FT_Error                  error = GXV_Err_Ok;
+    FT_ValidatorRec volatile  valid;
+
+    FT_UInt  i;
+
+
+    GXV_TABLE_DECL( feat );
+    GXV_TABLE_DECL( bsln );
+    GXV_TABLE_DECL( trak );
+    GXV_TABLE_DECL( just );
+    GXV_TABLE_DECL( mort );
+    GXV_TABLE_DECL( morx );
+    GXV_TABLE_DECL( kern );
+    GXV_TABLE_DECL( opbd );
+    GXV_TABLE_DECL( prop );
+    GXV_TABLE_DECL( lcar );
+
+    for ( i = 0; i < table_count; i++ )
+      tables[i] = 0;
+
+    /* load tables */
+    GXV_TABLE_LOAD( feat );
+    GXV_TABLE_LOAD( bsln );
+    GXV_TABLE_LOAD( trak );
+    GXV_TABLE_LOAD( just );
+    GXV_TABLE_LOAD( mort );
+    GXV_TABLE_LOAD( morx );
+    GXV_TABLE_LOAD( kern );
+    GXV_TABLE_LOAD( opbd );
+    GXV_TABLE_LOAD( prop );
+    GXV_TABLE_LOAD( lcar );
+
+    /* validate tables */
+    GXV_TABLE_VALIDATE( feat );
+    GXV_TABLE_VALIDATE( bsln );
+    GXV_TABLE_VALIDATE( trak );
+    GXV_TABLE_VALIDATE( just );
+    GXV_TABLE_VALIDATE( mort );
+    GXV_TABLE_VALIDATE( morx );
+    GXV_TABLE_VALIDATE( kern );
+    GXV_TABLE_VALIDATE( opbd );
+    GXV_TABLE_VALIDATE( prop );
+    GXV_TABLE_VALIDATE( lcar );
+
+    /* Set results */
+    GXV_TABLE_SET( feat );
+    GXV_TABLE_SET( mort );
+    GXV_TABLE_SET( morx );
+    GXV_TABLE_SET( bsln );
+    GXV_TABLE_SET( just );
+    GXV_TABLE_SET( kern );
+    GXV_TABLE_SET( opbd );
+    GXV_TABLE_SET( trak );
+    GXV_TABLE_SET( prop );
+    GXV_TABLE_SET( lcar );
+
+  Exit:
+    if ( error )
+    {
+      FT_FREE( feat );
+      FT_FREE( bsln );
+      FT_FREE( trak );
+      FT_FREE( just );
+      FT_FREE( mort );
+      FT_FREE( morx );
+      FT_FREE( kern );
+      FT_FREE( opbd );
+      FT_FREE( prop );
+      FT_FREE( lcar );
+    }
+
+    return error;
+  }
+
+
+  static FT_Error
+  classic_kern_validate( FT_Face    face,
+                         FT_UInt    ckern_flags,
+                         FT_Bytes*  ckern_table )
+  {
+    FT_Memory volatile        memory = FT_FACE_MEMORY( face );
+
+    FT_Byte* volatile         ckern     = NULL;
+    FT_ULong                  len_ckern = 0;
+
+    /* without volatile on `error' GCC 4.1.1. emits:                         */
+    /*  warning: variable 'error' might be clobbered by 'longjmp' or 'vfork' */
+    /* this warning seems spurious but ---                                   */
+    FT_Error volatile         error = GXV_Err_Ok;
+    FT_ValidatorRec volatile  valid;
+
+
+    *ckern_table = NULL;
+
+    error = gxv_load_table( face, TTAG_kern, &ckern, &len_ckern );
+    if ( error )
+      goto Exit;
+
+    if ( ckern )
+    {
+      ft_validator_init( &valid, ckern, ckern + len_ckern,
+                         FT_VALIDATE_DEFAULT );
+      if ( ft_setjmp( valid.jump_buffer ) == 0 )
+        gxv_kern_validate_classic( ckern, face,
+                                   ckern_flags & FT_VALIDATE_CKERN, &valid );
+      error = valid.error;
+      if ( error )
+        goto Exit;
+    }
+
+    *ckern_table = ckern;
+
+  Exit:
+    if ( error )
+      FT_FREE( ckern );
+
+    return error;
+  }
+
+
+  static
+  const FT_Service_GXvalidateRec  gxvalid_interface =
+  {
+    gxv_validate
+  };
+
+
+  static
+  const FT_Service_CKERNvalidateRec  ckernvalid_interface =
+  {
+    classic_kern_validate
+  };
+
+
+  static
+  const FT_ServiceDescRec  gxvalid_services[] =
+  {
+    { FT_SERVICE_ID_GX_VALIDATE,          &gxvalid_interface },
+    { FT_SERVICE_ID_CLASSICKERN_VALIDATE, &ckernvalid_interface },
+    { NULL, NULL }
+  };
+
+
+  static FT_Pointer
+  gxvalid_get_service( FT_Module    module,
+                       const char*  service_id )
+  {
+    FT_UNUSED( module );
+
+    return ft_service_list_lookup( gxvalid_services, service_id );
+  }
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FT_Module_Class  gxv_module_class =
+  {
+    0,
+    sizeof ( FT_ModuleRec ),
+    "gxvalid",
+    0x10000L,
+    0x20000L,
+
+    0,              /* module-specific interface */
+
+    (FT_Module_Constructor)0,
+    (FT_Module_Destructor) 0,
+    (FT_Module_Requester)  gxvalid_get_service
+  };
+
+
+/* END */
diff --git a/src/gxvalid/gxvmod.h b/src/gxvalid/gxvmod.h
new file mode 100644 (file)
index 0000000..22732ba
--- /dev/null
@@ -0,0 +1,50 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvmod.h                                                               */
+/*                                                                         */
+/*    FreeType's TrueTypeGX/AAT validation module implementation           */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __GXVMOD_H__
+#define __GXVMOD_H__
+
+#include <ft2build.h>
+#include FT_MODULE_H
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+
+  FT_EXPORT_VAR( const FT_Module_Class )  gxv_module_class;
+
+
+FT_END_HEADER
+
+#endif /* __GXVMOD_H__ */
+
+
+/* END */
diff --git a/src/gxvalid/gxvmort.c b/src/gxvalid/gxvmort.c
new file mode 100644 (file)
index 0000000..465462a
--- /dev/null
@@ -0,0 +1,296 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvmort.c                                                              */
+/*                                                                         */
+/*    TrueTypeGX/AAT mort table validation (body).                         */
+/*                                                                         */
+/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvmort.h"
+#include "gxvfeat.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvmort
+
+
+  static void
+  gxv_mort_feature_validate( GXV_mort_feature  f,
+                             GXV_Validator     valid )
+  {
+    if ( f->featureType >= gxv_feat_registry_length )
+    {
+      GXV_TRACE(( "featureType %d is out of registered range, "
+                  "setting %d is unchecked\n",
+                  f->featureType, f->featureSetting ));
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+    }
+    else if ( !gxv_feat_registry[f->featureType].existence )
+    {
+      GXV_TRACE(( "featureType %d is within registered area "
+                  "but undefined, setting %d is unchecked\n",
+                  f->featureType, f->featureSetting ));
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+    }
+    else
+    {
+      FT_Byte  nSettings_max;
+
+
+      /* nSettings in gxvfeat.c is halved for exclusive on/off settings */
+      nSettings_max = gxv_feat_registry[f->featureType].nSettings;
+      if ( gxv_feat_registry[f->featureType].exclusive )
+        nSettings_max = (FT_Byte)( 2 * nSettings_max );
+
+      GXV_TRACE(( "featureType %d is registered", f->featureType ));
+      GXV_TRACE(( "setting %d", f->featureSetting ));
+
+      if ( f->featureSetting > nSettings_max )
+      {
+        GXV_TRACE(( "out of defined range %d", nSettings_max ));
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+      }
+      GXV_TRACE(( "\n" ));
+    }
+
+    /* TODO: enableFlags must be unique value in specified chain?  */
+  }
+
+
+  /*
+   * nFeatureFlags is typed to FT_ULong to accept that in
+   * mort (typed FT_UShort) and morx (typed FT_ULong).
+   */
+  FT_LOCAL_DEF( void )
+  gxv_mort_featurearray_validate( FT_Bytes       table,
+                                  FT_Bytes       limit,
+                                  FT_ULong       nFeatureFlags,
+                                  GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_ULong  i;
+
+    GXV_mort_featureRec  f = GXV_MORT_FEATURE_OFF;
+
+
+    GXV_NAME_ENTER( "mort feature list" );
+    for ( i = 0; i < nFeatureFlags; i++ )
+    {
+      GXV_LIMIT_CHECK( 2 + 2 + 4 + 4 );
+      f.featureType    = FT_NEXT_USHORT( p );
+      f.featureSetting = FT_NEXT_USHORT( p );
+      f.enableFlags    = FT_NEXT_ULONG( p );
+      f.disableFlags   = FT_NEXT_ULONG( p );
+
+      gxv_mort_feature_validate( &f, valid );
+    }
+
+    if ( !IS_GXV_MORT_FEATURE_OFF( f ) )
+      FT_INVALID_DATA;
+
+    valid->subtable_length = p - table;
+    GXV_EXIT;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_mort_coverage_validate( FT_UShort      coverage,
+                              GXV_Validator  valid )
+  {
+    FT_UNUSED( valid );
+
+    if ( coverage & 0x8000U )
+      GXV_TRACE(( " this subtable is for vertical text only\n" ));
+    else
+      GXV_TRACE(( " this subtable is for horizontal text only\n" ));
+
+    if ( coverage & 0x4000 )
+      GXV_TRACE(( " this subtable is applied to glyph array "
+                  "in descending order\n" ));
+    else
+      GXV_TRACE(( " this subtable is applied to glyph array "
+                  "in ascending order\n" ));
+
+    if ( coverage & 0x2000 )
+      GXV_TRACE(( " this subtable is forcibly applied to "
+                  "vertical/horizontal text\n" ));
+
+    if ( coverage & 0x1FF8 )
+      GXV_TRACE(( " coverage has non-zero bits in reserved area\n" ));
+  }
+
+
+  static void
+  gxv_mort_subtables_validate( FT_Bytes       table,
+                               FT_Bytes       limit,
+                               FT_UShort      nSubtables,
+                               GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+    GXV_Validate_Func fmt_funcs_table[] =
+    {
+      gxv_mort_subtable_type0_validate, /* 0 */
+      gxv_mort_subtable_type1_validate, /* 1 */
+      gxv_mort_subtable_type2_validate, /* 2 */
+      NULL,                             /* 3 */
+      gxv_mort_subtable_type4_validate, /* 4 */
+      gxv_mort_subtable_type5_validate, /* 5 */
+
+    };
+
+    GXV_Validate_Func  func;
+    FT_UShort          i;
+
+
+    GXV_NAME_ENTER( "subtables in a chain" );
+
+    for ( i = 0; i < nSubtables; i++ )
+    {
+      FT_UShort  length;
+      FT_UShort  coverage;
+#ifdef GXV_LOAD_UNUSED_VARS
+      FT_ULong   subFeatureFlags;
+#endif
+      FT_UInt    type;
+      FT_UInt    rest;
+
+
+      GXV_LIMIT_CHECK( 2 + 2 + 4 );
+      length          = FT_NEXT_USHORT( p );
+      coverage        = FT_NEXT_USHORT( p );
+#ifdef GXV_LOAD_UNUSED_VARS
+      subFeatureFlags = FT_NEXT_ULONG( p );
+#else
+      p += 4;
+#endif
+
+      GXV_TRACE(( "validating chain subtable %d/%d (%d bytes)\n",
+                  i + 1, nSubtables, length ));
+      type = coverage & 0x0007;
+      rest = length - ( 2 + 2 + 4 );
+
+      GXV_LIMIT_CHECK( rest );
+      gxv_mort_coverage_validate( coverage, valid );
+
+      if ( type > 5 )
+        FT_INVALID_FORMAT;
+
+      func = fmt_funcs_table[type];
+      if ( func == NULL )
+        GXV_TRACE(( "morx type %d is reserved\n", type ));
+
+      func( p, p + rest, valid );
+
+      p += rest;
+      /* TODO: validate subFeatureFlags */
+    }
+
+    valid->subtable_length = p - table;
+
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_mort_chain_validate( FT_Bytes       table,
+                           FT_Bytes       limit,
+                           GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+#ifdef GXV_LOAD_UNUSED_VARS
+    FT_ULong   defaultFlags;
+#endif
+    FT_ULong   chainLength;
+    FT_UShort  nFeatureFlags;
+    FT_UShort  nSubtables;
+
+
+    GXV_NAME_ENTER( "mort chain header" );
+
+    GXV_LIMIT_CHECK( 4 + 4 + 2 + 2 );
+#ifdef GXV_LOAD_UNUSED_VARS
+    defaultFlags  = FT_NEXT_ULONG( p );
+#else
+    p += 4;
+#endif
+    chainLength   = FT_NEXT_ULONG( p );
+    nFeatureFlags = FT_NEXT_USHORT( p );
+    nSubtables    = FT_NEXT_USHORT( p );
+
+    gxv_mort_featurearray_validate( p, table + chainLength,
+                                    nFeatureFlags, valid );
+    p += valid->subtable_length;
+    gxv_mort_subtables_validate( p, table + chainLength, nSubtables, valid );
+    valid->subtable_length = chainLength;
+
+    /* TODO: validate defaultFlags */
+    GXV_EXIT;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_mort_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  ftvalid )
+  {
+    GXV_ValidatorRec  validrec;
+    GXV_Validator     valid = &validrec;
+    FT_Bytes          p     = table;
+    FT_Bytes          limit = 0;
+    FT_ULong          version;
+    FT_ULong          nChains;
+    FT_ULong          i;
+
+
+    valid->root = ftvalid;
+    valid->face = face;
+    limit       = valid->root->limit;
+
+    FT_TRACE3(( "validating `mort' table\n" ));
+    GXV_INIT;
+
+    GXV_LIMIT_CHECK( 4 + 4 );
+    version = FT_NEXT_ULONG( p );
+    nChains = FT_NEXT_ULONG( p );
+
+    if (version != 0x00010000UL)
+      FT_INVALID_FORMAT;
+
+    for ( i = 0; i < nChains; i++ )
+    {
+      GXV_TRACE(( "validating chain %d/%d\n", i + 1, nChains ));
+      GXV_32BIT_ALIGNMENT_VALIDATE( p - table );
+      gxv_mort_chain_validate( p, limit, valid );
+      p += valid->subtable_length;
+    }
+
+    FT_TRACE4(( "\n" ));
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvmort.h b/src/gxvalid/gxvmort.h
new file mode 100644 (file)
index 0000000..1e5a1f5
--- /dev/null
@@ -0,0 +1,93 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvmort.h                                                              */
+/*                                                                         */
+/*    TrueTypeGX/AAT common definition for mort table (specification).     */
+/*                                                                         */
+/*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __GXVMORT_H__
+#define __GXVMORT_H__
+
+#include "gxvalid.h"
+#include "gxvcommn.h"
+
+#include FT_SFNT_NAMES_H
+
+
+  typedef struct  GXV_mort_featureRec_
+  {
+    FT_UShort  featureType;
+    FT_UShort  featureSetting;
+    FT_ULong   enableFlags;
+    FT_ULong   disableFlags;
+
+  } GXV_mort_featureRec, *GXV_mort_feature;
+
+#define GXV_MORT_FEATURE_OFF  {0, 1, 0x00000000UL, 0x00000000UL}
+
+#define IS_GXV_MORT_FEATURE_OFF( f )              \
+          ( (f).featureType    == 0            || \
+            (f).featureSetting == 1            || \
+            (f).enableFlags    == 0x00000000UL || \
+            (f).disableFlags   == 0x00000000UL )
+
+
+  FT_LOCAL( void )
+  gxv_mort_featurearray_validate( FT_Bytes       table,
+                                  FT_Bytes       limit,
+                                  FT_ULong       nFeatureFlags,
+                                  GXV_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_mort_coverage_validate( FT_UShort      coverage,
+                              GXV_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_mort_subtable_type0_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_mort_subtable_type1_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_mort_subtable_type2_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_mort_subtable_type4_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_mort_subtable_type5_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid );
+
+
+#endif /* __GXVMORT_H__ */
+
+
+/* END */
diff --git a/src/gxvalid/gxvmort0.c b/src/gxvalid/gxvmort0.c
new file mode 100644 (file)
index 0000000..b136ced
--- /dev/null
@@ -0,0 +1,151 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvmort0.c                                                             */
+/*                                                                         */
+/*    TrueTypeGX/AAT mort table validation                                 */
+/*    body for type0 (Indic Script Rearrangement) subtable.                */
+/*                                                                         */
+/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvmort.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvmort
+
+
+  static const char* GXV_Mort_IndicScript_Msg[] =
+  {
+    "no change",
+    "Ax => xA",
+    "xD => Dx",
+    "AxD => DxA",
+    "ABx => xAB",
+    "ABx => xBA",
+    "xCD => CDx",
+    "xCD => DCx",
+    "AxCD => CDxA",
+    "AxCD => DCxA",
+    "ABxD => DxAB",
+    "ABxD => DxBA",
+    "ABxCD => CDxAB",
+    "ABxCD => CDxBA",
+    "ABxCD => DCxAB",
+    "ABxCD => DCxBA",
+
+  };
+
+
+  static void
+  gxv_mort_subtable_type0_entry_validate(
+    FT_Byte                         state,
+    FT_UShort                       flags,
+    GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
+    FT_Bytes                        table,
+    FT_Bytes                        limit,
+    GXV_Validator                   valid )
+  {
+    FT_UShort  markFirst;
+    FT_UShort  dontAdvance;
+    FT_UShort  markLast;
+    FT_UShort  reserved;
+    FT_UShort  verb = 0;
+
+    FT_UNUSED( state );
+    FT_UNUSED( table );
+    FT_UNUSED( limit );
+
+    FT_UNUSED( GXV_Mort_IndicScript_Msg[verb] ); /* for the non-debugging */
+    FT_UNUSED( glyphOffset_p );                  /* case                  */
+
+
+    markFirst   = (FT_UShort)( ( flags >> 15 ) & 1 );
+    dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 );
+    markLast    = (FT_UShort)( ( flags >> 13 ) & 1 );
+
+    reserved = (FT_UShort)( flags & 0x1FF0 );
+    verb     = (FT_UShort)( flags & 0x000F );
+
+    GXV_TRACE(( "  IndicScript MorphRule for glyphOffset 0x%04x",
+                glyphOffset_p->u ));
+    GXV_TRACE(( " markFirst=%01d", markFirst ));
+    GXV_TRACE(( " dontAdvance=%01d", dontAdvance ));
+    GXV_TRACE(( " markLast=%01d", markLast ));
+    GXV_TRACE(( " %02d", verb ));
+    GXV_TRACE(( " %s\n", GXV_Mort_IndicScript_Msg[verb] ));
+
+    if ( markFirst > 0 && markLast > 0 )
+    {
+      GXV_TRACE(( "  [odd] a glyph is marked as the first and last"
+                  "  in Indic rearrangement\n" ));
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+    }
+
+    if ( markFirst > 0 && dontAdvance > 0 )
+    {
+      GXV_TRACE(( "  [odd] the first glyph is marked as dontAdvance"
+                  " in Indic rearrangement\n" ));
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+    }
+
+    if ( 0 < reserved )
+    {
+      GXV_TRACE(( " non-zero bits found in reserved range\n" ));
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+    }
+    else
+      GXV_TRACE(( "\n" ));
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_mort_subtable_type0_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+
+    GXV_NAME_ENTER(
+      "mort chain subtable type0 (Indic-Script Rearrangement)" );
+
+    GXV_LIMIT_CHECK( GXV_STATETABLE_HEADER_SIZE );
+
+    valid->statetable.optdata               = NULL;
+    valid->statetable.optdata_load_func     = NULL;
+    valid->statetable.subtable_setup_func   = NULL;
+    valid->statetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE;
+    valid->statetable.entry_validate_func =
+      gxv_mort_subtable_type0_entry_validate;
+
+    gxv_StateTable_validate( p, limit, valid );
+
+    GXV_EXIT;
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvmort1.c b/src/gxvalid/gxvmort1.c
new file mode 100644 (file)
index 0000000..1c17a5d
--- /dev/null
@@ -0,0 +1,259 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvmort1.c                                                             */
+/*                                                                         */
+/*    TrueTypeGX/AAT mort table validation                                 */
+/*    body for type1 (Contextual Substitution) subtable.                   */
+/*                                                                         */
+/*  Copyright 2005, 2007 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvmort.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvmort
+
+
+  typedef struct  GXV_mort_subtable_type1_StateOptRec_
+  {
+    FT_UShort  substitutionTable;
+    FT_UShort  substitutionTable_length;
+
+  }  GXV_mort_subtable_type1_StateOptRec,
+    *GXV_mort_subtable_type1_StateOptRecData;
+
+#define GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE \
+          ( GXV_STATETABLE_HEADER_SIZE + 2 )
+
+
+  static void
+  gxv_mort_subtable_type1_substitutionTable_load( FT_Bytes       table,
+                                                  FT_Bytes       limit,
+                                                  GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+    GXV_mort_subtable_type1_StateOptRecData  optdata =
+      (GXV_mort_subtable_type1_StateOptRecData)valid->statetable.optdata;
+
+
+    GXV_LIMIT_CHECK( 2 );
+    optdata->substitutionTable = FT_NEXT_USHORT( p );
+  }
+
+
+  static void
+  gxv_mort_subtable_type1_subtable_setup( FT_UShort      table_size,
+                                          FT_UShort      classTable,
+                                          FT_UShort      stateArray,
+                                          FT_UShort      entryTable,
+                                          FT_UShort*     classTable_length_p,
+                                          FT_UShort*     stateArray_length_p,
+                                          FT_UShort*     entryTable_length_p,
+                                          GXV_Validator  valid )
+  {
+    FT_UShort  o[4];
+    FT_UShort  *l[4];
+    FT_UShort  buff[5];
+
+    GXV_mort_subtable_type1_StateOptRecData  optdata =
+      (GXV_mort_subtable_type1_StateOptRecData)valid->statetable.optdata;
+
+
+    o[0] = classTable;
+    o[1] = stateArray;
+    o[2] = entryTable;
+    o[3] = optdata->substitutionTable;
+    l[0] = classTable_length_p;
+    l[1] = stateArray_length_p;
+    l[2] = entryTable_length_p;
+    l[3] = &( optdata->substitutionTable_length );
+
+    gxv_set_length_by_ushort_offset( o, l, buff, 4, table_size, valid );
+  }
+
+
+  static void
+  gxv_mort_subtable_type1_offset_to_subst_validate(
+    FT_Short          wordOffset,
+    const FT_String*  tag,
+    FT_Byte           state,
+    GXV_Validator     valid )
+  {
+    FT_UShort  substTable;
+    FT_UShort  substTable_limit;
+
+    FT_UNUSED( tag );
+    FT_UNUSED( state );
+
+
+    substTable =
+      ((GXV_mort_subtable_type1_StateOptRec *)
+       (valid->statetable.optdata))->substitutionTable;
+    substTable_limit =
+      (FT_UShort)( substTable +
+                   ((GXV_mort_subtable_type1_StateOptRec *)
+                    (valid->statetable.optdata))->substitutionTable_length );
+
+    valid->min_gid = (FT_UShort)( ( substTable       - wordOffset * 2 ) / 2 );
+    valid->max_gid = (FT_UShort)( ( substTable_limit - wordOffset * 2 ) / 2 );
+    valid->max_gid = (FT_UShort)( FT_MAX( valid->max_gid,
+                                          valid->face->num_glyphs ) );
+
+    /* XXX: check range? */
+
+    /* TODO: min_gid & max_gid comparison with ClassTable contents */
+  }
+
+
+  static void
+  gxv_mort_subtable_type1_entry_validate(
+    FT_Byte                         state,
+    FT_UShort                       flags,
+    GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
+    FT_Bytes                        table,
+    FT_Bytes                        limit,
+    GXV_Validator                   valid )
+  {
+#ifdef GXV_LOAD_UNUSED_VARS
+    FT_UShort  setMark;
+    FT_UShort  dontAdvance;
+#endif
+    FT_UShort  reserved;
+    FT_Short   markOffset;
+    FT_Short   currentOffset;
+
+    FT_UNUSED( table );
+    FT_UNUSED( limit );
+
+
+#ifdef GXV_LOAD_UNUSED_VARS
+    setMark       = (FT_UShort)(   flags >> 15            );
+    dontAdvance   = (FT_UShort)( ( flags >> 14 ) & 1      );
+#endif
+    reserved      = (FT_Short)(    flags         & 0x3FFF );
+
+    markOffset    = (FT_Short)( glyphOffset_p->ul >> 16 );
+    currentOffset = (FT_Short)( glyphOffset_p->ul       );
+
+    if ( 0 < reserved )
+    {
+      GXV_TRACE(( " non-zero bits found in reserved range\n" ));
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+    }
+
+    gxv_mort_subtable_type1_offset_to_subst_validate( markOffset,
+                                                      "markOffset",
+                                                      state,
+                                                      valid );
+
+    gxv_mort_subtable_type1_offset_to_subst_validate( currentOffset,
+                                                      "currentOffset",
+                                                      state,
+                                                      valid );
+  }
+
+
+  static void
+  gxv_mort_subtable_type1_substTable_validate( FT_Bytes       table,
+                                               FT_Bytes       limit,
+                                               GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+    FT_UShort  num_gids = (FT_UShort)(
+                 ((GXV_mort_subtable_type1_StateOptRec *)
+                  (valid->statetable.optdata))->substitutionTable_length / 2 );
+    FT_UShort  i;
+
+
+    GXV_NAME_ENTER( "validating contents of substitutionTable" );
+    for ( i = 0; i < num_gids ; i ++ )
+    {
+      FT_UShort  dst_gid;
+
+
+      GXV_LIMIT_CHECK( 2 );
+      dst_gid = FT_NEXT_USHORT( p );
+
+      if ( dst_gid >= 0xFFFFU )
+        continue;
+
+      if ( dst_gid < valid->min_gid || valid->max_gid < dst_gid )
+      {
+        GXV_TRACE(( "substTable include a strange gid[%d]=%d >"
+                    " out of define range (%d..%d)\n",
+                    i, dst_gid, valid->min_gid, valid->max_gid ));
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
+      }
+    }
+
+    GXV_EXIT;
+  }
+
+
+  /*
+   * subtable for Contextual glyph substitution is a modified StateTable.
+   * In addition to classTable, stateArray, and entryTable, the field
+   * `substitutionTable' is added.
+   */
+  FT_LOCAL_DEF( void )
+  gxv_mort_subtable_type1_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+    GXV_mort_subtable_type1_StateOptRec  st_rec;
+
+
+    GXV_NAME_ENTER( "mort chain subtable type1 (Contextual Glyph Subst)" );
+
+    GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE1_HEADER_SIZE );
+
+    valid->statetable.optdata =
+      &st_rec;
+    valid->statetable.optdata_load_func =
+      gxv_mort_subtable_type1_substitutionTable_load;
+    valid->statetable.subtable_setup_func =
+      gxv_mort_subtable_type1_subtable_setup;
+    valid->statetable.entry_glyphoffset_fmt =
+      GXV_GLYPHOFFSET_ULONG;
+    valid->statetable.entry_validate_func =
+
+      gxv_mort_subtable_type1_entry_validate;
+    gxv_StateTable_validate( p, limit, valid );
+
+    gxv_mort_subtable_type1_substTable_validate(
+      table + st_rec.substitutionTable,
+      table + st_rec.substitutionTable + st_rec.substitutionTable_length,
+      valid );
+
+    GXV_EXIT;
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvmort2.c b/src/gxvalid/gxvmort2.c
new file mode 100644 (file)
index 0000000..9e08fb7
--- /dev/null
@@ -0,0 +1,311 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvmort2.c                                                             */
+/*                                                                         */
+/*    TrueTypeGX/AAT mort table validation                                 */
+/*    body for type2 (Ligature Substitution) subtable.                     */
+/*                                                                         */
+/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvmort.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvmort
+
+
+  typedef struct  GXV_mort_subtable_type2_StateOptRec_
+  {
+    FT_UShort  ligActionTable;
+    FT_UShort  componentTable;
+    FT_UShort  ligatureTable;
+    FT_UShort  ligActionTable_length;
+    FT_UShort  componentTable_length;
+    FT_UShort  ligatureTable_length;
+
+  }  GXV_mort_subtable_type2_StateOptRec,
+    *GXV_mort_subtable_type2_StateOptRecData;
+
+#define GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE \
+          ( GXV_STATETABLE_HEADER_SIZE + 2 + 2 + 2 )
+
+
+  static void
+  gxv_mort_subtable_type2_opttable_load( FT_Bytes       table,
+                                         FT_Bytes       limit,
+                                         GXV_Validator  valid )
+  {
+    FT_Bytes p = table;
+    GXV_mort_subtable_type2_StateOptRecData  optdata =
+      (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata;
+
+
+    GXV_LIMIT_CHECK( 2 + 2 + 2 );
+    optdata->ligActionTable = FT_NEXT_USHORT( p );
+    optdata->componentTable = FT_NEXT_USHORT( p );
+    optdata->ligatureTable  = FT_NEXT_USHORT( p );
+
+    GXV_TRACE(( "offset to ligActionTable=0x%04x\n",
+                optdata->ligActionTable ));
+    GXV_TRACE(( "offset to componentTable=0x%04x\n",
+                optdata->componentTable ));
+    GXV_TRACE(( "offset to ligatureTable=0x%04x\n",
+                optdata->ligatureTable ));
+  }
+
+
+  static void
+  gxv_mort_subtable_type2_subtable_setup( FT_UShort      table_size,
+                                          FT_UShort      classTable,
+                                          FT_UShort      stateArray,
+                                          FT_UShort      entryTable,
+                                          FT_UShort      *classTable_length_p,
+                                          FT_UShort      *stateArray_length_p,
+                                          FT_UShort      *entryTable_length_p,
+                                          GXV_Validator  valid )
+  {
+    FT_UShort  o[6];
+    FT_UShort  *l[6];
+    FT_UShort  buff[7];
+
+    GXV_mort_subtable_type2_StateOptRecData  optdata =
+      (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata;
+
+
+    GXV_NAME_ENTER( "subtable boundaries setup" );
+
+    o[0] = classTable;
+    o[1] = stateArray;
+    o[2] = entryTable;
+    o[3] = optdata->ligActionTable;
+    o[4] = optdata->componentTable;
+    o[5] = optdata->ligatureTable;
+    l[0] = classTable_length_p;
+    l[1] = stateArray_length_p;
+    l[2] = entryTable_length_p;
+    l[3] = &(optdata->ligActionTable_length);
+    l[4] = &(optdata->componentTable_length);
+    l[5] = &(optdata->ligatureTable_length);
+
+    gxv_set_length_by_ushort_offset( o, l, buff, 6, table_size, valid );
+
+    GXV_TRACE(( "classTable: offset=0x%04x length=0x%04x\n",
+                classTable, *classTable_length_p ));
+    GXV_TRACE(( "stateArray: offset=0x%04x length=0x%04x\n",
+                stateArray, *stateArray_length_p ));
+    GXV_TRACE(( "entryTable: offset=0x%04x length=0x%04x\n",
+                entryTable, *entryTable_length_p ));
+    GXV_TRACE(( "ligActionTable: offset=0x%04x length=0x%04x\n",
+                optdata->ligActionTable,
+                optdata->ligActionTable_length ));
+    GXV_TRACE(( "componentTable: offset=0x%04x length=0x%04x\n",
+                optdata->componentTable,
+                optdata->componentTable_length ));
+    GXV_TRACE(( "ligatureTable:  offset=0x%04x length=0x%04x\n",
+                optdata->ligatureTable,
+                optdata->ligatureTable_length ));
+
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_mort_subtable_type2_ligActionOffset_validate(
+    FT_Bytes       table,
+    FT_UShort      ligActionOffset,
+    GXV_Validator  valid )
+  {
+    /* access ligActionTable */
+    GXV_mort_subtable_type2_StateOptRecData  optdata =
+      (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata;
+
+    FT_Bytes lat_base  = table + optdata->ligActionTable;
+    FT_Bytes p         = table + ligActionOffset;
+    FT_Bytes lat_limit = lat_base + optdata->ligActionTable;
+
+
+    GXV_32BIT_ALIGNMENT_VALIDATE( ligActionOffset );
+    if ( p < lat_base )
+    {
+      GXV_TRACE(( "too short offset 0x%04x: p < lat_base (%d byte rewind)\n",
+                  ligActionOffset, lat_base - p ));
+
+      /* FontValidator, ftxvalidator, ftxdumperfuser warn but continue */
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
+    }
+    else if ( lat_limit < p )
+    {
+      GXV_TRACE(( "too large offset 0x%04x: lat_limit < p (%d byte overrun)\n",
+                  ligActionOffset, p - lat_limit ));
+
+      /* FontValidator, ftxvalidator, ftxdumperfuser warn but continue */
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
+    }
+    else
+    {
+      /* validate entry in ligActionTable */
+      FT_ULong   lig_action;
+#ifdef GXV_LOAD_UNUSED_VARS
+      FT_UShort  last;
+      FT_UShort  store;
+#endif
+      FT_ULong   offset;
+
+
+      lig_action = FT_NEXT_ULONG( p );
+#ifdef GXV_LOAD_UNUSED_VARS
+      last   = (FT_UShort)( ( lig_action >> 31 ) & 1 );
+      store  = (FT_UShort)( ( lig_action >> 30 ) & 1 );
+#endif
+
+      /* Apple spec defines this offset as a word offset */
+      offset = lig_action & 0x3FFFFFFFUL;
+      if ( offset * 2 < optdata->ligatureTable )
+      {
+        GXV_TRACE(( "too short offset 0x%08x:"
+                    " 2 x offset < ligatureTable (%d byte rewind)\n",
+                     offset, optdata->ligatureTable - offset * 2 ));
+
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
+      } else if ( offset * 2 >
+                  optdata->ligatureTable + optdata->ligatureTable_length )
+      {
+        GXV_TRACE(( "too long offset 0x%08x:"
+                    " 2 x offset > ligatureTable + ligatureTable_length"
+                    " (%d byte overrun)\n",
+                     offset,
+                     optdata->ligatureTable + optdata->ligatureTable_length
+                     - offset * 2 ));
+
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
+      }
+    }
+  }
+
+
+  static void
+  gxv_mort_subtable_type2_entry_validate(
+    FT_Byte                         state,
+    FT_UShort                       flags,
+    GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
+    FT_Bytes                        table,
+    FT_Bytes                        limit,
+    GXV_Validator                   valid )
+  {
+#ifdef GXV_LOAD_UNUSED_VARS
+    FT_UShort setComponent;
+    FT_UShort dontAdvance;
+#endif
+    FT_UShort offset;
+
+    FT_UNUSED( state );
+    FT_UNUSED( glyphOffset_p );
+    FT_UNUSED( limit );
+
+
+#ifdef GXV_LOAD_UNUSED_VARS
+    setComponent = (FT_UShort)( ( flags >> 15 ) & 1 );
+    dontAdvance  = (FT_UShort)( ( flags >> 14 ) & 1 );
+#endif
+
+    offset = (FT_UShort)( flags & 0x3FFFU );
+
+    if ( 0 < offset )
+      gxv_mort_subtable_type2_ligActionOffset_validate( table, offset,
+                                                        valid );
+  }
+
+
+  static void
+  gxv_mort_subtable_type2_ligatureTable_validate( FT_Bytes       table,
+                                                  GXV_Validator  valid )
+  {
+    GXV_mort_subtable_type2_StateOptRecData  optdata =
+      (GXV_mort_subtable_type2_StateOptRecData)valid->statetable.optdata;
+
+    FT_Bytes p     = table + optdata->ligatureTable;
+    FT_Bytes limit = table + optdata->ligatureTable
+                           + optdata->ligatureTable_length;
+
+
+    GXV_NAME_ENTER( "mort chain subtable type2 - substitutionTable" );
+    if ( 0 != optdata->ligatureTable )
+    {
+      /* Apple does not give specification of ligatureTable format */
+      while ( p < limit )
+      {
+        FT_UShort  lig_gid;
+
+
+        GXV_LIMIT_CHECK( 2 );
+        lig_gid = FT_NEXT_USHORT( p );
+
+        if ( valid->face->num_glyphs < lig_gid )
+          GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
+      }
+    }
+    GXV_EXIT;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_mort_subtable_type2_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+    GXV_mort_subtable_type2_StateOptRec  lig_rec;
+
+
+    GXV_NAME_ENTER( "mort chain subtable type2 (Ligature Substitution)" );
+
+    GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE2_HEADER_SIZE );
+
+    valid->statetable.optdata =
+      &lig_rec;
+    valid->statetable.optdata_load_func =
+      gxv_mort_subtable_type2_opttable_load;
+    valid->statetable.subtable_setup_func =
+      gxv_mort_subtable_type2_subtable_setup;
+    valid->statetable.entry_glyphoffset_fmt =
+      GXV_GLYPHOFFSET_NONE;
+    valid->statetable.entry_validate_func =
+      gxv_mort_subtable_type2_entry_validate;
+
+    gxv_StateTable_validate( p, limit, valid );
+
+    p += valid->subtable_length;
+    gxv_mort_subtable_type2_ligatureTable_validate( table, valid );
+
+    valid->subtable_length = p - table;
+
+    GXV_EXIT;
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvmort4.c b/src/gxvalid/gxvmort4.c
new file mode 100644 (file)
index 0000000..8347098
--- /dev/null
@@ -0,0 +1,125 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvmort4.c                                                             */
+/*                                                                         */
+/*    TrueTypeGX/AAT mort table validation                                 */
+/*    body for type4 (Non-Contextual Glyph Substitution) subtable.         */
+/*                                                                         */
+/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvmort.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvmort
+
+
+  static void
+  gxv_mort_subtable_type4_lookupval_validate( FT_UShort            glyph,
+                                              GXV_LookupValueCPtr  value_p,
+                                              GXV_Validator        valid )
+  {
+    FT_UNUSED( glyph );
+
+    gxv_glyphid_validate( value_p->u, valid );
+  }
+
+  /*
+    +===============+ --------+
+    | lookup header |         |
+    +===============+         |
+    | BinSrchHeader |         |
+    +===============+         |
+    | lastGlyph[0]  |         |
+    +---------------+         |
+    | firstGlyph[0] |         |    head of lookup table
+    +---------------+         |             +
+    | offset[0]     |    ->   |          offset            [byte]
+    +===============+         |             +
+    | lastGlyph[1]  |         | (glyphID - firstGlyph) * 2 [byte]
+    +---------------+         |
+    | firstGlyph[1] |         |
+    +---------------+         |
+    | offset[1]     |         |
+    +===============+         |
+                              |
+     ....                     |
+                              |
+    16bit value array         |
+    +===============+         |
+    |     value     | <-------+
+     ....
+  */
+
+  static GXV_LookupValueDesc
+  gxv_mort_subtable_type4_lookupfmt4_transit(
+    FT_UShort            relative_gindex,
+    GXV_LookupValueCPtr  base_value_p,
+    FT_Bytes             lookuptbl_limit,
+    GXV_Validator        valid )
+  {
+    FT_Bytes             p;
+    FT_Bytes             limit;
+    FT_UShort            offset;
+    GXV_LookupValueDesc  value;
+
+    /* XXX: check range? */
+    offset = (FT_UShort)( base_value_p->u +
+                          relative_gindex * sizeof ( FT_UShort ) );
+
+    p     = valid->lookuptbl_head + offset;
+    limit = lookuptbl_limit;
+
+    GXV_LIMIT_CHECK( 2 );
+    value.u = FT_NEXT_USHORT( p );
+
+    return value;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_mort_subtable_type4_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+
+    GXV_NAME_ENTER( "mort chain subtable type4 "
+                    "(Non-Contextual Glyph Substitution)" );
+
+    valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;
+    valid->lookupval_func   = gxv_mort_subtable_type4_lookupval_validate;
+    valid->lookupfmt4_trans = gxv_mort_subtable_type4_lookupfmt4_transit;
+
+    gxv_LookupTable_validate( p, limit, valid );
+
+    GXV_EXIT;
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvmort5.c b/src/gxvalid/gxvmort5.c
new file mode 100644 (file)
index 0000000..32cfb03
--- /dev/null
@@ -0,0 +1,233 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvmort5.c                                                             */
+/*                                                                         */
+/*    TrueTypeGX/AAT mort table validation                                 */
+/*    body for type5 (Contextual Glyph Insertion) subtable.                */
+/*                                                                         */
+/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvmort.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvmort
+
+
+  /*
+   * mort subtable type5 (Contextual Glyph Insertion)
+   * has the format of StateTable with insertion-glyph-list,
+   * but without name.  The offset is given by glyphOffset in
+   * entryTable.  There is no table location declaration
+   * like xxxTable.
+   */
+
+  typedef struct  GXV_mort_subtable_type5_StateOptRec_
+  {
+    FT_UShort   classTable;
+    FT_UShort   stateArray;
+    FT_UShort   entryTable;
+
+#define GXV_MORT_SUBTABLE_TYPE5_HEADER_SIZE  GXV_STATETABLE_HEADER_SIZE
+
+    FT_UShort*  classTable_length_p;
+    FT_UShort*  stateArray_length_p;
+    FT_UShort*  entryTable_length_p;
+
+  }  GXV_mort_subtable_type5_StateOptRec,
+    *GXV_mort_subtable_type5_StateOptRecData;
+
+
+  FT_LOCAL_DEF( void )
+  gxv_mort_subtable_type5_subtable_setup( FT_UShort      table_size,
+                                          FT_UShort      classTable,
+                                          FT_UShort      stateArray,
+                                          FT_UShort      entryTable,
+                                          FT_UShort*     classTable_length_p,
+                                          FT_UShort*     stateArray_length_p,
+                                          FT_UShort*     entryTable_length_p,
+                                          GXV_Validator  valid )
+  {
+    GXV_mort_subtable_type5_StateOptRecData  optdata =
+      (GXV_mort_subtable_type5_StateOptRecData)valid->statetable.optdata;
+
+
+    gxv_StateTable_subtable_setup( table_size,
+                                   classTable,
+                                   stateArray,
+                                   entryTable,
+                                   classTable_length_p,
+                                   stateArray_length_p,
+                                   entryTable_length_p,
+                                   valid );
+
+    optdata->classTable = classTable;
+    optdata->stateArray = stateArray;
+    optdata->entryTable = entryTable;
+
+    optdata->classTable_length_p = classTable_length_p;
+    optdata->stateArray_length_p = stateArray_length_p;
+    optdata->entryTable_length_p = entryTable_length_p;
+  }
+
+
+  static void
+  gxv_mort_subtable_type5_InsertList_validate( FT_UShort      offset,
+                                               FT_UShort      count,
+                                               FT_Bytes       table,
+                                               FT_Bytes       limit,
+                                               GXV_Validator  valid )
+  {
+    /*
+     * We don't know the range of insertion-glyph-list.
+     * Set range by whole of state table.
+     */
+    FT_Bytes  p = table + offset;
+
+    GXV_mort_subtable_type5_StateOptRecData  optdata =
+      (GXV_mort_subtable_type5_StateOptRecData)valid->statetable.optdata;
+
+    if ( optdata->classTable < offset                                   &&
+         offset < optdata->classTable + *(optdata->classTable_length_p) )
+      GXV_TRACE(( " offset runs into ClassTable" ));
+    if ( optdata->stateArray < offset                                   &&
+         offset < optdata->stateArray + *(optdata->stateArray_length_p) )
+      GXV_TRACE(( " offset runs into StateArray" ));
+    if ( optdata->entryTable < offset                                   &&
+         offset < optdata->entryTable + *(optdata->entryTable_length_p) )
+      GXV_TRACE(( " offset runs into EntryTable" ));
+
+#ifndef GXV_LOAD_TRACE_VARS
+    GXV_LIMIT_CHECK( count * 2 );
+#else
+    while ( p < table + offset + ( count * 2 ) )
+    {
+      FT_UShort insert_glyphID;
+
+
+      GXV_LIMIT_CHECK( 2 );
+      insert_glyphID = FT_NEXT_USHORT( p );
+      GXV_TRACE(( " 0x%04x", insert_glyphID ));
+    }
+    GXV_TRACE(( "\n" ));
+#endif
+  }
+
+
+  static void
+  gxv_mort_subtable_type5_entry_validate(
+    FT_Byte                         state,
+    FT_UShort                       flags,
+    GXV_StateTable_GlyphOffsetCPtr  glyphOffset,
+    FT_Bytes                        table,
+    FT_Bytes                        limit,
+    GXV_Validator                   valid )
+  {
+#ifdef GXV_LOAD_UNUSED_VARS
+    FT_Bool    setMark;
+    FT_Bool    dontAdvance;
+    FT_Bool    currentIsKashidaLike;
+    FT_Bool    markedIsKashidaLike;
+    FT_Bool    currentInsertBefore;
+    FT_Bool    markedInsertBefore;
+#endif
+    FT_Byte    currentInsertCount;
+    FT_Byte    markedInsertCount;
+    FT_UShort  currentInsertList;
+    FT_UShort  markedInsertList;
+
+    FT_UNUSED( state );
+
+
+#ifdef GXV_LOAD_UNUSED_VARS
+    setMark              = FT_BOOL( ( flags >> 15 ) & 1 );
+    dontAdvance          = FT_BOOL( ( flags >> 14 ) & 1 );
+    currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 );
+    markedIsKashidaLike  = FT_BOOL( ( flags >> 12 ) & 1 );
+    currentInsertBefore  = FT_BOOL( ( flags >> 11 ) & 1 );
+    markedInsertBefore   = FT_BOOL( ( flags >> 10 ) & 1 );
+#endif
+
+    currentInsertCount   = (FT_Byte)( ( flags >> 5 ) & 0x1F   );
+    markedInsertCount    = (FT_Byte)(   flags        & 0x001F );
+
+    currentInsertList    = (FT_UShort)( glyphOffset->ul >> 16 );
+    markedInsertList     = (FT_UShort)( glyphOffset->ul       );
+
+    if ( 0 != currentInsertList && 0 != currentInsertCount )
+    {
+      gxv_mort_subtable_type5_InsertList_validate( currentInsertList,
+                                                   currentInsertCount,
+                                                   table,
+                                                   limit,
+                                                   valid );
+    }
+
+    if ( 0 != markedInsertList && 0 != markedInsertCount )
+    {
+      gxv_mort_subtable_type5_InsertList_validate( markedInsertList,
+                                                   markedInsertCount,
+                                                   table,
+                                                   limit,
+                                                   valid );
+    }
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_mort_subtable_type5_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+    GXV_mort_subtable_type5_StateOptRec      et_rec;
+    GXV_mort_subtable_type5_StateOptRecData  et = &et_rec;
+
+
+    GXV_NAME_ENTER( "mort chain subtable type5 (Glyph Insertion)" );
+
+    GXV_LIMIT_CHECK( GXV_MORT_SUBTABLE_TYPE5_HEADER_SIZE );
+
+    valid->statetable.optdata =
+      et;
+    valid->statetable.optdata_load_func =
+      NULL;
+    valid->statetable.subtable_setup_func =
+      gxv_mort_subtable_type5_subtable_setup;
+    valid->statetable.entry_glyphoffset_fmt =
+      GXV_GLYPHOFFSET_ULONG;
+    valid->statetable.entry_validate_func =
+      gxv_mort_subtable_type5_entry_validate;
+
+    gxv_StateTable_validate( p, limit, valid );
+
+    GXV_EXIT;
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvmorx.c b/src/gxvalid/gxvmorx.c
new file mode 100644 (file)
index 0000000..4b1dd00
--- /dev/null
@@ -0,0 +1,199 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvmorx.c                                                              */
+/*                                                                         */
+/*    TrueTypeGX/AAT morx table validation (body).                         */
+/*                                                                         */
+/*  Copyright 2005, 2008 by                                                */
+/*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvmorx.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvmorx
+
+
+  static void
+  gxv_morx_subtables_validate( FT_Bytes       table,
+                               FT_Bytes       limit,
+                               FT_UShort      nSubtables,
+                               GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+    GXV_Validate_Func fmt_funcs_table[] =
+    {
+      gxv_morx_subtable_type0_validate, /* 0 */
+      gxv_morx_subtable_type1_validate, /* 1 */
+      gxv_morx_subtable_type2_validate, /* 2 */
+      NULL,                             /* 3 */
+      gxv_morx_subtable_type4_validate, /* 4 */
+      gxv_morx_subtable_type5_validate, /* 5 */
+
+    };
+
+    GXV_Validate_Func  func;
+
+    FT_UShort  i;
+
+
+    GXV_NAME_ENTER( "subtables in a chain" );
+
+    for ( i = 0; i < nSubtables; i++ )
+    {
+      FT_ULong  length;
+      FT_ULong  coverage;
+#ifdef GXV_LOAD_UNUSED_VARS
+      FT_ULong  subFeatureFlags;
+#endif
+      FT_ULong  type;
+      FT_ULong  rest;
+
+
+      GXV_LIMIT_CHECK( 4 + 4 + 4 );
+      length          = FT_NEXT_ULONG( p );
+      coverage        = FT_NEXT_ULONG( p );
+#ifdef GXV_LOAD_UNUSED_VARS
+      subFeatureFlags = FT_NEXT_ULONG( p );
+#else
+      p += 4;
+#endif
+
+      GXV_TRACE(( "validating chain subtable %d/%d (%d bytes)\n",
+                  i + 1, nSubtables, length ));
+
+      type = coverage & 0x0007;
+      rest = length - ( 4 + 4 + 4 );
+      GXV_LIMIT_CHECK( rest );
+
+      /* morx coverage consists of mort_coverage & 16bit padding */
+      gxv_mort_coverage_validate( (FT_UShort)( ( coverage >> 16 ) | coverage ),
+                                  valid );
+      if ( type > 5 )
+        FT_INVALID_FORMAT;
+
+      func = fmt_funcs_table[type];
+      if ( func == NULL )
+        GXV_TRACE(( "morx type %d is reserved\n", type ));
+
+      func( p, p + rest, valid );
+
+      /* TODO: subFeatureFlags should be unique in a table? */
+      p += rest;
+    }
+
+    valid->subtable_length = p - table;
+
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_morx_chain_validate( FT_Bytes       table,
+                           FT_Bytes       limit,
+                           GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+#ifdef GXV_LOAD_UNUSED_VARS
+    FT_ULong  defaultFlags;
+#endif
+    FT_ULong  chainLength;
+    FT_ULong  nFeatureFlags;
+    FT_ULong  nSubtables;
+
+
+    GXV_NAME_ENTER( "morx chain header" );
+
+    GXV_LIMIT_CHECK( 4 + 4 + 4 + 4 );
+#ifdef GXV_LOAD_UNUSED_VARS
+    defaultFlags  = FT_NEXT_ULONG( p );
+#else
+    p += 4;
+#endif
+    chainLength   = FT_NEXT_ULONG( p );
+    nFeatureFlags = FT_NEXT_ULONG( p );
+    nSubtables    = FT_NEXT_ULONG( p );
+
+    /* feature-array of morx is same with that of mort */
+    gxv_mort_featurearray_validate( p, limit, nFeatureFlags, valid );
+    p += valid->subtable_length;
+
+    if ( nSubtables >= 0x10000L )
+      FT_INVALID_DATA;
+
+    gxv_morx_subtables_validate( p, table + chainLength,
+                                 (FT_UShort)nSubtables, valid );
+
+    valid->subtable_length = chainLength;
+
+    /* TODO: defaultFlags should be compared with the flags in tables */
+
+    GXV_EXIT;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_morx_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  ftvalid )
+  {
+    GXV_ValidatorRec  validrec;
+    GXV_Validator     valid = &validrec;
+    FT_Bytes          p     = table;
+    FT_Bytes          limit = 0;
+    FT_ULong          version;
+    FT_ULong          nChains;
+    FT_ULong          i;
+
+
+    valid->root = ftvalid;
+    valid->face = face;
+
+    FT_TRACE3(( "validating `morx' table\n" ));
+    GXV_INIT;
+
+    GXV_LIMIT_CHECK( 4 + 4 );
+    version = FT_NEXT_ULONG( p );
+    nChains = FT_NEXT_ULONG( p );
+
+    if ( version != 0x00020000UL )
+      FT_INVALID_FORMAT;
+
+    for ( i = 0; i < nChains; i++ )
+    {
+      GXV_TRACE(( "validating chain %d/%d\n", i + 1, nChains ));
+      GXV_32BIT_ALIGNMENT_VALIDATE( p - table );
+      gxv_morx_chain_validate( p, limit, valid );
+      p += valid->subtable_length;
+    }
+
+    FT_TRACE4(( "\n" ));
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvmorx.h b/src/gxvalid/gxvmorx.h
new file mode 100644 (file)
index 0000000..28c1a44
--- /dev/null
@@ -0,0 +1,67 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvmorx.h                                                              */
+/*                                                                         */
+/*    TrueTypeGX/AAT common definition for morx table (specification).     */
+/*                                                                         */
+/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __GXVMORX_H__
+#define __GXVMORX_H__
+
+
+#include "gxvalid.h"
+#include "gxvcommn.h"
+#include "gxvmort.h"
+
+#include FT_SFNT_NAMES_H
+
+
+  FT_LOCAL( void )
+  gxv_morx_subtable_type0_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_morx_subtable_type1_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_morx_subtable_type2_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_morx_subtable_type4_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid );
+
+  FT_LOCAL( void )
+  gxv_morx_subtable_type5_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid );
+
+
+#endif /* __GXVMORX_H__ */
+
+
+/* END */
diff --git a/src/gxvalid/gxvmorx0.c b/src/gxvalid/gxvmorx0.c
new file mode 100644 (file)
index 0000000..6a736c1
--- /dev/null
@@ -0,0 +1,111 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvmorx0.c                                                             */
+/*                                                                         */
+/*    TrueTypeGX/AAT morx table validation                                 */
+/*    body for type0 (Indic Script Rearrangement) subtable.                */
+/*                                                                         */
+/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvmorx.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvmorx
+
+
+  static void
+  gxv_morx_subtable_type0_entry_validate(
+    FT_UShort                        state,
+    FT_UShort                        flags,
+    GXV_XStateTable_GlyphOffsetCPtr  glyphOffset_p,
+    FT_Bytes                         table,
+    FT_Bytes                         limit,
+    GXV_Validator                    valid )
+  {
+#ifdef GXV_LOAD_UNUSED_VARS
+    FT_UShort  markFirst;
+    FT_UShort  dontAdvance;
+    FT_UShort  markLast;
+#endif
+    FT_UShort  reserved;
+#ifdef GXV_LOAD_UNUSED_VARS
+    FT_UShort  verb;
+#endif
+
+    FT_UNUSED( state );
+    FT_UNUSED( glyphOffset_p );
+    FT_UNUSED( table );
+    FT_UNUSED( limit );
+
+
+#ifdef GXV_LOAD_UNUSED_VARS
+    markFirst   = (FT_UShort)( ( flags >> 15 ) & 1 );
+    dontAdvance = (FT_UShort)( ( flags >> 14 ) & 1 );
+    markLast    = (FT_UShort)( ( flags >> 13 ) & 1 );
+#endif
+
+    reserved = (FT_UShort)( flags & 0x1FF0 );
+#ifdef GXV_LOAD_UNUSED_VARS
+    verb     = (FT_UShort)( flags & 0x000F );
+#endif
+
+    if ( 0 < reserved )
+    {
+      GXV_TRACE(( " non-zero bits found in reserved range\n" ));
+      FT_INVALID_DATA;
+    }
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_morx_subtable_type0_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+
+    GXV_NAME_ENTER(
+      "morx chain subtable type0 (Indic-Script Rearrangement)" );
+
+    GXV_LIMIT_CHECK( GXV_STATETABLE_HEADER_SIZE );
+
+    valid->xstatetable.optdata               = NULL;
+    valid->xstatetable.optdata_load_func     = NULL;
+    valid->xstatetable.subtable_setup_func   = NULL;
+    valid->xstatetable.entry_glyphoffset_fmt = GXV_GLYPHOFFSET_NONE;
+    valid->xstatetable.entry_validate_func =
+      gxv_morx_subtable_type0_entry_validate;
+
+    gxv_XStateTable_validate( p, limit, valid );
+
+    GXV_EXIT;
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvmorx1.c b/src/gxvalid/gxvmorx1.c
new file mode 100644 (file)
index 0000000..ce0009a
--- /dev/null
@@ -0,0 +1,277 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvmorx1.c                                                             */
+/*                                                                         */
+/*    TrueTypeGX/AAT morx table validation                                 */
+/*    body for type1 (Contextual Substitution) subtable.                   */
+/*                                                                         */
+/*  Copyright 2005, 2007 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvmorx.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvmorx
+
+
+  typedef struct  GXV_morx_subtable_type1_StateOptRec_
+  {
+    FT_ULong   substitutionTable;
+    FT_ULong   substitutionTable_length;
+    FT_UShort  substitutionTable_num_lookupTables;
+
+  }  GXV_morx_subtable_type1_StateOptRec,
+    *GXV_morx_subtable_type1_StateOptRecData;
+
+
+#define GXV_MORX_SUBTABLE_TYPE1_HEADER_SIZE \
+          ( GXV_STATETABLE_HEADER_SIZE + 2 )
+
+
+  static void
+  gxv_morx_subtable_type1_substitutionTable_load( FT_Bytes       table,
+                                                  FT_Bytes       limit,
+                                                  GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+    GXV_morx_subtable_type1_StateOptRecData  optdata =
+      (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata;
+
+
+    GXV_LIMIT_CHECK( 2 );
+    optdata->substitutionTable = FT_NEXT_USHORT( p );
+  }
+
+
+  static void
+  gxv_morx_subtable_type1_subtable_setup( FT_ULong       table_size,
+                                          FT_ULong       classTable,
+                                          FT_ULong       stateArray,
+                                          FT_ULong       entryTable,
+                                          FT_ULong*      classTable_length_p,
+                                          FT_ULong*      stateArray_length_p,
+                                          FT_ULong*      entryTable_length_p,
+                                          GXV_Validator  valid )
+  {
+    FT_ULong  o[4];
+    FT_ULong  *l[4];
+    FT_ULong  buff[5];
+
+    GXV_morx_subtable_type1_StateOptRecData  optdata =
+      (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata;
+
+
+    o[0] = classTable;
+    o[1] = stateArray;
+    o[2] = entryTable;
+    o[3] = optdata->substitutionTable;
+    l[0] = classTable_length_p;
+    l[1] = stateArray_length_p;
+    l[2] = entryTable_length_p;
+    l[3] = &(optdata->substitutionTable_length);
+
+    gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, valid );
+  }
+
+
+  static void
+  gxv_morx_subtable_type1_entry_validate(
+    FT_UShort                       state,
+    FT_UShort                       flags,
+    GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
+    FT_Bytes                        table,
+    FT_Bytes                        limit,
+    GXV_Validator                   valid )
+  {
+#ifdef GXV_LOAD_TRACE_VARS
+    FT_UShort  setMark;
+    FT_UShort  dontAdvance;
+#endif
+    FT_UShort  reserved;
+    FT_Short   markIndex;
+    FT_Short   currentIndex;
+
+    GXV_morx_subtable_type1_StateOptRecData  optdata =
+      (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata;
+
+    FT_UNUSED( state );
+    FT_UNUSED( table );
+    FT_UNUSED( limit );
+
+
+#ifdef GXV_LOAD_TRACE_VARS
+    setMark      = (FT_UShort)( ( flags >> 15 ) & 1 );
+    dontAdvance  = (FT_UShort)( ( flags >> 14 ) & 1 );
+#endif
+
+    reserved = (FT_UShort)( flags & 0x3FFF );
+
+    markIndex    = (FT_Short)( glyphOffset_p->ul >> 16 );
+    currentIndex = (FT_Short)( glyphOffset_p->ul       );
+
+    GXV_TRACE(( " setMark=%01d dontAdvance=%01d\n",
+                setMark, dontAdvance ));
+
+    if ( 0 < reserved )
+    {
+      GXV_TRACE(( " non-zero bits found in reserved range\n" ));
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_DATA );
+    }
+
+    GXV_TRACE(( "markIndex = %d, currentIndex = %d\n",
+                markIndex, currentIndex ));
+
+    if ( optdata->substitutionTable_num_lookupTables < markIndex + 1 )
+      optdata->substitutionTable_num_lookupTables =
+        (FT_Short)( markIndex + 1 );
+
+    if ( optdata->substitutionTable_num_lookupTables < currentIndex + 1 )
+      optdata->substitutionTable_num_lookupTables =
+        (FT_Short)( currentIndex + 1 );
+  }
+
+
+  static void
+  gxv_morx_subtable_type1_LookupValue_validate( FT_UShort            glyph,
+                                                GXV_LookupValueCPtr  value_p,
+                                                GXV_Validator        valid )
+  {
+    FT_UNUSED( glyph ); /* for the non-debugging case */
+
+    GXV_TRACE(( "morx subtable type1 subst.: %d -> %d\n", glyph, value_p->u ));
+
+    if ( value_p->u > valid->face->num_glyphs )
+      FT_INVALID_GLYPH_ID;
+  }
+
+
+  static GXV_LookupValueDesc
+  gxv_morx_subtable_type1_LookupFmt4_transit(
+    FT_UShort            relative_gindex,
+    GXV_LookupValueCPtr  base_value_p,
+    FT_Bytes             lookuptbl_limit,
+    GXV_Validator        valid )
+  {
+    FT_Bytes             p;
+    FT_Bytes             limit;
+    FT_UShort            offset;
+    GXV_LookupValueDesc  value;
+
+    /* XXX: check range? */
+    offset = (FT_UShort)( base_value_p->u +
+                          relative_gindex * sizeof ( FT_UShort ) );
+
+    p     = valid->lookuptbl_head + offset;
+    limit = lookuptbl_limit;
+
+    GXV_LIMIT_CHECK ( 2 );
+    value.u = FT_NEXT_USHORT( p );
+
+    return value;
+  }
+
+
+  /*
+   * TODO: length should be limit?
+   **/
+  static void
+  gxv_morx_subtable_type1_substitutionTable_validate( FT_Bytes       table,
+                                                      FT_Bytes       limit,
+                                                      GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+    FT_UShort  i;
+
+    GXV_morx_subtable_type1_StateOptRecData  optdata =
+      (GXV_morx_subtable_type1_StateOptRecData)valid->xstatetable.optdata;
+
+
+    /* TODO: calculate offset/length for each lookupTables */
+    valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;
+    valid->lookupval_func   = gxv_morx_subtable_type1_LookupValue_validate;
+    valid->lookupfmt4_trans = gxv_morx_subtable_type1_LookupFmt4_transit;
+
+    for ( i = 0; i < optdata->substitutionTable_num_lookupTables; i++ )
+    {
+      FT_ULong  offset;
+
+
+      GXV_LIMIT_CHECK( 4 );
+      offset = FT_NEXT_ULONG( p );
+
+      gxv_LookupTable_validate( table + offset, limit, valid );
+    }
+
+    /* TODO: overlapping of lookupTables in substitutionTable */
+  }
+
+
+  /*
+   * subtable for Contextual glyph substitution is a modified StateTable.
+   * In addition to classTable, stateArray, entryTable, the field
+   * `substitutionTable' is added.
+   */
+  FT_LOCAL_DEF( void )
+  gxv_morx_subtable_type1_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+    GXV_morx_subtable_type1_StateOptRec  st_rec;
+
+
+    GXV_NAME_ENTER( "morx chain subtable type1 (Contextual Glyph Subst)" );
+
+    GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE1_HEADER_SIZE );
+
+    st_rec.substitutionTable_num_lookupTables = 0;
+
+    valid->xstatetable.optdata =
+      &st_rec;
+    valid->xstatetable.optdata_load_func =
+      gxv_morx_subtable_type1_substitutionTable_load;
+    valid->xstatetable.subtable_setup_func =
+      gxv_morx_subtable_type1_subtable_setup;
+    valid->xstatetable.entry_glyphoffset_fmt =
+      GXV_GLYPHOFFSET_ULONG;
+    valid->xstatetable.entry_validate_func =
+      gxv_morx_subtable_type1_entry_validate;
+
+    gxv_XStateTable_validate( p, limit, valid );
+
+    gxv_morx_subtable_type1_substitutionTable_validate(
+      table + st_rec.substitutionTable,
+      table + st_rec.substitutionTable + st_rec.substitutionTable_length,
+      valid );
+
+    GXV_EXIT;
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvmorx2.c b/src/gxvalid/gxvmorx2.c
new file mode 100644 (file)
index 0000000..9d2b0bc
--- /dev/null
@@ -0,0 +1,327 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvmorx2.c                                                             */
+/*                                                                         */
+/*    TrueTypeGX/AAT morx table validation                                 */
+/*    body for type2 (Ligature Substitution) subtable.                     */
+/*                                                                         */
+/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvmorx.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvmorx
+
+
+  typedef struct  GXV_morx_subtable_type2_StateOptRec_
+  {
+    FT_ULong  ligActionTable;
+    FT_ULong  componentTable;
+    FT_ULong  ligatureTable;
+    FT_ULong  ligActionTable_length;
+    FT_ULong  componentTable_length;
+    FT_ULong  ligatureTable_length;
+
+  }  GXV_morx_subtable_type2_StateOptRec,
+    *GXV_morx_subtable_type2_StateOptRecData;
+
+
+#define GXV_MORX_SUBTABLE_TYPE2_HEADER_SIZE \
+          ( GXV_XSTATETABLE_HEADER_SIZE + 4 + 4 + 4 )
+
+
+  static void
+  gxv_morx_subtable_type2_opttable_load( FT_Bytes       table,
+                                         FT_Bytes       limit,
+                                         GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+    GXV_morx_subtable_type2_StateOptRecData  optdata =
+      (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata;
+
+
+    GXV_LIMIT_CHECK( 4 + 4 + 4 );
+    optdata->ligActionTable = FT_NEXT_ULONG( p );
+    optdata->componentTable = FT_NEXT_ULONG( p );
+    optdata->ligatureTable  = FT_NEXT_ULONG( p );
+
+    GXV_TRACE(( "offset to ligActionTable=0x%08x\n",
+                optdata->ligActionTable ));
+    GXV_TRACE(( "offset to componentTable=0x%08x\n",
+                optdata->componentTable ));
+    GXV_TRACE(( "offset to ligatureTable=0x%08x\n",
+                optdata->ligatureTable ));
+  }
+
+
+  static void
+  gxv_morx_subtable_type2_subtable_setup( FT_ULong       table_size,
+                                          FT_ULong       classTable,
+                                          FT_ULong       stateArray,
+                                          FT_ULong       entryTable,
+                                          FT_ULong*      classTable_length_p,
+                                          FT_ULong*      stateArray_length_p,
+                                          FT_ULong*      entryTable_length_p,
+                                          GXV_Validator  valid )
+  {
+    FT_ULong   o[6];
+    FT_ULong*  l[6];
+    FT_ULong   buff[7];
+
+    GXV_morx_subtable_type2_StateOptRecData  optdata =
+      (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata;
+
+
+    GXV_NAME_ENTER( "subtable boundaries setup" );
+
+    o[0] = classTable;
+    o[1] = stateArray;
+    o[2] = entryTable;
+    o[3] = optdata->ligActionTable;
+    o[4] = optdata->componentTable;
+    o[5] = optdata->ligatureTable;
+    l[0] = classTable_length_p;
+    l[1] = stateArray_length_p;
+    l[2] = entryTable_length_p;
+    l[3] = &(optdata->ligActionTable_length);
+    l[4] = &(optdata->componentTable_length);
+    l[5] = &(optdata->ligatureTable_length);
+
+    gxv_set_length_by_ulong_offset( o, l, buff, 6, table_size, valid );
+
+    GXV_TRACE(( "classTable: offset=0x%08x length=0x%08x\n",
+                classTable, *classTable_length_p ));
+    GXV_TRACE(( "stateArray: offset=0x%08x length=0x%08x\n",
+                stateArray, *stateArray_length_p ));
+    GXV_TRACE(( "entryTable: offset=0x%08x length=0x%08x\n",
+                entryTable, *entryTable_length_p ));
+    GXV_TRACE(( "ligActionTable: offset=0x%08x length=0x%08x\n",
+                optdata->ligActionTable,
+                optdata->ligActionTable_length ));
+    GXV_TRACE(( "componentTable: offset=0x%08x length=0x%08x\n",
+                optdata->componentTable,
+                optdata->componentTable_length ));
+    GXV_TRACE(( "ligatureTable:  offset=0x%08x length=0x%08x\n",
+                optdata->ligatureTable,
+                optdata->ligatureTable_length ));
+
+    GXV_EXIT;
+  }
+
+
+#define GXV_MORX_LIGACTION_ENTRY_SIZE  4
+
+
+  static void
+  gxv_morx_subtable_type2_ligActionIndex_validate(
+    FT_Bytes       table,
+    FT_UShort      ligActionIndex,
+    GXV_Validator  valid )
+  {
+    /* access ligActionTable */
+    GXV_morx_subtable_type2_StateOptRecData optdata =
+      (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata;
+
+    FT_Bytes lat_base  = table + optdata->ligActionTable;
+    FT_Bytes p         = lat_base +
+                         ligActionIndex * GXV_MORX_LIGACTION_ENTRY_SIZE;
+    FT_Bytes lat_limit = lat_base + optdata->ligActionTable;
+
+
+    if ( p < lat_base )
+    {
+      GXV_TRACE(( "p < lat_base (%d byte rewind)\n", lat_base - p ));
+      FT_INVALID_OFFSET;
+    }
+    else if ( lat_limit < p )
+    {
+      GXV_TRACE(( "lat_limit < p (%d byte overrun)\n", p - lat_limit ));
+      FT_INVALID_OFFSET;
+    }
+
+    {
+      /* validate entry in ligActionTable */
+      FT_ULong   lig_action;
+#ifdef GXV_LOAD_UNUSED_VARS
+      FT_UShort  last;
+      FT_UShort  store;
+#endif
+      FT_ULong   offset;
+      FT_Long    gid_limit;
+
+
+      lig_action = FT_NEXT_ULONG( p );
+#ifdef GXV_LOAD_UNUSED_VARS
+      last       = (FT_UShort)( ( lig_action >> 31 ) & 1 );
+      store      = (FT_UShort)( ( lig_action >> 30 ) & 1 );
+#endif
+
+      offset = lig_action & 0x3FFFFFFFUL;
+
+      /* this offset is 30-bit signed value to add to GID */
+      /* it is different from the location offset in mort */
+      if ( ( offset & 0x3FFF0000UL ) == 0x3FFF0000UL )
+      { /* negative offset */
+        gid_limit = valid->face->num_glyphs - ( offset & 0x0000FFFFUL );
+        if ( gid_limit > 0 )
+          return;
+
+        GXV_TRACE(( "ligature action table includes"
+                    " too negative offset moving all GID"
+                    " below defined range: 0x%04x\n",
+                    offset & 0xFFFFU ));
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
+      }
+      else if ( ( offset & 0x3FFF0000UL ) == 0x0000000UL )
+      { /* positive offset */
+        if ( (FT_Long)offset < valid->face->num_glyphs )
+          return;
+
+        GXV_TRACE(( "ligature action table includes"
+                    " too large offset moving all GID"
+                    " over defined range: 0x%04x\n",
+                    offset & 0xFFFFU ));
+        GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
+      }
+
+      GXV_TRACE(( "ligature action table includes"
+                  " invalid offset to add to 16-bit GID:"
+                  " 0x%08x\n", offset ));
+      GXV_SET_ERR_IF_PARANOID( FT_INVALID_OFFSET );
+    }
+  }
+
+
+  static void
+  gxv_morx_subtable_type2_entry_validate(
+    FT_UShort                       state,
+    FT_UShort                       flags,
+    GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
+    FT_Bytes                        table,
+    FT_Bytes                        limit,
+    GXV_Validator                   valid )
+  {
+#ifdef GXV_LOAD_UNUSED_VARS
+    FT_UShort  setComponent;
+    FT_UShort  dontAdvance;
+    FT_UShort  performAction;
+#endif
+    FT_UShort  reserved;
+    FT_UShort  ligActionIndex;
+
+    FT_UNUSED( state );
+    FT_UNUSED( limit );
+
+
+#ifdef GXV_LOAD_UNUSED_VARS
+    setComponent   = (FT_UShort)( ( flags >> 15 ) & 1 );
+    dontAdvance    = (FT_UShort)( ( flags >> 14 ) & 1 );
+    performAction  = (FT_UShort)( ( flags >> 13 ) & 1 );
+#endif
+
+    reserved       = (FT_UShort)( flags & 0x1FFF );
+    ligActionIndex = glyphOffset_p->u;
+
+    if ( reserved > 0 )
+      GXV_TRACE(( "  reserved 14bit is non-zero\n" ));
+
+    if ( 0 < ligActionIndex )
+      gxv_morx_subtable_type2_ligActionIndex_validate(
+        table, ligActionIndex, valid );
+  }
+
+
+  static void
+  gxv_morx_subtable_type2_ligatureTable_validate( FT_Bytes       table,
+                                                  GXV_Validator  valid )
+  {
+    GXV_morx_subtable_type2_StateOptRecData  optdata =
+      (GXV_morx_subtable_type2_StateOptRecData)valid->xstatetable.optdata;
+
+    FT_Bytes p     = table + optdata->ligatureTable;
+    FT_Bytes limit = table + optdata->ligatureTable
+                           + optdata->ligatureTable_length;
+
+
+    GXV_NAME_ENTER( "morx chain subtable type2 - substitutionTable" );
+
+    if ( 0 != optdata->ligatureTable )
+    {
+      /* Apple does not give specification of ligatureTable format */
+      while ( p < limit )
+      {
+        FT_UShort  lig_gid;
+
+
+        GXV_LIMIT_CHECK( 2 );
+        lig_gid = FT_NEXT_USHORT( p );
+        if ( lig_gid < valid->face->num_glyphs )
+          GXV_SET_ERR_IF_PARANOID( FT_INVALID_GLYPH_ID );
+      }
+    }
+
+    GXV_EXIT;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_morx_subtable_type2_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+    GXV_morx_subtable_type2_StateOptRec  lig_rec;
+
+
+    GXV_NAME_ENTER( "morx chain subtable type2 (Ligature Substitution)" );
+
+    GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE2_HEADER_SIZE );
+
+    valid->xstatetable.optdata =
+      &lig_rec;
+    valid->xstatetable.optdata_load_func =
+      gxv_morx_subtable_type2_opttable_load;
+    valid->xstatetable.subtable_setup_func =
+      gxv_morx_subtable_type2_subtable_setup;
+    valid->xstatetable.entry_glyphoffset_fmt =
+      GXV_GLYPHOFFSET_USHORT;
+    valid->xstatetable.entry_validate_func =
+      gxv_morx_subtable_type2_entry_validate;
+
+    gxv_XStateTable_validate( p, limit, valid );
+
+    p += valid->subtable_length;
+    gxv_morx_subtable_type2_ligatureTable_validate( table, valid );
+
+    GXV_EXIT;
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvmorx4.c b/src/gxvalid/gxvmorx4.c
new file mode 100644 (file)
index 0000000..c0d2f78
--- /dev/null
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvmorx4.c                                                             */
+/*                                                                         */
+/*    TrueTypeGX/AAT morx table validation                                 */
+/*    body for "morx" type4 (Non-Contextual Glyph Substitution) subtable.  */
+/*                                                                         */
+/*  Copyright 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,       */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvmorx.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvmorx
+
+
+  FT_LOCAL_DEF( void )
+  gxv_morx_subtable_type4_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid )
+  {
+    GXV_NAME_ENTER( "morx chain subtable type4 "
+                    "(Non-Contextual Glyph Substitution)" );
+
+    gxv_mort_subtable_type4_validate( table, limit, valid );
+
+    GXV_EXIT;
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvmorx5.c b/src/gxvalid/gxvmorx5.c
new file mode 100644 (file)
index 0000000..d8cf700
--- /dev/null
@@ -0,0 +1,225 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvmorx5.c                                                             */
+/*                                                                         */
+/*    TrueTypeGX/AAT morx table validation                                 */
+/*    body for type5 (Contextual Glyph Insertion) subtable.                */
+/*                                                                         */
+/*  Copyright 2005, 2007 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvmorx.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvmorx
+
+
+  /*
+   * `morx' subtable type5 (Contextual Glyph Insertion)
+   * has format of a StateTable with insertion-glyph-list
+   * without name.  However, the 32bit offset from the head
+   * of subtable to the i-g-l is given after `entryTable',
+   * without variable name specification (the existence of
+   * this offset to the table is different from mort type5).
+   */
+
+
+  typedef struct  GXV_morx_subtable_type5_StateOptRec_
+  {
+    FT_ULong  insertionGlyphList;
+    FT_ULong  insertionGlyphList_length;
+
+  }  GXV_morx_subtable_type5_StateOptRec,
+    *GXV_morx_subtable_type5_StateOptRecData;
+
+
+#define GXV_MORX_SUBTABLE_TYPE5_HEADER_SIZE \
+          ( GXV_STATETABLE_HEADER_SIZE + 4 )
+
+
+  static void
+  gxv_morx_subtable_type5_insertionGlyphList_load( FT_Bytes       table,
+                                                   FT_Bytes       limit,
+                                                   GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+    GXV_morx_subtable_type5_StateOptRecData  optdata =
+      (GXV_morx_subtable_type5_StateOptRecData)valid->xstatetable.optdata;
+
+
+    GXV_LIMIT_CHECK( 4 );
+    optdata->insertionGlyphList = FT_NEXT_ULONG( p );
+  }
+
+
+  static void
+  gxv_morx_subtable_type5_subtable_setup( FT_ULong       table_size,
+                                          FT_ULong       classTable,
+                                          FT_ULong       stateArray,
+                                          FT_ULong       entryTable,
+                                          FT_ULong*      classTable_length_p,
+                                          FT_ULong*      stateArray_length_p,
+                                          FT_ULong*      entryTable_length_p,
+                                          GXV_Validator  valid )
+  {
+    FT_ULong   o[4];
+    FT_ULong*  l[4];
+    FT_ULong   buff[5];
+
+    GXV_morx_subtable_type5_StateOptRecData  optdata =
+      (GXV_morx_subtable_type5_StateOptRecData)valid->xstatetable.optdata;
+
+
+    o[0] = classTable;
+    o[1] = stateArray;
+    o[2] = entryTable;
+    o[3] = optdata->insertionGlyphList;
+    l[0] = classTable_length_p;
+    l[1] = stateArray_length_p;
+    l[2] = entryTable_length_p;
+    l[3] = &(optdata->insertionGlyphList_length);
+
+    gxv_set_length_by_ulong_offset( o, l, buff, 4, table_size, valid );
+  }
+
+
+  static void
+  gxv_morx_subtable_type5_InsertList_validate( FT_UShort      table_index,
+                                               FT_UShort      count,
+                                               FT_Bytes       table,
+                                               FT_Bytes       limit,
+                                               GXV_Validator  valid )
+  {
+    FT_Bytes p = table + table_index * 2;
+
+
+#ifndef GXV_LOAD_TRACE_VARS
+    GXV_LIMIT_CHECK( count * 2 );
+#else
+    while ( p < table + count * 2 + table_index * 2 )
+    {
+      FT_UShort  insert_glyphID;
+
+
+      GXV_LIMIT_CHECK( 2 );
+      insert_glyphID = FT_NEXT_USHORT( p );
+      GXV_TRACE(( " 0x%04x", insert_glyphID ));
+    }
+
+    GXV_TRACE(( "\n" ));
+#endif
+  }
+
+
+  static void
+  gxv_morx_subtable_type5_entry_validate(
+    FT_UShort                       state,
+    FT_UShort                       flags,
+    GXV_StateTable_GlyphOffsetCPtr  glyphOffset_p,
+    FT_Bytes                        table,
+    FT_Bytes                        limit,
+    GXV_Validator                   valid )
+  {
+#ifdef GXV_LOAD_UNUSED_VARS
+    FT_Bool    setMark;
+    FT_Bool    dontAdvance;
+    FT_Bool    currentIsKashidaLike;
+    FT_Bool    markedIsKashidaLike;
+    FT_Bool    currentInsertBefore;
+    FT_Bool    markedInsertBefore;
+#endif
+    FT_Byte    currentInsertCount;
+    FT_Byte    markedInsertCount;
+    FT_Byte    currentInsertList;
+    FT_UShort  markedInsertList;
+
+    FT_UNUSED( state );
+
+
+#ifdef GXV_LOAD_UNUSED_VARS
+    setMark              = FT_BOOL( ( flags >> 15 ) & 1 );
+    dontAdvance          = FT_BOOL( ( flags >> 14 ) & 1 );
+    currentIsKashidaLike = FT_BOOL( ( flags >> 13 ) & 1 );
+    markedIsKashidaLike  = FT_BOOL( ( flags >> 12 ) & 1 );
+    currentInsertBefore  = FT_BOOL( ( flags >> 11 ) & 1 );
+    markedInsertBefore   = FT_BOOL( ( flags >> 10 ) & 1 );
+#endif
+
+    currentInsertCount = (FT_Byte)( ( flags >> 5 ) & 0x1F   );
+    markedInsertCount  = (FT_Byte)(   flags        & 0x001F );
+
+    currentInsertList = (FT_Byte)  ( glyphOffset_p->ul >> 16 );
+    markedInsertList  = (FT_UShort)( glyphOffset_p->ul       );
+
+    if ( currentInsertList && 0 != currentInsertCount )
+      gxv_morx_subtable_type5_InsertList_validate( currentInsertList,
+                                                   currentInsertCount,
+                                                   table, limit,
+                                                   valid );
+
+    if ( markedInsertList && 0 != markedInsertCount )
+      gxv_morx_subtable_type5_InsertList_validate( markedInsertList,
+                                                   markedInsertCount,
+                                                   table, limit,
+                                                   valid );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  gxv_morx_subtable_type5_validate( FT_Bytes       table,
+                                    FT_Bytes       limit,
+                                    GXV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+
+    GXV_morx_subtable_type5_StateOptRec      et_rec;
+    GXV_morx_subtable_type5_StateOptRecData  et = &et_rec;
+
+
+    GXV_NAME_ENTER( "morx chain subtable type5 (Glyph Insertion)" );
+
+    GXV_LIMIT_CHECK( GXV_MORX_SUBTABLE_TYPE5_HEADER_SIZE );
+
+    valid->xstatetable.optdata =
+      et;
+    valid->xstatetable.optdata_load_func =
+      gxv_morx_subtable_type5_insertionGlyphList_load;
+    valid->xstatetable.subtable_setup_func =
+      gxv_morx_subtable_type5_subtable_setup;
+    valid->xstatetable.entry_glyphoffset_fmt =
+      GXV_GLYPHOFFSET_ULONG;
+    valid->xstatetable.entry_validate_func =
+      gxv_morx_subtable_type5_entry_validate;
+
+    gxv_XStateTable_validate( p, limit, valid );
+
+    GXV_EXIT;
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvopbd.c b/src/gxvalid/gxvopbd.c
new file mode 100644 (file)
index 0000000..e125060
--- /dev/null
@@ -0,0 +1,217 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvopbd.c                                                              */
+/*                                                                         */
+/*    TrueTypeGX/AAT opbd table validation (body).                         */
+/*                                                                         */
+/*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvalid.h"
+#include "gxvcommn.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvopbd
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      Data and Types                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct  GXV_opbd_DataRec_
+  {
+    FT_UShort  format;
+    FT_UShort  valueOffset_min;
+
+  } GXV_opbd_DataRec, *GXV_opbd_Data;
+
+
+#define GXV_OPBD_DATA( FIELD )  GXV_TABLE_DATA( opbd, FIELD )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      UTILITY FUNCTIONS                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  gxv_opbd_LookupValue_validate( FT_UShort            glyph,
+                                 GXV_LookupValueCPtr  value_p,
+                                 GXV_Validator        valid )
+  {
+    /* offset in LookupTable is measured from the head of opbd table */
+    FT_Bytes   p     = valid->root->base + value_p->u;
+    FT_Bytes   limit = valid->root->limit;
+    FT_Short   delta_value;
+    int        i;
+
+
+    if ( value_p->u < GXV_OPBD_DATA( valueOffset_min ) )
+      GXV_OPBD_DATA( valueOffset_min ) = value_p->u;
+
+    for ( i = 0; i < 4; i++ )
+    {
+      GXV_LIMIT_CHECK( 2 );
+      delta_value = FT_NEXT_SHORT( p );
+
+      if ( GXV_OPBD_DATA( format ) )    /* format 1, value is ctrl pt. */
+      {
+        if ( delta_value == -1 )
+          continue;
+
+        gxv_ctlPoint_validate( glyph, delta_value, valid );
+      }
+      else                              /* format 0, value is distance */
+        continue;
+    }
+  }
+
+
+  /*
+    opbd ---------------------+
+                              |
+    +===============+         |
+    | lookup header |         |
+    +===============+         |
+    | BinSrchHeader |         |
+    +===============+         |
+    | lastGlyph[0]  |         |
+    +---------------+         |
+    | firstGlyph[0] |         |  head of opbd sfnt table
+    +---------------+         |             +
+    | offset[0]     |    ->   |          offset            [byte]
+    +===============+         |             +
+    | lastGlyph[1]  |         | (glyphID - firstGlyph) * 4 * sizeof(FT_Short) [byte]
+    +---------------+         |
+    | firstGlyph[1] |         |
+    +---------------+         |
+    | offset[1]     |         |
+    +===============+         |
+                              |
+     ....                     |
+                              |
+    48bit value array         |
+    +===============+         |
+    |     value     | <-------+
+    |               |
+    |               |
+    |               |
+    +---------------+
+    .... */
+
+  static GXV_LookupValueDesc
+  gxv_opbd_LookupFmt4_transit( FT_UShort            relative_gindex,
+                               GXV_LookupValueCPtr  base_value_p,
+                               FT_Bytes             lookuptbl_limit,
+                               GXV_Validator        valid )
+  {
+    GXV_LookupValueDesc  value;
+
+    FT_UNUSED( lookuptbl_limit );
+    FT_UNUSED( valid );
+
+    /* XXX: check range? */
+    value.u = (FT_UShort)( base_value_p->u +
+                           relative_gindex * 4 * sizeof ( FT_Short ) );
+
+    return value;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         opbd TABLE                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  gxv_opbd_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  ftvalid )
+  {
+    GXV_ValidatorRec  validrec;
+    GXV_Validator     valid = &validrec;
+    GXV_opbd_DataRec  opbdrec;
+    GXV_opbd_Data     opbd  = &opbdrec;
+    FT_Bytes          p     = table;
+    FT_Bytes          limit = 0;
+
+    FT_ULong  version;
+
+
+    valid->root       = ftvalid;
+    valid->table_data = opbd;
+    valid->face       = face;
+
+    FT_TRACE3(( "validating `opbd' table\n" ));
+    GXV_INIT;
+    GXV_OPBD_DATA( valueOffset_min ) = 0xFFFFU;
+
+
+    GXV_LIMIT_CHECK( 4 + 2 );
+    version                 = FT_NEXT_ULONG( p );
+    GXV_OPBD_DATA( format ) = FT_NEXT_USHORT( p );
+
+
+    /* only 0x00010000 is defined (1996) */
+    GXV_TRACE(( "(version=0x%08x)\n", version ));
+    if ( 0x00010000UL != version )
+      FT_INVALID_FORMAT;
+
+    /* only values 0 and 1 are defined (1996) */
+    GXV_TRACE(( "(format=0x%04x)\n", GXV_OPBD_DATA( format ) ));
+    if ( 0x0001 < GXV_OPBD_DATA( format ) )
+      FT_INVALID_FORMAT;
+
+    valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;
+    valid->lookupval_func   = gxv_opbd_LookupValue_validate;
+    valid->lookupfmt4_trans = gxv_opbd_LookupFmt4_transit;
+
+    gxv_LookupTable_validate( p, limit, valid );
+    p += valid->subtable_length;
+
+    if ( p > table + GXV_OPBD_DATA( valueOffset_min ) )
+    {
+      GXV_TRACE((
+        "found overlap between LookupTable and opbd_value array\n" ));
+      FT_INVALID_OFFSET;
+    }
+
+    FT_TRACE4(( "\n" ));
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvprop.c b/src/gxvalid/gxvprop.c
new file mode 100644 (file)
index 0000000..0be2133
--- /dev/null
@@ -0,0 +1,329 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvprop.c                                                              */
+/*                                                                         */
+/*    TrueTypeGX/AAT prop table validation (body).                         */
+/*                                                                         */
+/*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvalid.h"
+#include "gxvcommn.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvprop
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      Data and Types                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define GXV_PROP_HEADER_SIZE  ( 4 + 2 + 2 )
+#define GXV_PROP_SIZE_MIN     GXV_PROP_HEADER_SIZE
+
+  typedef struct  GXV_prop_DataRec_
+  {
+    FT_Fixed  version;
+
+  } GXV_prop_DataRec, *GXV_prop_Data;
+
+#define GXV_PROP_DATA( field )  GXV_TABLE_DATA( prop, field )
+
+#define GXV_PROP_FLOATER                      0x8000U
+#define GXV_PROP_USE_COMPLEMENTARY_BRACKET    0x1000U
+#define GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET 0x0F00U
+#define GXV_PROP_ATTACHING_TO_RIGHT           0x0080U
+#define GXV_PROP_RESERVED                     0x0060U
+#define GXV_PROP_DIRECTIONALITY_CLASS         0x001FU
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      UTILITY FUNCTIONS                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  gxv_prop_zero_advance_validate( FT_UShort      gid,
+                                  GXV_Validator  valid )
+  {
+    FT_Face       face;
+    FT_Error      error;
+    FT_GlyphSlot  glyph;
+
+
+    GXV_NAME_ENTER( "zero advance" );
+
+    face = valid->face;
+
+    error = FT_Load_Glyph( face,
+                           gid,
+                           FT_LOAD_IGNORE_TRANSFORM );
+    if ( error )
+      FT_INVALID_GLYPH_ID;
+
+    glyph = face->glyph;
+
+    if ( glyph->advance.x != (FT_Pos)0 ||
+         glyph->advance.y != (FT_Pos)0 )
+    {
+      GXV_TRACE(( "  found non-zero advance in zero-advance glyph\n" ));
+      FT_INVALID_DATA;
+    }
+
+    GXV_EXIT;
+  }
+
+
+  /* Pass 0 as GLYPH to check the default property */
+  static void
+  gxv_prop_property_validate( FT_UShort      property,
+                              FT_UShort      glyph,
+                              GXV_Validator  valid )
+  {
+    if ( glyph != 0 && ( property & GXV_PROP_FLOATER ) )
+      gxv_prop_zero_advance_validate( glyph, valid );
+
+    if ( property & GXV_PROP_USE_COMPLEMENTARY_BRACKET )
+    {
+      FT_UShort  offset;
+      char       complement;
+
+
+      offset = (FT_UShort)( property & GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET );
+      if ( offset == 0 )
+      {
+        GXV_TRACE(( "  found zero offset to property\n" ));
+        FT_INVALID_OFFSET;
+      }
+
+      complement = (char)( offset >> 8 );
+      if ( complement & 0x08 )
+      {
+        /* Top bit is set: negative */
+
+        /* Calculate the absolute offset */
+        complement = (char)( ( complement & 0x07 ) + 1 );
+
+        /* The gid for complement must be greater than 0 */
+        if ( glyph <= complement )
+        {
+          GXV_TRACE(( "  found non-positive glyph complement\n" ));
+          FT_INVALID_DATA;
+        }
+      }
+      else
+      {
+        /* The gid for complement must be the face. */
+        gxv_glyphid_validate( (FT_UShort)( glyph + complement ), valid );
+      }
+    }
+    else
+    {
+      if ( property & GXV_PROP_COMPLEMENTARY_BRACKET_OFFSET )
+        GXV_TRACE(( "glyph %d cannot have complementary bracketing\n",
+                    glyph ));
+    }
+
+    /* this is introduced in version 2.0 */
+    if ( property & GXV_PROP_ATTACHING_TO_RIGHT )
+    {
+      if ( GXV_PROP_DATA( version ) == 0x00010000UL )
+      {
+        GXV_TRACE(( "  found older version (1.0) in new version table\n" ));
+        FT_INVALID_DATA;
+      }
+    }
+
+    if ( property & GXV_PROP_RESERVED )
+    {
+      GXV_TRACE(( "  found non-zero bits in reserved bits\n" ));
+      FT_INVALID_DATA;
+    }
+
+    if ( ( property & GXV_PROP_DIRECTIONALITY_CLASS ) > 11 )
+    {
+      /* TODO: Too restricted. Use the validation level. */
+      if ( GXV_PROP_DATA( version ) == 0x00010000UL ||
+           GXV_PROP_DATA( version ) == 0x00020000UL )
+      {
+        GXV_TRACE(( "  found too old version in directionality class\n" ));
+        FT_INVALID_DATA;
+      }
+    }
+  }
+
+
+  static void
+  gxv_prop_LookupValue_validate( FT_UShort            glyph,
+                                 GXV_LookupValueCPtr  value_p,
+                                 GXV_Validator        valid )
+  {
+    gxv_prop_property_validate( value_p->u, glyph, valid );
+  }
+
+
+  /*
+    +===============+ --------+
+    | lookup header |         |
+    +===============+         |
+    | BinSrchHeader |         |
+    +===============+         |
+    | lastGlyph[0]  |         |
+    +---------------+         |
+    | firstGlyph[0] |         |    head of lookup table
+    +---------------+         |             +
+    | offset[0]     |    ->   |          offset            [byte]
+    +===============+         |             +
+    | lastGlyph[1]  |         | (glyphID - firstGlyph) * 2 [byte]
+    +---------------+         |
+    | firstGlyph[1] |         |
+    +---------------+         |
+    | offset[1]     |         |
+    +===============+         |
+                              |
+     ...                      |
+                              |
+    16bit value array         |
+    +===============+         |
+    |     value     | <-------+
+    ...
+  */
+
+  static GXV_LookupValueDesc
+  gxv_prop_LookupFmt4_transit( FT_UShort            relative_gindex,
+                               GXV_LookupValueCPtr  base_value_p,
+                               FT_Bytes             lookuptbl_limit,
+                               GXV_Validator        valid )
+  {
+    FT_Bytes             p;
+    FT_Bytes             limit;
+    FT_UShort            offset;
+    GXV_LookupValueDesc  value;
+
+    /* XXX: check range? */
+    offset = (FT_UShort)( base_value_p->u +
+                          relative_gindex * sizeof ( FT_UShort ) );
+    p      = valid->lookuptbl_head + offset;
+    limit  = lookuptbl_limit;
+
+    GXV_LIMIT_CHECK ( 2 );
+    value.u = FT_NEXT_USHORT( p );
+
+    return value;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         prop TABLE                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  gxv_prop_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  ftvalid )
+  {
+    FT_Bytes          p     = table;
+    FT_Bytes          limit = 0;
+    GXV_ValidatorRec  validrec;
+    GXV_Validator     valid = &validrec;
+
+    GXV_prop_DataRec  proprec;
+    GXV_prop_Data     prop = &proprec;
+
+    FT_Fixed          version;
+    FT_UShort         format;
+    FT_UShort         defaultProp;
+
+
+    valid->root       = ftvalid;
+    valid->table_data = prop;
+    valid->face       = face;
+
+    FT_TRACE3(( "validating `prop' table\n" ));
+    GXV_INIT;
+
+    GXV_LIMIT_CHECK( 4 + 2 + 2 );
+    version     = FT_NEXT_ULONG( p );
+    format      = FT_NEXT_USHORT( p );
+    defaultProp = FT_NEXT_USHORT( p );
+
+    GXV_TRACE(( "  version 0x%08x\n", version ));
+    GXV_TRACE(( "  format  0x%04x\n", format ));
+    GXV_TRACE(( "  defaultProp  0x%04x\n", defaultProp ));
+
+    /* only versions 1.0, 2.0, 3.0 are defined (1996) */
+    if ( version != 0x00010000UL &&
+         version != 0x00020000UL &&
+         version != 0x00030000UL )
+    {
+      GXV_TRACE(( "  found unknown version\n" ));
+      FT_INVALID_FORMAT;
+    }
+
+
+    /* only formats 0x0000, 0x0001 are defined (1996) */
+    if ( format > 1 )
+    {
+      GXV_TRACE(( "  found unknown format\n" ));
+      FT_INVALID_FORMAT;
+    }
+
+    gxv_prop_property_validate( defaultProp, 0, valid );
+
+    if ( format == 0 )
+    {
+      FT_TRACE3(( "(format 0, no per-glyph properties, "
+                  "remaining %d bytes are skipped)", limit - p ));
+      goto Exit;
+    }
+
+    /* format == 1 */
+    GXV_PROP_DATA( version ) = version;
+
+    valid->lookupval_sign   = GXV_LOOKUPVALUE_UNSIGNED;
+    valid->lookupval_func   = gxv_prop_LookupValue_validate;
+    valid->lookupfmt4_trans = gxv_prop_LookupFmt4_transit;
+
+    gxv_LookupTable_validate( p, limit, valid );
+
+  Exit:
+    FT_TRACE4(( "\n" ));
+  }
+
+
+/* END */
diff --git a/src/gxvalid/gxvtrak.c b/src/gxvalid/gxvtrak.c
new file mode 100644 (file)
index 0000000..11fbd7c
--- /dev/null
@@ -0,0 +1,286 @@
+/***************************************************************************/
+/*                                                                         */
+/*  gxvtrak.c                                                              */
+/*                                                                         */
+/*    TrueTypeGX/AAT trak table validation (body).                         */
+/*                                                                         */
+/*  Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K., */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+/***************************************************************************/
+/*                                                                         */
+/* gxvalid is derived from both gxlayout module and otvalid module.        */
+/* Development of gxlayout is supported by the Information-technology      */
+/* Promotion Agency(IPA), Japan.                                           */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "gxvalid.h"
+#include "gxvcommn.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_gxvtrak
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      Data and Types                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+    /*
+     * referred track table format specification:
+     * http://developer.apple.com/fonts/TTRefMan/RM06/Chap6trak.html
+     * last update was 1996.
+     * ----------------------------------------------
+     * [MINIMUM HEADER]: GXV_TRAK_SIZE_MIN
+     * version          (fixed:  32bit) = 0x00010000
+     * format           (uint16: 16bit) = 0 is only defined (1996)
+     * horizOffset      (uint16: 16bit)
+     * vertOffset       (uint16: 16bit)
+     * reserved         (uint16: 16bit) = 0
+     * ----------------------------------------------
+     * [VARIABLE BODY]:
+     * horizData
+     *   header         ( 2 + 2 + 4
+     *   trackTable       + nTracks * ( 4 + 2 + 2 )
+     *   sizeTable        + nSizes * 4 )
+     * ----------------------------------------------
+     * vertData
+     *   header         ( 2 + 2 + 4
+     *   trackTable       + nTracks * ( 4 + 2 + 2 )
+     *   sizeTable        + nSizes * 4 )
+     * ----------------------------------------------
+     */
+  typedef struct  GXV_trak_DataRec_
+  {
+    FT_UShort  trackValueOffset_min;
+    FT_UShort  trackValueOffset_max;
+
+  } GXV_trak_DataRec, *GXV_trak_Data;
+
+
+#define GXV_TRAK_DATA( FIELD )  GXV_TABLE_DATA( trak, FIELD )
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      UTILITY FUNCTIONS                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  gxv_trak_trackTable_validate( FT_Bytes       table,
+                                FT_Bytes       limit,
+                                FT_UShort      nTracks,
+                                GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+
+    FT_Fixed   track, t;
+    FT_UShort  nameIndex;
+    FT_UShort  offset;
+    FT_UShort  i, j;
+
+
+    GXV_NAME_ENTER( "trackTable" );
+
+    GXV_TRAK_DATA( trackValueOffset_min ) = 0xFFFFU;
+    GXV_TRAK_DATA( trackValueOffset_max ) = 0x0000;
+
+    GXV_LIMIT_CHECK( nTracks * ( 4 + 2 + 2 ) );
+
+    for ( i = 0; i < nTracks; i ++ )
+    {
+      p = table + i * ( 4 + 2 + 2 );
+      track     = FT_NEXT_LONG( p );
+      nameIndex = FT_NEXT_USHORT( p );
+      offset    = FT_NEXT_USHORT( p );
+
+      if ( offset < GXV_TRAK_DATA( trackValueOffset_min ) )
+        GXV_TRAK_DATA( trackValueOffset_min ) = offset;
+      if ( offset > GXV_TRAK_DATA( trackValueOffset_max ) )
+        GXV_TRAK_DATA( trackValueOffset_max ) = offset;
+
+      gxv_sfntName_validate( nameIndex, 256, 32767, valid );
+
+      for ( j = i; j < nTracks; j ++ )
+      {
+         p = table + j * ( 4 + 2 + 2 );
+         t = FT_NEXT_LONG( p );
+         if ( t == track )
+           GXV_TRACE(( "duplicated entries found for track value 0x%x\n",
+                        track ));
+      }
+    }
+
+    valid->subtable_length = p - table;
+    GXV_EXIT;
+  }
+
+
+  static void
+  gxv_trak_trackData_validate( FT_Bytes       table,
+                               FT_Bytes       limit,
+                               GXV_Validator  valid )
+  {
+    FT_Bytes   p = table;
+    FT_UShort  nTracks;
+    FT_UShort  nSizes;
+    FT_ULong   sizeTableOffset;
+
+    GXV_ODTECT( 4, odtect );
+
+
+    GXV_ODTECT_INIT( odtect );
+    GXV_NAME_ENTER( "trackData" );
+
+    /* read the header of trackData */
+    GXV_LIMIT_CHECK( 2 + 2 + 4 );
+    nTracks         = FT_NEXT_USHORT( p );
+    nSizes          = FT_NEXT_USHORT( p );
+    sizeTableOffset = FT_NEXT_ULONG( p );
+
+    gxv_odtect_add_range( table, p - table, "trackData header", odtect );
+
+    /* validate trackTable */
+    gxv_trak_trackTable_validate( p, limit, nTracks, valid );
+    gxv_odtect_add_range( p, valid->subtable_length,
+                          "trackTable", odtect );
+
+    /* sizeTable is array of FT_Fixed, don't check contents */
+    p = valid->root->base + sizeTableOffset;
+    GXV_LIMIT_CHECK( nSizes * 4 );
+    gxv_odtect_add_range( p, nSizes * 4, "sizeTable", odtect );
+
+    /* validate trackValueOffet */
+    p = valid->root->base + GXV_TRAK_DATA( trackValueOffset_min );
+    if ( limit - p < nTracks * nSizes * 2 )
+      GXV_TRACE(( "too short trackValue array\n" ));
+
+    p = valid->root->base + GXV_TRAK_DATA( trackValueOffset_max );
+    GXV_LIMIT_CHECK( nSizes * 2 );
+
+    gxv_odtect_add_range( valid->root->base
+                            + GXV_TRAK_DATA( trackValueOffset_min ),
+                          GXV_TRAK_DATA( trackValueOffset_max )
+                            - GXV_TRAK_DATA( trackValueOffset_min )
+                            + nSizes * 2,
+                          "trackValue array", odtect );
+
+    gxv_odtect_validate( odtect, valid );
+
+    GXV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          trak TABLE                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  gxv_trak_validate( FT_Bytes      table,
+                     FT_Face       face,
+                     FT_Validator  ftvalid )
+  {
+    FT_Bytes          p = table;
+    FT_Bytes          limit = 0;
+
+    GXV_ValidatorRec  validrec;
+    GXV_Validator     valid = &validrec;
+    GXV_trak_DataRec  trakrec;
+    GXV_trak_Data     trak = &trakrec;
+
+    FT_ULong   version;
+    FT_UShort  format;
+    FT_UShort  horizOffset;
+    FT_UShort  vertOffset;
+    FT_UShort  reserved;
+
+
+    GXV_ODTECT( 3, odtect );
+
+    GXV_ODTECT_INIT( odtect );
+    valid->root       = ftvalid;
+    valid->table_data = trak;
+    valid->face       = face;
+
+    limit      = valid->root->limit;
+
+    FT_TRACE3(( "validating `trak' table\n" ));
+    GXV_INIT;
+
+    GXV_LIMIT_CHECK( 4 + 2 + 2 + 2 + 2 );
+    version     = FT_NEXT_ULONG( p );
+    format      = FT_NEXT_USHORT( p );
+    horizOffset = FT_NEXT_USHORT( p );
+    vertOffset  = FT_NEXT_USHORT( p );
+    reserved    = FT_NEXT_USHORT( p );
+
+    GXV_TRACE(( " (version = 0x%08x)\n", version ));
+    GXV_TRACE(( " (format = 0x%04x)\n", format ));
+    GXV_TRACE(( " (horizOffset = 0x%04x)\n", horizOffset ));
+    GXV_TRACE(( " (vertOffset = 0x%04x)\n", vertOffset ));
+    GXV_TRACE(( " (reserved = 0x%04x)\n", reserved ));
+
+    /* Version 1.0 (always:1996) */
+    if ( version != 0x00010000UL )
+      FT_INVALID_FORMAT;
+
+    /* format 0 (always:1996) */
+    if ( format != 0x0000 )
+      FT_INVALID_FORMAT;
+
+    GXV_32BIT_ALIGNMENT_VALIDATE( horizOffset );
+    GXV_32BIT_ALIGNMENT_VALIDATE( vertOffset );
+
+    /* Reserved Fixed Value (always) */
+    if ( reserved != 0x0000 )
+      FT_INVALID_DATA;
+
+    /* validate trackData */
+    if ( 0 < horizOffset )
+    {
+      gxv_trak_trackData_validate( table + horizOffset, limit, valid );
+      gxv_odtect_add_range( table + horizOffset, valid->subtable_length,
+                            "horizJustData", odtect );
+    }
+
+    if ( 0 < vertOffset )
+    {
+      gxv_trak_trackData_validate( table + vertOffset, limit, valid );
+      gxv_odtect_add_range( table + vertOffset, valid->subtable_length,
+                            "vertJustData", odtect );
+    }
+
+    gxv_odtect_validate( odtect, valid );
+
+    FT_TRACE4(( "\n" ));
+  }
+
+
+/* END */
diff --git a/src/gxvalid/module.mk b/src/gxvalid/module.mk
new file mode 100644 (file)
index 0000000..9fd098e
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# FreeType 2 gxvalid module definition
+#
+
+# Copyright 2004, 2005, 2006
+#   by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,
+#   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.
+
+
+FTMODULE_H_COMMANDS += GXVALID_MODULE
+
+define GXVALID_MODULE
+$(OPEN_DRIVER) FT_Module_Class, gxv_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)gxvalid   $(ECHO_DRIVER_DESC)TrueTypeGX/AAT validation module$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/src/gxvalid/rules.mk b/src/gxvalid/rules.mk
new file mode 100644 (file)
index 0000000..57bc082
--- /dev/null
@@ -0,0 +1,94 @@
+#
+# FreeType 2 TrueTypeGX/AAT validation driver configuration rules
+#
+
+
+# Copyright 2004, 2005 by suzuki toshiya, Masatake YAMATO, Red Hat K.K.,
+# 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.
+
+
+# GXV driver directory
+#
+GXV_DIR := $(SRC_DIR)/gxvalid
+
+
+# compilation flags for the driver
+#
+GXV_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(GXV_DIR))
+
+
+# GXV driver sources (i.e., C files)
+#
+GXV_DRV_SRC := $(GXV_DIR)/gxvcommn.c \
+               $(GXV_DIR)/gxvfeat.c  \
+               $(GXV_DIR)/gxvbsln.c  \
+               $(GXV_DIR)/gxvtrak.c  \
+               $(GXV_DIR)/gxvopbd.c  \
+               $(GXV_DIR)/gxvprop.c  \
+               $(GXV_DIR)/gxvjust.c  \
+               $(GXV_DIR)/gxvmort.c  \
+               $(GXV_DIR)/gxvmort0.c \
+               $(GXV_DIR)/gxvmort1.c \
+               $(GXV_DIR)/gxvmort2.c \
+               $(GXV_DIR)/gxvmort4.c \
+               $(GXV_DIR)/gxvmort5.c \
+               $(GXV_DIR)/gxvmorx.c  \
+               $(GXV_DIR)/gxvmorx0.c \
+               $(GXV_DIR)/gxvmorx1.c \
+               $(GXV_DIR)/gxvmorx2.c \
+               $(GXV_DIR)/gxvmorx4.c \
+               $(GXV_DIR)/gxvmorx5.c \
+               $(GXV_DIR)/gxvlcar.c  \
+               $(GXV_DIR)/gxvkern.c  \
+               $(GXV_DIR)/gxvmod.c
+
+# GXV driver headers
+#
+GXV_DRV_H := $(GXV_DIR)/gxvalid.h  \
+             $(GXV_DIR)/gxverror.h \
+             $(GXV_DIR)/gxvcommn.h \
+             $(GXV_DIR)/gxvfeat.h  \
+             $(GXV_DIR)/gxvmod.h   \
+             $(GXV_DIR)/gxvmort.h  \
+             $(GXV_DIR)/gxvmorx.h
+
+
+# GXV driver object(s)
+#
+#   GXV_DRV_OBJ_M is used during `multi' builds.
+#   GXV_DRV_OBJ_S is used during `single' builds.
+#
+GXV_DRV_OBJ_M := $(GXV_DRV_SRC:$(GXV_DIR)/%.c=$(OBJ_DIR)/%.$O)
+GXV_DRV_OBJ_S := $(OBJ_DIR)/gxvalid.$O
+
+# GXV driver source file for single build
+#
+GXV_DRV_SRC_S := $(GXV_DIR)/gxvalid.c
+
+
+# GXV driver - single object
+#
+$(GXV_DRV_OBJ_S): $(GXV_DRV_SRC_S) $(GXV_DRV_SRC) \
+                   $(FREETYPE_H) $(GXV_DRV_H)
+       $(GXV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(GXV_DRV_SRC_S))
+
+
+# GXV driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(GXV_DIR)/%.c $(FREETYPE_H) $(GXV_DRV_H)
+       $(GXV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(GXV_DRV_OBJ_S)
+DRV_OBJS_M += $(GXV_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/gzip/Jamfile b/src/gzip/Jamfile
new file mode 100644 (file)
index 0000000..a7aafa0
--- /dev/null
@@ -0,0 +1,16 @@
+# FreeType 2 src/gzip Jamfile
+#
+# Copyright 2001 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) gzip ;
+
+Library  $(FT2_LIB) : ftgzip.c ;
+
+# end of src/pcf Jamfile
diff --git a/src/gzip/adler32.c b/src/gzip/adler32.c
new file mode 100644 (file)
index 0000000..c53f9dd
--- /dev/null
@@ -0,0 +1,48 @@
+/* adler32.c -- compute the Adler-32 checksum of a data stream
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#include "zlib.h"
+
+#define BASE 65521L /* largest prime smaller than 65536 */
+#define NMAX 5552
+/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
+
+#define DO1(buf,i)  {s1 += buf[i]; s2 += s1;}
+#define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);
+#define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);
+#define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);
+#define DO16(buf)   DO8(buf,0); DO8(buf,8);
+
+/* ========================================================================= */
+ZEXPORT(uLong) adler32( /* adler, buf, len) */
+    uLong adler,
+    const Bytef *buf,
+    uInt len )
+{
+    unsigned long s1 = adler & 0xffff;
+    unsigned long s2 = (adler >> 16) & 0xffff;
+    int k;
+
+    if (buf == Z_NULL) return 1L;
+
+    while (len > 0) {
+        k = len < NMAX ? len : NMAX;
+        len -= k;
+        while (k >= 16) {
+            DO16(buf);
+            buf += 16;
+            k -= 16;
+        }
+        if (k != 0) do {
+            s1 += *buf++;
+            s2 += s1;
+        } while (--k);
+        s1 %= BASE;
+        s2 %= BASE;
+    }
+    return (s2 << 16) | s1;
+}
diff --git a/src/gzip/ftgzip.c b/src/gzip/ftgzip.c
new file mode 100644 (file)
index 0000000..f3d2ef9
--- /dev/null
@@ -0,0 +1,689 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgzip.c                                                               */
+/*                                                                         */
+/*    FreeType support for .gz compressed files.                           */
+/*                                                                         */
+/*  This optional component relies on zlib.  It should mainly be used to   */
+/*  parse compressed PCF fonts, as found with many X11 server              */
+/*  distributions.                                                         */
+/*                                                                         */
+/*  Copyright 2002-2006, 2009-2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_MEMORY_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_GZIP_H
+#include FT_CONFIG_STANDARD_LIBRARY_H
+
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  Gzip_Err_
+#define FT_ERR_BASE    FT_Mod_Err_Gzip
+
+#include FT_ERRORS_H
+
+
+#ifdef FT_CONFIG_OPTION_USE_ZLIB
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "gzip code does not support PIC yet"
+#endif
+
+#ifdef FT_CONFIG_OPTION_SYSTEM_ZLIB
+
+#include <zlib.h>
+
+#else /* !FT_CONFIG_OPTION_SYSTEM_ZLIB */
+
+ /* In this case, we include our own modified sources of the ZLib    */
+ /* within the "ftgzip" component.  The modifications were necessary */
+ /* to #include all files without conflicts, as well as preventing   */
+ /* the definition of "extern" functions that may cause linking      */
+ /* conflicts when a program is linked with both FreeType and the    */
+ /* original ZLib.                                                   */
+
+#define NO_DUMMY_DECL
+#ifndef USE_ZLIB_ZCALLOC
+#define MY_ZCALLOC /* prevent all zcalloc() & zfree() in zutils.c */
+#endif
+
+#include "zlib.h"
+
+#undef  SLOW
+#define SLOW  1  /* we can't use asm-optimized sources here! */
+
+  /* Urgh.  `inflate_mask' must not be declared twice -- C++ doesn't like
+     this.  We temporarily disable it and load all necessary header files. */
+#define NO_INFLATE_MASK
+#include "zutil.h"
+#include "inftrees.h"
+#include "infblock.h"
+#include "infcodes.h"
+#include "infutil.h"
+#undef  NO_INFLATE_MASK
+
+  /* infutil.c must be included before infcodes.c */
+#include "zutil.c"
+#include "inftrees.c"
+#include "infutil.c"
+#include "infcodes.c"
+#include "infblock.c"
+#include "inflate.c"
+#include "adler32.c"
+
+#endif /* !FT_CONFIG_OPTION_SYSTEM_ZLIB */
+
+
+/***************************************************************************/
+/***************************************************************************/
+/*****                                                                 *****/
+/*****            Z L I B   M E M O R Y   M A N A G E M E N T          *****/
+/*****                                                                 *****/
+/***************************************************************************/
+/***************************************************************************/
+
+  /* it is better to use FreeType memory routines instead of raw
+     'malloc/free' */
+
+  static voidpf
+  ft_gzip_alloc( FT_Memory  memory,
+                 uInt       items,
+                 uInt       size )
+  {
+    FT_ULong    sz = (FT_ULong)size * items;
+    FT_Error    error;
+    FT_Pointer  p  = NULL;
+
+
+    (void)FT_ALLOC( p, sz );
+    return p;
+  }
+
+
+  static void
+  ft_gzip_free( FT_Memory  memory,
+                voidpf     address )
+  {
+    FT_MEM_FREE( address );
+  }
+
+
+#if !defined( FT_CONFIG_OPTION_SYSTEM_ZLIB ) && !defined( USE_ZLIB_ZCALLOC )
+
+  local voidpf
+  zcalloc ( voidpf    opaque,
+            unsigned  items,
+            unsigned  size )
+  {
+    return ft_gzip_alloc( (FT_Memory)opaque, items, size );
+  }
+
+  local void
+  zcfree( voidpf  opaque,
+          voidpf  ptr )
+  {
+    ft_gzip_free( (FT_Memory)opaque, ptr );
+  }
+
+#endif /* !SYSTEM_ZLIB && !USE_ZLIB_ZCALLOC */
+
+
+/***************************************************************************/
+/***************************************************************************/
+/*****                                                                 *****/
+/*****               Z L I B   F I L E   D E S C R I P T O R           *****/
+/*****                                                                 *****/
+/***************************************************************************/
+/***************************************************************************/
+
+#define FT_GZIP_BUFFER_SIZE  4096
+
+  typedef struct  FT_GZipFileRec_
+  {
+    FT_Stream  source;         /* parent/source stream        */
+    FT_Stream  stream;         /* embedding stream            */
+    FT_Memory  memory;         /* memory allocator            */
+    z_stream   zstream;        /* zlib input stream           */
+
+    FT_ULong   start;          /* starting position, after .gz header */
+    FT_Byte    input[FT_GZIP_BUFFER_SIZE];   /* input read buffer  */
+
+    FT_Byte    buffer[FT_GZIP_BUFFER_SIZE];  /* output buffer      */
+    FT_ULong   pos;                          /* position in output */
+    FT_Byte*   cursor;
+    FT_Byte*   limit;
+
+  } FT_GZipFileRec, *FT_GZipFile;
+
+
+  /* gzip flag byte */
+#define FT_GZIP_ASCII_FLAG   0x01 /* bit 0 set: file probably ascii text */
+#define FT_GZIP_HEAD_CRC     0x02 /* bit 1 set: header CRC present */
+#define FT_GZIP_EXTRA_FIELD  0x04 /* bit 2 set: extra field present */
+#define FT_GZIP_ORIG_NAME    0x08 /* bit 3 set: original file name present */
+#define FT_GZIP_COMMENT      0x10 /* bit 4 set: file comment present */
+#define FT_GZIP_RESERVED     0xE0 /* bits 5..7: reserved */
+
+
+  /* check and skip .gz header - we don't support `transparent' compression */
+  static FT_Error
+  ft_gzip_check_header( FT_Stream  stream )
+  {
+    FT_Error  error;
+    FT_Byte   head[4];
+
+
+    if ( FT_STREAM_SEEK( 0 )       ||
+         FT_STREAM_READ( head, 4 ) )
+      goto Exit;
+
+    /* head[0] && head[1] are the magic numbers;    */
+    /* head[2] is the method, and head[3] the flags */
+    if ( head[0] != 0x1f              ||
+         head[1] != 0x8b              ||
+         head[2] != Z_DEFLATED        ||
+        (head[3] & FT_GZIP_RESERVED)  )
+    {
+      error = Gzip_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    /* skip time, xflags and os code */
+    (void)FT_STREAM_SKIP( 6 );
+
+    /* skip the extra field */
+    if ( head[3] & FT_GZIP_EXTRA_FIELD )
+    {
+      FT_UInt  len;
+
+
+      if ( FT_READ_USHORT_LE( len ) ||
+           FT_STREAM_SKIP( len )    )
+        goto Exit;
+    }
+
+    /* skip original file name */
+    if ( head[3] & FT_GZIP_ORIG_NAME )
+      for (;;)
+      {
+        FT_UInt  c;
+
+
+        if ( FT_READ_BYTE( c ) )
+          goto Exit;
+
+        if ( c == 0 )
+          break;
+      }
+
+    /* skip .gz comment */
+    if ( head[3] & FT_GZIP_COMMENT )
+      for (;;)
+      {
+        FT_UInt  c;
+
+
+        if ( FT_READ_BYTE( c ) )
+          goto Exit;
+
+        if ( c == 0 )
+          break;
+      }
+
+    /* skip CRC */
+    if ( head[3] & FT_GZIP_HEAD_CRC )
+      if ( FT_STREAM_SKIP( 2 ) )
+        goto Exit;
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  ft_gzip_file_init( FT_GZipFile  zip,
+                     FT_Stream    stream,
+                     FT_Stream    source )
+  {
+    z_stream*  zstream = &zip->zstream;
+    FT_Error   error   = Gzip_Err_Ok;
+
+
+    zip->stream = stream;
+    zip->source = source;
+    zip->memory = stream->memory;
+
+    zip->limit  = zip->buffer + FT_GZIP_BUFFER_SIZE;
+    zip->cursor = zip->limit;
+    zip->pos    = 0;
+
+    /* check and skip .gz header */
+    {
+      stream = source;
+
+      error = ft_gzip_check_header( stream );
+      if ( error )
+        goto Exit;
+
+      zip->start = FT_STREAM_POS();
+    }
+
+    /* initialize zlib -- there is no zlib header in the compressed stream */
+    zstream->zalloc = (alloc_func)ft_gzip_alloc;
+    zstream->zfree  = (free_func) ft_gzip_free;
+    zstream->opaque = stream->memory;
+
+    zstream->avail_in = 0;
+    zstream->next_in  = zip->buffer;
+
+    if ( inflateInit2( zstream, -MAX_WBITS ) != Z_OK ||
+         zstream->next_in == NULL                     )
+      error = Gzip_Err_Invalid_File_Format;
+
+  Exit:
+    return error;
+  }
+
+
+  static void
+  ft_gzip_file_done( FT_GZipFile  zip )
+  {
+    z_stream*  zstream = &zip->zstream;
+
+
+    inflateEnd( zstream );
+
+    /* clear the rest */
+    zstream->zalloc    = NULL;
+    zstream->zfree     = NULL;
+    zstream->opaque    = NULL;
+    zstream->next_in   = NULL;
+    zstream->next_out  = NULL;
+    zstream->avail_in  = 0;
+    zstream->avail_out = 0;
+
+    zip->memory = NULL;
+    zip->source = NULL;
+    zip->stream = NULL;
+  }
+
+
+  static FT_Error
+  ft_gzip_file_reset( FT_GZipFile  zip )
+  {
+    FT_Stream  stream = zip->source;
+    FT_Error   error;
+
+
+    if ( !FT_STREAM_SEEK( zip->start ) )
+    {
+      z_stream*  zstream = &zip->zstream;
+
+
+      inflateReset( zstream );
+
+      zstream->avail_in  = 0;
+      zstream->next_in   = zip->input;
+      zstream->avail_out = 0;
+      zstream->next_out  = zip->buffer;
+
+      zip->limit  = zip->buffer + FT_GZIP_BUFFER_SIZE;
+      zip->cursor = zip->limit;
+      zip->pos    = 0;
+    }
+
+    return error;
+  }
+
+
+  static FT_Error
+  ft_gzip_file_fill_input( FT_GZipFile  zip )
+  {
+    z_stream*  zstream = &zip->zstream;
+    FT_Stream  stream  = zip->source;
+    FT_ULong   size;
+
+
+    if ( stream->read )
+    {
+      size = stream->read( stream, stream->pos, zip->input,
+                           FT_GZIP_BUFFER_SIZE );
+      if ( size == 0 )
+        return Gzip_Err_Invalid_Stream_Operation;
+    }
+    else
+    {
+      size = stream->size - stream->pos;
+      if ( size > FT_GZIP_BUFFER_SIZE )
+        size = FT_GZIP_BUFFER_SIZE;
+
+      if ( size == 0 )
+        return Gzip_Err_Invalid_Stream_Operation;
+
+      FT_MEM_COPY( zip->input, stream->base + stream->pos, size );
+    }
+    stream->pos += size;
+
+    zstream->next_in  = zip->input;
+    zstream->avail_in = size;
+
+    return Gzip_Err_Ok;
+  }
+
+
+  static FT_Error
+  ft_gzip_file_fill_output( FT_GZipFile  zip )
+  {
+    z_stream*  zstream = &zip->zstream;
+    FT_Error   error   = Gzip_Err_Ok;
+
+
+    zip->cursor        = zip->buffer;
+    zstream->next_out  = zip->cursor;
+    zstream->avail_out = FT_GZIP_BUFFER_SIZE;
+
+    while ( zstream->avail_out > 0 )
+    {
+      int  err;
+
+
+      if ( zstream->avail_in == 0 )
+      {
+        error = ft_gzip_file_fill_input( zip );
+        if ( error )
+          break;
+      }
+
+      err = inflate( zstream, Z_NO_FLUSH );
+
+      if ( err == Z_STREAM_END )
+      {
+        zip->limit = zstream->next_out;
+        if ( zip->limit == zip->cursor )
+          error = Gzip_Err_Invalid_Stream_Operation;
+        break;
+      }
+      else if ( err != Z_OK )
+      {
+        error = Gzip_Err_Invalid_Stream_Operation;
+        break;
+      }
+    }
+
+    return error;
+  }
+
+
+  /* fill output buffer; `count' must be <= FT_GZIP_BUFFER_SIZE */
+  static FT_Error
+  ft_gzip_file_skip_output( FT_GZipFile  zip,
+                            FT_ULong     count )
+  {
+    FT_Error  error = Gzip_Err_Ok;
+    FT_ULong  delta;
+
+
+    for (;;)
+    {
+      delta = (FT_ULong)( zip->limit - zip->cursor );
+      if ( delta >= count )
+        delta = count;
+
+      zip->cursor += delta;
+      zip->pos    += delta;
+
+      count -= delta;
+      if ( count == 0 )
+        break;
+
+      error = ft_gzip_file_fill_output( zip );
+      if ( error )
+        break;
+    }
+
+    return error;
+  }
+
+
+  static FT_ULong
+  ft_gzip_file_io( FT_GZipFile  zip,
+                   FT_ULong     pos,
+                   FT_Byte*     buffer,
+                   FT_ULong     count )
+  {
+    FT_ULong  result = 0;
+    FT_Error  error;
+
+
+    /* Reset inflate stream if we're seeking backwards.        */
+    /* Yes, that is not too efficient, but it saves memory :-) */
+    if ( pos < zip->pos )
+    {
+      error = ft_gzip_file_reset( zip );
+      if ( error )
+        goto Exit;
+    }
+
+    /* skip unwanted bytes */
+    if ( pos > zip->pos )
+    {
+      error = ft_gzip_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) );
+      if ( error )
+        goto Exit;
+    }
+
+    if ( count == 0 )
+      goto Exit;
+
+    /* now read the data */
+    for (;;)
+    {
+      FT_ULong  delta;
+
+
+      delta = (FT_ULong)( zip->limit - zip->cursor );
+      if ( delta >= count )
+        delta = count;
+
+      FT_MEM_COPY( buffer, zip->cursor, delta );
+      buffer      += delta;
+      result      += delta;
+      zip->cursor += delta;
+      zip->pos    += delta;
+
+      count -= delta;
+      if ( count == 0 )
+        break;
+
+      error = ft_gzip_file_fill_output( zip );
+      if ( error )
+        break;
+    }
+
+  Exit:
+    return result;
+  }
+
+
+/***************************************************************************/
+/***************************************************************************/
+/*****                                                                 *****/
+/*****               G Z   E M B E D D I N G   S T R E A M             *****/
+/*****                                                                 *****/
+/***************************************************************************/
+/***************************************************************************/
+
+  static void
+  ft_gzip_stream_close( FT_Stream  stream )
+  {
+    FT_GZipFile  zip    = (FT_GZipFile)stream->descriptor.pointer;
+    FT_Memory    memory = stream->memory;
+
+
+    if ( zip )
+    {
+      /* finalize gzip file descriptor */
+      ft_gzip_file_done( zip );
+
+      FT_FREE( zip );
+
+      stream->descriptor.pointer = NULL;
+    }
+  }
+
+
+  static FT_ULong
+  ft_gzip_stream_io( FT_Stream  stream,
+                     FT_ULong   pos,
+                     FT_Byte*   buffer,
+                     FT_ULong   count )
+  {
+    FT_GZipFile  zip = (FT_GZipFile)stream->descriptor.pointer;
+
+
+    return ft_gzip_file_io( zip, pos, buffer, count );
+  }
+
+
+  static FT_ULong
+  ft_gzip_get_uncompressed_size( FT_Stream  stream )
+  {
+    FT_Error  error;
+    FT_ULong  old_pos;
+    FT_ULong  result = 0;
+
+
+    old_pos = stream->pos;
+    if ( !FT_Stream_Seek( stream, stream->size - 4 ) )
+    {
+      result = FT_Stream_ReadULong( stream, &error );
+      if ( error )
+        result = 0;
+
+      (void)FT_Stream_Seek( stream, old_pos );
+    }
+
+    return result;
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stream_OpenGzip( FT_Stream  stream,
+                      FT_Stream  source )
+  {
+    FT_Error     error;
+    FT_Memory    memory = source->memory;
+    FT_GZipFile  zip = NULL;
+
+
+    /*
+     *  check the header right now; this prevents allocating un-necessary
+     *  objects when we don't need them
+     */
+    error = ft_gzip_check_header( source );
+    if ( error )
+      goto Exit;
+
+    FT_ZERO( stream );
+    stream->memory = memory;
+
+    if ( !FT_QNEW( zip ) )
+    {
+      error = ft_gzip_file_init( zip, stream, source );
+      if ( error )
+      {
+        FT_FREE( zip );
+        goto Exit;
+      }
+
+      stream->descriptor.pointer = zip;
+    }
+
+    /*
+     *  We use the following trick to try to dramatically improve the
+     *  performance while dealing with small files.  If the original stream
+     *  size is less than a certain threshold, we try to load the whole font
+     *  file into memory.  This saves us from using the 32KB buffer needed
+     *  to inflate the file, plus the two 4KB intermediate input/output
+     *  buffers used in the `FT_GZipFile' structure.
+     */
+    {
+      FT_ULong  zip_size = ft_gzip_get_uncompressed_size( source );
+
+
+      if ( zip_size != 0 && zip_size < 40 * 1024 )
+      {
+        FT_Byte*  zip_buff = NULL;
+
+
+        if ( !FT_ALLOC( zip_buff, zip_size ) )
+        {
+          FT_ULong  count;
+
+
+          count = ft_gzip_file_io( zip, 0, zip_buff, zip_size );
+          if ( count == zip_size )
+          {
+            ft_gzip_file_done( zip );
+            FT_FREE( zip );
+
+            stream->descriptor.pointer = NULL;
+
+            stream->size  = zip_size;
+            stream->pos   = 0;
+            stream->base  = zip_buff;
+            stream->read  = NULL;
+            stream->close = ft_gzip_stream_close;
+
+            goto Exit;
+          }
+
+          ft_gzip_file_io( zip, 0, NULL, 0 );
+          FT_FREE( zip_buff );
+        }
+        error = Gzip_Err_Ok;
+      }
+    }
+
+    stream->size  = 0x7FFFFFFFL;  /* don't know the real size! */
+    stream->pos   = 0;
+    stream->base  = 0;
+    stream->read  = ft_gzip_stream_io;
+    stream->close = ft_gzip_stream_close;
+
+  Exit:
+    return error;
+  }
+
+#else  /* !FT_CONFIG_OPTION_USE_ZLIB */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stream_OpenGzip( FT_Stream  stream,
+                      FT_Stream  source )
+  {
+    FT_UNUSED( stream );
+    FT_UNUSED( source );
+
+    return Gzip_Err_Unimplemented_Feature;
+  }
+
+#endif /* !FT_CONFIG_OPTION_USE_ZLIB */
+
+
+/* END */
diff --git a/src/gzip/infblock.c b/src/gzip/infblock.c
new file mode 100644 (file)
index 0000000..d6e2dc2
--- /dev/null
@@ -0,0 +1,387 @@
+/* infblock.c -- interpret and process block types to last block
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "infblock.h"
+#include "inftrees.h"
+#include "infcodes.h"
+#include "infutil.h"
+
+
+/* simplify the use of the inflate_huft type with some defines */
+#define exop word.what.Exop
+#define bits word.what.Bits
+
+/* Table for deflate from PKZIP's appnote.txt. */
+local const uInt border[] = { /* Order of the bit length code lengths */
+        16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
+
+/*
+   Notes beyond the 1.93a appnote.txt:
+
+   1. Distance pointers never point before the beginning of the output
+      stream.
+   2. Distance pointers can point back across blocks, up to 32k away.
+   3. There is an implied maximum of 7 bits for the bit length table and
+      15 bits for the actual data.
+   4. If only one code exists, then it is encoded using one bit.  (Zero
+      would be more efficient, but perhaps a little confusing.)  If two
+      codes exist, they are coded using one bit each (0 and 1).
+   5. There is no way of sending zero distance codes--a dummy must be
+      sent if there are none.  (History: a pre 2.0 version of PKZIP would
+      store blocks with no distance codes, but this was discovered to be
+      too harsh a criterion.)  Valid only for 1.93a.  2.04c does allow
+      zero distance codes, which is sent as one code of zero bits in
+      length.
+   6. There are up to 286 literal/length codes.  Code 256 represents the
+      end-of-block.  Note however that the static length tree defines
+      288 codes just to fill out the Huffman codes.  Codes 286 and 287
+      cannot be used though, since there is no length base or extra bits
+      defined for them.  Similarily, there are up to 30 distance codes.
+      However, static trees define 32 codes (all 5 bits) to fill out the
+      Huffman codes, but the last two had better not show up in the data.
+   7. Unzip can check dynamic Huffman blocks for complete code sets.
+      The exception is that a single code would not be complete (see #4).
+   8. The five bits following the block type is really the number of
+      literal codes sent minus 257.
+   9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits
+      (1+6+6).  Therefore, to output three times the length, you output
+      three codes (1+1+1), whereas to output four times the same length,
+      you only need two codes (1+3).  Hmm.
+  10. In the tree reconstruction algorithm, Code = Code + Increment
+      only if BitLength(i) is not zero.  (Pretty obvious.)
+  11. Correction: 4 Bits: # of Bit Length codes - 4     (4 - 19)
+  12. Note: length code 284 can represent 227-258, but length code 285
+      really is 258.  The last length deserves its own, short code
+      since it gets used a lot in very redundant files.  The length
+      258 is special since 258 - 3 (the min match length) is 255.
+  13. The literal/length and distance code bit lengths are read as a
+      single stream of lengths.  It is possible (and advantageous) for
+      a repeat code (16, 17, or 18) to go across the boundary between
+      the two sets of lengths.
+ */
+
+
+local void inflate_blocks_reset( /* s, z, c) */
+inflate_blocks_statef *s,
+z_streamp z,
+uLongf *c )
+{
+  if (c != Z_NULL)
+    *c = s->check;
+  if (s->mode == BTREE || s->mode == DTREE)
+    ZFREE(z, s->sub.trees.blens);
+  if (s->mode == CODES)
+    inflate_codes_free(s->sub.decode.codes, z);
+  s->mode = TYPE;
+  s->bitk = 0;
+  s->bitb = 0;
+  s->read = s->write = s->window;
+  if (s->checkfn != Z_NULL)
+    z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0);
+  Tracev((stderr, "inflate:   blocks reset\n"));
+}
+
+
+local inflate_blocks_statef *inflate_blocks_new( /* z, c, w) */
+z_streamp z,
+check_func c,
+uInt w )
+{
+  inflate_blocks_statef *s;
+
+  if ((s = (inflate_blocks_statef *)ZALLOC
+       (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL)
+    return s;
+  if ((s->hufts =
+       (inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL)
+  {
+    ZFREE(z, s);
+    return Z_NULL;
+  }
+  if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL)
+  {
+    ZFREE(z, s->hufts);
+    ZFREE(z, s);
+    return Z_NULL;
+  }
+  s->end = s->window + w;
+  s->checkfn = c;
+  s->mode = TYPE;
+  Tracev((stderr, "inflate:   blocks allocated\n"));
+  inflate_blocks_reset(s, z, Z_NULL);
+  return s;
+}
+
+
+local int inflate_blocks( /* s, z, r) */
+inflate_blocks_statef *s,
+z_streamp z,
+int r )
+{
+  uInt t;               /* temporary storage */
+  uLong b;              /* bit buffer */
+  uInt k;               /* bits in bit buffer */
+  Bytef *p;             /* input data pointer */
+  uInt n;               /* bytes available there */
+  Bytef *q;             /* output window write pointer */
+  uInt m;               /* bytes to end of window or read pointer */
+
+  /* copy input/output information to locals (UPDATE macro restores) */
+  LOAD
+
+  /* process input based on current state */
+  while (1) switch (s->mode)
+  {
+    case TYPE:
+      NEEDBITS(3)
+      t = (uInt)b & 7;
+      s->last = t & 1;
+      switch (t >> 1)
+      {
+        case 0:                         /* stored */
+          Tracev((stderr, "inflate:     stored block%s\n",
+                 s->last ? " (last)" : ""));
+          DUMPBITS(3)
+          t = k & 7;                    /* go to byte boundary */
+          DUMPBITS(t)
+          s->mode = LENS;               /* get length of stored block */
+          break;
+        case 1:                         /* fixed */
+          Tracev((stderr, "inflate:     fixed codes block%s\n",
+                 s->last ? " (last)" : ""));
+          {
+            uInt bl, bd;
+            inflate_huft *tl, *td;
+
+            inflate_trees_fixed(&bl, &bd, (const inflate_huft**)&tl,
+                                          (const inflate_huft**)&td, z);
+            s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z);
+            if (s->sub.decode.codes == Z_NULL)
+            {
+              r = Z_MEM_ERROR;
+              LEAVE
+            }
+          }
+          DUMPBITS(3)
+          s->mode = CODES;
+          break;
+        case 2:                         /* dynamic */
+          Tracev((stderr, "inflate:     dynamic codes block%s\n",
+                 s->last ? " (last)" : ""));
+          DUMPBITS(3)
+          s->mode = TABLE;
+          break;
+        case 3:                         /* illegal */
+          DUMPBITS(3)
+          s->mode = BAD;
+          z->msg = (char*)"invalid block type";
+          r = Z_DATA_ERROR;
+          LEAVE
+      }
+      break;
+    case LENS:
+      NEEDBITS(32)
+      if ((((~b) >> 16) & 0xffff) != (b & 0xffff))
+      {
+        s->mode = BAD;
+        z->msg = (char*)"invalid stored block lengths";
+        r = Z_DATA_ERROR;
+        LEAVE
+      }
+      s->sub.left = (uInt)b & 0xffff;
+      b = k = 0;                      /* dump bits */
+      Tracev((stderr, "inflate:       stored length %u\n", s->sub.left));
+      s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE);
+      break;
+    case STORED:
+      if (n == 0)
+        LEAVE
+      NEEDOUT
+      t = s->sub.left;
+      if (t > n) t = n;
+      if (t > m) t = m;
+      zmemcpy(q, p, t);
+      p += t;  n -= t;
+      q += t;  m -= t;
+      if ((s->sub.left -= t) != 0)
+        break;
+      Tracev((stderr, "inflate:       stored end, %lu total out\n",
+              z->total_out + (q >= s->read ? q - s->read :
+              (s->end - s->read) + (q - s->window))));
+      s->mode = s->last ? DRY : TYPE;
+      break;
+    case TABLE:
+      NEEDBITS(14)
+      s->sub.trees.table = t = (uInt)b & 0x3fff;
+#ifndef PKZIP_BUG_WORKAROUND
+      if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29)
+      {
+        s->mode = BAD;
+        z->msg = (char*)"too many length or distance symbols";
+        r = Z_DATA_ERROR;
+        LEAVE
+      }
+#endif
+      t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);
+      if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL)
+      {
+        r = Z_MEM_ERROR;
+        LEAVE
+      }
+      DUMPBITS(14)
+      s->sub.trees.index = 0;
+      Tracev((stderr, "inflate:       table sizes ok\n"));
+      s->mode = BTREE;
+    case BTREE:
+      while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10))
+      {
+        NEEDBITS(3)
+        s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7;
+        DUMPBITS(3)
+      }
+      while (s->sub.trees.index < 19)
+        s->sub.trees.blens[border[s->sub.trees.index++]] = 0;
+      s->sub.trees.bb = 7;
+      t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb,
+                             &s->sub.trees.tb, s->hufts, z);
+      if (t != Z_OK)
+      {
+        r = t;
+        if (r == Z_DATA_ERROR)
+        {
+          ZFREE(z, s->sub.trees.blens);
+          s->mode = BAD;
+        }
+        LEAVE
+      }
+      s->sub.trees.index = 0;
+      Tracev((stderr, "inflate:       bits tree ok\n"));
+      s->mode = DTREE;
+    case DTREE:
+      while (t = s->sub.trees.table,
+             s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))
+      {
+        inflate_huft *h;
+        uInt i, j, c;
+
+        t = s->sub.trees.bb;
+        NEEDBITS(t)
+        h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]);
+        t = h->bits;
+        c = h->base;
+        if (c < 16)
+        {
+          DUMPBITS(t)
+          s->sub.trees.blens[s->sub.trees.index++] = c;
+        }
+        else /* c == 16..18 */
+        {
+          i = c == 18 ? 7 : c - 14;
+          j = c == 18 ? 11 : 3;
+          NEEDBITS(t + i)
+          DUMPBITS(t)
+          j += (uInt)b & inflate_mask[i];
+          DUMPBITS(i)
+          i = s->sub.trees.index;
+          t = s->sub.trees.table;
+          if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
+              (c == 16 && i < 1))
+          {
+            ZFREE(z, s->sub.trees.blens);
+            s->mode = BAD;
+            z->msg = (char*)"invalid bit length repeat";
+            r = Z_DATA_ERROR;
+            LEAVE
+          }
+          c = c == 16 ? s->sub.trees.blens[i - 1] : 0;
+          do {
+            s->sub.trees.blens[i++] = c;
+          } while (--j);
+          s->sub.trees.index = i;
+        }
+      }
+      s->sub.trees.tb = Z_NULL;
+      {
+        uInt bl, bd;
+        inflate_huft *tl, *td;
+        inflate_codes_statef *c;
+
+        bl = 9;         /* must be <= 9 for lookahead assumptions */
+        bd = 6;         /* must be <= 9 for lookahead assumptions */
+        t = s->sub.trees.table;
+        t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f),
+                                  s->sub.trees.blens, &bl, &bd, &tl, &td,
+                                  s->hufts, z);
+        if (t != Z_OK)
+        {
+          if (t == (uInt)Z_DATA_ERROR)
+          {
+            ZFREE(z, s->sub.trees.blens);
+            s->mode = BAD;
+          }
+          r = t;
+          LEAVE
+        }
+        Tracev((stderr, "inflate:       trees ok\n"));
+        if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL)
+        {
+          r = Z_MEM_ERROR;
+          LEAVE
+        }
+        s->sub.decode.codes = c;
+      }
+      ZFREE(z, s->sub.trees.blens);
+      s->mode = CODES;
+    case CODES:
+      UPDATE
+      if ((r = inflate_codes(s, z, r)) != Z_STREAM_END)
+        return inflate_flush(s, z, r);
+      r = Z_OK;
+      inflate_codes_free(s->sub.decode.codes, z);
+      LOAD
+      Tracev((stderr, "inflate:       codes end, %lu total out\n",
+              z->total_out + (q >= s->read ? q - s->read :
+              (s->end - s->read) + (q - s->window))));
+      if (!s->last)
+      {
+        s->mode = TYPE;
+        break;
+      }
+      s->mode = DRY;
+    case DRY:
+      FLUSH
+      if (s->read != s->write)
+        LEAVE
+      s->mode = DONE;
+    case DONE:
+      r = Z_STREAM_END;
+      LEAVE
+    case BAD:
+      r = Z_DATA_ERROR;
+      LEAVE
+    default:
+      r = Z_STREAM_ERROR;
+      LEAVE
+  }
+#ifdef NEED_DUMMY_RETURN
+  return 0;
+#endif
+}
+
+
+local int inflate_blocks_free( /* s, z) */
+inflate_blocks_statef *s,
+z_streamp z )
+{
+  inflate_blocks_reset(s, z, Z_NULL);
+  ZFREE(z, s->window);
+  ZFREE(z, s->hufts);
+  ZFREE(z, s);
+  Tracev((stderr, "inflate:   blocks freed\n"));
+  return Z_OK;
+}
+
+
diff --git a/src/gzip/infblock.h b/src/gzip/infblock.h
new file mode 100644 (file)
index 0000000..c2535a1
--- /dev/null
@@ -0,0 +1,36 @@
+/* infblock.h -- header to use infblock.c
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+#ifndef _INFBLOCK_H
+#define _INFBLOCK_H
+
+struct inflate_blocks_state;
+typedef struct inflate_blocks_state FAR inflate_blocks_statef;
+
+local  inflate_blocks_statef * inflate_blocks_new OF((
+    z_streamp z,
+    check_func c,               /* check function */
+    uInt w));                   /* window size */
+
+local  int inflate_blocks OF((
+    inflate_blocks_statef *,
+    z_streamp ,
+    int));                      /* initial return code */
+
+local  void inflate_blocks_reset OF((
+    inflate_blocks_statef *,
+    z_streamp ,
+    uLongf *));                  /* check value on output */
+
+local  int inflate_blocks_free OF((
+    inflate_blocks_statef *,
+    z_streamp));
+
+#endif /* _INFBLOCK_H */
diff --git a/src/gzip/infcodes.c b/src/gzip/infcodes.c
new file mode 100644 (file)
index 0000000..f7bfd58
--- /dev/null
@@ -0,0 +1,250 @@
+/* infcodes.c -- process literals and length/distance pairs
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+#include "infblock.h"
+#include "infcodes.h"
+#include "infutil.h"
+
+/* simplify the use of the inflate_huft type with some defines */
+#define exop word.what.Exop
+#define bits word.what.Bits
+
+typedef enum {        /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
+      START,    /* x: set up for LEN */
+      LEN,      /* i: get length/literal/eob next */
+      LENEXT,   /* i: getting length extra (have base) */
+      DIST,     /* i: get distance next */
+      DISTEXT,  /* i: getting distance extra */
+      COPY,     /* o: copying bytes in window, waiting for space */
+      LIT,      /* o: got literal, waiting for output space */
+      WASH,     /* o: got eob, possibly still output waiting */
+      END,      /* x: got eob and all data flushed */
+      BADCODE}  /* x: got error */
+inflate_codes_mode;
+
+/* inflate codes private state */
+struct inflate_codes_state {
+
+  /* mode */
+  inflate_codes_mode mode;      /* current inflate_codes mode */
+
+  /* mode dependent information */
+  uInt len;
+  union {
+    struct {
+      inflate_huft *tree;       /* pointer into tree */
+      uInt need;                /* bits needed */
+    } code;             /* if LEN or DIST, where in tree */
+    uInt lit;           /* if LIT, literal */
+    struct {
+      uInt get;                 /* bits to get for extra */
+      uInt dist;                /* distance back to copy from */
+    } copy;             /* if EXT or COPY, where and how much */
+  } sub;                /* submode */
+
+  /* mode independent information */
+  Byte lbits;           /* ltree bits decoded per branch */
+  Byte dbits;           /* dtree bits decoder per branch */
+  inflate_huft *ltree;          /* literal/length/eob tree */
+  inflate_huft *dtree;          /* distance tree */
+
+};
+
+
+local inflate_codes_statef *inflate_codes_new( /* bl, bd, tl, td, z) */
+uInt bl, uInt bd,
+inflate_huft *tl,
+inflate_huft *td, /* need separate declaration for Borland C++ */
+z_streamp z )
+{
+  inflate_codes_statef *c;
+
+  if ((c = (inflate_codes_statef *)
+       ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL)
+  {
+    c->mode = START;
+    c->lbits = (Byte)bl;
+    c->dbits = (Byte)bd;
+    c->ltree = tl;
+    c->dtree = td;
+    Tracev((stderr, "inflate:       codes new\n"));
+  }
+  return c;
+}
+
+
+local int inflate_codes( /* s, z, r) */
+inflate_blocks_statef *s,
+z_streamp z,
+int r )
+{
+  uInt j;               /* temporary storage */
+  inflate_huft *t;      /* temporary pointer */
+  uInt e;               /* extra bits or operation */
+  uLong b;              /* bit buffer */
+  uInt k;               /* bits in bit buffer */
+  Bytef *p;             /* input data pointer */
+  uInt n;               /* bytes available there */
+  Bytef *q;             /* output window write pointer */
+  uInt m;               /* bytes to end of window or read pointer */
+  Bytef *f;             /* pointer to copy strings from */
+  inflate_codes_statef *c = s->sub.decode.codes;  /* codes state */
+
+  /* copy input/output information to locals (UPDATE macro restores) */
+  LOAD
+
+  /* process input and output based on current state */
+  while (1) switch (c->mode)
+  {             /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
+    case START:         /* x: set up for LEN */
+#ifndef SLOW
+      if (m >= 258 && n >= 10)
+      {
+        UPDATE
+        r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z);
+        LOAD
+        if (r != Z_OK)
+        {
+          c->mode = r == Z_STREAM_END ? WASH : BADCODE;
+          break;
+        }
+      }
+#endif /* !SLOW */
+      c->sub.code.need = c->lbits;
+      c->sub.code.tree = c->ltree;
+      c->mode = LEN;
+    case LEN:           /* i: get length/literal/eob next */
+      j = c->sub.code.need;
+      NEEDBITS(j)
+      t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
+      DUMPBITS(t->bits)
+      e = (uInt)(t->exop);
+      if (e == 0)               /* literal */
+      {
+        c->sub.lit = t->base;
+        Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
+                 "inflate:         literal '%c'\n" :
+                 "inflate:         literal 0x%02x\n", t->base));
+        c->mode = LIT;
+        break;
+      }
+      if (e & 16)               /* length */
+      {
+        c->sub.copy.get = e & 15;
+        c->len = t->base;
+        c->mode = LENEXT;
+        break;
+      }
+      if ((e & 64) == 0)        /* next table */
+      {
+        c->sub.code.need = e;
+        c->sub.code.tree = t + t->base;
+        break;
+      }
+      if (e & 32)               /* end of block */
+      {
+        Tracevv((stderr, "inflate:         end of block\n"));
+        c->mode = WASH;
+        break;
+      }
+      c->mode = BADCODE;        /* invalid code */
+      z->msg = (char*)"invalid literal/length code";
+      r = Z_DATA_ERROR;
+      LEAVE
+    case LENEXT:        /* i: getting length extra (have base) */
+      j = c->sub.copy.get;
+      NEEDBITS(j)
+      c->len += (uInt)b & inflate_mask[j];
+      DUMPBITS(j)
+      c->sub.code.need = c->dbits;
+      c->sub.code.tree = c->dtree;
+      Tracevv((stderr, "inflate:         length %u\n", c->len));
+      c->mode = DIST;
+    case DIST:          /* i: get distance next */
+      j = c->sub.code.need;
+      NEEDBITS(j)
+      t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
+      DUMPBITS(t->bits)
+      e = (uInt)(t->exop);
+      if (e & 16)               /* distance */
+      {
+        c->sub.copy.get = e & 15;
+        c->sub.copy.dist = t->base;
+        c->mode = DISTEXT;
+        break;
+      }
+      if ((e & 64) == 0)        /* next table */
+      {
+        c->sub.code.need = e;
+        c->sub.code.tree = t + t->base;
+        break;
+      }
+      c->mode = BADCODE;        /* invalid code */
+      z->msg = (char*)"invalid distance code";
+      r = Z_DATA_ERROR;
+      LEAVE
+    case DISTEXT:       /* i: getting distance extra */
+      j = c->sub.copy.get;
+      NEEDBITS(j)
+      c->sub.copy.dist += (uInt)b & inflate_mask[j];
+      DUMPBITS(j)
+      Tracevv((stderr, "inflate:         distance %u\n", c->sub.copy.dist));
+      c->mode = COPY;
+    case COPY:          /* o: copying bytes in window, waiting for space */
+      f = q - c->sub.copy.dist;
+      while (f < s->window)             /* modulo window size-"while" instead */
+        f += s->end - s->window;        /* of "if" handles invalid distances */
+      while (c->len)
+      {
+        NEEDOUT
+        OUTBYTE(*f++)
+        if (f == s->end)
+          f = s->window;
+        c->len--;
+      }
+      c->mode = START;
+      break;
+    case LIT:           /* o: got literal, waiting for output space */
+      NEEDOUT
+      OUTBYTE(c->sub.lit)
+      c->mode = START;
+      break;
+    case WASH:          /* o: got eob, possibly more output */
+      if (k > 7)        /* return unused byte, if any */
+      {
+        Assert(k < 16, "inflate_codes grabbed too many bytes")
+        k -= 8;
+        n++;
+        p--;            /* can always return one */
+      }
+      FLUSH
+      if (s->read != s->write)
+        LEAVE
+      c->mode = END;
+    case END:
+      r = Z_STREAM_END;
+      LEAVE
+    case BADCODE:       /* x: got error */
+      r = Z_DATA_ERROR;
+      LEAVE
+    default:
+      r = Z_STREAM_ERROR;
+      LEAVE
+  }
+#ifdef NEED_DUMMY_RETURN
+  return Z_STREAM_ERROR;  /* Some dumb compilers complain without this */
+#endif
+}
+
+
+local void inflate_codes_free( /* c, z) */
+inflate_codes_statef *c,
+z_streamp z )
+{
+  ZFREE(z, c);
+  Tracev((stderr, "inflate:       codes free\n"));
+}
diff --git a/src/gzip/infcodes.h b/src/gzip/infcodes.h
new file mode 100644 (file)
index 0000000..154d7f8
--- /dev/null
@@ -0,0 +1,31 @@
+/* infcodes.h -- header to use infcodes.c
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+#ifndef _INFCODES_H
+#define _INFCODES_H
+
+struct inflate_codes_state;
+typedef struct inflate_codes_state FAR inflate_codes_statef;
+
+local inflate_codes_statef *inflate_codes_new OF((
+    uInt, uInt,
+    inflate_huft *, inflate_huft *,
+    z_streamp ));
+
+local int inflate_codes OF((
+    inflate_blocks_statef *,
+    z_streamp ,
+    int));
+
+local void inflate_codes_free OF((
+    inflate_codes_statef *,
+    z_streamp ));
+
+#endif /* _INFCODES_H */
diff --git a/src/gzip/inffixed.h b/src/gzip/inffixed.h
new file mode 100644 (file)
index 0000000..4d4760e
--- /dev/null
@@ -0,0 +1,151 @@
+/* inffixed.h -- table for decoding fixed codes
+ * Generated automatically by the maketree.c program
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+local const uInt fixed_bl = 9;
+local const uInt fixed_bd = 5;
+local const inflate_huft fixed_tl[] = {
+    {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115},
+    {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},192},
+    {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},160},
+    {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},224},
+    {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},144},
+    {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},208},
+    {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},176},
+    {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},240},
+    {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227},
+    {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},200},
+    {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},168},
+    {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},232},
+    {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},152},
+    {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},216},
+    {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},184},
+    {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},248},
+    {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163},
+    {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},196},
+    {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},164},
+    {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},228},
+    {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},148},
+    {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},212},
+    {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},180},
+    {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},244},
+    {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0},
+    {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},204},
+    {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},172},
+    {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},236},
+    {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},156},
+    {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},220},
+    {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},188},
+    {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},252},
+    {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131},
+    {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},194},
+    {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},162},
+    {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},226},
+    {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},146},
+    {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},210},
+    {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},178},
+    {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},242},
+    {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258},
+    {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},202},
+    {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},170},
+    {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},234},
+    {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},154},
+    {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},218},
+    {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},186},
+    {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},250},
+    {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195},
+    {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},198},
+    {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},166},
+    {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},230},
+    {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},150},
+    {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},214},
+    {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},182},
+    {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},246},
+    {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0},
+    {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},206},
+    {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},174},
+    {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},238},
+    {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},158},
+    {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},222},
+    {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},190},
+    {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},254},
+    {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115},
+    {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},193},
+    {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},161},
+    {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},225},
+    {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},145},
+    {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},209},
+    {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},177},
+    {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},241},
+    {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227},
+    {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},201},
+    {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},169},
+    {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},233},
+    {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},153},
+    {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},217},
+    {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},185},
+    {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},249},
+    {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163},
+    {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},197},
+    {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},165},
+    {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},229},
+    {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},149},
+    {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},213},
+    {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},181},
+    {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},245},
+    {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0},
+    {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},205},
+    {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},173},
+    {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},237},
+    {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},157},
+    {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},221},
+    {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},189},
+    {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},253},
+    {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131},
+    {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},195},
+    {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},163},
+    {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},227},
+    {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},147},
+    {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},211},
+    {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},179},
+    {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},243},
+    {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258},
+    {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},203},
+    {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},171},
+    {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},235},
+    {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},155},
+    {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},219},
+    {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},187},
+    {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},251},
+    {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195},
+    {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},199},
+    {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},167},
+    {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},231},
+    {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},151},
+    {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},215},
+    {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},183},
+    {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},247},
+    {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0},
+    {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},207},
+    {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},175},
+    {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},239},
+    {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},159},
+    {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},223},
+    {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},191},
+    {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},255}
+  };
+local const inflate_huft fixed_td[] = {
+    {{{80,5}},1}, {{{87,5}},257}, {{{83,5}},17}, {{{91,5}},4097},
+    {{{81,5}},5}, {{{89,5}},1025}, {{{85,5}},65}, {{{93,5}},16385},
+    {{{80,5}},3}, {{{88,5}},513}, {{{84,5}},33}, {{{92,5}},8193},
+    {{{82,5}},9}, {{{90,5}},2049}, {{{86,5}},129}, {{{192,5}},24577},
+    {{{80,5}},2}, {{{87,5}},385}, {{{83,5}},25}, {{{91,5}},6145},
+    {{{81,5}},7}, {{{89,5}},1537}, {{{85,5}},97}, {{{93,5}},24577},
+    {{{80,5}},4}, {{{88,5}},769}, {{{84,5}},49}, {{{92,5}},12289},
+    {{{82,5}},13}, {{{90,5}},3073}, {{{86,5}},193}, {{{192,5}},24577}
+  };
diff --git a/src/gzip/inflate.c b/src/gzip/inflate.c
new file mode 100644 (file)
index 0000000..8877fa3
--- /dev/null
@@ -0,0 +1,273 @@
+/* inflate.c -- zlib interface to inflate modules
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "infblock.h"
+
+#define  DONE  INFLATE_DONE
+#define  BAD   INFLATE_BAD
+
+typedef enum {
+      METHOD,   /* waiting for method byte */
+      FLAG,     /* waiting for flag byte */
+      DICT4,    /* four dictionary check bytes to go */
+      DICT3,    /* three dictionary check bytes to go */
+      DICT2,    /* two dictionary check bytes to go */
+      DICT1,    /* one dictionary check byte to go */
+      DICT0,    /* waiting for inflateSetDictionary */
+      BLOCKS,   /* decompressing blocks */
+      CHECK4,   /* four check bytes to go */
+      CHECK3,   /* three check bytes to go */
+      CHECK2,   /* two check bytes to go */
+      CHECK1,   /* one check byte to go */
+      DONE,     /* finished check, done */
+      BAD}      /* got an error--stay here */
+inflate_mode;
+
+/* inflate private state */
+struct internal_state {
+
+  /* mode */
+  inflate_mode  mode;   /* current inflate mode */
+
+  /* mode dependent information */
+  union {
+    uInt method;        /* if FLAGS, method byte */
+    struct {
+      uLong was;                /* computed check value */
+      uLong need;               /* stream check value */
+    } check;            /* if CHECK, check values to compare */
+    uInt marker;        /* if BAD, inflateSync's marker bytes count */
+  } sub;        /* submode */
+
+  /* mode independent information */
+  int  nowrap;          /* flag for no wrapper */
+  uInt wbits;           /* log2(window size)  (8..15, defaults to 15) */
+  inflate_blocks_statef
+    *blocks;            /* current inflate_blocks state */
+
+};
+
+
+ZEXPORT(int) inflateReset( /* z) */
+z_streamp z )
+{
+  if (z == Z_NULL || z->state == Z_NULL)
+    return Z_STREAM_ERROR;
+  z->total_in = z->total_out = 0;
+  z->msg = Z_NULL;
+  z->state->mode = z->state->nowrap ? BLOCKS : METHOD;
+  inflate_blocks_reset(z->state->blocks, z, Z_NULL);
+  Tracev((stderr, "inflate: reset\n"));
+  return Z_OK;
+}
+
+
+ZEXPORT(int) inflateEnd( /* z) */
+z_streamp z )
+{
+  if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL)
+    return Z_STREAM_ERROR;
+  if (z->state->blocks != Z_NULL)
+    inflate_blocks_free(z->state->blocks, z);
+  ZFREE(z, z->state);
+  z->state = Z_NULL;
+  Tracev((stderr, "inflate: end\n"));
+  return Z_OK;
+}
+
+
+ZEXPORT(int) inflateInit2_( /* z, w, version, stream_size) */
+z_streamp z,
+int w,
+const char *version,
+int stream_size )
+{
+  if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
+      stream_size != sizeof(z_stream))
+      return Z_VERSION_ERROR;
+
+  /* initialize state */
+  if (z == Z_NULL)
+    return Z_STREAM_ERROR;
+  z->msg = Z_NULL;
+  if (z->zalloc == Z_NULL)
+  {
+    z->zalloc = zcalloc;
+    z->opaque = (voidpf)0;
+  }
+  if (z->zfree == Z_NULL) z->zfree = zcfree;
+  if ((z->state = (struct internal_state FAR *)
+       ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL)
+    return Z_MEM_ERROR;
+  z->state->blocks = Z_NULL;
+
+  /* handle undocumented nowrap option (no zlib header or check) */
+  z->state->nowrap = 0;
+  if (w < 0)
+  {
+    w = - w;
+    z->state->nowrap = 1;
+  }
+
+  /* set window size */
+  if (w < 8 || w > 15)
+  {
+    inflateEnd(z);
+    return Z_STREAM_ERROR;
+  }
+  z->state->wbits = (uInt)w;
+
+  /* create inflate_blocks state */
+  if ((z->state->blocks =
+      inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w))
+      == Z_NULL)
+  {
+    inflateEnd(z);
+    return Z_MEM_ERROR;
+  }
+  Tracev((stderr, "inflate: allocated\n"));
+
+  /* reset state */
+  inflateReset(z);
+  return Z_OK;
+}
+
+
+
+#undef  NEEDBYTE
+#define NEEDBYTE {if(z->avail_in==0)return r;r=f;}
+
+#undef  NEXTBYTE
+#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++)
+
+
+ZEXPORT(int) inflate( /* z, f) */
+z_streamp z,
+int f )
+{
+  int r;
+  uInt b;
+
+  if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL)
+    return Z_STREAM_ERROR;
+  f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK;
+  r = Z_BUF_ERROR;
+  while (1) switch (z->state->mode)
+  {
+    case METHOD:
+      NEEDBYTE
+      if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED)
+      {
+        z->state->mode = BAD;
+        z->msg = (char*)"unknown compression method";
+        z->state->sub.marker = 5;       /* can't try inflateSync */
+        break;
+      }
+      if ((z->state->sub.method >> 4) + 8 > z->state->wbits)
+      {
+        z->state->mode = BAD;
+        z->msg = (char*)"invalid window size";
+        z->state->sub.marker = 5;       /* can't try inflateSync */
+        break;
+      }
+      z->state->mode = FLAG;
+    case FLAG:
+      NEEDBYTE
+      b = NEXTBYTE;
+      if (((z->state->sub.method << 8) + b) % 31)
+      {
+        z->state->mode = BAD;
+        z->msg = (char*)"incorrect header check";
+        z->state->sub.marker = 5;       /* can't try inflateSync */
+        break;
+      }
+      Tracev((stderr, "inflate: zlib header ok\n"));
+      if (!(b & PRESET_DICT))
+      {
+        z->state->mode = BLOCKS;
+        break;
+      }
+      z->state->mode = DICT4;
+    case DICT4:
+      NEEDBYTE
+      z->state->sub.check.need = (uLong)NEXTBYTE << 24;
+      z->state->mode = DICT3;
+    case DICT3:
+      NEEDBYTE
+      z->state->sub.check.need += (uLong)NEXTBYTE << 16;
+      z->state->mode = DICT2;
+    case DICT2:
+      NEEDBYTE
+      z->state->sub.check.need += (uLong)NEXTBYTE << 8;
+      z->state->mode = DICT1;
+    case DICT1:
+      NEEDBYTE
+      z->state->sub.check.need += (uLong)NEXTBYTE;
+      z->adler = z->state->sub.check.need;
+      z->state->mode = DICT0;
+      return Z_NEED_DICT;
+    case DICT0:
+      z->state->mode = BAD;
+      z->msg = (char*)"need dictionary";
+      z->state->sub.marker = 0;       /* can try inflateSync */
+      return Z_STREAM_ERROR;
+    case BLOCKS:
+      r = inflate_blocks(z->state->blocks, z, r);
+      if (r == Z_DATA_ERROR)
+      {
+        z->state->mode = BAD;
+        z->state->sub.marker = 0;       /* can try inflateSync */
+        break;
+      }
+      if (r == Z_OK)
+        r = f;
+      if (r != Z_STREAM_END)
+        return r;
+      r = f;
+      inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was);
+      if (z->state->nowrap)
+      {
+        z->state->mode = DONE;
+        break;
+      }
+      z->state->mode = CHECK4;
+    case CHECK4:
+      NEEDBYTE
+      z->state->sub.check.need = (uLong)NEXTBYTE << 24;
+      z->state->mode = CHECK3;
+    case CHECK3:
+      NEEDBYTE
+      z->state->sub.check.need += (uLong)NEXTBYTE << 16;
+      z->state->mode = CHECK2;
+    case CHECK2:
+      NEEDBYTE
+      z->state->sub.check.need += (uLong)NEXTBYTE << 8;
+      z->state->mode = CHECK1;
+    case CHECK1:
+      NEEDBYTE
+      z->state->sub.check.need += (uLong)NEXTBYTE;
+
+      if (z->state->sub.check.was != z->state->sub.check.need)
+      {
+        z->state->mode = BAD;
+        z->msg = (char*)"incorrect data check";
+        z->state->sub.marker = 5;       /* can't try inflateSync */
+        break;
+      }
+      Tracev((stderr, "inflate: zlib check ok\n"));
+      z->state->mode = DONE;
+    case DONE:
+      return Z_STREAM_END;
+    case BAD:
+      return Z_DATA_ERROR;
+    default:
+      return Z_STREAM_ERROR;
+  }
+#ifdef NEED_DUMMY_RETURN
+  return Z_STREAM_ERROR;  /* Some dumb compilers complain without this */
+#endif
+}
+
diff --git a/src/gzip/inftrees.c b/src/gzip/inftrees.c
new file mode 100644 (file)
index 0000000..ef53652
--- /dev/null
@@ -0,0 +1,468 @@
+/* inftrees.c -- generate Huffman trees for efficient decoding
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+
+#if !defined(BUILDFIXED) && !defined(STDC)
+#  define BUILDFIXED   /* non ANSI compilers may not accept inffixed.h */
+#endif
+
+
+#if 0
+local const char inflate_copyright[] =
+   " inflate 1.1.4 Copyright 1995-2002 Mark Adler ";
+#endif
+/*
+  If you use the zlib library in a product, an acknowledgment is welcome
+  in the documentation of your product. If for some reason you cannot
+  include such an acknowledgment, I would appreciate that you keep this
+  copyright string in the executable of your product.
+ */
+
+/* simplify the use of the inflate_huft type with some defines */
+#define exop word.what.Exop
+#define bits word.what.Bits
+
+
+local int huft_build OF((
+    uIntf *,            /* code lengths in bits */
+    uInt,               /* number of codes */
+    uInt,               /* number of "simple" codes */
+    const uIntf *,      /* list of base values for non-simple codes */
+    const uIntf *,      /* list of extra bits for non-simple codes */
+    inflate_huft * FAR*,/* result: starting table */
+    uIntf *,            /* maximum lookup bits (returns actual) */
+    inflate_huft *,     /* space for trees */
+    uInt *,             /* hufts used in space */
+    uIntf * ));         /* space for values */
+
+/* Tables for deflate from PKZIP's appnote.txt. */
+local const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */
+        3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
+        35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
+        /* see note #13 above about 258 */
+local const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */
+        0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
+        3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */
+local const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */
+        1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
+        257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
+        8193, 12289, 16385, 24577};
+local const uInt cpdext[30] = { /* Extra bits for distance codes */
+        0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
+        7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
+        12, 12, 13, 13};
+
+/*
+   Huffman code decoding is performed using a multi-level table lookup.
+   The fastest way to decode is to simply build a lookup table whose
+   size is determined by the longest code.  However, the time it takes
+   to build this table can also be a factor if the data being decoded
+   is not very long.  The most common codes are necessarily the
+   shortest codes, so those codes dominate the decoding time, and hence
+   the speed.  The idea is you can have a shorter table that decodes the
+   shorter, more probable codes, and then point to subsidiary tables for
+   the longer codes.  The time it costs to decode the longer codes is
+   then traded against the time it takes to make longer tables.
+
+   This results of this trade are in the variables lbits and dbits
+   below.  lbits is the number of bits the first level table for literal/
+   length codes can decode in one step, and dbits is the same thing for
+   the distance codes.  Subsequent tables are also less than or equal to
+   those sizes.  These values may be adjusted either when all of the
+   codes are shorter than that, in which case the longest code length in
+   bits is used, or when the shortest code is *longer* than the requested
+   table size, in which case the length of the shortest code in bits is
+   used.
+
+   There are two different values for the two tables, since they code a
+   different number of possibilities each.  The literal/length table
+   codes 286 possible values, or in a flat code, a little over eight
+   bits.  The distance table codes 30 possible values, or a little less
+   than five bits, flat.  The optimum values for speed end up being
+   about one bit more than those, so lbits is 8+1 and dbits is 5+1.
+   The optimum values may differ though from machine to machine, and
+   possibly even between compilers.  Your mileage may vary.
+ */
+
+
+/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */
+#define BMAX 15         /* maximum bit length of any code */
+
+local int huft_build( /* b, n, s, d, e, t, m, hp, hn, v) */
+uIntf *b,               /* code lengths in bits (all assumed <= BMAX) */
+uInt n,                 /* number of codes (assumed <= 288) */
+uInt s,                 /* number of simple-valued codes (0..s-1) */
+const uIntf *d,         /* list of base values for non-simple codes */
+const uIntf *e,         /* list of extra bits for non-simple codes */
+inflate_huft * FAR *t,  /* result: starting table */
+uIntf *m,               /* maximum lookup bits, returns actual */
+inflate_huft *hp,       /* space for trees */
+uInt *hn,               /* hufts used in space */
+uIntf *v                /* working area: values in order of bit length */
+/* Given a list of code lengths and a maximum table size, make a set of
+   tables to decode that set of codes.  Return Z_OK on success, Z_BUF_ERROR
+   if the given code set is incomplete (the tables are still built in this
+   case), or Z_DATA_ERROR if the input is invalid. */
+)
+{
+
+  uInt a;                       /* counter for codes of length k */
+  uInt c[BMAX+1];               /* bit length count table */
+  uInt f;                       /* i repeats in table every f entries */
+  int g;                        /* maximum code length */
+  int h;                        /* table level */
+  register uInt i;              /* counter, current code */
+  register uInt j;              /* counter */
+  register int k;               /* number of bits in current code */
+  int l;                        /* bits per table (returned in m) */
+  uInt mask;                    /* (1 << w) - 1, to avoid cc -O bug on HP */
+  register uIntf *p;            /* pointer into c[], b[], or v[] */
+  inflate_huft *q;              /* points to current table */
+  struct inflate_huft_s r;      /* table entry for structure assignment */
+  inflate_huft *u[BMAX];        /* table stack */
+  register int w;               /* bits before this table == (l * h) */
+  uInt x[BMAX+1];               /* bit offsets, then code stack */
+  uIntf *xp;                    /* pointer into x */
+  int y;                        /* number of dummy codes added */
+  uInt z;                       /* number of entries in current table */
+
+
+  /* Make compiler happy */
+  r.base = 0;
+
+  /* Generate counts for each bit length */
+  p = c;
+#define C0 *p++ = 0;
+#define C2 C0 C0 C0 C0
+#define C4 C2 C2 C2 C2
+  C4                            /* clear c[]--assume BMAX+1 is 16 */
+  p = b;  i = n;
+  do {
+    c[*p++]++;                  /* assume all entries <= BMAX */
+  } while (--i);
+  if (c[0] == n)                /* null input--all zero length codes */
+  {
+    *t = (inflate_huft *)Z_NULL;
+    *m = 0;
+    return Z_OK;
+  }
+
+
+  /* Find minimum and maximum length, bound *m by those */
+  l = *m;
+  for (j = 1; j <= BMAX; j++)
+    if (c[j])
+      break;
+  k = j;                        /* minimum code length */
+  if ((uInt)l < j)
+    l = j;
+  for (i = BMAX; i; i--)
+    if (c[i])
+      break;
+  g = i;                        /* maximum code length */
+  if ((uInt)l > i)
+    l = i;
+  *m = l;
+
+
+  /* Adjust last length count to fill out codes, if needed */
+  for (y = 1 << j; j < i; j++, y <<= 1)
+    if ((y -= c[j]) < 0)
+      return Z_DATA_ERROR;
+  if ((y -= c[i]) < 0)
+    return Z_DATA_ERROR;
+  c[i] += y;
+
+
+  /* Generate starting offsets into the value table for each length */
+  x[1] = j = 0;
+  p = c + 1;  xp = x + 2;
+  while (--i) {                 /* note that i == g from above */
+    *xp++ = (j += *p++);
+  }
+
+
+  /* Make a table of values in order of bit lengths */
+  p = b;  i = 0;
+  do {
+    if ((j = *p++) != 0)
+      v[x[j]++] = i;
+  } while (++i < n);
+  n = x[g];                     /* set n to length of v */
+
+
+  /* Generate the Huffman codes and for each, make the table entries */
+  x[0] = i = 0;                 /* first Huffman code is zero */
+  p = v;                        /* grab values in bit order */
+  h = -1;                       /* no tables yet--level -1 */
+  w = -l;                       /* bits decoded == (l * h) */
+  u[0] = (inflate_huft *)Z_NULL;        /* just to keep compilers happy */
+  q = (inflate_huft *)Z_NULL;   /* ditto */
+  z = 0;                        /* ditto */
+
+  /* go through the bit lengths (k already is bits in shortest code) */
+  for (; k <= g; k++)
+  {
+    a = c[k];
+    while (a--)
+    {
+      /* here i is the Huffman code of length k bits for value *p */
+      /* make tables up to required level */
+      while (k > w + l)
+      {
+        h++;
+        w += l;                 /* previous table always l bits */
+
+        /* compute minimum size table less than or equal to l bits */
+        z = g - w;
+        z = z > (uInt)l ? (uInt)l : z;        /* table size upper limit */
+        if ((f = 1 << (j = k - w)) > a + 1)     /* try a k-w bit table */
+        {                       /* too few codes for k-w bit table */
+          f -= a + 1;           /* deduct codes from patterns left */
+          xp = c + k;
+          if (j < z)
+            while (++j < z)     /* try smaller tables up to z bits */
+            {
+              if ((f <<= 1) <= *++xp)
+                break;          /* enough codes to use up j bits */
+              f -= *xp;         /* else deduct codes from patterns */
+            }
+        }
+        z = 1 << j;             /* table entries for j-bit table */
+
+        /* allocate new table */
+        if (*hn + z > MANY)     /* (note: doesn't matter for fixed) */
+          return Z_DATA_ERROR;  /* overflow of MANY */
+        u[h] = q = hp + *hn;
+        *hn += z;
+
+        /* connect to last table, if there is one */
+        if (h)
+        {
+          x[h] = i;             /* save pattern for backing up */
+          r.bits = (Byte)l;     /* bits to dump before this table */
+          r.exop = (Byte)j;     /* bits in this table */
+          j = i >> (w - l);
+          r.base = (uInt)(q - u[h-1] - j);   /* offset to this table */
+          u[h-1][j] = r;        /* connect to last table */
+        }
+        else
+          *t = q;               /* first table is returned result */
+      }
+
+      /* set up table entry in r */
+      r.bits = (Byte)(k - w);
+      if (p >= v + n)
+        r.exop = 128 + 64;      /* out of values--invalid code */
+      else if (*p < s)
+      {
+        r.exop = (Byte)(*p < 256 ? 0 : 32 + 64);     /* 256 is end-of-block */
+        r.base = *p++;          /* simple code is just the value */
+      }
+      else
+      {
+        r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */
+        r.base = d[*p++ - s];
+      }
+
+      /* fill code-like entries with r */
+      f = 1 << (k - w);
+      for (j = i >> w; j < z; j += f)
+        q[j] = r;
+
+      /* backwards increment the k-bit code i */
+      for (j = 1 << (k - 1); i & j; j >>= 1)
+        i ^= j;
+      i ^= j;
+
+      /* backup over finished tables */
+      mask = (1 << w) - 1;      /* needed on HP, cc -O bug */
+      while ((i & mask) != x[h])
+      {
+        h--;                    /* don't need to update q */
+        w -= l;
+        mask = (1 << w) - 1;
+      }
+    }
+  }
+
+
+  /* Return Z_BUF_ERROR if we were given an incomplete table */
+  return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK;
+}
+
+
+local int inflate_trees_bits( /* c, bb, tb, hp, z) */
+uIntf *c,               /* 19 code lengths */
+uIntf *bb,              /* bits tree desired/actual depth */
+inflate_huft * FAR *tb, /* bits tree result */
+inflate_huft *hp,       /* space for trees */
+z_streamp z             /* for messages */
+)
+{
+  int r;
+  uInt hn = 0;          /* hufts used in space */
+  uIntf *v;             /* work area for huft_build */
+
+  if ((v = (uIntf*)ZALLOC(z, 19, sizeof(uInt))) == Z_NULL)
+    return Z_MEM_ERROR;
+  r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL,
+                 tb, bb, hp, &hn, v);
+  if (r == Z_DATA_ERROR)
+    z->msg = (char*)"oversubscribed dynamic bit lengths tree";
+  else if (r == Z_BUF_ERROR || *bb == 0)
+  {
+    z->msg = (char*)"incomplete dynamic bit lengths tree";
+    r = Z_DATA_ERROR;
+  }
+  ZFREE(z, v);
+  return r;
+}
+
+
+local int inflate_trees_dynamic( /* nl, nd, c, bl, bd, tl, td, hp, z) */
+uInt nl,                /* number of literal/length codes */
+uInt nd,                /* number of distance codes */
+uIntf *c,               /* that many (total) code lengths */
+uIntf *bl,              /* literal desired/actual bit depth */
+uIntf *bd,              /* distance desired/actual bit depth */
+inflate_huft * FAR *tl, /* literal/length tree result */
+inflate_huft * FAR *td, /* distance tree result */
+inflate_huft *hp,       /* space for trees */
+z_streamp z             /* for messages */
+)
+{
+  int r;
+  uInt hn = 0;          /* hufts used in space */
+  uIntf *v;             /* work area for huft_build */
+
+  /* allocate work area */
+  if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
+    return Z_MEM_ERROR;
+
+  /* build literal/length tree */
+  r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v);
+  if (r != Z_OK || *bl == 0)
+  {
+    if (r == Z_DATA_ERROR)
+      z->msg = (char*)"oversubscribed literal/length tree";
+    else if (r != Z_MEM_ERROR)
+    {
+      z->msg = (char*)"incomplete literal/length tree";
+      r = Z_DATA_ERROR;
+    }
+    ZFREE(z, v);
+    return r;
+  }
+
+  /* build distance tree */
+  r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v);
+  if (r != Z_OK || (*bd == 0 && nl > 257))
+  {
+    if (r == Z_DATA_ERROR)
+      z->msg = (char*)"oversubscribed distance tree";
+    else if (r == Z_BUF_ERROR) {
+#if 0
+    {
+#endif
+#ifdef PKZIP_BUG_WORKAROUND
+      r = Z_OK;
+    }
+#else
+      z->msg = (char*)"incomplete distance tree";
+      r = Z_DATA_ERROR;
+    }
+    else if (r != Z_MEM_ERROR)
+    {
+      z->msg = (char*)"empty distance tree with lengths";
+      r = Z_DATA_ERROR;
+    }
+    ZFREE(z, v);
+    return r;
+#endif
+  }
+
+  /* done */
+  ZFREE(z, v);
+  return Z_OK;
+}
+
+
+/* build fixed tables only once--keep them here */
+#ifdef BUILDFIXED
+local int fixed_built = 0;
+#define FIXEDH 544      /* number of hufts used by fixed tables */
+local inflate_huft fixed_mem[FIXEDH];
+local uInt fixed_bl;
+local uInt fixed_bd;
+local inflate_huft *fixed_tl;
+local inflate_huft *fixed_td;
+#else
+#include "inffixed.h"
+#endif
+
+
+local int inflate_trees_fixed( /* bl, bd, tl, td, z) */
+uIntf *bl,                      /* literal desired/actual bit depth */
+uIntf *bd,                      /* distance desired/actual bit depth */
+const inflate_huft * FAR *tl,   /* literal/length tree result */
+const inflate_huft * FAR *td,   /* distance tree result */
+z_streamp z                     /* for memory allocation */
+)
+{
+#ifdef BUILDFIXED
+  /* build fixed tables if not already */
+  if (!fixed_built)
+  {
+    int k;              /* temporary variable */
+    uInt f = 0;         /* number of hufts used in fixed_mem */
+    uIntf *c;           /* length list for huft_build */
+    uIntf *v;           /* work area for huft_build */
+
+    /* allocate memory */
+    if ((c = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
+      return Z_MEM_ERROR;
+    if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
+    {
+      ZFREE(z, c);
+      return Z_MEM_ERROR;
+    }
+
+    /* literal table */
+    for (k = 0; k < 144; k++)
+      c[k] = 8;
+    for (; k < 256; k++)
+      c[k] = 9;
+    for (; k < 280; k++)
+      c[k] = 7;
+    for (; k < 288; k++)
+      c[k] = 8;
+    fixed_bl = 9;
+    huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl,
+               fixed_mem, &f, v);
+
+    /* distance table */
+    for (k = 0; k < 30; k++)
+      c[k] = 5;
+    fixed_bd = 5;
+    huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd,
+               fixed_mem, &f, v);
+
+    /* done */
+    ZFREE(z, v);
+    ZFREE(z, c);
+    fixed_built = 1;
+  }
+#else
+  FT_UNUSED(z);
+#endif
+  *bl = fixed_bl;
+  *bd = fixed_bd;
+  *tl = fixed_tl;
+  *td = fixed_td;
+  return Z_OK;
+}
diff --git a/src/gzip/inftrees.h b/src/gzip/inftrees.h
new file mode 100644 (file)
index 0000000..07bf2aa
--- /dev/null
@@ -0,0 +1,63 @@
+/* inftrees.h -- header to use inftrees.c
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+/* Huffman code lookup table entry--this entry is four bytes for machines
+   that have 16-bit pointers (e.g. PC's in the small or medium model). */
+
+#ifndef _INFTREES_H
+#define _INFTREES_H
+
+typedef struct inflate_huft_s FAR inflate_huft;
+
+struct inflate_huft_s {
+  union {
+    struct {
+      Byte Exop;        /* number of extra bits or operation */
+      Byte Bits;        /* number of bits in this code or subcode */
+    } what;
+    uInt pad;           /* pad structure to a power of 2 (4 bytes for */
+  } word;               /*  16-bit, 8 bytes for 32-bit int's) */
+  uInt base;            /* literal, length base, distance base,
+                           or table offset */
+};
+
+/* Maximum size of dynamic tree.  The maximum found in a long but non-
+   exhaustive search was 1004 huft structures (850 for length/literals
+   and 154 for distances, the latter actually the result of an
+   exhaustive search).  The actual maximum is not known, but the
+   value below is more than safe. */
+#define MANY 1440
+
+local  int inflate_trees_bits OF((
+    uIntf *,                    /* 19 code lengths */
+    uIntf *,                    /* bits tree desired/actual depth */
+    inflate_huft * FAR *,       /* bits tree result */
+    inflate_huft *,             /* space for trees */
+    z_streamp));                /* for messages */
+
+local  int inflate_trees_dynamic OF((
+    uInt,                       /* number of literal/length codes */
+    uInt,                       /* number of distance codes */
+    uIntf *,                    /* that many (total) code lengths */
+    uIntf *,                    /* literal desired/actual bit depth */
+    uIntf *,                    /* distance desired/actual bit depth */
+    inflate_huft * FAR *,       /* literal/length tree result */
+    inflate_huft * FAR *,       /* distance tree result */
+    inflate_huft *,             /* space for trees */
+    z_streamp));                /* for messages */
+
+local  int inflate_trees_fixed OF((
+    uIntf *,                    /* literal desired/actual bit depth */
+    uIntf *,                    /* distance desired/actual bit depth */
+    const inflate_huft * FAR *, /* literal/length tree result */
+    const inflate_huft * FAR *, /* distance tree result */
+    z_streamp));                /* for memory allocation */
+
+#endif /* _INFTREES_H */
diff --git a/src/gzip/infutil.c b/src/gzip/infutil.c
new file mode 100644 (file)
index 0000000..6087b40
--- /dev/null
@@ -0,0 +1,86 @@
+/* inflate_util.c -- data and routines common to blocks and codes
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "infblock.h"
+#include "inftrees.h"
+#include "infcodes.h"
+#include "infutil.h"
+
+
+/* And'ing with mask[n] masks the lower n bits */
+local const uInt inflate_mask[17] = {
+    0x0000,
+    0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
+    0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
+};
+
+
+/* copy as much as possible from the sliding window to the output area */
+local int inflate_flush( /* s, z, r) */
+inflate_blocks_statef *s,
+z_streamp z,
+int r )
+{
+  uInt n;
+  Bytef *p;
+  Bytef *q;
+
+  /* local copies of source and destination pointers */
+  p = z->next_out;
+  q = s->read;
+
+  /* compute number of bytes to copy as far as end of window */
+  n = (uInt)((q <= s->write ? s->write : s->end) - q);
+  if (n > z->avail_out) n = z->avail_out;
+  if (n && r == Z_BUF_ERROR) r = Z_OK;
+
+  /* update counters */
+  z->avail_out -= n;
+  z->total_out += n;
+
+  /* update check information */
+  if (s->checkfn != Z_NULL)
+    z->adler = s->check = (*s->checkfn)(s->check, q, n);
+
+  /* copy as far as end of window */
+  zmemcpy(p, q, n);
+  p += n;
+  q += n;
+
+  /* see if more to copy at beginning of window */
+  if (q == s->end)
+  {
+    /* wrap pointers */
+    q = s->window;
+    if (s->write == s->end)
+      s->write = s->window;
+
+    /* compute bytes to copy */
+    n = (uInt)(s->write - q);
+    if (n > z->avail_out) n = z->avail_out;
+    if (n && r == Z_BUF_ERROR) r = Z_OK;
+
+    /* update counters */
+    z->avail_out -= n;
+    z->total_out += n;
+
+    /* update check information */
+    if (s->checkfn != Z_NULL)
+      z->adler = s->check = (*s->checkfn)(s->check, q, n);
+
+    /* copy */
+    zmemcpy(p, q, n);
+    p += n;
+    q += n;
+  }
+
+  /* update pointers */
+  z->next_out = p;
+  s->read = q;
+
+  /* done */
+  return r;
+}
diff --git a/src/gzip/infutil.h b/src/gzip/infutil.h
new file mode 100644 (file)
index 0000000..7174b6d
--- /dev/null
@@ -0,0 +1,98 @@
+/* infutil.h -- types and macros common to blocks and codes
+ * Copyright (C) 1995-2002 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+#ifndef _INFUTIL_H
+#define _INFUTIL_H
+
+typedef enum {
+      TYPE,     /* get type bits (3, including end bit) */
+      LENS,     /* get lengths for stored */
+      STORED,   /* processing stored block */
+      TABLE,    /* get table lengths */
+      BTREE,    /* get bit lengths tree for a dynamic block */
+      DTREE,    /* get length, distance trees for a dynamic block */
+      CODES,    /* processing fixed or dynamic block */
+      DRY,      /* output remaining window bytes */
+      DONE,     /* finished last block, done */
+      BAD}      /* got a data error--stuck here */
+inflate_block_mode;
+
+/* inflate blocks semi-private state */
+struct inflate_blocks_state {
+
+  /* mode */
+  inflate_block_mode  mode;     /* current inflate_block mode */
+
+  /* mode dependent information */
+  union {
+    uInt left;          /* if STORED, bytes left to copy */
+    struct {
+      uInt table;               /* table lengths (14 bits) */
+      uInt index;               /* index into blens (or border) */
+      uIntf *blens;             /* bit lengths of codes */
+      uInt bb;                  /* bit length tree depth */
+      inflate_huft *tb;         /* bit length decoding tree */
+    } trees;            /* if DTREE, decoding info for trees */
+    struct {
+      inflate_codes_statef
+         *codes;
+    } decode;           /* if CODES, current state */
+  } sub;                /* submode */
+  uInt last;            /* true if this block is the last block */
+
+  /* mode independent information */
+  uInt bitk;            /* bits in bit buffer */
+  uLong bitb;           /* bit buffer */
+  inflate_huft *hufts;  /* single malloc for tree space */
+  Bytef *window;        /* sliding window */
+  Bytef *end;           /* one byte after sliding window */
+  Bytef *read;          /* window read pointer */
+  Bytef *write;         /* window write pointer */
+  check_func checkfn;   /* check function */
+  uLong check;          /* check on output */
+
+};
+
+
+/* defines for inflate input/output */
+/*   update pointers and return */
+#define UPDBITS {s->bitb=b;s->bitk=k;}
+#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;}
+#define UPDOUT {s->write=q;}
+#define UPDATE {UPDBITS UPDIN UPDOUT}
+#define LEAVE {UPDATE return inflate_flush(s,z,r);}
+/*   get bytes and bits */
+#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;}
+#define NEEDBYTE {if(n)r=Z_OK;else LEAVE}
+#define NEXTBYTE (n--,*p++)
+#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}}
+#define DUMPBITS(j) {b>>=(j);k-=(j);}
+/*   output bytes */
+#define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q)
+#define LOADOUT {q=s->write;m=(uInt)WAVAIL;}
+#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}}
+#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT}
+#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;}
+#define OUTBYTE(a) {*q++=(Byte)(a);m--;}
+/*   load local pointers */
+#define LOAD {LOADIN LOADOUT}
+
+/* masks for lower bits (size given to avoid silly warnings with Visual C++) */
+#ifndef NO_INFLATE_MASK
+local uInt inflate_mask[17];
+#endif
+
+/* copy as much as possible from the sliding window to the output area */
+local int inflate_flush OF((
+    inflate_blocks_statef *,
+    z_streamp ,
+    int));
+
+#endif
diff --git a/src/gzip/rules.mk b/src/gzip/rules.mk
new file mode 100644 (file)
index 0000000..d2a43a6
--- /dev/null
@@ -0,0 +1,75 @@
+#
+# FreeType 2 GZip support configuration rules
+#
+
+
+# Copyright 2002, 2003 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.
+
+
+# gzip driver directory
+#
+GZIP_DIR := $(SRC_DIR)/gzip
+
+
+# compilation flags for the driver
+#
+ifeq ($(SYSTEM_ZLIB),)
+  GZIP_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(GZIP_DIR))
+else
+  GZIP_COMPILE := $(FT_COMPILE)
+endif
+
+
+# gzip support sources (i.e., C files)
+#
+GZIP_DRV_SRC := $(GZIP_DIR)/ftgzip.c
+
+# gzip support headers
+#
+GZIP_DRV_H :=
+
+
+# gzip driver object(s)
+#
+#   GZIP_DRV_OBJ_M is used during `multi' builds
+#   GZIP_DRV_OBJ_S is used during `single' builds
+#
+ifeq ($(SYSTEM_ZLIB),)
+  GZIP_DRV_OBJ_M := $(GZIP_DRV_SRC:$(GZIP_DIR)/%.c=$(OBJ_DIR)/%.$O)
+else
+  GZIP_DRV_OBJ_M := $(OBJ_DIR)/ftgzip.$O
+endif
+GZIP_DRV_OBJ_S := $(OBJ_DIR)/ftgzip.$O
+
+# gzip support source file for single build
+#
+GZIP_DRV_SRC_S := $(GZIP_DIR)/ftgzip.c
+
+
+# gzip support - single object
+#
+$(GZIP_DRV_OBJ_S): $(GZIP_DRV_SRC_S) $(GZIP_DRV_SRC) $(FREETYPE_H) \
+                   $(GZIP_DRV_H)
+       $(GZIP_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(GZIP_DRV_SRC_S))
+
+
+# gzip support - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(GZIP_DIR)/%.c $(FREETYPE_H) $(GZIP_DRV_H)
+       $(GZIP_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(GZIP_DRV_OBJ_S)
+DRV_OBJS_M += $(GZIP_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/gzip/zconf.h b/src/gzip/zconf.h
new file mode 100644 (file)
index 0000000..3abf0ba
--- /dev/null
@@ -0,0 +1,284 @@
+/* zconf.h -- configuration of the zlib compression library
+ * Copyright (C) 1995-2002 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#ifndef _ZCONF_H
+#define _ZCONF_H
+
+/*
+ * If you *really* need a unique prefix for all types and library functions,
+ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
+ */
+#ifdef Z_PREFIX
+#  define deflateInit_         z_deflateInit_
+#  define deflate              z_deflate
+#  define deflateEnd           z_deflateEnd
+#  define inflateInit_         z_inflateInit_
+#  define inflate              z_inflate
+#  define inflateEnd           z_inflateEnd
+#  define deflateInit2_        z_deflateInit2_
+#  define deflateSetDictionary z_deflateSetDictionary
+#  define deflateCopy          z_deflateCopy
+#  define deflateReset         z_deflateReset
+#  define deflateParams        z_deflateParams
+#  define inflateInit2_        z_inflateInit2_
+#  define inflateSetDictionary z_inflateSetDictionary
+#  define inflateSync          z_inflateSync
+#  define inflateSyncPoint     z_inflateSyncPoint
+#  define inflateReset         z_inflateReset
+#  define compress             z_compress
+#  define compress2            z_compress2
+#  define uncompress           z_uncompress
+#  define adler32              z_adler32
+#  define crc32                z_crc32
+#  define get_crc_table        z_get_crc_table
+
+#  define Byte   z_Byte
+#  define uInt   z_uInt
+#  define uLong  z_uLong
+#  define Bytef  z_Bytef
+#  define charf  z_charf
+#  define intf   z_intf
+#  define uIntf  z_uIntf
+#  define uLongf z_uLongf
+#  define voidpf z_voidpf
+#  define voidp  z_voidp
+#endif
+
+#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
+#  define WIN32
+#endif
+#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386)
+#  ifndef __32BIT__
+#    define __32BIT__
+#  endif
+#endif
+#if defined(__MSDOS__) && !defined(MSDOS)
+#  define MSDOS
+#endif
+
+/* WinCE doesn't have errno.h */
+#ifdef _WIN32_WCE
+#  define NO_ERRNO_H
+#endif
+
+
+/*
+ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
+ * than 64k bytes at a time (needed on systems with 16-bit int).
+ */
+#if defined(MSDOS) && !defined(__32BIT__)
+#  define MAXSEG_64K
+#endif
+#ifdef MSDOS
+#  define UNALIGNED_OK
+#endif
+
+#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32))  && !defined(STDC)
+#  define STDC
+#endif
+#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__)
+#  ifndef STDC
+#    define STDC
+#  endif
+#endif
+
+#ifndef STDC
+#  ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
+#    define const
+#  endif
+#endif
+
+/* Some Mac compilers merge all .h files incorrectly: */
+#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__)
+#  define NO_DUMMY_DECL
+#endif
+
+/* Old Borland C and LCC incorrectly complains about missing returns: */
+#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500)
+#  define NEED_DUMMY_RETURN
+#endif
+
+#if defined(__LCC__)
+#  define  NEED_DUMMY_RETURN
+#endif
+
+/* Maximum value for memLevel in deflateInit2 */
+#ifndef MAX_MEM_LEVEL
+#  ifdef MAXSEG_64K
+#    define MAX_MEM_LEVEL 8
+#  else
+#    define MAX_MEM_LEVEL 9
+#  endif
+#endif
+
+/* Maximum value for windowBits in deflateInit2 and inflateInit2.
+ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
+ * created by gzip. (Files created by minigzip can still be extracted by
+ * gzip.)
+ */
+#ifndef MAX_WBITS
+#  define MAX_WBITS   15 /* 32K LZ77 window */
+#endif
+
+/* The memory requirements for deflate are (in bytes):
+            (1 << (windowBits+2)) +  (1 << (memLevel+9))
+ that is: 128K for windowBits=15  +  128K for memLevel = 8  (default values)
+ plus a few kilobytes for small objects. For example, if you want to reduce
+ the default memory requirements from 256K to 128K, compile with
+     make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
+ Of course this will generally degrade compression (there's no free lunch).
+
+   The memory requirements for inflate are (in bytes) 1 << windowBits
+ that is, 32K for windowBits=15 (default value) plus a few kilobytes
+ for small objects.
+*/
+
+                        /* Type declarations */
+
+#ifndef OF /* function prototypes */
+#  ifdef STDC
+#    define OF(args)  args
+#  else
+#    define OF(args)  ()
+#  endif
+#endif
+
+/* The following definitions for FAR are needed only for MSDOS mixed
+ * model programming (small or medium model with some far allocations).
+ * This was tested only with MSC; for other MSDOS compilers you may have
+ * to define NO_MEMCPY in zutil.h.  If you don't need the mixed model,
+ * just define FAR to be empty.
+ */
+#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__)
+   /* MSC small or medium model */
+#  define SMALL_MEDIUM
+#  ifdef _MSC_VER
+#    define FAR _far
+#  else
+#    define FAR far
+#  endif
+#endif
+#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
+#  ifndef __32BIT__
+#    define SMALL_MEDIUM
+#    define FAR _far
+#  endif
+#endif
+
+/* Compile with -DZLIB_DLL for Windows DLL support */
+#if defined(ZLIB_DLL)
+#  if defined(_WINDOWS) || defined(WINDOWS)
+#    ifdef FAR
+#      undef FAR
+#    endif
+#    include <windows.h>
+#    define ZEXPORT(x)  x WINAPI
+#    ifdef WIN32
+#      define ZEXPORTVA(x)  x WINAPIV
+#    else
+#      define ZEXPORTVA(x)  x FAR _cdecl _export
+#    endif
+#  endif
+#  if defined (__BORLANDC__)
+#    if (__BORLANDC__ >= 0x0500) && defined (WIN32)
+#      include <windows.h>
+#      define ZEXPORT(x) x __declspec(dllexport) WINAPI
+#      define ZEXPORTRVA(x)  x __declspec(dllexport) WINAPIV
+#    else
+#      if defined (_Windows) && defined (__DLL__)
+#        define ZEXPORT(x) x _export
+#        define ZEXPORTVA(x) x _export
+#      endif
+#    endif
+#  endif
+#endif
+
+
+#ifndef ZEXPORT
+#  define ZEXPORT(x)   static x
+#endif
+#ifndef ZEXPORTVA
+#  define ZEXPORTVA(x)   static x
+#endif
+#ifndef ZEXTERN
+#  define ZEXTERN(x) static x
+#endif
+#ifndef ZEXTERNDEF
+#  define ZEXTERNDEF(x)  static x
+#endif
+
+#ifndef FAR
+#   define FAR
+#endif
+
+#if !defined(MACOS) && !defined(TARGET_OS_MAC)
+typedef unsigned char  Byte;  /* 8 bits */
+#endif
+typedef unsigned int   uInt;  /* 16 bits or more */
+typedef unsigned long  uLong; /* 32 bits or more */
+
+#ifdef SMALL_MEDIUM
+   /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
+#  define Bytef Byte FAR
+#else
+   typedef Byte  FAR Bytef;
+#endif
+typedef char  FAR charf;
+typedef int   FAR intf;
+typedef uInt  FAR uIntf;
+typedef uLong FAR uLongf;
+
+#ifdef STDC
+   typedef void FAR *voidpf;
+   typedef void     *voidp;
+#else
+   typedef Byte FAR *voidpf;
+   typedef Byte     *voidp;
+#endif
+
+#ifdef HAVE_UNISTD_H
+#  include <sys/types.h> /* for off_t */
+#  include <unistd.h>    /* for SEEK_* and off_t */
+#  define z_off_t  off_t
+#endif
+#ifndef SEEK_SET
+#  define SEEK_SET        0       /* Seek from beginning of file.  */
+#  define SEEK_CUR        1       /* Seek from current position.  */
+#  define SEEK_END        2       /* Set file pointer to EOF plus "offset" */
+#endif
+#ifndef z_off_t
+#  define  z_off_t long
+#endif
+
+/* MVS linker does not support external names larger than 8 bytes */
+#if defined(__MVS__)
+#   pragma map(deflateInit_,"DEIN")
+#   pragma map(deflateInit2_,"DEIN2")
+#   pragma map(deflateEnd,"DEEND")
+#   pragma map(inflateInit_,"ININ")
+#   pragma map(inflateInit2_,"ININ2")
+#   pragma map(inflateEnd,"INEND")
+#   pragma map(inflateSync,"INSY")
+#   pragma map(inflateSetDictionary,"INSEDI")
+#   pragma map(inflate_blocks,"INBL")
+#   pragma map(inflate_blocks_new,"INBLNE")
+#   pragma map(inflate_blocks_free,"INBLFR")
+#   pragma map(inflate_blocks_reset,"INBLRE")
+#   pragma map(inflate_codes_free,"INCOFR")
+#   pragma map(inflate_codes,"INCO")
+#   pragma map(inflate_fast,"INFA")
+#   pragma map(inflate_flush,"INFLU")
+#   pragma map(inflate_mask,"INMA")
+#   pragma map(inflate_set_dictionary,"INSEDI2")
+#   pragma map(inflate_copyright,"INCOPY")
+#   pragma map(inflate_trees_bits,"INTRBI")
+#   pragma map(inflate_trees_dynamic,"INTRDY")
+#   pragma map(inflate_trees_fixed,"INTRFI")
+#   pragma map(inflate_trees_free,"INTRFR")
+#endif
+
+#endif /* _ZCONF_H */
diff --git a/src/gzip/zlib.h b/src/gzip/zlib.h
new file mode 100644 (file)
index 0000000..50d0d3f
--- /dev/null
@@ -0,0 +1,830 @@
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+  version 1.1.4, March 11th, 2002
+
+  Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  Jean-loup Gailly        Mark Adler
+  jloup@gzip.org          madler@alumni.caltech.edu
+
+
+  The data format used by the zlib library is described by RFCs (Request for
+  Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt
+  (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
+*/
+
+#ifndef _ZLIB_H
+#define _ZLIB_H
+
+#include "zconf.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZLIB_VERSION "1.1.4"
+
+/*
+     The 'zlib' compression library provides in-memory compression and
+  decompression functions, including integrity checks of the uncompressed
+  data.  This version of the library supports only one compression method
+  (deflation) but other algorithms will be added later and will have the same
+  stream interface.
+
+     Compression can be done in a single step if the buffers are large
+  enough (for example if an input file is mmap'ed), or can be done by
+  repeated calls of the compression function.  In the latter case, the
+  application must provide more input and/or consume the output
+  (providing more output space) before each call.
+
+     The library also supports reading and writing files in gzip (.gz) format
+  with an interface similar to that of stdio.
+
+     The library does not install any signal handler. The decoder checks
+  the consistency of the compressed data, so the library should never
+  crash even in case of corrupted input.
+*/
+
+typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
+typedef void   (*free_func)  OF((voidpf opaque, voidpf address));
+
+struct internal_state;
+
+typedef struct z_stream_s {
+    Bytef    *next_in;  /* next input byte */
+    uInt     avail_in;  /* number of bytes available at next_in */
+    uLong    total_in;  /* total nb of input bytes read so far */
+
+    Bytef    *next_out; /* next output byte should be put there */
+    uInt     avail_out; /* remaining free space at next_out */
+    uLong    total_out; /* total nb of bytes output so far */
+
+    char     *msg;      /* last error message, NULL if no error */
+    struct internal_state FAR *state; /* not visible by applications */
+
+    alloc_func zalloc;  /* used to allocate the internal state */
+    free_func  zfree;   /* used to free the internal state */
+    voidpf     opaque;  /* private data object passed to zalloc and zfree */
+
+    int     data_type;  /* best guess about the data type: ascii or binary */
+    uLong   adler;      /* adler32 value of the uncompressed data */
+    uLong   reserved;   /* reserved for future use */
+} z_stream;
+
+typedef z_stream FAR *z_streamp;
+
+/*
+   The application must update next_in and avail_in when avail_in has
+   dropped to zero. It must update next_out and avail_out when avail_out
+   has dropped to zero. The application must initialize zalloc, zfree and
+   opaque before calling the init function. All other fields are set by the
+   compression library and must not be updated by the application.
+
+   The opaque value provided by the application will be passed as the first
+   parameter for calls of zalloc and zfree. This can be useful for custom
+   memory management. The compression library attaches no meaning to the
+   opaque value.
+
+   zalloc must return Z_NULL if there is not enough memory for the object.
+   If zlib is used in a multi-threaded application, zalloc and zfree must be
+   thread safe.
+
+   On 16-bit systems, the functions zalloc and zfree must be able to allocate
+   exactly 65536 bytes, but will not be required to allocate more than this
+   if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
+   pointers returned by zalloc for objects of exactly 65536 bytes *must*
+   have their offset normalized to zero. The default allocation function
+   provided by this library ensures this (see zutil.c). To reduce memory
+   requirements and avoid any allocation of 64K objects, at the expense of
+   compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
+
+   The fields total_in and total_out can be used for statistics or
+   progress reports. After compression, total_in holds the total size of
+   the uncompressed data and may be saved for use in the decompressor
+   (particularly if the decompressor wants to decompress everything in
+   a single step).
+*/
+
+                        /* constants */
+
+#define Z_NO_FLUSH      0
+#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
+#define Z_SYNC_FLUSH    2
+#define Z_FULL_FLUSH    3
+#define Z_FINISH        4
+/* Allowed flush values; see deflate() below for details */
+
+#define Z_OK            0
+#define Z_STREAM_END    1
+#define Z_NEED_DICT     2
+#define Z_ERRNO        (-1)
+#define Z_STREAM_ERROR (-2)
+#define Z_DATA_ERROR   (-3)
+#define Z_MEM_ERROR    (-4)
+#define Z_BUF_ERROR    (-5)
+#define Z_VERSION_ERROR (-6)
+/* Return codes for the compression/decompression functions. Negative
+ * values are errors, positive values are used for special but normal events.
+ */
+
+#define Z_NO_COMPRESSION         0
+#define Z_BEST_SPEED             1
+#define Z_BEST_COMPRESSION       9
+#define Z_DEFAULT_COMPRESSION  (-1)
+/* compression levels */
+
+#define Z_FILTERED            1
+#define Z_HUFFMAN_ONLY        2
+#define Z_DEFAULT_STRATEGY    0
+/* compression strategy; see deflateInit2() below for details */
+
+#define Z_BINARY   0
+#define Z_ASCII    1
+#define Z_UNKNOWN  2
+/* Possible values of the data_type field */
+
+#define Z_DEFLATED   8
+/* The deflate compression method (the only one supported in this version) */
+
+#define Z_NULL  0  /* for initializing zalloc, zfree, opaque */
+
+
+                        /* basic functions */
+
+/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
+   If the first character differs, the library code actually used is
+   not compatible with the zlib.h header file used by the application.
+   This check is automatically made by deflateInit and inflateInit.
+ */
+
+/*
+ZEXTERN(int)  deflateInit OF((z_streamp strm, int level));
+
+     Initializes the internal stream state for compression. The fields
+   zalloc, zfree and opaque must be initialized before by the caller.
+   If zalloc and zfree are set to Z_NULL, deflateInit updates them to
+   use default allocation functions.
+
+     The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
+   1 gives best speed, 9 gives best compression, 0 gives no compression at
+   all (the input data is simply copied a block at a time).
+   Z_DEFAULT_COMPRESSION requests a default compromise between speed and
+   compression (currently equivalent to level 6).
+
+     deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_STREAM_ERROR if level is not a valid compression level,
+   Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
+   with the version assumed by the caller (ZLIB_VERSION).
+   msg is set to null if there is no error message.  deflateInit does not
+   perform any compression: this will be done by deflate().
+*/
+
+
+/*
+    deflate compresses as much data as possible, and stops when the input
+  buffer becomes empty or the output buffer becomes full. It may introduce some
+  output latency (reading input without producing any output) except when
+  forced to flush.
+
+    The detailed semantics are as follows. deflate performs one or both of the
+  following actions:
+
+  - Compress more input starting at next_in and update next_in and avail_in
+    accordingly. If not all input can be processed (because there is not
+    enough room in the output buffer), next_in and avail_in are updated and
+    processing will resume at this point for the next call of deflate().
+
+  - Provide more output starting at next_out and update next_out and avail_out
+    accordingly. This action is forced if the parameter flush is non zero.
+    Forcing flush frequently degrades the compression ratio, so this parameter
+    should be set only when necessary (in interactive applications).
+    Some output may be provided even if flush is not set.
+
+  Before the call of deflate(), the application should ensure that at least
+  one of the actions is possible, by providing more input and/or consuming
+  more output, and updating avail_in or avail_out accordingly; avail_out
+  should never be zero before the call. The application can consume the
+  compressed output when it wants, for example when the output buffer is full
+  (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
+  and with zero avail_out, it must be called again after making room in the
+  output buffer because there might be more output pending.
+
+    If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
+  flushed to the output buffer and the output is aligned on a byte boundary, so
+  that the decompressor can get all input data available so far. (In particular
+  avail_in is zero after the call if enough output space has been provided
+  before the call.)  Flushing may degrade compression for some compression
+  algorithms and so it should be used only when necessary.
+
+    If flush is set to Z_FULL_FLUSH, all output is flushed as with
+  Z_SYNC_FLUSH, and the compression state is reset so that decompression can
+  restart from this point if previous compressed data has been damaged or if
+  random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
+  the compression.
+
+    If deflate returns with avail_out == 0, this function must be called again
+  with the same value of the flush parameter and more output space (updated
+  avail_out), until the flush is complete (deflate returns with non-zero
+  avail_out).
+
+    If the parameter flush is set to Z_FINISH, pending input is processed,
+  pending output is flushed and deflate returns with Z_STREAM_END if there
+  was enough output space; if deflate returns with Z_OK, this function must be
+  called again with Z_FINISH and more output space (updated avail_out) but no
+  more input data, until it returns with Z_STREAM_END or an error. After
+  deflate has returned Z_STREAM_END, the only possible operations on the
+  stream are deflateReset or deflateEnd.
+
+    Z_FINISH can be used immediately after deflateInit if all the compression
+  is to be done in a single step. In this case, avail_out must be at least
+  0.1% larger than avail_in plus 12 bytes.  If deflate does not return
+  Z_STREAM_END, then it must be called again as described above.
+
+    deflate() sets strm->adler to the adler32 checksum of all input read
+  so far (that is, total_in bytes).
+
+    deflate() may update data_type if it can make a good guess about
+  the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered
+  binary. This field is only for information purposes and does not affect
+  the compression algorithm in any manner.
+
+    deflate() returns Z_OK if some progress has been made (more input
+  processed or more output produced), Z_STREAM_END if all input has been
+  consumed and all output has been produced (only when flush is set to
+  Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
+  if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible
+  (for example avail_in or avail_out was zero).
+*/
+
+
+/*
+     All dynamically allocated data structures for this stream are freed.
+   This function discards any unprocessed input and does not flush any
+   pending output.
+
+     deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
+   stream state was inconsistent, Z_DATA_ERROR if the stream was freed
+   prematurely (some input or output was discarded). In the error case,
+   msg may be set but then points to a static string (which must not be
+   deallocated).
+*/
+
+
+/*
+ZEXTERN(int)  inflateInit OF((z_streamp strm));
+
+     Initializes the internal stream state for decompression. The fields
+   next_in, avail_in, zalloc, zfree and opaque must be initialized before by
+   the caller. If next_in is not Z_NULL and avail_in is large enough (the exact
+   value depends on the compression method), inflateInit determines the
+   compression method from the zlib header and allocates all data structures
+   accordingly; otherwise the allocation will be deferred to the first call of
+   inflate.  If zalloc and zfree are set to Z_NULL, inflateInit updates them to
+   use default allocation functions.
+
+     inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+   version assumed by the caller.  msg is set to null if there is no error
+   message. inflateInit does not perform any decompression apart from reading
+   the zlib header if present: this will be done by inflate().  (So next_in and
+   avail_in may be modified, but next_out and avail_out are unchanged.)
+*/
+
+
+ZEXTERN(int) inflate OF((z_streamp strm, int flush));
+/*
+    inflate decompresses as much data as possible, and stops when the input
+  buffer becomes empty or the output buffer becomes full. It may some
+  introduce some output latency (reading input without producing any output)
+  except when forced to flush.
+
+  The detailed semantics are as follows. inflate performs one or both of the
+  following actions:
+
+  - Decompress more input starting at next_in and update next_in and avail_in
+    accordingly. If not all input can be processed (because there is not
+    enough room in the output buffer), next_in is updated and processing
+    will resume at this point for the next call of inflate().
+
+  - Provide more output starting at next_out and update next_out and avail_out
+    accordingly.  inflate() provides as much output as possible, until there
+    is no more input data or no more space in the output buffer (see below
+    about the flush parameter).
+
+  Before the call of inflate(), the application should ensure that at least
+  one of the actions is possible, by providing more input and/or consuming
+  more output, and updating the next_* and avail_* values accordingly.
+  The application can consume the uncompressed output when it wants, for
+  example when the output buffer is full (avail_out == 0), or after each
+  call of inflate(). If inflate returns Z_OK and with zero avail_out, it
+  must be called again after making room in the output buffer because there
+  might be more output pending.
+
+    If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much
+  output as possible to the output buffer. The flushing behavior of inflate is
+  not specified for values of the flush parameter other than Z_SYNC_FLUSH
+  and Z_FINISH, but the current implementation actually flushes as much output
+  as possible anyway.
+
+    inflate() should normally be called until it returns Z_STREAM_END or an
+  error. However if all decompression is to be performed in a single step
+  (a single call of inflate), the parameter flush should be set to
+  Z_FINISH. In this case all pending input is processed and all pending
+  output is flushed; avail_out must be large enough to hold all the
+  uncompressed data. (The size of the uncompressed data may have been saved
+  by the compressor for this purpose.) The next operation on this stream must
+  be inflateEnd to deallocate the decompression state. The use of Z_FINISH
+  is never required, but can be used to inform inflate that a faster routine
+  may be used for the single inflate() call.
+
+     If a preset dictionary is needed at this point (see inflateSetDictionary
+  below), inflate sets strm-adler to the adler32 checksum of the
+  dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise
+  it sets strm->adler to the adler32 checksum of all output produced
+  so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or
+  an error code as described below. At the end of the stream, inflate()
+  checks that its computed adler32 checksum is equal to that saved by the
+  compressor and returns Z_STREAM_END only if the checksum is correct.
+
+    inflate() returns Z_OK if some progress has been made (more input processed
+  or more output produced), Z_STREAM_END if the end of the compressed data has
+  been reached and all uncompressed output has been produced, Z_NEED_DICT if a
+  preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
+  corrupted (input stream not conforming to the zlib format or incorrect
+  adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent
+  (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not
+  enough memory, Z_BUF_ERROR if no progress is possible or if there was not
+  enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR
+  case, the application may then call inflateSync to look for a good
+  compression block.
+*/
+
+
+ZEXTERN(int)  inflateEnd OF((z_streamp strm));
+/*
+     All dynamically allocated data structures for this stream are freed.
+   This function discards any unprocessed input and does not flush any
+   pending output.
+
+     inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
+   was inconsistent. In the error case, msg may be set but then points to a
+   static string (which must not be deallocated).
+*/
+
+                        /* Advanced functions */
+
+/*
+    The following functions are needed only in some special applications.
+*/
+
+/*
+ZEXTERN(int)  deflateInit2 OF((z_streamp strm,
+                                     int  level,
+                                     int  method,
+                                     int  windowBits,
+                                     int  memLevel,
+                                     int  strategy));
+
+     This is another version of deflateInit with more compression options. The
+   fields next_in, zalloc, zfree and opaque must be initialized before by
+   the caller.
+
+     The method parameter is the compression method. It must be Z_DEFLATED in
+   this version of the library.
+
+     The windowBits parameter is the base two logarithm of the window size
+   (the size of the history buffer).  It should be in the range 8..15 for this
+   version of the library. Larger values of this parameter result in better
+   compression at the expense of memory usage. The default value is 15 if
+   deflateInit is used instead.
+
+     The memLevel parameter specifies how much memory should be allocated
+   for the internal compression state. memLevel=1 uses minimum memory but
+   is slow and reduces compression ratio; memLevel=9 uses maximum memory
+   for optimal speed. The default value is 8. See zconf.h for total memory
+   usage as a function of windowBits and memLevel.
+
+     The strategy parameter is used to tune the compression algorithm. Use the
+   value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
+   filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no
+   string match).  Filtered data consists mostly of small values with a
+   somewhat random distribution. In this case, the compression algorithm is
+   tuned to compress them better. The effect of Z_FILTERED is to force more
+   Huffman coding and less string matching; it is somewhat intermediate
+   between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects
+   the compression ratio but not the correctness of the compressed output even
+   if it is not set appropriately.
+
+      deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
+   method). msg is set to null if there is no error message.  deflateInit2 does
+   not perform any compression: this will be done by deflate().
+*/
+
+/*
+     Initializes the compression dictionary from the given byte sequence
+   without producing any compressed output. This function must be called
+   immediately after deflateInit, deflateInit2 or deflateReset, before any
+   call of deflate. The compressor and decompressor must use exactly the same
+   dictionary (see inflateSetDictionary).
+
+     The dictionary should consist of strings (byte sequences) that are likely
+   to be encountered later in the data to be compressed, with the most commonly
+   used strings preferably put towards the end of the dictionary. Using a
+   dictionary is most useful when the data to be compressed is short and can be
+   predicted with good accuracy; the data can then be compressed better than
+   with the default empty dictionary.
+
+     Depending on the size of the compression data structures selected by
+   deflateInit or deflateInit2, a part of the dictionary may in effect be
+   discarded, for example if the dictionary is larger than the window size in
+   deflate or deflate2. Thus the strings most likely to be useful should be
+   put at the end of the dictionary, not at the front.
+
+     Upon return of this function, strm->adler is set to the Adler32 value
+   of the dictionary; the decompressor may later use this value to determine
+   which dictionary has been used by the compressor. (The Adler32 value
+   applies to the whole dictionary even if only a subset of the dictionary is
+   actually used by the compressor.)
+
+     deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
+   parameter is invalid (such as NULL dictionary) or the stream state is
+   inconsistent (for example if deflate has already been called for this stream
+   or if the compression method is bsort). deflateSetDictionary does not
+   perform any compression: this will be done by deflate().
+*/
+
+/*
+     Sets the destination stream as a complete copy of the source stream.
+
+     This function can be useful when several compression strategies will be
+   tried, for example when there are several ways of pre-processing the input
+   data with a filter. The streams that will be discarded should then be freed
+   by calling deflateEnd.  Note that deflateCopy duplicates the internal
+   compression state which can be quite large, so this strategy is slow and
+   can consume lots of memory.
+
+     deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+   (such as zalloc being NULL). msg is left unchanged in both source and
+   destination.
+*/
+
+/*
+     This function is equivalent to deflateEnd followed by deflateInit,
+   but does not free and reallocate all the internal compression state.
+   The stream will keep the same compression level and any other attributes
+   that may have been set by deflateInit2.
+
+      deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+/*
+     Dynamically update the compression level and compression strategy.  The
+   interpretation of level and strategy is as in deflateInit2.  This can be
+   used to switch between compression and straight copy of the input data, or
+   to switch to a different kind of input data requiring a different
+   strategy. If the compression level is changed, the input available so far
+   is compressed with the old level (and may be flushed); the new level will
+   take effect only at the next call of deflate().
+
+     Before the call of deflateParams, the stream state must be set as for
+   a call of deflate(), since the currently available input may have to
+   be compressed and flushed. In particular, strm->avail_out must be non-zero.
+
+     deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
+   stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
+   if strm->avail_out was zero.
+*/
+
+/*
+ZEXTERN(int)  inflateInit2 OF((z_streamp strm,
+                                     int  windowBits));
+
+     This is another version of inflateInit with an extra parameter. The
+   fields next_in, avail_in, zalloc, zfree and opaque must be initialized
+   before by the caller.
+
+     The windowBits parameter is the base two logarithm of the maximum window
+   size (the size of the history buffer).  It should be in the range 8..15 for
+   this version of the library. The default value is 15 if inflateInit is used
+   instead. If a compressed stream with a larger window size is given as
+   input, inflate() will return with the error code Z_DATA_ERROR instead of
+   trying to allocate a larger window.
+
+      inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative
+   memLevel). msg is set to null if there is no error message.  inflateInit2
+   does not perform any decompression apart from reading the zlib header if
+   present: this will be done by inflate(). (So next_in and avail_in may be
+   modified, but next_out and avail_out are unchanged.)
+*/
+
+/*
+     Initializes the decompression dictionary from the given uncompressed byte
+   sequence. This function must be called immediately after a call of inflate
+   if this call returned Z_NEED_DICT. The dictionary chosen by the compressor
+   can be determined from the Adler32 value returned by this call of
+   inflate. The compressor and decompressor must use exactly the same
+   dictionary (see deflateSetDictionary).
+
+     inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
+   parameter is invalid (such as NULL dictionary) or the stream state is
+   inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
+   expected one (incorrect Adler32 value). inflateSetDictionary does not
+   perform any decompression: this will be done by subsequent calls of
+   inflate().
+*/
+
+/*
+    Skips invalid compressed data until a full flush point (see above the
+  description of deflate with Z_FULL_FLUSH) can be found, or until all
+  available input is skipped. No output is provided.
+
+    inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
+  if no more input was provided, Z_DATA_ERROR if no flush point has been found,
+  or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
+  case, the application may save the current current value of total_in which
+  indicates where valid compressed data was found. In the error case, the
+  application may repeatedly call inflateSync, providing more input each time,
+  until success or end of the input data.
+*/
+
+ZEXTERN(int)  inflateReset OF((z_streamp strm));
+/*
+     This function is equivalent to inflateEnd followed by inflateInit,
+   but does not free and reallocate all the internal decompression state.
+   The stream will keep attributes that may have been set by inflateInit2.
+
+      inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+
+                        /* utility functions */
+
+/*
+     The following utility functions are implemented on top of the
+   basic stream-oriented functions. To simplify the interface, some
+   default options are assumed (compression level and memory usage,
+   standard memory allocation functions). The source code of these
+   utility functions can easily be modified if you need special options.
+*/
+
+/*
+     Compresses the source buffer into the destination buffer.  sourceLen is
+   the byte length of the source buffer. Upon entry, destLen is the total
+   size of the destination buffer, which must be at least 0.1% larger than
+   sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the
+   compressed buffer.
+     This function can be used to compress a whole file at once if the
+   input file is mmap'ed.
+     compress returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_BUF_ERROR if there was not enough room in the output
+   buffer.
+*/
+
+/*
+     Compresses the source buffer into the destination buffer. The level
+   parameter has the same meaning as in deflateInit.  sourceLen is the byte
+   length of the source buffer. Upon entry, destLen is the total size of the
+   destination buffer, which must be at least 0.1% larger than sourceLen plus
+   12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
+
+     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+   Z_STREAM_ERROR if the level parameter is invalid.
+*/
+
+/*
+     Decompresses the source buffer into the destination buffer.  sourceLen is
+   the byte length of the source buffer. Upon entry, destLen is the total
+   size of the destination buffer, which must be large enough to hold the
+   entire uncompressed data. (The size of the uncompressed data must have
+   been saved previously by the compressor and transmitted to the decompressor
+   by some mechanism outside the scope of this compression library.)
+   Upon exit, destLen is the actual size of the compressed buffer.
+     This function can be used to decompress a whole file at once if the
+   input file is mmap'ed.
+
+     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_BUF_ERROR if there was not enough room in the output
+   buffer, or Z_DATA_ERROR if the input data was corrupted.
+*/
+
+
+/*
+     Opens a gzip (.gz) file for reading or writing. The mode parameter
+   is as in fopen ("rb" or "wb") but can also include a compression level
+   ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
+   Huffman only compression as in "wb1h". (See the description
+   of deflateInit2 for more information about the strategy parameter.)
+
+     gzopen can be used to read a file which is not in gzip format; in this
+   case gzread will directly read from the file without decompression.
+
+     gzopen returns NULL if the file could not be opened or if there was
+   insufficient memory to allocate the (de)compression state; errno
+   can be checked to distinguish the two cases (if errno is zero, the
+   zlib error is Z_MEM_ERROR).  */
+
+/*
+     gzdopen() associates a gzFile with the file descriptor fd.  File
+   descriptors are obtained from calls like open, dup, creat, pipe or
+   fileno (in the file has been previously opened with fopen).
+   The mode parameter is as in gzopen.
+     The next call of gzclose on the returned gzFile will also close the
+   file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
+   descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).
+     gzdopen returns NULL if there was insufficient memory to allocate
+   the (de)compression state.
+*/
+
+/*
+     Dynamically update the compression level or strategy. See the description
+   of deflateInit2 for the meaning of these parameters.
+     gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
+   opened for writing.
+*/
+
+/*
+     Reads the given number of uncompressed bytes from the compressed file.
+   If the input file was not in gzip format, gzread copies the given number
+   of bytes into the buffer.
+     gzread returns the number of uncompressed bytes actually read (0 for
+   end of file, -1 for error). */
+
+/*
+     Writes the given number of uncompressed bytes into the compressed file.
+   gzwrite returns the number of uncompressed bytes actually written
+   (0 in case of error).
+*/
+
+/*
+     Converts, formats, and writes the args to the compressed file under
+   control of the format string, as in fprintf. gzprintf returns the number of
+   uncompressed bytes actually written (0 in case of error).
+*/
+
+/*
+      Writes the given null-terminated string to the compressed file, excluding
+   the terminating null character.
+      gzputs returns the number of characters written, or -1 in case of error.
+*/
+
+/*
+      Reads bytes from the compressed file until len-1 characters are read, or
+   a newline character is read and transferred to buf, or an end-of-file
+   condition is encountered.  The string is then terminated with a null
+   character.
+      gzgets returns buf, or Z_NULL in case of error.
+*/
+
+/*
+      Writes c, converted to an unsigned char, into the compressed file.
+   gzputc returns the value that was written, or -1 in case of error.
+*/
+
+/*
+      Reads one byte from the compressed file. gzgetc returns this byte
+   or -1 in case of end of file or error.
+*/
+
+/*
+     Flushes all pending output into the compressed file. The parameter
+   flush is as in the deflate() function. The return value is the zlib
+   error number (see function gzerror below). gzflush returns Z_OK if
+   the flush parameter is Z_FINISH and all output could be flushed.
+     gzflush should be called only when strictly necessary because it can
+   degrade compression.
+*/
+
+/*
+      Sets the starting position for the next gzread or gzwrite on the
+   given compressed file. The offset represents a number of bytes in the
+   uncompressed data stream. The whence parameter is defined as in lseek(2);
+   the value SEEK_END is not supported.
+     If the file is opened for reading, this function is emulated but can be
+   extremely slow. If the file is opened for writing, only forward seeks are
+   supported; gzseek then compresses a sequence of zeroes up to the new
+   starting position.
+
+      gzseek returns the resulting offset location as measured in bytes from
+   the beginning of the uncompressed stream, or -1 in case of error, in
+   particular if the file is opened for writing and the new starting position
+   would be before the current position.
+*/
+
+/*
+     Rewinds the given file. This function is supported only for reading.
+
+   gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
+*/
+
+/*
+     Returns the starting position for the next gzread or gzwrite on the
+   given compressed file. This position represents a number of bytes in the
+   uncompressed data stream.
+
+   gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
+*/
+
+/*
+     Returns 1 when EOF has previously been detected reading the given
+   input stream, otherwise zero.
+*/
+
+/*
+     Flushes all pending output if necessary, closes the compressed file
+   and deallocates all the (de)compression state. The return value is the zlib
+   error number (see function gzerror below).
+*/
+
+/*
+     Returns the error message for the last error which occurred on the
+   given compressed file. errnum is set to zlib error number. If an
+   error occurred in the file system and not in the compression library,
+   errnum is set to Z_ERRNO and the application may consult errno
+   to get the exact error code.
+*/
+
+                        /* checksum functions */
+
+/*
+     These functions are not related to compression but are exported
+   anyway because they might be useful in applications using the
+   compression library.
+*/
+
+ZEXTERN(uLong)  adler32 OF((uLong adler, const Bytef *buf, uInt len));
+
+/*
+     Update a running Adler-32 checksum with the bytes buf[0..len-1] and
+   return the updated checksum. If buf is NULL, this function returns
+   the required initial value for the checksum.
+   An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
+   much faster. Usage example:
+
+     uLong adler = adler32(0L, Z_NULL, 0);
+
+     while (read_buffer(buffer, length) != EOF) {
+       adler = adler32(adler, buffer, length);
+     }
+     if (adler != original_adler) error();
+*/
+
+/*
+     Update a running crc with the bytes buf[0..len-1] and return the updated
+   crc. If buf is NULL, this function returns the required initial value
+   for the crc. Pre- and post-conditioning (one's complement) is performed
+   within this function so it shouldn't be done by the application.
+   Usage example:
+
+     uLong crc = crc32(0L, Z_NULL, 0);
+
+     while (read_buffer(buffer, length) != EOF) {
+       crc = crc32(crc, buffer, length);
+     }
+     if (crc != original_crc) error();
+*/
+
+
+                        /* various hacks, don't look :) */
+
+/* deflateInit and inflateInit are macros to allow checking the zlib version
+ * and the compiler's view of z_stream:
+ */
+ZEXTERN(int)  inflateInit2_ OF((z_streamp strm, int  windowBits,
+                                      const char *version, int stream_size));
+#define deflateInit(strm, level) \
+        deflateInit_((strm), (level),       ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit(strm) \
+        inflateInit_((strm),                ZLIB_VERSION, sizeof(z_stream))
+#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
+        deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
+                      (strategy),           ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit2(strm, windowBits) \
+        inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ZLIB_H */
diff --git a/src/gzip/zutil.c b/src/gzip/zutil.c
new file mode 100644 (file)
index 0000000..7ad0c1f
--- /dev/null
@@ -0,0 +1,181 @@
+/* zutil.c -- target dependent utility functions for the compression library
+ * Copyright (C) 1995-2002 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#include "zutil.h"
+
+#ifndef STDC
+extern void exit OF((int));
+#endif
+
+
+#ifndef HAVE_MEMCPY
+
+void zmemcpy(dest, source, len)
+    Bytef* dest;
+    const Bytef* source;
+    uInt  len;
+{
+    if (len == 0) return;
+    do {
+        *dest++ = *source++; /* ??? to be unrolled */
+    } while (--len != 0);
+}
+
+int zmemcmp(s1, s2, len)
+    const Bytef* s1;
+    const Bytef* s2;
+    uInt  len;
+{
+    uInt j;
+
+    for (j = 0; j < len; j++) {
+        if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
+    }
+    return 0;
+}
+
+void zmemzero(dest, len)
+    Bytef* dest;
+    uInt  len;
+{
+    if (len == 0) return;
+    do {
+        *dest++ = 0;  /* ??? to be unrolled */
+    } while (--len != 0);
+}
+#endif
+
+#if defined( MSDOS ) && defined( __TURBOC__ ) && !defined( MY_ZCALLOC )
+#if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__)
+/* Small and medium model in Turbo C are for now limited to near allocation
+ * with reduced MAX_WBITS and MAX_MEM_LEVEL
+ */
+#  define MY_ZCALLOC
+
+/* Turbo C malloc() does not allow dynamic allocation of 64K bytes
+ * and farmalloc(64K) returns a pointer with an offset of 8, so we
+ * must fix the pointer. Warning: the pointer must be put back to its
+ * original form in order to free it, use zcfree().
+ */
+
+#define MAX_PTR 10
+/* 10*64K = 640K */
+
+local int next_ptr = 0;
+
+typedef struct ptr_table_s {
+    voidpf org_ptr;
+    voidpf new_ptr;
+} ptr_table;
+
+local ptr_table table[MAX_PTR];
+/* This table is used to remember the original form of pointers
+ * to large buffers (64K). Such pointers are normalized with a zero offset.
+ * Since MSDOS is not a preemptive multitasking OS, this table is not
+ * protected from concurrent access. This hack doesn't work anyway on
+ * a protected system like OS/2. Use Microsoft C instead.
+ */
+
+voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
+{
+    voidpf buf = opaque; /* just to make some compilers happy */
+    ulg bsize = (ulg)items*size;
+
+    /* If we allocate less than 65520 bytes, we assume that farmalloc
+     * will return a usable pointer which doesn't have to be normalized.
+     */
+    if (bsize < 65520L) {
+        buf = farmalloc(bsize);
+        if (*(ush*)&buf != 0) return buf;
+    } else {
+        buf = farmalloc(bsize + 16L);
+    }
+    if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
+    table[next_ptr].org_ptr = buf;
+
+    /* Normalize the pointer to seg:0 */
+    *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
+    *(ush*)&buf = 0;
+    table[next_ptr++].new_ptr = buf;
+    return buf;
+}
+
+void  zcfree (voidpf opaque, voidpf ptr)
+{
+    int n;
+    if (*(ush*)&ptr != 0) { /* object < 64K */
+        farfree(ptr);
+        return;
+    }
+    /* Find the original pointer */
+    for (n = 0; n < next_ptr; n++) {
+        if (ptr != table[n].new_ptr) continue;
+
+        farfree(table[n].org_ptr);
+        while (++n < next_ptr) {
+            table[n-1] = table[n];
+        }
+        next_ptr--;
+        return;
+    }
+    ptr = opaque; /* just to make some compilers happy */
+    Assert(0, "zcfree: ptr not found");
+}
+#endif
+#endif /* MSDOS && __TURBOC__ */
+
+
+#if defined(M_I86) && !defined(__32BIT__) && !defined( MY_ZCALLOC )
+/* Microsoft C in 16-bit mode */
+
+#  define MY_ZCALLOC
+
+#if (!defined(_MSC_VER) || (_MSC_VER <= 600))
+#  define _halloc  halloc
+#  define _hfree   hfree
+#endif
+
+voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
+{
+    if (opaque) opaque = 0; /* to make compiler happy */
+    return _halloc((long)items, size);
+}
+
+void  zcfree (voidpf opaque, voidpf ptr)
+{
+    if (opaque) opaque = 0; /* to make compiler happy */
+    _hfree(ptr);
+}
+
+#endif /* MSC */
+
+
+#ifndef MY_ZCALLOC /* Any system without a special alloc function */
+
+#ifndef STDC
+extern voidp  ft_scalloc OF((uInt items, uInt size));
+extern void   ft_sfree   OF((voidpf ptr));
+#endif
+
+voidpf zcalloc (opaque, items, size)
+    voidpf opaque;
+    unsigned items;
+    unsigned size;
+{
+    if (opaque) items += size - size; /* make compiler happy */
+    return (voidpf)ft_scalloc(items, size);
+}
+
+void  zcfree (opaque, ptr)
+    voidpf opaque;
+    voidpf ptr;
+{
+    ft_sfree(ptr);
+    if (opaque) return; /* make compiler happy */
+}
+
+#endif /* MY_ZCALLOC */
diff --git a/src/gzip/zutil.h b/src/gzip/zutil.h
new file mode 100644 (file)
index 0000000..c9688cd
--- /dev/null
@@ -0,0 +1,215 @@
+/* zutil.h -- internal interface and configuration of the compression library
+ * Copyright (C) 1995-2002 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+   part of the implementation of the compression library and is
+   subject to change. Applications should only use zlib.h.
+ */
+
+/* @(#) $Id$ */
+
+#ifndef _Z_UTIL_H
+#define _Z_UTIL_H
+
+#include "zlib.h"
+
+#ifdef STDC
+#  include <stddef.h>
+#  include <string.h>
+#  include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+    extern int errno;
+#else
+#   include <errno.h>
+#endif
+
+#ifndef local
+#  define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+typedef unsigned char  uch;
+typedef uch FAR uchf;
+typedef unsigned short ush;
+typedef ush FAR ushf;
+typedef unsigned long  ulg;
+
+
+#define ERR_RETURN(strm,err) \
+  return (strm->msg = (char*)ERR_MSG(err), (err))
+/* To be used only when the state is known to be valid */
+
+        /* common constants */
+
+#ifndef DEF_WBITS
+#  define DEF_WBITS MAX_WBITS
+#endif
+/* default windowBits for decompression. MAX_WBITS is for compression only */
+
+#if MAX_MEM_LEVEL >= 8
+#  define DEF_MEM_LEVEL 8
+#else
+#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL
+#endif
+/* default memLevel */
+
+#define STORED_BLOCK 0
+#define STATIC_TREES 1
+#define DYN_TREES    2
+/* The three kinds of block type */
+
+#define MIN_MATCH  3
+#define MAX_MATCH  258
+/* The minimum and maximum match lengths */
+
+#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */
+
+        /* target dependencies */
+
+#ifdef MSDOS
+#  define OS_CODE  0x00
+#  if defined(__TURBOC__) || defined(__BORLANDC__)
+#    if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
+       /* Allow compilation with ANSI keywords only enabled */
+       void _Cdecl farfree( void *block );
+       void *_Cdecl farmalloc( unsigned long nbytes );
+#    else
+#     include <alloc.h>
+#    endif
+#  else /* MSC or DJGPP */
+#  endif
+#endif
+
+#ifdef OS2
+#  define OS_CODE  0x06
+#endif
+
+#ifdef WIN32 /* Window 95 & Windows NT */
+#  define OS_CODE  0x0b
+#endif
+
+#if defined(VAXC) || defined(VMS)
+#  define OS_CODE  0x02
+#  define F_OPEN(name, mode) \
+     ft_fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
+#endif
+
+#ifdef AMIGA
+#  define OS_CODE  0x01
+#endif
+
+#if defined(ATARI) || defined(atarist)
+#  define OS_CODE  0x05
+#endif
+
+#if defined(MACOS) || defined(TARGET_OS_MAC)
+#  define OS_CODE  0x07
+#  if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
+#    include <unix.h> /* for fdopen */
+#  else
+#    ifndef fdopen
+#      define fdopen(fd,mode) NULL /* No fdopen() */
+#    endif
+#  endif
+#endif
+
+#ifdef __50SERIES /* Prime/PRIMOS */
+#  define OS_CODE  0x0F
+#endif
+
+#ifdef TOPS20
+#  define OS_CODE  0x0a
+#endif
+
+#if defined(_BEOS_) || defined(RISCOS)
+#  define fdopen(fd,mode) NULL /* No fdopen() */
+#endif
+
+#if (defined(_MSC_VER) && (_MSC_VER > 600))
+#  define fdopen(fd,type)  _fdopen(fd,type)
+#endif
+
+
+        /* Common defaults */
+
+#ifndef OS_CODE
+#  define OS_CODE  0x03  /* assume Unix */
+#endif
+
+#ifndef F_OPEN
+#  define F_OPEN(name, mode) ft_fopen((name), (mode))
+#endif
+
+         /* functions */
+
+#ifdef HAVE_STRERROR
+   extern char *strerror OF((int));
+#  define zstrerror(errnum) strerror(errnum)
+#else
+#  define zstrerror(errnum) ""
+#endif
+
+#if defined(pyr)
+#  define NO_MEMCPY
+#endif
+#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)
+ /* Use our own functions for small and medium model with MSC <= 5.0.
+  * You may have to use the same strategy for Borland C (untested).
+  * The __SC__ check is for Symantec.
+  */
+#  define NO_MEMCPY
+#endif
+#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)
+#  define HAVE_MEMCPY
+#endif
+#ifdef HAVE_MEMCPY
+#  ifdef SMALL_MEDIUM /* MSDOS small or medium model */
+#    define zmemcpy _fmemcpy
+#    define zmemcmp _fmemcmp
+#    define zmemzero(dest, len) _fmemset(dest, 0, len)
+#  else
+#    define zmemcpy ft_memcpy
+#    define zmemcmp ft_memcmp
+#    define zmemzero(dest, len) ft_memset(dest, 0, len)
+#  endif
+#else
+   extern void zmemcpy  OF((Bytef* dest, const Bytef* source, uInt len));
+   extern int  zmemcmp  OF((const Bytef* s1, const Bytef* s2, uInt len));
+   extern void zmemzero OF((Bytef* dest, uInt len));
+#endif
+
+/* Diagnostic functions */
+#ifdef DEBUG
+#  include <stdio.h>
+   extern int z_verbose;
+   extern void z_error    OF((char *m));
+#  define Assert(cond,msg) {if(!(cond)) z_error(msg);}
+#  define Trace(x) {if (z_verbose>=0) fprintf x ;}
+#  define Tracev(x) {if (z_verbose>0) fprintf x ;}
+#  define Tracevv(x) {if (z_verbose>1) fprintf x ;}
+#  define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;}
+#  define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;}
+#else
+#  define Assert(cond,msg)
+#  define Trace(x)
+#  define Tracev(x)
+#  define Tracevv(x)
+#  define Tracec(c,x)
+#  define Tracecv(c,x)
+#endif
+
+
+typedef uLong (*check_func) OF((uLong check, const Bytef *buf,
+                                uInt len));
+local voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size));
+local void   zcfree  OF((voidpf opaque, voidpf ptr));
+
+#define ZALLOC(strm, items, size) \
+           (*((strm)->zalloc))((strm)->opaque, (items), (size))
+#define ZFREE(strm, addr)  (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
+#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
+
+#endif /* _Z_UTIL_H */
diff --git a/src/lzw/Jamfile b/src/lzw/Jamfile
new file mode 100644 (file)
index 0000000..6f1f516
--- /dev/null
@@ -0,0 +1,16 @@
+# FreeType 2 src/lzw Jamfile
+#
+# Copyright 2004, 2006 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) lzw ;
+
+Library  $(FT2_LIB) : ftlzw.c ;
+
+# end of src/lzw Jamfile
diff --git a/src/lzw/ftlzw.c b/src/lzw/ftlzw.c
new file mode 100644 (file)
index 0000000..35e392b
--- /dev/null
@@ -0,0 +1,413 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftlzw.c                                                                */
+/*                                                                         */
+/*    FreeType support for .Z compressed files.                            */
+/*                                                                         */
+/*  This optional component relies on NetBSD's zopen().  It should mainly  */
+/*  be used to parse compressed PCF fonts, as found with many X11 server   */
+/*  distributions.                                                         */
+/*                                                                         */
+/*  Copyright 2004-2006, 2009, 2010, 2012 by                               */
+/*  Albert Chin-A-Young.                                                   */
+/*                                                                         */
+/*  Based on code in src/gzip/ftgzip.c, Copyright 2004 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#include <ft2build.h>
+#include FT_INTERNAL_MEMORY_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_LZW_H
+#include FT_CONFIG_STANDARD_LIBRARY_H
+
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  LZW_Err_
+#define FT_ERR_BASE    FT_Mod_Err_LZW
+
+#include FT_ERRORS_H
+
+
+#ifdef FT_CONFIG_OPTION_USE_LZW
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "lzw code does not support PIC yet"
+#endif
+
+#include "ftzopen.h"
+
+
+/***************************************************************************/
+/***************************************************************************/
+/*****                                                                 *****/
+/*****                  M E M O R Y   M A N A G E M E N T              *****/
+/*****                                                                 *****/
+/***************************************************************************/
+/***************************************************************************/
+
+/***************************************************************************/
+/***************************************************************************/
+/*****                                                                 *****/
+/*****                   F I L E   D E S C R I P T O R                 *****/
+/*****                                                                 *****/
+/***************************************************************************/
+/***************************************************************************/
+
+#define FT_LZW_BUFFER_SIZE  4096
+
+  typedef struct  FT_LZWFileRec_
+  {
+    FT_Stream       source;         /* parent/source stream        */
+    FT_Stream       stream;         /* embedding stream            */
+    FT_Memory       memory;         /* memory allocator            */
+    FT_LzwStateRec  lzw;            /* lzw decompressor state      */
+
+    FT_Byte         buffer[FT_LZW_BUFFER_SIZE]; /* output buffer      */
+    FT_ULong        pos;                        /* position in output */
+    FT_Byte*        cursor;
+    FT_Byte*        limit;
+
+  } FT_LZWFileRec, *FT_LZWFile;
+
+
+  /* check and skip .Z header */
+  static FT_Error
+  ft_lzw_check_header( FT_Stream  stream )
+  {
+    FT_Error  error;
+    FT_Byte   head[2];
+
+
+    if ( FT_STREAM_SEEK( 0 )       ||
+         FT_STREAM_READ( head, 2 ) )
+      goto Exit;
+
+    /* head[0] && head[1] are the magic numbers */
+    if ( head[0] != 0x1f ||
+         head[1] != 0x9d )
+      error = LZW_Err_Invalid_File_Format;
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  ft_lzw_file_init( FT_LZWFile  zip,
+                    FT_Stream   stream,
+                    FT_Stream   source )
+  {
+    FT_LzwState  lzw   = &zip->lzw;
+    FT_Error     error = LZW_Err_Ok;
+
+
+    zip->stream = stream;
+    zip->source = source;
+    zip->memory = stream->memory;
+
+    zip->limit  = zip->buffer + FT_LZW_BUFFER_SIZE;
+    zip->cursor = zip->limit;
+    zip->pos    = 0;
+
+    /* check and skip .Z header */
+    error = ft_lzw_check_header( source );
+    if ( error )
+      goto Exit;
+
+    /* initialize internal lzw variable */
+    ft_lzwstate_init( lzw, source );
+
+  Exit:
+    return error;
+  }
+
+
+  static void
+  ft_lzw_file_done( FT_LZWFile  zip )
+  {
+    /* clear the rest */
+    ft_lzwstate_done( &zip->lzw );
+
+    zip->memory = NULL;
+    zip->source = NULL;
+    zip->stream = NULL;
+  }
+
+
+  static FT_Error
+  ft_lzw_file_reset( FT_LZWFile  zip )
+  {
+    FT_Stream  stream = zip->source;
+    FT_Error   error;
+
+
+    if ( !FT_STREAM_SEEK( 0 ) )
+    {
+      ft_lzwstate_reset( &zip->lzw );
+
+      zip->limit  = zip->buffer + FT_LZW_BUFFER_SIZE;
+      zip->cursor = zip->limit;
+      zip->pos    = 0;
+    }
+
+    return error;
+  }
+
+
+  static FT_Error
+  ft_lzw_file_fill_output( FT_LZWFile  zip )
+  {
+    FT_LzwState  lzw = &zip->lzw;
+    FT_ULong     count;
+    FT_Error     error = LZW_Err_Ok;
+
+
+    zip->cursor = zip->buffer;
+
+    count = ft_lzwstate_io( lzw, zip->buffer, FT_LZW_BUFFER_SIZE );
+
+    zip->limit = zip->cursor + count;
+
+    if ( count == 0 )
+      error = LZW_Err_Invalid_Stream_Operation;
+
+    return error;
+  }
+
+
+  /* fill output buffer; `count' must be <= FT_LZW_BUFFER_SIZE */
+  static FT_Error
+  ft_lzw_file_skip_output( FT_LZWFile  zip,
+                           FT_ULong    count )
+  {
+    FT_Error  error = LZW_Err_Ok;
+
+
+    /* first, we skip what we can from the output buffer */
+    {
+      FT_ULong  delta = (FT_ULong)( zip->limit - zip->cursor );
+
+
+      if ( delta >= count )
+        delta = count;
+
+      zip->cursor += delta;
+      zip->pos    += delta;
+
+      count -= delta;
+    }
+
+    /* next, we skip as many bytes remaining as possible */
+    while ( count > 0 )
+    {
+      FT_ULong  delta = FT_LZW_BUFFER_SIZE;
+      FT_ULong  numread;
+
+
+      if ( delta > count )
+        delta = count;
+
+      numread = ft_lzwstate_io( &zip->lzw, NULL, delta );
+      if ( numread < delta )
+      {
+        /* not enough bytes */
+        error = LZW_Err_Invalid_Stream_Operation;
+        break;
+      }
+
+      zip->pos += delta;
+      count    -= delta;
+    }
+
+    return error;
+  }
+
+
+  static FT_ULong
+  ft_lzw_file_io( FT_LZWFile  zip,
+                  FT_ULong    pos,
+                  FT_Byte*    buffer,
+                  FT_ULong    count )
+  {
+    FT_ULong  result = 0;
+    FT_Error  error;
+
+
+    /* seeking backwards. */
+    if ( pos < zip->pos )
+    {
+      /* If the new position is within the output buffer, simply       */
+      /* decrement pointers, otherwise we reset the stream completely! */
+      if ( ( zip->pos - pos ) <= (FT_ULong)( zip->cursor - zip->buffer ) )
+      {
+        zip->cursor -= zip->pos - pos;
+        zip->pos     = pos;
+      }
+      else
+      {
+        error = ft_lzw_file_reset( zip );
+        if ( error )
+          goto Exit;
+      }
+    }
+
+    /* skip unwanted bytes */
+    if ( pos > zip->pos )
+    {
+      error = ft_lzw_file_skip_output( zip, (FT_ULong)( pos - zip->pos ) );
+      if ( error )
+        goto Exit;
+    }
+
+    if ( count == 0 )
+      goto Exit;
+
+    /* now read the data */
+    for (;;)
+    {
+      FT_ULong  delta;
+
+
+      delta = (FT_ULong)( zip->limit - zip->cursor );
+      if ( delta >= count )
+        delta = count;
+
+      FT_MEM_COPY( buffer + result, zip->cursor, delta );
+      result      += delta;
+      zip->cursor += delta;
+      zip->pos    += delta;
+
+      count -= delta;
+      if ( count == 0 )
+        break;
+
+      error = ft_lzw_file_fill_output( zip );
+      if ( error )
+        break;
+    }
+
+  Exit:
+    return result;
+  }
+
+
+/***************************************************************************/
+/***************************************************************************/
+/*****                                                                 *****/
+/*****            L Z W   E M B E D D I N G   S T R E A M              *****/
+/*****                                                                 *****/
+/***************************************************************************/
+/***************************************************************************/
+
+  static void
+  ft_lzw_stream_close( FT_Stream  stream )
+  {
+    FT_LZWFile  zip    = (FT_LZWFile)stream->descriptor.pointer;
+    FT_Memory   memory = stream->memory;
+
+
+    if ( zip )
+    {
+      /* finalize lzw file descriptor */
+      ft_lzw_file_done( zip );
+
+      FT_FREE( zip );
+
+      stream->descriptor.pointer = NULL;
+    }
+  }
+
+
+  static FT_ULong
+  ft_lzw_stream_io( FT_Stream  stream,
+                    FT_ULong   pos,
+                    FT_Byte*   buffer,
+                    FT_ULong   count )
+  {
+    FT_LZWFile  zip = (FT_LZWFile)stream->descriptor.pointer;
+
+
+    return ft_lzw_file_io( zip, pos, buffer, count );
+  }
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stream_OpenLZW( FT_Stream  stream,
+                     FT_Stream  source )
+  {
+    FT_Error    error;
+    FT_Memory   memory = source->memory;
+    FT_LZWFile  zip = NULL;
+
+
+    /*
+     *  Check the header right now; this prevents allocation of a huge
+     *  LZWFile object (400 KByte of heap memory) if not necessary.
+     *
+     *  Did I mention that you should never use .Z compressed font
+     *  files?
+     */
+    error = ft_lzw_check_header( source );
+    if ( error )
+      goto Exit;
+
+    FT_ZERO( stream );
+    stream->memory = memory;
+
+    if ( !FT_NEW( zip ) )
+    {
+      error = ft_lzw_file_init( zip, stream, source );
+      if ( error )
+      {
+        FT_FREE( zip );
+        goto Exit;
+      }
+
+      stream->descriptor.pointer = zip;
+    }
+
+    stream->size  = 0x7FFFFFFFL;  /* don't know the real size! */
+    stream->pos   = 0;
+    stream->base  = 0;
+    stream->read  = ft_lzw_stream_io;
+    stream->close = ft_lzw_stream_close;
+
+  Exit:
+    return error;
+  }
+
+
+#include "ftzopen.c"
+
+
+#else  /* !FT_CONFIG_OPTION_USE_LZW */
+
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Stream_OpenLZW( FT_Stream  stream,
+                     FT_Stream  source )
+  {
+    FT_UNUSED( stream );
+    FT_UNUSED( source );
+
+    return LZW_Err_Unimplemented_Feature;
+  }
+
+
+#endif /* !FT_CONFIG_OPTION_USE_LZW */
+
+
+/* END */
diff --git a/src/lzw/ftzopen.c b/src/lzw/ftzopen.c
new file mode 100644 (file)
index 0000000..d7a6457
--- /dev/null
@@ -0,0 +1,415 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftzopen.c                                                              */
+/*                                                                         */
+/*    FreeType support for .Z compressed files.                            */
+/*                                                                         */
+/*  This optional component relies on NetBSD's zopen().  It should mainly  */
+/*  be used to parse compressed PCF fonts, as found with many X11 server   */
+/*  distributions.                                                         */
+/*                                                                         */
+/*  Copyright 2005-2007, 2009, 2011 by David Turner.                       */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#include "ftzopen.h"
+#include FT_INTERNAL_MEMORY_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_DEBUG_H
+
+
+  static int
+  ft_lzwstate_refill( FT_LzwState  state )
+  {
+    FT_ULong  count;
+
+
+    if ( state->in_eof )
+      return -1;
+
+    count = FT_Stream_TryRead( state->source,
+                               state->buf_tab,
+                               state->num_bits );  /* WHY? */
+
+    state->buf_size   = (FT_UInt)count;
+    state->buf_total += count;
+    state->in_eof     = FT_BOOL( count < state->num_bits );
+    state->buf_offset = 0;
+    state->buf_size   = ( state->buf_size << 3 ) - ( state->num_bits - 1 );
+
+    if ( count == 0 )  /* end of file */
+      return -1;
+
+    return 0;
+  }
+
+
+  static FT_Int32
+  ft_lzwstate_get_code( FT_LzwState  state )
+  {
+    FT_UInt   num_bits = state->num_bits;
+    FT_Int    offset   = state->buf_offset;
+    FT_Byte*  p;
+    FT_Int    result;
+
+
+    if ( state->buf_clear                    ||
+         offset >= state->buf_size           ||
+         state->free_ent >= state->free_bits )
+    {
+      if ( state->free_ent >= state->free_bits )
+      {
+        state->num_bits  = ++num_bits;
+        state->free_bits = state->num_bits < state->max_bits
+                           ? (FT_UInt)( ( 1UL << num_bits ) - 256 )
+                           : state->max_free + 1;
+      }
+
+      if ( state->buf_clear )
+      {
+        state->num_bits  = num_bits = LZW_INIT_BITS;
+        state->free_bits = (FT_UInt)( ( 1UL << num_bits ) - 256 );
+        state->buf_clear = 0;
+      }
+
+      if ( ft_lzwstate_refill( state ) < 0 )
+        return -1;
+
+      offset = 0;
+    }
+
+    state->buf_offset = offset + num_bits;
+
+    p         = &state->buf_tab[offset >> 3];
+    offset   &= 7;
+    result    = *p++ >> offset;
+    offset    = 8 - offset;
+    num_bits -= offset;
+
+    if ( num_bits >= 8 )
+    {
+      result   |= *p++ << offset;
+      offset   += 8;
+      num_bits -= 8;
+    }
+    if ( num_bits > 0 )
+      result |= ( *p & LZW_MASK( num_bits ) ) << offset;
+
+    return result;
+  }
+
+
+  /* grow the character stack */
+  static int
+  ft_lzwstate_stack_grow( FT_LzwState  state )
+  {
+    if ( state->stack_top >= state->stack_size )
+    {
+      FT_Memory  memory = state->memory;
+      FT_Error   error;
+      FT_Offset  old_size = state->stack_size;
+      FT_Offset  new_size = old_size;
+
+      new_size = new_size + ( new_size >> 1 ) + 4;
+
+      if ( state->stack == state->stack_0 )
+      {
+        state->stack = NULL;
+        old_size     = 0;
+      }
+
+      /* requirement of the character stack larger than 1<<LZW_MAX_BITS */
+      /* implies bug in the decompression code                          */
+      if ( new_size > ( 1 << LZW_MAX_BITS ) )
+      {
+        new_size = 1 << LZW_MAX_BITS;
+        if ( new_size == old_size )
+          return -1;
+      }
+
+      if ( FT_RENEW_ARRAY( state->stack, old_size, new_size ) )
+        return -1;
+
+      state->stack_size = new_size;
+    }
+    return 0;
+  }
+
+
+  /* grow the prefix/suffix arrays */
+  static int
+  ft_lzwstate_prefix_grow( FT_LzwState  state )
+  {
+    FT_UInt    old_size = state->prefix_size;
+    FT_UInt    new_size = old_size;
+    FT_Memory  memory   = state->memory;
+    FT_Error   error;
+
+
+    if ( new_size == 0 )  /* first allocation -> 9 bits */
+      new_size = 512;
+    else
+      new_size += new_size >> 2;  /* don't grow too fast */
+
+    /*
+     *  Note that the `suffix' array is located in the same memory block
+     *  pointed to by `prefix'.
+     *
+     *  I know that sizeof(FT_Byte) == 1 by definition, but it is clearer
+     *  to write it literally.
+     *
+     */
+    if ( FT_REALLOC_MULT( state->prefix, old_size, new_size,
+                          sizeof ( FT_UShort ) + sizeof ( FT_Byte ) ) )
+      return -1;
+
+    /* now adjust `suffix' and move the data accordingly */
+    state->suffix = (FT_Byte*)( state->prefix + new_size );
+
+    FT_MEM_MOVE( state->suffix,
+                 state->prefix + old_size,
+                 old_size * sizeof ( FT_Byte ) );
+
+    state->prefix_size = new_size;
+    return 0;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  ft_lzwstate_reset( FT_LzwState  state )
+  {
+    state->in_eof     = 0;
+    state->buf_offset = 0;
+    state->buf_size   = 0;
+    state->buf_clear  = 0;
+    state->buf_total  = 0;
+    state->stack_top  = 0;
+    state->num_bits   = LZW_INIT_BITS;
+    state->phase      = FT_LZW_PHASE_START;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  ft_lzwstate_init( FT_LzwState  state,
+                    FT_Stream    source )
+  {
+    FT_ZERO( state );
+
+    state->source = source;
+    state->memory = source->memory;
+
+    state->prefix      = NULL;
+    state->suffix      = NULL;
+    state->prefix_size = 0;
+
+    state->stack      = state->stack_0;
+    state->stack_size = sizeof ( state->stack_0 );
+
+    ft_lzwstate_reset( state );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  ft_lzwstate_done( FT_LzwState  state )
+  {
+    FT_Memory  memory = state->memory;
+
+
+    ft_lzwstate_reset( state );
+
+    if ( state->stack != state->stack_0 )
+      FT_FREE( state->stack );
+
+    FT_FREE( state->prefix );
+    state->suffix = NULL;
+
+    FT_ZERO( state );
+  }
+
+
+#define FTLZW_STACK_PUSH( c )                        \
+  FT_BEGIN_STMNT                                     \
+    if ( state->stack_top >= state->stack_size &&    \
+         ft_lzwstate_stack_grow( state ) < 0   )     \
+      goto Eof;                                      \
+                                                     \
+    state->stack[state->stack_top++] = (FT_Byte)(c); \
+  FT_END_STMNT
+
+
+  FT_LOCAL_DEF( FT_ULong )
+  ft_lzwstate_io( FT_LzwState  state,
+                  FT_Byte*     buffer,
+                  FT_ULong     out_size )
+  {
+    FT_ULong  result = 0;
+
+    FT_UInt  old_char = state->old_char;
+    FT_UInt  old_code = state->old_code;
+    FT_UInt  in_code  = state->in_code;
+
+
+    if ( out_size == 0 )
+      goto Exit;
+
+    switch ( state->phase )
+    {
+    case FT_LZW_PHASE_START:
+      {
+        FT_Byte   max_bits;
+        FT_Int32  c;
+
+
+        /* skip magic bytes, and read max_bits + block_flag */
+        if ( FT_Stream_Seek( state->source, 2 ) != 0               ||
+             FT_Stream_TryRead( state->source, &max_bits, 1 ) != 1 )
+          goto Eof;
+
+        state->max_bits   = max_bits & LZW_BIT_MASK;
+        state->block_mode = max_bits & LZW_BLOCK_MASK;
+        state->max_free   = (FT_UInt)( ( 1UL << state->max_bits ) - 256 );
+
+        if ( state->max_bits > LZW_MAX_BITS )
+          goto Eof;
+
+        state->num_bits = LZW_INIT_BITS;
+        state->free_ent = ( state->block_mode ? LZW_FIRST
+                                              : LZW_CLEAR ) - 256;
+        in_code  = 0;
+
+        state->free_bits = state->num_bits < state->max_bits
+                           ? (FT_UInt)( ( 1UL << state->num_bits ) - 256 )
+                           : state->max_free + 1;
+
+        c = ft_lzwstate_get_code( state );
+        if ( c < 0 || c > 255 )
+          goto Eof;
+
+        old_code = old_char = (FT_UInt)c;
+
+        if ( buffer )
+          buffer[result] = (FT_Byte)old_char;
+
+        if ( ++result >= out_size )
+          goto Exit;
+
+        state->phase = FT_LZW_PHASE_CODE;
+      }
+      /* fall-through */
+
+    case FT_LZW_PHASE_CODE:
+      {
+        FT_Int32  c;
+        FT_UInt   code;
+
+
+      NextCode:
+        c = ft_lzwstate_get_code( state );
+        if ( c < 0 )
+          goto Eof;
+
+        code = (FT_UInt)c;
+
+        if ( code == LZW_CLEAR && state->block_mode )
+        {
+          /* why not LZW_FIRST-256 ? */
+          state->free_ent  = ( LZW_FIRST - 1 ) - 256;
+          state->buf_clear = 1;
+
+          /* not quite right, but at least more predictable */
+          old_code = 0;
+          old_char = 0;
+
+          goto NextCode;
+        }
+
+        in_code = code; /* save code for later */
+
+        if ( code >= 256U )
+        {
+          /* special case for KwKwKwK */
+          if ( code - 256U >= state->free_ent )
+          {
+            /* corrupted LZW stream */
+            if ( code - 256U > state->free_ent )
+              goto Eof;
+
+            FTLZW_STACK_PUSH( old_char );
+            code = old_code;
+          }
+
+          while ( code >= 256U )
+          {
+            if ( !state->prefix )
+              goto Eof;
+
+            FTLZW_STACK_PUSH( state->suffix[code - 256] );
+            code = state->prefix[code - 256];
+          }
+        }
+
+        old_char = code;
+        FTLZW_STACK_PUSH( old_char );
+
+        state->phase = FT_LZW_PHASE_STACK;
+      }
+      /* fall-through */
+
+    case FT_LZW_PHASE_STACK:
+      {
+        while ( state->stack_top > 0 )
+        {
+          --state->stack_top;
+
+          if ( buffer )
+            buffer[result] = state->stack[state->stack_top];
+
+          if ( ++result == out_size )
+            goto Exit;
+        }
+
+        /* now create new entry */
+        if ( state->free_ent < state->max_free )
+        {
+          if ( state->free_ent >= state->prefix_size &&
+               ft_lzwstate_prefix_grow( state ) < 0  )
+            goto Eof;
+
+          FT_ASSERT( state->free_ent < state->prefix_size );
+
+          state->prefix[state->free_ent] = (FT_UShort)old_code;
+          state->suffix[state->free_ent] = (FT_Byte)  old_char;
+
+          state->free_ent += 1;
+        }
+
+        old_code = in_code;
+
+        state->phase = FT_LZW_PHASE_CODE;
+        goto NextCode;
+      }
+
+    default:  /* state == EOF */
+      ;
+    }
+
+  Exit:
+    state->old_code = old_code;
+    state->old_char = old_char;
+    state->in_code  = in_code;
+
+    return result;
+
+  Eof:
+    state->phase = FT_LZW_PHASE_EOF;
+    goto Exit;
+  }
+
+
+/* END */
diff --git a/src/lzw/ftzopen.h b/src/lzw/ftzopen.h
new file mode 100644 (file)
index 0000000..f7d2936
--- /dev/null
@@ -0,0 +1,171 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftzopen.h                                                              */
+/*                                                                         */
+/*    FreeType support for .Z compressed files.                            */
+/*                                                                         */
+/*  This optional component relies on NetBSD's zopen().  It should mainly  */
+/*  be used to parse compressed PCF fonts, as found with many X11 server   */
+/*  distributions.                                                         */
+/*                                                                         */
+/*  Copyright 2005, 2006, 2007, 2008 by David Turner.                      */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#ifndef __FT_ZOPEN_H__
+#define __FT_ZOPEN_H__
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+
+  /*
+   *  This is a complete re-implementation of the LZW file reader,
+   *  since the old one was incredibly badly written, using
+   *  400 KByte of heap memory before decompressing anything.
+   *
+   */
+
+#define FT_LZW_IN_BUFF_SIZE        64
+#define FT_LZW_DEFAULT_STACK_SIZE  64
+
+#define LZW_INIT_BITS     9
+#define LZW_MAX_BITS      16
+
+#define LZW_CLEAR         256
+#define LZW_FIRST         257
+
+#define LZW_BIT_MASK      0x1f
+#define LZW_BLOCK_MASK    0x80
+#define LZW_MASK( n )     ( ( 1U << (n) ) - 1U )
+
+
+  typedef enum  FT_LzwPhase_
+  {
+    FT_LZW_PHASE_START = 0,
+    FT_LZW_PHASE_CODE,
+    FT_LZW_PHASE_STACK,
+    FT_LZW_PHASE_EOF
+
+  } FT_LzwPhase;
+
+
+  /*
+   *  state of LZW decompressor
+   *
+   *  small technical note
+   *  --------------------
+   *
+   *  We use a few tricks in this implementation that are explained here to
+   *  ease debugging and maintenance.
+   *
+   *  - First of all, the `prefix' and `suffix' arrays contain the suffix
+   *    and prefix for codes over 256; this means that
+   *
+   *      prefix_of(code) == state->prefix[code-256]
+   *      suffix_of(code) == state->suffix[code-256]
+   *
+   *    Each prefix is a 16-bit code, and each suffix an 8-bit byte.
+   *
+   *    Both arrays are stored in a single memory block, pointed to by
+   *    `state->prefix'.  This means that the following equality is always
+   *    true:
+   *
+   *      state->suffix == (FT_Byte*)(state->prefix + state->prefix_size)
+   *
+   *    Of course, state->prefix_size is the number of prefix/suffix slots
+   *    in the arrays, corresponding to codes 256..255+prefix_size.
+   *
+   *  - `free_ent' is the index of the next free entry in the `prefix'
+   *    and `suffix' arrays.  This means that the corresponding `next free
+   *    code' is really `256+free_ent'.
+   *
+   *    Moreover, `max_free' is the maximum value that `free_ent' can reach.
+   *
+   *    `max_free' corresponds to `(1 << max_bits) - 256'.  Note that this
+   *    value is always <= 0xFF00, which means that both `free_ent' and
+   *    `max_free' can be stored in an FT_UInt variable, even on 16-bit
+   *    machines.
+   *
+   *    If `free_ent == max_free', you cannot add new codes to the
+   *    prefix/suffix table.
+   *
+   *  - `num_bits' is the current number of code bits, starting at 9 and
+   *    growing each time `free_ent' reaches the value of `free_bits'.  The
+   *    latter is computed as follows
+   *
+   *      if num_bits < max_bits:
+   *         free_bits = (1 << num_bits)-256
+   *      else:
+   *         free_bits = max_free + 1
+   *
+   *    Since the value of `max_free + 1' can never be reached by
+   *    `free_ent', `num_bits' cannot grow larger than `max_bits'.
+   */
+
+  typedef struct  FT_LzwStateRec_
+  {
+    FT_LzwPhase  phase;
+    FT_Int       in_eof;
+
+    FT_Byte      buf_tab[16];
+    FT_Int       buf_offset;
+    FT_Int       buf_size;
+    FT_Bool      buf_clear;
+    FT_Offset    buf_total;
+
+    FT_UInt      max_bits;    /* max code bits, from file header   */
+    FT_Int       block_mode;  /* block mode flag, from file header */
+    FT_UInt      max_free;    /* (1 << max_bits) - 256             */
+
+    FT_UInt      num_bits;    /* current code bit number */
+    FT_UInt      free_ent;    /* index of next free entry */
+    FT_UInt      free_bits;   /* if reached by free_ent, increment num_bits */
+    FT_UInt      old_code;
+    FT_UInt      old_char;
+    FT_UInt      in_code;
+
+    FT_UShort*   prefix;      /* always dynamically allocated / reallocated */
+    FT_Byte*     suffix;      /* suffix = (FT_Byte*)(prefix + prefix_size)  */
+    FT_UInt      prefix_size; /* number of slots in `prefix' or `suffix'    */
+
+    FT_Byte*     stack;       /* character stack */
+    FT_UInt      stack_top;
+    FT_Offset    stack_size;
+    FT_Byte      stack_0[FT_LZW_DEFAULT_STACK_SIZE]; /* minimize heap alloc */
+
+    FT_Stream    source;      /* source stream */
+    FT_Memory    memory;
+
+  } FT_LzwStateRec, *FT_LzwState;
+
+
+  FT_LOCAL( void )
+  ft_lzwstate_init( FT_LzwState  state,
+                    FT_Stream    source );
+
+  FT_LOCAL( void )
+  ft_lzwstate_done( FT_LzwState  state );
+
+
+  FT_LOCAL( void )
+  ft_lzwstate_reset( FT_LzwState  state );
+
+
+  FT_LOCAL( FT_ULong )
+  ft_lzwstate_io( FT_LzwState  state,
+                  FT_Byte*     buffer,
+                  FT_ULong     out_size );
+
+/* */
+
+#endif /* __FT_ZOPEN_H__ */
+
+
+/* END */
diff --git a/src/lzw/rules.mk b/src/lzw/rules.mk
new file mode 100644 (file)
index 0000000..5550a48
--- /dev/null
@@ -0,0 +1,70 @@
+#
+# FreeType 2 LZW support configuration rules
+#
+
+
+# Copyright 2004, 2005, 2006 by
+# Albert Chin-A-Young.
+#
+# Based on src/lzw/rules.mk, Copyright 2002 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.
+
+
+# LZW driver directory
+#
+LZW_DIR := $(SRC_DIR)/lzw
+
+
+# compilation flags for the driver
+#
+LZW_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(LZW_DIR))
+
+
+# LZW support sources (i.e., C files)
+#
+LZW_DRV_SRC := $(LZW_DIR)/ftlzw.c
+
+# LZW support headers
+#
+LZW_DRV_H := $(LZW_DIR)/ftzopen.h \
+             $(LZW_DIR)/ftzopen.c
+
+
+# LZW driver object(s)
+#
+#   LZW_DRV_OBJ_M is used during `multi' builds
+#   LZW_DRV_OBJ_S is used during `single' builds
+#
+LZW_DRV_OBJ_M := $(OBJ_DIR)/ftlzw.$O
+LZW_DRV_OBJ_S := $(OBJ_DIR)/ftlzw.$O
+
+# LZW support source file for single build
+#
+LZW_DRV_SRC_S := $(LZW_DIR)/ftlzw.c
+
+
+# LZW support - single object
+#
+$(LZW_DRV_OBJ_S): $(LZW_DRV_SRC_S) $(LZW_DRV_SRC) $(FREETYPE_H) $(LZW_DRV_H)
+       $(LZW_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(LZW_DRV_SRC_S))
+
+
+# LZW support - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(LZW_DIR)/%.c $(FREETYPE_H) $(LZW_DRV_H)
+       $(LZW_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(LZW_DRV_OBJ_S)
+DRV_OBJS_M += $(LZW_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/otvalid/Jamfile b/src/otvalid/Jamfile
new file mode 100644 (file)
index 0000000..b457143
--- /dev/null
@@ -0,0 +1,29 @@
+# FreeType 2 src/otvalid Jamfile
+#
+# Copyright 2004 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) otvalid ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = otvbase otvcommn otvgdef otvgpos otvgsub otvjstf otvmod otvmath ;
+  }
+  else
+  {
+    _sources = otvalid ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/otvalid Jamfile
diff --git a/src/otvalid/module.mk b/src/otvalid/module.mk
new file mode 100644 (file)
index 0000000..9cadde5
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# FreeType 2 otvalid module definition
+#
+
+
+# Copyright 2004, 2006 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.
+
+
+FTMODULE_H_COMMANDS += OTVALID_MODULE
+
+define OTVALID_MODULE
+$(OPEN_DRIVER) FT_Module_Class, otv_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)otvalid   $(ECHO_DRIVER_DESC)OpenType validation module$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/src/otvalid/otvalid.c b/src/otvalid/otvalid.c
new file mode 100644 (file)
index 0000000..d5c2b75
--- /dev/null
@@ -0,0 +1,31 @@
+/***************************************************************************/
+/*                                                                         */
+/*  otvalid.c                                                              */
+/*                                                                         */
+/*    FreeType validator for OpenType tables (body only).                  */
+/*                                                                         */
+/*  Copyright 2004, 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include <ft2build.h>
+
+#include "otvbase.c"
+#include "otvcommn.c"
+#include "otvgdef.c"
+#include "otvgpos.c"
+#include "otvgsub.c"
+#include "otvjstf.c"
+#include "otvmath.c"
+#include "otvmod.c"
+
+/* END */
diff --git a/src/otvalid/otvalid.h b/src/otvalid/otvalid.h
new file mode 100644 (file)
index 0000000..eb99b9c
--- /dev/null
@@ -0,0 +1,78 @@
+/***************************************************************************/
+/*                                                                         */
+/*  otvalid.h                                                              */
+/*                                                                         */
+/*    OpenType table validation (specification only).                      */
+/*                                                                         */
+/*  Copyright 2004, 2008 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __OTVALID_H__
+#define __OTVALID_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+#include "otverror.h"           /* must come before FT_INTERNAL_VALIDATE_H */
+
+#include FT_INTERNAL_VALIDATE_H
+#include FT_INTERNAL_STREAM_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( void )
+  otv_BASE_validate( FT_Bytes      table,
+                     FT_Validator  valid );
+
+  /* GSUB and GPOS tables should already be validated; */
+  /* if missing, set corresponding argument to 0       */
+  FT_LOCAL( void )
+  otv_GDEF_validate( FT_Bytes      table,
+                     FT_Bytes      gsub,
+                     FT_Bytes      gpos,
+                     FT_UInt       glyph_count,
+                     FT_Validator  valid );
+
+  FT_LOCAL( void )
+  otv_GPOS_validate( FT_Bytes      table,
+                     FT_UInt       glyph_count,
+                     FT_Validator  valid );
+
+  FT_LOCAL( void )
+  otv_GSUB_validate( FT_Bytes      table,
+                     FT_UInt       glyph_count,
+                     FT_Validator  valid );
+
+  /* GSUB and GPOS tables should already be validated; */
+  /* if missing, set corresponding argument to 0       */
+  FT_LOCAL( void )
+  otv_JSTF_validate( FT_Bytes      table,
+                     FT_Bytes      gsub,
+                     FT_Bytes      gpos,
+                     FT_UInt       glyph_count,
+                     FT_Validator  valid );
+
+  FT_LOCAL( void )
+  otv_MATH_validate( FT_Bytes      table,
+                     FT_UInt       glyph_count,
+                     FT_Validator  ftvalid );
+
+
+FT_END_HEADER
+
+#endif /* __OTVALID_H__ */
+
+
+/* END */
diff --git a/src/otvalid/otvbase.c b/src/otvalid/otvbase.c
new file mode 100644 (file)
index 0000000..d742d2d
--- /dev/null
@@ -0,0 +1,318 @@
+/***************************************************************************/
+/*                                                                         */
+/*  otvbase.c                                                              */
+/*                                                                         */
+/*    OpenType BASE table validation (body).                               */
+/*                                                                         */
+/*  Copyright 2004, 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "otvalid.h"
+#include "otvcommn.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_otvbase
+
+
+  static void
+  otv_BaseCoord_validate( FT_Bytes       table,
+                          OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   BaseCoordFormat;
+
+
+    OTV_NAME_ENTER( "BaseCoord" );
+
+    OTV_LIMIT_CHECK( 4 );
+    BaseCoordFormat = FT_NEXT_USHORT( p );
+    p += 2;     /* skip Coordinate */
+
+    OTV_TRACE(( " (format %d)\n", BaseCoordFormat ));
+
+    switch ( BaseCoordFormat )
+    {
+    case 1:     /* BaseCoordFormat1 */
+      break;
+
+    case 2:     /* BaseCoordFormat2 */
+      OTV_LIMIT_CHECK( 4 );   /* ReferenceGlyph, BaseCoordPoint */
+      break;
+
+    case 3:     /* BaseCoordFormat3 */
+      OTV_LIMIT_CHECK( 2 );
+      /* DeviceTable */
+      otv_Device_validate( table + FT_NEXT_USHORT( p ), valid );
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  static void
+  otv_BaseTagList_validate( FT_Bytes       table,
+                            OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   BaseTagCount;
+
+
+    OTV_NAME_ENTER( "BaseTagList" );
+
+    OTV_LIMIT_CHECK( 2 );
+
+    BaseTagCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (BaseTagCount = %d)\n", BaseTagCount ));
+
+    OTV_LIMIT_CHECK( BaseTagCount * 4 );          /* BaselineTag */
+
+    OTV_EXIT;
+  }
+
+
+  static void
+  otv_BaseValues_validate( FT_Bytes       table,
+                           OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   BaseCoordCount;
+
+
+    OTV_NAME_ENTER( "BaseValues" );
+
+    OTV_LIMIT_CHECK( 4 );
+
+    p             += 2;                     /* skip DefaultIndex */
+    BaseCoordCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (BaseCoordCount = %d)\n", BaseCoordCount ));
+
+    OTV_LIMIT_CHECK( BaseCoordCount * 2 );
+
+    /* BaseCoord */
+    for ( ; BaseCoordCount > 0; BaseCoordCount-- )
+      otv_BaseCoord_validate( table + FT_NEXT_USHORT( p ), valid );
+
+    OTV_EXIT;
+  }
+
+
+  static void
+  otv_MinMax_validate( FT_Bytes       table,
+                       OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   table_size;
+    FT_UInt   FeatMinMaxCount;
+
+    OTV_OPTIONAL_TABLE( MinCoord );
+    OTV_OPTIONAL_TABLE( MaxCoord );
+
+
+    OTV_NAME_ENTER( "MinMax" );
+
+    OTV_LIMIT_CHECK( 6 );
+
+    OTV_OPTIONAL_OFFSET( MinCoord );
+    OTV_OPTIONAL_OFFSET( MaxCoord );
+    FeatMinMaxCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (FeatMinMaxCount = %d)\n", FeatMinMaxCount ));
+
+    table_size = FeatMinMaxCount * 8 + 6;
+
+    OTV_SIZE_CHECK( MinCoord );
+    if ( MinCoord )
+      otv_BaseCoord_validate( table + MinCoord, valid );
+
+    OTV_SIZE_CHECK( MaxCoord );
+    if ( MaxCoord )
+      otv_BaseCoord_validate( table + MaxCoord, valid );
+
+    OTV_LIMIT_CHECK( FeatMinMaxCount * 8 );
+
+    /* FeatMinMaxRecord */
+    for ( ; FeatMinMaxCount > 0; FeatMinMaxCount-- )
+    {
+      p += 4;                           /* skip FeatureTableTag */
+
+      OTV_OPTIONAL_OFFSET( MinCoord );
+      OTV_OPTIONAL_OFFSET( MaxCoord );
+
+      OTV_SIZE_CHECK( MinCoord );
+      if ( MinCoord )
+        otv_BaseCoord_validate( table + MinCoord, valid );
+
+      OTV_SIZE_CHECK( MaxCoord );
+      if ( MaxCoord )
+        otv_BaseCoord_validate( table + MaxCoord, valid );
+    }
+
+    OTV_EXIT;
+  }
+
+
+  static void
+  otv_BaseScript_validate( FT_Bytes       table,
+                           OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   table_size;
+    FT_UInt   BaseLangSysCount;
+
+    OTV_OPTIONAL_TABLE( BaseValues    );
+    OTV_OPTIONAL_TABLE( DefaultMinMax );
+
+
+    OTV_NAME_ENTER( "BaseScript" );
+
+    OTV_LIMIT_CHECK( 6 );
+    OTV_OPTIONAL_OFFSET( BaseValues    );
+    OTV_OPTIONAL_OFFSET( DefaultMinMax );
+    BaseLangSysCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (BaseLangSysCount = %d)\n", BaseLangSysCount ));
+
+    table_size = BaseLangSysCount * 6 + 6;
+
+    OTV_SIZE_CHECK( BaseValues );
+    if ( BaseValues )
+      otv_BaseValues_validate( table + BaseValues, valid );
+
+    OTV_SIZE_CHECK( DefaultMinMax );
+    if ( DefaultMinMax )
+      otv_MinMax_validate( table + DefaultMinMax, valid );
+
+    OTV_LIMIT_CHECK( BaseLangSysCount * 6 );
+
+    /* BaseLangSysRecord */
+    for ( ; BaseLangSysCount > 0; BaseLangSysCount-- )
+    {
+      p += 4;       /* skip BaseLangSysTag */
+
+      otv_MinMax_validate( table + FT_NEXT_USHORT( p ), valid );
+    }
+
+    OTV_EXIT;
+  }
+
+
+  static void
+  otv_BaseScriptList_validate( FT_Bytes       table,
+                               OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   BaseScriptCount;
+
+
+    OTV_NAME_ENTER( "BaseScriptList" );
+
+    OTV_LIMIT_CHECK( 2 );
+    BaseScriptCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (BaseScriptCount = %d)\n", BaseScriptCount ));
+
+    OTV_LIMIT_CHECK( BaseScriptCount * 6 );
+
+    /* BaseScriptRecord */
+    for ( ; BaseScriptCount > 0; BaseScriptCount-- )
+    {
+      p += 4;       /* skip BaseScriptTag */
+
+      /* BaseScript */
+      otv_BaseScript_validate( table + FT_NEXT_USHORT( p ), valid );
+    }
+
+    OTV_EXIT;
+  }
+
+
+  static void
+  otv_Axis_validate( FT_Bytes       table,
+                     OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   table_size;
+
+    OTV_OPTIONAL_TABLE( BaseTagList );
+
+
+    OTV_NAME_ENTER( "Axis" );
+
+    OTV_LIMIT_CHECK( 4 );
+    OTV_OPTIONAL_OFFSET( BaseTagList );
+
+    table_size = 4;
+
+    OTV_SIZE_CHECK( BaseTagList );
+    if ( BaseTagList )
+      otv_BaseTagList_validate( table + BaseTagList, valid );
+
+    /* BaseScriptList */
+    otv_BaseScriptList_validate( table + FT_NEXT_USHORT( p ), valid );
+
+    OTV_EXIT;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  otv_BASE_validate( FT_Bytes      table,
+                     FT_Validator  ftvalid )
+  {
+    OTV_ValidatorRec  validrec;
+    OTV_Validator     valid = &validrec;
+    FT_Bytes          p     = table;
+    FT_UInt           table_size;
+
+    OTV_OPTIONAL_TABLE( HorizAxis );
+    OTV_OPTIONAL_TABLE( VertAxis  );
+
+
+    valid->root = ftvalid;
+
+    FT_TRACE3(( "validating BASE table\n" ));
+    OTV_INIT;
+
+    OTV_LIMIT_CHECK( 6 );
+
+    if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */
+      FT_INVALID_FORMAT;
+
+    table_size = 6;
+
+    OTV_OPTIONAL_OFFSET( HorizAxis );
+    OTV_SIZE_CHECK( HorizAxis );
+    if ( HorizAxis )
+      otv_Axis_validate( table + HorizAxis, valid );
+
+    OTV_OPTIONAL_OFFSET( VertAxis );
+    OTV_SIZE_CHECK( VertAxis );
+    if ( VertAxis )
+      otv_Axis_validate( table + VertAxis, valid );
+
+    FT_TRACE4(( "\n" ));
+  }
+
+
+/* END */
diff --git a/src/otvalid/otvcommn.c b/src/otvalid/otvcommn.c
new file mode 100644 (file)
index 0000000..a4f885b
--- /dev/null
@@ -0,0 +1,1086 @@
+/***************************************************************************/
+/*                                                                         */
+/*  otvcommn.c                                                             */
+/*                                                                         */
+/*    OpenType common tables validation (body).                            */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2006, 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "otvcommn.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_otvcommon
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       COVERAGE TABLE                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  otv_Coverage_validate( FT_Bytes       table,
+                         OTV_Validator  valid,
+                         FT_Int         expected_count )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   CoverageFormat;
+    FT_UInt   total = 0;
+
+
+    OTV_NAME_ENTER( "Coverage" );
+
+    OTV_LIMIT_CHECK( 4 );
+    CoverageFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", CoverageFormat ));
+
+    switch ( CoverageFormat )
+    {
+    case 1:     /* CoverageFormat1 */
+      {
+        FT_UInt  GlyphCount;
+        FT_UInt  i;
+
+
+        GlyphCount = FT_NEXT_USHORT( p );
+
+        OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount ));
+
+        OTV_LIMIT_CHECK( GlyphCount * 2 );        /* GlyphArray */
+
+        for ( i = 0; i < GlyphCount; ++i )
+        {
+          FT_UInt  gid;
+
+
+          gid = FT_NEXT_USHORT( p );
+          if ( gid >= valid->glyph_count )
+            FT_INVALID_GLYPH_ID;
+        }
+
+        total = GlyphCount;
+      }
+      break;
+
+    case 2:     /* CoverageFormat2 */
+      {
+        FT_UInt  n, RangeCount;
+        FT_UInt  Start, End, StartCoverageIndex, last = 0;
+
+
+        RangeCount = FT_NEXT_USHORT( p );
+
+        OTV_TRACE(( " (RangeCount = %d)\n", RangeCount ));
+
+        OTV_LIMIT_CHECK( RangeCount * 6 );
+
+        /* RangeRecord */
+        for ( n = 0; n < RangeCount; n++ )
+        {
+          Start              = FT_NEXT_USHORT( p );
+          End                = FT_NEXT_USHORT( p );
+          StartCoverageIndex = FT_NEXT_USHORT( p );
+
+          if ( Start > End || StartCoverageIndex != total )
+            FT_INVALID_DATA;
+
+          if ( End >= valid->glyph_count )
+            FT_INVALID_GLYPH_ID;
+
+          if ( n > 0 && Start <= last )
+            FT_INVALID_DATA;
+
+          total += End - Start + 1;
+          last   = End;
+        }
+      }
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    /* Generally, a coverage table offset has an associated count field.  */
+    /* The number of glyphs in the table should match this field.  If     */
+    /* there is no associated count, a value of -1 tells us not to check. */
+    if ( expected_count != -1 && (FT_UInt)expected_count != total )
+      FT_INVALID_DATA;
+
+    OTV_EXIT;
+  }
+
+
+  FT_LOCAL_DEF( FT_UInt )
+  otv_Coverage_get_first( FT_Bytes  table )
+  {
+    FT_Bytes  p = table;
+
+
+    p += 4;     /* skip CoverageFormat and Glyph/RangeCount */
+
+    return FT_NEXT_USHORT( p );
+  }
+
+
+  FT_LOCAL_DEF( FT_UInt )
+  otv_Coverage_get_last( FT_Bytes  table )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   CoverageFormat = FT_NEXT_USHORT( p );
+    FT_UInt   count          = FT_NEXT_USHORT( p );     /* Glyph/RangeCount */
+    FT_UInt   result = 0;
+
+
+    switch ( CoverageFormat )
+    {
+    case 1:
+      p += ( count - 1 ) * 2;
+      result = FT_NEXT_USHORT( p );
+      break;
+
+    case 2:
+      p += ( count - 1 ) * 6 + 2;
+      result = FT_NEXT_USHORT( p );
+      break;
+
+    default:
+      ;
+    }
+
+    return result;
+  }
+
+
+  FT_LOCAL_DEF( FT_UInt )
+  otv_Coverage_get_count( FT_Bytes  table )
+  {
+    FT_Bytes  p              = table;
+    FT_UInt   CoverageFormat = FT_NEXT_USHORT( p );
+    FT_UInt   count          = FT_NEXT_USHORT( p );     /* Glyph/RangeCount */
+    FT_UInt   result         = 0;
+
+
+    switch ( CoverageFormat )
+    {
+    case 1:
+      return count;
+
+    case 2:
+      {
+        FT_UInt  Start, End;
+
+
+        for ( ; count > 0; count-- )
+        {
+          Start = FT_NEXT_USHORT( p );
+          End   = FT_NEXT_USHORT( p );
+          p    += 2;                    /* skip StartCoverageIndex */
+
+          result += End - Start + 1;
+        }
+      }
+      break;
+
+    default:
+      ;
+    }
+
+    return result;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                   CLASS DEFINITION TABLE                      *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  otv_ClassDef_validate( FT_Bytes       table,
+                         OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   ClassFormat;
+
+
+    OTV_NAME_ENTER( "ClassDef" );
+
+    OTV_LIMIT_CHECK( 4 );
+    ClassFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", ClassFormat ));
+
+    switch ( ClassFormat )
+    {
+    case 1:     /* ClassDefFormat1 */
+      {
+        FT_UInt  StartGlyph;
+        FT_UInt  GlyphCount;
+
+
+        OTV_LIMIT_CHECK( 4 );
+
+        StartGlyph = FT_NEXT_USHORT( p );
+        GlyphCount = FT_NEXT_USHORT( p );
+
+        OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount ));
+
+        OTV_LIMIT_CHECK( GlyphCount * 2 );    /* ClassValueArray */
+
+        if ( StartGlyph + GlyphCount - 1 >= valid->glyph_count )
+          FT_INVALID_GLYPH_ID;
+      }
+      break;
+
+    case 2:     /* ClassDefFormat2 */
+      {
+        FT_UInt  n, ClassRangeCount;
+        FT_UInt  Start, End, last = 0;
+
+
+        ClassRangeCount = FT_NEXT_USHORT( p );
+
+        OTV_TRACE(( " (ClassRangeCount = %d)\n", ClassRangeCount ));
+
+        OTV_LIMIT_CHECK( ClassRangeCount * 6 );
+
+        /* ClassRangeRecord */
+        for ( n = 0; n < ClassRangeCount; n++ )
+        {
+          Start = FT_NEXT_USHORT( p );
+          End   = FT_NEXT_USHORT( p );
+          p    += 2;                        /* skip Class */
+
+          if ( Start > End || ( n > 0 && Start <= last ) )
+            FT_INVALID_DATA;
+
+          if ( End >= valid->glyph_count )
+            FT_INVALID_GLYPH_ID;
+
+          last = End;
+        }
+      }
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    /* no need to check glyph indices used as input to class definition   */
+    /* tables since even invalid glyph indices return a meaningful result */
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      DEVICE TABLE                             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  otv_Device_validate( FT_Bytes       table,
+                       OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   StartSize, EndSize, DeltaFormat, count;
+
+
+    OTV_NAME_ENTER( "Device" );
+
+    OTV_LIMIT_CHECK( 8 );
+    StartSize   = FT_NEXT_USHORT( p );
+    EndSize     = FT_NEXT_USHORT( p );
+    DeltaFormat = FT_NEXT_USHORT( p );
+
+    if ( DeltaFormat < 1 || DeltaFormat > 3 )
+      FT_INVALID_FORMAT;
+
+    if ( EndSize < StartSize )
+      FT_INVALID_DATA;
+
+    count = EndSize - StartSize + 1;
+    OTV_LIMIT_CHECK( ( 1 << DeltaFormat ) * count / 8 );  /* DeltaValue */
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         LOOKUPS                               *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* uses valid->type_count */
+  /* uses valid->type_funcs */
+
+  FT_LOCAL_DEF( void )
+  otv_Lookup_validate( FT_Bytes       table,
+                       OTV_Validator  valid )
+  {
+    FT_Bytes           p = table;
+    FT_UInt            LookupType, SubTableCount;
+    OTV_Validate_Func  validate;
+
+
+    OTV_NAME_ENTER( "Lookup" );
+
+    OTV_LIMIT_CHECK( 6 );
+    LookupType    = FT_NEXT_USHORT( p );
+    p            += 2;                      /* skip LookupFlag */
+    SubTableCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (type %d)\n", LookupType ));
+
+    if ( LookupType == 0 || LookupType > valid->type_count )
+      FT_INVALID_DATA;
+
+    validate = valid->type_funcs[LookupType - 1];
+
+    OTV_TRACE(( " (SubTableCount = %d)\n", SubTableCount ));
+
+    OTV_LIMIT_CHECK( SubTableCount * 2 );
+
+    /* SubTable */
+    for ( ; SubTableCount > 0; SubTableCount-- )
+      validate( table + FT_NEXT_USHORT( p ), valid );
+
+    OTV_EXIT;
+  }
+
+
+  /* uses valid->lookup_count */
+
+  FT_LOCAL_DEF( void )
+  otv_LookupList_validate( FT_Bytes       table,
+                           OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   LookupCount;
+
+
+    OTV_NAME_ENTER( "LookupList" );
+
+    OTV_LIMIT_CHECK( 2 );
+    LookupCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (LookupCount = %d)\n", LookupCount ));
+
+    OTV_LIMIT_CHECK( LookupCount * 2 );
+
+    valid->lookup_count = LookupCount;
+
+    /* Lookup */
+    for ( ; LookupCount > 0; LookupCount-- )
+      otv_Lookup_validate( table + FT_NEXT_USHORT( p ), valid );
+
+    OTV_EXIT;
+  }
+
+
+  static FT_UInt
+  otv_LookupList_get_count( FT_Bytes  table )
+  {
+    return FT_NEXT_USHORT( table );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                        FEATURES                               *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* uses valid->lookup_count */
+
+  FT_LOCAL_DEF( void )
+  otv_Feature_validate( FT_Bytes       table,
+                        OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   LookupCount;
+
+
+    OTV_NAME_ENTER( "Feature" );
+
+    OTV_LIMIT_CHECK( 4 );
+    p           += 2;                   /* skip FeatureParams (unused) */
+    LookupCount  = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (LookupCount = %d)\n", LookupCount ));
+
+    OTV_LIMIT_CHECK( LookupCount * 2 );
+
+    /* LookupListIndex */
+    for ( ; LookupCount > 0; LookupCount-- )
+      if ( FT_NEXT_USHORT( p ) >= valid->lookup_count )
+        FT_INVALID_DATA;
+
+    OTV_EXIT;
+  }
+
+
+  static FT_UInt
+  otv_Feature_get_count( FT_Bytes  table )
+  {
+    return FT_NEXT_USHORT( table );
+  }
+
+
+  /* sets valid->lookup_count */
+
+  FT_LOCAL_DEF( void )
+  otv_FeatureList_validate( FT_Bytes       table,
+                            FT_Bytes       lookups,
+                            OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   FeatureCount;
+
+
+    OTV_NAME_ENTER( "FeatureList" );
+
+    OTV_LIMIT_CHECK( 2 );
+    FeatureCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (FeatureCount = %d)\n", FeatureCount ));
+
+    OTV_LIMIT_CHECK( FeatureCount * 2 );
+
+    valid->lookup_count = otv_LookupList_get_count( lookups );
+
+    /* FeatureRecord */
+    for ( ; FeatureCount > 0; FeatureCount-- )
+    {
+      p += 4;       /* skip FeatureTag */
+
+      /* Feature */
+      otv_Feature_validate( table + FT_NEXT_USHORT( p ), valid );
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       LANGUAGE SYSTEM                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* uses valid->extra1 (number of features) */
+
+  FT_LOCAL_DEF( void )
+  otv_LangSys_validate( FT_Bytes       table,
+                        OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   ReqFeatureIndex;
+    FT_UInt   FeatureCount;
+
+
+    OTV_NAME_ENTER( "LangSys" );
+
+    OTV_LIMIT_CHECK( 6 );
+    p              += 2;                    /* skip LookupOrder (unused) */
+    ReqFeatureIndex = FT_NEXT_USHORT( p );
+    FeatureCount    = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (ReqFeatureIndex = %d)\n", ReqFeatureIndex ));
+    OTV_TRACE(( " (FeatureCount = %d)\n",    FeatureCount    ));
+
+    if ( ReqFeatureIndex != 0xFFFFU && ReqFeatureIndex >= valid->extra1 )
+      FT_INVALID_DATA;
+
+    OTV_LIMIT_CHECK( FeatureCount * 2 );
+
+    /* FeatureIndex */
+    for ( ; FeatureCount > 0; FeatureCount-- )
+      if ( FT_NEXT_USHORT( p ) >= valid->extra1 )
+        FT_INVALID_DATA;
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                           SCRIPTS                             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  otv_Script_validate( FT_Bytes       table,
+                       OTV_Validator  valid )
+  {
+    FT_UInt   DefaultLangSys, LangSysCount;
+    FT_Bytes  p = table;
+
+
+    OTV_NAME_ENTER( "Script" );
+
+    OTV_LIMIT_CHECK( 4 );
+    DefaultLangSys = FT_NEXT_USHORT( p );
+    LangSysCount   = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (LangSysCount = %d)\n", LangSysCount ));
+
+    if ( DefaultLangSys != 0 )
+      otv_LangSys_validate( table + DefaultLangSys, valid );
+
+    OTV_LIMIT_CHECK( LangSysCount * 6 );
+
+    /* LangSysRecord */
+    for ( ; LangSysCount > 0; LangSysCount-- )
+    {
+      p += 4;       /* skip LangSysTag */
+
+      /* LangSys */
+      otv_LangSys_validate( table + FT_NEXT_USHORT( p ), valid );
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /* sets valid->extra1 (number of features) */
+
+  FT_LOCAL_DEF( void )
+  otv_ScriptList_validate( FT_Bytes       table,
+                           FT_Bytes       features,
+                           OTV_Validator  valid )
+  {
+    FT_UInt   ScriptCount;
+    FT_Bytes  p = table;
+
+
+    OTV_NAME_ENTER( "ScriptList" );
+
+    OTV_LIMIT_CHECK( 2 );
+    ScriptCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (ScriptCount = %d)\n", ScriptCount ));
+
+    OTV_LIMIT_CHECK( ScriptCount * 6 );
+
+    valid->extra1 = otv_Feature_get_count( features );
+
+    /* ScriptRecord */
+    for ( ; ScriptCount > 0; ScriptCount-- )
+    {
+      p += 4;       /* skip ScriptTag */
+
+      otv_Script_validate( table + FT_NEXT_USHORT( p ), valid ); /* Script */
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      UTILITY FUNCTIONS                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*
+     u:   uint16
+     ux:  unit16 [x]
+
+     s:   struct
+     sx:  struct [x]
+     sxy: struct [x], using external y count
+
+     x:   uint16 x
+
+     C:   Coverage
+
+     O:   Offset
+     On:  Offset (NULL)
+     Ox:  Offset [x]
+     Onx: Offset (NULL) [x]
+  */
+
+  FT_LOCAL_DEF( void )
+  otv_x_Ox( FT_Bytes       table,
+            OTV_Validator  valid )
+  {
+    FT_Bytes           p = table;
+    FT_UInt            Count;
+    OTV_Validate_Func  func;
+
+
+    OTV_ENTER;
+
+    OTV_LIMIT_CHECK( 2 );
+    Count = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (Count = %d)\n", Count ));
+
+    OTV_LIMIT_CHECK( Count * 2 );
+
+    valid->nesting_level++;
+    func = valid->func[valid->nesting_level];
+
+    for ( ; Count > 0; Count-- )
+      func( table + FT_NEXT_USHORT( p ), valid );
+
+    valid->nesting_level--;
+
+    OTV_EXIT;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  otv_u_C_x_Ox( FT_Bytes       table,
+                OTV_Validator  valid )
+  {
+    FT_Bytes           p = table;
+    FT_UInt            Count, Coverage;
+    OTV_Validate_Func  func;
+
+
+    OTV_ENTER;
+
+    p += 2;     /* skip Format */
+
+    OTV_LIMIT_CHECK( 4 );
+    Coverage = FT_NEXT_USHORT( p );
+    Count    = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (Count = %d)\n", Count ));
+
+    otv_Coverage_validate( table + Coverage, valid, Count );
+
+    OTV_LIMIT_CHECK( Count * 2 );
+
+    valid->nesting_level++;
+    func = valid->func[valid->nesting_level];
+
+    for ( ; Count > 0; Count-- )
+      func( table + FT_NEXT_USHORT( p ), valid );
+
+    valid->nesting_level--;
+
+    OTV_EXIT;
+  }
+
+
+  /* uses valid->extra1 (if > 0: array value limit) */
+
+  FT_LOCAL_DEF( void )
+  otv_x_ux( FT_Bytes       table,
+            OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   Count;
+
+
+    OTV_ENTER;
+
+    OTV_LIMIT_CHECK( 2 );
+    Count = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (Count = %d)\n", Count ));
+
+    OTV_LIMIT_CHECK( Count * 2 );
+
+    if ( valid->extra1 )
+    {
+      for ( ; Count > 0; Count-- )
+        if ( FT_NEXT_USHORT( p ) >= valid->extra1 )
+          FT_INVALID_DATA;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /* `ux' in the function's name is not really correct since only x-1 */
+  /* elements are tested                                              */
+
+  /* uses valid->extra1 (array value limit) */
+
+  FT_LOCAL_DEF( void )
+  otv_x_y_ux_sy( FT_Bytes       table,
+                 OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   Count1, Count2;
+
+
+    OTV_ENTER;
+
+    OTV_LIMIT_CHECK( 4 );
+    Count1 = FT_NEXT_USHORT( p );
+    Count2 = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (Count1 = %d)\n", Count1 ));
+    OTV_TRACE(( " (Count2 = %d)\n", Count2 ));
+
+    if ( Count1 == 0 )
+      FT_INVALID_DATA;
+
+    OTV_LIMIT_CHECK( ( Count1 - 1 ) * 2 + Count2 * 4 );
+    p += ( Count1 - 1 ) * 2;
+
+    for ( ; Count2 > 0; Count2-- )
+    {
+      if ( FT_NEXT_USHORT( p ) >= Count1 )
+        FT_INVALID_DATA;
+
+      if ( FT_NEXT_USHORT( p ) >= valid->extra1 )
+        FT_INVALID_DATA;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /* `uy' in the function's name is not really correct since only y-1 */
+  /* elements are tested                                              */
+
+  /* uses valid->extra1 (array value limit) */
+
+  FT_LOCAL_DEF( void )
+  otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes       table,
+                           OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   BacktrackCount, InputCount, LookaheadCount;
+    FT_UInt   Count;
+
+
+    OTV_ENTER;
+
+    OTV_LIMIT_CHECK( 2 );
+    BacktrackCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (BacktrackCount = %d)\n", BacktrackCount ));
+
+    OTV_LIMIT_CHECK( BacktrackCount * 2 + 2 );
+    p += BacktrackCount * 2;
+
+    InputCount = FT_NEXT_USHORT( p );
+    if ( InputCount == 0 )
+      FT_INVALID_DATA;
+
+    OTV_TRACE(( " (InputCount = %d)\n", InputCount ));
+
+    OTV_LIMIT_CHECK( InputCount * 2 );
+    p += ( InputCount - 1 ) * 2;
+
+    LookaheadCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (LookaheadCount = %d)\n", LookaheadCount ));
+
+    OTV_LIMIT_CHECK( LookaheadCount * 2 + 2 );
+    p += LookaheadCount * 2;
+
+    Count = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (Count = %d)\n", Count ));
+
+    OTV_LIMIT_CHECK( Count * 4 );
+
+    for ( ; Count > 0; Count-- )
+    {
+      if ( FT_NEXT_USHORT( p ) >= InputCount )
+        FT_INVALID_DATA;
+
+      if ( FT_NEXT_USHORT( p ) >= valid->extra1 )
+        FT_INVALID_DATA;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /* sets valid->extra1 (valid->lookup_count) */
+
+  FT_LOCAL_DEF( void )
+  otv_u_O_O_x_Onx( FT_Bytes       table,
+                   OTV_Validator  valid )
+  {
+    FT_Bytes           p = table;
+    FT_UInt            Coverage, ClassDef, ClassSetCount;
+    OTV_Validate_Func  func;
+
+
+    OTV_ENTER;
+
+    p += 2;     /* skip Format */
+
+    OTV_LIMIT_CHECK( 6 );
+    Coverage      = FT_NEXT_USHORT( p );
+    ClassDef      = FT_NEXT_USHORT( p );
+    ClassSetCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (ClassSetCount = %d)\n", ClassSetCount ));
+
+    otv_Coverage_validate( table + Coverage, valid, -1 );
+    otv_ClassDef_validate( table + ClassDef, valid );
+
+    OTV_LIMIT_CHECK( ClassSetCount * 2 );
+
+    valid->nesting_level++;
+    func          = valid->func[valid->nesting_level];
+    valid->extra1 = valid->lookup_count;
+
+    for ( ; ClassSetCount > 0; ClassSetCount-- )
+    {
+      FT_UInt  offset = FT_NEXT_USHORT( p );
+
+
+      if ( offset )
+        func( table + offset, valid );
+    }
+
+    valid->nesting_level--;
+
+    OTV_EXIT;
+  }
+
+
+  /* uses valid->lookup_count */
+
+  FT_LOCAL_DEF( void )
+  otv_u_x_y_Ox_sy( FT_Bytes       table,
+                   OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   GlyphCount, Count, count1;
+
+
+    OTV_ENTER;
+
+    p += 2;     /* skip Format */
+
+    OTV_LIMIT_CHECK( 4 );
+    GlyphCount = FT_NEXT_USHORT( p );
+    Count      = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount ));
+    OTV_TRACE(( " (Count = %d)\n",      Count      ));
+
+    OTV_LIMIT_CHECK( GlyphCount * 2 + Count * 4 );
+
+    for ( count1 = GlyphCount; count1 > 0; count1-- )
+      otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 );
+
+    for ( ; Count > 0; Count-- )
+    {
+      if ( FT_NEXT_USHORT( p ) >= GlyphCount )
+        FT_INVALID_DATA;
+
+      if ( FT_NEXT_USHORT( p ) >= valid->lookup_count )
+        FT_INVALID_DATA;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /* sets valid->extra1 (valid->lookup_count)    */
+
+  FT_LOCAL_DEF( void )
+  otv_u_O_O_O_O_x_Onx( FT_Bytes       table,
+                       OTV_Validator  valid )
+  {
+    FT_Bytes           p = table;
+    FT_UInt            Coverage;
+    FT_UInt            BacktrackClassDef, InputClassDef, LookaheadClassDef;
+    FT_UInt            ChainClassSetCount;
+    OTV_Validate_Func  func;
+
+
+    OTV_ENTER;
+
+    p += 2;     /* skip Format */
+
+    OTV_LIMIT_CHECK( 10 );
+    Coverage           = FT_NEXT_USHORT( p );
+    BacktrackClassDef  = FT_NEXT_USHORT( p );
+    InputClassDef      = FT_NEXT_USHORT( p );
+    LookaheadClassDef  = FT_NEXT_USHORT( p );
+    ChainClassSetCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (ChainClassSetCount = %d)\n", ChainClassSetCount ));
+
+    otv_Coverage_validate( table + Coverage, valid, -1 );
+
+    otv_ClassDef_validate( table + BacktrackClassDef,  valid );
+    otv_ClassDef_validate( table + InputClassDef, valid );
+    otv_ClassDef_validate( table + LookaheadClassDef, valid );
+
+    OTV_LIMIT_CHECK( ChainClassSetCount * 2 );
+
+    valid->nesting_level++;
+    func          = valid->func[valid->nesting_level];
+    valid->extra1 = valid->lookup_count;
+
+    for ( ; ChainClassSetCount > 0; ChainClassSetCount-- )
+    {
+      FT_UInt  offset = FT_NEXT_USHORT( p );
+
+
+      if ( offset )
+        func( table + offset, valid );
+    }
+
+    valid->nesting_level--;
+
+    OTV_EXIT;
+  }
+
+
+  /* uses valid->lookup_count */
+
+  FT_LOCAL_DEF( void )
+  otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes       table,
+                             OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   BacktrackGlyphCount, InputGlyphCount, LookaheadGlyphCount;
+    FT_UInt   count1, count2;
+
+
+    OTV_ENTER;
+
+    p += 2;     /* skip Format */
+
+    OTV_LIMIT_CHECK( 2 );
+    BacktrackGlyphCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (BacktrackGlyphCount = %d)\n", BacktrackGlyphCount ));
+
+    OTV_LIMIT_CHECK( BacktrackGlyphCount * 2 + 2 );
+
+    for ( ; BacktrackGlyphCount > 0; BacktrackGlyphCount-- )
+      otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 );
+
+    InputGlyphCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (InputGlyphCount = %d)\n", InputGlyphCount ));
+
+    OTV_LIMIT_CHECK( InputGlyphCount * 2 + 2 );
+
+    for ( count1 = InputGlyphCount; count1 > 0; count1-- )
+      otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 );
+
+    LookaheadGlyphCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (LookaheadGlyphCount = %d)\n", LookaheadGlyphCount ));
+
+    OTV_LIMIT_CHECK( LookaheadGlyphCount * 2 + 2 );
+
+    for ( ; LookaheadGlyphCount > 0; LookaheadGlyphCount-- )
+      otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 );
+
+    count2 = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (Count = %d)\n", count2 ));
+
+    OTV_LIMIT_CHECK( count2 * 4 );
+
+    for ( ; count2 > 0; count2-- )
+    {
+      if ( FT_NEXT_USHORT( p ) >= InputGlyphCount )
+        FT_INVALID_DATA;
+
+      if ( FT_NEXT_USHORT( p ) >= valid->lookup_count )
+        FT_INVALID_DATA;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  FT_LOCAL_DEF( FT_UInt )
+  otv_GSUBGPOS_get_Lookup_count( FT_Bytes  table )
+  {
+    FT_Bytes  p = table + 8;
+
+
+    return otv_LookupList_get_count( table + FT_NEXT_USHORT( p ) );
+  }
+
+
+  FT_LOCAL_DEF( FT_UInt )
+  otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes  table )
+  {
+    FT_Bytes  p, lookup;
+    FT_UInt   count;
+
+
+    if ( !table )
+      return 0;
+
+    /* LookupList */
+    p      = table + 8;
+    table += FT_NEXT_USHORT( p );
+
+    /* LookupCount */
+    p     = table;
+    count = FT_NEXT_USHORT( p );
+
+    for ( ; count > 0; count-- )
+    {
+      FT_Bytes  oldp;
+
+
+      /* Lookup */
+      lookup = table + FT_NEXT_USHORT( p );
+
+      oldp = p;
+
+      /* LookupFlag */
+      p = lookup + 2;
+      if ( FT_NEXT_USHORT( p ) & 0xFF00U )
+        return 1;
+
+      p = oldp;
+    }
+
+    return 0;
+  }
+
+
+/* END */
diff --git a/src/otvalid/otvcommn.h b/src/otvalid/otvcommn.h
new file mode 100644 (file)
index 0000000..898887f
--- /dev/null
@@ -0,0 +1,437 @@
+/***************************************************************************/
+/*                                                                         */
+/*  otvcommn.h                                                             */
+/*                                                                         */
+/*    OpenType common tables validation (specification).                   */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __OTVCOMMN_H__
+#define __OTVCOMMN_H__
+
+
+#include <ft2build.h>
+#include "otvalid.h"
+#include FT_INTERNAL_DEBUG_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         VALIDATION                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct OTV_ValidatorRec_*  OTV_Validator;
+
+  typedef void  (*OTV_Validate_Func)( FT_Bytes       table,
+                                      OTV_Validator  valid );
+
+  typedef struct  OTV_ValidatorRec_
+  {
+    FT_Validator        root;
+    FT_UInt             type_count;
+    OTV_Validate_Func*  type_funcs;
+
+    FT_UInt             lookup_count;
+    FT_UInt             glyph_count;
+
+    FT_UInt             nesting_level;
+
+    OTV_Validate_Func   func[3];
+
+    FT_UInt             extra1;     /* for passing parameters */
+    FT_UInt             extra2;
+    FT_Bytes            extra3;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+    FT_UInt             debug_indent;
+    const FT_String*    debug_function_name[3];
+#endif
+
+  } OTV_ValidatorRec;
+
+
+#undef  FT_INVALID_
+#define FT_INVALID_( _prefix, _error )                         \
+          ft_validator_error( valid->root, _prefix ## _error )
+
+#define OTV_OPTIONAL_TABLE( _table )  FT_UShort  _table;      \
+                                      FT_Bytes   _table ## _p
+
+#define OTV_OPTIONAL_OFFSET( _offset )           \
+          FT_BEGIN_STMNT                         \
+            _offset ## _p = p;                   \
+            _offset       = FT_NEXT_USHORT( p ); \
+          FT_END_STMNT
+
+#define OTV_LIMIT_CHECK( _count )                    \
+          FT_BEGIN_STMNT                             \
+            if ( p + (_count) > valid->root->limit ) \
+              FT_INVALID_TOO_SHORT;                  \
+          FT_END_STMNT
+
+#define OTV_SIZE_CHECK( _size )                                     \
+          FT_BEGIN_STMNT                                            \
+            if ( _size > 0 && _size < table_size )                  \
+            {                                                       \
+              if ( valid->root->level == FT_VALIDATE_PARANOID )     \
+                FT_INVALID_OFFSET;                                  \
+              else                                                  \
+              {                                                     \
+                /* strip off `const' */                             \
+                FT_Byte*  pp = (FT_Byte*)_size ## _p;               \
+                                                                    \
+                                                                    \
+                FT_TRACE3(( "\n"                                    \
+                            "Invalid offset to optional table `%s'" \
+                            " set to zero.\n"                       \
+                            "\n", #_size ));                        \
+                                                                    \
+                /* always assume 16bit entities */                  \
+                _size = pp[0] = pp[1] = 0;                          \
+              }                                                     \
+            }                                                       \
+          FT_END_STMNT
+
+
+#define  OTV_NAME_(x)  #x
+#define  OTV_NAME(x)   OTV_NAME_(x)
+
+#define  OTV_FUNC_(x)  x##Func
+#define  OTV_FUNC(x)   OTV_FUNC_(x)
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+#define OTV_NEST1( x )                                     \
+          FT_BEGIN_STMNT                                   \
+            valid->nesting_level          = 0;             \
+            valid->func[0]                = OTV_FUNC( x ); \
+            valid->debug_function_name[0] = OTV_NAME( x ); \
+          FT_END_STMNT
+
+#define OTV_NEST2( x, y )                                  \
+          FT_BEGIN_STMNT                                   \
+            valid->nesting_level          = 0;             \
+            valid->func[0]                = OTV_FUNC( x ); \
+            valid->func[1]                = OTV_FUNC( y ); \
+            valid->debug_function_name[0] = OTV_NAME( x ); \
+            valid->debug_function_name[1] = OTV_NAME( y ); \
+          FT_END_STMNT
+
+#define OTV_NEST3( x, y, z )                               \
+          FT_BEGIN_STMNT                                   \
+            valid->nesting_level          = 0;             \
+            valid->func[0]                = OTV_FUNC( x ); \
+            valid->func[1]                = OTV_FUNC( y ); \
+            valid->func[2]                = OTV_FUNC( z ); \
+            valid->debug_function_name[0] = OTV_NAME( x ); \
+            valid->debug_function_name[1] = OTV_NAME( y ); \
+            valid->debug_function_name[2] = OTV_NAME( z ); \
+          FT_END_STMNT
+
+#define OTV_INIT  valid->debug_indent = 0
+
+#define OTV_ENTER                                                            \
+          FT_BEGIN_STMNT                                                     \
+            valid->debug_indent += 2;                                        \
+            FT_TRACE4(( "%*.s", valid->debug_indent, 0 ));                   \
+            FT_TRACE4(( "%s table\n",                                        \
+                        valid->debug_function_name[valid->nesting_level] )); \
+          FT_END_STMNT
+
+#define OTV_NAME_ENTER( name )                             \
+          FT_BEGIN_STMNT                                   \
+            valid->debug_indent += 2;                      \
+            FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
+            FT_TRACE4(( "%s table\n", name ));             \
+          FT_END_STMNT
+
+#define OTV_EXIT  valid->debug_indent -= 2
+
+#define OTV_TRACE( s )                                     \
+          FT_BEGIN_STMNT                                   \
+            FT_TRACE4(( "%*.s", valid->debug_indent, 0 )); \
+            FT_TRACE4( s );                                \
+          FT_END_STMNT
+
+#else   /* !FT_DEBUG_LEVEL_TRACE */
+
+#define OTV_NEST1( x )                            \
+          FT_BEGIN_STMNT                          \
+            valid->nesting_level = 0;             \
+            valid->func[0]       = OTV_FUNC( x ); \
+          FT_END_STMNT
+
+#define OTV_NEST2( x, y )                         \
+          FT_BEGIN_STMNT                          \
+            valid->nesting_level = 0;             \
+            valid->func[0]       = OTV_FUNC( x ); \
+            valid->func[1]       = OTV_FUNC( y ); \
+          FT_END_STMNT
+
+#define OTV_NEST3( x, y, z )                      \
+          FT_BEGIN_STMNT                          \
+            valid->nesting_level = 0;             \
+            valid->func[0]       = OTV_FUNC( x ); \
+            valid->func[1]       = OTV_FUNC( y ); \
+            valid->func[2]       = OTV_FUNC( z ); \
+          FT_END_STMNT
+
+#define OTV_INIT                do { } while ( 0 )
+#define OTV_ENTER               do { } while ( 0 )
+#define OTV_NAME_ENTER( name )  do { } while ( 0 )
+#define OTV_EXIT                do { } while ( 0 )
+
+#define OTV_TRACE( s )          do { } while ( 0 )
+
+#endif  /* !FT_DEBUG_LEVEL_TRACE */
+
+
+#define OTV_RUN  valid->func[0]
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       COVERAGE TABLE                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  otv_Coverage_validate( FT_Bytes       table,
+                         OTV_Validator  valid,
+                         FT_Int         expected_count );
+
+  /* return first covered glyph */
+  FT_LOCAL( FT_UInt )
+  otv_Coverage_get_first( FT_Bytes  table );
+
+  /* return last covered glyph */
+  FT_LOCAL( FT_UInt )
+  otv_Coverage_get_last( FT_Bytes  table );
+
+  /* return number of covered glyphs */
+  FT_LOCAL( FT_UInt )
+  otv_Coverage_get_count( FT_Bytes  table );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                  CLASS DEFINITION TABLE                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  otv_ClassDef_validate( FT_Bytes       table,
+                         OTV_Validator  valid );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      DEVICE TABLE                             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  otv_Device_validate( FT_Bytes       table,
+                       OTV_Validator  valid );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                           LOOKUPS                             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  otv_Lookup_validate( FT_Bytes       table,
+                       OTV_Validator  valid );
+
+  FT_LOCAL( void )
+  otv_LookupList_validate( FT_Bytes       table,
+                           OTV_Validator  valid );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                        FEATURES                               *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  otv_Feature_validate( FT_Bytes       table,
+                        OTV_Validator  valid );
+
+  /* lookups must already be validated */
+  FT_LOCAL( void )
+  otv_FeatureList_validate( FT_Bytes       table,
+                            FT_Bytes       lookups,
+                            OTV_Validator  valid );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       LANGUAGE SYSTEM                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  otv_LangSys_validate( FT_Bytes       table,
+                        OTV_Validator  valid );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                           SCRIPTS                             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  otv_Script_validate( FT_Bytes       table,
+                       OTV_Validator  valid );
+
+  /* features must already be validated */
+  FT_LOCAL( void )
+  otv_ScriptList_validate( FT_Bytes       table,
+                           FT_Bytes       features,
+                           OTV_Validator  valid );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      UTILITY FUNCTIONS                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define ChainPosClassSetFunc  otv_x_Ox
+#define ChainPosRuleSetFunc   otv_x_Ox
+#define ChainSubClassSetFunc  otv_x_Ox
+#define ChainSubRuleSetFunc   otv_x_Ox
+#define JstfLangSysFunc       otv_x_Ox
+#define JstfMaxFunc           otv_x_Ox
+#define LigGlyphFunc          otv_x_Ox
+#define LigatureArrayFunc     otv_x_Ox
+#define LigatureSetFunc       otv_x_Ox
+#define PosClassSetFunc       otv_x_Ox
+#define PosRuleSetFunc        otv_x_Ox
+#define SubClassSetFunc       otv_x_Ox
+#define SubRuleSetFunc        otv_x_Ox
+
+  FT_LOCAL( void )
+  otv_x_Ox ( FT_Bytes       table,
+             OTV_Validator  valid );
+
+#define AlternateSubstFormat1Func     otv_u_C_x_Ox
+#define ChainContextPosFormat1Func    otv_u_C_x_Ox
+#define ChainContextSubstFormat1Func  otv_u_C_x_Ox
+#define ContextPosFormat1Func         otv_u_C_x_Ox
+#define ContextSubstFormat1Func       otv_u_C_x_Ox
+#define LigatureSubstFormat1Func      otv_u_C_x_Ox
+#define MultipleSubstFormat1Func      otv_u_C_x_Ox
+
+  FT_LOCAL( void )
+  otv_u_C_x_Ox( FT_Bytes       table,
+                OTV_Validator  valid );
+
+#define AlternateSetFunc     otv_x_ux
+#define AttachPointFunc      otv_x_ux
+#define ExtenderGlyphFunc    otv_x_ux
+#define JstfGPOSModListFunc  otv_x_ux
+#define JstfGSUBModListFunc  otv_x_ux
+#define SequenceFunc         otv_x_ux
+
+  FT_LOCAL( void )
+  otv_x_ux( FT_Bytes       table,
+            OTV_Validator  valid );
+
+#define PosClassRuleFunc  otv_x_y_ux_sy
+#define PosRuleFunc       otv_x_y_ux_sy
+#define SubClassRuleFunc  otv_x_y_ux_sy
+#define SubRuleFunc       otv_x_y_ux_sy
+
+  FT_LOCAL( void )
+  otv_x_y_ux_sy( FT_Bytes       table,
+                 OTV_Validator  valid );
+
+#define ChainPosClassRuleFunc  otv_x_ux_y_uy_z_uz_p_sp
+#define ChainPosRuleFunc       otv_x_ux_y_uy_z_uz_p_sp
+#define ChainSubClassRuleFunc  otv_x_ux_y_uy_z_uz_p_sp
+#define ChainSubRuleFunc       otv_x_ux_y_uy_z_uz_p_sp
+
+  FT_LOCAL( void )
+  otv_x_ux_y_uy_z_uz_p_sp( FT_Bytes       table,
+                           OTV_Validator  valid );
+
+#define ContextPosFormat2Func    otv_u_O_O_x_Onx
+#define ContextSubstFormat2Func  otv_u_O_O_x_Onx
+
+  FT_LOCAL( void )
+  otv_u_O_O_x_Onx( FT_Bytes       table,
+                   OTV_Validator  valid );
+
+#define ContextPosFormat3Func    otv_u_x_y_Ox_sy
+#define ContextSubstFormat3Func  otv_u_x_y_Ox_sy
+
+  FT_LOCAL( void )
+  otv_u_x_y_Ox_sy( FT_Bytes       table,
+                   OTV_Validator  valid );
+
+#define ChainContextPosFormat2Func    otv_u_O_O_O_O_x_Onx
+#define ChainContextSubstFormat2Func  otv_u_O_O_O_O_x_Onx
+
+  FT_LOCAL( void )
+  otv_u_O_O_O_O_x_Onx( FT_Bytes       table,
+                       OTV_Validator  valid );
+
+#define ChainContextPosFormat3Func    otv_u_x_Ox_y_Oy_z_Oz_p_sp
+#define ChainContextSubstFormat3Func  otv_u_x_Ox_y_Oy_z_Oz_p_sp
+
+  FT_LOCAL( void )
+  otv_u_x_Ox_y_Oy_z_Oz_p_sp( FT_Bytes       table,
+                             OTV_Validator  valid );
+
+
+  FT_LOCAL( FT_UInt )
+  otv_GSUBGPOS_get_Lookup_count( FT_Bytes  table );
+
+  FT_LOCAL( FT_UInt )
+  otv_GSUBGPOS_have_MarkAttachmentType_flag( FT_Bytes  table );
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __OTVCOMMN_H__ */
+
+
+/* END */
diff --git a/src/otvalid/otverror.h b/src/otvalid/otverror.h
new file mode 100644 (file)
index 0000000..522f4a2
--- /dev/null
@@ -0,0 +1,44 @@
+/***************************************************************************/
+/*                                                                         */
+/*  otverror.h                                                             */
+/*                                                                         */
+/*    OpenType validation module error codes (specification only).         */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the OpenType validation module error      */
+  /* enumeration constants.                                                */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __OTVERROR_H__
+#define __OTVERROR_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  OTV_Err_
+#define FT_ERR_BASE    FT_Mod_Err_OTvalid
+
+#define FT_KEEP_ERR_PREFIX
+
+#include FT_ERRORS_H
+
+#endif /* __OTVERROR_H__ */
+
+
+/* END */
diff --git a/src/otvalid/otvgdef.c b/src/otvalid/otvgdef.c
new file mode 100644 (file)
index 0000000..3633ad0
--- /dev/null
@@ -0,0 +1,224 @@
+/***************************************************************************/
+/*                                                                         */
+/*  otvgdef.c                                                              */
+/*                                                                         */
+/*    OpenType GDEF table validation (body).                               */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "otvalid.h"
+#include "otvcommn.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_otvgdef
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      UTILITY FUNCTIONS                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define AttachListFunc    otv_O_x_Ox
+#define LigCaretListFunc  otv_O_x_Ox
+
+  /* sets valid->extra1 (0)           */
+
+  static void
+  otv_O_x_Ox( FT_Bytes       table,
+              OTV_Validator  valid )
+  {
+    FT_Bytes           p = table;
+    FT_Bytes           Coverage;
+    FT_UInt            GlyphCount;
+    OTV_Validate_Func  func;
+
+
+    OTV_ENTER;
+
+    OTV_LIMIT_CHECK( 4 );
+    Coverage   = table + FT_NEXT_USHORT( p );
+    GlyphCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount ));
+
+    otv_Coverage_validate( Coverage, valid, GlyphCount );
+    if ( GlyphCount != otv_Coverage_get_count( Coverage ) )
+      FT_INVALID_DATA;
+
+    OTV_LIMIT_CHECK( GlyphCount * 2 );
+
+    valid->nesting_level++;
+    func          = valid->func[valid->nesting_level];
+    valid->extra1 = 0;
+
+    for ( ; GlyphCount > 0; GlyphCount-- )
+      func( table + FT_NEXT_USHORT( p ), valid );
+
+    valid->nesting_level--;
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       LIGATURE CARETS                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define CaretValueFunc  otv_CaretValue_validate
+
+  static void
+  otv_CaretValue_validate( FT_Bytes       table,
+                           OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   CaretValueFormat;
+
+
+    OTV_ENTER;
+
+    OTV_LIMIT_CHECK( 4 );
+
+    CaretValueFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format = %d)\n", CaretValueFormat ));
+
+    switch ( CaretValueFormat )
+    {
+    case 1:     /* CaretValueFormat1 */
+      /* skip Coordinate, no test */
+      break;
+
+    case 2:     /* CaretValueFormat2 */
+      /* skip CaretValuePoint, no test */
+      break;
+
+    case 3:     /* CaretValueFormat3 */
+      p += 2;   /* skip Coordinate */
+
+      OTV_LIMIT_CHECK( 2 );
+
+      /* DeviceTable */
+      otv_Device_validate( table + FT_NEXT_USHORT( p ), valid );
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         GDEF TABLE                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* sets valid->glyph_count */
+
+  FT_LOCAL_DEF( void )
+  otv_GDEF_validate( FT_Bytes      table,
+                     FT_Bytes      gsub,
+                     FT_Bytes      gpos,
+                     FT_UInt       glyph_count,
+                     FT_Validator  ftvalid )
+  {
+    OTV_ValidatorRec  validrec;
+    OTV_Validator     valid = &validrec;
+    FT_Bytes          p     = table;
+    FT_UInt           table_size;
+    FT_Bool           need_MarkAttachClassDef;
+
+    OTV_OPTIONAL_TABLE( GlyphClassDef );
+    OTV_OPTIONAL_TABLE( AttachListOffset );
+    OTV_OPTIONAL_TABLE( LigCaretListOffset );
+    OTV_OPTIONAL_TABLE( MarkAttachClassDef );
+
+
+    valid->root = ftvalid;
+
+    FT_TRACE3(( "validating GDEF table\n" ));
+    OTV_INIT;
+
+    OTV_LIMIT_CHECK( 12 );
+
+    if ( FT_NEXT_ULONG( p ) != 0x10000UL )          /* Version */
+      FT_INVALID_FORMAT;
+
+    /* MarkAttachClassDef has been added to the OpenType */
+    /* specification without increasing GDEF's version,  */
+    /* so we use this ugly hack to find out whether the  */
+    /* table is needed actually.                         */
+
+    need_MarkAttachClassDef = FT_BOOL(
+      otv_GSUBGPOS_have_MarkAttachmentType_flag( gsub ) ||
+      otv_GSUBGPOS_have_MarkAttachmentType_flag( gpos ) );
+
+    if ( need_MarkAttachClassDef )
+      table_size = 12;              /* OpenType >= 1.2 */
+    else
+      table_size = 10;              /* OpenType < 1.2  */
+
+    valid->glyph_count = glyph_count;
+
+    OTV_OPTIONAL_OFFSET( GlyphClassDef );
+    OTV_SIZE_CHECK( GlyphClassDef );
+    if ( GlyphClassDef )
+      otv_ClassDef_validate( table + GlyphClassDef, valid );
+
+    OTV_OPTIONAL_OFFSET( AttachListOffset );
+    OTV_SIZE_CHECK( AttachListOffset );
+    if ( AttachListOffset )
+    {
+      OTV_NEST2( AttachList, AttachPoint );
+      OTV_RUN( table + AttachListOffset, valid );
+    }
+
+    OTV_OPTIONAL_OFFSET( LigCaretListOffset );
+    OTV_SIZE_CHECK( LigCaretListOffset );
+    if ( LigCaretListOffset )
+    {
+      OTV_NEST3( LigCaretList, LigGlyph, CaretValue );
+      OTV_RUN( table + LigCaretListOffset, valid );
+    }
+
+    if ( need_MarkAttachClassDef )
+    {
+      OTV_OPTIONAL_OFFSET( MarkAttachClassDef );
+      OTV_SIZE_CHECK( MarkAttachClassDef );
+      if ( MarkAttachClassDef )
+        otv_ClassDef_validate( table + MarkAttachClassDef, valid );
+    }
+
+    FT_TRACE4(( "\n" ));
+  }
+
+
+/* END */
diff --git a/src/otvalid/otvgpos.c b/src/otvalid/otvgpos.c
new file mode 100644 (file)
index 0000000..49b4618
--- /dev/null
@@ -0,0 +1,1017 @@
+/***************************************************************************/
+/*                                                                         */
+/*  otvgpos.c                                                              */
+/*                                                                         */
+/*    OpenType GPOS table validation (body).                               */
+/*                                                                         */
+/*  Copyright 2002, 2004, 2005, 2006, 2007, 2008 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "otvalid.h"
+#include "otvcommn.h"
+#include "otvgpos.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_otvgpos
+
+
+  static void
+  otv_Anchor_validate( FT_Bytes       table,
+                       OTV_Validator  valid );
+
+  static void
+  otv_MarkArray_validate( FT_Bytes       table,
+                          OTV_Validator  valid );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      UTILITY FUNCTIONS                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define BaseArrayFunc       otv_x_sxy
+#define LigatureAttachFunc  otv_x_sxy
+#define Mark2ArrayFunc      otv_x_sxy
+
+  /* uses valid->extra1 (counter)                             */
+  /* uses valid->extra2 (boolean to handle NULL anchor field) */
+
+  static void
+  otv_x_sxy( FT_Bytes       table,
+             OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   Count, count1, table_size;
+
+
+    OTV_ENTER;
+
+    OTV_LIMIT_CHECK( 2 );
+
+    Count = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (Count = %d)\n", Count ));
+
+    OTV_LIMIT_CHECK( Count * valid->extra1 * 2 );
+
+    table_size = Count * valid->extra1 * 2 + 2;
+
+    for ( ; Count > 0; Count-- )
+      for ( count1 = valid->extra1; count1 > 0; count1-- )
+      {
+        OTV_OPTIONAL_TABLE( anchor_offset );
+
+
+        OTV_OPTIONAL_OFFSET( anchor_offset );
+
+        if ( valid->extra2 )
+        {
+          OTV_SIZE_CHECK( anchor_offset );
+          if ( anchor_offset )
+            otv_Anchor_validate( table + anchor_offset, valid );
+        }
+        else
+          otv_Anchor_validate( table + anchor_offset, valid );
+      }
+
+    OTV_EXIT;
+  }
+
+
+#define MarkBasePosFormat1Func  otv_u_O_O_u_O_O
+#define MarkLigPosFormat1Func   otv_u_O_O_u_O_O
+#define MarkMarkPosFormat1Func  otv_u_O_O_u_O_O
+
+  /* sets valid->extra1 (class count) */
+
+  static void
+  otv_u_O_O_u_O_O( FT_Bytes       table,
+                   OTV_Validator  valid )
+  {
+    FT_Bytes           p = table;
+    FT_UInt            Coverage1, Coverage2, ClassCount;
+    FT_UInt            Array1, Array2;
+    OTV_Validate_Func  func;
+
+
+    OTV_ENTER;
+
+    p += 2;     /* skip PosFormat */
+
+    OTV_LIMIT_CHECK( 10 );
+    Coverage1  = FT_NEXT_USHORT( p );
+    Coverage2  = FT_NEXT_USHORT( p );
+    ClassCount = FT_NEXT_USHORT( p );
+    Array1     = FT_NEXT_USHORT( p );
+    Array2     = FT_NEXT_USHORT( p );
+
+    otv_Coverage_validate( table + Coverage1, valid, -1 );
+    otv_Coverage_validate( table + Coverage2, valid, -1 );
+
+    otv_MarkArray_validate( table + Array1, valid );
+
+    valid->nesting_level++;
+    func          = valid->func[valid->nesting_level];
+    valid->extra1 = ClassCount;
+
+    func( table + Array2, valid );
+
+    valid->nesting_level--;
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                        VALUE RECORDS                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static FT_UInt
+  otv_value_length( FT_UInt  format )
+  {
+    FT_UInt  count;
+
+
+    count = ( ( format & 0xAA ) >> 1 ) + ( format & 0x55 );
+    count = ( ( count  & 0xCC ) >> 2 ) + ( count  & 0x33 );
+    count = ( ( count  & 0xF0 ) >> 4 ) + ( count  & 0x0F );
+
+    return count * 2;
+  }
+
+
+  /* uses valid->extra3 (pointer to base table) */
+
+  static void
+  otv_ValueRecord_validate( FT_Bytes       table,
+                            FT_UInt        format,
+                            OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   count;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+    FT_Int    loop;
+    FT_ULong  res = 0;
+
+
+    OTV_NAME_ENTER( "ValueRecord" );
+
+    /* display `format' in dual representation */
+    for ( loop = 7; loop >= 0; loop-- )
+    {
+      res <<= 4;
+      res  += ( format >> loop ) & 1;
+    }
+
+    OTV_TRACE(( " (format 0b%08lx)\n", res ));
+#endif
+
+    if ( format >= 0x100 )
+      FT_INVALID_FORMAT;
+
+    for ( count = 4; count > 0; count-- )
+    {
+      if ( format & 1 )
+      {
+        /* XPlacement, YPlacement, XAdvance, YAdvance */
+        OTV_LIMIT_CHECK( 2 );
+        p += 2;
+      }
+
+      format >>= 1;
+    }
+
+    for ( count = 4; count > 0; count-- )
+    {
+      if ( format & 1 )
+      {
+        FT_PtrDist  table_size;
+
+        OTV_OPTIONAL_TABLE( device );
+
+
+        /* XPlaDevice, YPlaDevice, XAdvDevice, YAdvDevice */
+        OTV_LIMIT_CHECK( 2 );
+        OTV_OPTIONAL_OFFSET( device );
+
+        /* XXX: this value is usually too small, especially if the current */
+        /* ValueRecord is part of an array -- getting the correct table    */
+        /* size is probably not worth the trouble                          */
+
+        table_size = p - valid->extra3;
+
+        OTV_SIZE_CHECK( device );
+        if ( device )
+          otv_Device_validate( valid->extra3 + device, valid );
+      }
+      format >>= 1;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                           ANCHORS                             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  otv_Anchor_validate( FT_Bytes       table,
+                       OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   AnchorFormat;
+
+
+    OTV_NAME_ENTER( "Anchor");
+
+    OTV_LIMIT_CHECK( 6 );
+    AnchorFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", AnchorFormat ));
+
+    p += 4;     /* skip XCoordinate and YCoordinate */
+
+    switch ( AnchorFormat )
+    {
+    case 1:
+      break;
+
+    case 2:
+      OTV_LIMIT_CHECK( 2 );  /* AnchorPoint */
+      break;
+
+    case 3:
+      {
+        FT_UInt   table_size;
+
+        OTV_OPTIONAL_TABLE( XDeviceTable );
+        OTV_OPTIONAL_TABLE( YDeviceTable );
+
+
+        OTV_LIMIT_CHECK( 4 );
+        OTV_OPTIONAL_OFFSET( XDeviceTable );
+        OTV_OPTIONAL_OFFSET( YDeviceTable );
+
+        table_size = 6 + 4;
+
+        OTV_SIZE_CHECK( XDeviceTable );
+        if ( XDeviceTable )
+          otv_Device_validate( table + XDeviceTable, valid );
+
+        OTV_SIZE_CHECK( YDeviceTable );
+        if ( YDeviceTable )
+          otv_Device_validate( table + YDeviceTable, valid );
+      }
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         MARK ARRAYS                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  otv_MarkArray_validate( FT_Bytes       table,
+                          OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   MarkCount;
+
+
+    OTV_NAME_ENTER( "MarkArray" );
+
+    OTV_LIMIT_CHECK( 2 );
+    MarkCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (MarkCount = %d)\n", MarkCount ));
+
+    OTV_LIMIT_CHECK( MarkCount * 4 );
+
+    /* MarkRecord */
+    for ( ; MarkCount > 0; MarkCount-- )
+    {
+      p += 2;   /* skip Class */
+      /* MarkAnchor */
+      otv_Anchor_validate( table + FT_NEXT_USHORT( p ), valid );
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     GPOS LOOKUP TYPE 1                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* sets valid->extra3 (pointer to base table) */
+
+  static void
+  otv_SinglePos_validate( FT_Bytes       table,
+                          OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   PosFormat;
+
+
+    OTV_NAME_ENTER( "SinglePos" );
+
+    OTV_LIMIT_CHECK( 2 );
+    PosFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", PosFormat ));
+
+    valid->extra3 = table;
+
+    switch ( PosFormat )
+    {
+    case 1:     /* SinglePosFormat1 */
+      {
+        FT_UInt  Coverage, ValueFormat;
+
+
+        OTV_LIMIT_CHECK( 4 );
+        Coverage    = FT_NEXT_USHORT( p );
+        ValueFormat = FT_NEXT_USHORT( p );
+
+        otv_Coverage_validate( table + Coverage, valid, -1 );
+        otv_ValueRecord_validate( p, ValueFormat, valid ); /* Value */
+      }
+      break;
+
+    case 2:     /* SinglePosFormat2 */
+      {
+        FT_UInt  Coverage, ValueFormat, ValueCount, len_value;
+
+
+        OTV_LIMIT_CHECK( 6 );
+        Coverage    = FT_NEXT_USHORT( p );
+        ValueFormat = FT_NEXT_USHORT( p );
+        ValueCount  = FT_NEXT_USHORT( p );
+
+        OTV_TRACE(( " (ValueCount = %d)\n", ValueCount ));
+
+        len_value = otv_value_length( ValueFormat );
+
+        otv_Coverage_validate( table + Coverage, valid, ValueCount );
+
+        OTV_LIMIT_CHECK( ValueCount * len_value );
+
+        /* Value */
+        for ( ; ValueCount > 0; ValueCount-- )
+        {
+          otv_ValueRecord_validate( p, ValueFormat, valid );
+          p += len_value;
+        }
+      }
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     GPOS LOOKUP TYPE 2                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  otv_PairSet_validate( FT_Bytes       table,
+                        FT_UInt        format1,
+                        FT_UInt        format2,
+                        OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   value_len1, value_len2, PairValueCount;
+
+
+    OTV_NAME_ENTER( "PairSet" );
+
+    OTV_LIMIT_CHECK( 2 );
+    PairValueCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (PairValueCount = %d)\n", PairValueCount ));
+
+    value_len1 = otv_value_length( format1 );
+    value_len2 = otv_value_length( format2 );
+
+    OTV_LIMIT_CHECK( PairValueCount * ( value_len1 + value_len2 + 2 ) );
+
+    /* PairValueRecord */
+    for ( ; PairValueCount > 0; PairValueCount-- )
+    {
+      p += 2;       /* skip SecondGlyph */
+
+      if ( format1 )
+        otv_ValueRecord_validate( p, format1, valid ); /* Value1 */
+      p += value_len1;
+
+      if ( format2 )
+        otv_ValueRecord_validate( p, format2, valid ); /* Value2 */
+      p += value_len2;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /* sets valid->extra3 (pointer to base table) */
+
+  static void
+  otv_PairPos_validate( FT_Bytes       table,
+                        OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   PosFormat;
+
+
+    OTV_NAME_ENTER( "PairPos" );
+
+    OTV_LIMIT_CHECK( 2 );
+    PosFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", PosFormat ));
+
+    valid->extra3 = table;
+
+    switch ( PosFormat )
+    {
+    case 1:     /* PairPosFormat1 */
+      {
+        FT_UInt  Coverage, ValueFormat1, ValueFormat2, PairSetCount;
+
+
+        OTV_LIMIT_CHECK( 8 );
+        Coverage     = FT_NEXT_USHORT( p );
+        ValueFormat1 = FT_NEXT_USHORT( p );
+        ValueFormat2 = FT_NEXT_USHORT( p );
+        PairSetCount = FT_NEXT_USHORT( p );
+
+        OTV_TRACE(( " (PairSetCount = %d)\n", PairSetCount ));
+
+        otv_Coverage_validate( table + Coverage, valid, -1 );
+
+        OTV_LIMIT_CHECK( PairSetCount * 2 );
+
+        /* PairSetOffset */
+        for ( ; PairSetCount > 0; PairSetCount-- )
+          otv_PairSet_validate( table + FT_NEXT_USHORT( p ),
+                                ValueFormat1, ValueFormat2, valid );
+      }
+      break;
+
+    case 2:     /* PairPosFormat2 */
+      {
+        FT_UInt  Coverage, ValueFormat1, ValueFormat2, ClassDef1, ClassDef2;
+        FT_UInt  ClassCount1, ClassCount2, len_value1, len_value2, count;
+
+
+        OTV_LIMIT_CHECK( 14 );
+        Coverage     = FT_NEXT_USHORT( p );
+        ValueFormat1 = FT_NEXT_USHORT( p );
+        ValueFormat2 = FT_NEXT_USHORT( p );
+        ClassDef1    = FT_NEXT_USHORT( p );
+        ClassDef2    = FT_NEXT_USHORT( p );
+        ClassCount1  = FT_NEXT_USHORT( p );
+        ClassCount2  = FT_NEXT_USHORT( p );
+
+        OTV_TRACE(( " (ClassCount1 = %d)\n", ClassCount1 ));
+        OTV_TRACE(( " (ClassCount2 = %d)\n", ClassCount2 ));
+
+        len_value1 = otv_value_length( ValueFormat1 );
+        len_value2 = otv_value_length( ValueFormat2 );
+
+        otv_Coverage_validate( table + Coverage, valid, -1 );
+        otv_ClassDef_validate( table + ClassDef1, valid );
+        otv_ClassDef_validate( table + ClassDef2, valid );
+
+        OTV_LIMIT_CHECK( ClassCount1 * ClassCount2 *
+                     ( len_value1 + len_value2 ) );
+
+        /* Class1Record */
+        for ( ; ClassCount1 > 0; ClassCount1-- )
+        {
+          /* Class2Record */
+          for ( count = ClassCount2; count > 0; count-- )
+          {
+            if ( ValueFormat1 )
+              /* Value1 */
+              otv_ValueRecord_validate( p, ValueFormat1, valid );
+            p += len_value1;
+
+            if ( ValueFormat2 )
+              /* Value2 */
+              otv_ValueRecord_validate( p, ValueFormat2, valid );
+            p += len_value2;
+          }
+        }
+      }
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     GPOS LOOKUP TYPE 3                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  otv_CursivePos_validate( FT_Bytes       table,
+                           OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   PosFormat;
+
+
+    OTV_NAME_ENTER( "CursivePos" );
+
+    OTV_LIMIT_CHECK( 2 );
+    PosFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", PosFormat ));
+
+    switch ( PosFormat )
+    {
+    case 1:     /* CursivePosFormat1 */
+      {
+        FT_UInt   table_size;
+        FT_UInt   Coverage, EntryExitCount;
+
+        OTV_OPTIONAL_TABLE( EntryAnchor );
+        OTV_OPTIONAL_TABLE( ExitAnchor  );
+
+
+        OTV_LIMIT_CHECK( 4 );
+        Coverage       = FT_NEXT_USHORT( p );
+        EntryExitCount = FT_NEXT_USHORT( p );
+
+        OTV_TRACE(( " (EntryExitCount = %d)\n", EntryExitCount ));
+
+        otv_Coverage_validate( table + Coverage, valid, EntryExitCount );
+
+        OTV_LIMIT_CHECK( EntryExitCount * 4 );
+
+        table_size = EntryExitCount * 4 + 4;
+
+        /* EntryExitRecord */
+        for ( ; EntryExitCount > 0; EntryExitCount-- )
+        {
+          OTV_OPTIONAL_OFFSET( EntryAnchor );
+          OTV_OPTIONAL_OFFSET( ExitAnchor  );
+
+          OTV_SIZE_CHECK( EntryAnchor );
+          if ( EntryAnchor )
+            otv_Anchor_validate( table + EntryAnchor, valid );
+
+          OTV_SIZE_CHECK( ExitAnchor );
+          if ( ExitAnchor )
+            otv_Anchor_validate( table + ExitAnchor, valid );
+        }
+      }
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     GPOS LOOKUP TYPE 4                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* UNDOCUMENTED (in OpenType 1.5):              */
+  /* BaseRecord tables can contain NULL pointers. */
+
+  /* sets valid->extra2 (1) */
+
+  static void
+  otv_MarkBasePos_validate( FT_Bytes       table,
+                            OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   PosFormat;
+
+
+    OTV_NAME_ENTER( "MarkBasePos" );
+
+    OTV_LIMIT_CHECK( 2 );
+    PosFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", PosFormat ));
+
+    switch ( PosFormat )
+    {
+    case 1:
+      valid->extra2 = 1;
+      OTV_NEST2( MarkBasePosFormat1, BaseArray );
+      OTV_RUN( table, valid );
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     GPOS LOOKUP TYPE 5                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* sets valid->extra2 (1) */
+
+  static void
+  otv_MarkLigPos_validate( FT_Bytes       table,
+                           OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   PosFormat;
+
+
+    OTV_NAME_ENTER( "MarkLigPos" );
+
+    OTV_LIMIT_CHECK( 2 );
+    PosFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", PosFormat ));
+
+    switch ( PosFormat )
+    {
+    case 1:
+      valid->extra2 = 1;
+      OTV_NEST3( MarkLigPosFormat1, LigatureArray, LigatureAttach );
+      OTV_RUN( table, valid );
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     GPOS LOOKUP TYPE 6                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* sets valid->extra2 (0) */
+
+  static void
+  otv_MarkMarkPos_validate( FT_Bytes       table,
+                            OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   PosFormat;
+
+
+    OTV_NAME_ENTER( "MarkMarkPos" );
+
+    OTV_LIMIT_CHECK( 2 );
+    PosFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", PosFormat ));
+
+    switch ( PosFormat )
+    {
+    case 1:
+      valid->extra2 = 0;
+      OTV_NEST2( MarkMarkPosFormat1, Mark2Array );
+      OTV_RUN( table, valid );
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     GPOS LOOKUP TYPE 7                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* sets valid->extra1 (lookup count) */
+
+  static void
+  otv_ContextPos_validate( FT_Bytes       table,
+                           OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   PosFormat;
+
+
+    OTV_NAME_ENTER( "ContextPos" );
+
+    OTV_LIMIT_CHECK( 2 );
+    PosFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", PosFormat ));
+
+    switch ( PosFormat )
+    {
+    case 1:
+      /* no need to check glyph indices/classes used as input for these */
+      /* context rules since even invalid glyph indices/classes return  */
+      /* meaningful results                                             */
+
+      valid->extra1 = valid->lookup_count;
+      OTV_NEST3( ContextPosFormat1, PosRuleSet, PosRule );
+      OTV_RUN( table, valid );
+      break;
+
+    case 2:
+      /* no need to check glyph indices/classes used as input for these */
+      /* context rules since even invalid glyph indices/classes return  */
+      /* meaningful results                                             */
+
+      OTV_NEST3( ContextPosFormat2, PosClassSet, PosClassRule );
+      OTV_RUN( table, valid );
+      break;
+
+    case 3:
+      OTV_NEST1( ContextPosFormat3 );
+      OTV_RUN( table, valid );
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     GPOS LOOKUP TYPE 8                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* sets valid->extra1 (lookup count) */
+
+  static void
+  otv_ChainContextPos_validate( FT_Bytes       table,
+                                OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   PosFormat;
+
+
+    OTV_NAME_ENTER( "ChainContextPos" );
+
+    OTV_LIMIT_CHECK( 2 );
+    PosFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", PosFormat ));
+
+    switch ( PosFormat )
+    {
+    case 1:
+      /* no need to check glyph indices/classes used as input for these */
+      /* context rules since even invalid glyph indices/classes return  */
+      /* meaningful results                                             */
+
+      valid->extra1 = valid->lookup_count;
+      OTV_NEST3( ChainContextPosFormat1,
+                 ChainPosRuleSet, ChainPosRule );
+      OTV_RUN( table, valid );
+      break;
+
+    case 2:
+      /* no need to check glyph indices/classes used as input for these */
+      /* context rules since even invalid glyph indices/classes return  */
+      /* meaningful results                                             */
+
+      OTV_NEST3( ChainContextPosFormat2,
+                 ChainPosClassSet, ChainPosClassRule );
+      OTV_RUN( table, valid );
+      break;
+
+    case 3:
+      OTV_NEST1( ChainContextPosFormat3 );
+      OTV_RUN( table, valid );
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     GPOS LOOKUP TYPE 9                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* uses valid->type_funcs */
+
+  static void
+  otv_ExtensionPos_validate( FT_Bytes       table,
+                             OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   PosFormat;
+
+
+    OTV_NAME_ENTER( "ExtensionPos" );
+
+    OTV_LIMIT_CHECK( 2 );
+    PosFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", PosFormat ));
+
+    switch ( PosFormat )
+    {
+    case 1:     /* ExtensionPosFormat1 */
+      {
+        FT_UInt            ExtensionLookupType;
+        FT_ULong           ExtensionOffset;
+        OTV_Validate_Func  validate;
+
+
+        OTV_LIMIT_CHECK( 6 );
+        ExtensionLookupType = FT_NEXT_USHORT( p );
+        ExtensionOffset     = FT_NEXT_ULONG( p );
+
+        if ( ExtensionLookupType == 0 || ExtensionLookupType >= 9 )
+          FT_INVALID_DATA;
+
+        validate = valid->type_funcs[ExtensionLookupType - 1];
+        validate( table + ExtensionOffset, valid );
+      }
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  static const OTV_Validate_Func  otv_gpos_validate_funcs[9] =
+  {
+    otv_SinglePos_validate,
+    otv_PairPos_validate,
+    otv_CursivePos_validate,
+    otv_MarkBasePos_validate,
+    otv_MarkLigPos_validate,
+    otv_MarkMarkPos_validate,
+    otv_ContextPos_validate,
+    otv_ChainContextPos_validate,
+    otv_ExtensionPos_validate
+  };
+
+
+  /* sets valid->type_count */
+  /* sets valid->type_funcs */
+
+  FT_LOCAL_DEF( void )
+  otv_GPOS_subtable_validate( FT_Bytes       table,
+                              OTV_Validator  valid )
+  {
+    valid->type_count = 9;
+    valid->type_funcs = (OTV_Validate_Func*)otv_gpos_validate_funcs;
+
+    otv_Lookup_validate( table, valid );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          GPOS TABLE                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* sets valid->glyph_count */
+
+  FT_LOCAL_DEF( void )
+  otv_GPOS_validate( FT_Bytes      table,
+                     FT_UInt       glyph_count,
+                     FT_Validator  ftvalid )
+  {
+    OTV_ValidatorRec  validrec;
+    OTV_Validator     valid = &validrec;
+    FT_Bytes          p     = table;
+    FT_UInt           ScriptList, FeatureList, LookupList;
+
+
+    valid->root = ftvalid;
+
+    FT_TRACE3(( "validating GPOS table\n" ));
+    OTV_INIT;
+
+    OTV_LIMIT_CHECK( 10 );
+
+    if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */
+      FT_INVALID_FORMAT;
+
+    ScriptList  = FT_NEXT_USHORT( p );
+    FeatureList = FT_NEXT_USHORT( p );
+    LookupList  = FT_NEXT_USHORT( p );
+
+    valid->type_count  = 9;
+    valid->type_funcs  = (OTV_Validate_Func*)otv_gpos_validate_funcs;
+    valid->glyph_count = glyph_count;
+
+    otv_LookupList_validate( table + LookupList,
+                             valid );
+    otv_FeatureList_validate( table + FeatureList, table + LookupList,
+                              valid );
+    otv_ScriptList_validate( table + ScriptList, table + FeatureList,
+                             valid );
+
+    FT_TRACE4(( "\n" ));
+  }
+
+
+/* END */
diff --git a/src/otvalid/otvgpos.h b/src/otvalid/otvgpos.h
new file mode 100644 (file)
index 0000000..14ca408
--- /dev/null
@@ -0,0 +1,36 @@
+/***************************************************************************/
+/*                                                                         */
+/*  otvgpos.h                                                              */
+/*                                                                         */
+/*    OpenType GPOS table validator (specification).                       */
+/*                                                                         */
+/*  Copyright 2004 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __OTVGPOS_H__
+#define __OTVGPOS_H__
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( void )
+  otv_GPOS_subtable_validate( FT_Bytes       table,
+                              OTV_Validator  valid );
+
+
+FT_END_HEADER
+
+#endif /* __OTVGPOS_H__ */
+
+
+/* END */
diff --git a/src/otvalid/otvgsub.c b/src/otvalid/otvgsub.c
new file mode 100644 (file)
index 0000000..ed499d1
--- /dev/null
@@ -0,0 +1,585 @@
+/***************************************************************************/
+/*                                                                         */
+/*  otvgsub.c                                                              */
+/*                                                                         */
+/*    OpenType GSUB table validation (body).                               */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "otvalid.h"
+#include "otvcommn.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_otvgsub
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                  GSUB LOOKUP TYPE 1                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* uses valid->glyph_count */
+
+  static void
+  otv_SingleSubst_validate( FT_Bytes       table,
+                            OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   SubstFormat;
+
+
+    OTV_NAME_ENTER( "SingleSubst" );
+
+    OTV_LIMIT_CHECK( 2 );
+    SubstFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", SubstFormat ));
+
+    switch ( SubstFormat )
+    {
+    case 1:     /* SingleSubstFormat1 */
+      {
+        FT_Bytes  Coverage;
+        FT_Int    DeltaGlyphID;
+        FT_Long   idx;
+
+
+        OTV_LIMIT_CHECK( 4 );
+        Coverage     = table + FT_NEXT_USHORT( p );
+        DeltaGlyphID = FT_NEXT_SHORT( p );
+
+        otv_Coverage_validate( Coverage, valid, -1 );
+
+        idx = otv_Coverage_get_first( Coverage ) + DeltaGlyphID;
+        if ( idx < 0 )
+          FT_INVALID_DATA;
+
+        idx = otv_Coverage_get_last( Coverage ) + DeltaGlyphID;
+        if ( (FT_UInt)idx >= valid->glyph_count )
+          FT_INVALID_DATA;
+      }
+      break;
+
+    case 2:     /* SingleSubstFormat2 */
+      {
+        FT_UInt  Coverage, GlyphCount;
+
+
+        OTV_LIMIT_CHECK( 4 );
+        Coverage   = FT_NEXT_USHORT( p );
+        GlyphCount = FT_NEXT_USHORT( p );
+
+        OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount ));
+
+        otv_Coverage_validate( table + Coverage, valid, GlyphCount );
+
+        OTV_LIMIT_CHECK( GlyphCount * 2 );
+
+        /* Substitute */
+        for ( ; GlyphCount > 0; GlyphCount-- )
+          if ( FT_NEXT_USHORT( p ) >= valid->glyph_count )
+            FT_INVALID_GLYPH_ID;
+      }
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                  GSUB LOOKUP TYPE 2                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* sets valid->extra1 (glyph count) */
+
+  static void
+  otv_MultipleSubst_validate( FT_Bytes       table,
+                              OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   SubstFormat;
+
+
+    OTV_NAME_ENTER( "MultipleSubst" );
+
+    OTV_LIMIT_CHECK( 2 );
+    SubstFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", SubstFormat ));
+
+    switch ( SubstFormat )
+    {
+    case 1:
+      valid->extra1 = valid->glyph_count;
+      OTV_NEST2( MultipleSubstFormat1, Sequence );
+      OTV_RUN( table, valid );
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    GSUB LOOKUP TYPE 3                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* sets valid->extra1 (glyph count) */
+
+  static void
+  otv_AlternateSubst_validate( FT_Bytes       table,
+                               OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   SubstFormat;
+
+
+    OTV_NAME_ENTER( "AlternateSubst" );
+
+    OTV_LIMIT_CHECK( 2 );
+    SubstFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", SubstFormat ));
+
+    switch ( SubstFormat )
+    {
+    case 1:
+      valid->extra1 = valid->glyph_count;
+      OTV_NEST2( AlternateSubstFormat1, AlternateSet );
+      OTV_RUN( table, valid );
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    GSUB LOOKUP TYPE 4                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define LigatureFunc  otv_Ligature_validate
+
+  /* uses valid->glyph_count */
+
+  static void
+  otv_Ligature_validate( FT_Bytes       table,
+                         OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   LigatureGlyph, CompCount;
+
+
+    OTV_ENTER;
+
+    OTV_LIMIT_CHECK( 4 );
+    LigatureGlyph = FT_NEXT_USHORT( p );
+    if ( LigatureGlyph >= valid->glyph_count )
+      FT_INVALID_DATA;
+
+    CompCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (CompCount = %d)\n", CompCount ));
+
+    if ( CompCount == 0 )
+      FT_INVALID_DATA;
+
+    CompCount--;
+
+    OTV_LIMIT_CHECK( CompCount * 2 );     /* Component */
+
+    /* no need to check the Component glyph indices */
+
+    OTV_EXIT;
+  }
+
+
+  static void
+  otv_LigatureSubst_validate( FT_Bytes       table,
+                              OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   SubstFormat;
+
+
+    OTV_NAME_ENTER( "LigatureSubst" );
+
+    OTV_LIMIT_CHECK( 2 );
+    SubstFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", SubstFormat ));
+
+    switch ( SubstFormat )
+    {
+    case 1:
+      OTV_NEST3( LigatureSubstFormat1, LigatureSet, Ligature );
+      OTV_RUN( table, valid );
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                  GSUB LOOKUP TYPE 5                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* sets valid->extra1 (lookup count) */
+
+  static void
+  otv_ContextSubst_validate( FT_Bytes       table,
+                             OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   SubstFormat;
+
+
+    OTV_NAME_ENTER( "ContextSubst" );
+
+    OTV_LIMIT_CHECK( 2 );
+    SubstFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", SubstFormat ));
+
+    switch ( SubstFormat )
+    {
+    case 1:
+      /* no need to check glyph indices/classes used as input for these */
+      /* context rules since even invalid glyph indices/classes return  */
+      /* meaningful results                                             */
+
+      valid->extra1 = valid->lookup_count;
+      OTV_NEST3( ContextSubstFormat1, SubRuleSet, SubRule );
+      OTV_RUN( table, valid );
+      break;
+
+    case 2:
+      /* no need to check glyph indices/classes used as input for these */
+      /* context rules since even invalid glyph indices/classes return  */
+      /* meaningful results                                             */
+
+      OTV_NEST3( ContextSubstFormat2, SubClassSet, SubClassRule );
+      OTV_RUN( table, valid );
+      break;
+
+    case 3:
+      OTV_NEST1( ContextSubstFormat3 );
+      OTV_RUN( table, valid );
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    GSUB LOOKUP TYPE 6                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* sets valid->extra1 (lookup count)            */
+
+  static void
+  otv_ChainContextSubst_validate( FT_Bytes       table,
+                                  OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   SubstFormat;
+
+
+    OTV_NAME_ENTER( "ChainContextSubst" );
+
+    OTV_LIMIT_CHECK( 2 );
+    SubstFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", SubstFormat ));
+
+    switch ( SubstFormat )
+    {
+    case 1:
+      /* no need to check glyph indices/classes used as input for these */
+      /* context rules since even invalid glyph indices/classes return  */
+      /* meaningful results                                             */
+
+      valid->extra1 = valid->lookup_count;
+      OTV_NEST3( ChainContextSubstFormat1,
+                 ChainSubRuleSet, ChainSubRule );
+      OTV_RUN( table, valid );
+      break;
+
+    case 2:
+      /* no need to check glyph indices/classes used as input for these */
+      /* context rules since even invalid glyph indices/classes return  */
+      /* meaningful results                                             */
+
+      OTV_NEST3( ChainContextSubstFormat2,
+                 ChainSubClassSet, ChainSubClassRule );
+      OTV_RUN( table, valid );
+      break;
+
+    case 3:
+      OTV_NEST1( ChainContextSubstFormat3 );
+      OTV_RUN( table, valid );
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    GSUB LOOKUP TYPE 7                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* uses valid->type_funcs */
+
+  static void
+  otv_ExtensionSubst_validate( FT_Bytes       table,
+                               OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   SubstFormat;
+
+
+    OTV_NAME_ENTER( "ExtensionSubst" );
+
+    OTV_LIMIT_CHECK( 2 );
+    SubstFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", SubstFormat ));
+
+    switch ( SubstFormat )
+    {
+    case 1:     /* ExtensionSubstFormat1 */
+      {
+        FT_UInt            ExtensionLookupType;
+        FT_ULong           ExtensionOffset;
+        OTV_Validate_Func  validate;
+
+
+        OTV_LIMIT_CHECK( 6 );
+        ExtensionLookupType = FT_NEXT_USHORT( p );
+        ExtensionOffset     = FT_NEXT_ULONG( p );
+
+        if ( ExtensionLookupType == 0 ||
+             ExtensionLookupType == 7 ||
+             ExtensionLookupType > 8  )
+          FT_INVALID_DATA;
+
+        validate = valid->type_funcs[ExtensionLookupType - 1];
+        validate( table + ExtensionOffset, valid );
+      }
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    GSUB LOOKUP TYPE 8                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* uses valid->glyph_count */
+
+  static void
+  otv_ReverseChainSingleSubst_validate( FT_Bytes       table,
+                                        OTV_Validator  valid )
+  {
+    FT_Bytes  p = table, Coverage;
+    FT_UInt   SubstFormat;
+    FT_UInt   BacktrackGlyphCount, LookaheadGlyphCount, GlyphCount;
+
+
+    OTV_NAME_ENTER( "ReverseChainSingleSubst" );
+
+    OTV_LIMIT_CHECK( 2 );
+    SubstFormat = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (format %d)\n", SubstFormat ));
+
+    switch ( SubstFormat )
+    {
+    case 1:     /* ReverseChainSingleSubstFormat1 */
+      OTV_LIMIT_CHECK( 4 );
+      Coverage            = table + FT_NEXT_USHORT( p );
+      BacktrackGlyphCount = FT_NEXT_USHORT( p );
+
+      OTV_TRACE(( " (BacktrackGlyphCount = %d)\n", BacktrackGlyphCount ));
+
+      otv_Coverage_validate( Coverage, valid, -1 );
+
+      OTV_LIMIT_CHECK( BacktrackGlyphCount * 2 + 2 );
+
+      for ( ; BacktrackGlyphCount > 0; BacktrackGlyphCount-- )
+        otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 );
+
+      LookaheadGlyphCount = FT_NEXT_USHORT( p );
+
+      OTV_TRACE(( " (LookaheadGlyphCount = %d)\n", LookaheadGlyphCount ));
+
+      OTV_LIMIT_CHECK( LookaheadGlyphCount * 2 + 2 );
+
+      for ( ; LookaheadGlyphCount > 0; LookaheadGlyphCount-- )
+        otv_Coverage_validate( table + FT_NEXT_USHORT( p ), valid, -1 );
+
+      GlyphCount = FT_NEXT_USHORT( p );
+
+      OTV_TRACE(( " (GlyphCount = %d)\n", GlyphCount ));
+
+      if ( GlyphCount != otv_Coverage_get_count( Coverage ) )
+        FT_INVALID_DATA;
+
+      OTV_LIMIT_CHECK( GlyphCount * 2 );
+
+      /* Substitute */
+      for ( ; GlyphCount > 0; GlyphCount-- )
+        if ( FT_NEXT_USHORT( p ) >= valid->glyph_count )
+          FT_INVALID_DATA;
+
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
+    OTV_EXIT;
+  }
+
+
+  static const OTV_Validate_Func  otv_gsub_validate_funcs[8] =
+  {
+    otv_SingleSubst_validate,
+    otv_MultipleSubst_validate,
+    otv_AlternateSubst_validate,
+    otv_LigatureSubst_validate,
+    otv_ContextSubst_validate,
+    otv_ChainContextSubst_validate,
+    otv_ExtensionSubst_validate,
+    otv_ReverseChainSingleSubst_validate
+  };
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          GSUB TABLE                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* sets valid->type_count  */
+  /* sets valid->type_funcs  */
+  /* sets valid->glyph_count */
+
+  FT_LOCAL_DEF( void )
+  otv_GSUB_validate( FT_Bytes      table,
+                     FT_UInt       glyph_count,
+                     FT_Validator  ftvalid )
+  {
+    OTV_ValidatorRec  validrec;
+    OTV_Validator     valid = &validrec;
+    FT_Bytes          p     = table;
+    FT_UInt           ScriptList, FeatureList, LookupList;
+
+
+    valid->root = ftvalid;
+
+    FT_TRACE3(( "validating GSUB table\n" ));
+    OTV_INIT;
+
+    OTV_LIMIT_CHECK( 10 );
+
+    if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */
+      FT_INVALID_FORMAT;
+
+    ScriptList  = FT_NEXT_USHORT( p );
+    FeatureList = FT_NEXT_USHORT( p );
+    LookupList  = FT_NEXT_USHORT( p );
+
+    valid->type_count  = 8;
+    valid->type_funcs  = (OTV_Validate_Func*)otv_gsub_validate_funcs;
+    valid->glyph_count = glyph_count;
+
+    otv_LookupList_validate( table + LookupList,
+                             valid );
+    otv_FeatureList_validate( table + FeatureList, table + LookupList,
+                              valid );
+    otv_ScriptList_validate( table + ScriptList, table + FeatureList,
+                             valid );
+
+    FT_TRACE4(( "\n" ));
+  }
+
+
+/* END */
diff --git a/src/otvalid/otvjstf.c b/src/otvalid/otvjstf.c
new file mode 100644 (file)
index 0000000..a616a23
--- /dev/null
@@ -0,0 +1,258 @@
+/***************************************************************************/
+/*                                                                         */
+/*  otvjstf.c                                                              */
+/*                                                                         */
+/*    OpenType JSTF table validation (body).                               */
+/*                                                                         */
+/*  Copyright 2004, 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "otvalid.h"
+#include "otvcommn.h"
+#include "otvgpos.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_otvjstf
+
+
+#define JstfPriorityFunc  otv_JstfPriority_validate
+#define JstfLookupFunc    otv_GPOS_subtable_validate
+
+  /* uses valid->extra1 (GSUB lookup count) */
+  /* uses valid->extra2 (GPOS lookup count) */
+  /* sets valid->extra1 (counter)           */
+
+  static void
+  otv_JstfPriority_validate( FT_Bytes       table,
+                             OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   table_size;
+    FT_UInt   gsub_lookup_count, gpos_lookup_count;
+
+    OTV_OPTIONAL_TABLE( ShrinkageEnableGSUB  );
+    OTV_OPTIONAL_TABLE( ShrinkageDisableGSUB );
+    OTV_OPTIONAL_TABLE( ShrinkageEnableGPOS  );
+    OTV_OPTIONAL_TABLE( ShrinkageDisableGPOS );
+    OTV_OPTIONAL_TABLE( ExtensionEnableGSUB  );
+    OTV_OPTIONAL_TABLE( ExtensionDisableGSUB );
+    OTV_OPTIONAL_TABLE( ExtensionEnableGPOS  );
+    OTV_OPTIONAL_TABLE( ExtensionDisableGPOS );
+    OTV_OPTIONAL_TABLE( ShrinkageJstfMax );
+    OTV_OPTIONAL_TABLE( ExtensionJstfMax );
+
+
+    OTV_ENTER;
+    OTV_TRACE(( "JstfPriority table\n" ));
+
+    OTV_LIMIT_CHECK( 20 );
+
+    gsub_lookup_count = valid->extra1;
+    gpos_lookup_count = valid->extra2;
+
+    table_size = 20;
+
+    valid->extra1 = gsub_lookup_count;
+
+    OTV_OPTIONAL_OFFSET( ShrinkageEnableGSUB );
+    OTV_SIZE_CHECK( ShrinkageEnableGSUB );
+    if ( ShrinkageEnableGSUB )
+      otv_x_ux( table + ShrinkageEnableGSUB, valid );
+
+    OTV_OPTIONAL_OFFSET( ShrinkageDisableGSUB );
+    OTV_SIZE_CHECK( ShrinkageDisableGSUB );
+    if ( ShrinkageDisableGSUB )
+      otv_x_ux( table + ShrinkageDisableGSUB, valid );
+
+    valid->extra1 = gpos_lookup_count;
+
+    OTV_OPTIONAL_OFFSET( ShrinkageEnableGPOS );
+    OTV_SIZE_CHECK( ShrinkageEnableGPOS );
+    if ( ShrinkageEnableGPOS )
+      otv_x_ux( table + ShrinkageEnableGPOS, valid );
+
+    OTV_OPTIONAL_OFFSET( ShrinkageDisableGPOS );
+    OTV_SIZE_CHECK( ShrinkageDisableGPOS );
+    if ( ShrinkageDisableGPOS )
+      otv_x_ux( table + ShrinkageDisableGPOS, valid );
+
+    OTV_OPTIONAL_OFFSET( ShrinkageJstfMax );
+    OTV_SIZE_CHECK( ShrinkageJstfMax );
+    if ( ShrinkageJstfMax )
+    {
+      /* XXX: check lookup types? */
+      OTV_NEST2( JstfMax, JstfLookup );
+      OTV_RUN( table + ShrinkageJstfMax, valid );
+    }
+
+    valid->extra1 = gsub_lookup_count;
+
+    OTV_OPTIONAL_OFFSET( ExtensionEnableGSUB );
+    OTV_SIZE_CHECK( ExtensionEnableGSUB );
+    if ( ExtensionEnableGSUB )
+      otv_x_ux( table + ExtensionEnableGSUB, valid );
+
+    OTV_OPTIONAL_OFFSET( ExtensionDisableGSUB );
+    OTV_SIZE_CHECK( ExtensionDisableGSUB );
+    if ( ExtensionDisableGSUB )
+      otv_x_ux( table + ExtensionDisableGSUB, valid );
+
+    valid->extra1 = gpos_lookup_count;
+
+    OTV_OPTIONAL_OFFSET( ExtensionEnableGPOS );
+    OTV_SIZE_CHECK( ExtensionEnableGPOS );
+    if ( ExtensionEnableGPOS )
+      otv_x_ux( table + ExtensionEnableGPOS, valid );
+
+    OTV_OPTIONAL_OFFSET( ExtensionDisableGPOS );
+    OTV_SIZE_CHECK( ExtensionDisableGPOS );
+    if ( ExtensionDisableGPOS )
+      otv_x_ux( table + ExtensionDisableGPOS, valid );
+
+    OTV_OPTIONAL_OFFSET( ExtensionJstfMax );
+    OTV_SIZE_CHECK( ExtensionJstfMax );
+    if ( ExtensionJstfMax )
+    {
+      /* XXX: check lookup types? */
+      OTV_NEST2( JstfMax, JstfLookup );
+      OTV_RUN( table + ExtensionJstfMax, valid );
+    }
+
+    valid->extra1 = gsub_lookup_count;
+    valid->extra2 = gpos_lookup_count;
+
+    OTV_EXIT;
+  }
+
+
+  /* sets valid->extra (glyph count)               */
+  /* sets valid->func1 (otv_JstfPriority_validate) */
+
+  static void
+  otv_JstfScript_validate( FT_Bytes       table,
+                           OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   table_size;
+    FT_UInt   JstfLangSysCount;
+
+    OTV_OPTIONAL_TABLE( ExtGlyph );
+    OTV_OPTIONAL_TABLE( DefJstfLangSys );
+
+
+    OTV_NAME_ENTER( "JstfScript" );
+
+    OTV_LIMIT_CHECK( 6 );
+    OTV_OPTIONAL_OFFSET( ExtGlyph );
+    OTV_OPTIONAL_OFFSET( DefJstfLangSys );
+    JstfLangSysCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (JstfLangSysCount = %d)\n", JstfLangSysCount ));
+
+    table_size = JstfLangSysCount * 6 + 6;
+
+    OTV_SIZE_CHECK( ExtGlyph );
+    if ( ExtGlyph )
+    {
+      valid->extra1 = valid->glyph_count;
+      OTV_NEST1( ExtenderGlyph );
+      OTV_RUN( table + ExtGlyph, valid );
+    }
+
+    OTV_SIZE_CHECK( DefJstfLangSys );
+    if ( DefJstfLangSys )
+    {
+      OTV_NEST2( JstfLangSys, JstfPriority );
+      OTV_RUN( table + DefJstfLangSys, valid );
+    }
+
+    OTV_LIMIT_CHECK( 6 * JstfLangSysCount );
+
+    /* JstfLangSysRecord */
+    OTV_NEST2( JstfLangSys, JstfPriority );
+    for ( ; JstfLangSysCount > 0; JstfLangSysCount-- )
+    {
+      p += 4;       /* skip JstfLangSysTag */
+
+      OTV_RUN( table + FT_NEXT_USHORT( p ), valid );
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /* sets valid->extra1 (GSUB lookup count) */
+  /* sets valid->extra2 (GPOS lookup count) */
+  /* sets valid->glyph_count                */
+
+  FT_LOCAL_DEF( void )
+  otv_JSTF_validate( FT_Bytes      table,
+                     FT_Bytes      gsub,
+                     FT_Bytes      gpos,
+                     FT_UInt       glyph_count,
+                     FT_Validator  ftvalid )
+  {
+    OTV_ValidatorRec  validrec;
+    OTV_Validator     valid = &validrec;
+    FT_Bytes          p     = table;
+    FT_UInt           JstfScriptCount;
+
+
+    valid->root = ftvalid;
+
+    FT_TRACE3(( "validating JSTF table\n" ));
+    OTV_INIT;
+
+    OTV_LIMIT_CHECK( 6 );
+
+    if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */
+      FT_INVALID_FORMAT;
+
+    JstfScriptCount = FT_NEXT_USHORT( p );
+
+    FT_TRACE3(( " (JstfScriptCount = %d)\n", JstfScriptCount ));
+
+    OTV_LIMIT_CHECK( JstfScriptCount * 6 );
+
+    if ( gsub )
+      valid->extra1 = otv_GSUBGPOS_get_Lookup_count( gsub );
+    else
+      valid->extra1 = 0;
+
+    if ( gpos )
+      valid->extra2 = otv_GSUBGPOS_get_Lookup_count( gpos );
+    else
+      valid->extra2 = 0;
+
+    valid->glyph_count = glyph_count;
+
+    /* JstfScriptRecord */
+    for ( ; JstfScriptCount > 0; JstfScriptCount-- )
+    {
+      p += 4;       /* skip JstfScriptTag */
+
+      /* JstfScript */
+      otv_JstfScript_validate( table + FT_NEXT_USHORT( p ), valid );
+    }
+
+    FT_TRACE4(( "\n" ));
+  }
+
+
+/* END */
diff --git a/src/otvalid/otvmath.c b/src/otvalid/otvmath.c
new file mode 100644 (file)
index 0000000..96f841f
--- /dev/null
@@ -0,0 +1,453 @@
+/***************************************************************************/
+/*                                                                         */
+/*  otvmath.c                                                              */
+/*                                                                         */
+/*    OpenType MATH table validation (body).                               */
+/*                                                                         */
+/*  Copyright 2007, 2008 by                                                */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  Written by George Williams.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "otvalid.h"
+#include "otvcommn.h"
+#include "otvgpos.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_otvmath
+
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                  MATH TYPOGRAPHIC CONSTANTS                   *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  otv_MathConstants_validate( FT_Bytes       table,
+                              OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   i;
+    FT_UInt   table_size;
+
+    OTV_OPTIONAL_TABLE( DeviceTableOffset );
+
+
+    OTV_NAME_ENTER( "MathConstants" );
+
+    /* 56 constants, 51 have device tables */
+    OTV_LIMIT_CHECK( 2 * ( 56 + 51 ) );
+    table_size = 2 * ( 56 + 51 );
+
+    p += 4 * 2;                 /* First 4 constants have no device tables */
+    for ( i = 0; i < 51; ++i )
+    {
+      p += 2;                                            /* skip the value */
+      OTV_OPTIONAL_OFFSET( DeviceTableOffset );
+      OTV_SIZE_CHECK( DeviceTableOffset );
+      if ( DeviceTableOffset )
+        otv_Device_validate( table + DeviceTableOffset, valid );
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                   MATH ITALICS CORRECTION                     *****/
+  /*****                 MATH TOP ACCENT ATTACHMENT                    *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  otv_MathItalicsCorrectionInfo_validate( FT_Bytes       table,
+                                          OTV_Validator  valid,
+                                          FT_Int         isItalic )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   i, cnt, table_size ;
+
+    OTV_OPTIONAL_TABLE( Coverage );
+    OTV_OPTIONAL_TABLE( DeviceTableOffset );
+
+    FT_UNUSED( isItalic );  /* only used if tracing is active */
+
+
+    OTV_NAME_ENTER( isItalic ? "MathItalicsCorrectionInfo"
+                             : "MathTopAccentAttachment" );
+
+    OTV_LIMIT_CHECK( 4 );
+
+    OTV_OPTIONAL_OFFSET( Coverage );
+    cnt = FT_NEXT_USHORT( p );
+
+    OTV_LIMIT_CHECK( 4 * cnt );
+    table_size = 4 + 4 * cnt;
+
+    OTV_SIZE_CHECK( Coverage );
+    otv_Coverage_validate( table + Coverage, valid, cnt );
+
+    for ( i = 0; i < cnt; ++i )
+    {
+      p += 2;                                            /* Skip the value */
+      OTV_OPTIONAL_OFFSET( DeviceTableOffset );
+      OTV_SIZE_CHECK( DeviceTableOffset );
+      if ( DeviceTableOffset )
+        otv_Device_validate( table + DeviceTableOffset, valid );
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                           MATH KERNING                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  otv_MathKern_validate( FT_Bytes       table,
+                         OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   i, cnt, table_size;
+
+    OTV_OPTIONAL_TABLE( DeviceTableOffset );
+
+
+    /* OTV_NAME_ENTER( "MathKern" );*/
+
+    OTV_LIMIT_CHECK( 2 );
+
+    cnt = FT_NEXT_USHORT( p );
+
+    OTV_LIMIT_CHECK( 4 * cnt + 2 );
+    table_size = 4 + 4 * cnt;
+
+    /* Heights */
+    for ( i = 0; i < cnt; ++i )
+    {
+      p += 2;                                            /* Skip the value */
+      OTV_OPTIONAL_OFFSET( DeviceTableOffset );
+      OTV_SIZE_CHECK( DeviceTableOffset );
+      if ( DeviceTableOffset )
+        otv_Device_validate( table + DeviceTableOffset, valid );
+    }
+
+    /* One more Kerning value */
+    for ( i = 0; i < cnt + 1; ++i )
+    {
+      p += 2;                                            /* Skip the value */
+      OTV_OPTIONAL_OFFSET( DeviceTableOffset );
+      OTV_SIZE_CHECK( DeviceTableOffset );
+      if ( DeviceTableOffset )
+        otv_Device_validate( table + DeviceTableOffset, valid );
+    }
+
+    OTV_EXIT;
+  }
+
+
+  static void
+  otv_MathKernInfo_validate( FT_Bytes       table,
+                             OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   i, j, cnt, table_size;
+
+    OTV_OPTIONAL_TABLE( Coverage );
+    OTV_OPTIONAL_TABLE( MKRecordOffset );
+
+
+    OTV_NAME_ENTER( "MathKernInfo" );
+
+    OTV_LIMIT_CHECK( 4 );
+
+    OTV_OPTIONAL_OFFSET( Coverage );
+    cnt = FT_NEXT_USHORT( p );
+
+    OTV_LIMIT_CHECK( 8 * cnt );
+    table_size = 4 + 8 * cnt;
+
+    OTV_SIZE_CHECK( Coverage );
+    otv_Coverage_validate( table + Coverage, valid, cnt );
+
+    for ( i = 0; i < cnt; ++i )
+    {
+      for ( j = 0; j < 4; ++j )
+      {
+        OTV_OPTIONAL_OFFSET( MKRecordOffset );
+        OTV_SIZE_CHECK( MKRecordOffset );
+        if ( MKRecordOffset )
+          otv_MathKern_validate( table + MKRecordOffset, valid );
+      }
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                         MATH GLYPH INFO                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  otv_MathGlyphInfo_validate( FT_Bytes       table,
+                              OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   MathItalicsCorrectionInfo, MathTopAccentAttachment;
+    FT_UInt   ExtendedShapeCoverage, MathKernInfo;
+
+
+    OTV_NAME_ENTER( "MathGlyphInfo" );
+
+    OTV_LIMIT_CHECK( 8 );
+
+    MathItalicsCorrectionInfo = FT_NEXT_USHORT( p );
+    MathTopAccentAttachment   = FT_NEXT_USHORT( p );
+    ExtendedShapeCoverage     = FT_NEXT_USHORT( p );
+    MathKernInfo              = FT_NEXT_USHORT( p );
+
+    if ( MathItalicsCorrectionInfo )
+      otv_MathItalicsCorrectionInfo_validate(
+        table + MathItalicsCorrectionInfo, valid, TRUE );
+
+    /* Italic correction and Top Accent Attachment have the same format */
+    if ( MathTopAccentAttachment )
+      otv_MathItalicsCorrectionInfo_validate(
+        table + MathTopAccentAttachment, valid, FALSE );
+
+    if ( ExtendedShapeCoverage )
+    {
+      OTV_NAME_ENTER( "ExtendedShapeCoverage" );
+      otv_Coverage_validate( table + ExtendedShapeCoverage, valid, -1 );
+      OTV_EXIT;
+    }
+
+    if ( MathKernInfo )
+      otv_MathKernInfo_validate( table + MathKernInfo, valid );
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    MATH GLYPH CONSTRUCTION                    *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  otv_GlyphAssembly_validate( FT_Bytes       table,
+                              OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   pcnt, table_size;
+    FT_UInt   i;
+
+    OTV_OPTIONAL_TABLE( DeviceTableOffset );
+
+
+    /* OTV_NAME_ENTER( "GlyphAssembly" ); */
+
+    OTV_LIMIT_CHECK( 6 );
+
+    p += 2;                           /* Skip the Italics Correction value */
+    OTV_OPTIONAL_OFFSET( DeviceTableOffset );
+    pcnt = FT_NEXT_USHORT( p );
+
+    OTV_LIMIT_CHECK( 8 * pcnt );
+    table_size = 6 + 8 * pcnt;
+
+    OTV_SIZE_CHECK( DeviceTableOffset );
+    if ( DeviceTableOffset )
+      otv_Device_validate( table + DeviceTableOffset, valid );
+
+    for ( i = 0; i < pcnt; ++i )
+    {
+      FT_UInt  gid;
+
+
+      gid = FT_NEXT_USHORT( p );
+      if ( gid >= valid->glyph_count )
+        FT_INVALID_GLYPH_ID;
+      p += 2*4;             /* skip the Start, End, Full, and Flags fields */
+    }
+
+    /* OTV_EXIT; */
+  }
+
+
+  static void
+  otv_MathGlyphConstruction_validate( FT_Bytes       table,
+                                      OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   vcnt, table_size;
+    FT_UInt   i;
+
+    OTV_OPTIONAL_TABLE( GlyphAssembly );
+
+
+    /* OTV_NAME_ENTER( "MathGlyphConstruction" ); */
+
+    OTV_LIMIT_CHECK( 4 );
+
+    OTV_OPTIONAL_OFFSET( GlyphAssembly );
+    vcnt = FT_NEXT_USHORT( p );
+
+    OTV_LIMIT_CHECK( 4 * vcnt );
+    table_size = 4 + 4 * vcnt;
+
+    for ( i = 0; i < vcnt; ++i )
+    {
+      FT_UInt  gid;
+
+
+      gid = FT_NEXT_USHORT( p );
+      if ( gid >= valid->glyph_count )
+        FT_INVALID_GLYPH_ID;
+      p += 2;                          /* skip the size */
+    }
+
+    OTV_SIZE_CHECK( GlyphAssembly );
+    if ( GlyphAssembly )
+      otv_GlyphAssembly_validate( table+GlyphAssembly, valid );
+
+    /* OTV_EXIT; */
+  }
+
+
+  static void
+  otv_MathVariants_validate( FT_Bytes       table,
+                             OTV_Validator  valid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   vcnt, hcnt, i, table_size;
+
+    OTV_OPTIONAL_TABLE( VCoverage );
+    OTV_OPTIONAL_TABLE( HCoverage );
+    OTV_OPTIONAL_TABLE( Offset );
+
+
+    OTV_NAME_ENTER( "MathVariants" );
+
+    OTV_LIMIT_CHECK( 10 );
+
+    p += 2;                       /* Skip the MinConnectorOverlap constant */
+    OTV_OPTIONAL_OFFSET( VCoverage );
+    OTV_OPTIONAL_OFFSET( HCoverage );
+    vcnt = FT_NEXT_USHORT( p );
+    hcnt = FT_NEXT_USHORT( p );
+
+    OTV_LIMIT_CHECK( 2 * vcnt + 2 * hcnt );
+    table_size = 10 + 2 * vcnt + 2 * hcnt;
+
+    OTV_SIZE_CHECK( VCoverage );
+    if ( VCoverage )
+      otv_Coverage_validate( table + VCoverage, valid, vcnt );
+
+    OTV_SIZE_CHECK( HCoverage );
+    if ( HCoverage )
+      otv_Coverage_validate( table + HCoverage, valid, hcnt );
+
+    for ( i = 0; i < vcnt; ++i )
+    {
+      OTV_OPTIONAL_OFFSET( Offset );
+      OTV_SIZE_CHECK( Offset );
+      otv_MathGlyphConstruction_validate( table + Offset, valid );
+    }
+
+    for ( i = 0; i < hcnt; ++i )
+    {
+      OTV_OPTIONAL_OFFSET( Offset );
+      OTV_SIZE_CHECK( Offset );
+      otv_MathGlyphConstruction_validate( table + Offset, valid );
+    }
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          MATH TABLE                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* sets valid->glyph_count */
+
+  FT_LOCAL_DEF( void )
+  otv_MATH_validate( FT_Bytes      table,
+                     FT_UInt       glyph_count,
+                     FT_Validator  ftvalid )
+  {
+    OTV_ValidatorRec  validrec;
+    OTV_Validator     valid = &validrec;
+    FT_Bytes          p     = table;
+    FT_UInt           MathConstants, MathGlyphInfo, MathVariants;
+
+
+    valid->root = ftvalid;
+
+    FT_TRACE3(( "validating MATH table\n" ));
+    OTV_INIT;
+
+    OTV_LIMIT_CHECK( 10 );
+
+    if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */
+      FT_INVALID_FORMAT;
+
+    MathConstants = FT_NEXT_USHORT( p );
+    MathGlyphInfo = FT_NEXT_USHORT( p );
+    MathVariants  = FT_NEXT_USHORT( p );
+
+    valid->glyph_count = glyph_count;
+
+    otv_MathConstants_validate( table + MathConstants,
+                                valid );
+    otv_MathGlyphInfo_validate( table + MathGlyphInfo,
+                                valid );
+    otv_MathVariants_validate ( table + MathVariants,
+                                valid );
+
+    FT_TRACE4(( "\n" ));
+  }
+
+
+/* END */
diff --git a/src/otvalid/otvmod.c b/src/otvalid/otvmod.c
new file mode 100644 (file)
index 0000000..acf213f
--- /dev/null
@@ -0,0 +1,282 @@
+/***************************************************************************/
+/*                                                                         */
+/*  otvmod.c                                                               */
+/*                                                                         */
+/*    FreeType's OpenType validation module implementation (body).         */
+/*                                                                         */
+/*  Copyright 2004, 2005, 2006, 2007, 2008 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_TRUETYPE_TABLES_H
+#include FT_TRUETYPE_TAGS_H
+#include FT_OPENTYPE_VALIDATE_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_SERVICE_OPENTYPE_VALIDATE_H
+
+#include "otvmod.h"
+#include "otvalid.h"
+#include "otvcommn.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_otvmodule
+
+
+  static FT_Error
+  otv_load_table( FT_Face             face,
+                  FT_Tag              tag,
+                  FT_Byte* volatile*  table,
+                  FT_ULong*           table_len )
+  {
+    FT_Error   error;
+    FT_Memory  memory = FT_FACE_MEMORY( face );
+
+
+    error = FT_Load_Sfnt_Table( face, tag, 0, NULL, table_len );
+    if ( error == OTV_Err_Table_Missing )
+      return OTV_Err_Ok;
+    if ( error )
+      goto Exit;
+
+    if ( FT_ALLOC( *table, *table_len ) )
+      goto Exit;
+
+    error = FT_Load_Sfnt_Table( face, tag, 0, *table, table_len );
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  otv_validate( FT_Face volatile   face,
+                FT_UInt            ot_flags,
+                FT_Bytes          *ot_base,
+                FT_Bytes          *ot_gdef,
+                FT_Bytes          *ot_gpos,
+                FT_Bytes          *ot_gsub,
+                FT_Bytes          *ot_jstf )
+  {
+    FT_Error                  error = OTV_Err_Ok;
+    FT_Byte* volatile         base;
+    FT_Byte* volatile         gdef;
+    FT_Byte* volatile         gpos;
+    FT_Byte* volatile         gsub;
+    FT_Byte* volatile         jstf;
+    FT_Byte* volatile         math;
+    FT_ULong                  len_base, len_gdef, len_gpos, len_gsub, len_jstf;
+    FT_ULong                  len_math;
+    FT_UInt                   num_glyphs = (FT_UInt)face->num_glyphs;
+    FT_ValidatorRec volatile  valid;
+
+
+    base     = gdef     = gpos     = gsub     = jstf     = math     = NULL;
+    len_base = len_gdef = len_gpos = len_gsub = len_jstf = len_math = 0;
+
+    /*
+     * XXX: OpenType tables cannot handle 32-bit glyph index,
+     *      although broken TrueType can have 32-bit glyph index.
+     */
+    if ( face->num_glyphs > 0xFFFFL )
+    {
+      FT_TRACE1(( "otv_validate: Invalid glyphs index (0x0000FFFF - 0x%08x) ",
+                  face->num_glyphs ));
+      FT_TRACE1(( "are not handled by OpenType tables\n" ));
+      num_glyphs = 0xFFFF;
+    }
+
+    /* load tables */
+
+    if ( ot_flags & FT_VALIDATE_BASE )
+    {
+      error = otv_load_table( face, TTAG_BASE, &base, &len_base );
+      if ( error )
+        goto Exit;
+    }
+
+    if ( ot_flags & FT_VALIDATE_GDEF )
+    {
+      error = otv_load_table( face, TTAG_GDEF, &gdef, &len_gdef );
+      if ( error )
+        goto Exit;
+    }
+
+    if ( ot_flags & FT_VALIDATE_GPOS )
+    {
+      error = otv_load_table( face, TTAG_GPOS, &gpos, &len_gpos );
+      if ( error )
+        goto Exit;
+    }
+
+    if ( ot_flags & FT_VALIDATE_GSUB )
+    {
+      error = otv_load_table( face, TTAG_GSUB, &gsub, &len_gsub );
+      if ( error )
+        goto Exit;
+    }
+
+    if ( ot_flags & FT_VALIDATE_JSTF )
+    {
+      error = otv_load_table( face, TTAG_JSTF, &jstf, &len_jstf );
+      if ( error )
+        goto Exit;
+    }
+
+    if ( ot_flags & FT_VALIDATE_MATH )
+    {
+      error = otv_load_table( face, TTAG_MATH, &math, &len_math );
+      if ( error )
+        goto Exit;
+    }
+
+    /* validate tables */
+
+    if ( base )
+    {
+      ft_validator_init( &valid, base, base + len_base, FT_VALIDATE_DEFAULT );
+      if ( ft_setjmp( valid.jump_buffer ) == 0 )
+        otv_BASE_validate( base, &valid );
+      error = valid.error;
+      if ( error )
+        goto Exit;
+    }
+
+    if ( gpos )
+    {
+      ft_validator_init( &valid, gpos, gpos + len_gpos, FT_VALIDATE_DEFAULT );
+      if ( ft_setjmp( valid.jump_buffer ) == 0 )
+        otv_GPOS_validate( gpos, num_glyphs, &valid );
+      error = valid.error;
+      if ( error )
+        goto Exit;
+    }
+
+    if ( gsub )
+    {
+      ft_validator_init( &valid, gsub, gsub + len_gsub, FT_VALIDATE_DEFAULT );
+      if ( ft_setjmp( valid.jump_buffer ) == 0 )
+        otv_GSUB_validate( gsub, num_glyphs, &valid );
+      error = valid.error;
+      if ( error )
+        goto Exit;
+    }
+
+    if ( gdef )
+    {
+      ft_validator_init( &valid, gdef, gdef + len_gdef, FT_VALIDATE_DEFAULT );
+      if ( ft_setjmp( valid.jump_buffer ) == 0 )
+        otv_GDEF_validate( gdef, gsub, gpos, num_glyphs, &valid );
+      error = valid.error;
+      if ( error )
+        goto Exit;
+    }
+
+    if ( jstf )
+    {
+      ft_validator_init( &valid, jstf, jstf + len_jstf, FT_VALIDATE_DEFAULT );
+      if ( ft_setjmp( valid.jump_buffer ) == 0 )
+        otv_JSTF_validate( jstf, gsub, gpos, num_glyphs, &valid );
+      error = valid.error;
+      if ( error )
+        goto Exit;
+    }
+
+    if ( math )
+    {
+      ft_validator_init( &valid, math, math + len_math, FT_VALIDATE_DEFAULT );
+      if ( ft_setjmp( valid.jump_buffer ) == 0 )
+        otv_MATH_validate( math, num_glyphs, &valid );
+      error = valid.error;
+      if ( error )
+        goto Exit;
+    }
+
+    *ot_base = (FT_Bytes)base;
+    *ot_gdef = (FT_Bytes)gdef;
+    *ot_gpos = (FT_Bytes)gpos;
+    *ot_gsub = (FT_Bytes)gsub;
+    *ot_jstf = (FT_Bytes)jstf;
+
+  Exit:
+    if ( error )
+    {
+      FT_Memory  memory = FT_FACE_MEMORY( face );
+
+
+      FT_FREE( base );
+      FT_FREE( gdef );
+      FT_FREE( gpos );
+      FT_FREE( gsub );
+      FT_FREE( jstf );
+    }
+
+    {
+      FT_Memory  memory = FT_FACE_MEMORY( face );
+
+
+      FT_FREE( math );                 /* Can't return this as API is frozen */
+    }
+
+    return error;
+  }
+
+
+  static
+  const FT_Service_OTvalidateRec  otvalid_interface =
+  {
+    otv_validate
+  };
+
+
+  static
+  const FT_ServiceDescRec  otvalid_services[] =
+  {
+    { FT_SERVICE_ID_OPENTYPE_VALIDATE, &otvalid_interface },
+    { NULL, NULL }
+  };
+
+
+  static FT_Pointer
+  otvalid_get_service( FT_Module    module,
+                       const char*  service_id )
+  {
+    FT_UNUSED( module );
+
+    return ft_service_list_lookup( otvalid_services, service_id );
+  }
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FT_Module_Class  otv_module_class =
+  {
+    0,
+    sizeof ( FT_ModuleRec ),
+    "otvalid",
+    0x10000L,
+    0x20000L,
+
+    0,              /* module-specific interface */
+
+    (FT_Module_Constructor)0,
+    (FT_Module_Destructor) 0,
+    (FT_Module_Requester)  otvalid_get_service
+  };
+
+
+/* END */
diff --git a/src/otvalid/otvmod.h b/src/otvalid/otvmod.h
new file mode 100644 (file)
index 0000000..f7e1550
--- /dev/null
@@ -0,0 +1,43 @@
+/***************************************************************************/
+/*                                                                         */
+/*  otvmod.h                                                               */
+/*                                                                         */
+/*    FreeType's OpenType validation module implementation                 */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 2004 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __OTVMOD_H__
+#define __OTVMOD_H__
+
+
+#include <ft2build.h>
+#include FT_MODULE_H
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+
+  FT_EXPORT_VAR( const FT_Module_Class )  otv_module_class;
+
+
+FT_END_HEADER
+
+#endif /* __OTVMOD_H__ */
+
+
+/* END */
diff --git a/src/otvalid/rules.mk b/src/otvalid/rules.mk
new file mode 100644 (file)
index 0000000..53bd41e
--- /dev/null
@@ -0,0 +1,78 @@
+#
+# FreeType 2 OpenType validation driver configuration rules
+#
+
+
+# Copyright 2004, 2007 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.
+
+
+# OTV driver directory
+#
+OTV_DIR := $(SRC_DIR)/otvalid
+
+
+# compilation flags for the driver
+#
+OTV_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(OTV_DIR))
+
+
+# OTV driver sources (i.e., C files)
+#
+OTV_DRV_SRC := $(OTV_DIR)/otvbase.c  \
+               $(OTV_DIR)/otvcommn.c \
+               $(OTV_DIR)/otvgdef.c  \
+               $(OTV_DIR)/otvgpos.c  \
+               $(OTV_DIR)/otvgsub.c  \
+               $(OTV_DIR)/otvjstf.c  \
+               $(OTV_DIR)/otvmath.c  \
+               $(OTV_DIR)/otvmod.c
+
+# OTV driver headers
+#
+OTV_DRV_H := $(OTV_DIR)/otvalid.h  \
+             $(OTV_DIR)/otvcommn.h \
+             $(OTV_DIR)/otverror.h \
+             $(OTV_DIR)/otvgpos.h  \
+             $(OTV_DIR)/otvmod.h
+
+
+# OTV driver object(s)
+#
+#   OTV_DRV_OBJ_M is used during `multi' builds.
+#   OTV_DRV_OBJ_S is used during `single' builds.
+#
+OTV_DRV_OBJ_M := $(OTV_DRV_SRC:$(OTV_DIR)/%.c=$(OBJ_DIR)/%.$O)
+OTV_DRV_OBJ_S := $(OBJ_DIR)/otvalid.$O
+
+# OTV driver source file for single build
+#
+OTV_DRV_SRC_S := $(OTV_DIR)/otvalid.c
+
+
+# OTV driver - single object
+#
+$(OTV_DRV_OBJ_S): $(OTV_DRV_SRC_S) $(OTV_DRV_SRC) \
+                   $(FREETYPE_H) $(OTV_DRV_H)
+       $(OTV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(OTV_DRV_SRC_S))
+
+
+# OTV driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(OTV_DIR)/%.c $(FREETYPE_H) $(OTV_DRV_H)
+       $(OTV_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(OTV_DRV_OBJ_S)
+DRV_OBJS_M += $(OTV_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/pcf/Jamfile b/src/pcf/Jamfile
new file mode 100644 (file)
index 0000000..752fcac
--- /dev/null
@@ -0,0 +1,29 @@
+# FreeType 2 src/pcf Jamfile
+#
+# Copyright 2001, 2003 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) pcf ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = pcfdrivr pcfread pcfutil ;
+  }
+  else
+  {
+    _sources = pcf ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/pcf Jamfile
diff --git a/src/pcf/README b/src/pcf/README
new file mode 100644 (file)
index 0000000..8858d68
--- /dev/null
@@ -0,0 +1,96 @@
+                  FreeType font driver for PCF fonts
+
+                       Francesco Zappa Nardelli
+                  <francesco.zappa.nardelli@ens.fr>
+
+
+Introduction
+************
+
+PCF (Portable Compiled Format) is a binary bitmap font format, largely used
+in X world. This code implements a PCF driver for the FreeType library.
+Glyph images are loaded into memory only on demand, thus leading to a small
+memory footprint.
+
+Information on the PCF font format can only be worked out from
+`pcfread.c', and `pcfwrite.c', to be found, for instance, in the XFree86
+(www.xfree86.org) source tree (xc/lib/font/bitmap/).
+
+Many good bitmap fonts in bdf format come with XFree86: they can be
+compiled into the pcf format using the `bdftopcf' utility.
+
+
+Supported hardware
+******************
+
+The driver has been tested on linux/x86 and sunos5.5/sparc.  In both
+cases the compiler was gcc.  When back in Paris, I will test it also
+on linux/alpha.
+
+
+Encodings
+*********
+
+Use `FT_Get_BDF_Charset_ID' to access the encoding and registry.
+
+The driver always exports `ft_encoding_none' as face->charmap.encoding. 
+FT_Get_Char_Index() behavior is unmodified, that is, it converts the ULong
+value given as argument into the corresponding glyph number.
+
+
+Known problems
+**************
+
+- dealing explicitly with encodings breaks the uniformity of freetype2
+  api.
+
+- except for encodings properties, client applications have no
+  visibility of the PCF_Face object.  This means that applications
+  cannot directly access font tables and are obliged to trust
+  FreeType.
+
+- currently, glyph names and ink_metrics are ignored.
+
+I plan to give full visibility of the PCF_Face object in the next
+release of the driver, thus implementing also glyph names and
+ink_metrics.
+
+- height is defined as (ascent - descent).  Is this correct?
+
+- if unable to read size information from the font, PCF_Init_Face
+  sets available_size->width and available_size->height to 12.
+
+- too many english grammar errors in the readme file :-(
+
+
+License
+*******
+
+Copyright (C) 2000 by Francesco Zappa Nardelli
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+Credits
+*******
+
+Keith Packard wrote the pcf driver found in XFree86.  His work is at
+the same time the specification and the sample implementation of the
+PCF format.  Undoubtedly, this driver is inspired from his work.
diff --git a/src/pcf/module.mk b/src/pcf/module.mk
new file mode 100644 (file)
index 0000000..df383ff
--- /dev/null
@@ -0,0 +1,34 @@
+#
+# FreeType 2 PCF module definition
+#
+
+# Copyright 2000, 2006 by
+# Francesco Zappa Nardelli
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+
+FTMODULE_H_COMMANDS += PCF_DRIVER
+
+define PCF_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, pcf_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)pcf       $(ECHO_DRIVER_DESC)pcf bitmap fonts$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/src/pcf/pcf.c b/src/pcf/pcf.c
new file mode 100644 (file)
index 0000000..11d5b7b
--- /dev/null
@@ -0,0 +1,36 @@
+/*  pcf.c
+
+    FreeType font driver for pcf fonts
+
+  Copyright 2000-2001, 2003 by
+  Francesco Zappa Nardelli
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+
+#include <ft2build.h>
+#include "pcfutil.c"
+#include "pcfread.c"
+#include "pcfdrivr.c"
+
+/* END */
diff --git a/src/pcf/pcf.h b/src/pcf/pcf.h
new file mode 100644 (file)
index 0000000..af0ffc3
--- /dev/null
@@ -0,0 +1,237 @@
+/*  pcf.h
+
+  FreeType font driver for pcf fonts
+
+  Copyright (C) 2000, 2001, 2002, 2003, 2006, 2010 by
+  Francesco Zappa Nardelli
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+
+#ifndef __PCF_H__
+#define __PCF_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DRIVER_H
+#include FT_INTERNAL_STREAM_H
+
+
+FT_BEGIN_HEADER
+
+  typedef struct  PCF_TableRec_
+  {
+    FT_ULong  type;
+    FT_ULong  format;
+    FT_ULong  size;
+    FT_ULong  offset;
+
+  } PCF_TableRec, *PCF_Table;
+
+
+  typedef struct  PCF_TocRec_
+  {
+    FT_ULong   version;
+    FT_ULong   count;
+    PCF_Table  tables;
+
+  } PCF_TocRec, *PCF_Toc;
+
+
+  typedef struct  PCF_ParsePropertyRec_
+  {
+    FT_Long  name;
+    FT_Byte  isString;
+    FT_Long  value;
+
+  } PCF_ParsePropertyRec, *PCF_ParseProperty;
+
+
+  typedef struct  PCF_PropertyRec_
+  {
+    FT_String*  name;
+    FT_Byte     isString;
+
+    union
+    {
+      FT_String*  atom;
+      FT_Long     l;
+      FT_ULong    ul;
+
+    } value;
+
+  } PCF_PropertyRec, *PCF_Property;
+
+
+  typedef struct  PCF_Compressed_MetricRec_
+  {
+    FT_Byte  leftSideBearing;
+    FT_Byte  rightSideBearing;
+    FT_Byte  characterWidth;
+    FT_Byte  ascent;
+    FT_Byte  descent;
+
+  } PCF_Compressed_MetricRec, *PCF_Compressed_Metric;
+
+
+  typedef struct  PCF_MetricRec_
+  {
+    FT_Short  leftSideBearing;
+    FT_Short  rightSideBearing;
+    FT_Short  characterWidth;
+    FT_Short  ascent;
+    FT_Short  descent;
+    FT_Short  attributes;
+    FT_ULong  bits;
+
+  } PCF_MetricRec, *PCF_Metric;
+
+
+  typedef struct  PCF_AccelRec_
+  {
+    FT_Byte        noOverlap;
+    FT_Byte        constantMetrics;
+    FT_Byte        terminalFont;
+    FT_Byte        constantWidth;
+    FT_Byte        inkInside;
+    FT_Byte        inkMetrics;
+    FT_Byte        drawDirection;
+    FT_Long        fontAscent;
+    FT_Long        fontDescent;
+    FT_Long        maxOverlap;
+    PCF_MetricRec  minbounds;
+    PCF_MetricRec  maxbounds;
+    PCF_MetricRec  ink_minbounds;
+    PCF_MetricRec  ink_maxbounds;
+
+  } PCF_AccelRec, *PCF_Accel;
+
+
+  typedef struct  PCF_EncodingRec_
+  {
+    FT_Long    enc;
+    FT_UShort  glyph;
+
+  } PCF_EncodingRec, *PCF_Encoding;
+
+
+  typedef struct  PCF_FaceRec_
+  {
+    FT_FaceRec     root;
+
+    FT_StreamRec   comp_stream;
+    FT_Stream      comp_source;
+
+    char*          charset_encoding;
+    char*          charset_registry;
+
+    PCF_TocRec     toc;
+    PCF_AccelRec   accel;
+
+    int            nprops;
+    PCF_Property   properties;
+
+    FT_Long        nmetrics;
+    PCF_Metric     metrics;
+    FT_Long        nencodings;
+    PCF_Encoding   encodings;
+
+    FT_Short       defaultChar;
+
+    FT_ULong       bitmapsFormat;
+
+    FT_CharMap     charmap_handle;
+    FT_CharMapRec  charmap;  /* a single charmap per face */
+
+  } PCF_FaceRec, *PCF_Face;
+
+
+  /* macros for pcf font format */
+
+#define LSBFirst  0
+#define MSBFirst  1
+
+#define PCF_FILE_VERSION        ( ( 'p' << 24 ) | \
+                                  ( 'c' << 16 ) | \
+                                  ( 'f' <<  8 ) | 1 )
+#define PCF_FORMAT_MASK         0xFFFFFF00UL
+
+#define PCF_DEFAULT_FORMAT      0x00000000UL
+#define PCF_INKBOUNDS           0x00000200UL
+#define PCF_ACCEL_W_INKBOUNDS   0x00000100UL
+#define PCF_COMPRESSED_METRICS  0x00000100UL
+
+#define PCF_FORMAT_MATCH( a, b ) \
+          ( ( (a) & PCF_FORMAT_MASK ) == ( (b) & PCF_FORMAT_MASK ) )
+
+#define PCF_GLYPH_PAD_MASK  ( 3 << 0 )
+#define PCF_BYTE_MASK       ( 1 << 2 )
+#define PCF_BIT_MASK        ( 1 << 3 )
+#define PCF_SCAN_UNIT_MASK  ( 3 << 4 )
+
+#define PCF_BYTE_ORDER( f ) \
+          ( ( (f) & PCF_BYTE_MASK ) ? MSBFirst : LSBFirst )
+#define PCF_BIT_ORDER( f ) \
+          ( ( (f) & PCF_BIT_MASK ) ? MSBFirst : LSBFirst )
+#define PCF_GLYPH_PAD_INDEX( f ) \
+          ( (f) & PCF_GLYPH_PAD_MASK )
+#define PCF_GLYPH_PAD( f ) \
+          ( 1 << PCF_GLYPH_PAD_INDEX( f ) )
+#define PCF_SCAN_UNIT_INDEX( f ) \
+          ( ( (f) & PCF_SCAN_UNIT_MASK ) >> 4 )
+#define PCF_SCAN_UNIT( f ) \
+          ( 1 << PCF_SCAN_UNIT_INDEX( f ) )
+#define PCF_FORMAT_BITS( f )             \
+          ( (f) & ( PCF_GLYPH_PAD_MASK | \
+                    PCF_BYTE_MASK      | \
+                    PCF_BIT_MASK       | \
+                    PCF_SCAN_UNIT_MASK ) )
+
+#define PCF_SIZE_TO_INDEX( s )  ( (s) == 4 ? 2 : (s) == 2 ? 1 : 0 )
+#define PCF_INDEX_TO_SIZE( b )  ( 1 << b )
+
+#define PCF_FORMAT( bit, byte, glyph, scan )          \
+          ( ( PCF_SIZE_TO_INDEX( scan )      << 4 ) | \
+            ( ( (bit)  == MSBFirst ? 1 : 0 ) << 3 ) | \
+            ( ( (byte) == MSBFirst ? 1 : 0 ) << 2 ) | \
+            ( PCF_SIZE_TO_INDEX( glyph )     << 0 ) )
+
+#define PCF_PROPERTIES        ( 1 << 0 )
+#define PCF_ACCELERATORS      ( 1 << 1 )
+#define PCF_METRICS           ( 1 << 2 )
+#define PCF_BITMAPS           ( 1 << 3 )
+#define PCF_INK_METRICS       ( 1 << 4 )
+#define PCF_BDF_ENCODINGS     ( 1 << 5 )
+#define PCF_SWIDTHS           ( 1 << 6 )
+#define PCF_GLYPH_NAMES       ( 1 << 7 )
+#define PCF_BDF_ACCELERATORS  ( 1 << 8 )
+
+#define GLYPHPADOPTIONS  4 /* I'm not sure about this */
+
+  FT_LOCAL( FT_Error )
+  pcf_load_font( FT_Stream,
+                 PCF_Face );
+
+FT_END_HEADER
+
+#endif /* __PCF_H__ */
+
+
+/* END */
diff --git a/src/pcf/pcfdrivr.c b/src/pcf/pcfdrivr.c
new file mode 100644 (file)
index 0000000..ba54488
--- /dev/null
@@ -0,0 +1,717 @@
+/*  pcfdrivr.c
+
+    FreeType font driver for pcf files
+
+    Copyright (C) 2000-2004, 2006-2011 by
+    Francesco Zappa Nardelli
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+
+#include <ft2build.h>
+
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_GZIP_H
+#include FT_LZW_H
+#include FT_BZIP2_H
+#include FT_ERRORS_H
+#include FT_BDF_H
+#include FT_TRUETYPE_IDS_H
+
+#include "pcf.h"
+#include "pcfdrivr.h"
+#include "pcfread.h"
+
+#include "pcferror.h"
+#include "pcfutil.h"
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_pcfread
+
+#include FT_SERVICE_BDF_H
+#include FT_SERVICE_XFREE86_NAME_H
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_pcfdriver
+
+
+  typedef struct  PCF_CMapRec_
+  {
+    FT_CMapRec    root;
+    FT_UInt       num_encodings;
+    PCF_Encoding  encodings;
+
+  } PCF_CMapRec, *PCF_CMap;
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  pcf_cmap_init( FT_CMap     pcfcmap,   /* PCF_CMap */
+                 FT_Pointer  init_data )
+  {
+    PCF_CMap  cmap = (PCF_CMap)pcfcmap;
+    PCF_Face  face = (PCF_Face)FT_CMAP_FACE( pcfcmap );
+
+    FT_UNUSED( init_data );
+
+
+    cmap->num_encodings = (FT_UInt)face->nencodings;
+    cmap->encodings     = face->encodings;
+
+    return PCF_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  pcf_cmap_done( FT_CMap  pcfcmap )         /* PCF_CMap */
+  {
+    PCF_CMap  cmap = (PCF_CMap)pcfcmap;
+
+
+    cmap->encodings     = NULL;
+    cmap->num_encodings = 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  pcf_cmap_char_index( FT_CMap    pcfcmap,  /* PCF_CMap */
+                       FT_UInt32  charcode )
+  {
+    PCF_CMap      cmap      = (PCF_CMap)pcfcmap;
+    PCF_Encoding  encodings = cmap->encodings;
+    FT_UInt       min, max, mid;
+    FT_UInt       result    = 0;
+
+
+    min = 0;
+    max = cmap->num_encodings;
+
+    while ( min < max )
+    {
+      FT_ULong  code;
+
+
+      mid  = ( min + max ) >> 1;
+      code = encodings[mid].enc;
+
+      if ( charcode == code )
+      {
+        result = encodings[mid].glyph + 1;
+        break;
+      }
+
+      if ( charcode < code )
+        max = mid;
+      else
+        min = mid + 1;
+    }
+
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  pcf_cmap_char_next( FT_CMap    pcfcmap,   /* PCF_CMap */
+                      FT_UInt32  *acharcode )
+  {
+    PCF_CMap      cmap      = (PCF_CMap)pcfcmap;
+    PCF_Encoding  encodings = cmap->encodings;
+    FT_UInt       min, max, mid;
+    FT_ULong      charcode  = *acharcode + 1;
+    FT_UInt       result    = 0;
+
+
+    min = 0;
+    max = cmap->num_encodings;
+
+    while ( min < max )
+    {
+      FT_ULong  code;
+
+
+      mid  = ( min + max ) >> 1;
+      code = encodings[mid].enc;
+
+      if ( charcode == code )
+      {
+        result = encodings[mid].glyph + 1;
+        goto Exit;
+      }
+
+      if ( charcode < code )
+        max = mid;
+      else
+        min = mid + 1;
+    }
+
+    charcode = 0;
+    if ( min < cmap->num_encodings )
+    {
+      charcode = encodings[min].enc;
+      result   = encodings[min].glyph + 1;
+    }
+
+  Exit:
+    if ( charcode > 0xFFFFFFFFUL )
+    {
+      FT_TRACE1(( "pcf_cmap_char_next: charcode 0x%x > 32bit API" ));
+      *acharcode = 0;
+      /* XXX: result should be changed to indicate an overflow error */
+    }
+    else
+      *acharcode = (FT_UInt32)charcode;
+    return result;
+  }
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FT_CMap_ClassRec  pcf_cmap_class =
+  {
+    sizeof ( PCF_CMapRec ),
+    pcf_cmap_init,
+    pcf_cmap_done,
+    pcf_cmap_char_index,
+    pcf_cmap_char_next,
+
+    NULL, NULL, NULL, NULL, NULL
+  };
+
+
+  FT_CALLBACK_DEF( void )
+  PCF_Face_Done( FT_Face  pcfface )         /* PCF_Face */
+  {
+    PCF_Face   face = (PCF_Face)pcfface;
+    FT_Memory  memory;
+
+
+    if ( !face )
+      return;
+
+    memory = FT_FACE_MEMORY( face );
+
+    FT_FREE( face->encodings );
+    FT_FREE( face->metrics );
+
+    /* free properties */
+    {
+      PCF_Property  prop;
+      FT_Int        i;
+
+
+      if ( face->properties )
+      {
+        for ( i = 0; i < face->nprops; i++ )
+        {
+          prop = &face->properties[i];
+
+          if ( prop )
+          {
+            FT_FREE( prop->name );
+            if ( prop->isString )
+              FT_FREE( prop->value.atom );
+          }
+        }
+      }
+      FT_FREE( face->properties );
+    }
+
+    FT_FREE( face->toc.tables );
+    FT_FREE( pcfface->family_name );
+    FT_FREE( pcfface->style_name );
+    FT_FREE( pcfface->available_sizes );
+    FT_FREE( face->charset_encoding );
+    FT_FREE( face->charset_registry );
+
+    /* close compressed stream if any */
+    if ( pcfface->stream == &face->comp_stream )
+    {
+      FT_Stream_Close( &face->comp_stream );
+      pcfface->stream = face->comp_source;
+    }
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  PCF_Face_Init( FT_Stream      stream,
+                 FT_Face        pcfface,        /* PCF_Face */
+                 FT_Int         face_index,
+                 FT_Int         num_params,
+                 FT_Parameter*  params )
+  {
+    PCF_Face  face  = (PCF_Face)pcfface;
+    FT_Error  error = PCF_Err_Ok;
+
+    FT_UNUSED( num_params );
+    FT_UNUSED( params );
+    FT_UNUSED( face_index );
+
+
+    FT_TRACE2(( "PCF driver\n" ));
+
+    error = pcf_load_font( stream, face );
+    if ( error )
+    {
+      PCF_Face_Done( pcfface );
+
+#if defined( FT_CONFIG_OPTION_USE_ZLIB )  || \
+    defined( FT_CONFIG_OPTION_USE_LZW )   || \
+    defined( FT_CONFIG_OPTION_USE_BZIP2 )
+
+#ifdef FT_CONFIG_OPTION_USE_ZLIB
+      {
+        FT_Error  error2;
+
+
+        /* this didn't work, try gzip support! */
+        error2 = FT_Stream_OpenGzip( &face->comp_stream, stream );
+        if ( FT_ERROR_BASE( error2 ) == FT_Err_Unimplemented_Feature )
+          goto Fail;
+
+        error = error2;
+      }
+#endif /* FT_CONFIG_OPTION_USE_ZLIB */
+
+#ifdef FT_CONFIG_OPTION_USE_LZW
+      if ( error )
+      {
+        FT_Error  error3;
+
+
+        /* this didn't work, try LZW support! */
+        error3 = FT_Stream_OpenLZW( &face->comp_stream, stream );
+        if ( FT_ERROR_BASE( error3 ) == FT_Err_Unimplemented_Feature )
+          goto Fail;
+
+        error = error3;
+      }
+#endif /* FT_CONFIG_OPTION_USE_LZW */
+
+#ifdef FT_CONFIG_OPTION_USE_BZIP2
+      if ( error )
+      {
+        FT_Error  error4;
+
+
+        /* this didn't work, try Bzip2 support! */
+        error4 = FT_Stream_OpenBzip2( &face->comp_stream, stream );
+        if ( FT_ERROR_BASE( error4 ) == FT_Err_Unimplemented_Feature )
+          goto Fail;
+
+        error = error4;
+      }
+#endif /* FT_CONFIG_OPTION_USE_BZIP2 */
+
+      if ( error )
+        goto Fail;
+
+      face->comp_source = stream;
+      pcfface->stream   = &face->comp_stream;
+
+      stream = pcfface->stream;
+
+      error = pcf_load_font( stream, face );
+      if ( error )
+        goto Fail;
+
+#else /* !(FT_CONFIG_OPTION_USE_ZLIB ||
+           FT_CONFIG_OPTION_USE_LZW ||
+           FT_CONFIG_OPTION_USE_BZIP2) */
+
+      goto Fail;
+
+#endif
+    }
+
+    /* set up charmap */
+    {
+      FT_String  *charset_registry = face->charset_registry;
+      FT_String  *charset_encoding = face->charset_encoding;
+      FT_Bool     unicode_charmap  = 0;
+
+
+      if ( charset_registry && charset_encoding )
+      {
+        char*  s = charset_registry;
+
+
+        /* Uh, oh, compare first letters manually to avoid dependency
+           on locales. */
+        if ( ( s[0] == 'i' || s[0] == 'I' ) &&
+             ( s[1] == 's' || s[1] == 'S' ) &&
+             ( s[2] == 'o' || s[2] == 'O' ) )
+        {
+          s += 3;
+          if ( !ft_strcmp( s, "10646" )                      ||
+               ( !ft_strcmp( s, "8859" ) &&
+                 !ft_strcmp( face->charset_encoding, "1" ) ) )
+          unicode_charmap = 1;
+        }
+      }
+
+      {
+        FT_CharMapRec  charmap;
+
+
+        charmap.face        = FT_FACE( face );
+        charmap.encoding    = FT_ENCODING_NONE;
+        /* initial platform/encoding should indicate unset status? */
+        charmap.platform_id = TT_PLATFORM_APPLE_UNICODE;
+        charmap.encoding_id = TT_APPLE_ID_DEFAULT;
+
+        if ( unicode_charmap )
+        {
+          charmap.encoding    = FT_ENCODING_UNICODE;
+          charmap.platform_id = TT_PLATFORM_MICROSOFT;
+          charmap.encoding_id = TT_MS_ID_UNICODE_CS;
+        }
+
+        error = FT_CMap_New( &pcf_cmap_class, NULL, &charmap, NULL );
+
+#if 0
+        /* Select default charmap */
+        if ( pcfface->num_charmaps )
+          pcfface->charmap = pcfface->charmaps[0];
+#endif
+      }
+    }
+
+  Exit:
+    return error;
+
+  Fail:
+    FT_TRACE2(( "  not a PCF file\n" ));
+    PCF_Face_Done( pcfface );
+    error = PCF_Err_Unknown_File_Format;  /* error */
+    goto Exit;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  PCF_Size_Select( FT_Size   size,
+                   FT_ULong  strike_index )
+  {
+    PCF_Accel  accel = &( (PCF_Face)size->face )->accel;
+
+
+    FT_Select_Metrics( size->face, strike_index );
+
+    size->metrics.ascender    =  accel->fontAscent << 6;
+    size->metrics.descender   = -accel->fontDescent << 6;
+    size->metrics.max_advance =  accel->maxbounds.characterWidth << 6;
+
+    return PCF_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  PCF_Size_Request( FT_Size          size,
+                    FT_Size_Request  req )
+  {
+    PCF_Face         face  = (PCF_Face)size->face;
+    FT_Bitmap_Size*  bsize = size->face->available_sizes;
+    FT_Error         error = PCF_Err_Invalid_Pixel_Size;
+    FT_Long          height;
+
+
+    height = FT_REQUEST_HEIGHT( req );
+    height = ( height + 32 ) >> 6;
+
+    switch ( req->type )
+    {
+    case FT_SIZE_REQUEST_TYPE_NOMINAL:
+      if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) )
+        error = PCF_Err_Ok;
+      break;
+
+    case FT_SIZE_REQUEST_TYPE_REAL_DIM:
+      if ( height == ( face->accel.fontAscent +
+                       face->accel.fontDescent ) )
+        error = PCF_Err_Ok;
+      break;
+
+    default:
+      error = PCF_Err_Unimplemented_Feature;
+      break;
+    }
+
+    if ( error )
+      return error;
+    else
+      return PCF_Size_Select( size, 0 );
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  PCF_Glyph_Load( FT_GlyphSlot  slot,
+                  FT_Size       size,
+                  FT_UInt       glyph_index,
+                  FT_Int32      load_flags )
+  {
+    PCF_Face    face   = (PCF_Face)FT_SIZE_FACE( size );
+    FT_Stream   stream;
+    FT_Error    error  = PCF_Err_Ok;
+    FT_Bitmap*  bitmap = &slot->bitmap;
+    PCF_Metric  metric;
+    FT_Offset   bytes;
+
+    FT_UNUSED( load_flags );
+
+
+    FT_TRACE4(( "load_glyph %d ---", glyph_index ));
+
+    if ( !face || glyph_index >= (FT_UInt)face->root.num_glyphs )
+    {
+      error = PCF_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    stream = face->root.stream;
+
+    if ( glyph_index > 0 )
+      glyph_index--;
+
+    metric = face->metrics + glyph_index;
+
+    bitmap->rows       = metric->ascent + metric->descent;
+    bitmap->width      = metric->rightSideBearing - metric->leftSideBearing;
+    bitmap->num_grays  = 1;
+    bitmap->pixel_mode = FT_PIXEL_MODE_MONO;
+
+    FT_TRACE6(( "BIT_ORDER %d ; BYTE_ORDER %d ; GLYPH_PAD %d\n",
+                  PCF_BIT_ORDER( face->bitmapsFormat ),
+                  PCF_BYTE_ORDER( face->bitmapsFormat ),
+                  PCF_GLYPH_PAD( face->bitmapsFormat ) ));
+
+    switch ( PCF_GLYPH_PAD( face->bitmapsFormat ) )
+    {
+    case 1:
+      bitmap->pitch = ( bitmap->width + 7 ) >> 3;
+      break;
+
+    case 2:
+      bitmap->pitch = ( ( bitmap->width + 15 ) >> 4 ) << 1;
+      break;
+
+    case 4:
+      bitmap->pitch = ( ( bitmap->width + 31 ) >> 5 ) << 2;
+      break;
+
+    case 8:
+      bitmap->pitch = ( ( bitmap->width + 63 ) >> 6 ) << 3;
+      break;
+
+    default:
+      return PCF_Err_Invalid_File_Format;
+    }
+
+    /* XXX: to do: are there cases that need repadding the bitmap? */
+    bytes = bitmap->pitch * bitmap->rows;
+
+    error = ft_glyphslot_alloc_bitmap( slot, bytes );
+    if ( error )
+      goto Exit;
+
+    if ( FT_STREAM_SEEK( metric->bits )          ||
+         FT_STREAM_READ( bitmap->buffer, bytes ) )
+      goto Exit;
+
+    if ( PCF_BIT_ORDER( face->bitmapsFormat ) != MSBFirst )
+      BitOrderInvert( bitmap->buffer, bytes );
+
+    if ( ( PCF_BYTE_ORDER( face->bitmapsFormat ) !=
+           PCF_BIT_ORDER( face->bitmapsFormat )  ) )
+    {
+      switch ( PCF_SCAN_UNIT( face->bitmapsFormat ) )
+      {
+      case 1:
+        break;
+
+      case 2:
+        TwoByteSwap( bitmap->buffer, bytes );
+        break;
+
+      case 4:
+        FourByteSwap( bitmap->buffer, bytes );
+        break;
+      }
+    }
+
+    slot->format      = FT_GLYPH_FORMAT_BITMAP;
+    slot->bitmap_left = metric->leftSideBearing;
+    slot->bitmap_top  = metric->ascent;
+
+    slot->metrics.horiAdvance  = metric->characterWidth << 6;
+    slot->metrics.horiBearingX = metric->leftSideBearing << 6;
+    slot->metrics.horiBearingY = metric->ascent << 6;
+    slot->metrics.width        = ( metric->rightSideBearing -
+                                   metric->leftSideBearing ) << 6;
+    slot->metrics.height       = bitmap->rows << 6;
+
+    ft_synthesize_vertical_metrics( &slot->metrics,
+                                    ( face->accel.fontAscent +
+                                      face->accel.fontDescent ) << 6 );
+
+    FT_TRACE4(( " --- ok\n" ));
+
+  Exit:
+    return error;
+  }
+
+
+ /*
+  *
+  *  BDF SERVICE
+  *
+  */
+
+  static FT_Error
+  pcf_get_bdf_property( PCF_Face          face,
+                        const char*       prop_name,
+                        BDF_PropertyRec  *aproperty )
+  {
+    PCF_Property  prop;
+
+
+    prop = pcf_find_property( face, prop_name );
+    if ( prop != NULL )
+    {
+      if ( prop->isString )
+      {
+        aproperty->type   = BDF_PROPERTY_TYPE_ATOM;
+        aproperty->u.atom = prop->value.atom;
+      }
+      else
+      {
+        if ( prop->value.l > 0x7FFFFFFFL || prop->value.l < ( -1 - 0x7FFFFFFFL ) )
+        {
+          FT_TRACE1(( "pcf_get_bdf_property: " ));
+          FT_TRACE1(( "too large integer 0x%x is truncated\n" ));
+        }
+        /* Apparently, the PCF driver loads all properties as signed integers!
+         * This really doesn't seem to be a problem, because this is
+         * sufficient for any meaningful values.
+         */
+        aproperty->type      = BDF_PROPERTY_TYPE_INTEGER;
+        aproperty->u.integer = (FT_Int32)prop->value.l;
+      }
+      return 0;
+    }
+
+    return PCF_Err_Invalid_Argument;
+  }
+
+
+  static FT_Error
+  pcf_get_charset_id( PCF_Face      face,
+                      const char*  *acharset_encoding,
+                      const char*  *acharset_registry )
+  {
+    *acharset_encoding = face->charset_encoding;
+    *acharset_registry = face->charset_registry;
+
+    return 0;
+  }
+
+
+  static const FT_Service_BDFRec  pcf_service_bdf =
+  {
+    (FT_BDF_GetCharsetIdFunc)pcf_get_charset_id,
+    (FT_BDF_GetPropertyFunc) pcf_get_bdf_property
+  };
+
+
+ /*
+  *
+  *  SERVICE LIST
+  *
+  */
+
+  static const FT_ServiceDescRec  pcf_services[] =
+  {
+    { FT_SERVICE_ID_BDF,       &pcf_service_bdf },
+    { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_PCF },
+    { NULL, NULL }
+  };
+
+
+  FT_CALLBACK_DEF( FT_Module_Interface )
+  pcf_driver_requester( FT_Module    module,
+                        const char*  name )
+  {
+    FT_UNUSED( module );
+
+    return ft_service_list_lookup( pcf_services, name );
+  }
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FT_Driver_ClassRec  pcf_driver_class =
+  {
+    {
+      FT_MODULE_FONT_DRIVER        |
+      FT_MODULE_DRIVER_NO_OUTLINES,
+      sizeof ( FT_DriverRec ),
+
+      "pcf",
+      0x10000L,
+      0x20000L,
+
+      0,
+
+      0,                    /* FT_Module_Constructor */
+      0,                    /* FT_Module_Destructor  */
+      pcf_driver_requester
+    },
+
+    sizeof ( PCF_FaceRec ),
+    sizeof ( FT_SizeRec ),
+    sizeof ( FT_GlyphSlotRec ),
+
+    PCF_Face_Init,
+    PCF_Face_Done,
+    0,                      /* FT_Size_InitFunc */
+    0,                      /* FT_Size_DoneFunc */
+    0,                      /* FT_Slot_InitFunc */
+    0,                      /* FT_Slot_DoneFunc */
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+    ft_stub_set_char_sizes,
+    ft_stub_set_pixel_sizes,
+#endif
+    PCF_Glyph_Load,
+
+    0,                      /* FT_Face_GetKerningFunc  */
+    0,                      /* FT_Face_AttachFunc      */
+    0,                      /* FT_Face_GetAdvancesFunc */
+
+    PCF_Size_Request,
+    PCF_Size_Select
+  };
+
+
+/* END */
diff --git a/src/pcf/pcfdrivr.h b/src/pcf/pcfdrivr.h
new file mode 100644 (file)
index 0000000..5461495
--- /dev/null
@@ -0,0 +1,48 @@
+/*  pcfdrivr.h
+
+    FreeType font driver for pcf fonts
+
+  Copyright 2000-2001, 2002 by
+  Francesco Zappa Nardelli
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+
+#ifndef __PCFDRIVR_H__
+#define __PCFDRIVR_H__
+
+#include <ft2build.h>
+#include FT_INTERNAL_DRIVER_H
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+  FT_EXPORT_VAR( const FT_Driver_ClassRec )  pcf_driver_class;
+
+FT_END_HEADER
+
+
+#endif /* __PCFDRIVR_H__ */
+
+
+/* END */
diff --git a/src/pcf/pcferror.h b/src/pcf/pcferror.h
new file mode 100644 (file)
index 0000000..e51fff8
--- /dev/null
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pcferror.h                                                             */
+/*                                                                         */
+/*    PCF error codes (specification only).                                */
+/*                                                                         */
+/*  Copyright 2001, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the PCF error enumeration constants.      */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __PCFERROR_H__
+#define __PCFERROR_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  PCF_Err_
+#define FT_ERR_BASE    FT_Mod_Err_PCF
+
+#include FT_ERRORS_H
+
+#endif /* __PCFERROR_H__ */
+
+
+/* END */
diff --git a/src/pcf/pcfread.c b/src/pcf/pcfread.c
new file mode 100644 (file)
index 0000000..d9914c0
--- /dev/null
@@ -0,0 +1,1278 @@
+/*  pcfread.c
+
+    FreeType font driver for pcf fonts
+
+  Copyright 2000-2010, 2012 by
+  Francesco Zappa Nardelli
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+
+#include <ft2build.h>
+
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_OBJECTS_H
+
+#include "pcf.h"
+#include "pcfread.h"
+
+#include "pcferror.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_pcfread
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+  static const char* const  tableNames[] =
+  {
+    "prop", "accl", "mtrcs", "bmps", "imtrcs",
+    "enc", "swidth", "names", "accel"
+  };
+#endif
+
+
+  static
+  const FT_Frame_Field  pcf_toc_header[] =
+  {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PCF_TocRec
+
+    FT_FRAME_START( 8 ),
+      FT_FRAME_ULONG_LE( version ),
+      FT_FRAME_ULONG_LE( count ),
+    FT_FRAME_END
+  };
+
+
+  static
+  const FT_Frame_Field  pcf_table_header[] =
+  {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PCF_TableRec
+
+    FT_FRAME_START( 16  ),
+      FT_FRAME_ULONG_LE( type ),
+      FT_FRAME_ULONG_LE( format ),
+      FT_FRAME_ULONG_LE( size ),
+      FT_FRAME_ULONG_LE( offset ),
+    FT_FRAME_END
+  };
+
+
+  static FT_Error
+  pcf_read_TOC( FT_Stream  stream,
+                PCF_Face   face )
+  {
+    FT_Error   error;
+    PCF_Toc    toc = &face->toc;
+    PCF_Table  tables;
+
+    FT_Memory  memory = FT_FACE(face)->memory;
+    FT_UInt    n;
+
+
+    if ( FT_STREAM_SEEK ( 0 )                          ||
+         FT_STREAM_READ_FIELDS ( pcf_toc_header, toc ) )
+      return PCF_Err_Cannot_Open_Resource;
+
+    if ( toc->version != PCF_FILE_VERSION                 ||
+         toc->count   >  FT_ARRAY_MAX( face->toc.tables ) ||
+         toc->count   == 0                                )
+      return PCF_Err_Invalid_File_Format;
+
+    if ( FT_NEW_ARRAY( face->toc.tables, toc->count ) )
+      return PCF_Err_Out_Of_Memory;
+
+    tables = face->toc.tables;
+    for ( n = 0; n < toc->count; n++ )
+    {
+      if ( FT_STREAM_READ_FIELDS( pcf_table_header, tables ) )
+        goto Exit;
+      tables++;
+    }
+
+    /* Sort tables and check for overlaps.  Because they are almost      */
+    /* always ordered already, an in-place bubble sort with simultaneous */
+    /* boundary checking seems appropriate.                              */
+    tables = face->toc.tables;
+
+    for ( n = 0; n < toc->count - 1; n++ )
+    {
+      FT_UInt  i, have_change;
+
+
+      have_change = 0;
+
+      for ( i = 0; i < toc->count - 1 - n; i++ )
+      {
+        PCF_TableRec  tmp;
+
+
+        if ( tables[i].offset > tables[i + 1].offset )
+        {
+          tmp           = tables[i];
+          tables[i]     = tables[i + 1];
+          tables[i + 1] = tmp;
+
+          have_change = 1;
+        }
+
+        if ( ( tables[i].size   > tables[i + 1].offset )                  ||
+             ( tables[i].offset > tables[i + 1].offset - tables[i].size ) )
+          return PCF_Err_Invalid_Offset;
+      }
+
+      if ( !have_change )
+        break;
+    }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+    {
+      FT_UInt      i, j;
+      const char*  name = "?";
+
+
+      FT_TRACE4(( "pcf_read_TOC:\n" ));
+
+      FT_TRACE4(( "  number of tables: %ld\n", face->toc.count ));
+
+      tables = face->toc.tables;
+      for ( i = 0; i < toc->count; i++ )
+      {
+        for ( j = 0; j < sizeof ( tableNames ) / sizeof ( tableNames[0] );
+              j++ )
+          if ( tables[i].type == (FT_UInt)( 1 << j ) )
+            name = tableNames[j];
+
+        FT_TRACE4(( "  %d: type=%s, format=0x%X, "
+                    "size=%ld (0x%lX), offset=%ld (0x%lX)\n",
+                    i, name,
+                    tables[i].format,
+                    tables[i].size, tables[i].size,
+                    tables[i].offset, tables[i].offset ));
+      }
+    }
+
+#endif
+
+    return PCF_Err_Ok;
+
+  Exit:
+    FT_FREE( face->toc.tables );
+    return error;
+  }
+
+
+#define PCF_METRIC_SIZE  12
+
+  static
+  const FT_Frame_Field  pcf_metric_header[] =
+  {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PCF_MetricRec
+
+    FT_FRAME_START( PCF_METRIC_SIZE ),
+      FT_FRAME_SHORT_LE( leftSideBearing ),
+      FT_FRAME_SHORT_LE( rightSideBearing ),
+      FT_FRAME_SHORT_LE( characterWidth ),
+      FT_FRAME_SHORT_LE( ascent ),
+      FT_FRAME_SHORT_LE( descent ),
+      FT_FRAME_SHORT_LE( attributes ),
+    FT_FRAME_END
+  };
+
+
+  static
+  const FT_Frame_Field  pcf_metric_msb_header[] =
+  {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PCF_MetricRec
+
+    FT_FRAME_START( PCF_METRIC_SIZE ),
+      FT_FRAME_SHORT( leftSideBearing ),
+      FT_FRAME_SHORT( rightSideBearing ),
+      FT_FRAME_SHORT( characterWidth ),
+      FT_FRAME_SHORT( ascent ),
+      FT_FRAME_SHORT( descent ),
+      FT_FRAME_SHORT( attributes ),
+    FT_FRAME_END
+  };
+
+
+#define PCF_COMPRESSED_METRIC_SIZE  5
+
+  static
+  const FT_Frame_Field  pcf_compressed_metric_header[] =
+  {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PCF_Compressed_MetricRec
+
+    FT_FRAME_START( PCF_COMPRESSED_METRIC_SIZE ),
+      FT_FRAME_BYTE( leftSideBearing ),
+      FT_FRAME_BYTE( rightSideBearing ),
+      FT_FRAME_BYTE( characterWidth ),
+      FT_FRAME_BYTE( ascent ),
+      FT_FRAME_BYTE( descent ),
+    FT_FRAME_END
+  };
+
+
+  static FT_Error
+  pcf_get_metric( FT_Stream   stream,
+                  FT_ULong    format,
+                  PCF_Metric  metric )
+  {
+    FT_Error  error = PCF_Err_Ok;
+
+
+    if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )
+    {
+      const FT_Frame_Field*  fields;
+
+
+      /* parsing normal metrics */
+      fields = PCF_BYTE_ORDER( format ) == MSBFirst
+               ? pcf_metric_msb_header
+               : pcf_metric_header;
+
+      /* the following sets `error' but doesn't return in case of failure */
+      (void)FT_STREAM_READ_FIELDS( fields, metric );
+    }
+    else
+    {
+      PCF_Compressed_MetricRec  compr;
+
+
+      /* parsing compressed metrics */
+      if ( FT_STREAM_READ_FIELDS( pcf_compressed_metric_header, &compr ) )
+        goto Exit;
+
+      metric->leftSideBearing  = (FT_Short)( compr.leftSideBearing  - 0x80 );
+      metric->rightSideBearing = (FT_Short)( compr.rightSideBearing - 0x80 );
+      metric->characterWidth   = (FT_Short)( compr.characterWidth   - 0x80 );
+      metric->ascent           = (FT_Short)( compr.ascent           - 0x80 );
+      metric->descent          = (FT_Short)( compr.descent          - 0x80 );
+      metric->attributes       = 0;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  pcf_seek_to_table_type( FT_Stream  stream,
+                          PCF_Table  tables,
+                          FT_ULong   ntables, /* same as PCF_Toc->count */
+                          FT_ULong   type,
+                          FT_ULong  *aformat,
+                          FT_ULong  *asize )
+  {
+    FT_Error  error = PCF_Err_Invalid_File_Format;
+    FT_ULong  i;
+
+
+    for ( i = 0; i < ntables; i++ )
+      if ( tables[i].type == type )
+      {
+        if ( stream->pos > tables[i].offset )
+        {
+          error = PCF_Err_Invalid_Stream_Skip;
+          goto Fail;
+        }
+
+        if ( FT_STREAM_SKIP( tables[i].offset - stream->pos ) )
+        {
+          error = PCF_Err_Invalid_Stream_Skip;
+          goto Fail;
+        }
+
+        *asize   = tables[i].size;
+        *aformat = tables[i].format;
+
+        return PCF_Err_Ok;
+      }
+
+  Fail:
+    *asize = 0;
+    return error;
+  }
+
+
+  static FT_Bool
+  pcf_has_table_type( PCF_Table  tables,
+                      FT_ULong   ntables, /* same as PCF_Toc->count */
+                      FT_ULong   type )
+  {
+    FT_ULong  i;
+
+
+    for ( i = 0; i < ntables; i++ )
+      if ( tables[i].type == type )
+        return TRUE;
+
+    return FALSE;
+  }
+
+
+#define PCF_PROPERTY_SIZE  9
+
+  static
+  const FT_Frame_Field  pcf_property_header[] =
+  {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PCF_ParsePropertyRec
+
+    FT_FRAME_START( PCF_PROPERTY_SIZE ),
+      FT_FRAME_LONG_LE( name ),
+      FT_FRAME_BYTE   ( isString ),
+      FT_FRAME_LONG_LE( value ),
+    FT_FRAME_END
+  };
+
+
+  static
+  const FT_Frame_Field  pcf_property_msb_header[] =
+  {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PCF_ParsePropertyRec
+
+    FT_FRAME_START( PCF_PROPERTY_SIZE ),
+      FT_FRAME_LONG( name ),
+      FT_FRAME_BYTE( isString ),
+      FT_FRAME_LONG( value ),
+    FT_FRAME_END
+  };
+
+
+  FT_LOCAL_DEF( PCF_Property )
+  pcf_find_property( PCF_Face          face,
+                     const FT_String*  prop )
+  {
+    PCF_Property  properties = face->properties;
+    FT_Bool       found      = 0;
+    int           i;
+
+
+    for ( i = 0 ; i < face->nprops && !found; i++ )
+    {
+      if ( !ft_strcmp( properties[i].name, prop ) )
+        found = 1;
+    }
+
+    if ( found )
+      return properties + i - 1;
+    else
+      return NULL;
+  }
+
+
+  static FT_Error
+  pcf_get_properties( FT_Stream  stream,
+                      PCF_Face   face )
+  {
+    PCF_ParseProperty  props      = 0;
+    PCF_Property       properties = NULL;
+    FT_ULong           nprops, i;
+    FT_ULong           format, size;
+    FT_Error           error;
+    FT_Memory          memory     = FT_FACE(face)->memory;
+    FT_ULong           string_size;
+    FT_String*         strings    = 0;
+
+
+    error = pcf_seek_to_table_type( stream,
+                                    face->toc.tables,
+                                    face->toc.count,
+                                    PCF_PROPERTIES,
+                                    &format,
+                                    &size );
+    if ( error )
+      goto Bail;
+
+    if ( FT_READ_ULONG_LE( format ) )
+      goto Bail;
+
+    FT_TRACE4(( "pcf_get_properties:\n" ));
+
+    FT_TRACE4(( "  format = %ld\n", format ));
+
+    if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )
+      goto Bail;
+
+    if ( PCF_BYTE_ORDER( format ) == MSBFirst )
+      (void)FT_READ_ULONG( nprops );
+    else
+      (void)FT_READ_ULONG_LE( nprops );
+    if ( error )
+      goto Bail;
+
+    FT_TRACE4(( "  nprop = %d (truncate %d props)\n",
+                (int)nprops, nprops - (int)nprops ));
+
+    nprops = (int)nprops;
+
+    /* rough estimate */
+    if ( nprops > size / PCF_PROPERTY_SIZE )
+    {
+      error = PCF_Err_Invalid_Table;
+      goto Bail;
+    }
+
+    face->nprops = (int)nprops;
+
+    if ( FT_NEW_ARRAY( props, nprops ) )
+      goto Bail;
+
+    for ( i = 0; i < nprops; i++ )
+    {
+      if ( PCF_BYTE_ORDER( format ) == MSBFirst )
+      {
+        if ( FT_STREAM_READ_FIELDS( pcf_property_msb_header, props + i ) )
+          goto Bail;
+      }
+      else
+      {
+        if ( FT_STREAM_READ_FIELDS( pcf_property_header, props + i ) )
+          goto Bail;
+      }
+    }
+
+    /* pad the property array                                            */
+    /*                                                                   */
+    /* clever here - nprops is the same as the number of odd-units read, */
+    /* as only isStringProp are odd length   (Keith Packard)             */
+    /*                                                                   */
+    if ( nprops & 3 )
+    {
+      i = 4 - ( nprops & 3 );
+      if ( FT_STREAM_SKIP( i ) )
+      {
+        error = PCF_Err_Invalid_Stream_Skip;
+        goto Bail;
+      }
+    }
+
+    if ( PCF_BYTE_ORDER( format ) == MSBFirst )
+      (void)FT_READ_ULONG( string_size );
+    else
+      (void)FT_READ_ULONG_LE( string_size );
+    if ( error )
+      goto Bail;
+
+    FT_TRACE4(( "  string_size = %ld\n", string_size ));
+
+    /* rough estimate */
+    if ( string_size > size - nprops * PCF_PROPERTY_SIZE )
+    {
+      error = PCF_Err_Invalid_Table;
+      goto Bail;
+    }
+
+    /* allocate one more byte so that we have a final null byte */
+    if ( FT_NEW_ARRAY( strings, string_size + 1 ) )
+      goto Bail;
+
+    error = FT_Stream_Read( stream, (FT_Byte*)strings, string_size );
+    if ( error )
+      goto Bail;
+
+    if ( FT_NEW_ARRAY( properties, nprops ) )
+      goto Bail;
+
+    face->properties = properties;
+
+    for ( i = 0; i < nprops; i++ )
+    {
+      FT_Long  name_offset = props[i].name;
+
+
+      if ( ( name_offset < 0 )                     ||
+           ( (FT_ULong)name_offset > string_size ) )
+      {
+        error = PCF_Err_Invalid_Offset;
+        goto Bail;
+      }
+
+      if ( FT_STRDUP( properties[i].name, strings + name_offset ) )
+        goto Bail;
+
+      FT_TRACE4(( "  %s:", properties[i].name ));
+
+      properties[i].isString = props[i].isString;
+
+      if ( props[i].isString )
+      {
+        FT_Long  value_offset = props[i].value;
+
+
+        if ( ( value_offset < 0 )                     ||
+             ( (FT_ULong)value_offset > string_size ) )
+        {
+          error = PCF_Err_Invalid_Offset;
+          goto Bail;
+        }
+
+        if ( FT_STRDUP( properties[i].value.atom, strings + value_offset ) )
+          goto Bail;
+
+        FT_TRACE4(( " `%s'\n", properties[i].value.atom ));
+      }
+      else
+      {
+        properties[i].value.l = props[i].value;
+
+        FT_TRACE4(( " %d\n", properties[i].value.l ));
+      }
+    }
+
+    error = PCF_Err_Ok;
+
+  Bail:
+    FT_FREE( props );
+    FT_FREE( strings );
+
+    return error;
+  }
+
+
+  static FT_Error
+  pcf_get_metrics( FT_Stream  stream,
+                   PCF_Face   face )
+  {
+    FT_Error    error    = PCF_Err_Ok;
+    FT_Memory   memory   = FT_FACE(face)->memory;
+    FT_ULong    format, size;
+    PCF_Metric  metrics  = 0;
+    FT_ULong    nmetrics, i;
+
+
+    error = pcf_seek_to_table_type( stream,
+                                    face->toc.tables,
+                                    face->toc.count,
+                                    PCF_METRICS,
+                                    &format,
+                                    &size );
+    if ( error )
+      return error;
+
+    if ( FT_READ_ULONG_LE( format ) )
+      goto Bail;
+
+    if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT )     &&
+         !PCF_FORMAT_MATCH( format, PCF_COMPRESSED_METRICS ) )
+      return PCF_Err_Invalid_File_Format;
+
+    if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )
+    {
+      if ( PCF_BYTE_ORDER( format ) == MSBFirst )
+        (void)FT_READ_ULONG( nmetrics );
+      else
+        (void)FT_READ_ULONG_LE( nmetrics );
+    }
+    else
+    {
+      if ( PCF_BYTE_ORDER( format ) == MSBFirst )
+        (void)FT_READ_USHORT( nmetrics );
+      else
+        (void)FT_READ_USHORT_LE( nmetrics );
+    }
+    if ( error )
+      return PCF_Err_Invalid_File_Format;
+
+    face->nmetrics = nmetrics;
+
+    if ( !nmetrics )
+      return PCF_Err_Invalid_Table;
+
+    FT_TRACE4(( "pcf_get_metrics:\n" ));
+
+    FT_TRACE4(( "  number of metrics: %d\n", nmetrics ));
+
+    /* rough estimate */
+    if ( PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )
+    {
+      if ( nmetrics > size / PCF_METRIC_SIZE )
+        return PCF_Err_Invalid_Table;
+    }
+    else
+    {
+      if ( nmetrics > size / PCF_COMPRESSED_METRIC_SIZE )
+        return PCF_Err_Invalid_Table;
+    }
+
+    if ( FT_NEW_ARRAY( face->metrics, nmetrics ) )
+      return PCF_Err_Out_Of_Memory;
+
+    metrics = face->metrics;
+    for ( i = 0; i < nmetrics; i++ )
+    {
+      error = pcf_get_metric( stream, format, metrics + i );
+
+      metrics[i].bits = 0;
+
+      FT_TRACE5(( "  idx %d: width=%d, "
+                  "lsb=%d, rsb=%d, ascent=%d, descent=%d, swidth=%d\n",
+                  i,
+                  ( metrics + i )->characterWidth,
+                  ( metrics + i )->leftSideBearing,
+                  ( metrics + i )->rightSideBearing,
+                  ( metrics + i )->ascent,
+                  ( metrics + i )->descent,
+                  ( metrics + i )->attributes ));
+
+      if ( error )
+        break;
+    }
+
+    if ( error )
+      FT_FREE( face->metrics );
+
+  Bail:
+    return error;
+  }
+
+
+  static FT_Error
+  pcf_get_bitmaps( FT_Stream  stream,
+                   PCF_Face   face )
+  {
+    FT_Error   error   = PCF_Err_Ok;
+    FT_Memory  memory  = FT_FACE(face)->memory;
+    FT_Long*   offsets = NULL;
+    FT_Long    bitmapSizes[GLYPHPADOPTIONS];
+    FT_ULong   format, size;
+    FT_ULong   nbitmaps, i, sizebitmaps = 0;
+
+
+    error = pcf_seek_to_table_type( stream,
+                                    face->toc.tables,
+                                    face->toc.count,
+                                    PCF_BITMAPS,
+                                    &format,
+                                    &size );
+    if ( error )
+      return error;
+
+    error = FT_Stream_EnterFrame( stream, 8 );
+    if ( error )
+      return error;
+
+    format = FT_GET_ULONG_LE();
+    if ( PCF_BYTE_ORDER( format ) == MSBFirst )
+      nbitmaps  = FT_GET_ULONG();
+    else
+      nbitmaps  = FT_GET_ULONG_LE();
+
+    FT_Stream_ExitFrame( stream );
+
+    if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )
+      return PCF_Err_Invalid_File_Format;
+
+    FT_TRACE4(( "pcf_get_bitmaps:\n" ));
+
+    FT_TRACE4(( "  number of bitmaps: %d\n", nbitmaps ));
+
+    /* XXX: PCF_Face->nmetrics is singed FT_Long, see pcf.h */
+    if ( face->nmetrics < 0 || nbitmaps != ( FT_ULong )face->nmetrics )
+      return PCF_Err_Invalid_File_Format;
+
+    if ( FT_NEW_ARRAY( offsets, nbitmaps ) )
+      return error;
+
+    for ( i = 0; i < nbitmaps; i++ )
+    {
+      if ( PCF_BYTE_ORDER( format ) == MSBFirst )
+        (void)FT_READ_LONG( offsets[i] );
+      else
+        (void)FT_READ_LONG_LE( offsets[i] );
+
+      FT_TRACE5(( "  bitmap %d: offset %ld (0x%lX)\n",
+                  i, offsets[i], offsets[i] ));
+    }
+    if ( error )
+      goto Bail;
+
+    for ( i = 0; i < GLYPHPADOPTIONS; i++ )
+    {
+      if ( PCF_BYTE_ORDER( format ) == MSBFirst )
+        (void)FT_READ_LONG( bitmapSizes[i] );
+      else
+        (void)FT_READ_LONG_LE( bitmapSizes[i] );
+      if ( error )
+        goto Bail;
+
+      sizebitmaps = bitmapSizes[PCF_GLYPH_PAD_INDEX( format )];
+
+      FT_TRACE4(( "  padding %d implies a size of %ld\n", i, bitmapSizes[i] ));
+    }
+
+    FT_TRACE4(( "  %d bitmaps, padding index %ld\n",
+                nbitmaps,
+                PCF_GLYPH_PAD_INDEX( format ) ));
+    FT_TRACE4(( "  bitmap size = %d\n", sizebitmaps ));
+
+    FT_UNUSED( sizebitmaps );       /* only used for debugging */
+
+    for ( i = 0; i < nbitmaps; i++ )
+    {
+      /* rough estimate */
+      if ( ( offsets[i] < 0 )              ||
+           ( (FT_ULong)offsets[i] > size ) )
+      {
+        FT_TRACE0(( "pcf_get_bitmaps:"
+                    " invalid offset to bitmap data of glyph %d\n", i ));
+      }
+      else
+        face->metrics[i].bits = stream->pos + offsets[i];
+    }
+
+    face->bitmapsFormat = format;
+
+  Bail:
+    FT_FREE( offsets );
+    return error;
+  }
+
+
+  static FT_Error
+  pcf_get_encodings( FT_Stream  stream,
+                     PCF_Face   face )
+  {
+    FT_Error      error  = PCF_Err_Ok;
+    FT_Memory     memory = FT_FACE(face)->memory;
+    FT_ULong      format, size;
+    int           firstCol, lastCol;
+    int           firstRow, lastRow;
+    int           nencoding, encodingOffset;
+    int           i, j;
+    PCF_Encoding  tmpEncoding = NULL, encoding = 0;
+
+
+    error = pcf_seek_to_table_type( stream,
+                                    face->toc.tables,
+                                    face->toc.count,
+                                    PCF_BDF_ENCODINGS,
+                                    &format,
+                                    &size );
+    if ( error )
+      return error;
+
+    error = FT_Stream_EnterFrame( stream, 14 );
+    if ( error )
+      return error;
+
+    format = FT_GET_ULONG_LE();
+
+    if ( PCF_BYTE_ORDER( format ) == MSBFirst )
+    {
+      firstCol          = FT_GET_SHORT();
+      lastCol           = FT_GET_SHORT();
+      firstRow          = FT_GET_SHORT();
+      lastRow           = FT_GET_SHORT();
+      face->defaultChar = FT_GET_SHORT();
+    }
+    else
+    {
+      firstCol          = FT_GET_SHORT_LE();
+      lastCol           = FT_GET_SHORT_LE();
+      firstRow          = FT_GET_SHORT_LE();
+      lastRow           = FT_GET_SHORT_LE();
+      face->defaultChar = FT_GET_SHORT_LE();
+    }
+
+    FT_Stream_ExitFrame( stream );
+
+    if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )
+      return PCF_Err_Invalid_File_Format;
+
+    FT_TRACE4(( "pdf_get_encodings:\n" ));
+
+    FT_TRACE4(( "  firstCol %d, lastCol %d, firstRow %d, lastRow %d\n",
+                firstCol, lastCol, firstRow, lastRow ));
+
+    nencoding = ( lastCol - firstCol + 1 ) * ( lastRow - firstRow + 1 );
+
+    if ( FT_NEW_ARRAY( tmpEncoding, nencoding ) )
+      return PCF_Err_Out_Of_Memory;
+
+    error = FT_Stream_EnterFrame( stream, 2 * nencoding );
+    if ( error )
+      goto Bail;
+
+    for ( i = 0, j = 0 ; i < nencoding; i++ )
+    {
+      if ( PCF_BYTE_ORDER( format ) == MSBFirst )
+        encodingOffset = FT_GET_SHORT();
+      else
+        encodingOffset = FT_GET_SHORT_LE();
+
+      if ( encodingOffset != -1 )
+      {
+        tmpEncoding[j].enc = ( ( ( i / ( lastCol - firstCol + 1 ) ) +
+                                 firstRow ) * 256 ) +
+                               ( ( i % ( lastCol - firstCol + 1 ) ) +
+                                 firstCol );
+
+        tmpEncoding[j].glyph = (FT_Short)encodingOffset;
+
+        FT_TRACE5(( "  code %d (0x%04X): idx %d\n",
+                    tmpEncoding[j].enc, tmpEncoding[j].enc,
+                    tmpEncoding[j].glyph ));
+
+        j++;
+      }
+    }
+    FT_Stream_ExitFrame( stream );
+
+    if ( FT_NEW_ARRAY( encoding, j ) )
+      goto Bail;
+
+    for ( i = 0; i < j; i++ )
+    {
+      encoding[i].enc   = tmpEncoding[i].enc;
+      encoding[i].glyph = tmpEncoding[i].glyph;
+    }
+
+    face->nencodings = j;
+    face->encodings  = encoding;
+    FT_FREE( tmpEncoding );
+
+    return error;
+
+  Bail:
+    FT_FREE( encoding );
+    FT_FREE( tmpEncoding );
+    return error;
+  }
+
+
+  static
+  const FT_Frame_Field  pcf_accel_header[] =
+  {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PCF_AccelRec
+
+    FT_FRAME_START( 20 ),
+      FT_FRAME_BYTE      ( noOverlap ),
+      FT_FRAME_BYTE      ( constantMetrics ),
+      FT_FRAME_BYTE      ( terminalFont ),
+      FT_FRAME_BYTE      ( constantWidth ),
+      FT_FRAME_BYTE      ( inkInside ),
+      FT_FRAME_BYTE      ( inkMetrics ),
+      FT_FRAME_BYTE      ( drawDirection ),
+      FT_FRAME_SKIP_BYTES( 1 ),
+      FT_FRAME_LONG_LE   ( fontAscent ),
+      FT_FRAME_LONG_LE   ( fontDescent ),
+      FT_FRAME_LONG_LE   ( maxOverlap ),
+    FT_FRAME_END
+  };
+
+
+  static
+  const FT_Frame_Field  pcf_accel_msb_header[] =
+  {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PCF_AccelRec
+
+    FT_FRAME_START( 20 ),
+      FT_FRAME_BYTE      ( noOverlap ),
+      FT_FRAME_BYTE      ( constantMetrics ),
+      FT_FRAME_BYTE      ( terminalFont ),
+      FT_FRAME_BYTE      ( constantWidth ),
+      FT_FRAME_BYTE      ( inkInside ),
+      FT_FRAME_BYTE      ( inkMetrics ),
+      FT_FRAME_BYTE      ( drawDirection ),
+      FT_FRAME_SKIP_BYTES( 1 ),
+      FT_FRAME_LONG      ( fontAscent ),
+      FT_FRAME_LONG      ( fontDescent ),
+      FT_FRAME_LONG      ( maxOverlap ),
+    FT_FRAME_END
+  };
+
+
+  static FT_Error
+  pcf_get_accel( FT_Stream  stream,
+                 PCF_Face   face,
+                 FT_ULong   type )
+  {
+    FT_ULong   format, size;
+    FT_Error   error = PCF_Err_Ok;
+    PCF_Accel  accel = &face->accel;
+
+
+    error = pcf_seek_to_table_type( stream,
+                                    face->toc.tables,
+                                    face->toc.count,
+                                    type,
+                                    &format,
+                                    &size );
+    if ( error )
+      goto Bail;
+
+    if ( FT_READ_ULONG_LE( format ) )
+      goto Bail;
+
+    if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT )    &&
+         !PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) )
+      goto Bail;
+
+    if ( PCF_BYTE_ORDER( format ) == MSBFirst )
+    {
+      if ( FT_STREAM_READ_FIELDS( pcf_accel_msb_header, accel ) )
+        goto Bail;
+    }
+    else
+    {
+      if ( FT_STREAM_READ_FIELDS( pcf_accel_header, accel ) )
+        goto Bail;
+    }
+
+    error = pcf_get_metric( stream,
+                            format & ( ~PCF_FORMAT_MASK ),
+                            &(accel->minbounds) );
+    if ( error )
+      goto Bail;
+
+    error = pcf_get_metric( stream,
+                            format & ( ~PCF_FORMAT_MASK ),
+                            &(accel->maxbounds) );
+    if ( error )
+      goto Bail;
+
+    if ( PCF_FORMAT_MATCH( format, PCF_ACCEL_W_INKBOUNDS ) )
+    {
+      error = pcf_get_metric( stream,
+                              format & ( ~PCF_FORMAT_MASK ),
+                              &(accel->ink_minbounds) );
+      if ( error )
+        goto Bail;
+
+      error = pcf_get_metric( stream,
+                              format & ( ~PCF_FORMAT_MASK ),
+                              &(accel->ink_maxbounds) );
+      if ( error )
+        goto Bail;
+    }
+    else
+    {
+      accel->ink_minbounds = accel->minbounds; /* I'm not sure about this */
+      accel->ink_maxbounds = accel->maxbounds;
+    }
+
+  Bail:
+    return error;
+  }
+
+
+  static FT_Error
+  pcf_interpret_style( PCF_Face  pcf )
+  {
+    FT_Error   error  = PCF_Err_Ok;
+    FT_Face    face   = FT_FACE( pcf );
+    FT_Memory  memory = face->memory;
+
+    PCF_Property  prop;
+
+    size_t  nn, len;
+    char*   strings[4] = { NULL, NULL, NULL, NULL };
+    size_t  lengths[4];
+
+
+    face->style_flags = 0;
+
+    prop = pcf_find_property( pcf, "SLANT" );
+    if ( prop && prop->isString                                       &&
+         ( *(prop->value.atom) == 'O' || *(prop->value.atom) == 'o' ||
+           *(prop->value.atom) == 'I' || *(prop->value.atom) == 'i' ) )
+    {
+      face->style_flags |= FT_STYLE_FLAG_ITALIC;
+      strings[2] = ( *(prop->value.atom) == 'O' ||
+                     *(prop->value.atom) == 'o' ) ? (char *)"Oblique"
+                                                  : (char *)"Italic";
+    }
+
+    prop = pcf_find_property( pcf, "WEIGHT_NAME" );
+    if ( prop && prop->isString                                       &&
+         ( *(prop->value.atom) == 'B' || *(prop->value.atom) == 'b' ) )
+    {
+      face->style_flags |= FT_STYLE_FLAG_BOLD;
+      strings[1] = (char *)"Bold";
+    }
+
+    prop = pcf_find_property( pcf, "SETWIDTH_NAME" );
+    if ( prop && prop->isString                                        &&
+         *(prop->value.atom)                                           &&
+         !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) )
+      strings[3] = (char *)(prop->value.atom);
+
+    prop = pcf_find_property( pcf, "ADD_STYLE_NAME" );
+    if ( prop && prop->isString                                        &&
+         *(prop->value.atom)                                           &&
+         !( *(prop->value.atom) == 'N' || *(prop->value.atom) == 'n' ) )
+      strings[0] = (char *)(prop->value.atom);
+
+    for ( len = 0, nn = 0; nn < 4; nn++ )
+    {
+      lengths[nn] = 0;
+      if ( strings[nn] )
+      {
+        lengths[nn] = ft_strlen( strings[nn] );
+        len        += lengths[nn] + 1;
+      }
+    }
+
+    if ( len == 0 )
+    {
+      strings[0] = (char *)"Regular";
+      lengths[0] = ft_strlen( strings[0] );
+      len        = lengths[0] + 1;
+    }
+
+    {
+      char*  s;
+
+
+      if ( FT_ALLOC( face->style_name, len ) )
+        return error;
+
+      s = face->style_name;
+
+      for ( nn = 0; nn < 4; nn++ )
+      {
+        char*  src = strings[nn];
+
+
+        len = lengths[nn];
+
+        if ( src == NULL )
+          continue;
+
+        /* separate elements with a space */
+        if ( s != face->style_name )
+          *s++ = ' ';
+
+        ft_memcpy( s, src, len );
+
+        /* need to convert spaces to dashes for */
+        /* add_style_name and setwidth_name     */
+        if ( nn == 0 || nn == 3 )
+        {
+          size_t  mm;
+
+
+          for ( mm = 0; mm < len; mm++ )
+            if (s[mm] == ' ')
+              s[mm] = '-';
+        }
+
+        s += len;
+      }
+      *s = 0;
+    }
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  pcf_load_font( FT_Stream  stream,
+                 PCF_Face   face )
+  {
+    FT_Error   error  = PCF_Err_Ok;
+    FT_Memory  memory = FT_FACE(face)->memory;
+    FT_Bool    hasBDFAccelerators;
+
+
+    error = pcf_read_TOC( stream, face );
+    if ( error )
+      goto Exit;
+
+    error = pcf_get_properties( stream, face );
+    if ( error )
+      goto Exit;
+
+    /* Use the old accelerators if no BDF accelerators are in the file. */
+    hasBDFAccelerators = pcf_has_table_type( face->toc.tables,
+                                             face->toc.count,
+                                             PCF_BDF_ACCELERATORS );
+    if ( !hasBDFAccelerators )
+    {
+      error = pcf_get_accel( stream, face, PCF_ACCELERATORS );
+      if ( error )
+        goto Exit;
+    }
+
+    /* metrics */
+    error = pcf_get_metrics( stream, face );
+    if ( error )
+      goto Exit;
+
+    /* bitmaps */
+    error = pcf_get_bitmaps( stream, face );
+    if ( error )
+      goto Exit;
+
+    /* encodings */
+    error = pcf_get_encodings( stream, face );
+    if ( error )
+      goto Exit;
+
+    /* BDF style accelerators (i.e. bounds based on encoded glyphs) */
+    if ( hasBDFAccelerators )
+    {
+      error = pcf_get_accel( stream, face, PCF_BDF_ACCELERATORS );
+      if ( error )
+        goto Exit;
+    }
+
+    /* XXX: TO DO: inkmetrics and glyph_names are missing */
+
+    /* now construct the face object */
+    {
+      FT_Face       root = FT_FACE( face );
+      PCF_Property  prop;
+
+
+      root->num_faces  = 1;
+      root->face_index = 0;
+      root->face_flags = FT_FACE_FLAG_FIXED_SIZES |
+                         FT_FACE_FLAG_HORIZONTAL  |
+                         FT_FACE_FLAG_FAST_GLYPHS;
+
+      if ( face->accel.constantWidth )
+        root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+      if ( ( error = pcf_interpret_style( face ) ) != 0 )
+         goto Exit;
+
+      prop = pcf_find_property( face, "FAMILY_NAME" );
+      if ( prop && prop->isString )
+      {
+        if ( FT_STRDUP( root->family_name, prop->value.atom ) )
+          goto Exit;
+      }
+      else
+        root->family_name = NULL;
+
+      /*
+       * Note: We shift all glyph indices by +1 since we must
+       * respect the convention that glyph 0 always corresponds
+       * to the `missing glyph'.
+       *
+       * This implies bumping the number of `available' glyphs by 1.
+       */
+      root->num_glyphs = face->nmetrics + 1;
+
+      root->num_fixed_sizes = 1;
+      if ( FT_NEW_ARRAY( root->available_sizes, 1 ) )
+        goto Exit;
+
+      {
+        FT_Bitmap_Size*  bsize = root->available_sizes;
+        FT_Short         resolution_x = 0, resolution_y = 0;
+
+
+        FT_MEM_ZERO( bsize, sizeof ( FT_Bitmap_Size ) );
+
+#if 0
+        bsize->height = face->accel.maxbounds.ascent << 6;
+#endif
+        bsize->height = (FT_Short)( face->accel.fontAscent +
+                                    face->accel.fontDescent );
+
+        prop = pcf_find_property( face, "AVERAGE_WIDTH" );
+        if ( prop )
+          bsize->width = (FT_Short)( ( prop->value.l + 5 ) / 10 );
+        else
+          bsize->width = (FT_Short)( bsize->height * 2/3 );
+
+        prop = pcf_find_property( face, "POINT_SIZE" );
+        if ( prop )
+          /* convert from 722.7 decipoints to 72 points per inch */
+          bsize->size =
+            (FT_Pos)( ( prop->value.l * 64 * 7200 + 36135L ) / 72270L );
+
+        prop = pcf_find_property( face, "PIXEL_SIZE" );
+        if ( prop )
+          bsize->y_ppem = (FT_Short)prop->value.l << 6;
+
+        prop = pcf_find_property( face, "RESOLUTION_X" );
+        if ( prop )
+          resolution_x = (FT_Short)prop->value.l;
+
+        prop = pcf_find_property( face, "RESOLUTION_Y" );
+        if ( prop )
+          resolution_y = (FT_Short)prop->value.l;
+
+        if ( bsize->y_ppem == 0 )
+        {
+          bsize->y_ppem = bsize->size;
+          if ( resolution_y )
+            bsize->y_ppem = bsize->y_ppem * resolution_y / 72;
+        }
+        if ( resolution_x && resolution_y )
+          bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y;
+        else
+          bsize->x_ppem = bsize->y_ppem;
+      }
+
+      /* set up charset */
+      {
+        PCF_Property  charset_registry = 0, charset_encoding = 0;
+
+
+        charset_registry = pcf_find_property( face, "CHARSET_REGISTRY" );
+        charset_encoding = pcf_find_property( face, "CHARSET_ENCODING" );
+
+        if ( charset_registry && charset_registry->isString &&
+             charset_encoding && charset_encoding->isString )
+        {
+          if ( FT_STRDUP( face->charset_encoding,
+                          charset_encoding->value.atom ) ||
+               FT_STRDUP( face->charset_registry,
+                          charset_registry->value.atom ) )
+            goto Exit;
+        }
+      }
+    }
+
+  Exit:
+    if ( error )
+    {
+      /* This is done to respect the behaviour of the original */
+      /* PCF font driver.                                      */
+      error = PCF_Err_Invalid_File_Format;
+    }
+
+    return error;
+  }
+
+
+/* END */
diff --git a/src/pcf/pcfread.h b/src/pcf/pcfread.h
new file mode 100644 (file)
index 0000000..c9524f1
--- /dev/null
@@ -0,0 +1,45 @@
+/*  pcfread.h
+
+    FreeType font driver for pcf fonts
+
+  Copyright 2003 by
+  Francesco Zappa Nardelli
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+
+#ifndef __PCFREAD_H__
+#define __PCFREAD_H__
+
+
+#include <ft2build.h>
+
+FT_BEGIN_HEADER
+
+  FT_LOCAL( PCF_Property )
+  pcf_find_property( PCF_Face          face,
+                     const FT_String*  prop );
+
+FT_END_HEADER
+
+#endif /* __PCFREAD_H__ */
+
+
+/* END */
diff --git a/src/pcf/pcfutil.c b/src/pcf/pcfutil.c
new file mode 100644 (file)
index 0000000..b91274f
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+
+Copyright 1990, 1994, 1998  The Open Group
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of The Open Group shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from The Open Group.
+
+*/
+/* $XFree86: xc/lib/font/util/utilbitmap.c,v 1.3 1999/08/22 08:58:58 dawes Exp $ */
+
+/*
+ * Author:  Keith Packard, MIT X Consortium
+ */
+
+/* Modified for use with FreeType */
+
+
+#include <ft2build.h>
+#include "pcfutil.h"
+
+
+  /*
+   *  Invert bit order within each BYTE of an array.
+   */
+
+  FT_LOCAL_DEF( void )
+  BitOrderInvert( unsigned char*  buf,
+                  size_t          nbytes )
+  {
+    for ( ; nbytes > 0; nbytes--, buf++ )
+    {
+      unsigned int  val = *buf;
+
+
+      val = ( ( val >> 1 ) & 0x55 ) | ( ( val << 1 ) & 0xAA );
+      val = ( ( val >> 2 ) & 0x33 ) | ( ( val << 2 ) & 0xCC );
+      val = ( ( val >> 4 ) & 0x0F ) | ( ( val << 4 ) & 0xF0 );
+
+      *buf = (unsigned char)val;
+    }
+  }
+
+
+  /*
+   *  Invert byte order within each 16-bits of an array.
+   */
+
+  FT_LOCAL_DEF( void )
+  TwoByteSwap( unsigned char*  buf,
+               size_t          nbytes )
+  {
+    unsigned char  c;
+
+
+    for ( ; nbytes >= 2; nbytes -= 2, buf += 2 )
+    {
+      c      = buf[0];
+      buf[0] = buf[1];
+      buf[1] = c;
+    }
+  }
+
+  /*
+   *  Invert byte order within each 32-bits of an array.
+   */
+
+  FT_LOCAL_DEF( void )
+  FourByteSwap( unsigned char*  buf,
+                size_t          nbytes )
+  {
+    unsigned char  c;
+
+
+    for ( ; nbytes >= 4; nbytes -= 4, buf += 4 )
+    {
+      c      = buf[0];
+      buf[0] = buf[3];
+      buf[3] = c;
+
+      c      = buf[1];
+      buf[1] = buf[2];
+      buf[2] = c;
+    }
+  }
+
+
+/* END */
diff --git a/src/pcf/pcfutil.h b/src/pcf/pcfutil.h
new file mode 100644 (file)
index 0000000..ce10fb5
--- /dev/null
@@ -0,0 +1,55 @@
+/*  pcfutil.h
+
+    FreeType font driver for pcf fonts
+
+  Copyright 2000, 2001, 2004 by
+  Francesco Zappa Nardelli
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+
+#ifndef __PCFUTIL_H__
+#define __PCFUTIL_H__
+
+
+#include <ft2build.h>
+#include FT_CONFIG_CONFIG_H
+
+
+FT_BEGIN_HEADER
+
+  FT_LOCAL( void )
+  BitOrderInvert( unsigned char*  buf,
+                  size_t          nbytes );
+
+  FT_LOCAL( void )
+  TwoByteSwap( unsigned char*  buf,
+               size_t          nbytes );
+
+  FT_LOCAL( void )
+  FourByteSwap( unsigned char*  buf,
+                size_t          nbytes );
+
+FT_END_HEADER
+
+#endif /* __PCFUTIL_H__ */
+
+
+/* END */
diff --git a/src/pcf/rules.mk b/src/pcf/rules.mk
new file mode 100644 (file)
index 0000000..7864152
--- /dev/null
@@ -0,0 +1,79 @@
+#
+# FreeType 2 pcf driver configuration rules
+#
+
+
+# Copyright (C) 2000, 2001, 2003, 2008 by
+# Francesco Zappa Nardelli
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+
+# pcf driver directory
+#
+PCF_DIR := $(SRC_DIR)/pcf
+
+
+PCF_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PCF_DIR))
+
+
+# pcf driver sources (i.e., C files)
+#
+PCF_DRV_SRC := $(PCF_DIR)/pcfdrivr.c \
+               $(PCF_DIR)/pcfread.c  \
+               $(PCF_DIR)/pcfutil.c
+
+# pcf driver headers
+#
+PCF_DRV_H := $(PCF_DRV_SRC:%.c=%.h) \
+             $(PCF_DIR)/pcf.h       \
+             $(PCF_DIR)/pcferror.h
+
+# pcf driver object(s)
+#
+#   PCF_DRV_OBJ_M is used during `multi' builds
+#   PCF_DRV_OBJ_S is used during `single' builds
+#
+PCF_DRV_OBJ_M := $(PCF_DRV_SRC:$(PCF_DIR)/%.c=$(OBJ_DIR)/%.$O)
+PCF_DRV_OBJ_S := $(OBJ_DIR)/pcf.$O
+
+# pcf driver source file for single build
+#
+PCF_DRV_SRC_S := $(PCF_DIR)/pcf.c
+
+
+# pcf driver - single object
+#
+$(PCF_DRV_OBJ_S): $(PCF_DRV_SRC_S) $(PCF_DRV_SRC) $(FREETYPE_H) $(PCF_DRV_H)
+       $(PCF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PCF_DRV_SRC_S))
+
+
+# pcf driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(PCF_DIR)/%.c $(FREETYPE_H) $(PCF_DRV_H)
+       $(PCF_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(PCF_DRV_OBJ_S)
+DRV_OBJS_M += $(PCF_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/pfr/Jamfile b/src/pfr/Jamfile
new file mode 100644 (file)
index 0000000..9e2f2b8
--- /dev/null
@@ -0,0 +1,29 @@
+# FreeType 2 src/pfr Jamfile
+#
+# Copyright 2002 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) pfr ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = pfrdrivr pfrgload pfrload pfrobjs pfrcmap pfrsbit ;
+  }
+  else
+  {
+    _sources = pfr ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/pfr Jamfile
diff --git a/src/pfr/module.mk b/src/pfr/module.mk
new file mode 100644 (file)
index 0000000..8d1d28a
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# FreeType 2 PFR module definition
+#
+
+
+# Copyright 2002, 2006 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.
+
+
+FTMODULE_H_COMMANDS += PFR_DRIVER
+
+define PFR_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, pfr_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)pfr       $(ECHO_DRIVER_DESC)PFR/TrueDoc font files with extension *.pfr$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/src/pfr/pfr.c b/src/pfr/pfr.c
new file mode 100644 (file)
index 0000000..eb2c4ed
--- /dev/null
@@ -0,0 +1,29 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pfr.c                                                                  */
+/*                                                                         */
+/*    FreeType PFR driver component.                                       */
+/*                                                                         */
+/*  Copyright 2002 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include <ft2build.h>
+
+#include "pfrload.c"
+#include "pfrgload.c"
+#include "pfrcmap.c"
+#include "pfrobjs.c"
+#include "pfrdrivr.c"
+#include "pfrsbit.c"
+
+/* END */
diff --git a/src/pfr/pfrcmap.c b/src/pfr/pfrcmap.c
new file mode 100644 (file)
index 0000000..9c8f9ed
--- /dev/null
@@ -0,0 +1,166 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pfrcmap.c                                                              */
+/*                                                                         */
+/*    FreeType PFR cmap handling (body).                                   */
+/*                                                                         */
+/*  Copyright 2002, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "pfrcmap.h"
+#include "pfrobjs.h"
+
+#include "pfrerror.h"
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  pfr_cmap_init( PFR_CMap  cmap )
+  {
+    FT_Error  error = PFR_Err_Ok;
+    PFR_Face  face  = (PFR_Face)FT_CMAP_FACE( cmap );
+
+
+    cmap->num_chars = face->phy_font.num_chars;
+    cmap->chars     = face->phy_font.chars;
+
+    /* just for safety, check that the character entries are correctly */
+    /* sorted in increasing character code order                       */
+    {
+      FT_UInt  n;
+
+
+      for ( n = 1; n < cmap->num_chars; n++ )
+      {
+        if ( cmap->chars[n - 1].char_code >= cmap->chars[n].char_code )
+        {
+          error = PFR_Err_Invalid_Table;
+          goto Exit;
+        }
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  pfr_cmap_done( PFR_CMap  cmap )
+  {
+    cmap->chars     = NULL;
+    cmap->num_chars = 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  pfr_cmap_char_index( PFR_CMap   cmap,
+                       FT_UInt32  char_code )
+  {
+    FT_UInt   min = 0;
+    FT_UInt   max = cmap->num_chars;
+    FT_UInt   mid;
+    PFR_Char  gchar;
+
+
+    while ( min < max )
+    {
+      mid   = min + ( max - min ) / 2;
+      gchar = cmap->chars + mid;
+
+      if ( gchar->char_code == char_code )
+        return mid + 1;
+
+      if ( gchar->char_code < char_code )
+        min = mid + 1;
+      else
+        max = mid;
+    }
+    return 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  pfr_cmap_char_next( PFR_CMap    cmap,
+                      FT_UInt32  *pchar_code )
+  {
+    FT_UInt    result    = 0;
+    FT_UInt32  char_code = *pchar_code + 1;
+
+
+  Restart:
+    {
+      FT_UInt   min = 0;
+      FT_UInt   max = cmap->num_chars;
+      FT_UInt   mid;
+      PFR_Char  gchar;
+
+
+      while ( min < max )
+      {
+        mid   = min + ( ( max - min ) >> 1 );
+        gchar = cmap->chars + mid;
+
+        if ( gchar->char_code == char_code )
+        {
+          result = mid;
+          if ( result != 0 )
+          {
+            result++;
+            goto Exit;
+          }
+
+          char_code++;
+          goto Restart;
+        }
+
+        if ( gchar->char_code < char_code )
+          min = mid+1;
+        else
+          max = mid;
+      }
+
+      /* we didn't find it, but we have a pair just above it */
+      char_code = 0;
+
+      if ( min < cmap->num_chars )
+      {
+        gchar  = cmap->chars + min;
+        result = min;
+        if ( result != 0 )
+        {
+          result++;
+          char_code = gchar->char_code;
+        }
+      }
+    }
+
+  Exit:
+    *pchar_code = char_code;
+    return result;
+  }
+
+
+  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+  pfr_cmap_class_rec =
+  {
+    sizeof ( PFR_CMapRec ),
+
+    (FT_CMap_InitFunc)     pfr_cmap_init,
+    (FT_CMap_DoneFunc)     pfr_cmap_done,
+    (FT_CMap_CharIndexFunc)pfr_cmap_char_index,
+    (FT_CMap_CharNextFunc) pfr_cmap_char_next,
+
+    NULL, NULL, NULL, NULL, NULL
+  };
+
+
+/* END */
diff --git a/src/pfr/pfrcmap.h b/src/pfr/pfrcmap.h
new file mode 100644 (file)
index 0000000..a626953
--- /dev/null
@@ -0,0 +1,46 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pfrcmap.h                                                              */
+/*                                                                         */
+/*    FreeType PFR cmap handling (specification).                          */
+/*                                                                         */
+/*  Copyright 2002 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PFRCMAP_H__
+#define __PFRCMAP_H__
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include "pfrtypes.h"
+
+
+FT_BEGIN_HEADER
+
+  typedef struct  PFR_CMapRec_
+  {
+    FT_CMapRec  cmap;
+    FT_UInt     num_chars;
+    PFR_Char    chars;
+
+  } PFR_CMapRec, *PFR_CMap;
+
+
+  FT_CALLBACK_TABLE const FT_CMap_ClassRec  pfr_cmap_class_rec;
+
+FT_END_HEADER
+
+
+#endif /* __PFRCMAP_H__ */
+
+
+/* END */
diff --git a/src/pfr/pfrdrivr.c b/src/pfr/pfrdrivr.c
new file mode 100644 (file)
index 0000000..c59d8ae
--- /dev/null
@@ -0,0 +1,214 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pfrdrivr.c                                                             */
+/*                                                                         */
+/*    FreeType PFR driver interface (body).                                */
+/*                                                                         */
+/*  Copyright 2002-2004, 2006, 2008, 2010, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_SERVICE_PFR_H
+#include FT_SERVICE_XFREE86_NAME_H
+#include "pfrdrivr.h"
+#include "pfrobjs.h"
+
+#include "pfrerror.h"
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  pfr_get_kerning( FT_Face     pfrface,     /* PFR_Face */
+                   FT_UInt     left,
+                   FT_UInt     right,
+                   FT_Vector  *avector )
+  {
+    PFR_Face     face = (PFR_Face)pfrface;
+    PFR_PhyFont  phys = &face->phy_font;
+
+
+    pfr_face_get_kerning( pfrface, left, right, avector );
+
+    /* convert from metrics to outline units when necessary */
+    if ( phys->outline_resolution != phys->metrics_resolution )
+    {
+      if ( avector->x != 0 )
+        avector->x = FT_MulDiv( avector->x, phys->outline_resolution,
+                                            phys->metrics_resolution );
+
+      if ( avector->y != 0 )
+        avector->y = FT_MulDiv( avector->x, phys->outline_resolution,
+                                            phys->metrics_resolution );
+    }
+
+    return PFR_Err_Ok;
+  }
+
+
+ /*
+  *  PFR METRICS SERVICE
+  *
+  */
+
+  FT_CALLBACK_DEF( FT_Error )
+  pfr_get_advance( FT_Face   pfrface,       /* PFR_Face */
+                   FT_UInt   gindex,
+                   FT_Pos   *anadvance )
+  {
+    PFR_Face  face  = (PFR_Face)pfrface;
+    FT_Error  error = PFR_Err_Invalid_Argument;
+
+
+    *anadvance = 0;
+
+    if ( !gindex )
+      goto Exit;
+
+    gindex--;
+
+    if ( face )
+    {
+      PFR_PhyFont  phys = &face->phy_font;
+
+
+      if ( gindex < phys->num_chars )
+      {
+        *anadvance = phys->chars[gindex].advance;
+        error = PFR_Err_Ok;
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  pfr_get_metrics( FT_Face    pfrface,      /* PFR_Face */
+                   FT_UInt   *anoutline_resolution,
+                   FT_UInt   *ametrics_resolution,
+                   FT_Fixed  *ametrics_x_scale,
+                   FT_Fixed  *ametrics_y_scale )
+  {
+    PFR_Face     face = (PFR_Face)pfrface;
+    PFR_PhyFont  phys = &face->phy_font;
+    FT_Fixed     x_scale, y_scale;
+    FT_Size      size = face->root.size;
+
+
+    if ( anoutline_resolution )
+      *anoutline_resolution = phys->outline_resolution;
+
+    if ( ametrics_resolution )
+      *ametrics_resolution = phys->metrics_resolution;
+
+    x_scale = 0x10000L;
+    y_scale = 0x10000L;
+
+    if ( size )
+    {
+      x_scale = FT_DivFix( size->metrics.x_ppem << 6,
+                           phys->metrics_resolution );
+
+      y_scale = FT_DivFix( size->metrics.y_ppem << 6,
+                           phys->metrics_resolution );
+    }
+
+    if ( ametrics_x_scale )
+      *ametrics_x_scale = x_scale;
+
+    if ( ametrics_y_scale )
+      *ametrics_y_scale = y_scale;
+
+    return PFR_Err_Ok;
+  }
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FT_Service_PfrMetricsRec  pfr_metrics_service_rec =
+  {
+    pfr_get_metrics,
+    pfr_face_get_kerning,
+    pfr_get_advance
+  };
+
+
+ /*
+  *  SERVICE LIST
+  *
+  */
+
+  static const FT_ServiceDescRec  pfr_services[] =
+  {
+    { FT_SERVICE_ID_PFR_METRICS, &pfr_metrics_service_rec },
+    { FT_SERVICE_ID_XF86_NAME,   FT_XF86_FORMAT_PFR },
+    { NULL, NULL }
+  };
+
+
+  FT_CALLBACK_DEF( FT_Module_Interface )
+  pfr_get_service( FT_Module         module,
+                   const FT_String*  service_id )
+  {
+    FT_UNUSED( module );
+
+    return ft_service_list_lookup( pfr_services, service_id );
+  }
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FT_Driver_ClassRec  pfr_driver_class =
+  {
+    {
+      FT_MODULE_FONT_DRIVER     |
+      FT_MODULE_DRIVER_SCALABLE,
+
+      sizeof ( FT_DriverRec ),
+
+      "pfr",
+      0x10000L,
+      0x20000L,
+
+      NULL,
+
+      0,                /* FT_Module_Constructor */
+      0,                /* FT_Module_Destructor  */
+      pfr_get_service
+    },
+
+    sizeof ( PFR_FaceRec ),
+    sizeof ( PFR_SizeRec ),
+    sizeof ( PFR_SlotRec ),
+
+    pfr_face_init,
+    pfr_face_done,
+    0,                  /* FT_Size_InitFunc */
+    0,                  /* FT_Size_DoneFunc */
+    pfr_slot_init,
+    pfr_slot_done,
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+    ft_stub_set_char_sizes,
+    ft_stub_set_pixel_sizes,
+#endif
+    pfr_slot_load,
+
+    pfr_get_kerning,
+    0,                  /* FT_Face_AttachFunc      */
+    0,                  /* FT_Face_GetAdvancesFunc */
+    0,                  /* FT_Size_RequestFunc     */
+    0,                  /* FT_Size_SelectFunc      */
+  };
+
+
+/* END */
diff --git a/src/pfr/pfrdrivr.h b/src/pfr/pfrdrivr.h
new file mode 100644 (file)
index 0000000..75f86c5
--- /dev/null
@@ -0,0 +1,43 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pfrdrivr.h                                                             */
+/*                                                                         */
+/*    High-level Type PFR driver interface (specification).                */
+/*                                                                         */
+/*  Copyright 2002 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PFRDRIVR_H__
+#define __PFRDRIVR_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DRIVER_H
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+
+  FT_EXPORT_VAR( const FT_Driver_ClassRec )  pfr_driver_class;
+
+
+FT_END_HEADER
+
+
+#endif /* __PFRDRIVR_H__ */
+
+
+/* END */
diff --git a/src/pfr/pfrerror.h b/src/pfr/pfrerror.h
new file mode 100644 (file)
index 0000000..94dc8c5
--- /dev/null
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pfrerror.h                                                             */
+/*                                                                         */
+/*    PFR error codes (specification only).                                */
+/*                                                                         */
+/*  Copyright 2002, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the PFR error enumeration constants.      */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __PFRERROR_H__
+#define __PFRERROR_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  PFR_Err_
+#define FT_ERR_BASE    FT_Mod_Err_PFR
+
+#include FT_ERRORS_H
+
+#endif /* __PFRERROR_H__ */
+
+
+/* END */
diff --git a/src/pfr/pfrgload.c b/src/pfr/pfrgload.c
new file mode 100644 (file)
index 0000000..6f65b01
--- /dev/null
@@ -0,0 +1,844 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pfrgload.c                                                             */
+/*                                                                         */
+/*    FreeType PFR glyph loader (body).                                    */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2005, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "pfrgload.h"
+#include "pfrsbit.h"
+#include "pfrload.h"            /* for macro definitions */
+#include FT_INTERNAL_DEBUG_H
+
+#include "pfrerror.h"
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_pfr
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      PFR GLYPH BUILDER                        *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_LOCAL_DEF( void )
+  pfr_glyph_init( PFR_Glyph       glyph,
+                  FT_GlyphLoader  loader )
+  {
+    FT_ZERO( glyph );
+
+    glyph->loader     = loader;
+    glyph->path_begun = 0;
+
+    FT_GlyphLoader_Rewind( loader );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  pfr_glyph_done( PFR_Glyph  glyph )
+  {
+    FT_Memory  memory = glyph->loader->memory;
+
+
+    FT_FREE( glyph->x_control );
+    glyph->y_control = NULL;
+
+    glyph->max_xy_control = 0;
+#if 0
+    glyph->num_x_control  = 0;
+    glyph->num_y_control  = 0;
+#endif
+
+    FT_FREE( glyph->subs );
+
+    glyph->max_subs = 0;
+    glyph->num_subs = 0;
+
+    glyph->loader     = NULL;
+    glyph->path_begun = 0;
+  }
+
+
+  /* close current contour, if any */
+  static void
+  pfr_glyph_close_contour( PFR_Glyph  glyph )
+  {
+    FT_GlyphLoader  loader  = glyph->loader;
+    FT_Outline*     outline = &loader->current.outline;
+    FT_Int          last, first;
+
+
+    if ( !glyph->path_begun )
+      return;
+
+    /* compute first and last point indices in current glyph outline */
+    last  = outline->n_points - 1;
+    first = 0;
+    if ( outline->n_contours > 0 )
+      first = outline->contours[outline->n_contours - 1];
+
+    /* if the last point falls on the same location than the first one */
+    /* we need to delete it                                            */
+    if ( last > first )
+    {
+      FT_Vector*  p1 = outline->points + first;
+      FT_Vector*  p2 = outline->points + last;
+
+
+      if ( p1->x == p2->x && p1->y == p2->y )
+      {
+        outline->n_points--;
+        last--;
+      }
+    }
+
+    /* don't add empty contours */
+    if ( last >= first )
+      outline->contours[outline->n_contours++] = (short)last;
+
+    glyph->path_begun = 0;
+  }
+
+
+  /* reset glyph to start the loading of a new glyph */
+  static void
+  pfr_glyph_start( PFR_Glyph  glyph )
+  {
+    glyph->path_begun = 0;
+  }
+
+
+  static FT_Error
+  pfr_glyph_line_to( PFR_Glyph   glyph,
+                     FT_Vector*  to )
+  {
+    FT_GlyphLoader  loader  = glyph->loader;
+    FT_Outline*     outline = &loader->current.outline;
+    FT_Error        error;
+
+
+    /* check that we have begun a new path */
+    if ( !glyph->path_begun )
+    {
+      error = PFR_Err_Invalid_Table;
+      FT_ERROR(( "pfr_glyph_line_to: invalid glyph data\n" ));
+      goto Exit;
+    }
+
+    error = FT_GLYPHLOADER_CHECK_POINTS( loader, 1, 0 );
+    if ( !error )
+    {
+      FT_UInt  n = outline->n_points;
+
+
+      outline->points[n] = *to;
+      outline->tags  [n] = FT_CURVE_TAG_ON;
+
+      outline->n_points++;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  pfr_glyph_curve_to( PFR_Glyph   glyph,
+                      FT_Vector*  control1,
+                      FT_Vector*  control2,
+                      FT_Vector*  to )
+  {
+    FT_GlyphLoader  loader  = glyph->loader;
+    FT_Outline*     outline = &loader->current.outline;
+    FT_Error        error;
+
+
+    /* check that we have begun a new path */
+    if ( !glyph->path_begun )
+    {
+      error = PFR_Err_Invalid_Table;
+      FT_ERROR(( "pfr_glyph_line_to: invalid glyph data\n" ));
+      goto Exit;
+    }
+
+    error = FT_GLYPHLOADER_CHECK_POINTS( loader, 3, 0 );
+    if ( !error )
+    {
+      FT_Vector*  vec = outline->points         + outline->n_points;
+      FT_Byte*    tag = (FT_Byte*)outline->tags + outline->n_points;
+
+
+      vec[0] = *control1;
+      vec[1] = *control2;
+      vec[2] = *to;
+      tag[0] = FT_CURVE_TAG_CUBIC;
+      tag[1] = FT_CURVE_TAG_CUBIC;
+      tag[2] = FT_CURVE_TAG_ON;
+
+      outline->n_points = (FT_Short)( outline->n_points + 3 );
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  pfr_glyph_move_to( PFR_Glyph   glyph,
+                     FT_Vector*  to )
+  {
+    FT_GlyphLoader  loader  = glyph->loader;
+    FT_Error        error;
+
+
+    /* close current contour if any */
+    pfr_glyph_close_contour( glyph );
+
+    /* indicate that a new contour has started */
+    glyph->path_begun = 1;
+
+    /* check that there is space for a new contour and a new point */
+    error = FT_GLYPHLOADER_CHECK_POINTS( loader, 1, 1 );
+    if ( !error )
+      /* add new start point */
+      error = pfr_glyph_line_to( glyph, to );
+
+    return error;
+  }
+
+
+  static void
+  pfr_glyph_end( PFR_Glyph  glyph )
+  {
+    /* close current contour if any */
+    pfr_glyph_close_contour( glyph );
+
+    /* merge the current glyph into the stack */
+    FT_GlyphLoader_Add( glyph->loader );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      PFR GLYPH LOADER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* load a simple glyph */
+  static FT_Error
+  pfr_glyph_load_simple( PFR_Glyph  glyph,
+                         FT_Byte*   p,
+                         FT_Byte*   limit )
+  {
+    FT_Error   error  = PFR_Err_Ok;
+    FT_Memory  memory = glyph->loader->memory;
+    FT_UInt    flags, x_count, y_count, i, count, mask;
+    FT_Int     x;
+
+
+    PFR_CHECK( 1 );
+    flags = PFR_NEXT_BYTE( p );
+
+    /* test for composite glyphs */
+    if ( flags & PFR_GLYPH_IS_COMPOUND )
+      goto Failure;
+
+    x_count = 0;
+    y_count = 0;
+
+    if ( flags & PFR_GLYPH_1BYTE_XYCOUNT )
+    {
+      PFR_CHECK( 1 );
+      count   = PFR_NEXT_BYTE( p );
+      x_count = count & 15;
+      y_count = count >> 4;
+    }
+    else
+    {
+      if ( flags & PFR_GLYPH_XCOUNT )
+      {
+        PFR_CHECK( 1 );
+        x_count = PFR_NEXT_BYTE( p );
+      }
+
+      if ( flags & PFR_GLYPH_YCOUNT )
+      {
+        PFR_CHECK( 1 );
+        y_count = PFR_NEXT_BYTE( p );
+      }
+    }
+
+    count = x_count + y_count;
+
+    /* re-allocate array when necessary */
+    if ( count > glyph->max_xy_control )
+    {
+      FT_UInt  new_max = FT_PAD_CEIL( count, 8 );
+
+
+      if ( FT_RENEW_ARRAY( glyph->x_control,
+                           glyph->max_xy_control,
+                           new_max ) )
+        goto Exit;
+
+      glyph->max_xy_control = new_max;
+    }
+
+    glyph->y_control = glyph->x_control + x_count;
+
+    mask  = 0;
+    x     = 0;
+
+    for ( i = 0; i < count; i++ )
+    {
+      if ( ( i & 7 ) == 0 )
+      {
+        PFR_CHECK( 1 );
+        mask = PFR_NEXT_BYTE( p );
+      }
+
+      if ( mask & 1 )
+      {
+        PFR_CHECK( 2 );
+        x = PFR_NEXT_SHORT( p );
+      }
+      else
+      {
+        PFR_CHECK( 1 );
+        x += PFR_NEXT_BYTE( p );
+      }
+
+      glyph->x_control[i] = x;
+
+      mask >>= 1;
+    }
+
+    /* XXX: for now we ignore the secondary stroke and edge definitions */
+    /*      since we don't want to support native PFR hinting           */
+    /*                                                                  */
+    if ( flags & PFR_GLYPH_EXTRA_ITEMS )
+    {
+      error = pfr_extra_items_skip( &p, limit );
+      if ( error )
+        goto Exit;
+    }
+
+    pfr_glyph_start( glyph );
+
+    /* now load a simple glyph */
+    {
+      FT_Vector   pos[4];
+      FT_Vector*  cur;
+
+
+      pos[0].x = pos[0].y = 0;
+      pos[3]   = pos[0];
+
+      for (;;)
+      {
+        FT_UInt  format, format_low, args_format = 0, args_count, n;
+
+
+        /***************************************************************/
+        /*  read instruction                                           */
+        /*                                                             */
+        PFR_CHECK( 1 );
+        format     = PFR_NEXT_BYTE( p );
+        format_low = format & 15;
+
+        switch ( format >> 4 )
+        {
+        case 0:                             /* end glyph */
+          FT_TRACE6(( "- end glyph" ));
+          args_count = 0;
+          break;
+
+        case 1:                             /* general line operation */
+          FT_TRACE6(( "- general line" ));
+          goto Line1;
+
+        case 4:                             /* move to inside contour  */
+          FT_TRACE6(( "- move to inside" ));
+          goto Line1;
+
+        case 5:                             /* move to outside contour */
+          FT_TRACE6(( "- move to outside" ));
+        Line1:
+          args_format = format_low;
+          args_count  = 1;
+          break;
+
+        case 2:                             /* horizontal line to */
+          FT_TRACE6(( "- horizontal line to cx.%d", format_low ));
+          if ( format_low >= x_count )
+            goto Failure;
+          pos[0].x   = glyph->x_control[format_low];
+          pos[0].y   = pos[3].y;
+          pos[3]     = pos[0];
+          args_count = 0;
+          break;
+
+        case 3:                             /* vertical line to */
+          FT_TRACE6(( "- vertical line to cy.%d", format_low ));
+          if ( format_low >= y_count )
+            goto Failure;
+          pos[0].x   = pos[3].x;
+          pos[0].y   = glyph->y_control[format_low];
+          pos[3]     = pos[0];
+          args_count = 0;
+          break;
+
+        case 6:                             /* horizontal to vertical curve */
+          FT_TRACE6(( "- hv curve " ));
+          args_format = 0xB8E;
+          args_count  = 3;
+          break;
+
+        case 7:                             /* vertical to horizontal curve */
+          FT_TRACE6(( "- vh curve" ));
+          args_format = 0xE2B;
+          args_count  = 3;
+          break;
+
+        default:                            /* general curve to */
+          FT_TRACE6(( "- general curve" ));
+          args_count  = 4;
+          args_format = format_low;
+        }
+
+        /***********************************************************/
+        /*  now read arguments                                     */
+        /*                                                         */
+        cur = pos;
+        for ( n = 0; n < args_count; n++ )
+        {
+          FT_UInt  idx;
+          FT_Int   delta;
+
+
+          /* read the X argument */
+          switch ( args_format & 3 )
+          {
+          case 0:                           /* 8-bit index */
+            PFR_CHECK( 1 );
+            idx  = PFR_NEXT_BYTE( p );
+            if ( idx >= x_count )
+              goto Failure;
+            cur->x = glyph->x_control[idx];
+            FT_TRACE7(( " cx#%d", idx ));
+            break;
+
+          case 1:                           /* 16-bit value */
+            PFR_CHECK( 2 );
+            cur->x = PFR_NEXT_SHORT( p );
+            FT_TRACE7(( " x.%d", cur->x ));
+            break;
+
+          case 2:                           /* 8-bit delta */
+            PFR_CHECK( 1 );
+            delta  = PFR_NEXT_INT8( p );
+            cur->x = pos[3].x + delta;
+            FT_TRACE7(( " dx.%d", delta ));
+            break;
+
+          default:
+            FT_TRACE7(( " |" ));
+            cur->x = pos[3].x;
+          }
+
+          /* read the Y argument */
+          switch ( ( args_format >> 2 ) & 3 )
+          {
+          case 0:                           /* 8-bit index */
+            PFR_CHECK( 1 );
+            idx  = PFR_NEXT_BYTE( p );
+            if ( idx >= y_count )
+              goto Failure;
+            cur->y = glyph->y_control[idx];
+            FT_TRACE7(( " cy#%d", idx ));
+            break;
+
+          case 1:                           /* 16-bit absolute value */
+            PFR_CHECK( 2 );
+            cur->y = PFR_NEXT_SHORT( p );
+            FT_TRACE7(( " y.%d", cur->y ));
+            break;
+
+          case 2:                           /* 8-bit delta */
+            PFR_CHECK( 1 );
+            delta  = PFR_NEXT_INT8( p );
+            cur->y = pos[3].y + delta;
+            FT_TRACE7(( " dy.%d", delta ));
+            break;
+
+          default:
+            FT_TRACE7(( " -" ));
+            cur->y = pos[3].y;
+          }
+
+          /* read the additional format flag for the general curve */
+          if ( n == 0 && args_count == 4 )
+          {
+            PFR_CHECK( 1 );
+            args_format = PFR_NEXT_BYTE( p );
+            args_count--;
+          }
+          else
+            args_format >>= 4;
+
+          /* save the previous point */
+          pos[3] = cur[0];
+          cur++;
+        }
+
+        FT_TRACE7(( "\n" ));
+
+        /***********************************************************/
+        /*  finally, execute instruction                           */
+        /*                                                         */
+        switch ( format >> 4 )
+        {
+        case 0:                             /* end glyph => EXIT */
+          pfr_glyph_end( glyph );
+          goto Exit;
+
+        case 1:                             /* line operations */
+        case 2:
+        case 3:
+          error = pfr_glyph_line_to( glyph, pos );
+          goto Test_Error;
+
+        case 4:                             /* move to inside contour  */
+        case 5:                             /* move to outside contour */
+          error = pfr_glyph_move_to( glyph, pos );
+          goto Test_Error;
+
+        default:                            /* curve operations */
+          error = pfr_glyph_curve_to( glyph, pos, pos + 1, pos + 2 );
+
+        Test_Error:  /* test error condition */
+          if ( error )
+            goto Exit;
+        }
+      } /* for (;;) */
+    }
+
+  Exit:
+    return error;
+
+  Failure:
+  Too_Short:
+    error = PFR_Err_Invalid_Table;
+    FT_ERROR(( "pfr_glyph_load_simple: invalid glyph data\n" ));
+    goto Exit;
+  }
+
+
+  /* load a composite/compound glyph */
+  static FT_Error
+  pfr_glyph_load_compound( PFR_Glyph  glyph,
+                           FT_Byte*   p,
+                           FT_Byte*   limit )
+  {
+    FT_Error        error  = PFR_Err_Ok;
+    FT_GlyphLoader  loader = glyph->loader;
+    FT_Memory       memory = loader->memory;
+    PFR_SubGlyph    subglyph;
+    FT_UInt         flags, i, count, org_count;
+    FT_Int          x_pos, y_pos;
+
+
+    PFR_CHECK( 1 );
+    flags = PFR_NEXT_BYTE( p );
+
+    /* test for composite glyphs */
+    if ( !( flags & PFR_GLYPH_IS_COMPOUND ) )
+      goto Failure;
+
+    count = flags & 0x3F;
+
+    /* ignore extra items when present */
+    /*                                 */
+    if ( flags & PFR_GLYPH_EXTRA_ITEMS )
+    {
+      error = pfr_extra_items_skip( &p, limit );
+      if (error) goto Exit;
+    }
+
+    /* we can't rely on the FT_GlyphLoader to load sub-glyphs, because   */
+    /* the PFR format is dumb, using direct file offsets to point to the */
+    /* sub-glyphs (instead of glyph indices).  Sigh.                     */
+    /*                                                                   */
+    /* For now, we load the list of sub-glyphs into a different array    */
+    /* but this will prevent us from using the auto-hinter at its best   */
+    /* quality.                                                          */
+    /*                                                                   */
+    org_count = glyph->num_subs;
+
+    if ( org_count + count > glyph->max_subs )
+    {
+      FT_UInt  new_max = ( org_count + count + 3 ) & (FT_UInt)-4;
+
+
+      /* we arbitrarily limit the number of subglyphs */
+      /* to avoid endless recursion                   */
+      if ( new_max > 64 )
+      {
+        error = PFR_Err_Invalid_Table;
+        FT_ERROR(( "pfr_glyph_load_compound:"
+                   " too many compound glyphs components\n" ));
+        goto Exit;
+      }
+
+      if ( FT_RENEW_ARRAY( glyph->subs, glyph->max_subs, new_max ) )
+        goto Exit;
+
+      glyph->max_subs = new_max;
+    }
+
+    subglyph = glyph->subs + org_count;
+
+    for ( i = 0; i < count; i++, subglyph++ )
+    {
+      FT_UInt  format;
+
+
+      x_pos = 0;
+      y_pos = 0;
+
+      PFR_CHECK( 1 );
+      format = PFR_NEXT_BYTE( p );
+
+      /* read scale when available */
+      subglyph->x_scale = 0x10000L;
+      if ( format & PFR_SUBGLYPH_XSCALE )
+      {
+        PFR_CHECK( 2 );
+        subglyph->x_scale = PFR_NEXT_SHORT( p ) << 4;
+      }
+
+      subglyph->y_scale = 0x10000L;
+      if ( format & PFR_SUBGLYPH_YSCALE )
+      {
+        PFR_CHECK( 2 );
+        subglyph->y_scale = PFR_NEXT_SHORT( p ) << 4;
+      }
+
+      /* read offset */
+      switch ( format & 3 )
+      {
+      case 1:
+        PFR_CHECK( 2 );
+        x_pos = PFR_NEXT_SHORT( p );
+        break;
+
+      case 2:
+        PFR_CHECK( 1 );
+        x_pos += PFR_NEXT_INT8( p );
+        break;
+
+      default:
+        ;
+      }
+
+      switch ( ( format >> 2 ) & 3 )
+      {
+      case 1:
+        PFR_CHECK( 2 );
+        y_pos = PFR_NEXT_SHORT( p );
+        break;
+
+      case 2:
+        PFR_CHECK( 1 );
+        y_pos += PFR_NEXT_INT8( p );
+        break;
+
+      default:
+        ;
+      }
+
+      subglyph->x_delta = x_pos;
+      subglyph->y_delta = y_pos;
+
+      /* read glyph position and size now */
+      if ( format & PFR_SUBGLYPH_2BYTE_SIZE )
+      {
+        PFR_CHECK( 2 );
+        subglyph->gps_size = PFR_NEXT_USHORT( p );
+      }
+      else
+      {
+        PFR_CHECK( 1 );
+        subglyph->gps_size = PFR_NEXT_BYTE( p );
+      }
+
+      if ( format & PFR_SUBGLYPH_3BYTE_OFFSET )
+      {
+        PFR_CHECK( 3 );
+        subglyph->gps_offset = PFR_NEXT_LONG( p );
+      }
+      else
+      {
+        PFR_CHECK( 2 );
+        subglyph->gps_offset = PFR_NEXT_USHORT( p );
+      }
+
+      glyph->num_subs++;
+    }
+
+  Exit:
+    return error;
+
+  Failure:
+  Too_Short:
+    error = PFR_Err_Invalid_Table;
+    FT_ERROR(( "pfr_glyph_load_compound: invalid glyph data\n" ));
+    goto Exit;
+  }
+
+
+  static FT_Error
+  pfr_glyph_load_rec( PFR_Glyph  glyph,
+                      FT_Stream  stream,
+                      FT_ULong   gps_offset,
+                      FT_ULong   offset,
+                      FT_ULong   size )
+  {
+    FT_Error  error;
+    FT_Byte*  p;
+    FT_Byte*  limit;
+
+
+    if ( FT_STREAM_SEEK( gps_offset + offset ) ||
+         FT_FRAME_ENTER( size )                )
+      goto Exit;
+
+    p     = (FT_Byte*)stream->cursor;
+    limit = p + size;
+
+    if ( size > 0 && *p & PFR_GLYPH_IS_COMPOUND )
+    {
+      FT_Int          n, old_count, count;
+      FT_GlyphLoader  loader = glyph->loader;
+      FT_Outline*     base   = &loader->base.outline;
+
+
+      old_count = glyph->num_subs;
+
+      /* this is a compound glyph - load it */
+      error = pfr_glyph_load_compound( glyph, p, limit );
+
+      FT_FRAME_EXIT();
+
+      if ( error )
+        goto Exit;
+
+      count = glyph->num_subs - old_count;
+
+      FT_TRACE4(( "compound glyph with %d elements (offset %lu):\n",
+                  count, offset ));
+
+      /* now, load each individual glyph */
+      for ( n = 0; n < count; n++ )
+      {
+        FT_Int        i, old_points, num_points;
+        PFR_SubGlyph  subglyph;
+
+
+        FT_TRACE4(( "subglyph %d:\n", n ));
+
+        subglyph   = glyph->subs + old_count + n;
+        old_points = base->n_points;
+
+        error = pfr_glyph_load_rec( glyph, stream, gps_offset,
+                                    subglyph->gps_offset,
+                                    subglyph->gps_size );
+        if ( error )
+          break;
+
+        /* note that `glyph->subs' might have been re-allocated */
+        subglyph   = glyph->subs + old_count + n;
+        num_points = base->n_points - old_points;
+
+        /* translate and eventually scale the new glyph points */
+        if ( subglyph->x_scale != 0x10000L || subglyph->y_scale != 0x10000L )
+        {
+          FT_Vector*  vec = base->points + old_points;
+
+
+          for ( i = 0; i < num_points; i++, vec++ )
+          {
+            vec->x = FT_MulFix( vec->x, subglyph->x_scale ) +
+                       subglyph->x_delta;
+            vec->y = FT_MulFix( vec->y, subglyph->y_scale ) +
+                       subglyph->y_delta;
+          }
+        }
+        else
+        {
+          FT_Vector*  vec = loader->base.outline.points + old_points;
+
+
+          for ( i = 0; i < num_points; i++, vec++ )
+          {
+            vec->x += subglyph->x_delta;
+            vec->y += subglyph->y_delta;
+          }
+        }
+
+        /* proceed to next sub-glyph */
+      }
+
+      FT_TRACE4(( "end compound glyph with %d elements\n", count ));
+    }
+    else
+    {
+      FT_TRACE4(( "simple glyph (offset %lu)\n", offset ));
+
+      /* load a simple glyph */
+      error = pfr_glyph_load_simple( glyph, p, limit );
+
+      FT_FRAME_EXIT();
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  pfr_glyph_load( PFR_Glyph  glyph,
+                  FT_Stream  stream,
+                  FT_ULong   gps_offset,
+                  FT_ULong   offset,
+                  FT_ULong   size )
+  {
+    /* initialize glyph loader */
+    FT_GlyphLoader_Rewind( glyph->loader );
+
+    glyph->num_subs = 0;
+
+    /* load the glyph, recursively when needed */
+    return pfr_glyph_load_rec( glyph, stream, gps_offset, offset, size );
+  }
+
+
+/* END */
diff --git a/src/pfr/pfrgload.h b/src/pfr/pfrgload.h
new file mode 100644 (file)
index 0000000..7cc7a87
--- /dev/null
@@ -0,0 +1,49 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pfrgload.h                                                             */
+/*                                                                         */
+/*    FreeType PFR glyph loader (specification).                           */
+/*                                                                         */
+/*  Copyright 2002 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PFRGLOAD_H__
+#define __PFRGLOAD_H__
+
+#include "pfrtypes.h"
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( void )
+  pfr_glyph_init( PFR_Glyph       glyph,
+                  FT_GlyphLoader  loader );
+
+  FT_LOCAL( void )
+  pfr_glyph_done( PFR_Glyph  glyph );
+
+
+  FT_LOCAL( FT_Error )
+  pfr_glyph_load( PFR_Glyph  glyph,
+                  FT_Stream  stream,
+                  FT_ULong   gps_offset,
+                  FT_ULong   offset,
+                  FT_ULong   size );
+
+
+FT_END_HEADER
+
+
+#endif /* __PFRGLOAD_H__ */
+
+
+/* END */
diff --git a/src/pfr/pfrload.c b/src/pfr/pfrload.c
new file mode 100644 (file)
index 0000000..325322e
--- /dev/null
@@ -0,0 +1,941 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pfrload.c                                                              */
+/*                                                                         */
+/*    FreeType PFR loader (body).                                          */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004, 2005, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "pfrload.h"
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+
+#include "pfrerror.h"
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_pfr
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          EXTRA ITEMS                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_LOCAL_DEF( FT_Error )
+  pfr_extra_items_skip( FT_Byte*  *pp,
+                        FT_Byte*   limit )
+  {
+    return pfr_extra_items_parse( pp, limit, NULL, NULL );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  pfr_extra_items_parse( FT_Byte*       *pp,
+                         FT_Byte*        limit,
+                         PFR_ExtraItem   item_list,
+                         FT_Pointer      item_data )
+  {
+    FT_Error  error = PFR_Err_Ok;
+    FT_Byte*  p     = *pp;
+    FT_UInt   num_items, item_type, item_size;
+
+
+    PFR_CHECK( 1 );
+    num_items = PFR_NEXT_BYTE( p );
+
+    for ( ; num_items > 0; num_items-- )
+    {
+      PFR_CHECK( 2 );
+      item_size = PFR_NEXT_BYTE( p );
+      item_type = PFR_NEXT_BYTE( p );
+
+      PFR_CHECK( item_size );
+
+      if ( item_list )
+      {
+        PFR_ExtraItem  extra = item_list;
+
+
+        for ( extra = item_list; extra->parser != NULL; extra++ )
+        {
+          if ( extra->type == item_type )
+          {
+            error = extra->parser( p, p + item_size, item_data );
+            if ( error ) goto Exit;
+
+            break;
+          }
+        }
+      }
+
+      p += item_size;
+    }
+
+  Exit:
+    *pp = p;
+    return error;
+
+  Too_Short:
+    FT_ERROR(( "pfr_extra_items_parse: invalid extra items table\n" ));
+    error = PFR_Err_Invalid_Table;
+    goto Exit;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          PFR HEADER                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+   static const FT_Frame_Field  pfr_header_fields[] =
+   {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PFR_HeaderRec
+
+     FT_FRAME_START( 58 ),
+       FT_FRAME_ULONG ( signature ),
+       FT_FRAME_USHORT( version ),
+       FT_FRAME_USHORT( signature2 ),
+       FT_FRAME_USHORT( header_size ),
+
+       FT_FRAME_USHORT( log_dir_size ),
+       FT_FRAME_USHORT( log_dir_offset ),
+
+       FT_FRAME_USHORT( log_font_max_size ),
+       FT_FRAME_UOFF3 ( log_font_section_size ),
+       FT_FRAME_UOFF3 ( log_font_section_offset ),
+
+       FT_FRAME_USHORT( phy_font_max_size ),
+       FT_FRAME_UOFF3 ( phy_font_section_size ),
+       FT_FRAME_UOFF3 ( phy_font_section_offset ),
+
+       FT_FRAME_USHORT( gps_max_size ),
+       FT_FRAME_UOFF3 ( gps_section_size ),
+       FT_FRAME_UOFF3 ( gps_section_offset ),
+
+       FT_FRAME_BYTE  ( max_blue_values ),
+       FT_FRAME_BYTE  ( max_x_orus ),
+       FT_FRAME_BYTE  ( max_y_orus ),
+
+       FT_FRAME_BYTE  ( phy_font_max_size_high ),
+       FT_FRAME_BYTE  ( color_flags ),
+
+       FT_FRAME_UOFF3 ( bct_max_size ),
+       FT_FRAME_UOFF3 ( bct_set_max_size ),
+       FT_FRAME_UOFF3 ( phy_bct_set_max_size ),
+
+       FT_FRAME_USHORT( num_phy_fonts ),
+       FT_FRAME_BYTE  ( max_vert_stem_snap ),
+       FT_FRAME_BYTE  ( max_horz_stem_snap ),
+       FT_FRAME_USHORT( max_chars ),
+     FT_FRAME_END
+   };
+
+
+  FT_LOCAL_DEF( FT_Error )
+  pfr_header_load( PFR_Header  header,
+                   FT_Stream   stream )
+  {
+    FT_Error  error;
+
+
+    /* read header directly */
+    if ( !FT_STREAM_SEEK( 0 )                                &&
+         !FT_STREAM_READ_FIELDS( pfr_header_fields, header ) )
+    {
+      /* make a few adjustments to the header */
+      header->phy_font_max_size +=
+        (FT_UInt32)header->phy_font_max_size_high << 16;
+    }
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  pfr_header_check( PFR_Header  header )
+  {
+    FT_Bool  result = 1;
+
+
+    /* check signature and header size */
+    if ( header->signature  != 0x50465230L ||   /* "PFR0" */
+         header->version     > 4           ||
+         header->header_size < 58          ||
+         header->signature2 != 0x0d0a      )    /* CR/LF  */
+    {
+      result = 0;
+    }
+    return  result;
+  }
+
+
+  /***********************************************************************/
+  /***********************************************************************/
+  /*****                                                             *****/
+  /*****                    PFR LOGICAL FONTS                        *****/
+  /*****                                                             *****/
+  /***********************************************************************/
+  /***********************************************************************/
+
+
+  FT_LOCAL_DEF( FT_Error )
+  pfr_log_font_count( FT_Stream  stream,
+                      FT_UInt32  section_offset,
+                      FT_UInt   *acount )
+  {
+    FT_Error  error;
+    FT_UInt   count;
+    FT_UInt   result = 0;
+
+
+    if ( FT_STREAM_SEEK( section_offset ) || FT_READ_USHORT( count ) )
+      goto Exit;
+
+    result = count;
+
+  Exit:
+    *acount = result;
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  pfr_log_font_load( PFR_LogFont  log_font,
+                     FT_Stream    stream,
+                     FT_UInt      idx,
+                     FT_UInt32    section_offset,
+                     FT_Bool      size_increment )
+  {
+    FT_UInt    num_log_fonts;
+    FT_UInt    flags;
+    FT_UInt32  offset;
+    FT_UInt32  size;
+    FT_Error   error;
+
+
+    if ( FT_STREAM_SEEK( section_offset ) ||
+         FT_READ_USHORT( num_log_fonts )  )
+      goto Exit;
+
+    if ( idx >= num_log_fonts )
+      return PFR_Err_Invalid_Argument;
+
+    if ( FT_STREAM_SKIP( idx * 5 ) ||
+         FT_READ_USHORT( size )    ||
+         FT_READ_UOFF3 ( offset )  )
+      goto Exit;
+
+    /* save logical font size and offset */
+    log_font->size   = size;
+    log_font->offset = offset;
+
+    /* now, check the rest of the table before loading it */
+    {
+      FT_Byte*  p;
+      FT_Byte*  limit;
+      FT_UInt   local;
+
+
+      if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( size ) )
+        goto Exit;
+
+      p     = stream->cursor;
+      limit = p + size;
+
+      PFR_CHECK(13);
+
+      log_font->matrix[0] = PFR_NEXT_LONG( p );
+      log_font->matrix[1] = PFR_NEXT_LONG( p );
+      log_font->matrix[2] = PFR_NEXT_LONG( p );
+      log_font->matrix[3] = PFR_NEXT_LONG( p );
+
+      flags = PFR_NEXT_BYTE( p );
+
+      local = 0;
+      if ( flags & PFR_LOG_STROKE )
+      {
+        local++;
+        if ( flags & PFR_LOG_2BYTE_STROKE )
+          local++;
+
+        if ( (flags & PFR_LINE_JOIN_MASK) == PFR_LINE_JOIN_MITER )
+          local += 3;
+      }
+      if ( flags & PFR_LOG_BOLD )
+      {
+        local++;
+        if ( flags & PFR_LOG_2BYTE_BOLD )
+          local++;
+      }
+
+      PFR_CHECK( local );
+
+      if ( flags & PFR_LOG_STROKE )
+      {
+        log_font->stroke_thickness = ( flags & PFR_LOG_2BYTE_STROKE )
+                                     ? PFR_NEXT_SHORT( p )
+                                     : PFR_NEXT_BYTE( p );
+
+        if ( ( flags & PFR_LINE_JOIN_MASK ) == PFR_LINE_JOIN_MITER )
+          log_font->miter_limit = PFR_NEXT_LONG( p );
+      }
+
+      if ( flags & PFR_LOG_BOLD )
+      {
+        log_font->bold_thickness = ( flags & PFR_LOG_2BYTE_BOLD )
+                                   ? PFR_NEXT_SHORT( p )
+                                   : PFR_NEXT_BYTE( p );
+      }
+
+      if ( flags & PFR_LOG_EXTRA_ITEMS )
+      {
+        error = pfr_extra_items_skip( &p, limit );
+        if (error) goto Fail;
+      }
+
+      PFR_CHECK(5);
+      log_font->phys_size   = PFR_NEXT_USHORT( p );
+      log_font->phys_offset = PFR_NEXT_ULONG( p );
+      if ( size_increment )
+      {
+        PFR_CHECK( 1 );
+        log_font->phys_size += (FT_UInt32)PFR_NEXT_BYTE( p ) << 16;
+      }
+    }
+
+  Fail:
+    FT_FRAME_EXIT();
+
+  Exit:
+    return error;
+
+  Too_Short:
+    FT_ERROR(( "pfr_log_font_load: invalid logical font table\n" ));
+    error = PFR_Err_Invalid_Table;
+    goto Fail;
+  }
+
+
+  /***********************************************************************/
+  /***********************************************************************/
+  /*****                                                             *****/
+  /*****                    PFR PHYSICAL FONTS                       *****/
+  /*****                                                             *****/
+  /***********************************************************************/
+  /***********************************************************************/
+
+
+  /* load bitmap strikes lists */
+  FT_CALLBACK_DEF( FT_Error )
+  pfr_extra_item_load_bitmap_info( FT_Byte*     p,
+                                   FT_Byte*     limit,
+                                   PFR_PhyFont  phy_font )
+  {
+    FT_Memory   memory = phy_font->memory;
+    PFR_Strike  strike;
+    FT_UInt     flags0;
+    FT_UInt     n, count, size1;
+    FT_Error    error = PFR_Err_Ok;
+
+
+    PFR_CHECK( 5 );
+
+    p += 3;  /* skip bctSize */
+    flags0 = PFR_NEXT_BYTE( p );
+    count  = PFR_NEXT_BYTE( p );
+
+    /* re-allocate when needed */
+    if ( phy_font->num_strikes + count > phy_font->max_strikes )
+    {
+      FT_UInt  new_max = FT_PAD_CEIL( phy_font->num_strikes + count, 4 );
+
+
+      if ( FT_RENEW_ARRAY( phy_font->strikes,
+                           phy_font->num_strikes,
+                           new_max ) )
+        goto Exit;
+
+      phy_font->max_strikes = new_max;
+    }
+
+    size1 = 1 + 1 + 1 + 2 + 2 + 1;
+    if ( flags0 & PFR_STRIKE_2BYTE_XPPM )
+      size1++;
+
+    if ( flags0 & PFR_STRIKE_2BYTE_YPPM )
+      size1++;
+
+    if ( flags0 & PFR_STRIKE_3BYTE_SIZE )
+      size1++;
+
+    if ( flags0 & PFR_STRIKE_3BYTE_OFFSET )
+      size1++;
+
+    if ( flags0 & PFR_STRIKE_2BYTE_COUNT )
+      size1++;
+
+    strike = phy_font->strikes + phy_font->num_strikes;
+
+    PFR_CHECK( count * size1 );
+
+    for ( n = 0; n < count; n++, strike++ )
+    {
+      strike->x_ppm       = ( flags0 & PFR_STRIKE_2BYTE_XPPM )
+                            ? PFR_NEXT_USHORT( p )
+                            : PFR_NEXT_BYTE( p );
+
+      strike->y_ppm       = ( flags0 & PFR_STRIKE_2BYTE_YPPM )
+                            ? PFR_NEXT_USHORT( p )
+                            : PFR_NEXT_BYTE( p );
+
+      strike->flags       = PFR_NEXT_BYTE( p );
+
+      strike->bct_size    = ( flags0 & PFR_STRIKE_3BYTE_SIZE )
+                            ? PFR_NEXT_ULONG( p )
+                            : PFR_NEXT_USHORT( p );
+
+      strike->bct_offset  = ( flags0 & PFR_STRIKE_3BYTE_OFFSET )
+                            ? PFR_NEXT_ULONG( p )
+                            : PFR_NEXT_USHORT( p );
+
+      strike->num_bitmaps = ( flags0 & PFR_STRIKE_2BYTE_COUNT )
+                            ? PFR_NEXT_USHORT( p )
+                            : PFR_NEXT_BYTE( p );
+    }
+
+    phy_font->num_strikes += count;
+
+  Exit:
+    return error;
+
+  Too_Short:
+    error = PFR_Err_Invalid_Table;
+    FT_ERROR(( "pfr_extra_item_load_bitmap_info:"
+               " invalid bitmap info table\n" ));
+    goto Exit;
+  }
+
+
+  /* Load font ID.  This is a so-called "unique" name that is rather
+   * long and descriptive (like "Tiresias ScreenFont v7.51").
+   *
+   * Note that a PFR font's family name is contained in an *undocumented*
+   * string of the "auxiliary data" portion of a physical font record.  This
+   * may also contain the "real" style name!
+   *
+   * If no family name is present, the font ID is used instead for the
+   * family.
+   */
+  FT_CALLBACK_DEF( FT_Error )
+  pfr_extra_item_load_font_id( FT_Byte*     p,
+                               FT_Byte*     limit,
+                               PFR_PhyFont  phy_font )
+  {
+    FT_Error    error  = PFR_Err_Ok;
+    FT_Memory   memory = phy_font->memory;
+    FT_PtrDist  len    = limit - p;
+
+
+    if ( phy_font->font_id != NULL )
+      goto Exit;
+
+    if ( FT_ALLOC( phy_font->font_id, len + 1 ) )
+      goto Exit;
+
+    /* copy font ID name, and terminate it for safety */
+    FT_MEM_COPY( phy_font->font_id, p, len );
+    phy_font->font_id[len] = 0;
+
+  Exit:
+    return error;
+  }
+
+
+  /* load stem snap tables */
+  FT_CALLBACK_DEF( FT_Error )
+  pfr_extra_item_load_stem_snaps( FT_Byte*     p,
+                                  FT_Byte*     limit,
+                                  PFR_PhyFont  phy_font )
+  {
+    FT_UInt    count, num_vert, num_horz;
+    FT_Int*    snaps  = NULL;
+    FT_Error   error  = PFR_Err_Ok;
+    FT_Memory  memory = phy_font->memory;
+
+
+    if ( phy_font->vertical.stem_snaps != NULL )
+      goto Exit;
+
+    PFR_CHECK( 1 );
+    count = PFR_NEXT_BYTE( p );
+
+    num_vert = count & 15;
+    num_horz = count >> 4;
+    count    = num_vert + num_horz;
+
+    PFR_CHECK( count * 2 );
+
+    if ( FT_NEW_ARRAY( snaps, count ) )
+      goto Exit;
+
+    phy_font->vertical.stem_snaps = snaps;
+    phy_font->horizontal.stem_snaps = snaps + num_vert;
+
+    for ( ; count > 0; count--, snaps++ )
+      *snaps = FT_NEXT_SHORT( p );
+
+  Exit:
+    return error;
+
+  Too_Short:
+    error = PFR_Err_Invalid_Table;
+    FT_ERROR(( "pfr_exta_item_load_stem_snaps:"
+               " invalid stem snaps table\n" ));
+    goto Exit;
+  }
+
+
+
+  /* load kerning pair data */
+  FT_CALLBACK_DEF( FT_Error )
+  pfr_extra_item_load_kerning_pairs( FT_Byte*     p,
+                                     FT_Byte*     limit,
+                                     PFR_PhyFont  phy_font )
+  {
+    PFR_KernItem  item   = NULL;
+    FT_Error      error  = PFR_Err_Ok;
+    FT_Memory     memory = phy_font->memory;
+
+
+    FT_TRACE2(( "pfr_extra_item_load_kerning_pairs()\n" ));
+
+    if ( FT_NEW( item ) )
+      goto Exit;
+
+    PFR_CHECK( 4 );
+
+    item->pair_count = PFR_NEXT_BYTE( p );
+    item->base_adj   = PFR_NEXT_SHORT( p );
+    item->flags      = PFR_NEXT_BYTE( p );
+    item->offset     = phy_font->offset + ( p - phy_font->cursor );
+
+#ifndef PFR_CONFIG_NO_CHECKS
+    item->pair_size = 3;
+
+    if ( item->flags & PFR_KERN_2BYTE_CHAR )
+      item->pair_size += 2;
+
+    if ( item->flags & PFR_KERN_2BYTE_ADJ )
+      item->pair_size += 1;
+
+    PFR_CHECK( item->pair_count * item->pair_size );
+#endif
+
+    /* load first and last pairs into the item to speed up */
+    /* lookup later...                                     */
+    if ( item->pair_count > 0 )
+    {
+      FT_UInt   char1, char2;
+      FT_Byte*  q;
+
+
+      if ( item->flags & PFR_KERN_2BYTE_CHAR )
+      {
+        q     = p;
+        char1 = PFR_NEXT_USHORT( q );
+        char2 = PFR_NEXT_USHORT( q );
+
+        item->pair1 = PFR_KERN_INDEX( char1, char2 );
+
+        q = p + item->pair_size * ( item->pair_count - 1 );
+        char1 = PFR_NEXT_USHORT( q );
+        char2 = PFR_NEXT_USHORT( q );
+
+        item->pair2 = PFR_KERN_INDEX( char1, char2 );
+      }
+      else
+      {
+        q     = p;
+        char1 = PFR_NEXT_BYTE( q );
+        char2 = PFR_NEXT_BYTE( q );
+
+        item->pair1 = PFR_KERN_INDEX( char1, char2 );
+
+        q = p + item->pair_size * ( item->pair_count - 1 );
+        char1 = PFR_NEXT_BYTE( q );
+        char2 = PFR_NEXT_BYTE( q );
+
+        item->pair2 = PFR_KERN_INDEX( char1, char2 );
+      }
+
+      /* add new item to the current list */
+      item->next                 = NULL;
+      *phy_font->kern_items_tail = item;
+      phy_font->kern_items_tail  = &item->next;
+      phy_font->num_kern_pairs  += item->pair_count;
+    }
+    else
+    {
+      /* empty item! */
+      FT_FREE( item );
+    }
+
+  Exit:
+    return error;
+
+  Too_Short:
+    FT_FREE( item );
+
+    error = PFR_Err_Invalid_Table;
+    FT_ERROR(( "pfr_extra_item_load_kerning_pairs:"
+               " invalid kerning pairs table\n" ));
+    goto Exit;
+  }
+
+
+
+  static const PFR_ExtraItemRec  pfr_phy_font_extra_items[] =
+  {
+    { 1, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_bitmap_info },
+    { 2, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_font_id },
+    { 3, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_stem_snaps },
+    { 4, (PFR_ExtraItem_ParseFunc)pfr_extra_item_load_kerning_pairs },
+    { 0, NULL }
+  };
+
+
+  /* Loads a name from the auxiliary data.  Since this extracts undocumented
+   * strings from the font file, we need to be careful here.
+   */
+  static FT_Error
+  pfr_aux_name_load( FT_Byte*     p,
+                     FT_UInt      len,
+                     FT_Memory    memory,
+                     FT_String*  *astring )
+  {
+    FT_Error    error = PFR_Err_Ok;
+    FT_String*  result = NULL;
+    FT_UInt     n, ok;
+
+
+    if ( len > 0 && p[len - 1] == 0 )
+      len--;
+
+    /* check that each character is ASCII for making sure not to
+       load garbage
+     */
+    ok = ( len > 0 );
+    for ( n = 0; n < len; n++ )
+      if ( p[n] < 32 || p[n] > 127 )
+      {
+        ok = 0;
+        break;
+      }
+
+    if ( ok )
+    {
+      if ( FT_ALLOC( result, len + 1 ) )
+        goto Exit;
+
+      FT_MEM_COPY( result, p, len );
+      result[len] = 0;
+    }
+  Exit:
+    *astring = result;
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  pfr_phy_font_done( PFR_PhyFont  phy_font,
+                     FT_Memory    memory )
+  {
+    FT_FREE( phy_font->font_id );
+    FT_FREE( phy_font->family_name );
+    FT_FREE( phy_font->style_name );
+
+    FT_FREE( phy_font->vertical.stem_snaps );
+    phy_font->vertical.num_stem_snaps = 0;
+
+    phy_font->horizontal.stem_snaps     = NULL;
+    phy_font->horizontal.num_stem_snaps = 0;
+
+    FT_FREE( phy_font->strikes );
+    phy_font->num_strikes = 0;
+    phy_font->max_strikes = 0;
+
+    FT_FREE( phy_font->chars );
+    phy_font->num_chars    = 0;
+    phy_font->chars_offset = 0;
+
+    FT_FREE( phy_font->blue_values );
+    phy_font->num_blue_values = 0;
+
+    {
+      PFR_KernItem  item, next;
+
+
+      item = phy_font->kern_items;
+      while ( item )
+      {
+        next = item->next;
+        FT_FREE( item );
+        item = next;
+      }
+      phy_font->kern_items      = NULL;
+      phy_font->kern_items_tail = NULL;
+    }
+
+    phy_font->num_kern_pairs = 0;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  pfr_phy_font_load( PFR_PhyFont  phy_font,
+                     FT_Stream    stream,
+                     FT_UInt32    offset,
+                     FT_UInt32    size )
+  {
+    FT_Error   error;
+    FT_Memory  memory = stream->memory;
+    FT_UInt    flags;
+    FT_ULong   num_aux;
+    FT_Byte*   p;
+    FT_Byte*   limit;
+
+
+    phy_font->memory = memory;
+    phy_font->offset = offset;
+
+    phy_font->kern_items      = NULL;
+    phy_font->kern_items_tail = &phy_font->kern_items;
+
+    if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( size ) )
+      goto Exit;
+
+    phy_font->cursor = stream->cursor;
+
+    p     = stream->cursor;
+    limit = p + size;
+
+    PFR_CHECK( 15 );
+    phy_font->font_ref_number    = PFR_NEXT_USHORT( p );
+    phy_font->outline_resolution = PFR_NEXT_USHORT( p );
+    phy_font->metrics_resolution = PFR_NEXT_USHORT( p );
+    phy_font->bbox.xMin          = PFR_NEXT_SHORT( p );
+    phy_font->bbox.yMin          = PFR_NEXT_SHORT( p );
+    phy_font->bbox.xMax          = PFR_NEXT_SHORT( p );
+    phy_font->bbox.yMax          = PFR_NEXT_SHORT( p );
+    phy_font->flags      = flags = PFR_NEXT_BYTE( p );
+
+    /* get the standard advance for non-proportional fonts */
+    if ( !(flags & PFR_PHY_PROPORTIONAL) )
+    {
+      PFR_CHECK( 2 );
+      phy_font->standard_advance = PFR_NEXT_SHORT( p );
+    }
+
+    /* load the extra items when present */
+    if ( flags & PFR_PHY_EXTRA_ITEMS )
+    {
+      error =  pfr_extra_items_parse( &p, limit,
+                                      pfr_phy_font_extra_items, phy_font );
+
+      if ( error )
+        goto Fail;
+    }
+
+    /* In certain fonts, the auxiliary bytes contain interesting  */
+    /* information. These are not in the specification but can be */
+    /* guessed by looking at the content of a few PFR0 fonts.     */
+    PFR_CHECK( 3 );
+    num_aux = PFR_NEXT_ULONG( p );
+
+    if ( num_aux > 0 )
+    {
+      FT_Byte*  q = p;
+      FT_Byte*  q2;
+
+
+      PFR_CHECK( num_aux );
+      p += num_aux;
+
+      while ( num_aux > 0 )
+      {
+        FT_UInt  length, type;
+
+
+        if ( q + 4 > p )
+          break;
+
+        length = PFR_NEXT_USHORT( q );
+        if ( length < 4 || length > num_aux )
+          break;
+
+        q2   = q + length - 2;
+        type = PFR_NEXT_USHORT( q );
+
+        switch ( type )
+        {
+        case 1:
+          /* this seems to correspond to the font's family name,
+           * padded to 16-bits with one zero when necessary
+           */
+          error = pfr_aux_name_load( q, length - 4U, memory,
+                                     &phy_font->family_name );
+          if ( error )
+            goto Exit;
+          break;
+
+        case 2:
+          if ( q + 32 > q2 )
+            break;
+
+          q += 10;
+          phy_font->ascent  = PFR_NEXT_SHORT( q );
+          phy_font->descent = PFR_NEXT_SHORT( q );
+          phy_font->leading = PFR_NEXT_SHORT( q );
+          q += 16;
+          break;
+
+        case 3:
+          /* this seems to correspond to the font's style name,
+           * padded to 16-bits with one zero when necessary
+           */
+          error = pfr_aux_name_load( q, length - 4U, memory,
+                                     &phy_font->style_name );
+          if ( error )
+            goto Exit;
+          break;
+
+        default:
+          ;
+        }
+
+        q        = q2;
+        num_aux -= length;
+      }
+    }
+
+    /* read the blue values */
+    {
+      FT_UInt  n, count;
+
+
+      PFR_CHECK( 1 );
+      phy_font->num_blue_values = count = PFR_NEXT_BYTE( p );
+
+      PFR_CHECK( count * 2 );
+
+      if ( FT_NEW_ARRAY( phy_font->blue_values, count ) )
+        goto Fail;
+
+      for ( n = 0; n < count; n++ )
+        phy_font->blue_values[n] = PFR_NEXT_SHORT( p );
+    }
+
+    PFR_CHECK( 8 );
+    phy_font->blue_fuzz  = PFR_NEXT_BYTE( p );
+    phy_font->blue_scale = PFR_NEXT_BYTE( p );
+
+    phy_font->vertical.standard   = PFR_NEXT_USHORT( p );
+    phy_font->horizontal.standard = PFR_NEXT_USHORT( p );
+
+    /* read the character descriptors */
+    {
+      FT_UInt  n, count, Size;
+
+
+      phy_font->num_chars    = count = PFR_NEXT_USHORT( p );
+      phy_font->chars_offset = offset + ( p - stream->cursor );
+
+      if ( FT_NEW_ARRAY( phy_font->chars, count ) )
+        goto Fail;
+
+      Size = 1 + 1 + 2;
+      if ( flags & PFR_PHY_2BYTE_CHARCODE )
+        Size += 1;
+
+      if ( flags & PFR_PHY_PROPORTIONAL )
+        Size += 2;
+
+      if ( flags & PFR_PHY_ASCII_CODE )
+        Size += 1;
+
+      if ( flags & PFR_PHY_2BYTE_GPS_SIZE )
+        Size += 1;
+
+      if ( flags & PFR_PHY_3BYTE_GPS_OFFSET )
+        Size += 1;
+
+      PFR_CHECK( count * Size );
+
+      for ( n = 0; n < count; n++ )
+      {
+        PFR_Char  cur = &phy_font->chars[n];
+
+
+        cur->char_code = ( flags & PFR_PHY_2BYTE_CHARCODE )
+                         ? PFR_NEXT_USHORT( p )
+                         : PFR_NEXT_BYTE( p );
+
+        cur->advance   = ( flags & PFR_PHY_PROPORTIONAL )
+                         ? PFR_NEXT_SHORT( p )
+                         : (FT_Int) phy_font->standard_advance;
+
+#if 0
+        cur->ascii     = ( flags & PFR_PHY_ASCII_CODE )
+                         ? PFR_NEXT_BYTE( p )
+                         : 0;
+#else
+        if ( flags & PFR_PHY_ASCII_CODE )
+          p += 1;
+#endif
+        cur->gps_size  = ( flags & PFR_PHY_2BYTE_GPS_SIZE )
+                         ? PFR_NEXT_USHORT( p )
+                         : PFR_NEXT_BYTE( p );
+
+        cur->gps_offset = ( flags & PFR_PHY_3BYTE_GPS_OFFSET )
+                          ? PFR_NEXT_ULONG( p )
+                          : PFR_NEXT_USHORT( p );
+      }
+    }
+
+    /* that's it! */
+
+  Fail:
+    FT_FRAME_EXIT();
+
+    /* save position of bitmap info */
+    phy_font->bct_offset = FT_STREAM_POS();
+    phy_font->cursor     = NULL;
+
+  Exit:
+    return error;
+
+  Too_Short:
+    error = PFR_Err_Invalid_Table;
+    FT_ERROR(( "pfr_phy_font_load: invalid physical font table\n" ));
+    goto Fail;
+  }
+
+
+/* END */
diff --git a/src/pfr/pfrload.h b/src/pfr/pfrload.h
new file mode 100644 (file)
index 0000000..ed01071
--- /dev/null
@@ -0,0 +1,118 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pfrload.h                                                              */
+/*                                                                         */
+/*    FreeType PFR loader (specification).                                 */
+/*                                                                         */
+/*  Copyright 2002 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PFRLOAD_H__
+#define __PFRLOAD_H__
+
+#include "pfrobjs.h"
+#include FT_INTERNAL_STREAM_H
+
+
+FT_BEGIN_HEADER
+
+#ifdef PFR_CONFIG_NO_CHECKS
+#define PFR_CHECK( x )  do { } while ( 0 )
+#else
+#define PFR_CHECK( x )  do                       \
+                        {                        \
+                          if ( p + (x) > limit ) \
+                            goto Too_Short;      \
+                        } while ( 0 )
+#endif
+
+#define PFR_NEXT_BYTE( p )    FT_NEXT_BYTE( p )
+#define PFR_NEXT_INT8( p )    FT_NEXT_CHAR( p )
+#define PFR_NEXT_SHORT( p )   FT_NEXT_SHORT( p )
+#define PFR_NEXT_USHORT( p )  FT_NEXT_USHORT( p )
+#define PFR_NEXT_LONG( p )    FT_NEXT_OFF3( p )
+#define PFR_NEXT_ULONG( p )   FT_NEXT_UOFF3( p )
+
+
+ /* handling extra items */
+
+  typedef FT_Error
+  (*PFR_ExtraItem_ParseFunc)( FT_Byte*    p,
+                              FT_Byte*    limit,
+                              FT_Pointer  data );
+
+  typedef struct  PFR_ExtraItemRec_
+  {
+    FT_UInt                  type;
+    PFR_ExtraItem_ParseFunc  parser;
+
+  } PFR_ExtraItemRec;
+
+  typedef const struct PFR_ExtraItemRec_*  PFR_ExtraItem;
+
+
+  FT_LOCAL( FT_Error )
+  pfr_extra_items_skip( FT_Byte*  *pp,
+                        FT_Byte*  limit );
+
+  FT_LOCAL( FT_Error )
+  pfr_extra_items_parse( FT_Byte*      *pp,
+                         FT_Byte*       limit,
+                         PFR_ExtraItem  item_list,
+                         FT_Pointer     item_data );
+
+
+  /* load a PFR header */
+  FT_LOCAL( FT_Error )
+  pfr_header_load( PFR_Header  header,
+                   FT_Stream   stream );
+
+  /* check a PFR header */
+  FT_LOCAL( FT_Bool )
+  pfr_header_check( PFR_Header  header );
+
+
+  /* return number of logical fonts in this file */
+  FT_LOCAL( FT_Error )
+  pfr_log_font_count( FT_Stream   stream,
+                      FT_UInt32   log_section_offset,
+                      FT_UInt    *acount );
+
+  /* load a pfr logical font entry */
+  FT_LOCAL( FT_Error )
+  pfr_log_font_load( PFR_LogFont  log_font,
+                     FT_Stream    stream,
+                     FT_UInt      face_index,
+                     FT_UInt32    section_offset,
+                     FT_Bool      size_increment );
+
+
+  /* load a physical font entry */
+  FT_LOCAL( FT_Error )
+  pfr_phy_font_load( PFR_PhyFont  phy_font,
+                     FT_Stream    stream,
+                     FT_UInt32    offset,
+                     FT_UInt32    size );
+
+  /* finalize a physical font */
+  FT_LOCAL( void )
+  pfr_phy_font_done( PFR_PhyFont  phy_font,
+                     FT_Memory    memory );
+
+  /* */
+
+FT_END_HEADER
+
+#endif /* __PFRLOAD_H__ */
+
+
+/* END */
diff --git a/src/pfr/pfrobjs.c b/src/pfr/pfrobjs.c
new file mode 100644 (file)
index 0000000..c65cf29
--- /dev/null
@@ -0,0 +1,593 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pfrobjs.c                                                              */
+/*                                                                         */
+/*    FreeType PFR object methods (body).                                  */
+/*                                                                         */
+/*  Copyright 2002-2008, 2010-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "pfrobjs.h"
+#include "pfrload.h"
+#include "pfrgload.h"
+#include "pfrcmap.h"
+#include "pfrsbit.h"
+#include FT_OUTLINE_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_TRUETYPE_IDS_H
+
+#include "pfrerror.h"
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_pfr
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     FACE OBJECT METHODS                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  pfr_face_done( FT_Face  pfrface )     /* PFR_Face */
+  {
+    PFR_Face   face = (PFR_Face)pfrface;
+    FT_Memory  memory;
+
+
+    if ( !face )
+      return;
+
+    memory = pfrface->driver->root.memory;
+
+    /* we don't want dangling pointers */
+    pfrface->family_name = NULL;
+    pfrface->style_name  = NULL;
+
+    /* finalize the physical font record */
+    pfr_phy_font_done( &face->phy_font, FT_FACE_MEMORY( face ) );
+
+    /* no need to finalize the logical font or the header */
+    FT_FREE( pfrface->available_sizes );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  pfr_face_init( FT_Stream      stream,
+                 FT_Face        pfrface,
+                 FT_Int         face_index,
+                 FT_Int         num_params,
+                 FT_Parameter*  params )
+  {
+    PFR_Face  face = (PFR_Face)pfrface;
+    FT_Error  error;
+
+    FT_UNUSED( num_params );
+    FT_UNUSED( params );
+
+
+    FT_TRACE2(( "PFR driver\n" ));
+
+    /* load the header and check it */
+    error = pfr_header_load( &face->header, stream );
+    if ( error )
+      goto Exit;
+
+    if ( !pfr_header_check( &face->header ) )
+    {
+      FT_TRACE2(( "  not a PFR font\n" ));
+      error = PFR_Err_Unknown_File_Format;
+      goto Exit;
+    }
+
+    /* check face index */
+    {
+      FT_UInt  num_faces;
+
+
+      error = pfr_log_font_count( stream,
+                                  face->header.log_dir_offset,
+                                  &num_faces );
+      if ( error )
+        goto Exit;
+
+      pfrface->num_faces = num_faces;
+    }
+
+    if ( face_index < 0 )
+      goto Exit;
+
+    if ( face_index >= pfrface->num_faces )
+    {
+      FT_ERROR(( "pfr_face_init: invalid face index\n" ));
+      error = PFR_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    /* load the face */
+    error = pfr_log_font_load(
+               &face->log_font, stream, face_index,
+               face->header.log_dir_offset,
+               FT_BOOL( face->header.phy_font_max_size_high != 0 ) );
+    if ( error )
+      goto Exit;
+
+    /* now load the physical font descriptor */
+    error = pfr_phy_font_load( &face->phy_font, stream,
+                               face->log_font.phys_offset,
+                               face->log_font.phys_size );
+    if ( error )
+      goto Exit;
+
+    /* now set up all root face fields */
+    {
+      PFR_PhyFont  phy_font = &face->phy_font;
+
+
+      pfrface->face_index = face_index;
+      pfrface->num_glyphs = phy_font->num_chars + 1;
+      pfrface->face_flags = FT_FACE_FLAG_SCALABLE;
+
+      /* if all characters point to the same gps_offset 0, we */
+      /* assume that the font only contains bitmaps           */
+      {
+        FT_UInt  nn;
+
+
+        for ( nn = 0; nn < phy_font->num_chars; nn++ )
+          if ( phy_font->chars[nn].gps_offset != 0 )
+            break;
+
+        if ( nn == phy_font->num_chars )
+        {
+          if ( phy_font->num_strikes > 0 )
+            pfrface->face_flags = 0;        /* not scalable */
+          else
+          {
+            FT_ERROR(( "pfr_face_init: font doesn't contain glyphs\n" ));
+            error = PFR_Err_Invalid_File_Format;
+            goto Exit;
+          }
+        }
+      }
+
+      if ( (phy_font->flags & PFR_PHY_PROPORTIONAL) == 0 )
+        pfrface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+      if ( phy_font->flags & PFR_PHY_VERTICAL )
+        pfrface->face_flags |= FT_FACE_FLAG_VERTICAL;
+      else
+        pfrface->face_flags |= FT_FACE_FLAG_HORIZONTAL;
+
+      if ( phy_font->num_strikes > 0 )
+        pfrface->face_flags |= FT_FACE_FLAG_FIXED_SIZES;
+
+      if ( phy_font->num_kern_pairs > 0 )
+        pfrface->face_flags |= FT_FACE_FLAG_KERNING;
+
+      /* If no family name was found in the "undocumented" auxiliary
+       * data, use the font ID instead.  This sucks but is better than
+       * nothing.
+       */
+      pfrface->family_name = phy_font->family_name;
+      if ( pfrface->family_name == NULL )
+        pfrface->family_name = phy_font->font_id;
+
+      /* note that the style name can be NULL in certain PFR fonts,
+       * probably meaning "Regular"
+       */
+      pfrface->style_name = phy_font->style_name;
+
+      pfrface->num_fixed_sizes = 0;
+      pfrface->available_sizes = 0;
+
+      pfrface->bbox         = phy_font->bbox;
+      pfrface->units_per_EM = (FT_UShort)phy_font->outline_resolution;
+      pfrface->ascender     = (FT_Short) phy_font->bbox.yMax;
+      pfrface->descender    = (FT_Short) phy_font->bbox.yMin;
+
+      pfrface->height = (FT_Short)( ( pfrface->units_per_EM * 12 ) / 10 );
+      if ( pfrface->height < pfrface->ascender - pfrface->descender )
+        pfrface->height = (FT_Short)(pfrface->ascender - pfrface->descender);
+
+      if ( phy_font->num_strikes > 0 )
+      {
+        FT_UInt          n, count = phy_font->num_strikes;
+        FT_Bitmap_Size*  size;
+        PFR_Strike       strike;
+        FT_Memory        memory = pfrface->stream->memory;
+
+
+        if ( FT_NEW_ARRAY( pfrface->available_sizes, count ) )
+          goto Exit;
+
+        size   = pfrface->available_sizes;
+        strike = phy_font->strikes;
+        for ( n = 0; n < count; n++, size++, strike++ )
+        {
+          size->height = (FT_UShort)strike->y_ppm;
+          size->width  = (FT_UShort)strike->x_ppm;
+          size->size   = strike->y_ppm << 6;
+          size->x_ppem = strike->x_ppm << 6;
+          size->y_ppem = strike->y_ppm << 6;
+        }
+        pfrface->num_fixed_sizes = count;
+      }
+
+      /* now compute maximum advance width */
+      if ( ( phy_font->flags & PFR_PHY_PROPORTIONAL ) == 0 )
+        pfrface->max_advance_width = (FT_Short)phy_font->standard_advance;
+      else
+      {
+        FT_Int    max = 0;
+        FT_UInt   count = phy_font->num_chars;
+        PFR_Char  gchar = phy_font->chars;
+
+
+        for ( ; count > 0; count--, gchar++ )
+        {
+          if ( max < gchar->advance )
+            max = gchar->advance;
+        }
+
+        pfrface->max_advance_width = (FT_Short)max;
+      }
+
+      pfrface->max_advance_height = pfrface->height;
+
+      pfrface->underline_position  = (FT_Short)( -pfrface->units_per_EM / 10 );
+      pfrface->underline_thickness = (FT_Short)(  pfrface->units_per_EM / 30 );
+
+      /* create charmap */
+      {
+        FT_CharMapRec  charmap;
+
+
+        charmap.face        = pfrface;
+        charmap.platform_id = TT_PLATFORM_MICROSOFT;
+        charmap.encoding_id = TT_MS_ID_UNICODE_CS;
+        charmap.encoding    = FT_ENCODING_UNICODE;
+
+        error = FT_CMap_New( &pfr_cmap_class_rec, NULL, &charmap, NULL );
+
+#if 0
+        /* Select default charmap */
+        if ( pfrface->num_charmaps )
+          pfrface->charmap = pfrface->charmaps[0];
+#endif
+      }
+
+      /* check whether we've loaded any kerning pairs */
+      if ( phy_font->num_kern_pairs )
+        pfrface->face_flags |= FT_FACE_FLAG_KERNING;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    SLOT OBJECT METHOD                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( FT_Error )
+  pfr_slot_init( FT_GlyphSlot  pfrslot )        /* PFR_Slot */
+  {
+    PFR_Slot        slot   = (PFR_Slot)pfrslot;
+    FT_GlyphLoader  loader = pfrslot->internal->loader;
+
+
+    pfr_glyph_init( &slot->glyph, loader );
+
+    return 0;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  pfr_slot_done( FT_GlyphSlot  pfrslot )        /* PFR_Slot */
+  {
+    PFR_Slot  slot = (PFR_Slot)pfrslot;
+
+
+    pfr_glyph_done( &slot->glyph );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  pfr_slot_load( FT_GlyphSlot  pfrslot,         /* PFR_Slot */
+                 FT_Size       pfrsize,         /* PFR_Size */
+                 FT_UInt       gindex,
+                 FT_Int32      load_flags )
+  {
+    PFR_Slot     slot    = (PFR_Slot)pfrslot;
+    PFR_Size     size    = (PFR_Size)pfrsize;
+    FT_Error     error;
+    PFR_Face     face    = (PFR_Face)pfrslot->face;
+    PFR_Char     gchar;
+    FT_Outline*  outline = &pfrslot->outline;
+    FT_ULong     gps_offset;
+
+
+    if ( gindex > 0 )
+      gindex--;
+
+    if ( !face || gindex >= face->phy_font.num_chars )
+    {
+      error = PFR_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    /* try to load an embedded bitmap */
+    if ( ( load_flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP ) ) == 0 )
+    {
+      error = pfr_slot_load_bitmap( slot, size, gindex );
+      if ( error == 0 )
+        goto Exit;
+    }
+
+    if ( load_flags & FT_LOAD_SBITS_ONLY )
+    {
+      error = PFR_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    gchar               = face->phy_font.chars + gindex;
+    pfrslot->format     = FT_GLYPH_FORMAT_OUTLINE;
+    outline->n_points   = 0;
+    outline->n_contours = 0;
+    gps_offset          = face->header.gps_section_offset;
+
+    /* load the glyph outline (FT_LOAD_NO_RECURSE isn't supported) */
+    error = pfr_glyph_load( &slot->glyph, face->root.stream,
+                            gps_offset, gchar->gps_offset, gchar->gps_size );
+
+    if ( !error )
+    {
+      FT_BBox            cbox;
+      FT_Glyph_Metrics*  metrics = &pfrslot->metrics;
+      FT_Pos             advance;
+      FT_Int             em_metrics, em_outline;
+      FT_Bool            scaling;
+
+
+      scaling = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 );
+
+      /* copy outline data */
+      *outline = slot->glyph.loader->base.outline;
+
+      outline->flags &= ~FT_OUTLINE_OWNER;
+      outline->flags |= FT_OUTLINE_REVERSE_FILL;
+
+      if ( size && pfrsize->metrics.y_ppem < 24 )
+        outline->flags |= FT_OUTLINE_HIGH_PRECISION;
+
+      /* compute the advance vector */
+      metrics->horiAdvance = 0;
+      metrics->vertAdvance = 0;
+
+      advance    = gchar->advance;
+      em_metrics = face->phy_font.metrics_resolution;
+      em_outline = face->phy_font.outline_resolution;
+
+      if ( em_metrics != em_outline )
+        advance = FT_MulDiv( advance, em_outline, em_metrics );
+
+      if ( face->phy_font.flags & PFR_PHY_VERTICAL )
+        metrics->vertAdvance = advance;
+      else
+        metrics->horiAdvance = advance;
+
+      pfrslot->linearHoriAdvance = metrics->horiAdvance;
+      pfrslot->linearVertAdvance = metrics->vertAdvance;
+
+      /* make-up vertical metrics(?) */
+      metrics->vertBearingX = 0;
+      metrics->vertBearingY = 0;
+
+#if 0 /* some fonts seem to be broken here! */
+
+      /* Apply the font matrix, if any.                 */
+      /* TODO: Test existing fonts with unusual matrix  */
+      /* whether we have to adjust Units per EM.        */
+      {
+        FT_Matrix font_matrix;
+
+
+        font_matrix.xx = face->log_font.matrix[0] << 8;
+        font_matrix.yx = face->log_font.matrix[1] << 8;
+        font_matrix.xy = face->log_font.matrix[2] << 8;
+        font_matrix.yy = face->log_font.matrix[3] << 8;
+
+        FT_Outline_Transform( outline, &font_matrix );
+      }
+#endif
+
+      /* scale when needed */
+      if ( scaling )
+      {
+        FT_Int      n;
+        FT_Fixed    x_scale = pfrsize->metrics.x_scale;
+        FT_Fixed    y_scale = pfrsize->metrics.y_scale;
+        FT_Vector*  vec     = outline->points;
+
+
+        /* scale outline points */
+        for ( n = 0; n < outline->n_points; n++, vec++ )
+        {
+          vec->x = FT_MulFix( vec->x, x_scale );
+          vec->y = FT_MulFix( vec->y, y_scale );
+        }
+
+        /* scale the advance */
+        metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
+        metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
+      }
+
+      /* compute the rest of the metrics */
+      FT_Outline_Get_CBox( outline, &cbox );
+
+      metrics->width        = cbox.xMax - cbox.xMin;
+      metrics->height       = cbox.yMax - cbox.yMin;
+      metrics->horiBearingX = cbox.xMin;
+      metrics->horiBearingY = cbox.yMax - metrics->height;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      KERNING METHOD                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( FT_Error )
+  pfr_face_get_kerning( FT_Face     pfrface,        /* PFR_Face */
+                        FT_UInt     glyph1,
+                        FT_UInt     glyph2,
+                        FT_Vector*  kerning )
+  {
+    PFR_Face     face     = (PFR_Face)pfrface;
+    FT_Error     error    = PFR_Err_Ok;
+    PFR_PhyFont  phy_font = &face->phy_font;
+    FT_UInt32    code1, code2, pair;
+
+
+    kerning->x = 0;
+    kerning->y = 0;
+
+    if ( glyph1 > 0 )
+      glyph1--;
+
+    if ( glyph2 > 0 )
+      glyph2--;
+
+    /* convert glyph indices to character codes */
+    if ( glyph1 > phy_font->num_chars ||
+         glyph2 > phy_font->num_chars )
+      goto Exit;
+
+    code1 = phy_font->chars[glyph1].char_code;
+    code2 = phy_font->chars[glyph2].char_code;
+    pair  = PFR_KERN_INDEX( code1, code2 );
+
+    /* now search the list of kerning items */
+    {
+      PFR_KernItem  item   = phy_font->kern_items;
+      FT_Stream     stream = pfrface->stream;
+
+
+      for ( ; item; item = item->next )
+      {
+        if ( pair >= item->pair1 && pair <= item->pair2 )
+          goto FoundPair;
+      }
+      goto Exit;
+
+    FoundPair: /* we found an item, now parse it and find the value if any */
+      if ( FT_STREAM_SEEK( item->offset )                       ||
+           FT_FRAME_ENTER( item->pair_count * item->pair_size ) )
+        goto Exit;
+
+      {
+        FT_UInt    count       = item->pair_count;
+        FT_UInt    size        = item->pair_size;
+        FT_UInt    power       = (FT_UInt)ft_highpow2( (FT_UInt32)count );
+        FT_UInt    probe       = power * size;
+        FT_UInt    extra       = count - power;
+        FT_Byte*   base        = stream->cursor;
+        FT_Bool    twobytes    = FT_BOOL( item->flags & 1 );
+        FT_Bool    twobyte_adj = FT_BOOL( item->flags & 2 );
+        FT_Byte*   p;
+        FT_UInt32  cpair;
+
+
+        if ( extra > 0 )
+        {
+          p = base + extra * size;
+
+          if ( twobytes )
+            cpair = FT_NEXT_ULONG( p );
+          else
+            cpair = PFR_NEXT_KPAIR( p );
+
+          if ( cpair == pair )
+            goto Found;
+
+          if ( cpair < pair )
+          {
+            if ( twobyte_adj )
+              p += 2;
+            else
+              p++;
+            base = p;
+          }
+        }
+
+        while ( probe > size )
+        {
+          probe >>= 1;
+          p       = base + probe;
+
+          if ( twobytes )
+            cpair = FT_NEXT_ULONG( p );
+          else
+            cpair = PFR_NEXT_KPAIR( p );
+
+          if ( cpair == pair )
+            goto Found;
+
+          if ( cpair < pair )
+            base += probe;
+        }
+
+        p = base;
+
+        if ( twobytes )
+          cpair = FT_NEXT_ULONG( p );
+        else
+          cpair = PFR_NEXT_KPAIR( p );
+
+        if ( cpair == pair )
+        {
+          FT_Int  value;
+
+
+        Found:
+          if ( twobyte_adj )
+            value = FT_PEEK_SHORT( p );
+          else
+            value = p[0];
+
+          kerning->x = item->base_adj + value;
+        }
+      }
+
+      FT_FRAME_EXIT();
+    }
+
+  Exit:
+    return error;
+  }
+
+/* END */
diff --git a/src/pfr/pfrobjs.h b/src/pfr/pfrobjs.h
new file mode 100644 (file)
index 0000000..f6aa8b4
--- /dev/null
@@ -0,0 +1,96 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pfrobjs.h                                                              */
+/*                                                                         */
+/*    FreeType PFR object methods (specification).                         */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PFROBJS_H__
+#define __PFROBJS_H__
+
+#include "pfrtypes.h"
+
+
+FT_BEGIN_HEADER
+
+  typedef struct PFR_FaceRec_*  PFR_Face;
+
+  typedef struct PFR_SizeRec_*  PFR_Size;
+
+  typedef struct PFR_SlotRec_*  PFR_Slot;
+
+
+  typedef struct  PFR_FaceRec_
+  {
+    FT_FaceRec      root;
+    PFR_HeaderRec   header;
+    PFR_LogFontRec  log_font;
+    PFR_PhyFontRec  phy_font;
+
+  } PFR_FaceRec;
+
+
+  typedef struct  PFR_SizeRec_
+  {
+    FT_SizeRec  root;
+
+  } PFR_SizeRec;
+
+
+  typedef struct  PFR_SlotRec_
+  {
+    FT_GlyphSlotRec  root;
+    PFR_GlyphRec     glyph;
+
+  } PFR_SlotRec;
+
+
+  FT_LOCAL( FT_Error )
+  pfr_face_init( FT_Stream      stream,
+                 FT_Face        face,           /* PFR_Face */
+                 FT_Int         face_index,
+                 FT_Int         num_params,
+                 FT_Parameter*  params );
+
+  FT_LOCAL( void )
+  pfr_face_done( FT_Face  face );               /* PFR_Face */
+
+
+  FT_LOCAL( FT_Error )
+  pfr_face_get_kerning( FT_Face     face,       /* PFR_Face */
+                        FT_UInt     glyph1,
+                        FT_UInt     glyph2,
+                        FT_Vector*  kerning );
+
+
+  FT_LOCAL( FT_Error )
+  pfr_slot_init( FT_GlyphSlot  slot );          /* PFR_Slot */
+
+  FT_LOCAL( void )
+  pfr_slot_done( FT_GlyphSlot  slot );          /* PFR_Slot */
+
+
+  FT_LOCAL( FT_Error )
+  pfr_slot_load( FT_GlyphSlot  slot,            /* PFR_Slot */
+                 FT_Size       size,            /* PFR_Size */
+                 FT_UInt       gindex,
+                 FT_Int32      load_flags );
+
+
+FT_END_HEADER
+
+#endif /* __PFROBJS_H__ */
+
+
+/* END */
diff --git a/src/pfr/pfrsbit.c b/src/pfr/pfrsbit.c
new file mode 100644 (file)
index 0000000..52bc2c8
--- /dev/null
@@ -0,0 +1,698 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pfrsbit.c                                                              */
+/*                                                                         */
+/*    FreeType PFR bitmap loader (body).                                   */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "pfrsbit.h"
+#include "pfrload.h"
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+
+#include "pfrerror.h"
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_pfr
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      PFR BIT WRITER                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct  PFR_BitWriter_
+  {
+    FT_Byte*  line;      /* current line start                    */
+    FT_Int    pitch;     /* line size in bytes                    */
+    FT_Int    width;     /* width in pixels/bits                  */
+    FT_Int    rows;      /* number of remaining rows to scan      */
+    FT_Int    total;     /* total number of bits to draw          */
+
+  } PFR_BitWriterRec, *PFR_BitWriter;
+
+
+  static void
+  pfr_bitwriter_init( PFR_BitWriter  writer,
+                      FT_Bitmap*     target,
+                      FT_Bool        decreasing )
+  {
+    writer->line   = target->buffer;
+    writer->pitch  = target->pitch;
+    writer->width  = target->width;
+    writer->rows   = target->rows;
+    writer->total  = writer->width * writer->rows;
+
+    if ( !decreasing )
+    {
+      writer->line += writer->pitch * ( target->rows-1 );
+      writer->pitch = -writer->pitch;
+    }
+  }
+
+
+  static void
+  pfr_bitwriter_decode_bytes( PFR_BitWriter  writer,
+                              FT_Byte*       p,
+                              FT_Byte*       limit )
+  {
+    FT_Int    n, reload;
+    FT_Int    left = writer->width;
+    FT_Byte*  cur  = writer->line;
+    FT_UInt   mask = 0x80;
+    FT_UInt   val  = 0;
+    FT_UInt   c    = 0;
+
+
+    n = (FT_Int)( limit - p ) * 8;
+    if ( n > writer->total )
+      n = writer->total;
+
+    reload = n & 7;
+
+    for ( ; n > 0; n-- )
+    {
+      if ( ( n & 7 ) == reload )
+        val = *p++;
+
+      if ( val & 0x80 )
+        c |= mask;
+
+      val  <<= 1;
+      mask >>= 1;
+
+      if ( --left <= 0 )
+      {
+        cur[0] = (FT_Byte)c;
+        left   = writer->width;
+        mask   = 0x80;
+
+        writer->line += writer->pitch;
+        cur           = writer->line;
+        c             = 0;
+      }
+      else if ( mask == 0 )
+      {
+        cur[0] = (FT_Byte)c;
+        mask   = 0x80;
+        c      = 0;
+        cur ++;
+      }
+    }
+
+    if ( mask != 0x80 )
+      cur[0] = (FT_Byte)c;
+  }
+
+
+  static void
+  pfr_bitwriter_decode_rle1( PFR_BitWriter  writer,
+                             FT_Byte*       p,
+                             FT_Byte*       limit )
+  {
+    FT_Int    n, phase, count, counts[2], reload;
+    FT_Int    left = writer->width;
+    FT_Byte*  cur  = writer->line;
+    FT_UInt   mask = 0x80;
+    FT_UInt   c    = 0;
+
+
+    n = writer->total;
+
+    phase     = 1;
+    counts[0] = 0;
+    counts[1] = 0;
+    count     = 0;
+    reload    = 1;
+
+    for ( ; n > 0; n-- )
+    {
+      if ( reload )
+      {
+        do
+        {
+          if ( phase )
+          {
+            FT_Int  v;
+
+
+            if ( p >= limit )
+              break;
+
+            v         = *p++;
+            counts[0] = v >> 4;
+            counts[1] = v & 15;
+            phase     = 0;
+            count     = counts[0];
+          }
+          else
+          {
+            phase = 1;
+            count = counts[1];
+          }
+
+        } while ( count == 0 );
+      }
+
+      if ( phase )
+        c |= mask;
+
+      mask >>= 1;
+
+      if ( --left <= 0 )
+      {
+        cur[0] = (FT_Byte) c;
+        left   = writer->width;
+        mask   = 0x80;
+
+        writer->line += writer->pitch;
+        cur           = writer->line;
+        c             = 0;
+      }
+      else if ( mask == 0 )
+      {
+        cur[0] = (FT_Byte)c;
+        mask   = 0x80;
+        c      = 0;
+        cur ++;
+      }
+
+      reload = ( --count <= 0 );
+    }
+
+    if ( mask != 0x80 )
+      cur[0] = (FT_Byte) c;
+  }
+
+
+  static void
+  pfr_bitwriter_decode_rle2( PFR_BitWriter  writer,
+                             FT_Byte*       p,
+                             FT_Byte*       limit )
+  {
+    FT_Int    n, phase, count, reload;
+    FT_Int    left = writer->width;
+    FT_Byte*  cur  = writer->line;
+    FT_UInt   mask = 0x80;
+    FT_UInt   c    = 0;
+
+
+    n = writer->total;
+
+    phase  = 1;
+    count  = 0;
+    reload = 1;
+
+    for ( ; n > 0; n-- )
+    {
+      if ( reload )
+      {
+        do
+        {
+          if ( p >= limit )
+            break;
+
+          count = *p++;
+          phase = phase ^ 1;
+
+        } while ( count == 0 );
+      }
+
+      if ( phase )
+        c |= mask;
+
+      mask >>= 1;
+
+      if ( --left <= 0 )
+      {
+        cur[0] = (FT_Byte) c;
+        c      = 0;
+        mask   = 0x80;
+        left   = writer->width;
+
+        writer->line += writer->pitch;
+        cur           = writer->line;
+      }
+      else if ( mask == 0 )
+      {
+        cur[0] = (FT_Byte)c;
+        c      = 0;
+        mask   = 0x80;
+        cur ++;
+      }
+
+      reload = ( --count <= 0 );
+    }
+
+    if ( mask != 0x80 )
+      cur[0] = (FT_Byte) c;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                  BITMAP DATA DECODING                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  pfr_lookup_bitmap_data( FT_Byte*   base,
+                          FT_Byte*   limit,
+                          FT_UInt    count,
+                          FT_UInt    flags,
+                          FT_UInt    char_code,
+                          FT_ULong*  found_offset,
+                          FT_ULong*  found_size )
+  {
+    FT_UInt   left, right, char_len;
+    FT_Bool   two = FT_BOOL( flags & 1 );
+    FT_Byte*  buff;
+
+
+    char_len = 4;
+    if ( two )       char_len += 1;
+    if ( flags & 2 ) char_len += 1;
+    if ( flags & 4 ) char_len += 1;
+
+    left  = 0;
+    right = count;
+
+    while ( left < right )
+    {
+      FT_UInt  middle, code;
+
+
+      middle = ( left + right ) >> 1;
+      buff   = base + middle * char_len;
+
+      /* check that we are not outside of the table -- */
+      /* this is possible with broken fonts...         */
+      if ( buff + char_len > limit )
+        goto Fail;
+
+      if ( two )
+        code = PFR_NEXT_USHORT( buff );
+      else
+        code = PFR_NEXT_BYTE( buff );
+
+      if ( code == char_code )
+        goto Found_It;
+
+      if ( code < char_code )
+        left = middle;
+      else
+        right = middle;
+    }
+
+  Fail:
+    /* Not found */
+    *found_size   = 0;
+    *found_offset = 0;
+    return;
+
+  Found_It:
+    if ( flags & 2 )
+      *found_size = PFR_NEXT_USHORT( buff );
+    else
+      *found_size = PFR_NEXT_BYTE( buff );
+
+    if ( flags & 4 )
+      *found_offset = PFR_NEXT_ULONG( buff );
+    else
+      *found_offset = PFR_NEXT_USHORT( buff );
+  }
+
+
+  /* load bitmap metrics.  "*padvance" must be set to the default value */
+  /* before calling this function...                                    */
+  /*                                                                    */
+  static FT_Error
+  pfr_load_bitmap_metrics( FT_Byte**  pdata,
+                           FT_Byte*   limit,
+                           FT_Long    scaled_advance,
+                           FT_Long   *axpos,
+                           FT_Long   *aypos,
+                           FT_UInt   *axsize,
+                           FT_UInt   *aysize,
+                           FT_Long   *aadvance,
+                           FT_UInt   *aformat )
+  {
+    FT_Error  error = PFR_Err_Ok;
+    FT_Byte   flags;
+    FT_Char   b;
+    FT_Byte*  p = *pdata;
+    FT_Long   xpos, ypos, advance;
+    FT_UInt   xsize, ysize;
+
+
+    PFR_CHECK( 1 );
+    flags = PFR_NEXT_BYTE( p );
+
+    xpos    = 0;
+    ypos    = 0;
+    xsize   = 0;
+    ysize   = 0;
+    advance = 0;
+
+    switch ( flags & 3 )
+    {
+    case 0:
+      PFR_CHECK( 1 );
+      b    = PFR_NEXT_INT8( p );
+      xpos = b >> 4;
+      ypos = ( (FT_Char)( b << 4 ) ) >> 4;
+      break;
+
+    case 1:
+      PFR_CHECK( 2 );
+      xpos = PFR_NEXT_INT8( p );
+      ypos = PFR_NEXT_INT8( p );
+      break;
+
+    case 2:
+      PFR_CHECK( 4 );
+      xpos = PFR_NEXT_SHORT( p );
+      ypos = PFR_NEXT_SHORT( p );
+      break;
+
+    case 3:
+      PFR_CHECK( 6 );
+      xpos = PFR_NEXT_LONG( p );
+      ypos = PFR_NEXT_LONG( p );
+      break;
+
+    default:
+      ;
+    }
+
+    flags >>= 2;
+    switch ( flags & 3 )
+    {
+    case 0:
+      /* blank image */
+      xsize = 0;
+      ysize = 0;
+      break;
+
+    case 1:
+      PFR_CHECK( 1 );
+      b     = PFR_NEXT_BYTE( p );
+      xsize = ( b >> 4 ) & 0xF;
+      ysize = b & 0xF;
+      break;
+
+    case 2:
+      PFR_CHECK( 2 );
+      xsize = PFR_NEXT_BYTE( p );
+      ysize = PFR_NEXT_BYTE( p );
+      break;
+
+    case 3:
+      PFR_CHECK( 4 );
+      xsize = PFR_NEXT_USHORT( p );
+      ysize = PFR_NEXT_USHORT( p );
+      break;
+
+    default:
+      ;
+    }
+
+    flags >>= 2;
+    switch ( flags & 3 )
+    {
+    case 0:
+      advance = scaled_advance;
+      break;
+
+    case 1:
+      PFR_CHECK( 1 );
+      advance = PFR_NEXT_INT8( p ) << 8;
+      break;
+
+    case 2:
+      PFR_CHECK( 2 );
+      advance = PFR_NEXT_SHORT( p );
+      break;
+
+    case 3:
+      PFR_CHECK( 3 );
+      advance = PFR_NEXT_LONG( p );
+      break;
+
+    default:
+      ;
+    }
+
+    *axpos    = xpos;
+    *aypos    = ypos;
+    *axsize   = xsize;
+    *aysize   = ysize;
+    *aadvance = advance;
+    *aformat  = flags >> 2;
+    *pdata    = p;
+
+  Exit:
+    return error;
+
+  Too_Short:
+    error = PFR_Err_Invalid_Table;
+    FT_ERROR(( "pfr_load_bitmap_metrics: invalid glyph data\n" ));
+    goto Exit;
+  }
+
+
+  static FT_Error
+  pfr_load_bitmap_bits( FT_Byte*    p,
+                        FT_Byte*    limit,
+                        FT_UInt     format,
+                        FT_Bool     decreasing,
+                        FT_Bitmap*  target )
+  {
+    FT_Error          error = PFR_Err_Ok;
+    PFR_BitWriterRec  writer;
+
+
+    if ( target->rows > 0 && target->width > 0 )
+    {
+      pfr_bitwriter_init( &writer, target, decreasing );
+
+      switch ( format )
+      {
+      case 0: /* packed bits */
+        pfr_bitwriter_decode_bytes( &writer, p, limit );
+        break;
+
+      case 1: /* RLE1 */
+        pfr_bitwriter_decode_rle1( &writer, p, limit );
+        break;
+
+      case 2: /* RLE2 */
+        pfr_bitwriter_decode_rle2( &writer, p, limit );
+        break;
+
+      default:
+        FT_ERROR(( "pfr_read_bitmap_data: invalid image type\n" ));
+        error = PFR_Err_Invalid_File_Format;
+      }
+    }
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     BITMAP LOADING                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( FT_Error )
+  pfr_slot_load_bitmap( PFR_Slot  glyph,
+                        PFR_Size  size,
+                        FT_UInt   glyph_index )
+  {
+    FT_Error     error;
+    PFR_Face     face   = (PFR_Face) glyph->root.face;
+    FT_Stream    stream = face->root.stream;
+    PFR_PhyFont  phys   = &face->phy_font;
+    FT_ULong     gps_offset;
+    FT_ULong     gps_size;
+    PFR_Char     character;
+    PFR_Strike   strike;
+
+
+    character = &phys->chars[glyph_index];
+
+    /* Look-up a bitmap strike corresponding to the current */
+    /* character dimensions                                 */
+    {
+      FT_UInt  n;
+
+
+      strike = phys->strikes;
+      for ( n = 0; n < phys->num_strikes; n++ )
+      {
+        if ( strike->x_ppm == (FT_UInt)size->root.metrics.x_ppem &&
+             strike->y_ppm == (FT_UInt)size->root.metrics.y_ppem )
+        {
+          goto Found_Strike;
+        }
+
+        strike++;
+      }
+
+      /* couldn't find it */
+      return PFR_Err_Invalid_Argument;
+    }
+
+  Found_Strike:
+
+    /* Now lookup the glyph's position within the file */
+    {
+      FT_UInt  char_len;
+
+
+      char_len = 4;
+      if ( strike->flags & 1 ) char_len += 1;
+      if ( strike->flags & 2 ) char_len += 1;
+      if ( strike->flags & 4 ) char_len += 1;
+
+      /* Access data directly in the frame to speed lookups */
+      if ( FT_STREAM_SEEK( phys->bct_offset + strike->bct_offset ) ||
+           FT_FRAME_ENTER( char_len * strike->num_bitmaps )        )
+        goto Exit;
+
+      pfr_lookup_bitmap_data( stream->cursor,
+                              stream->limit,
+                              strike->num_bitmaps,
+                              strike->flags,
+                              character->char_code,
+                              &gps_offset,
+                              &gps_size );
+
+      FT_FRAME_EXIT();
+
+      if ( gps_size == 0 )
+      {
+        /* Could not find a bitmap program string for this glyph */
+        error = PFR_Err_Invalid_Argument;
+        goto Exit;
+      }
+    }
+
+    /* get the bitmap metrics */
+    {
+      FT_Long   xpos = 0, ypos = 0, advance = 0;
+      FT_UInt   xsize = 0, ysize = 0, format = 0;
+      FT_Byte*  p;
+
+
+      /* compute linear advance */
+      advance = character->advance;
+      if ( phys->metrics_resolution != phys->outline_resolution )
+        advance = FT_MulDiv( advance,
+                             phys->outline_resolution,
+                             phys->metrics_resolution );
+
+      glyph->root.linearHoriAdvance = advance;
+
+      /* compute default advance, i.e., scaled advance.  This can be */
+      /* overridden in the bitmap header of certain glyphs.          */
+      advance = FT_MulDiv( (FT_Fixed)size->root.metrics.x_ppem << 8,
+                           character->advance,
+                           phys->metrics_resolution );
+
+      if ( FT_STREAM_SEEK( face->header.gps_section_offset + gps_offset ) ||
+           FT_FRAME_ENTER( gps_size )                                     )
+        goto Exit;
+
+      p     = stream->cursor;
+      error = pfr_load_bitmap_metrics( &p, stream->limit,
+                                       advance,
+                                       &xpos, &ypos,
+                                       &xsize, &ysize,
+                                       &advance, &format );
+
+      /*
+       * XXX: on 16bit system, we return an error for huge bitmap
+       *      which causes a size truncation, because truncated
+       *      size properties makes bitmap glyph broken.
+       */
+      if ( xpos > FT_INT_MAX || ( ypos + ysize ) > FT_INT_MAX )
+      {
+        FT_TRACE1(( "pfr_slot_load_bitmap:" ));
+        FT_TRACE1(( "huge bitmap glyph %dx%d over FT_GlyphSlot\n",
+                     xpos, ypos ));
+        error = PFR_Err_Invalid_Pixel_Size;
+      }
+
+      if ( !error )
+      {
+        glyph->root.format = FT_GLYPH_FORMAT_BITMAP;
+
+        /* Set up glyph bitmap and metrics */
+
+        /* XXX: needs casts to fit FT_Bitmap.{width|rows|pitch} */
+        glyph->root.bitmap.width      = (FT_Int)xsize;
+        glyph->root.bitmap.rows       = (FT_Int)ysize;
+        glyph->root.bitmap.pitch      = (FT_Int)( xsize + 7 ) >> 3;
+        glyph->root.bitmap.pixel_mode = FT_PIXEL_MODE_MONO;
+
+        /* XXX: needs casts to fit FT_Glyph_Metrics.{width|height} */
+        glyph->root.metrics.width        = (FT_Pos)xsize << 6;
+        glyph->root.metrics.height       = (FT_Pos)ysize << 6;
+        glyph->root.metrics.horiBearingX = xpos << 6;
+        glyph->root.metrics.horiBearingY = ypos << 6;
+        glyph->root.metrics.horiAdvance  = FT_PIX_ROUND( ( advance >> 2 ) );
+        glyph->root.metrics.vertBearingX = - glyph->root.metrics.width >> 1;
+        glyph->root.metrics.vertBearingY = 0;
+        glyph->root.metrics.vertAdvance  = size->root.metrics.height;
+
+        /* XXX: needs casts fit FT_GlyphSlotRec.bitmap_{left|top} */
+        glyph->root.bitmap_left = (FT_Int)xpos;
+        glyph->root.bitmap_top  = (FT_Int)(ypos + ysize);
+
+        /* Allocate and read bitmap data */
+        {
+          FT_ULong  len = glyph->root.bitmap.pitch * ysize;
+
+
+          error = ft_glyphslot_alloc_bitmap( &glyph->root, len );
+          if ( !error )
+          {
+            error = pfr_load_bitmap_bits(
+                      p,
+                      stream->limit,
+                      format,
+                      FT_BOOL(face->header.color_flags & 2),
+                      &glyph->root.bitmap );
+          }
+        }
+      }
+
+      FT_FRAME_EXIT();
+    }
+
+  Exit:
+    return error;
+  }
+
+/* END */
diff --git a/src/pfr/pfrsbit.h b/src/pfr/pfrsbit.h
new file mode 100644 (file)
index 0000000..015e9e6
--- /dev/null
@@ -0,0 +1,36 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pfrsbit.h                                                              */
+/*                                                                         */
+/*    FreeType PFR bitmap loader (specification).                          */
+/*                                                                         */
+/*  Copyright 2002 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PFRSBIT_H__
+#define __PFRSBIT_H__
+
+#include "pfrobjs.h"
+
+FT_BEGIN_HEADER
+
+  FT_LOCAL( FT_Error )
+  pfr_slot_load_bitmap( PFR_Slot  glyph,
+                        PFR_Size  size,
+                        FT_UInt   glyph_index );
+
+FT_END_HEADER
+
+#endif /* __PFR_SBIT_H__ */
+
+
+/* END */
diff --git a/src/pfr/pfrtypes.h b/src/pfr/pfrtypes.h
new file mode 100644 (file)
index 0000000..9183108
--- /dev/null
@@ -0,0 +1,362 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pfrtypes.h                                                             */
+/*                                                                         */
+/*    FreeType PFR data structures (specification only).                   */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2005, 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PFRTYPES_H__
+#define __PFRTYPES_H__
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+
+FT_BEGIN_HEADER
+
+  /************************************************************************/
+
+  /* the PFR Header structure */
+  typedef struct  PFR_HeaderRec_
+  {
+    FT_UInt32  signature;
+    FT_UInt    version;
+    FT_UInt    signature2;
+    FT_UInt    header_size;
+
+    FT_UInt    log_dir_size;
+    FT_UInt    log_dir_offset;
+
+    FT_UInt    log_font_max_size;
+    FT_UInt32  log_font_section_size;
+    FT_UInt32  log_font_section_offset;
+
+    FT_UInt32  phy_font_max_size;
+    FT_UInt32  phy_font_section_size;
+    FT_UInt32  phy_font_section_offset;
+
+    FT_UInt    gps_max_size;
+    FT_UInt32  gps_section_size;
+    FT_UInt32  gps_section_offset;
+
+    FT_UInt    max_blue_values;
+    FT_UInt    max_x_orus;
+    FT_UInt    max_y_orus;
+
+    FT_UInt    phy_font_max_size_high;
+    FT_UInt    color_flags;
+
+    FT_UInt32  bct_max_size;
+    FT_UInt32  bct_set_max_size;
+    FT_UInt32  phy_bct_set_max_size;
+
+    FT_UInt    num_phy_fonts;
+    FT_UInt    max_vert_stem_snap;
+    FT_UInt    max_horz_stem_snap;
+    FT_UInt    max_chars;
+
+  } PFR_HeaderRec, *PFR_Header;
+
+
+  /* used in `color_flags' field of the PFR_Header */
+  typedef enum  PFR_HeaderFlags_
+  {
+    PFR_FLAG_BLACK_PIXEL   = 1,
+    PFR_FLAG_INVERT_BITMAP = 2
+
+  } PFR_HeaderFlags;
+
+
+  /************************************************************************/
+
+  typedef struct  PFR_LogFontRec_
+  {
+    FT_UInt32  size;
+    FT_UInt32  offset;
+
+    FT_Int32   matrix[4];
+    FT_UInt    stroke_flags;
+    FT_Int     stroke_thickness;
+    FT_Int     bold_thickness;
+    FT_Int32   miter_limit;
+
+    FT_UInt32  phys_size;
+    FT_UInt32  phys_offset;
+
+  } PFR_LogFontRec, *PFR_LogFont;
+
+
+  typedef enum  PFR_LogFlags_
+  {
+    PFR_LOG_EXTRA_ITEMS  = 0x40,
+    PFR_LOG_2BYTE_BOLD   = 0x20,
+    PFR_LOG_BOLD         = 0x10,
+    PFR_LOG_2BYTE_STROKE = 8,
+    PFR_LOG_STROKE       = 4,
+    PFR_LINE_JOIN_MASK   = 3
+
+  } PFR_LogFlags;
+
+
+  typedef enum  PFR_LineJoinFlags_
+  {
+    PFR_LINE_JOIN_MITER = 0,
+    PFR_LINE_JOIN_ROUND = 1,
+    PFR_LINE_JOIN_BEVEL = 2
+
+  } PFR_LineJoinFlags;
+
+
+  /************************************************************************/
+
+  typedef enum  PFR_BitmapFlags_
+  {
+    PFR_BITMAP_3BYTE_OFFSET   = 4,
+    PFR_BITMAP_2BYTE_SIZE     = 2,
+    PFR_BITMAP_2BYTE_CHARCODE = 1
+
+  } PFR_BitmapFlags;
+
+
+  typedef struct  PFR_BitmapCharRec_
+  {
+    FT_UInt    char_code;
+    FT_UInt    gps_size;
+    FT_UInt32  gps_offset;
+
+  } PFR_BitmapCharRec, *PFR_BitmapChar;
+
+
+  typedef enum  PFR_StrikeFlags_
+  {
+    PFR_STRIKE_2BYTE_COUNT  = 0x10,
+    PFR_STRIKE_3BYTE_OFFSET = 0x08,
+    PFR_STRIKE_3BYTE_SIZE   = 0x04,
+    PFR_STRIKE_2BYTE_YPPM   = 0x02,
+    PFR_STRIKE_2BYTE_XPPM   = 0x01
+
+  } PFR_StrikeFlags;
+
+
+  typedef struct  PFR_StrikeRec_
+  {
+    FT_UInt         x_ppm;
+    FT_UInt         y_ppm;
+    FT_UInt         flags;
+
+    FT_UInt32       gps_size;
+    FT_UInt32       gps_offset;
+
+    FT_UInt32       bct_size;
+    FT_UInt32       bct_offset;
+
+    /* optional */
+    FT_UInt         num_bitmaps;
+    PFR_BitmapChar  bitmaps;
+
+  } PFR_StrikeRec, *PFR_Strike;
+
+
+  /************************************************************************/
+
+  typedef struct  PFR_CharRec_
+  {
+    FT_UInt    char_code;
+    FT_Int     advance;
+    FT_UInt    gps_size;
+    FT_UInt32  gps_offset;
+
+  } PFR_CharRec, *PFR_Char;
+
+
+  /************************************************************************/
+
+  typedef struct  PFR_DimensionRec_
+  {
+    FT_UInt  standard;
+    FT_UInt  num_stem_snaps;
+    FT_Int*  stem_snaps;
+
+  } PFR_DimensionRec, *PFR_Dimension;
+
+  /************************************************************************/
+
+  typedef struct PFR_KernItemRec_*  PFR_KernItem;
+
+  typedef struct  PFR_KernItemRec_
+  {
+    PFR_KernItem  next;
+    FT_Byte       pair_count;
+    FT_Byte       flags;
+    FT_Short      base_adj;
+    FT_UInt       pair_size;
+    FT_Offset     offset;
+    FT_UInt32     pair1;
+    FT_UInt32     pair2;
+
+  } PFR_KernItemRec;
+
+
+#define PFR_KERN_INDEX( g1, g2 )                          \
+          ( ( (FT_UInt32)(g1) << 16 ) | (FT_UInt16)(g2) )
+
+#define PFR_KERN_PAIR_INDEX( pair )                        \
+          PFR_KERN_INDEX( (pair)->glyph1, (pair)->glyph2 )
+
+#define PFR_NEXT_KPAIR( p )  ( p += 2,                              \
+                               ( (FT_UInt32)p[-2] << 16 ) | p[-1] )
+
+
+  /************************************************************************/
+
+  typedef struct  PFR_PhyFontRec_
+  {
+    FT_Memory          memory;
+    FT_UInt32          offset;
+
+    FT_UInt            font_ref_number;
+    FT_UInt            outline_resolution;
+    FT_UInt            metrics_resolution;
+    FT_BBox            bbox;
+    FT_UInt            flags;
+    FT_UInt            standard_advance;
+
+    FT_Int             ascent;   /* optional, bbox.yMax if not present */
+    FT_Int             descent;  /* optional, bbox.yMin if not present */
+    FT_Int             leading;  /* optional, 0 if not present         */
+
+    PFR_DimensionRec   horizontal;
+    PFR_DimensionRec   vertical;
+
+    FT_String*         font_id;
+    FT_String*         family_name;
+    FT_String*         style_name;
+
+    FT_UInt            num_strikes;
+    FT_UInt            max_strikes;
+    PFR_StrikeRec*     strikes;
+
+    FT_UInt            num_blue_values;
+    FT_Int            *blue_values;
+    FT_UInt            blue_fuzz;
+    FT_UInt            blue_scale;
+
+    FT_UInt            num_chars;
+    FT_Offset          chars_offset;
+    PFR_Char           chars;
+
+    FT_UInt            num_kern_pairs;
+    PFR_KernItem       kern_items;
+    PFR_KernItem*      kern_items_tail;
+
+    /* not part of the spec, but used during load */
+    FT_Long            bct_offset;
+    FT_Byte*           cursor;
+
+  } PFR_PhyFontRec, *PFR_PhyFont;
+
+
+  typedef enum  PFR_PhyFlags_
+  {
+    PFR_PHY_EXTRA_ITEMS      = 0x80,
+    PFR_PHY_3BYTE_GPS_OFFSET = 0x20,
+    PFR_PHY_2BYTE_GPS_SIZE   = 0x10,
+    PFR_PHY_ASCII_CODE       = 0x08,
+    PFR_PHY_PROPORTIONAL     = 0x04,
+    PFR_PHY_2BYTE_CHARCODE   = 0x02,
+    PFR_PHY_VERTICAL         = 0x01
+
+  } PFR_PhyFlags;
+
+
+  typedef enum PFR_KernFlags_
+  {
+    PFR_KERN_2BYTE_CHAR  = 0x01,
+    PFR_KERN_2BYTE_ADJ   = 0x02
+
+  } PFR_KernFlags;
+
+
+  /************************************************************************/
+
+  typedef enum  PFR_GlyphFlags_
+  {
+    PFR_GLYPH_IS_COMPOUND   = 0x80,
+    PFR_GLYPH_EXTRA_ITEMS   = 0x08,
+    PFR_GLYPH_1BYTE_XYCOUNT = 0x04,
+    PFR_GLYPH_XCOUNT        = 0x02,
+    PFR_GLYPH_YCOUNT        = 0x01
+
+  } PFR_GlyphFlags;
+
+
+  /* controlled coordinate */
+  typedef struct  PFR_CoordRec_
+  {
+    FT_UInt  org;
+    FT_UInt  cur;
+
+  } PFR_CoordRec, *PFR_Coord;
+
+
+  typedef struct  PFR_SubGlyphRec_
+  {
+    FT_Fixed   x_scale;
+    FT_Fixed   y_scale;
+    FT_Int     x_delta;
+    FT_Int     y_delta;
+    FT_UInt32  gps_offset;
+    FT_UInt    gps_size;
+
+  } PFR_SubGlyphRec, *PFR_SubGlyph;
+
+
+  typedef enum  PFR_SubgGlyphFlags_
+  {
+    PFR_SUBGLYPH_3BYTE_OFFSET = 0x80,
+    PFR_SUBGLYPH_2BYTE_SIZE   = 0x40,
+    PFR_SUBGLYPH_YSCALE       = 0x20,
+    PFR_SUBGLYPH_XSCALE       = 0x10
+
+  } PFR_SubGlyphFlags;
+
+
+  typedef struct  PFR_GlyphRec_
+  {
+    FT_Byte           format;
+
+#if 0
+    FT_UInt           num_x_control;
+    FT_UInt           num_y_control;
+#endif
+    FT_UInt           max_xy_control;
+    FT_Pos*           x_control;
+    FT_Pos*           y_control;
+
+
+    FT_UInt           num_subs;
+    FT_UInt           max_subs;
+    PFR_SubGlyphRec*  subs;
+
+    FT_GlyphLoader    loader;
+    FT_Bool           path_begun;
+
+  } PFR_GlyphRec, *PFR_Glyph;
+
+
+FT_END_HEADER
+
+#endif /* __PFRTYPES_H__ */
+
+
+/* END */
diff --git a/src/pfr/rules.mk b/src/pfr/rules.mk
new file mode 100644 (file)
index 0000000..60b96c7
--- /dev/null
@@ -0,0 +1,73 @@
+#
+# FreeType 2 PFR driver configuration rules
+#
+
+
+# Copyright 2002, 2003 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.
+
+
+# pfr driver directory
+#
+PFR_DIR := $(SRC_DIR)/pfr
+
+
+# compilation flags for the driver
+#
+PFR_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PFR_DIR))
+
+
+# pfr driver sources (i.e., C files)
+#
+PFR_DRV_SRC := $(PFR_DIR)/pfrload.c  \
+               $(PFR_DIR)/pfrgload.c \
+               $(PFR_DIR)/pfrcmap.c  \
+               $(PFR_DIR)/pfrdrivr.c \
+               $(PFR_DIR)/pfrsbit.c  \
+               $(PFR_DIR)/pfrobjs.c
+
+# pfr driver headers
+#
+PFR_DRV_H := $(PFR_DRV_SRC:%.c=%.h) \
+             $(PFR_DIR)/pfrerror.h  \
+             $(PFR_DIR)/pfrtypes.h
+
+
+# Pfr driver object(s)
+#
+#   PFR_DRV_OBJ_M is used during `multi' builds
+#   PFR_DRV_OBJ_S is used during `single' builds
+#
+PFR_DRV_OBJ_M := $(PFR_DRV_SRC:$(PFR_DIR)/%.c=$(OBJ_DIR)/%.$O)
+PFR_DRV_OBJ_S := $(OBJ_DIR)/pfr.$O
+
+# pfr driver source file for single build
+#
+PFR_DRV_SRC_S := $(PFR_DIR)/pfr.c
+
+
+# pfr driver - single object
+#
+$(PFR_DRV_OBJ_S): $(PFR_DRV_SRC_S) $(PFR_DRV_SRC) $(FREETYPE_H) $(PFR_DRV_H)
+       $(PFR_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PFR_DRV_SRC_S))
+
+
+# pfr driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(PFR_DIR)/%.c $(FREETYPE_H) $(PFR_DRV_H)
+       $(PFR_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(PFR_DRV_OBJ_S)
+DRV_OBJS_M += $(PFR_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/psaux/Jamfile b/src/psaux/Jamfile
new file mode 100644 (file)
index 0000000..faeded9
--- /dev/null
@@ -0,0 +1,31 @@
+# FreeType 2 src/psaux Jamfile
+#
+# Copyright 2001, 2002 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) psaux ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = psauxmod psobjs   t1decode t1cmap
+               psconv   afmparse
+               ;
+  }
+  else
+  {
+    _sources = psaux ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/psaux Jamfile
diff --git a/src/psaux/afmparse.c b/src/psaux/afmparse.c
new file mode 100644 (file)
index 0000000..5f3f9e6
--- /dev/null
@@ -0,0 +1,961 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afmparse.c                                                             */
+/*                                                                         */
+/*    AFM parser (body).                                                   */
+/*                                                                         */
+/*  Copyright 2006-2010, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+
+#include "afmparse.h"
+#include "psconv.h"
+
+#include "psauxerr.h"
+
+
+/***************************************************************************/
+/*                                                                         */
+/*    AFM_Stream                                                           */
+/*                                                                         */
+/* The use of AFM_Stream is largely inspired by parseAFM.[ch] from t1lib.  */
+/*                                                                         */
+/*                                                                         */
+
+  enum
+  {
+    AFM_STREAM_STATUS_NORMAL,
+    AFM_STREAM_STATUS_EOC,
+    AFM_STREAM_STATUS_EOL,
+    AFM_STREAM_STATUS_EOF
+  };
+
+
+  typedef struct  AFM_StreamRec_
+  {
+    FT_Byte*  cursor;
+    FT_Byte*  base;
+    FT_Byte*  limit;
+
+    FT_Int    status;
+
+  } AFM_StreamRec;
+
+
+#ifndef EOF
+#define EOF -1
+#endif
+
+
+  /* this works because empty lines are ignored */
+#define AFM_IS_NEWLINE( ch )  ( (ch) == '\r' || (ch) == '\n' )
+
+#define AFM_IS_EOF( ch )      ( (ch) == EOF  || (ch) == '\x1a' )
+#define AFM_IS_SPACE( ch )    ( (ch) == ' '  || (ch) == '\t' )
+
+  /* column separator; there is no `column' in the spec actually */
+#define AFM_IS_SEP( ch )      ( (ch) == ';' )
+
+#define AFM_GETC()                                                       \
+          ( ( (stream)->cursor < (stream)->limit ) ? *(stream)->cursor++ \
+                                                   : EOF )
+
+#define AFM_STREAM_KEY_BEGIN( stream )    \
+          (char*)( (stream)->cursor - 1 )
+
+#define AFM_STREAM_KEY_LEN( stream, key )       \
+          ( (char*)(stream)->cursor - key - 1 )
+
+#define AFM_STATUS_EOC( stream ) \
+          ( (stream)->status >= AFM_STREAM_STATUS_EOC )
+
+#define AFM_STATUS_EOL( stream ) \
+          ( (stream)->status >= AFM_STREAM_STATUS_EOL )
+
+#define AFM_STATUS_EOF( stream ) \
+          ( (stream)->status >= AFM_STREAM_STATUS_EOF )
+
+
+  static int
+  afm_stream_skip_spaces( AFM_Stream  stream )
+  {
+    int  ch = 0;  /* make stupid compiler happy */
+
+
+    if ( AFM_STATUS_EOC( stream ) )
+      return ';';
+
+    while ( 1 )
+    {
+      ch = AFM_GETC();
+      if ( !AFM_IS_SPACE( ch ) )
+        break;
+    }
+
+    if ( AFM_IS_NEWLINE( ch ) )
+      stream->status = AFM_STREAM_STATUS_EOL;
+    else if ( AFM_IS_SEP( ch ) )
+      stream->status = AFM_STREAM_STATUS_EOC;
+    else if ( AFM_IS_EOF( ch ) )
+      stream->status = AFM_STREAM_STATUS_EOF;
+
+    return ch;
+  }
+
+
+  /* read a key or value in current column */
+  static char*
+  afm_stream_read_one( AFM_Stream  stream )
+  {
+    char*  str;
+    int    ch;
+
+
+    afm_stream_skip_spaces( stream );
+    if ( AFM_STATUS_EOC( stream ) )
+      return NULL;
+
+    str = AFM_STREAM_KEY_BEGIN( stream );
+
+    while ( 1 )
+    {
+      ch = AFM_GETC();
+      if ( AFM_IS_SPACE( ch ) )
+        break;
+      else if ( AFM_IS_NEWLINE( ch ) )
+      {
+        stream->status = AFM_STREAM_STATUS_EOL;
+        break;
+      }
+      else if ( AFM_IS_SEP( ch ) )
+      {
+        stream->status = AFM_STREAM_STATUS_EOC;
+        break;
+      }
+      else if ( AFM_IS_EOF( ch ) )
+      {
+        stream->status = AFM_STREAM_STATUS_EOF;
+        break;
+      }
+    }
+
+    return str;
+  }
+
+
+  /* read a string (i.e., read to EOL) */
+  static char*
+  afm_stream_read_string( AFM_Stream  stream )
+  {
+    char*  str;
+    int    ch;
+
+
+    afm_stream_skip_spaces( stream );
+    if ( AFM_STATUS_EOL( stream ) )
+      return NULL;
+
+    str = AFM_STREAM_KEY_BEGIN( stream );
+
+    /* scan to eol */
+    while ( 1 )
+    {
+      ch = AFM_GETC();
+      if ( AFM_IS_NEWLINE( ch ) )
+      {
+        stream->status = AFM_STREAM_STATUS_EOL;
+        break;
+      }
+      else if ( AFM_IS_EOF( ch ) )
+      {
+        stream->status = AFM_STREAM_STATUS_EOF;
+        break;
+      }
+    }
+
+    return str;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*    AFM_Parser                                                         */
+  /*                                                                       */
+  /*                                                                       */
+
+  /* all keys defined in Ch. 7-10 of 5004.AFM_Spec.pdf */
+  typedef enum  AFM_Token_
+  {
+    AFM_TOKEN_ASCENDER,
+    AFM_TOKEN_AXISLABEL,
+    AFM_TOKEN_AXISTYPE,
+    AFM_TOKEN_B,
+    AFM_TOKEN_BLENDAXISTYPES,
+    AFM_TOKEN_BLENDDESIGNMAP,
+    AFM_TOKEN_BLENDDESIGNPOSITIONS,
+    AFM_TOKEN_C,
+    AFM_TOKEN_CC,
+    AFM_TOKEN_CH,
+    AFM_TOKEN_CAPHEIGHT,
+    AFM_TOKEN_CHARWIDTH,
+    AFM_TOKEN_CHARACTERSET,
+    AFM_TOKEN_CHARACTERS,
+    AFM_TOKEN_DESCENDER,
+    AFM_TOKEN_ENCODINGSCHEME,
+    AFM_TOKEN_ENDAXIS,
+    AFM_TOKEN_ENDCHARMETRICS,
+    AFM_TOKEN_ENDCOMPOSITES,
+    AFM_TOKEN_ENDDIRECTION,
+    AFM_TOKEN_ENDFONTMETRICS,
+    AFM_TOKEN_ENDKERNDATA,
+    AFM_TOKEN_ENDKERNPAIRS,
+    AFM_TOKEN_ENDTRACKKERN,
+    AFM_TOKEN_ESCCHAR,
+    AFM_TOKEN_FAMILYNAME,
+    AFM_TOKEN_FONTBBOX,
+    AFM_TOKEN_FONTNAME,
+    AFM_TOKEN_FULLNAME,
+    AFM_TOKEN_ISBASEFONT,
+    AFM_TOKEN_ISCIDFONT,
+    AFM_TOKEN_ISFIXEDPITCH,
+    AFM_TOKEN_ISFIXEDV,
+    AFM_TOKEN_ITALICANGLE,
+    AFM_TOKEN_KP,
+    AFM_TOKEN_KPH,
+    AFM_TOKEN_KPX,
+    AFM_TOKEN_KPY,
+    AFM_TOKEN_L,
+    AFM_TOKEN_MAPPINGSCHEME,
+    AFM_TOKEN_METRICSSETS,
+    AFM_TOKEN_N,
+    AFM_TOKEN_NOTICE,
+    AFM_TOKEN_PCC,
+    AFM_TOKEN_STARTAXIS,
+    AFM_TOKEN_STARTCHARMETRICS,
+    AFM_TOKEN_STARTCOMPOSITES,
+    AFM_TOKEN_STARTDIRECTION,
+    AFM_TOKEN_STARTFONTMETRICS,
+    AFM_TOKEN_STARTKERNDATA,
+    AFM_TOKEN_STARTKERNPAIRS,
+    AFM_TOKEN_STARTKERNPAIRS0,
+    AFM_TOKEN_STARTKERNPAIRS1,
+    AFM_TOKEN_STARTTRACKKERN,
+    AFM_TOKEN_STDHW,
+    AFM_TOKEN_STDVW,
+    AFM_TOKEN_TRACKKERN,
+    AFM_TOKEN_UNDERLINEPOSITION,
+    AFM_TOKEN_UNDERLINETHICKNESS,
+    AFM_TOKEN_VV,
+    AFM_TOKEN_VVECTOR,
+    AFM_TOKEN_VERSION,
+    AFM_TOKEN_W,
+    AFM_TOKEN_W0,
+    AFM_TOKEN_W0X,
+    AFM_TOKEN_W0Y,
+    AFM_TOKEN_W1,
+    AFM_TOKEN_W1X,
+    AFM_TOKEN_W1Y,
+    AFM_TOKEN_WX,
+    AFM_TOKEN_WY,
+    AFM_TOKEN_WEIGHT,
+    AFM_TOKEN_WEIGHTVECTOR,
+    AFM_TOKEN_XHEIGHT,
+    N_AFM_TOKENS,
+    AFM_TOKEN_UNKNOWN
+
+  } AFM_Token;
+
+
+  static const char*  const afm_key_table[N_AFM_TOKENS] =
+  {
+    "Ascender",
+    "AxisLabel",
+    "AxisType",
+    "B",
+    "BlendAxisTypes",
+    "BlendDesignMap",
+    "BlendDesignPositions",
+    "C",
+    "CC",
+    "CH",
+    "CapHeight",
+    "CharWidth",
+    "CharacterSet",
+    "Characters",
+    "Descender",
+    "EncodingScheme",
+    "EndAxis",
+    "EndCharMetrics",
+    "EndComposites",
+    "EndDirection",
+    "EndFontMetrics",
+    "EndKernData",
+    "EndKernPairs",
+    "EndTrackKern",
+    "EscChar",
+    "FamilyName",
+    "FontBBox",
+    "FontName",
+    "FullName",
+    "IsBaseFont",
+    "IsCIDFont",
+    "IsFixedPitch",
+    "IsFixedV",
+    "ItalicAngle",
+    "KP",
+    "KPH",
+    "KPX",
+    "KPY",
+    "L",
+    "MappingScheme",
+    "MetricsSets",
+    "N",
+    "Notice",
+    "PCC",
+    "StartAxis",
+    "StartCharMetrics",
+    "StartComposites",
+    "StartDirection",
+    "StartFontMetrics",
+    "StartKernData",
+    "StartKernPairs",
+    "StartKernPairs0",
+    "StartKernPairs1",
+    "StartTrackKern",
+    "StdHW",
+    "StdVW",
+    "TrackKern",
+    "UnderlinePosition",
+    "UnderlineThickness",
+    "VV",
+    "VVector",
+    "Version",
+    "W",
+    "W0",
+    "W0X",
+    "W0Y",
+    "W1",
+    "W1X",
+    "W1Y",
+    "WX",
+    "WY",
+    "Weight",
+    "WeightVector",
+    "XHeight"
+  };
+
+
+  /*
+   * `afm_parser_read_vals' and `afm_parser_next_key' provide
+   * high-level operations to an AFM_Stream.  The rest of the
+   * parser functions should use them without accessing the
+   * AFM_Stream directly.
+   */
+
+  FT_LOCAL_DEF( FT_Int )
+  afm_parser_read_vals( AFM_Parser  parser,
+                        AFM_Value   vals,
+                        FT_UInt     n )
+  {
+    AFM_Stream  stream = parser->stream;
+    char*       str;
+    FT_UInt     i;
+
+
+    if ( n > AFM_MAX_ARGUMENTS )
+      return 0;
+
+    for ( i = 0; i < n; i++ )
+    {
+      FT_Offset  len;
+      AFM_Value  val = vals + i;
+
+
+      if ( val->type == AFM_VALUE_TYPE_STRING )
+        str = afm_stream_read_string( stream );
+      else
+        str = afm_stream_read_one( stream );
+
+      if ( !str )
+        break;
+
+      len = AFM_STREAM_KEY_LEN( stream, str );
+
+      switch ( val->type )
+      {
+      case AFM_VALUE_TYPE_STRING:
+      case AFM_VALUE_TYPE_NAME:
+        {
+          FT_Memory  memory = parser->memory;
+          FT_Error   error;
+
+
+          if ( !FT_QALLOC( val->u.s, len + 1 ) )
+          {
+            ft_memcpy( val->u.s, str, len );
+            val->u.s[len] = '\0';
+          }
+        }
+        break;
+
+      case AFM_VALUE_TYPE_FIXED:
+        val->u.f = PS_Conv_ToFixed( (FT_Byte**)(void*)&str,
+                                    (FT_Byte*)str + len, 0 );
+        break;
+
+      case AFM_VALUE_TYPE_INTEGER:
+        val->u.i = PS_Conv_ToInt( (FT_Byte**)(void*)&str,
+                                  (FT_Byte*)str + len );
+        break;
+
+      case AFM_VALUE_TYPE_BOOL:
+        val->u.b = FT_BOOL( len == 4                      &&
+                            !ft_strncmp( str, "true", 4 ) );
+        break;
+
+      case AFM_VALUE_TYPE_INDEX:
+        if ( parser->get_index )
+          val->u.i = parser->get_index( str, len, parser->user_data );
+        else
+          val->u.i = 0;
+        break;
+      }
+    }
+
+    return i;
+  }
+
+
+  FT_LOCAL_DEF( char* )
+  afm_parser_next_key( AFM_Parser  parser,
+                       FT_Bool     line,
+                       FT_Offset*  len )
+  {
+    AFM_Stream  stream = parser->stream;
+    char*       key    = 0;  /* make stupid compiler happy */
+
+
+    if ( line )
+    {
+      while ( 1 )
+      {
+        /* skip current line */
+        if ( !AFM_STATUS_EOL( stream ) )
+          afm_stream_read_string( stream );
+
+        stream->status = AFM_STREAM_STATUS_NORMAL;
+        key = afm_stream_read_one( stream );
+
+        /* skip empty line */
+        if ( !key                      &&
+             !AFM_STATUS_EOF( stream ) &&
+             AFM_STATUS_EOL( stream )  )
+          continue;
+
+        break;
+      }
+    }
+    else
+    {
+      while ( 1 )
+      {
+        /* skip current column */
+        while ( !AFM_STATUS_EOC( stream ) )
+          afm_stream_read_one( stream );
+
+        stream->status = AFM_STREAM_STATUS_NORMAL;
+        key = afm_stream_read_one( stream );
+
+        /* skip empty column */
+        if ( !key                      &&
+             !AFM_STATUS_EOF( stream ) &&
+             AFM_STATUS_EOC( stream )  )
+          continue;
+
+        break;
+      }
+    }
+
+    if ( len )
+      *len = ( key ) ? (FT_Offset)AFM_STREAM_KEY_LEN( stream, key )
+                     : 0;
+
+    return key;
+  }
+
+
+  static AFM_Token
+  afm_tokenize( const char*  key,
+                FT_Offset    len )
+  {
+    int  n;
+
+
+    for ( n = 0; n < N_AFM_TOKENS; n++ )
+    {
+      if ( *( afm_key_table[n] ) == *key )
+      {
+        for ( ; n < N_AFM_TOKENS; n++ )
+        {
+          if ( *( afm_key_table[n] ) != *key )
+            return AFM_TOKEN_UNKNOWN;
+
+          if ( ft_strncmp( afm_key_table[n], key, len ) == 0 )
+            return (AFM_Token) n;
+        }
+      }
+    }
+
+    return AFM_TOKEN_UNKNOWN;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  afm_parser_init( AFM_Parser  parser,
+                   FT_Memory   memory,
+                   FT_Byte*    base,
+                   FT_Byte*    limit )
+  {
+    AFM_Stream  stream = NULL;
+    FT_Error    error;
+
+
+    if ( FT_NEW( stream ) )
+      return error;
+
+    stream->cursor = stream->base = base;
+    stream->limit  = limit;
+
+    /* don't skip the first line during the first call */
+    stream->status = AFM_STREAM_STATUS_EOL;
+
+    parser->memory    = memory;
+    parser->stream    = stream;
+    parser->FontInfo  = NULL;
+    parser->get_index = NULL;
+
+    return PSaux_Err_Ok;
+  }
+
+
+  FT_LOCAL( void )
+  afm_parser_done( AFM_Parser  parser )
+  {
+    FT_Memory  memory = parser->memory;
+
+
+    FT_FREE( parser->stream );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  afm_parser_read_int( AFM_Parser  parser,
+                       FT_Int*     aint )
+  {
+    AFM_ValueRec  val;
+
+
+    val.type = AFM_VALUE_TYPE_INTEGER;
+
+    if ( afm_parser_read_vals( parser, &val, 1 ) == 1 )
+    {
+      *aint = val.u.i;
+
+      return PSaux_Err_Ok;
+    }
+    else
+      return PSaux_Err_Syntax_Error;
+  }
+
+
+  static FT_Error
+  afm_parse_track_kern( AFM_Parser  parser )
+  {
+    AFM_FontInfo   fi = parser->FontInfo;
+    AFM_TrackKern  tk;
+    char*          key;
+    FT_Offset      len;
+    int            n = -1;
+
+
+    if ( afm_parser_read_int( parser, &fi->NumTrackKern ) )
+        goto Fail;
+
+    if ( fi->NumTrackKern )
+    {
+      FT_Memory  memory = parser->memory;
+      FT_Error   error;
+
+
+      if ( FT_QNEW_ARRAY( fi->TrackKerns, fi->NumTrackKern ) )
+        return error;
+    }
+
+    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+    {
+      AFM_ValueRec  shared_vals[5];
+
+
+      switch ( afm_tokenize( key, len ) )
+      {
+      case AFM_TOKEN_TRACKKERN:
+        n++;
+
+        if ( n >= fi->NumTrackKern )
+          goto Fail;
+
+        tk = fi->TrackKerns + n;
+
+        shared_vals[0].type = AFM_VALUE_TYPE_INTEGER;
+        shared_vals[1].type = AFM_VALUE_TYPE_FIXED;
+        shared_vals[2].type = AFM_VALUE_TYPE_FIXED;
+        shared_vals[3].type = AFM_VALUE_TYPE_FIXED;
+        shared_vals[4].type = AFM_VALUE_TYPE_FIXED;
+        if ( afm_parser_read_vals( parser, shared_vals, 5 ) != 5 )
+          goto Fail;
+
+        tk->degree     = shared_vals[0].u.i;
+        tk->min_ptsize = shared_vals[1].u.f;
+        tk->min_kern   = shared_vals[2].u.f;
+        tk->max_ptsize = shared_vals[3].u.f;
+        tk->max_kern   = shared_vals[4].u.f;
+
+        break;
+
+      case AFM_TOKEN_ENDTRACKKERN:
+      case AFM_TOKEN_ENDKERNDATA:
+      case AFM_TOKEN_ENDFONTMETRICS:
+        fi->NumTrackKern = n + 1;
+        return PSaux_Err_Ok;
+
+      case AFM_TOKEN_UNKNOWN:
+        break;
+
+      default:
+        goto Fail;
+      }
+    }
+
+  Fail:
+    return PSaux_Err_Syntax_Error;
+  }
+
+
+#undef  KERN_INDEX
+#define KERN_INDEX( g1, g2 )  ( ( (FT_ULong)g1 << 16 ) | g2 )
+
+
+  /* compare two kerning pairs */
+  FT_CALLBACK_DEF( int )
+  afm_compare_kern_pairs( const void*  a,
+                          const void*  b )
+  {
+    AFM_KernPair  kp1 = (AFM_KernPair)a;
+    AFM_KernPair  kp2 = (AFM_KernPair)b;
+
+    FT_ULong  index1 = KERN_INDEX( kp1->index1, kp1->index2 );
+    FT_ULong  index2 = KERN_INDEX( kp2->index1, kp2->index2 );
+
+
+    if ( index1 > index2 )
+      return 1;
+    else if ( index1 < index2 )
+      return -1;
+    else
+      return 0;
+  }
+
+
+  static FT_Error
+  afm_parse_kern_pairs( AFM_Parser  parser )
+  {
+    AFM_FontInfo  fi = parser->FontInfo;
+    AFM_KernPair  kp;
+    char*         key;
+    FT_Offset     len;
+    int           n = -1;
+
+
+    if ( afm_parser_read_int( parser, &fi->NumKernPair ) )
+      goto Fail;
+
+    if ( fi->NumKernPair )
+    {
+      FT_Memory  memory = parser->memory;
+      FT_Error   error;
+
+
+      if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) )
+        return error;
+    }
+
+    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+    {
+      AFM_Token  token = afm_tokenize( key, len );
+
+
+      switch ( token )
+      {
+      case AFM_TOKEN_KP:
+      case AFM_TOKEN_KPX:
+      case AFM_TOKEN_KPY:
+        {
+          FT_Int        r;
+          AFM_ValueRec  shared_vals[4];
+
+
+          n++;
+
+          if ( n >= fi->NumKernPair )
+            goto Fail;
+
+          kp = fi->KernPairs + n;
+
+          shared_vals[0].type = AFM_VALUE_TYPE_INDEX;
+          shared_vals[1].type = AFM_VALUE_TYPE_INDEX;
+          shared_vals[2].type = AFM_VALUE_TYPE_INTEGER;
+          shared_vals[3].type = AFM_VALUE_TYPE_INTEGER;
+          r = afm_parser_read_vals( parser, shared_vals, 4 );
+          if ( r < 3 )
+            goto Fail;
+
+          kp->index1 = shared_vals[0].u.i;
+          kp->index2 = shared_vals[1].u.i;
+          if ( token == AFM_TOKEN_KPY )
+          {
+            kp->x = 0;
+            kp->y = shared_vals[2].u.i;
+          }
+          else
+          {
+            kp->x = shared_vals[2].u.i;
+            kp->y = ( token == AFM_TOKEN_KP && r == 4 )
+                      ? shared_vals[3].u.i : 0;
+          }
+        }
+        break;
+
+      case AFM_TOKEN_ENDKERNPAIRS:
+      case AFM_TOKEN_ENDKERNDATA:
+      case AFM_TOKEN_ENDFONTMETRICS:
+        fi->NumKernPair = n + 1;
+        ft_qsort( fi->KernPairs, fi->NumKernPair,
+                  sizeof ( AFM_KernPairRec ),
+                  afm_compare_kern_pairs );
+        return PSaux_Err_Ok;
+
+      case AFM_TOKEN_UNKNOWN:
+        break;
+
+      default:
+        goto Fail;
+      }
+    }
+
+  Fail:
+    return PSaux_Err_Syntax_Error;
+  }
+
+
+  static FT_Error
+  afm_parse_kern_data( AFM_Parser  parser )
+  {
+    FT_Error   error;
+    char*      key;
+    FT_Offset  len;
+
+
+    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+    {
+      switch ( afm_tokenize( key, len ) )
+      {
+      case AFM_TOKEN_STARTTRACKKERN:
+        error = afm_parse_track_kern( parser );
+        if ( error )
+          return error;
+        break;
+
+      case AFM_TOKEN_STARTKERNPAIRS:
+      case AFM_TOKEN_STARTKERNPAIRS0:
+        error = afm_parse_kern_pairs( parser );
+        if ( error )
+          return error;
+        break;
+
+      case AFM_TOKEN_ENDKERNDATA:
+      case AFM_TOKEN_ENDFONTMETRICS:
+        return PSaux_Err_Ok;
+
+      case AFM_TOKEN_UNKNOWN:
+        break;
+
+      default:
+        goto Fail;
+      }
+    }
+
+  Fail:
+    return PSaux_Err_Syntax_Error;
+  }
+
+
+  static FT_Error
+  afm_parser_skip_section( AFM_Parser  parser,
+                           FT_UInt     n,
+                           AFM_Token   end_section )
+  {
+    char*      key;
+    FT_Offset  len;
+
+
+    while ( n-- > 0 )
+    {
+      key = afm_parser_next_key( parser, 1, NULL );
+      if ( !key )
+        goto Fail;
+    }
+
+    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+    {
+      AFM_Token  token = afm_tokenize( key, len );
+
+
+      if ( token == end_section || token == AFM_TOKEN_ENDFONTMETRICS )
+        return PSaux_Err_Ok;
+    }
+
+  Fail:
+    return PSaux_Err_Syntax_Error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  afm_parser_parse( AFM_Parser  parser )
+  {
+    FT_Memory     memory = parser->memory;
+    AFM_FontInfo  fi     = parser->FontInfo;
+    FT_Error      error  = PSaux_Err_Syntax_Error;
+    char*         key;
+    FT_Offset     len;
+    FT_Int        metrics_sets = 0;
+
+
+    if ( !fi )
+      return PSaux_Err_Invalid_Argument;
+
+    key = afm_parser_next_key( parser, 1, &len );
+    if ( !key || len != 16                              ||
+         ft_strncmp( key, "StartFontMetrics", 16 ) != 0 )
+      return PSaux_Err_Unknown_File_Format;
+
+    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
+    {
+      AFM_ValueRec  shared_vals[4];
+
+
+      switch ( afm_tokenize( key, len ) )
+      {
+      case AFM_TOKEN_METRICSSETS:
+        if ( afm_parser_read_int( parser, &metrics_sets ) )
+          goto Fail;
+
+        if ( metrics_sets != 0 && metrics_sets != 2 )
+        {
+          error = PSaux_Err_Unimplemented_Feature;
+
+          goto Fail;
+        }
+        break;
+
+      case AFM_TOKEN_ISCIDFONT:
+        shared_vals[0].type = AFM_VALUE_TYPE_BOOL;
+        if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )
+          goto Fail;
+
+        fi->IsCIDFont = shared_vals[0].u.b;
+        break;
+
+      case AFM_TOKEN_FONTBBOX:
+        shared_vals[0].type = AFM_VALUE_TYPE_FIXED;
+        shared_vals[1].type = AFM_VALUE_TYPE_FIXED;
+        shared_vals[2].type = AFM_VALUE_TYPE_FIXED;
+        shared_vals[3].type = AFM_VALUE_TYPE_FIXED;
+        if ( afm_parser_read_vals( parser, shared_vals, 4 ) != 4 )
+          goto Fail;
+
+        fi->FontBBox.xMin = shared_vals[0].u.f;
+        fi->FontBBox.yMin = shared_vals[1].u.f;
+        fi->FontBBox.xMax = shared_vals[2].u.f;
+        fi->FontBBox.yMax = shared_vals[3].u.f;
+        break;
+
+      case AFM_TOKEN_ASCENDER:
+        shared_vals[0].type = AFM_VALUE_TYPE_FIXED;
+        if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )
+          goto Fail;
+
+        fi->Ascender = shared_vals[0].u.f;
+        break;
+
+      case AFM_TOKEN_DESCENDER:
+        shared_vals[0].type = AFM_VALUE_TYPE_FIXED;
+        if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )
+          goto Fail;
+
+        fi->Descender = shared_vals[0].u.f;
+        break;
+
+      case AFM_TOKEN_STARTCHARMETRICS:
+        {
+          FT_Int  n = 0;
+
+
+          if ( afm_parser_read_int( parser, &n ) )
+            goto Fail;
+
+          error = afm_parser_skip_section( parser, n,
+                                           AFM_TOKEN_ENDCHARMETRICS );
+          if ( error )
+            return error;
+        }
+        break;
+
+      case AFM_TOKEN_STARTKERNDATA:
+        error = afm_parse_kern_data( parser );
+        if ( error )
+          goto Fail;
+        /* fall through since we only support kern data */
+
+      case AFM_TOKEN_ENDFONTMETRICS:
+        return PSaux_Err_Ok;
+
+      default:
+        break;
+      }
+    }
+
+  Fail:
+    FT_FREE( fi->TrackKerns );
+    fi->NumTrackKern = 0;
+
+    FT_FREE( fi->KernPairs );
+    fi->NumKernPair = 0;
+
+    fi->IsCIDFont = 0;
+
+    return error;
+  }
+
+
+/* END */
diff --git a/src/psaux/afmparse.h b/src/psaux/afmparse.h
new file mode 100644 (file)
index 0000000..35d9604
--- /dev/null
@@ -0,0 +1,88 @@
+/***************************************************************************/
+/*                                                                         */
+/*  afmparse.h                                                             */
+/*                                                                         */
+/*    AFM parser (specification).                                          */
+/*                                                                         */
+/*  Copyright 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __AFMPARSE_H__
+#define __AFMPARSE_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error )
+  afm_parser_init( AFM_Parser  parser,
+                   FT_Memory   memory,
+                   FT_Byte*    base,
+                   FT_Byte*    limit );
+
+
+  FT_LOCAL( void )
+  afm_parser_done( AFM_Parser  parser );
+
+
+  FT_LOCAL( FT_Error )
+  afm_parser_parse( AFM_Parser  parser );
+
+
+  enum  AFM_ValueType_
+  {
+    AFM_VALUE_TYPE_STRING,
+    AFM_VALUE_TYPE_NAME,
+    AFM_VALUE_TYPE_FIXED,   /* real number */
+    AFM_VALUE_TYPE_INTEGER,
+    AFM_VALUE_TYPE_BOOL,
+    AFM_VALUE_TYPE_INDEX    /* glyph index */
+  };
+
+
+  typedef struct  AFM_ValueRec_
+  {
+    enum AFM_ValueType_  type;
+    union
+    {
+      char*     s;
+      FT_Fixed  f;
+      FT_Int    i;
+      FT_Bool   b;
+
+    } u;
+
+  } AFM_ValueRec, *AFM_Value;
+
+#define  AFM_MAX_ARGUMENTS  5
+
+  FT_LOCAL( FT_Int )
+  afm_parser_read_vals( AFM_Parser  parser,
+                        AFM_Value   vals,
+                        FT_UInt     n );
+
+  /* read the next key from the next line or column */
+  FT_LOCAL( char* )
+  afm_parser_next_key( AFM_Parser  parser,
+                       FT_Bool     line,
+                       FT_Offset*  len );
+
+FT_END_HEADER
+
+#endif /* __AFMPARSE_H__ */
+
+
+/* END */
diff --git a/src/psaux/module.mk b/src/psaux/module.mk
new file mode 100644 (file)
index 0000000..42bf6f5
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# FreeType 2 PSaux module definition
+#
+
+
+# Copyright 1996-2000, 2006 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.
+
+
+FTMODULE_H_COMMANDS += PSAUX_MODULE
+
+define PSAUX_MODULE
+$(OPEN_DRIVER) FT_Module_Class, psaux_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)psaux     $(ECHO_DRIVER_DESC)Postscript Type 1 & Type 2 helper module$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/src/psaux/psaux.c b/src/psaux/psaux.c
new file mode 100644 (file)
index 0000000..a4b9c5c
--- /dev/null
@@ -0,0 +1,34 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psaux.c                                                                */
+/*                                                                         */
+/*    FreeType auxiliary PostScript driver component (body only).          */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include <ft2build.h>
+#include "psobjs.c"
+#include "psauxmod.c"
+#include "t1decode.c"
+#include "t1cmap.c"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "afmparse.c"
+#endif
+
+#include "psconv.c"
+
+
+/* END */
diff --git a/src/psaux/psauxerr.h b/src/psaux/psauxerr.h
new file mode 100644 (file)
index 0000000..d52375f
--- /dev/null
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psauxerr.h                                                             */
+/*                                                                         */
+/*    PS auxiliary module error codes (specification only).                */
+/*                                                                         */
+/*  Copyright 2001, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the PS auxiliary module error enumeration */
+  /* constants.                                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __PSAUXERR_H__
+#define __PSAUXERR_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  PSaux_Err_
+#define FT_ERR_BASE    FT_Mod_Err_PSaux
+
+#include FT_ERRORS_H
+
+#endif /* __PSAUXERR_H__ */
+
+
+/* END */
diff --git a/src/psaux/psauxmod.c b/src/psaux/psauxmod.c
new file mode 100644 (file)
index 0000000..4b1249d
--- /dev/null
@@ -0,0 +1,139 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psauxmod.c                                                             */
+/*                                                                         */
+/*    FreeType auxiliary PostScript module implementation (body).          */
+/*                                                                         */
+/*  Copyright 2000-2001, 2002, 2003, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include "psauxmod.h"
+#include "psobjs.h"
+#include "t1decode.h"
+#include "t1cmap.h"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "afmparse.h"
+#endif
+
+
+  FT_CALLBACK_TABLE_DEF
+  const PS_Table_FuncsRec  ps_table_funcs =
+  {
+    ps_table_new,
+    ps_table_done,
+    ps_table_add,
+    ps_table_release
+  };
+
+
+  FT_CALLBACK_TABLE_DEF
+  const PS_Parser_FuncsRec  ps_parser_funcs =
+  {
+    ps_parser_init,
+    ps_parser_done,
+    ps_parser_skip_spaces,
+    ps_parser_skip_PS_token,
+    ps_parser_to_int,
+    ps_parser_to_fixed,
+    ps_parser_to_bytes,
+    ps_parser_to_coord_array,
+    ps_parser_to_fixed_array,
+    ps_parser_to_token,
+    ps_parser_to_token_array,
+    ps_parser_load_field,
+    ps_parser_load_field_table
+  };
+
+
+  FT_CALLBACK_TABLE_DEF
+  const T1_Builder_FuncsRec  t1_builder_funcs =
+  {
+    t1_builder_init,
+    t1_builder_done,
+    t1_builder_check_points,
+    t1_builder_add_point,
+    t1_builder_add_point1,
+    t1_builder_add_contour,
+    t1_builder_start_point,
+    t1_builder_close_contour
+  };
+
+
+  FT_CALLBACK_TABLE_DEF
+  const T1_Decoder_FuncsRec  t1_decoder_funcs =
+  {
+    t1_decoder_init,
+    t1_decoder_done,
+    t1_decoder_parse_charstrings
+  };
+
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+  FT_CALLBACK_TABLE_DEF
+  const AFM_Parser_FuncsRec  afm_parser_funcs =
+  {
+    afm_parser_init,
+    afm_parser_done,
+    afm_parser_parse
+  };
+#endif
+
+
+  FT_CALLBACK_TABLE_DEF
+  const T1_CMap_ClassesRec  t1_cmap_classes =
+  {
+    &t1_cmap_standard_class_rec,
+    &t1_cmap_expert_class_rec,
+    &t1_cmap_custom_class_rec,
+    &t1_cmap_unicode_class_rec
+  };
+
+
+  static
+  const PSAux_Interface  psaux_interface =
+  {
+    &ps_table_funcs,
+    &ps_parser_funcs,
+    &t1_builder_funcs,
+    &t1_decoder_funcs,
+    t1_decrypt,
+
+    (const T1_CMap_ClassesRec*) &t1_cmap_classes,
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+    &afm_parser_funcs,
+#else
+    0,
+#endif
+  };
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FT_Module_Class  psaux_module_class =
+  {
+    0,
+    sizeof ( FT_ModuleRec ),
+    "psaux",
+    0x20000L,
+    0x20000L,
+
+    &psaux_interface,  /* module-specific interface */
+
+    (FT_Module_Constructor)0,
+    (FT_Module_Destructor) 0,
+    (FT_Module_Requester)  0
+  };
+
+
+/* END */
diff --git a/src/psaux/psauxmod.h b/src/psaux/psauxmod.h
new file mode 100644 (file)
index 0000000..1217236
--- /dev/null
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psauxmod.h                                                             */
+/*                                                                         */
+/*    FreeType auxiliary PostScript module implementation (specification). */
+/*                                                                         */
+/*  Copyright 2000-2001 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSAUXMOD_H__
+#define __PSAUXMOD_H__
+
+
+#include <ft2build.h>
+#include FT_MODULE_H
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+
+  FT_EXPORT_VAR( const FT_Module_Class )  psaux_driver_class;
+
+
+FT_END_HEADER
+
+#endif /* __PSAUXMOD_H__ */
+
+
+/* END */
diff --git a/src/psaux/psconv.c b/src/psaux/psconv.c
new file mode 100644 (file)
index 0000000..9ea7fb9
--- /dev/null
@@ -0,0 +1,480 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psconv.c                                                               */
+/*                                                                         */
+/*    Some convenience conversions (body).                                 */
+/*                                                                         */
+/*  Copyright 2006, 2008, 2009, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+
+#include "psconv.h"
+#include "psauxerr.h"
+
+
+  /* The following array is used by various functions to quickly convert */
+  /* digits (both decimal and non-decimal) into numbers.                 */
+
+#if 'A' == 65
+  /* ASCII */
+
+  static const FT_Char  ft_char_table[128] =
+  {
+    /* 0x00 */
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1,
+    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
+    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
+  };
+
+  /* no character >= 0x80 can represent a valid number */
+#define OP  >=
+
+#endif /* 'A' == 65 */
+
+#if 'A' == 193
+  /* EBCDIC */
+
+  static const FT_Char  ft_char_table[128] =
+  {
+    /* 0x80 */
+    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1,
+    -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1,
+    -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1,
+    -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1,
+    -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1,
+     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1,
+  };
+
+  /* no character < 0x80 can represent a valid number */
+#define OP  <
+
+#endif /* 'A' == 193 */
+
+
+  FT_LOCAL_DEF( FT_Int )
+  PS_Conv_Strtol( FT_Byte**  cursor,
+                  FT_Byte*   limit,
+                  FT_Int     base )
+  {
+    FT_Byte*  p = *cursor;
+    FT_Int    num = 0;
+    FT_Bool   sign = 0;
+
+
+    if ( p >= limit || base < 2 || base > 36 )
+      return 0;
+
+    if ( *p == '-' || *p == '+' )
+    {
+      sign = FT_BOOL( *p == '-' );
+
+      p++;
+      if ( p == limit )
+        return 0;
+    }
+
+    for ( ; p < limit; p++ )
+    {
+      FT_Char  c;
+
+
+      if ( IS_PS_SPACE( *p ) || *p OP 0x80 )
+        break;
+
+      c = ft_char_table[*p & 0x7f];
+
+      if ( c < 0 || c >= base )
+        break;
+
+      num = num * base + c;
+    }
+
+    if ( sign )
+      num = -num;
+
+    *cursor = p;
+
+    return num;
+  }
+
+
+  FT_LOCAL_DEF( FT_Int )
+  PS_Conv_ToInt( FT_Byte**  cursor,
+                 FT_Byte*   limit )
+
+  {
+    FT_Byte*  p;
+    FT_Int    num;
+
+
+    num = PS_Conv_Strtol( cursor, limit, 10 );
+    p   = *cursor;
+
+    if ( p < limit && *p == '#' )
+    {
+      *cursor = p + 1;
+
+      return PS_Conv_Strtol( cursor, limit, num );
+    }
+    else
+      return num;
+  }
+
+
+  FT_LOCAL_DEF( FT_Fixed )
+  PS_Conv_ToFixed( FT_Byte**  cursor,
+                   FT_Byte*   limit,
+                   FT_Int     power_ten )
+  {
+    FT_Byte*  p = *cursor;
+    FT_Fixed  integral;
+    FT_Long   decimal = 0, divider = 1;
+    FT_Bool   sign = 0;
+
+
+    if ( p >= limit )
+      return 0;
+
+    if ( *p == '-' || *p == '+' )
+    {
+      sign = FT_BOOL( *p == '-' );
+
+      p++;
+      if ( p == limit )
+        return 0;
+    }
+
+    if ( *p != '.' )
+      integral = PS_Conv_ToInt( &p, limit ) << 16;
+    else
+      integral = 0;
+
+    /* read the decimal part */
+    if ( p < limit && *p == '.' )
+    {
+      p++;
+
+      for ( ; p < limit; p++ )
+      {
+        FT_Char  c;
+
+
+        if ( IS_PS_SPACE( *p ) || *p OP 0x80 )
+          break;
+
+        c = ft_char_table[*p & 0x7f];
+
+        if ( c < 0 || c >= 10 )
+          break;
+
+        if ( !integral && power_ten > 0 )
+        {
+          power_ten--;
+          decimal = decimal * 10 + c;
+        }
+        else
+        {
+          if ( divider < 10000000L )
+          {
+            decimal = decimal * 10 + c;
+            divider *= 10;
+          }
+        }
+      }
+    }
+
+    /* read exponent, if any */
+    if ( p + 1 < limit && ( *p == 'e' || *p == 'E' ) )
+    {
+      p++;
+      power_ten += PS_Conv_ToInt( &p, limit );
+    }
+
+    while ( power_ten > 0 )
+    {
+      integral *= 10;
+      decimal  *= 10;
+      power_ten--;
+    }
+
+    while ( power_ten < 0 )
+    {
+      integral /= 10;
+      divider  *= 10;
+      power_ten++;
+    }
+
+    if ( decimal )
+      integral += FT_DivFix( decimal, divider );
+
+    if ( sign )
+      integral = -integral;
+
+    *cursor = p;
+
+    return integral;
+  }
+
+
+#if 0
+  FT_LOCAL_DEF( FT_UInt )
+  PS_Conv_StringDecode( FT_Byte**  cursor,
+                        FT_Byte*   limit,
+                        FT_Byte*   buffer,
+                        FT_Offset  n )
+  {
+    FT_Byte*  p;
+    FT_UInt   r = 0;
+
+
+    for ( p = *cursor; r < n && p < limit; p++ )
+    {
+      FT_Byte  b;
+
+
+      if ( *p != '\\' )
+      {
+        buffer[r++] = *p;
+
+        continue;
+      }
+
+      p++;
+
+      switch ( *p )
+      {
+      case 'n':
+        b = '\n';
+        break;
+      case 'r':
+        b = '\r';
+        break;
+      case 't':
+        b = '\t';
+        break;
+      case 'b':
+        b = '\b';
+        break;
+      case 'f':
+        b = '\f';
+        break;
+      case '\r':
+        p++;
+        if ( *p != '\n' )
+        {
+          b = *p;
+
+          break;
+        }
+        /* no break */
+      case '\n':
+        continue;
+        break;
+      default:
+        if ( IS_PS_DIGIT( *p ) )
+        {
+          b = *p - '0';
+
+          p++;
+
+          if ( IS_PS_DIGIT( *p ) )
+          {
+            b = b * 8 + *p - '0';
+
+            p++;
+
+            if ( IS_PS_DIGIT( *p ) )
+              b = b * 8 + *p - '0';
+            else
+            {
+              buffer[r++] = b;
+              b = *p;
+            }
+          }
+          else
+          {
+            buffer[r++] = b;
+            b = *p;
+          }
+        }
+        else
+          b = *p;
+        break;
+      }
+
+      buffer[r++] = b;
+    }
+
+    *cursor = p;
+
+    return r;
+  }
+#endif /* 0 */
+
+
+  FT_LOCAL_DEF( FT_UInt )
+  PS_Conv_ASCIIHexDecode( FT_Byte**  cursor,
+                          FT_Byte*   limit,
+                          FT_Byte*   buffer,
+                          FT_Offset  n )
+  {
+    FT_Byte*  p;
+    FT_UInt   r   = 0;
+    FT_UInt   w   = 0;
+    FT_UInt   pad = 0x01;
+
+
+    n *= 2;
+
+#if 1
+
+    p = *cursor;
+
+    if ( p >= limit )
+      return 0;
+
+    if ( n > (FT_UInt)( limit - p ) )
+      n = (FT_UInt)( limit - p );
+
+    /* we try to process two nibbles at a time to be as fast as possible */
+    for ( ; r < n; r++ )
+    {
+      FT_UInt  c = p[r];
+
+
+      if ( IS_PS_SPACE( c ) )
+        continue;
+
+      if ( c OP 0x80 )
+        break;
+
+      c = ft_char_table[c & 0x7F];
+      if ( (unsigned)c >= 16 )
+        break;
+
+      pad = ( pad << 4 ) | c;
+      if ( pad & 0x100 )
+      {
+        buffer[w++] = (FT_Byte)pad;
+        pad         = 0x01;
+      }
+    }
+
+    if ( pad != 0x01 )
+      buffer[w++] = (FT_Byte)( pad << 4 );
+
+    *cursor = p + r;
+
+    return w;
+
+#else /* 0 */
+
+    for ( r = 0; r < n; r++ )
+    {
+      FT_Char  c;
+
+
+      if ( IS_PS_SPACE( *p ) )
+        continue;
+
+      if ( *p OP 0x80 )
+        break;
+
+      c = ft_char_table[*p & 0x7f];
+
+      if ( (unsigned)c >= 16 )
+        break;
+
+      if ( r & 1 )
+      {
+        *buffer = (FT_Byte)(*buffer + c);
+        buffer++;
+      }
+      else
+        *buffer = (FT_Byte)(c << 4);
+
+      r++;
+    }
+
+    *cursor = p;
+
+    return ( r + 1 ) / 2;
+
+#endif /* 0 */
+
+  }
+
+
+  FT_LOCAL_DEF( FT_UInt )
+  PS_Conv_EexecDecode( FT_Byte**   cursor,
+                       FT_Byte*    limit,
+                       FT_Byte*    buffer,
+                       FT_Offset   n,
+                       FT_UShort*  seed )
+  {
+    FT_Byte*  p;
+    FT_UInt   r;
+    FT_UInt   s = *seed;
+
+
+#if 1
+
+    p = *cursor;
+
+    if ( p >= limit )
+      return 0;
+
+    if ( n > (FT_UInt)(limit - p) )
+      n = (FT_UInt)(limit - p);
+
+    for ( r = 0; r < n; r++ )
+    {
+      FT_UInt  val = p[r];
+      FT_UInt  b   = ( val ^ ( s >> 8 ) );
+
+
+      s         = ( (val + s)*52845U + 22719 ) & 0xFFFFU;
+      buffer[r] = (FT_Byte) b;
+    }
+
+    *cursor = p + n;
+    *seed   = (FT_UShort)s;
+
+#else /* 0 */
+
+    for ( r = 0, p = *cursor; r < n && p < limit; r++, p++ )
+    {
+      FT_Byte  b = (FT_Byte)( *p ^ ( s >> 8 ) );
+
+
+      s = (FT_UShort)( ( *p + s ) * 52845U + 22719 );
+      *buffer++ = b;
+    }
+    *cursor = p;
+    *seed   = s;
+
+#endif /* 0 */
+
+    return r;
+  }
+
+
+/* END */
diff --git a/src/psaux/psconv.h b/src/psaux/psconv.h
new file mode 100644 (file)
index 0000000..84854ba
--- /dev/null
@@ -0,0 +1,71 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psconv.h                                                               */
+/*                                                                         */
+/*    Some convenience conversions (specification).                        */
+/*                                                                         */
+/*  Copyright 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSCONV_H__
+#define __PSCONV_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Int )
+  PS_Conv_Strtol( FT_Byte**  cursor,
+                  FT_Byte*   limit,
+                  FT_Int     base );
+
+
+  FT_LOCAL( FT_Int )
+  PS_Conv_ToInt( FT_Byte**  cursor,
+                 FT_Byte*   limit );
+
+  FT_LOCAL( FT_Fixed )
+  PS_Conv_ToFixed( FT_Byte**  cursor,
+                   FT_Byte*   limit,
+                   FT_Int     power_ten );
+
+#if 0
+  FT_LOCAL( FT_UInt )
+  PS_Conv_StringDecode( FT_Byte**  cursor,
+                        FT_Byte*   limit,
+                        FT_Byte*   buffer,
+                        FT_Offset  n );
+#endif
+
+  FT_LOCAL( FT_UInt )
+  PS_Conv_ASCIIHexDecode( FT_Byte**  cursor,
+                          FT_Byte*   limit,
+                          FT_Byte*   buffer,
+                          FT_Offset  n );
+
+  FT_LOCAL( FT_UInt )
+  PS_Conv_EexecDecode( FT_Byte**   cursor,
+                       FT_Byte*    limit,
+                       FT_Byte*    buffer,
+                       FT_Offset   n,
+                       FT_UShort*  seed );
+
+
+FT_END_HEADER
+
+#endif /* __PSCONV_H__ */
+
+
+/* END */
diff --git a/src/psaux/psobjs.c b/src/psaux/psobjs.c
new file mode 100644 (file)
index 0000000..06df6e6
--- /dev/null
@@ -0,0 +1,1710 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psobjs.c                                                               */
+/*                                                                         */
+/*    Auxiliary functions for PostScript fonts (body).                     */
+/*                                                                         */
+/*  Copyright 1996-2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_CALC_H
+
+#include "psobjs.h"
+#include "psconv.h"
+
+#include "psauxerr.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_psobjs
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                             PS_TABLE                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ps_table_new                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a PS_Table.                                            */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    table  :: The address of the target table.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    count  :: The table size = the maximum number of elements.         */
+  /*                                                                       */
+  /*    memory :: The memory object to use for all subsequent              */
+  /*              reallocations.                                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  ps_table_new( PS_Table   table,
+                FT_Int     count,
+                FT_Memory  memory )
+  {
+    FT_Error  error;
+
+
+    table->memory = memory;
+    if ( FT_NEW_ARRAY( table->elements, count ) ||
+         FT_NEW_ARRAY( table->lengths,  count ) )
+      goto Exit;
+
+    table->max_elems = count;
+    table->init      = 0xDEADBEEFUL;
+    table->num_elems = 0;
+    table->block     = 0;
+    table->capacity  = 0;
+    table->cursor    = 0;
+
+    *(PS_Table_FuncsRec*)&table->funcs = ps_table_funcs;
+
+  Exit:
+    if ( error )
+      FT_FREE( table->elements );
+
+    return error;
+  }
+
+
+  static void
+  shift_elements( PS_Table  table,
+                  FT_Byte*  old_base )
+  {
+    FT_PtrDist  delta  = table->block - old_base;
+    FT_Byte**   offset = table->elements;
+    FT_Byte**   limit  = offset + table->max_elems;
+
+
+    for ( ; offset < limit; offset++ )
+    {
+      if ( offset[0] )
+        offset[0] += delta;
+    }
+  }
+
+
+  static FT_Error
+  reallocate_t1_table( PS_Table  table,
+                       FT_Long   new_size )
+  {
+    FT_Memory  memory   = table->memory;
+    FT_Byte*   old_base = table->block;
+    FT_Error   error;
+
+
+    /* allocate new base block */
+    if ( FT_ALLOC( table->block, new_size ) )
+    {
+      table->block = old_base;
+      return error;
+    }
+
+    /* copy elements and shift offsets */
+    if ( old_base )
+    {
+      FT_MEM_COPY( table->block, old_base, table->capacity );
+      shift_elements( table, old_base );
+      FT_FREE( old_base );
+    }
+
+    table->capacity = new_size;
+
+    return PSaux_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ps_table_add                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Adds an object to a PS_Table, possibly growing its memory block.   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    table  :: The target table.                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    idx    :: The index of the object in the table.                    */
+  /*                                                                       */
+  /*    object :: The address of the object to copy in memory.             */
+  /*                                                                       */
+  /*    length :: The length in bytes of the source object.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.  An error is returned if a  */
+  /*    reallocation fails.                                                */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  ps_table_add( PS_Table    table,
+                FT_Int      idx,
+                void*       object,
+                FT_PtrDist  length )
+  {
+    if ( idx < 0 || idx >= table->max_elems )
+    {
+      FT_ERROR(( "ps_table_add: invalid index\n" ));
+      return PSaux_Err_Invalid_Argument;
+    }
+
+    if ( length < 0 )
+    {
+      FT_ERROR(( "ps_table_add: invalid length\n" ));
+      return PSaux_Err_Invalid_Argument;
+    }
+
+    /* grow the base block if needed */
+    if ( table->cursor + length > table->capacity )
+    {
+      FT_Error    error;
+      FT_Offset   new_size = table->capacity;
+      FT_PtrDist  in_offset;
+
+
+      in_offset = (FT_Byte*)object - table->block;
+      if ( in_offset < 0 || (FT_Offset)in_offset >= table->capacity )
+        in_offset = -1;
+
+      while ( new_size < table->cursor + length )
+      {
+        /* increase size by 25% and round up to the nearest multiple
+           of 1024 */
+        new_size += ( new_size >> 2 ) + 1;
+        new_size  = FT_PAD_CEIL( new_size, 1024 );
+      }
+
+      error = reallocate_t1_table( table, new_size );
+      if ( error )
+        return error;
+
+      if ( in_offset >= 0 )
+        object = table->block + in_offset;
+    }
+
+    /* add the object to the base block and adjust offset */
+    table->elements[idx] = table->block + table->cursor;
+    table->lengths [idx] = length;
+    FT_MEM_COPY( table->block + table->cursor, object, length );
+
+    table->cursor += length;
+    return PSaux_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ps_table_done                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalizes a PS_TableRec (i.e., reallocate it to its current        */
+  /*    cursor).                                                           */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    table :: The target table.                                         */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This function does NOT release the heap's memory block.  It is up  */
+  /*    to the caller to clean it, or reference it in its own structures.  */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  ps_table_done( PS_Table  table )
+  {
+    FT_Memory  memory = table->memory;
+    FT_Error   error;
+    FT_Byte*   old_base = table->block;
+
+
+    /* should never fail, because rec.cursor <= rec.size */
+    if ( !old_base )
+      return;
+
+    if ( FT_ALLOC( table->block, table->cursor ) )
+      return;
+    FT_MEM_COPY( table->block, old_base, table->cursor );
+    shift_elements( table, old_base );
+
+    table->capacity = table->cursor;
+    FT_FREE( old_base );
+
+    FT_UNUSED( error );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  ps_table_release( PS_Table  table )
+  {
+    FT_Memory  memory = table->memory;
+
+
+    if ( (FT_ULong)table->init == 0xDEADBEEFUL )
+    {
+      FT_FREE( table->block );
+      FT_FREE( table->elements );
+      FT_FREE( table->lengths );
+      table->init = 0;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            T1 PARSER                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* first character must be already part of the comment */
+
+  static void
+  skip_comment( FT_Byte*  *acur,
+                FT_Byte*   limit )
+  {
+    FT_Byte*  cur = *acur;
+
+
+    while ( cur < limit )
+    {
+      if ( IS_PS_NEWLINE( *cur ) )
+        break;
+      cur++;
+    }
+
+    *acur = cur;
+  }
+
+
+  static void
+  skip_spaces( FT_Byte*  *acur,
+               FT_Byte*   limit )
+  {
+    FT_Byte*  cur = *acur;
+
+
+    while ( cur < limit )
+    {
+      if ( !IS_PS_SPACE( *cur ) )
+      {
+        if ( *cur == '%' )
+          /* According to the PLRM, a comment is equal to a space. */
+          skip_comment( &cur, limit );
+        else
+          break;
+      }
+      cur++;
+    }
+
+    *acur = cur;
+  }
+
+
+#define IS_OCTAL_DIGIT( c ) ( '0' <= (c) && (c) <= '7' )
+
+
+  /* first character must be `(';                               */
+  /* *acur is positioned at the character after the closing `)' */
+
+  static FT_Error
+  skip_literal_string( FT_Byte*  *acur,
+                       FT_Byte*   limit )
+  {
+    FT_Byte*      cur   = *acur;
+    FT_Int        embed = 0;
+    FT_Error      error = PSaux_Err_Invalid_File_Format;
+    unsigned int  i;
+
+
+    while ( cur < limit )
+    {
+      FT_Byte  c = *cur;
+
+
+      ++cur;
+
+      if ( c == '\\' )
+      {
+        /* Red Book 3rd ed., section `Literal Text Strings', p. 29:     */
+        /* A backslash can introduce three different types              */
+        /* of escape sequences:                                         */
+        /*   - a special escaped char like \r, \n, etc.                 */
+        /*   - a one-, two-, or three-digit octal number                */
+        /*   - none of the above in which case the backslash is ignored */
+
+        if ( cur == limit )
+          /* error (or to be ignored?) */
+          break;
+
+        switch ( *cur )
+        {
+          /* skip `special' escape */
+        case 'n':
+        case 'r':
+        case 't':
+        case 'b':
+        case 'f':
+        case '\\':
+        case '(':
+        case ')':
+          ++cur;
+          break;
+
+        default:
+          /* skip octal escape or ignore backslash */
+          for ( i = 0; i < 3 && cur < limit; ++i )
+          {
+            if ( !IS_OCTAL_DIGIT( *cur ) )
+              break;
+
+            ++cur;
+          }
+        }
+      }
+      else if ( c == '(' )
+        embed++;
+      else if ( c == ')' )
+      {
+        embed--;
+        if ( embed == 0 )
+        {
+          error = PSaux_Err_Ok;
+          break;
+        }
+      }
+    }
+
+    *acur = cur;
+
+    return error;
+  }
+
+
+  /* first character must be `<' */
+
+  static FT_Error
+  skip_string( FT_Byte*  *acur,
+               FT_Byte*   limit )
+  {
+    FT_Byte*  cur = *acur;
+    FT_Error  err =  PSaux_Err_Ok;
+
+
+    while ( ++cur < limit )
+    {
+      /* All whitespace characters are ignored. */
+      skip_spaces( &cur, limit );
+      if ( cur >= limit )
+        break;
+
+      if ( !IS_PS_XDIGIT( *cur ) )
+        break;
+    }
+
+    if ( cur < limit && *cur != '>' )
+    {
+      FT_ERROR(( "skip_string: missing closing delimiter `>'\n" ));
+      err = PSaux_Err_Invalid_File_Format;
+    }
+    else
+      cur++;
+
+    *acur = cur;
+    return err;
+  }
+
+
+  /* first character must be the opening brace that */
+  /* starts the procedure                           */
+
+  /* NB: [ and ] need not match:                    */
+  /* `/foo {[} def' is a valid PostScript fragment, */
+  /* even within a Type1 font                       */
+
+  static FT_Error
+  skip_procedure( FT_Byte*  *acur,
+                  FT_Byte*   limit )
+  {
+    FT_Byte*  cur;
+    FT_Int    embed = 0;
+    FT_Error  error = PSaux_Err_Ok;
+
+
+    FT_ASSERT( **acur == '{' );
+
+    for ( cur = *acur; cur < limit && error == PSaux_Err_Ok; ++cur )
+    {
+      switch ( *cur )
+      {
+      case '{':
+        ++embed;
+        break;
+
+      case '}':
+        --embed;
+        if ( embed == 0 )
+        {
+          ++cur;
+          goto end;
+        }
+        break;
+
+      case '(':
+        error = skip_literal_string( &cur, limit );
+        break;
+
+      case '<':
+        error = skip_string( &cur, limit );
+        break;
+
+      case '%':
+        skip_comment( &cur, limit );
+        break;
+      }
+    }
+
+  end:
+    if ( embed != 0 )
+      error = PSaux_Err_Invalid_File_Format;
+
+    *acur = cur;
+
+    return error;
+  }
+
+
+  /***********************************************************************/
+  /*                                                                     */
+  /* All exported parsing routines handle leading whitespace and stop at */
+  /* the first character which isn't part of the just handled token.     */
+  /*                                                                     */
+  /***********************************************************************/
+
+
+  FT_LOCAL_DEF( void )
+  ps_parser_skip_PS_token( PS_Parser  parser )
+  {
+    /* Note: PostScript allows any non-delimiting, non-whitespace        */
+    /*       character in a name (PS Ref Manual, 3rd ed, p31).           */
+    /*       PostScript delimiters are (, ), <, >, [, ], {, }, /, and %. */
+
+    FT_Byte*  cur   = parser->cursor;
+    FT_Byte*  limit = parser->limit;
+    FT_Error  error = PSaux_Err_Ok;
+
+
+    skip_spaces( &cur, limit );             /* this also skips comments */
+    if ( cur >= limit )
+      goto Exit;
+
+    /* self-delimiting, single-character tokens */
+    if ( *cur == '[' || *cur == ']' )
+    {
+      cur++;
+      goto Exit;
+    }
+
+    /* skip balanced expressions (procedures and strings) */
+
+    if ( *cur == '{' )                              /* {...} */
+    {
+      error = skip_procedure( &cur, limit );
+      goto Exit;
+    }
+
+    if ( *cur == '(' )                              /* (...) */
+    {
+      error = skip_literal_string( &cur, limit );
+      goto Exit;
+    }
+
+    if ( *cur == '<' )                              /* <...> */
+    {
+      if ( cur + 1 < limit && *(cur + 1) == '<' )   /* << */
+      {
+        cur++;
+        cur++;
+      }
+      else
+        error = skip_string( &cur, limit );
+
+      goto Exit;
+    }
+
+    if ( *cur == '>' )
+    {
+      cur++;
+      if ( cur >= limit || *cur != '>' )             /* >> */
+      {
+        FT_ERROR(( "ps_parser_skip_PS_token:"
+                   " unexpected closing delimiter `>'\n" ));
+        error = PSaux_Err_Invalid_File_Format;
+        goto Exit;
+      }
+      cur++;
+      goto Exit;
+    }
+
+    if ( *cur == '/' )
+      cur++;
+
+    /* anything else */
+    while ( cur < limit )
+    {
+      /* *cur might be invalid (e.g., ')' or '}'), but this   */
+      /* is handled by the test `cur == parser->cursor' below */
+      if ( IS_PS_DELIM( *cur ) )
+        break;
+
+      cur++;
+    }
+
+  Exit:
+    if ( cur < limit && cur == parser->cursor )
+    {
+      FT_ERROR(( "ps_parser_skip_PS_token:"
+                 " current token is `%c' which is self-delimiting\n"
+                 "                        "
+                 " but invalid at this point\n",
+                 *cur ));
+
+      error = PSaux_Err_Invalid_File_Format;
+    }
+
+    parser->error  = error;
+    parser->cursor = cur;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  ps_parser_skip_spaces( PS_Parser  parser )
+  {
+    skip_spaces( &parser->cursor, parser->limit );
+  }
+
+
+  /* `token' here means either something between balanced delimiters */
+  /* or the next token; the delimiters are not removed.              */
+
+  FT_LOCAL_DEF( void )
+  ps_parser_to_token( PS_Parser  parser,
+                      T1_Token   token )
+  {
+    FT_Byte*  cur;
+    FT_Byte*  limit;
+    FT_Int    embed;
+
+
+    token->type  = T1_TOKEN_TYPE_NONE;
+    token->start = 0;
+    token->limit = 0;
+
+    /* first of all, skip leading whitespace */
+    ps_parser_skip_spaces( parser );
+
+    cur   = parser->cursor;
+    limit = parser->limit;
+
+    if ( cur >= limit )
+      return;
+
+    switch ( *cur )
+    {
+      /************* check for literal string *****************/
+    case '(':
+      token->type  = T1_TOKEN_TYPE_STRING;
+      token->start = cur;
+
+      if ( skip_literal_string( &cur, limit ) == PSaux_Err_Ok )
+        token->limit = cur;
+      break;
+
+      /************* check for programs/array *****************/
+    case '{':
+      token->type  = T1_TOKEN_TYPE_ARRAY;
+      token->start = cur;
+
+      if ( skip_procedure( &cur, limit ) == PSaux_Err_Ok )
+        token->limit = cur;
+      break;
+
+      /************* check for table/array ********************/
+      /* XXX: in theory we should also look for "<<"          */
+      /*      since this is semantically equivalent to "[";   */
+      /*      in practice it doesn't matter (?)               */
+    case '[':
+      token->type  = T1_TOKEN_TYPE_ARRAY;
+      embed        = 1;
+      token->start = cur++;
+
+      /* we need this to catch `[ ]' */
+      parser->cursor = cur;
+      ps_parser_skip_spaces( parser );
+      cur = parser->cursor;
+
+      while ( cur < limit && !parser->error )
+      {
+        /* XXX: this is wrong because it does not      */
+        /*      skip comments, procedures, and strings */
+        if ( *cur == '[' )
+          embed++;
+        else if ( *cur == ']' )
+        {
+          embed--;
+          if ( embed <= 0 )
+          {
+            token->limit = ++cur;
+            break;
+          }
+        }
+
+        parser->cursor = cur;
+        ps_parser_skip_PS_token( parser );
+        /* we need this to catch `[XXX ]' */
+        ps_parser_skip_spaces  ( parser );
+        cur = parser->cursor;
+      }
+      break;
+
+      /* ************ otherwise, it is any token **************/
+    default:
+      token->start = cur;
+      token->type  = ( *cur == '/' ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY );
+      ps_parser_skip_PS_token( parser );
+      cur = parser->cursor;
+      if ( !parser->error )
+        token->limit = cur;
+    }
+
+    if ( !token->limit )
+    {
+      token->start = 0;
+      token->type  = T1_TOKEN_TYPE_NONE;
+    }
+
+    parser->cursor = cur;
+  }
+
+
+  /* NB: `tokens' can be NULL if we only want to count */
+  /* the number of array elements                      */
+
+  FT_LOCAL_DEF( void )
+  ps_parser_to_token_array( PS_Parser  parser,
+                            T1_Token   tokens,
+                            FT_UInt    max_tokens,
+                            FT_Int*    pnum_tokens )
+  {
+    T1_TokenRec  master;
+
+
+    *pnum_tokens = -1;
+
+    /* this also handles leading whitespace */
+    ps_parser_to_token( parser, &master );
+
+    if ( master.type == T1_TOKEN_TYPE_ARRAY )
+    {
+      FT_Byte*  old_cursor = parser->cursor;
+      FT_Byte*  old_limit  = parser->limit;
+      T1_Token  cur        = tokens;
+      T1_Token  limit      = cur + max_tokens;
+
+
+      /* don't include outermost delimiters */
+      parser->cursor = master.start + 1;
+      parser->limit  = master.limit - 1;
+
+      while ( parser->cursor < parser->limit )
+      {
+        T1_TokenRec  token;
+
+
+        ps_parser_to_token( parser, &token );
+        if ( !token.type )
+          break;
+
+        if ( tokens != NULL && cur < limit )
+          *cur = token;
+
+        cur++;
+      }
+
+      *pnum_tokens = (FT_Int)( cur - tokens );
+
+      parser->cursor = old_cursor;
+      parser->limit  = old_limit;
+    }
+  }
+
+
+  /* first character must be a delimiter or a part of a number */
+  /* NB: `coords' can be NULL if we just want to skip the      */
+  /*     array; in this case we ignore `max_coords'            */
+
+  static FT_Int
+  ps_tocoordarray( FT_Byte*  *acur,
+                   FT_Byte*   limit,
+                   FT_Int     max_coords,
+                   FT_Short*  coords )
+  {
+    FT_Byte*  cur   = *acur;
+    FT_Int    count = 0;
+    FT_Byte   c, ender;
+
+
+    if ( cur >= limit )
+      goto Exit;
+
+    /* check for the beginning of an array; otherwise, only one number */
+    /* will be read                                                    */
+    c     = *cur;
+    ender = 0;
+
+    if ( c == '[' )
+      ender = ']';
+    else if ( c == '{' )
+      ender = '}';
+
+    if ( ender )
+      cur++;
+
+    /* now, read the coordinates */
+    while ( cur < limit )
+    {
+      FT_Short  dummy;
+      FT_Byte*  old_cur;
+
+
+      /* skip whitespace in front of data */
+      skip_spaces( &cur, limit );
+      if ( cur >= limit )
+        goto Exit;
+
+      if ( *cur == ender )
+      {
+        cur++;
+        break;
+      }
+
+      old_cur = cur;
+
+      if ( coords != NULL && count >= max_coords )
+        break;
+
+      /* call PS_Conv_ToFixed() even if coords == NULL */
+      /* to properly parse number at `cur'             */
+      *( coords != NULL ? &coords[count] : &dummy ) =
+        (FT_Short)( PS_Conv_ToFixed( &cur, limit, 0 ) >> 16 );
+
+      if ( old_cur == cur )
+      {
+        count = -1;
+        goto Exit;
+      }
+      else
+        count++;
+
+      if ( !ender )
+        break;
+    }
+
+  Exit:
+    *acur = cur;
+    return count;
+  }
+
+
+  /* first character must be a delimiter or a part of a number */
+  /* NB: `values' can be NULL if we just want to skip the      */
+  /*     array; in this case we ignore `max_values'            */
+
+  static FT_Int
+  ps_tofixedarray( FT_Byte*  *acur,
+                   FT_Byte*   limit,
+                   FT_Int     max_values,
+                   FT_Fixed*  values,
+                   FT_Int     power_ten )
+  {
+    FT_Byte*  cur   = *acur;
+    FT_Int    count = 0;
+    FT_Byte   c, ender;
+
+
+    if ( cur >= limit )
+      goto Exit;
+
+    /* Check for the beginning of an array.  Otherwise, only one number */
+    /* will be read.                                                    */
+    c     = *cur;
+    ender = 0;
+
+    if ( c == '[' )
+      ender = ']';
+    else if ( c == '{' )
+      ender = '}';
+
+    if ( ender )
+      cur++;
+
+    /* now, read the values */
+    while ( cur < limit )
+    {
+      FT_Fixed  dummy;
+      FT_Byte*  old_cur;
+
+
+      /* skip whitespace in front of data */
+      skip_spaces( &cur, limit );
+      if ( cur >= limit )
+        goto Exit;
+
+      if ( *cur == ender )
+      {
+        cur++;
+        break;
+      }
+
+      old_cur = cur;
+
+      if ( values != NULL && count >= max_values )
+        break;
+
+      /* call PS_Conv_ToFixed() even if coords == NULL */
+      /* to properly parse number at `cur'             */
+      *( values != NULL ? &values[count] : &dummy ) =
+        PS_Conv_ToFixed( &cur, limit, power_ten );
+
+      if ( old_cur == cur )
+      {
+        count = -1;
+        goto Exit;
+      }
+      else
+        count++;
+
+      if ( !ender )
+        break;
+    }
+
+  Exit:
+    *acur = cur;
+    return count;
+  }
+
+
+#if 0
+
+  static FT_String*
+  ps_tostring( FT_Byte**  cursor,
+               FT_Byte*   limit,
+               FT_Memory  memory )
+  {
+    FT_Byte*    cur = *cursor;
+    FT_PtrDist  len = 0;
+    FT_Int      count;
+    FT_String*  result;
+    FT_Error    error;
+
+
+    /* XXX: some stupid fonts have a `Notice' or `Copyright' string     */
+    /*      that simply doesn't begin with an opening parenthesis, even */
+    /*      though they have a closing one!  E.g. "amuncial.pfb"        */
+    /*                                                                  */
+    /*      We must deal with these ill-fated cases there.  Note that   */
+    /*      these fonts didn't work with the old Type 1 driver as the   */
+    /*      notice/copyright was not recognized as a valid string token */
+    /*      and made the old token parser commit errors.                */
+
+    while ( cur < limit && ( *cur == ' ' || *cur == '\t' ) )
+      cur++;
+    if ( cur + 1 >= limit )
+      return 0;
+
+    if ( *cur == '(' )
+      cur++;  /* skip the opening parenthesis, if there is one */
+
+    *cursor = cur;
+    count   = 0;
+
+    /* then, count its length */
+    for ( ; cur < limit; cur++ )
+    {
+      if ( *cur == '(' )
+        count++;
+
+      else if ( *cur == ')' )
+      {
+        count--;
+        if ( count < 0 )
+          break;
+      }
+    }
+
+    len = cur - *cursor;
+    if ( cur >= limit || FT_ALLOC( result, len + 1 ) )
+      return 0;
+
+    /* now copy the string */
+    FT_MEM_COPY( result, *cursor, len );
+    result[len] = '\0';
+    *cursor = cur;
+    return result;
+  }
+
+#endif /* 0 */
+
+
+  static int
+  ps_tobool( FT_Byte*  *acur,
+             FT_Byte*   limit )
+  {
+    FT_Byte*  cur    = *acur;
+    FT_Bool   result = 0;
+
+
+    /* return 1 if we find `true', 0 otherwise */
+    if ( cur + 3 < limit &&
+         cur[0] == 't'   &&
+         cur[1] == 'r'   &&
+         cur[2] == 'u'   &&
+         cur[3] == 'e'   )
+    {
+      result = 1;
+      cur   += 5;
+    }
+    else if ( cur + 4 < limit &&
+              cur[0] == 'f'   &&
+              cur[1] == 'a'   &&
+              cur[2] == 'l'   &&
+              cur[3] == 's'   &&
+              cur[4] == 'e'   )
+    {
+      result = 0;
+      cur   += 6;
+    }
+
+    *acur = cur;
+    return result;
+  }
+
+
+  /* load a simple field (i.e. non-table) into the current list of objects */
+
+  FT_LOCAL_DEF( FT_Error )
+  ps_parser_load_field( PS_Parser       parser,
+                        const T1_Field  field,
+                        void**          objects,
+                        FT_UInt         max_objects,
+                        FT_ULong*       pflags )
+  {
+    T1_TokenRec  token;
+    FT_Byte*     cur;
+    FT_Byte*     limit;
+    FT_UInt      count;
+    FT_UInt      idx;
+    FT_Error     error;
+
+
+    /* this also skips leading whitespace */
+    ps_parser_to_token( parser, &token );
+    if ( !token.type )
+      goto Fail;
+
+    count = 1;
+    idx   = 0;
+    cur   = token.start;
+    limit = token.limit;
+
+    /* we must detect arrays in /FontBBox */
+    if ( field->type == T1_FIELD_TYPE_BBOX )
+    {
+      T1_TokenRec  token2;
+      FT_Byte*     old_cur   = parser->cursor;
+      FT_Byte*     old_limit = parser->limit;
+
+
+      /* don't include delimiters */
+      parser->cursor = token.start + 1;
+      parser->limit  = token.limit - 1;
+
+      ps_parser_to_token( parser, &token2 );
+      parser->cursor = old_cur;
+      parser->limit  = old_limit;
+
+      if ( token2.type == T1_TOKEN_TYPE_ARRAY )
+        goto FieldArray;
+    }
+    else if ( token.type == T1_TOKEN_TYPE_ARRAY )
+    {
+    FieldArray:
+      /* if this is an array and we have no blend, an error occurs */
+      if ( max_objects == 0 )
+        goto Fail;
+
+      count = max_objects;
+      idx   = 1;
+
+      /* don't include delimiters */
+      cur++;
+      limit--;
+    }
+
+    for ( ; count > 0; count--, idx++ )
+    {
+      FT_Byte*    q = (FT_Byte*)objects[idx] + field->offset;
+      FT_Long     val;
+      FT_String*  string;
+
+
+      skip_spaces( &cur, limit );
+
+      switch ( field->type )
+      {
+      case T1_FIELD_TYPE_BOOL:
+        val = ps_tobool( &cur, limit );
+        goto Store_Integer;
+
+      case T1_FIELD_TYPE_FIXED:
+        val = PS_Conv_ToFixed( &cur, limit, 0 );
+        goto Store_Integer;
+
+      case T1_FIELD_TYPE_FIXED_1000:
+        val = PS_Conv_ToFixed( &cur, limit, 3 );
+        goto Store_Integer;
+
+      case T1_FIELD_TYPE_INTEGER:
+        val = PS_Conv_ToInt( &cur, limit );
+        /* fall through */
+
+      Store_Integer:
+        switch ( field->size )
+        {
+        case (8 / FT_CHAR_BIT):
+          *(FT_Byte*)q = (FT_Byte)val;
+          break;
+
+        case (16 / FT_CHAR_BIT):
+          *(FT_UShort*)q = (FT_UShort)val;
+          break;
+
+        case (32 / FT_CHAR_BIT):
+          *(FT_UInt32*)q = (FT_UInt32)val;
+          break;
+
+        default:                /* for 64-bit systems */
+          *(FT_Long*)q = val;
+        }
+        break;
+
+      case T1_FIELD_TYPE_STRING:
+      case T1_FIELD_TYPE_KEY:
+        {
+          FT_Memory  memory = parser->memory;
+          FT_UInt    len    = (FT_UInt)( limit - cur );
+
+
+          if ( cur >= limit )
+            break;
+
+          /* we allow both a string or a name   */
+          /* for cases like /FontName (foo) def */
+          if ( token.type == T1_TOKEN_TYPE_KEY )
+          {
+            /* don't include leading `/' */
+            len--;
+            cur++;
+          }
+          else if ( token.type == T1_TOKEN_TYPE_STRING )
+          {
+            /* don't include delimiting parentheses    */
+            /* XXX we don't handle <<...>> here        */
+            /* XXX should we convert octal escapes?    */
+            /*     if so, what encoding should we use? */
+            cur++;
+            len -= 2;
+          }
+          else
+          {
+            FT_ERROR(( "ps_parser_load_field:"
+                       " expected a name or string\n"
+                       "                     "
+                       " but found token of type %d instead\n",
+                       token.type ));
+            error = PSaux_Err_Invalid_File_Format;
+            goto Exit;
+          }
+
+          /* for this to work (FT_String**)q must have been */
+          /* initialized to NULL                            */
+          if ( *(FT_String**)q != NULL )
+          {
+            FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n",
+                        field->ident ));
+            FT_FREE( *(FT_String**)q );
+            *(FT_String**)q = NULL;
+          }
+
+          if ( FT_ALLOC( string, len + 1 ) )
+            goto Exit;
+
+          FT_MEM_COPY( string, cur, len );
+          string[len] = 0;
+
+          *(FT_String**)q = string;
+        }
+        break;
+
+      case T1_FIELD_TYPE_BBOX:
+        {
+          FT_Fixed  temp[4];
+          FT_BBox*  bbox = (FT_BBox*)q;
+          FT_Int    result;
+
+
+          result = ps_tofixedarray( &cur, limit, 4, temp, 0 );
+
+          if ( result < 0 )
+          {
+            FT_ERROR(( "ps_parser_load_field:"
+                       " expected four integers in bounding box\n" ));
+            error = PSaux_Err_Invalid_File_Format;
+            goto Exit;
+          }
+
+          bbox->xMin = FT_RoundFix( temp[0] );
+          bbox->yMin = FT_RoundFix( temp[1] );
+          bbox->xMax = FT_RoundFix( temp[2] );
+          bbox->yMax = FT_RoundFix( temp[3] );
+        }
+        break;
+
+      default:
+        /* an error occurred */
+        goto Fail;
+      }
+    }
+
+#if 0  /* obsolete -- keep for reference */
+    if ( pflags )
+      *pflags |= 1L << field->flag_bit;
+#else
+    FT_UNUSED( pflags );
+#endif
+
+    error = PSaux_Err_Ok;
+
+  Exit:
+    return error;
+
+  Fail:
+    error = PSaux_Err_Invalid_File_Format;
+    goto Exit;
+  }
+
+
+#define T1_MAX_TABLE_ELEMENTS  32
+
+
+  FT_LOCAL_DEF( FT_Error )
+  ps_parser_load_field_table( PS_Parser       parser,
+                              const T1_Field  field,
+                              void**          objects,
+                              FT_UInt         max_objects,
+                              FT_ULong*       pflags )
+  {
+    T1_TokenRec  elements[T1_MAX_TABLE_ELEMENTS];
+    T1_Token     token;
+    FT_Int       num_elements;
+    FT_Error     error = PSaux_Err_Ok;
+    FT_Byte*     old_cursor;
+    FT_Byte*     old_limit;
+    T1_FieldRec  fieldrec = *(T1_Field)field;
+
+
+    fieldrec.type = T1_FIELD_TYPE_INTEGER;
+    if ( field->type == T1_FIELD_TYPE_FIXED_ARRAY ||
+         field->type == T1_FIELD_TYPE_BBOX        )
+      fieldrec.type = T1_FIELD_TYPE_FIXED;
+
+    ps_parser_to_token_array( parser, elements,
+                              T1_MAX_TABLE_ELEMENTS, &num_elements );
+    if ( num_elements < 0 )
+    {
+      error = PSaux_Err_Ignore;
+      goto Exit;
+    }
+    if ( (FT_UInt)num_elements > field->array_max )
+      num_elements = field->array_max;
+
+    old_cursor = parser->cursor;
+    old_limit  = parser->limit;
+
+    /* we store the elements count if necessary;           */
+    /* we further assume that `count_offset' can't be zero */
+    if ( field->type != T1_FIELD_TYPE_BBOX && field->count_offset != 0 )
+      *(FT_Byte*)( (FT_Byte*)objects[0] + field->count_offset ) =
+        (FT_Byte)num_elements;
+
+    /* we now load each element, adjusting the field.offset on each one */
+    token = elements;
+    for ( ; num_elements > 0; num_elements--, token++ )
+    {
+      parser->cursor = token->start;
+      parser->limit  = token->limit;
+      ps_parser_load_field( parser, &fieldrec, objects, max_objects, 0 );
+      fieldrec.offset += fieldrec.size;
+    }
+
+#if 0  /* obsolete -- keep for reference */
+    if ( pflags )
+      *pflags |= 1L << field->flag_bit;
+#else
+    FT_UNUSED( pflags );
+#endif
+
+    parser->cursor = old_cursor;
+    parser->limit  = old_limit;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Long )
+  ps_parser_to_int( PS_Parser  parser )
+  {
+    ps_parser_skip_spaces( parser );
+    return PS_Conv_ToInt( &parser->cursor, parser->limit );
+  }
+
+
+  /* first character must be `<' if `delimiters' is non-zero */
+
+  FT_LOCAL_DEF( FT_Error )
+  ps_parser_to_bytes( PS_Parser  parser,
+                      FT_Byte*   bytes,
+                      FT_Offset  max_bytes,
+                      FT_Long*   pnum_bytes,
+                      FT_Bool    delimiters )
+  {
+    FT_Error  error = PSaux_Err_Ok;
+    FT_Byte*  cur;
+
+
+    ps_parser_skip_spaces( parser );
+    cur = parser->cursor;
+
+    if ( cur >= parser->limit )
+      goto Exit;
+
+    if ( delimiters )
+    {
+      if ( *cur != '<' )
+      {
+        FT_ERROR(( "ps_parser_to_bytes: Missing starting delimiter `<'\n" ));
+        error = PSaux_Err_Invalid_File_Format;
+        goto Exit;
+      }
+
+      cur++;
+    }
+
+    *pnum_bytes = PS_Conv_ASCIIHexDecode( &cur,
+                                          parser->limit,
+                                          bytes,
+                                          max_bytes );
+
+    if ( delimiters )
+    {
+      if ( cur < parser->limit && *cur != '>' )
+      {
+        FT_ERROR(( "ps_parser_to_bytes: Missing closing delimiter `>'\n" ));
+        error = PSaux_Err_Invalid_File_Format;
+        goto Exit;
+      }
+
+      cur++;
+    }
+
+    parser->cursor = cur;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Fixed )
+  ps_parser_to_fixed( PS_Parser  parser,
+                      FT_Int     power_ten )
+  {
+    ps_parser_skip_spaces( parser );
+    return PS_Conv_ToFixed( &parser->cursor, parser->limit, power_ten );
+  }
+
+
+  FT_LOCAL_DEF( FT_Int )
+  ps_parser_to_coord_array( PS_Parser  parser,
+                            FT_Int     max_coords,
+                            FT_Short*  coords )
+  {
+    ps_parser_skip_spaces( parser );
+    return ps_tocoordarray( &parser->cursor, parser->limit,
+                            max_coords, coords );
+  }
+
+
+  FT_LOCAL_DEF( FT_Int )
+  ps_parser_to_fixed_array( PS_Parser  parser,
+                            FT_Int     max_values,
+                            FT_Fixed*  values,
+                            FT_Int     power_ten )
+  {
+    ps_parser_skip_spaces( parser );
+    return ps_tofixedarray( &parser->cursor, parser->limit,
+                            max_values, values, power_ten );
+  }
+
+
+#if 0
+
+  FT_LOCAL_DEF( FT_String* )
+  T1_ToString( PS_Parser  parser )
+  {
+    return ps_tostring( &parser->cursor, parser->limit, parser->memory );
+  }
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  T1_ToBool( PS_Parser  parser )
+  {
+    return ps_tobool( &parser->cursor, parser->limit );
+  }
+
+#endif /* 0 */
+
+
+  FT_LOCAL_DEF( void )
+  ps_parser_init( PS_Parser  parser,
+                  FT_Byte*   base,
+                  FT_Byte*   limit,
+                  FT_Memory  memory )
+  {
+    parser->error  = PSaux_Err_Ok;
+    parser->base   = base;
+    parser->limit  = limit;
+    parser->cursor = base;
+    parser->memory = memory;
+    parser->funcs  = ps_parser_funcs;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  ps_parser_done( PS_Parser  parser )
+  {
+    FT_UNUSED( parser );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            T1 BUILDER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    t1_builder_init                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a given glyph builder.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    builder :: A pointer to the glyph builder to initialize.           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face    :: The current face object.                                */
+  /*                                                                       */
+  /*    size    :: The current size object.                                */
+  /*                                                                       */
+  /*    glyph   :: The current glyph object.                               */
+  /*                                                                       */
+  /*    hinting :: Whether hinting should be applied.                      */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  t1_builder_init( T1_Builder    builder,
+                   FT_Face       face,
+                   FT_Size       size,
+                   FT_GlyphSlot  glyph,
+                   FT_Bool       hinting )
+  {
+    builder->parse_state = T1_Parse_Start;
+    builder->load_points = 1;
+
+    builder->face   = face;
+    builder->glyph  = glyph;
+    builder->memory = face->memory;
+
+    if ( glyph )
+    {
+      FT_GlyphLoader  loader = glyph->internal->loader;
+
+
+      builder->loader  = loader;
+      builder->base    = &loader->base.outline;
+      builder->current = &loader->current.outline;
+      FT_GlyphLoader_Rewind( loader );
+
+      builder->hints_globals = size->internal;
+      builder->hints_funcs   = 0;
+
+      if ( hinting )
+        builder->hints_funcs = glyph->internal->glyph_hints;
+    }
+
+    builder->pos_x = 0;
+    builder->pos_y = 0;
+
+    builder->left_bearing.x = 0;
+    builder->left_bearing.y = 0;
+    builder->advance.x      = 0;
+    builder->advance.y      = 0;
+
+    builder->funcs = t1_builder_funcs;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    t1_builder_done                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalizes a given glyph builder.  Its contents can still be used   */
+  /*    after the call, but the function saves important information       */
+  /*    within the corresponding glyph slot.                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    builder :: A pointer to the glyph builder to finalize.             */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  t1_builder_done( T1_Builder  builder )
+  {
+    FT_GlyphSlot  glyph = builder->glyph;
+
+
+    if ( glyph )
+      glyph->outline = *builder->base;
+  }
+
+
+  /* check that there is enough space for `count' more points */
+  FT_LOCAL_DEF( FT_Error )
+  t1_builder_check_points( T1_Builder  builder,
+                           FT_Int      count )
+  {
+    return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 );
+  }
+
+
+  /* add a new point, do not check space */
+  FT_LOCAL_DEF( void )
+  t1_builder_add_point( T1_Builder  builder,
+                        FT_Pos      x,
+                        FT_Pos      y,
+                        FT_Byte     flag )
+  {
+    FT_Outline*  outline = builder->current;
+
+
+    if ( builder->load_points )
+    {
+      FT_Vector*  point   = outline->points + outline->n_points;
+      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points;
+
+
+      point->x = FIXED_TO_INT( x );
+      point->y = FIXED_TO_INT( y );
+      *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC );
+    }
+    outline->n_points++;
+  }
+
+
+  /* check space for a new on-curve point, then add it */
+  FT_LOCAL_DEF( FT_Error )
+  t1_builder_add_point1( T1_Builder  builder,
+                         FT_Pos      x,
+                         FT_Pos      y )
+  {
+    FT_Error  error;
+
+
+    error = t1_builder_check_points( builder, 1 );
+    if ( !error )
+      t1_builder_add_point( builder, x, y, 1 );
+
+    return error;
+  }
+
+
+  /* check space for a new contour, then add it */
+  FT_LOCAL_DEF( FT_Error )
+  t1_builder_add_contour( T1_Builder  builder )
+  {
+    FT_Outline*  outline = builder->current;
+    FT_Error     error;
+
+
+    /* this might happen in invalid fonts */
+    if ( !outline )
+    {
+      FT_ERROR(( "t1_builder_add_contour: no outline to add points to\n" ));
+      return PSaux_Err_Invalid_File_Format;
+    }
+
+    if ( !builder->load_points )
+    {
+      outline->n_contours++;
+      return PSaux_Err_Ok;
+    }
+
+    error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 );
+    if ( !error )
+    {
+      if ( outline->n_contours > 0 )
+        outline->contours[outline->n_contours - 1] =
+          (short)( outline->n_points - 1 );
+
+      outline->n_contours++;
+    }
+
+    return error;
+  }
+
+
+  /* if a path was begun, add its first on-curve point */
+  FT_LOCAL_DEF( FT_Error )
+  t1_builder_start_point( T1_Builder  builder,
+                          FT_Pos      x,
+                          FT_Pos      y )
+  {
+    FT_Error  error = PSaux_Err_Invalid_File_Format;
+
+
+    /* test whether we are building a new contour */
+
+    if ( builder->parse_state == T1_Parse_Have_Path )
+      error = PSaux_Err_Ok;
+    else
+    {
+      builder->parse_state = T1_Parse_Have_Path;
+      error = t1_builder_add_contour( builder );
+      if ( !error )
+        error = t1_builder_add_point1( builder, x, y );
+    }
+
+    return error;
+  }
+
+
+  /* close the current contour */
+  FT_LOCAL_DEF( void )
+  t1_builder_close_contour( T1_Builder  builder )
+  {
+    FT_Outline*  outline = builder->current;
+    FT_Int       first;
+
+
+    if ( !outline )
+      return;
+
+    first = outline->n_contours <= 1
+            ? 0 : outline->contours[outline->n_contours - 2] + 1;
+
+    /* We must not include the last point in the path if it */
+    /* is located on the first point.                       */
+    if ( outline->n_points > 1 )
+    {
+      FT_Vector*  p1      = outline->points + first;
+      FT_Vector*  p2      = outline->points + outline->n_points - 1;
+      FT_Byte*    control = (FT_Byte*)outline->tags + outline->n_points - 1;
+
+
+      /* `delete' last point only if it coincides with the first */
+      /* point and it is not a control point (which can happen). */
+      if ( p1->x == p2->x && p1->y == p2->y )
+        if ( *control == FT_CURVE_TAG_ON )
+          outline->n_points--;
+    }
+
+    if ( outline->n_contours > 0 )
+    {
+      /* Don't add contours only consisting of one point, i.e.,  */
+      /* check whether the first and the last point is the same. */
+      if ( first == outline->n_points - 1 )
+      {
+        outline->n_contours--;
+        outline->n_points--;
+      }
+      else
+        outline->contours[outline->n_contours - 1] =
+          (short)( outline->n_points - 1 );
+    }
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            OTHER                              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  t1_decrypt( FT_Byte*   buffer,
+              FT_Offset  length,
+              FT_UShort  seed )
+  {
+    PS_Conv_EexecDecode( &buffer,
+                         buffer + length,
+                         buffer,
+                         length,
+                         &seed );
+  }
+
+
+/* END */
diff --git a/src/psaux/psobjs.h b/src/psaux/psobjs.h
new file mode 100644 (file)
index 0000000..e380c60
--- /dev/null
@@ -0,0 +1,212 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psobjs.h                                                               */
+/*                                                                         */
+/*    Auxiliary functions for PostScript fonts (specification).            */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSOBJS_H__
+#define __PSOBJS_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                             T1_TABLE                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_CALLBACK_TABLE
+  const PS_Table_FuncsRec    ps_table_funcs;
+
+  FT_CALLBACK_TABLE
+  const PS_Parser_FuncsRec   ps_parser_funcs;
+
+  FT_CALLBACK_TABLE
+  const T1_Builder_FuncsRec  t1_builder_funcs;
+
+
+  FT_LOCAL( FT_Error )
+  ps_table_new( PS_Table   table,
+                FT_Int     count,
+                FT_Memory  memory );
+
+  FT_LOCAL( FT_Error )
+  ps_table_add( PS_Table    table,
+                FT_Int      idx,
+                void*       object,
+                FT_PtrDist  length );
+
+  FT_LOCAL( void )
+  ps_table_done( PS_Table  table );
+
+
+  FT_LOCAL( void )
+  ps_table_release( PS_Table  table );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            T1 PARSER                          *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_LOCAL( void )
+  ps_parser_skip_spaces( PS_Parser  parser );
+
+  FT_LOCAL( void )
+  ps_parser_skip_PS_token( PS_Parser  parser );
+
+  FT_LOCAL( void )
+  ps_parser_to_token( PS_Parser  parser,
+                      T1_Token   token );
+
+  FT_LOCAL( void )
+  ps_parser_to_token_array( PS_Parser  parser,
+                            T1_Token   tokens,
+                            FT_UInt    max_tokens,
+                            FT_Int*    pnum_tokens );
+
+  FT_LOCAL( FT_Error )
+  ps_parser_load_field( PS_Parser       parser,
+                        const T1_Field  field,
+                        void**          objects,
+                        FT_UInt         max_objects,
+                        FT_ULong*       pflags );
+
+  FT_LOCAL( FT_Error )
+  ps_parser_load_field_table( PS_Parser       parser,
+                              const T1_Field  field,
+                              void**          objects,
+                              FT_UInt         max_objects,
+                              FT_ULong*       pflags );
+
+  FT_LOCAL( FT_Long )
+  ps_parser_to_int( PS_Parser  parser );
+
+
+  FT_LOCAL( FT_Error )
+  ps_parser_to_bytes( PS_Parser  parser,
+                      FT_Byte*   bytes,
+                      FT_Offset  max_bytes,
+                      FT_Long*   pnum_bytes,
+                      FT_Bool    delimiters );
+
+
+  FT_LOCAL( FT_Fixed )
+  ps_parser_to_fixed( PS_Parser  parser,
+                      FT_Int     power_ten );
+
+
+  FT_LOCAL( FT_Int )
+  ps_parser_to_coord_array( PS_Parser  parser,
+                            FT_Int     max_coords,
+                            FT_Short*  coords );
+
+  FT_LOCAL( FT_Int )
+  ps_parser_to_fixed_array( PS_Parser  parser,
+                            FT_Int     max_values,
+                            FT_Fixed*  values,
+                            FT_Int     power_ten );
+
+
+  FT_LOCAL( void )
+  ps_parser_init( PS_Parser  parser,
+                  FT_Byte*   base,
+                  FT_Byte*   limit,
+                  FT_Memory  memory );
+
+  FT_LOCAL( void )
+  ps_parser_done( PS_Parser  parser );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            T1 BUILDER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  t1_builder_init( T1_Builder    builder,
+                   FT_Face       face,
+                   FT_Size       size,
+                   FT_GlyphSlot  glyph,
+                   FT_Bool       hinting );
+
+  FT_LOCAL( void )
+  t1_builder_done( T1_Builder  builder );
+
+  FT_LOCAL( FT_Error )
+  t1_builder_check_points( T1_Builder  builder,
+                           FT_Int      count );
+
+  FT_LOCAL( void )
+  t1_builder_add_point( T1_Builder  builder,
+                        FT_Pos      x,
+                        FT_Pos      y,
+                        FT_Byte     flag );
+
+  FT_LOCAL( FT_Error )
+  t1_builder_add_point1( T1_Builder  builder,
+                         FT_Pos      x,
+                         FT_Pos      y );
+
+  FT_LOCAL( FT_Error )
+  t1_builder_add_contour( T1_Builder  builder );
+
+
+  FT_LOCAL( FT_Error )
+  t1_builder_start_point( T1_Builder  builder,
+                          FT_Pos      x,
+                          FT_Pos      y );
+
+
+  FT_LOCAL( void )
+  t1_builder_close_contour( T1_Builder  builder );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            OTHER                              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  t1_decrypt( FT_Byte*   buffer,
+              FT_Offset  length,
+              FT_UShort  seed );
+
+
+FT_END_HEADER
+
+#endif /* __PSOBJS_H__ */
+
+
+/* END */
diff --git a/src/psaux/rules.mk b/src/psaux/rules.mk
new file mode 100644 (file)
index 0000000..7a1be37
--- /dev/null
@@ -0,0 +1,73 @@
+#
+# FreeType 2 PSaux driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2002, 2003, 2006 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.
+
+
+# PSAUX driver directory
+#
+PSAUX_DIR := $(SRC_DIR)/psaux
+
+
+# compilation flags for the driver
+#
+PSAUX_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSAUX_DIR))
+
+
+# PSAUX driver sources (i.e., C files)
+#
+PSAUX_DRV_SRC := $(PSAUX_DIR)/psobjs.c   \
+                 $(PSAUX_DIR)/t1decode.c \
+                 $(PSAUX_DIR)/t1cmap.c   \
+                 $(PSAUX_DIR)/afmparse.c \
+                 $(PSAUX_DIR)/psconv.c   \
+                 $(PSAUX_DIR)/psauxmod.c
+
+# PSAUX driver headers
+#
+PSAUX_DRV_H := $(PSAUX_DRV_SRC:%c=%h)  \
+               $(PSAUX_DIR)/psauxerr.h
+
+
+# PSAUX driver object(s)
+#
+#   PSAUX_DRV_OBJ_M is used during `multi' builds.
+#   PSAUX_DRV_OBJ_S is used during `single' builds.
+#
+PSAUX_DRV_OBJ_M := $(PSAUX_DRV_SRC:$(PSAUX_DIR)/%.c=$(OBJ_DIR)/%.$O)
+PSAUX_DRV_OBJ_S := $(OBJ_DIR)/psaux.$O
+
+# PSAUX driver source file for single build
+#
+PSAUX_DRV_SRC_S := $(PSAUX_DIR)/psaux.c
+
+
+# PSAUX driver - single object
+#
+$(PSAUX_DRV_OBJ_S): $(PSAUX_DRV_SRC_S) $(PSAUX_DRV_SRC) \
+                   $(FREETYPE_H) $(PSAUX_DRV_H)
+       $(PSAUX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSAUX_DRV_SRC_S))
+
+
+# PSAUX driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(PSAUX_DIR)/%.c $(FREETYPE_H) $(PSAUX_DRV_H)
+       $(PSAUX_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(PSAUX_DRV_OBJ_S)
+DRV_OBJS_M += $(PSAUX_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/psaux/t1cmap.c b/src/psaux/t1cmap.c
new file mode 100644 (file)
index 0000000..9e5bd34
--- /dev/null
@@ -0,0 +1,341 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1cmap.c                                                               */
+/*                                                                         */
+/*    Type 1 character map support (body).                                 */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2006, 2007, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "t1cmap.h"
+
+#include FT_INTERNAL_DEBUG_H
+
+#include "psauxerr.h"
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****          TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  t1_cmap_std_init( T1_CMapStd  cmap,
+                    FT_Int      is_expert )
+  {
+    T1_Face             face    = (T1_Face)FT_CMAP_FACE( cmap );
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+    cmap->num_glyphs    = face->type1.num_glyphs;
+    cmap->glyph_names   = (const char* const*)face->type1.glyph_names;
+    cmap->sid_to_string = psnames->adobe_std_strings;
+    cmap->code_to_sid   = is_expert ? psnames->adobe_expert_encoding
+                                    : psnames->adobe_std_encoding;
+
+    FT_ASSERT( cmap->code_to_sid != NULL );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  t1_cmap_std_done( T1_CMapStd  cmap )
+  {
+    cmap->num_glyphs    = 0;
+    cmap->glyph_names   = NULL;
+    cmap->sid_to_string = NULL;
+    cmap->code_to_sid   = NULL;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  t1_cmap_std_char_index( T1_CMapStd  cmap,
+                          FT_UInt32   char_code )
+  {
+    FT_UInt  result = 0;
+
+
+    if ( char_code < 256 )
+    {
+      FT_UInt      code, n;
+      const char*  glyph_name;
+
+
+      /* convert character code to Adobe SID string */
+      code       = cmap->code_to_sid[char_code];
+      glyph_name = cmap->sid_to_string( code );
+
+      /* look for the corresponding glyph name */
+      for ( n = 0; n < cmap->num_glyphs; n++ )
+      {
+        const char* gname = cmap->glyph_names[n];
+
+
+        if ( gname && gname[0] == glyph_name[0]  &&
+             ft_strcmp( gname, glyph_name ) == 0 )
+        {
+          result = n;
+          break;
+        }
+      }
+    }
+
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  t1_cmap_std_char_next( T1_CMapStd   cmap,
+                         FT_UInt32   *pchar_code )
+  {
+    FT_UInt    result    = 0;
+    FT_UInt32  char_code = *pchar_code + 1;
+
+
+    while ( char_code < 256 )
+    {
+      result = t1_cmap_std_char_index( cmap, char_code );
+      if ( result != 0 )
+        goto Exit;
+
+      char_code++;
+    }
+    char_code = 0;
+
+  Exit:
+    *pchar_code = char_code;
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  t1_cmap_standard_init( T1_CMapStd  cmap )
+  {
+    t1_cmap_std_init( cmap, 0 );
+    return 0;
+  }
+
+
+  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+  t1_cmap_standard_class_rec =
+  {
+    sizeof ( T1_CMapStdRec ),
+
+    (FT_CMap_InitFunc)     t1_cmap_standard_init,
+    (FT_CMap_DoneFunc)     t1_cmap_std_done,
+    (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,
+    (FT_CMap_CharNextFunc) t1_cmap_std_char_next,
+
+    NULL, NULL, NULL, NULL, NULL
+  };
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  t1_cmap_expert_init( T1_CMapStd  cmap )
+  {
+    t1_cmap_std_init( cmap, 1 );
+    return 0;
+  }
+
+  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+  t1_cmap_expert_class_rec =
+  {
+    sizeof ( T1_CMapStdRec ),
+
+    (FT_CMap_InitFunc)     t1_cmap_expert_init,
+    (FT_CMap_DoneFunc)     t1_cmap_std_done,
+    (FT_CMap_CharIndexFunc)t1_cmap_std_char_index,
+    (FT_CMap_CharNextFunc) t1_cmap_std_char_next,
+
+    NULL, NULL, NULL, NULL, NULL
+  };
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    TYPE1 CUSTOM ENCODING CMAP                 *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  t1_cmap_custom_init( T1_CMapCustom  cmap )
+  {
+    T1_Face      face     = (T1_Face)FT_CMAP_FACE( cmap );
+    T1_Encoding  encoding = &face->type1.encoding;
+
+
+    cmap->first   = encoding->code_first;
+    cmap->count   = (FT_UInt)( encoding->code_last - cmap->first );
+    cmap->indices = encoding->char_index;
+
+    FT_ASSERT( cmap->indices != NULL );
+    FT_ASSERT( encoding->code_first <= encoding->code_last );
+
+    return 0;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  t1_cmap_custom_done( T1_CMapCustom  cmap )
+  {
+    cmap->indices = NULL;
+    cmap->first   = 0;
+    cmap->count   = 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  t1_cmap_custom_char_index( T1_CMapCustom  cmap,
+                             FT_UInt32      char_code )
+  {
+    FT_UInt    result = 0;
+
+
+    if ( ( char_code >= cmap->first )                  &&
+         ( char_code < ( cmap->first + cmap->count ) ) )
+      result = cmap->indices[char_code];
+
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  t1_cmap_custom_char_next( T1_CMapCustom  cmap,
+                            FT_UInt32     *pchar_code )
+  {
+    FT_UInt    result = 0;
+    FT_UInt32  char_code = *pchar_code;
+
+
+    ++char_code;
+
+    if ( char_code < cmap->first )
+      char_code = cmap->first;
+
+    for ( ; char_code < ( cmap->first + cmap->count ); char_code++ )
+    {
+      result = cmap->indices[char_code];
+      if ( result != 0 )
+        goto Exit;
+    }
+
+    char_code = 0;
+
+  Exit:
+    *pchar_code = char_code;
+    return result;
+  }
+
+
+  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+  t1_cmap_custom_class_rec =
+  {
+    sizeof ( T1_CMapCustomRec ),
+
+    (FT_CMap_InitFunc)     t1_cmap_custom_init,
+    (FT_CMap_DoneFunc)     t1_cmap_custom_done,
+    (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index,
+    (FT_CMap_CharNextFunc) t1_cmap_custom_char_next,
+
+    NULL, NULL, NULL, NULL, NULL
+  };
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****            TYPE1 SYNTHETIC UNICODE ENCODING CMAP              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_CALLBACK_DEF( const char * )
+  psaux_get_glyph_name( T1_Face  face,
+                        FT_UInt  idx )
+  {
+    return face->type1.glyph_names[idx];
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  t1_cmap_unicode_init( PS_Unicodes  unicodes )
+  {
+    T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );
+    FT_Memory           memory  = FT_FACE_MEMORY( face );
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+    return psnames->unicodes_init( memory,
+                                   unicodes,
+                                   face->type1.num_glyphs,
+                                   (PS_GetGlyphNameFunc)&psaux_get_glyph_name,
+                                   (PS_FreeGlyphNameFunc)NULL,
+                                   (FT_Pointer)face );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  t1_cmap_unicode_done( PS_Unicodes  unicodes )
+  {
+    FT_Face    face   = FT_CMAP_FACE( unicodes );
+    FT_Memory  memory = FT_FACE_MEMORY( face );
+
+
+    FT_FREE( unicodes->maps );
+    unicodes->num_maps = 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  t1_cmap_unicode_char_index( PS_Unicodes  unicodes,
+                              FT_UInt32    char_code )
+  {
+    T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+    return psnames->unicodes_char_index( unicodes, char_code );
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  t1_cmap_unicode_char_next( PS_Unicodes  unicodes,
+                             FT_UInt32   *pchar_code )
+  {
+    T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+    return psnames->unicodes_char_next( unicodes, pchar_code );
+  }
+
+
+  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
+  t1_cmap_unicode_class_rec =
+  {
+    sizeof ( PS_UnicodesRec ),
+
+    (FT_CMap_InitFunc)     t1_cmap_unicode_init,
+    (FT_CMap_DoneFunc)     t1_cmap_unicode_done,
+    (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index,
+    (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next,
+
+    NULL, NULL, NULL, NULL, NULL
+  };
+
+
+/* END */
diff --git a/src/psaux/t1cmap.h b/src/psaux/t1cmap.h
new file mode 100644 (file)
index 0000000..7ae65d2
--- /dev/null
@@ -0,0 +1,105 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1cmap.h                                                               */
+/*                                                                         */
+/*    Type 1 character map support (specification).                        */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1CMAP_H__
+#define __T1CMAP_H__
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_TYPE1_TYPES_H
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****          TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* standard (and expert) encoding cmaps */
+  typedef struct T1_CMapStdRec_*  T1_CMapStd;
+
+  typedef struct  T1_CMapStdRec_
+  {
+    FT_CMapRec                cmap;
+
+    const FT_UShort*          code_to_sid;
+    PS_Adobe_Std_StringsFunc  sid_to_string;
+
+    FT_UInt                   num_glyphs;
+    const char* const*        glyph_names;
+
+  } T1_CMapStdRec;
+
+
+  FT_CALLBACK_TABLE const FT_CMap_ClassRec
+  t1_cmap_standard_class_rec;
+
+  FT_CALLBACK_TABLE const FT_CMap_ClassRec
+  t1_cmap_expert_class_rec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                  TYPE1 CUSTOM ENCODING CMAP                   *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef struct T1_CMapCustomRec_*  T1_CMapCustom;
+
+  typedef struct  T1_CMapCustomRec_
+  {
+    FT_CMapRec  cmap;
+    FT_UInt     first;
+    FT_UInt     count;
+    FT_UShort*  indices;
+
+  } T1_CMapCustomRec;
+
+
+  FT_CALLBACK_TABLE const FT_CMap_ClassRec
+  t1_cmap_custom_class_rec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****             TYPE1 SYNTHETIC UNICODE ENCODING CMAP             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* unicode (synthetic) cmaps */
+
+  FT_CALLBACK_TABLE const FT_CMap_ClassRec
+  t1_cmap_unicode_class_rec;
+
+ /* */
+
+
+FT_END_HEADER
+
+#endif /* __T1CMAP_H__ */
+
+
+/* END */
diff --git a/src/psaux/t1decode.c b/src/psaux/t1decode.c
new file mode 100644 (file)
index 0000000..ea67841
--- /dev/null
@@ -0,0 +1,1614 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1decode.c                                                             */
+/*                                                                         */
+/*    PostScript Type 1 decoding routines (body).                          */
+/*                                                                         */
+/*  Copyright 2000-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_CALC_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_POSTSCRIPT_HINTS_H
+#include FT_OUTLINE_H
+
+#include "t1decode.h"
+#include "psobjs.h"
+
+#include "psauxerr.h"
+
+/* ensure proper sign extension */
+#define Fix2Int( f )  ( (FT_Int)(FT_Short)( (f) >> 16 ) )
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_t1decode
+
+
+  typedef enum  T1_Operator_
+  {
+    op_none = 0,
+    op_endchar,
+    op_hsbw,
+    op_seac,
+    op_sbw,
+    op_closepath,
+    op_hlineto,
+    op_hmoveto,
+    op_hvcurveto,
+    op_rlineto,
+    op_rmoveto,
+    op_rrcurveto,
+    op_vhcurveto,
+    op_vlineto,
+    op_vmoveto,
+    op_dotsection,
+    op_hstem,
+    op_hstem3,
+    op_vstem,
+    op_vstem3,
+    op_div,
+    op_callothersubr,
+    op_callsubr,
+    op_pop,
+    op_return,
+    op_setcurrentpoint,
+    op_unknown15,
+
+    op_max    /* never remove this one */
+
+  } T1_Operator;
+
+
+  static
+  const FT_Int  t1_args_count[op_max] =
+  {
+    0, /* none */
+    0, /* endchar */
+    2, /* hsbw */
+    5, /* seac */
+    4, /* sbw */
+    0, /* closepath */
+    1, /* hlineto */
+    1, /* hmoveto */
+    4, /* hvcurveto */
+    2, /* rlineto */
+    2, /* rmoveto */
+    6, /* rrcurveto */
+    4, /* vhcurveto */
+    1, /* vlineto */
+    1, /* vmoveto */
+    0, /* dotsection */
+    2, /* hstem */
+    6, /* hstem3 */
+    2, /* vstem */
+    6, /* vstem3 */
+    2, /* div */
+   -1, /* callothersubr */
+    1, /* callsubr */
+    0, /* pop */
+    0, /* return */
+    2, /* setcurrentpoint */
+    2  /* opcode 15 (undocumented and obsolete) */
+  };
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    t1_lookup_glyph_by_stdcharcode                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Looks up a given glyph by its StandardEncoding charcode.  Used to  */
+  /*    implement the SEAC Type 1 operator.                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face     :: The current face object.                               */
+  /*                                                                       */
+  /*    charcode :: The character code to look for.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A glyph index in the font face.  Returns -1 if the corresponding   */
+  /*    glyph wasn't found.                                                */
+  /*                                                                       */
+  static FT_Int
+  t1_lookup_glyph_by_stdcharcode( T1_Decoder  decoder,
+                                  FT_Int      charcode )
+  {
+    FT_UInt             n;
+    const FT_String*    glyph_name;
+    FT_Service_PsCMaps  psnames = decoder->psnames;
+
+
+    /* check range of standard char code */
+    if ( charcode < 0 || charcode > 255 )
+      return -1;
+
+    glyph_name = psnames->adobe_std_strings(
+                   psnames->adobe_std_encoding[charcode]);
+
+    for ( n = 0; n < decoder->num_glyphs; n++ )
+    {
+      FT_String*  name = (FT_String*)decoder->glyph_names[n];
+
+
+      if ( name                               &&
+           name[0] == glyph_name[0]           &&
+           ft_strcmp( name, glyph_name ) == 0 )
+        return n;
+    }
+
+    return -1;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    t1operator_seac                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Implements the `seac' Type 1 operator for a Type 1 decoder.        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    decoder :: The current CID decoder.                                */
+  /*                                                                       */
+  /*    asb     :: The accent's side bearing.                              */
+  /*                                                                       */
+  /*    adx     :: The horizontal offset of the accent.                    */
+  /*                                                                       */
+  /*    ady     :: The vertical offset of the accent.                      */
+  /*                                                                       */
+  /*    bchar   :: The base character's StandardEncoding charcode.         */
+  /*                                                                       */
+  /*    achar   :: The accent character's StandardEncoding charcode.       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  static FT_Error
+  t1operator_seac( T1_Decoder  decoder,
+                   FT_Pos      asb,
+                   FT_Pos      adx,
+                   FT_Pos      ady,
+                   FT_Int      bchar,
+                   FT_Int      achar )
+  {
+    FT_Error     error;
+    FT_Int       bchar_index, achar_index;
+#if 0
+    FT_Int       n_base_points;
+    FT_Outline*  base = decoder->builder.base;
+#endif
+    FT_Vector    left_bearing, advance;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    T1_Face      face  = (T1_Face)decoder->builder.face;
+#endif
+
+
+    if ( decoder->seac )
+    {
+      FT_ERROR(( "t1operator_seac: invalid nested seac\n" ));
+      return PSaux_Err_Syntax_Error;
+    }
+
+    /* seac weirdness */
+    adx += decoder->builder.left_bearing.x;
+
+    /* `glyph_names' is set to 0 for CID fonts which do not */
+    /* include an encoding.  How can we deal with these?    */
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    if ( decoder->glyph_names == 0                   &&
+         !face->root.internal->incremental_interface )
+#else
+    if ( decoder->glyph_names == 0 )
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+    {
+      FT_ERROR(( "t1operator_seac:"
+                 " glyph names table not available in this font\n" ));
+      return PSaux_Err_Syntax_Error;
+    }
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    if ( face->root.internal->incremental_interface )
+    {
+      /* the caller must handle the font encoding also */
+      bchar_index = bchar;
+      achar_index = achar;
+    }
+    else
+#endif
+    {
+      bchar_index = t1_lookup_glyph_by_stdcharcode( decoder, bchar );
+      achar_index = t1_lookup_glyph_by_stdcharcode( decoder, achar );
+    }
+
+    if ( bchar_index < 0 || achar_index < 0 )
+    {
+      FT_ERROR(( "t1operator_seac:"
+                 " invalid seac character code arguments\n" ));
+      return PSaux_Err_Syntax_Error;
+    }
+
+    /* if we are trying to load a composite glyph, do not load the */
+    /* accent character and return the array of subglyphs.         */
+    if ( decoder->builder.no_recurse )
+    {
+      FT_GlyphSlot    glyph  = (FT_GlyphSlot)decoder->builder.glyph;
+      FT_GlyphLoader  loader = glyph->internal->loader;
+      FT_SubGlyph     subg;
+
+
+      /* reallocate subglyph array if necessary */
+      error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 );
+      if ( error )
+        goto Exit;
+
+      subg = loader->current.subglyphs;
+
+      /* subglyph 0 = base character */
+      subg->index = bchar_index;
+      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES |
+                    FT_SUBGLYPH_FLAG_USE_MY_METRICS;
+      subg->arg1  = 0;
+      subg->arg2  = 0;
+      subg++;
+
+      /* subglyph 1 = accent character */
+      subg->index = achar_index;
+      subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES;
+      subg->arg1  = (FT_Int)FIXED_TO_INT( adx - asb );
+      subg->arg2  = (FT_Int)FIXED_TO_INT( ady );
+
+      /* set up remaining glyph fields */
+      glyph->num_subglyphs = 2;
+      glyph->subglyphs     = loader->base.subglyphs;
+      glyph->format        = FT_GLYPH_FORMAT_COMPOSITE;
+
+      loader->current.num_subglyphs = 2;
+      goto Exit;
+    }
+
+    /* First load `bchar' in builder */
+    /* now load the unscaled outline */
+
+    FT_GlyphLoader_Prepare( decoder->builder.loader );  /* prepare loader */
+
+    /* the seac operator must not be nested */
+    decoder->seac = TRUE;
+    error = t1_decoder_parse_glyph( decoder, bchar_index );
+    decoder->seac = FALSE;
+    if ( error )
+      goto Exit;
+
+    /* save the left bearing and width of the base character */
+    /* as they will be erased by the next load.              */
+
+    left_bearing = decoder->builder.left_bearing;
+    advance      = decoder->builder.advance;
+
+    decoder->builder.left_bearing.x = 0;
+    decoder->builder.left_bearing.y = 0;
+
+    decoder->builder.pos_x = adx - asb;
+    decoder->builder.pos_y = ady;
+
+    /* Now load `achar' on top of */
+    /* the base outline           */
+
+    /* the seac operator must not be nested */
+    decoder->seac = TRUE;
+    error = t1_decoder_parse_glyph( decoder, achar_index );
+    decoder->seac = FALSE;
+    if ( error )
+      goto Exit;
+
+    /* restore the left side bearing and   */
+    /* advance width of the base character */
+
+    decoder->builder.left_bearing = left_bearing;
+    decoder->builder.advance      = advance;
+
+    decoder->builder.pos_x = 0;
+    decoder->builder.pos_y = 0;
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    t1_decoder_parse_charstrings                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Parses a given Type 1 charstrings program.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    decoder         :: The current Type 1 decoder.                     */
+  /*                                                                       */
+  /*    charstring_base :: The base address of the charstring stream.      */
+  /*                                                                       */
+  /*    charstring_len  :: The length in bytes of the charstring stream.   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  t1_decoder_parse_charstrings( T1_Decoder  decoder,
+                                FT_Byte*    charstring_base,
+                                FT_UInt     charstring_len )
+  {
+    FT_Error         error;
+    T1_Decoder_Zone  zone;
+    FT_Byte*         ip;
+    FT_Byte*         limit;
+    T1_Builder       builder = &decoder->builder;
+    FT_Pos           x, y, orig_x, orig_y;
+    FT_Int           known_othersubr_result_cnt   = 0;
+    FT_Int           unknown_othersubr_result_cnt = 0;
+    FT_Bool          large_int;
+    FT_Fixed         seed;
+
+    T1_Hints_Funcs   hinter;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+    FT_Bool          bol = TRUE;
+#endif
+
+
+    /* compute random seed from stack address of parameter */
+    seed = (FT_Fixed)( ( (FT_PtrDist)(char*)&seed              ^
+                         (FT_PtrDist)(char*)&decoder           ^
+                         (FT_PtrDist)(char*)&charstring_base ) &
+                         FT_ULONG_MAX ) ;
+    seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL;
+    if ( seed == 0 )
+      seed = 0x7384;
+
+    /* First of all, initialize the decoder */
+    decoder->top  = decoder->stack;
+    decoder->zone = decoder->zones;
+    zone          = decoder->zones;
+
+    builder->parse_state = T1_Parse_Start;
+
+    hinter = (T1_Hints_Funcs)builder->hints_funcs;
+
+    /* a font that reads BuildCharArray without setting */
+    /* its values first is buggy, but ...               */
+    FT_ASSERT( ( decoder->len_buildchar == 0 ) ==
+               ( decoder->buildchar == NULL )  );
+
+    if ( decoder->buildchar && decoder->len_buildchar > 0 )
+      ft_memset( &decoder->buildchar[0],
+                 0,
+                 sizeof ( decoder->buildchar[0] ) * decoder->len_buildchar );
+
+    FT_TRACE4(( "\n"
+                "Start charstring\n" ));
+
+    zone->base           = charstring_base;
+    limit = zone->limit  = charstring_base + charstring_len;
+    ip    = zone->cursor = zone->base;
+
+    error = PSaux_Err_Ok;
+
+    x = orig_x = builder->pos_x;
+    y = orig_y = builder->pos_y;
+
+    /* begin hints recording session, if any */
+    if ( hinter )
+      hinter->open( hinter->hints );
+
+    large_int = FALSE;
+
+    /* now, execute loop */
+    while ( ip < limit )
+    {
+      FT_Long*     top   = decoder->top;
+      T1_Operator  op    = op_none;
+      FT_Int32     value = 0;
+
+
+      FT_ASSERT( known_othersubr_result_cnt == 0   ||
+                 unknown_othersubr_result_cnt == 0 );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+      if ( bol )
+      {
+        FT_TRACE5(( " (%d)", decoder->top - decoder->stack ));
+        bol = FALSE;
+      }
+#endif
+
+      /*********************************************************************/
+      /*                                                                   */
+      /* Decode operator or operand                                        */
+      /*                                                                   */
+      /*                                                                   */
+
+      /* first of all, decompress operator or value */
+      switch ( *ip++ )
+      {
+      case 1:
+        op = op_hstem;
+        break;
+
+      case 3:
+        op = op_vstem;
+        break;
+      case 4:
+        op = op_vmoveto;
+        break;
+      case 5:
+        op = op_rlineto;
+        break;
+      case 6:
+        op = op_hlineto;
+        break;
+      case 7:
+        op = op_vlineto;
+        break;
+      case 8:
+        op = op_rrcurveto;
+        break;
+      case 9:
+        op = op_closepath;
+        break;
+      case 10:
+        op = op_callsubr;
+        break;
+      case 11:
+        op = op_return;
+        break;
+
+      case 13:
+        op = op_hsbw;
+        break;
+      case 14:
+        op = op_endchar;
+        break;
+
+      case 15:          /* undocumented, obsolete operator */
+        op = op_unknown15;
+        break;
+
+      case 21:
+        op = op_rmoveto;
+        break;
+      case 22:
+        op = op_hmoveto;
+        break;
+
+      case 30:
+        op = op_vhcurveto;
+        break;
+      case 31:
+        op = op_hvcurveto;
+        break;
+
+      case 12:
+        if ( ip > limit )
+        {
+          FT_ERROR(( "t1_decoder_parse_charstrings:"
+                     " invalid escape (12+EOF)\n" ));
+          goto Syntax_Error;
+        }
+
+        switch ( *ip++ )
+        {
+        case 0:
+          op = op_dotsection;
+          break;
+        case 1:
+          op = op_vstem3;
+          break;
+        case 2:
+          op = op_hstem3;
+          break;
+        case 6:
+          op = op_seac;
+          break;
+        case 7:
+          op = op_sbw;
+          break;
+        case 12:
+          op = op_div;
+          break;
+        case 16:
+          op = op_callothersubr;
+          break;
+        case 17:
+          op = op_pop;
+          break;
+        case 33:
+          op = op_setcurrentpoint;
+          break;
+
+        default:
+          FT_ERROR(( "t1_decoder_parse_charstrings:"
+                     " invalid escape (12+%d)\n",
+                     ip[-1] ));
+          goto Syntax_Error;
+        }
+        break;
+
+      case 255:    /* four bytes integer */
+        if ( ip + 4 > limit )
+        {
+          FT_ERROR(( "t1_decoder_parse_charstrings:"
+                     " unexpected EOF in integer\n" ));
+          goto Syntax_Error;
+        }
+
+        value = (FT_Int32)( ( (FT_Long)ip[0] << 24 ) |
+                            ( (FT_Long)ip[1] << 16 ) |
+                            ( (FT_Long)ip[2] << 8  ) |
+                                       ip[3]         );
+        ip += 4;
+
+        /* According to the specification, values > 32000 or < -32000 must */
+        /* be followed by a `div' operator to make the result be in the    */
+        /* range [-32000;32000].  We expect that the second argument of    */
+        /* `div' is not a large number.  Additionally, we don't handle     */
+        /* stuff like `<large1> <large2> <num> div <num> div' or           */
+        /* <large1> <large2> <num> div div'.  This is probably not allowed */
+        /* anyway.                                                         */
+        if ( value > 32000 || value < -32000 )
+        {
+          if ( large_int )
+          {
+            FT_ERROR(( "t1_decoder_parse_charstrings:"
+                       " no `div' after large integer\n" ));
+          }
+          else
+            large_int = TRUE;
+        }
+        else
+        {
+          if ( !large_int )
+            value <<= 16;
+        }
+
+        break;
+
+      default:
+        if ( ip[-1] >= 32 )
+        {
+          if ( ip[-1] < 247 )
+            value = (FT_Int32)ip[-1] - 139;
+          else
+          {
+            if ( ++ip > limit )
+            {
+              FT_ERROR(( "t1_decoder_parse_charstrings:"
+                         " unexpected EOF in integer\n" ));
+              goto Syntax_Error;
+            }
+
+            if ( ip[-2] < 251 )
+              value =  ( ( (FT_Int32)ip[-2] - 247 ) << 8 ) + ip[-1] + 108;
+            else
+              value = -( ( ( (FT_Int32)ip[-2] - 251 ) << 8 ) + ip[-1] + 108 );
+          }
+
+          if ( !large_int )
+            value <<= 16;
+        }
+        else
+        {
+          FT_ERROR(( "t1_decoder_parse_charstrings:"
+                     " invalid byte (%d)\n", ip[-1] ));
+          goto Syntax_Error;
+        }
+      }
+
+      if ( unknown_othersubr_result_cnt > 0 )
+      {
+        switch ( op )
+        {
+        case op_callsubr:
+        case op_return:
+        case op_none:
+        case op_pop:
+          break;
+
+        default:
+          /* all operands have been transferred by previous pops */
+          unknown_othersubr_result_cnt = 0;
+          break;
+        }
+      }
+
+      if ( large_int && !( op == op_none || op == op_div ) )
+      {
+        FT_ERROR(( "t1_decoder_parse_charstrings:"
+                   " no `div' after large integer\n" ));
+
+        large_int = FALSE;
+      }
+
+      /*********************************************************************/
+      /*                                                                   */
+      /*  Push value on stack, or process operator                         */
+      /*                                                                   */
+      /*                                                                   */
+      if ( op == op_none )
+      {
+        if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS )
+        {
+          FT_ERROR(( "t1_decoder_parse_charstrings: stack overflow\n" ));
+          goto Syntax_Error;
+        }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        if ( large_int )
+          FT_TRACE4(( " %ld", value ));
+        else
+          FT_TRACE4(( " %ld", Fix2Int( value ) ));
+#endif
+
+        *top++       = value;
+        decoder->top = top;
+      }
+      else if ( op == op_callothersubr )  /* callothersubr */
+      {
+        FT_Int  subr_no;
+        FT_Int  arg_cnt;
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        FT_TRACE4(( " callothersubr\n" ));
+        bol = TRUE;
+#endif
+
+        if ( top - decoder->stack < 2 )
+          goto Stack_Underflow;
+
+        top -= 2;
+
+        subr_no = Fix2Int( top[1] );
+        arg_cnt = Fix2Int( top[0] );
+
+        /***********************************************************/
+        /*                                                         */
+        /* remove all operands to callothersubr from the stack     */
+        /*                                                         */
+        /* for handled othersubrs, where we know the number of     */
+        /* arguments, we increase the stack by the value of        */
+        /* known_othersubr_result_cnt                              */
+        /*                                                         */
+        /* for unhandled othersubrs the following pops adjust the  */
+        /* stack pointer as necessary                              */
+
+        if ( arg_cnt > top - decoder->stack )
+          goto Stack_Underflow;
+
+        top -= arg_cnt;
+
+        known_othersubr_result_cnt   = 0;
+        unknown_othersubr_result_cnt = 0;
+
+        /* XXX TODO: The checks to `arg_count == <whatever>'       */
+        /* might not be correct; an othersubr expects a certain    */
+        /* number of operands on the PostScript stack (as opposed  */
+        /* to the T1 stack) but it doesn't have to put them there  */
+        /* by itself; previous othersubrs might have left the      */
+        /* operands there if they were not followed by an          */
+        /* appropriate number of pops                              */
+        /*                                                         */
+        /* On the other hand, Adobe Reader 7.0.8 for Linux doesn't */
+        /* accept a font that contains charstrings like            */
+        /*                                                         */
+        /*     100 200 2 20 callothersubr                          */
+        /*     300 1 20 callothersubr pop                          */
+        /*                                                         */
+        /* Perhaps this is the reason why BuildCharArray exists.   */
+
+        switch ( subr_no )
+        {
+        case 0:                     /* end flex feature */
+          if ( arg_cnt != 3 )
+            goto Unexpected_OtherSubr;
+
+          if ( decoder->flex_state       == 0 ||
+               decoder->num_flex_vectors != 7 )
+          {
+            FT_ERROR(( "t1_decoder_parse_charstrings:"
+                       " unexpected flex end\n" ));
+            goto Syntax_Error;
+          }
+
+          /* the two `results' are popped by the following setcurrentpoint */
+          top[0] = x;
+          top[1] = y;
+          known_othersubr_result_cnt = 2;
+          break;
+
+        case 1:                     /* start flex feature */
+          if ( arg_cnt != 0 )
+            goto Unexpected_OtherSubr;
+
+          decoder->flex_state        = 1;
+          decoder->num_flex_vectors  = 0;
+          if ( ( error = t1_builder_start_point( builder, x, y ) )
+                 != PSaux_Err_Ok                                   ||
+               ( error = t1_builder_check_points( builder, 6 ) )
+                 != PSaux_Err_Ok                                   )
+            goto Fail;
+          break;
+
+        case 2:                     /* add flex vectors */
+          {
+            FT_Int  idx;
+
+
+            if ( arg_cnt != 0 )
+              goto Unexpected_OtherSubr;
+
+            if ( decoder->flex_state == 0 )
+            {
+              FT_ERROR(( "t1_decoder_parse_charstrings:"
+                         " missing flex start\n" ));
+              goto Syntax_Error;
+            }
+
+            /* note that we should not add a point for index 0; */
+            /* this will move our current position to the flex  */
+            /* point without adding any point to the outline    */
+            idx = decoder->num_flex_vectors++;
+            if ( idx > 0 && idx < 7 )
+              t1_builder_add_point( builder,
+                                    x,
+                                    y,
+                                    (FT_Byte)( idx == 3 || idx == 6 ) );
+          }
+          break;
+
+        case 3:                     /* change hints */
+          if ( arg_cnt != 1 )
+            goto Unexpected_OtherSubr;
+
+          known_othersubr_result_cnt = 1;
+
+          if ( hinter )
+            hinter->reset( hinter->hints, builder->current->n_points );
+          break;
+
+        case 12:
+        case 13:
+          /* counter control hints, clear stack */
+          top = decoder->stack;
+          break;
+
+        case 14:
+        case 15:
+        case 16:
+        case 17:
+        case 18:                    /* multiple masters */
+          {
+            PS_Blend  blend = decoder->blend;
+            FT_UInt   num_points, nn, mm;
+            FT_Long*  delta;
+            FT_Long*  values;
+
+
+            if ( !blend )
+            {
+              FT_ERROR(( "t1_decoder_parse_charstrings:"
+                         " unexpected multiple masters operator\n" ));
+              goto Syntax_Error;
+            }
+
+            num_points = (FT_UInt)subr_no - 13 + ( subr_no == 18 );
+            if ( arg_cnt != (FT_Int)( num_points * blend->num_designs ) )
+            {
+              FT_ERROR(( "t1_decoder_parse_charstrings:"
+                         " incorrect number of multiple masters arguments\n" ));
+              goto Syntax_Error;
+            }
+
+            /* We want to compute                                    */
+            /*                                                       */
+            /*   a0*w0 + a1*w1 + ... + ak*wk                         */
+            /*                                                       */
+            /* but we only have a0, a1-a0, a2-a0, ..., ak-a0.        */
+            /*                                                       */
+            /* However, given that w0 + w1 + ... + wk == 1, we can   */
+            /* rewrite it easily as                                  */
+            /*                                                       */
+            /*   a0 + (a1-a0)*w1 + (a2-a0)*w2 + ... + (ak-a0)*wk     */
+            /*                                                       */
+            /* where k == num_designs-1.                             */
+            /*                                                       */
+            /* I guess that's why it's written in this `compact'     */
+            /* form.                                                 */
+            /*                                                       */
+            delta  = top + num_points;
+            values = top;
+            for ( nn = 0; nn < num_points; nn++ )
+            {
+              FT_Long  tmp = values[0];
+
+
+              for ( mm = 1; mm < blend->num_designs; mm++ )
+                tmp += FT_MulFix( *delta++, blend->weight_vector[mm] );
+
+              *values++ = tmp;
+            }
+
+            known_othersubr_result_cnt = num_points;
+            break;
+          }
+
+        case 19:
+          /* <idx> 1 19 callothersubr                             */
+          /* => replace elements starting from index cvi( <idx> ) */
+          /*    of BuildCharArray with WeightVector               */
+          {
+            FT_Int    idx;
+            PS_Blend  blend = decoder->blend;
+
+
+            if ( arg_cnt != 1 || blend == NULL )
+              goto Unexpected_OtherSubr;
+
+            idx = Fix2Int( top[0] );
+
+            if ( idx < 0                                           ||
+                 idx + blend->num_designs > decoder->len_buildchar )
+              goto Unexpected_OtherSubr;
+
+            ft_memcpy( &decoder->buildchar[idx],
+                       blend->weight_vector,
+                       blend->num_designs *
+                         sizeof ( blend->weight_vector[0] ) );
+          }
+          break;
+
+        case 20:
+          /* <arg1> <arg2> 2 20 callothersubr pop   */
+          /* ==> push <arg1> + <arg2> onto T1 stack */
+          if ( arg_cnt != 2 )
+            goto Unexpected_OtherSubr;
+
+          top[0] += top[1]; /* XXX (over|under)flow */
+
+          known_othersubr_result_cnt = 1;
+          break;
+
+        case 21:
+          /* <arg1> <arg2> 2 21 callothersubr pop   */
+          /* ==> push <arg1> - <arg2> onto T1 stack */
+          if ( arg_cnt != 2 )
+            goto Unexpected_OtherSubr;
+
+          top[0] -= top[1]; /* XXX (over|under)flow */
+
+          known_othersubr_result_cnt = 1;
+          break;
+
+        case 22:
+          /* <arg1> <arg2> 2 22 callothersubr pop   */
+          /* ==> push <arg1> * <arg2> onto T1 stack */
+          if ( arg_cnt != 2 )
+            goto Unexpected_OtherSubr;
+
+          top[0] = FT_MulFix( top[0], top[1] );
+
+          known_othersubr_result_cnt = 1;
+          break;
+
+        case 23:
+          /* <arg1> <arg2> 2 23 callothersubr pop   */
+          /* ==> push <arg1> / <arg2> onto T1 stack */
+          if ( arg_cnt != 2 || top[1] == 0 )
+            goto Unexpected_OtherSubr;
+
+          top[0] = FT_DivFix( top[0], top[1] );
+
+          known_othersubr_result_cnt = 1;
+          break;
+
+        case 24:
+          /* <val> <idx> 2 24 callothersubr               */
+          /* ==> set BuildCharArray[cvi( <idx> )] = <val> */
+          {
+            FT_Int    idx;
+            PS_Blend  blend = decoder->blend;
+
+
+            if ( arg_cnt != 2 || blend == NULL )
+              goto Unexpected_OtherSubr;
+
+            idx = Fix2Int( top[1] );
+
+            if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar )
+              goto Unexpected_OtherSubr;
+
+            decoder->buildchar[idx] = top[0];
+          }
+          break;
+
+        case 25:
+          /* <idx> 1 25 callothersubr pop        */
+          /* ==> push BuildCharArray[cvi( idx )] */
+          /*     onto T1 stack                   */
+          {
+            FT_Int    idx;
+            PS_Blend  blend = decoder->blend;
+
+
+            if ( arg_cnt != 1 || blend == NULL )
+              goto Unexpected_OtherSubr;
+
+            idx = Fix2Int( top[0] );
+
+            if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar )
+              goto Unexpected_OtherSubr;
+
+            top[0] = decoder->buildchar[idx];
+          }
+
+          known_othersubr_result_cnt = 1;
+          break;
+
+#if 0
+        case 26:
+          /* <val> mark <idx> ==> set BuildCharArray[cvi( <idx> )] = <val>, */
+          /*                      leave mark on T1 stack                    */
+          /* <val> <idx>      ==> set BuildCharArray[cvi( <idx> )] = <val>  */
+          XXX which routine has left its mark on the (PostScript) stack?;
+          break;
+#endif
+
+        case 27:
+          /* <res1> <res2> <val1> <val2> 4 27 callothersubr pop */
+          /* ==> push <res1> onto T1 stack if <val1> <= <val2>, */
+          /*     otherwise push <res2>                          */
+          if ( arg_cnt != 4 )
+            goto Unexpected_OtherSubr;
+
+          if ( top[2] > top[3] )
+            top[0] = top[1];
+
+          known_othersubr_result_cnt = 1;
+          break;
+
+        case 28:
+          /* 0 28 callothersubr pop                               */
+          /* => push random value from interval [0, 1) onto stack */
+          if ( arg_cnt != 0 )
+            goto Unexpected_OtherSubr;
+
+          {
+            FT_Fixed  Rand;
+
+
+            Rand = seed;
+            if ( Rand >= 0x8000L )
+              Rand++;
+
+            top[0] = Rand;
+
+            seed = FT_MulFix( seed, 0x10000L - seed );
+            if ( seed == 0 )
+              seed += 0x2873;
+          }
+
+          known_othersubr_result_cnt = 1;
+          break;
+
+        default:
+          if ( arg_cnt >= 0 && subr_no >= 0 )
+          {
+            FT_ERROR(( "t1_decoder_parse_charstrings:"
+                       " unknown othersubr [%d %d], wish me luck\n",
+                       arg_cnt, subr_no ));
+            unknown_othersubr_result_cnt = arg_cnt;
+            break;
+          }
+          /* fall through */
+
+        Unexpected_OtherSubr:
+          FT_ERROR(( "t1_decoder_parse_charstrings:"
+                     " invalid othersubr [%d %d]\n", arg_cnt, subr_no ));
+          goto Syntax_Error;
+        }
+
+        top += known_othersubr_result_cnt;
+
+        decoder->top = top;
+      }
+      else  /* general operator */
+      {
+        FT_Int  num_args = t1_args_count[op];
+
+
+        FT_ASSERT( num_args >= 0 );
+
+        if ( top - decoder->stack < num_args )
+          goto Stack_Underflow;
+
+        /* XXX Operators usually take their operands from the        */
+        /*     bottom of the stack, i.e., the operands are           */
+        /*     decoder->stack[0], ..., decoder->stack[num_args - 1]; */
+        /*     only div, callsubr, and callothersubr are different.  */
+        /*     In practice it doesn't matter (?).                    */
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+        switch ( op )
+        {
+        case op_callsubr:
+        case op_div:
+        case op_callothersubr:
+        case op_pop:
+        case op_return:
+          break;
+
+        default:
+          if ( top - decoder->stack != num_args )
+            FT_TRACE0(( "t1_decoder_parse_charstrings:"
+                        " too much operands on the stack"
+                        " (seen %d, expected %d)\n",
+                        top - decoder->stack, num_args ));
+            break;
+        }
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+        top -= num_args;
+
+        switch ( op )
+        {
+        case op_endchar:
+          FT_TRACE4(( " endchar\n" ));
+
+          t1_builder_close_contour( builder );
+
+          /* close hints recording session */
+          if ( hinter )
+          {
+            if ( hinter->close( hinter->hints, builder->current->n_points ) )
+              goto Syntax_Error;
+
+            /* apply hints to the loaded glyph outline now */
+            hinter->apply( hinter->hints,
+                           builder->current,
+                           (PSH_Globals)builder->hints_globals,
+                           decoder->hint_mode );
+          }
+
+          /* add current outline to the glyph slot */
+          FT_GlyphLoader_Add( builder->loader );
+
+          /* the compiler should optimize away this empty loop but ... */
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+          if ( decoder->len_buildchar > 0 )
+          {
+            FT_UInt  i;
+
+
+            FT_TRACE4(( "BuildCharArray = [ " ));
+
+            for ( i = 0; i < decoder->len_buildchar; ++i )
+              FT_TRACE4(( "%d ", decoder->buildchar[i] ));
+
+            FT_TRACE4(( "]\n" ));
+          }
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+          FT_TRACE4(( "\n" ));
+
+          /* return now! */
+          return PSaux_Err_Ok;
+
+        case op_hsbw:
+          FT_TRACE4(( " hsbw" ));
+
+          builder->parse_state = T1_Parse_Have_Width;
+
+          builder->left_bearing.x += top[0];
+          builder->advance.x       = top[1];
+          builder->advance.y       = 0;
+
+          orig_x = x = builder->pos_x + top[0];
+          orig_y = y = builder->pos_y;
+
+          FT_UNUSED( orig_y );
+
+          /* the `metrics_only' indicates that we only want to compute */
+          /* the glyph's metrics (lsb + advance width), not load the   */
+          /* rest of it; so exit immediately                           */
+          if ( builder->metrics_only )
+            return PSaux_Err_Ok;
+
+          break;
+
+        case op_seac:
+          return t1operator_seac( decoder,
+                                  top[0],
+                                  top[1],
+                                  top[2],
+                                  Fix2Int( top[3] ),
+                                  Fix2Int( top[4] ) );
+
+        case op_sbw:
+          FT_TRACE4(( " sbw" ));
+
+          builder->parse_state = T1_Parse_Have_Width;
+
+          builder->left_bearing.x += top[0];
+          builder->left_bearing.y += top[1];
+          builder->advance.x       = top[2];
+          builder->advance.y       = top[3];
+
+          x = builder->pos_x + top[0];
+          y = builder->pos_y + top[1];
+
+          /* the `metrics_only' indicates that we only want to compute */
+          /* the glyph's metrics (lsb + advance width), not load the   */
+          /* rest of it; so exit immediately                           */
+          if ( builder->metrics_only )
+            return PSaux_Err_Ok;
+
+          break;
+
+        case op_closepath:
+          FT_TRACE4(( " closepath" ));
+
+          /* if there is no path, `closepath' is a no-op */
+          if ( builder->parse_state == T1_Parse_Have_Path   ||
+               builder->parse_state == T1_Parse_Have_Moveto )
+            t1_builder_close_contour( builder );
+
+          builder->parse_state = T1_Parse_Have_Width;
+          break;
+
+        case op_hlineto:
+          FT_TRACE4(( " hlineto" ));
+
+          if ( ( error = t1_builder_start_point( builder, x, y ) )
+                 != PSaux_Err_Ok )
+            goto Fail;
+
+          x += top[0];
+          goto Add_Line;
+
+        case op_hmoveto:
+          FT_TRACE4(( " hmoveto" ));
+
+          x += top[0];
+          if ( !decoder->flex_state )
+          {
+            if ( builder->parse_state == T1_Parse_Start )
+              goto Syntax_Error;
+            builder->parse_state = T1_Parse_Have_Moveto;
+          }
+          break;
+
+        case op_hvcurveto:
+          FT_TRACE4(( " hvcurveto" ));
+
+          if ( ( error = t1_builder_start_point( builder, x, y ) )
+                 != PSaux_Err_Ok                                   ||
+               ( error = t1_builder_check_points( builder, 3 ) )
+                 != PSaux_Err_Ok                                   )
+            goto Fail;
+
+          x += top[0];
+          t1_builder_add_point( builder, x, y, 0 );
+          x += top[1];
+          y += top[2];
+          t1_builder_add_point( builder, x, y, 0 );
+          y += top[3];
+          t1_builder_add_point( builder, x, y, 1 );
+          break;
+
+        case op_rlineto:
+          FT_TRACE4(( " rlineto" ));
+
+          if ( ( error = t1_builder_start_point( builder, x, y ) )
+                 != PSaux_Err_Ok )
+            goto Fail;
+
+          x += top[0];
+          y += top[1];
+
+        Add_Line:
+          if ( ( error = t1_builder_add_point1( builder, x, y ) )
+                 != PSaux_Err_Ok )
+            goto Fail;
+          break;
+
+        case op_rmoveto:
+          FT_TRACE4(( " rmoveto" ));
+
+          x += top[0];
+          y += top[1];
+          if ( !decoder->flex_state )
+          {
+            if ( builder->parse_state == T1_Parse_Start )
+              goto Syntax_Error;
+            builder->parse_state = T1_Parse_Have_Moveto;
+          }
+          break;
+
+        case op_rrcurveto:
+          FT_TRACE4(( " rrcurveto" ));
+
+          if ( ( error = t1_builder_start_point( builder, x, y ) )
+                 != PSaux_Err_Ok                                   ||
+               ( error = t1_builder_check_points( builder, 3 ) )
+                 != PSaux_Err_Ok                                   )
+            goto Fail;
+
+          x += top[0];
+          y += top[1];
+          t1_builder_add_point( builder, x, y, 0 );
+
+          x += top[2];
+          y += top[3];
+          t1_builder_add_point( builder, x, y, 0 );
+
+          x += top[4];
+          y += top[5];
+          t1_builder_add_point( builder, x, y, 1 );
+          break;
+
+        case op_vhcurveto:
+          FT_TRACE4(( " vhcurveto" ));
+
+          if ( ( error = t1_builder_start_point( builder, x, y ) )
+                 != PSaux_Err_Ok                                   ||
+               ( error = t1_builder_check_points( builder, 3 ) )
+                 != PSaux_Err_Ok                                   )
+            goto Fail;
+
+          y += top[0];
+          t1_builder_add_point( builder, x, y, 0 );
+          x += top[1];
+          y += top[2];
+          t1_builder_add_point( builder, x, y, 0 );
+          x += top[3];
+          t1_builder_add_point( builder, x, y, 1 );
+          break;
+
+        case op_vlineto:
+          FT_TRACE4(( " vlineto" ));
+
+          if ( ( error = t1_builder_start_point( builder, x, y ) )
+                 != PSaux_Err_Ok )
+            goto Fail;
+
+          y += top[0];
+          goto Add_Line;
+
+        case op_vmoveto:
+          FT_TRACE4(( " vmoveto" ));
+
+          y += top[0];
+          if ( !decoder->flex_state )
+          {
+            if ( builder->parse_state == T1_Parse_Start )
+              goto Syntax_Error;
+            builder->parse_state = T1_Parse_Have_Moveto;
+          }
+          break;
+
+        case op_div:
+          FT_TRACE4(( " div" ));
+
+          /* if `large_int' is set, we divide unscaled numbers; */
+          /* otherwise, we divide numbers in 16.16 format --    */
+          /* in both cases, it is the same operation            */
+          *top = FT_DivFix( top[0], top[1] );
+          ++top;
+
+          large_int = FALSE;
+          break;
+
+        case op_callsubr:
+          {
+            FT_Int  idx;
+
+
+            FT_TRACE4(( " callsubr" ));
+
+            idx = Fix2Int( top[0] );
+            if ( idx < 0 || idx >= (FT_Int)decoder->num_subrs )
+            {
+              FT_ERROR(( "t1_decoder_parse_charstrings:"
+                         " invalid subrs index\n" ));
+              goto Syntax_Error;
+            }
+
+            if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS )
+            {
+              FT_ERROR(( "t1_decoder_parse_charstrings:"
+                         " too many nested subrs\n" ));
+              goto Syntax_Error;
+            }
+
+            zone->cursor = ip;  /* save current instruction pointer */
+
+            zone++;
+
+            /* The Type 1 driver stores subroutines without the seed bytes. */
+            /* The CID driver stores subroutines with seed bytes.  This     */
+            /* case is taken care of when decoder->subrs_len == 0.          */
+            zone->base = decoder->subrs[idx];
+
+            if ( decoder->subrs_len )
+              zone->limit = zone->base + decoder->subrs_len[idx];
+            else
+            {
+              /* We are using subroutines from a CID font.  We must adjust */
+              /* for the seed bytes.                                       */
+              zone->base  += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 );
+              zone->limit  = decoder->subrs[idx + 1];
+            }
+
+            zone->cursor = zone->base;
+
+            if ( !zone->base )
+            {
+              FT_ERROR(( "t1_decoder_parse_charstrings:"
+                         " invoking empty subrs\n" ));
+              goto Syntax_Error;
+            }
+
+            decoder->zone = zone;
+            ip            = zone->base;
+            limit         = zone->limit;
+            break;
+          }
+
+        case op_pop:
+          FT_TRACE4(( " pop" ));
+
+          if ( known_othersubr_result_cnt > 0 )
+          {
+            known_othersubr_result_cnt--;
+            /* ignore, we pushed the operands ourselves */
+            break;
+          }
+
+          if ( unknown_othersubr_result_cnt == 0 )
+          {
+            FT_ERROR(( "t1_decoder_parse_charstrings:"
+                       " no more operands for othersubr\n" ));
+            goto Syntax_Error;
+          }
+
+          unknown_othersubr_result_cnt--;
+          top++;   /* `push' the operand to callothersubr onto the stack */
+          break;
+
+        case op_return:
+          FT_TRACE4(( " return" ));
+
+          if ( zone <= decoder->zones )
+          {
+            FT_ERROR(( "t1_decoder_parse_charstrings:"
+                       " unexpected return\n" ));
+            goto Syntax_Error;
+          }
+
+          zone--;
+          ip            = zone->cursor;
+          limit         = zone->limit;
+          decoder->zone = zone;
+          break;
+
+        case op_dotsection:
+          FT_TRACE4(( " dotsection" ));
+
+          break;
+
+        case op_hstem:
+          FT_TRACE4(( " hstem" ));
+
+          /* record horizontal hint */
+          if ( hinter )
+          {
+            /* top[0] += builder->left_bearing.y; */
+            hinter->stem( hinter->hints, 1, top );
+          }
+          break;
+
+        case op_hstem3:
+          FT_TRACE4(( " hstem3" ));
+
+          /* record horizontal counter-controlled hints */
+          if ( hinter )
+            hinter->stem3( hinter->hints, 1, top );
+          break;
+
+        case op_vstem:
+          FT_TRACE4(( " vstem" ));
+
+          /* record vertical hint */
+          if ( hinter )
+          {
+            top[0] += orig_x;
+            hinter->stem( hinter->hints, 0, top );
+          }
+          break;
+
+        case op_vstem3:
+          FT_TRACE4(( " vstem3" ));
+
+          /* record vertical counter-controlled hints */
+          if ( hinter )
+          {
+            FT_Pos  dx = orig_x;
+
+
+            top[0] += dx;
+            top[2] += dx;
+            top[4] += dx;
+            hinter->stem3( hinter->hints, 0, top );
+          }
+          break;
+
+        case op_setcurrentpoint:
+          FT_TRACE4(( " setcurrentpoint" ));
+
+          /* From the T1 specification, section 6.4:                */
+          /*                                                        */
+          /*   The setcurrentpoint command is used only in          */
+          /*   conjunction with results from OtherSubrs procedures. */
+
+          /* known_othersubr_result_cnt != 0 is already handled     */
+          /* above.                                                 */
+
+          /* Note, however, that both Ghostscript and Adobe         */
+          /* Distiller handle this situation by silently ignoring   */
+          /* the inappropriate `setcurrentpoint' instruction.  So   */
+          /* we do the same.                                        */
+#if 0
+
+          if ( decoder->flex_state != 1 )
+          {
+            FT_ERROR(( "t1_decoder_parse_charstrings:"
+                       " unexpected `setcurrentpoint'\n" ));
+            goto Syntax_Error;
+          }
+          else
+            ...
+#endif
+
+          x = top[0];
+          y = top[1];
+          decoder->flex_state = 0;
+          break;
+
+        case op_unknown15:
+          FT_TRACE4(( " opcode_15" ));
+          /* nothing to do except to pop the two arguments */
+          break;
+
+        default:
+          FT_ERROR(( "t1_decoder_parse_charstrings:"
+                     " unhandled opcode %d\n", op ));
+          goto Syntax_Error;
+        }
+
+        /* XXX Operators usually clear the operand stack;  */
+        /*     only div, callsubr, callothersubr, pop, and */
+        /*     return are different.                       */
+        /*     In practice it doesn't matter (?).          */
+
+        decoder->top = top;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        FT_TRACE4(( "\n" ));
+        bol = TRUE;
+#endif
+
+      } /* general operator processing */
+
+    } /* while ip < limit */
+
+    FT_TRACE4(( "..end..\n\n" ));
+
+  Fail:
+    return error;
+
+  Syntax_Error:
+    return PSaux_Err_Syntax_Error;
+
+  Stack_Underflow:
+    return PSaux_Err_Stack_Underflow;
+  }
+
+
+  /* parse a single Type 1 glyph */
+  FT_LOCAL_DEF( FT_Error )
+  t1_decoder_parse_glyph( T1_Decoder  decoder,
+                          FT_UInt     glyph )
+  {
+    return decoder->parse_callback( decoder, glyph );
+  }
+
+
+  /* initialize T1 decoder */
+  FT_LOCAL_DEF( FT_Error )
+  t1_decoder_init( T1_Decoder           decoder,
+                   FT_Face              face,
+                   FT_Size              size,
+                   FT_GlyphSlot         slot,
+                   FT_Byte**            glyph_names,
+                   PS_Blend             blend,
+                   FT_Bool              hinting,
+                   FT_Render_Mode       hint_mode,
+                   T1_Decoder_Callback  parse_callback )
+  {
+    FT_MEM_ZERO( decoder, sizeof ( *decoder ) );
+
+    /* retrieve PSNames interface from list of current modules */
+    {
+      FT_Service_PsCMaps  psnames = 0;
+
+
+      FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
+      if ( !psnames )
+      {
+        FT_ERROR(( "t1_decoder_init:"
+                   " the `psnames' module is not available\n" ));
+        return PSaux_Err_Unimplemented_Feature;
+      }
+
+      decoder->psnames = psnames;
+    }
+
+    t1_builder_init( &decoder->builder, face, size, slot, hinting );
+
+    /* decoder->buildchar and decoder->len_buildchar have to be  */
+    /* initialized by the caller since we cannot know the length */
+    /* of the BuildCharArray                                     */
+
+    decoder->num_glyphs     = (FT_UInt)face->num_glyphs;
+    decoder->glyph_names    = glyph_names;
+    decoder->hint_mode      = hint_mode;
+    decoder->blend          = blend;
+    decoder->parse_callback = parse_callback;
+
+    decoder->funcs          = t1_decoder_funcs;
+
+    return PSaux_Err_Ok;
+  }
+
+
+  /* finalize T1 decoder */
+  FT_LOCAL_DEF( void )
+  t1_decoder_done( T1_Decoder  decoder )
+  {
+    t1_builder_done( &decoder->builder );
+  }
+
+
+/* END */
diff --git a/src/psaux/t1decode.h b/src/psaux/t1decode.h
new file mode 100644 (file)
index 0000000..00728db
--- /dev/null
@@ -0,0 +1,64 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1decode.h                                                             */
+/*                                                                         */
+/*    PostScript Type 1 decoding routines (specification).                 */
+/*                                                                         */
+/*  Copyright 2000-2001, 2002, 2003 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1DECODE_H__
+#define __T1DECODE_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+#include FT_INTERNAL_TYPE1_TYPES_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_CALLBACK_TABLE
+  const T1_Decoder_FuncsRec  t1_decoder_funcs;
+
+
+  FT_LOCAL( FT_Error )
+  t1_decoder_parse_glyph( T1_Decoder  decoder,
+                          FT_UInt     glyph_index );
+
+  FT_LOCAL( FT_Error )
+  t1_decoder_parse_charstrings( T1_Decoder  decoder,
+                                FT_Byte*    base,
+                                FT_UInt     len );
+
+  FT_LOCAL( FT_Error )
+  t1_decoder_init( T1_Decoder           decoder,
+                   FT_Face              face,
+                   FT_Size              size,
+                   FT_GlyphSlot         slot,
+                   FT_Byte**            glyph_names,
+                   PS_Blend             blend,
+                   FT_Bool              hinting,
+                   FT_Render_Mode       hint_mode,
+                   T1_Decoder_Callback  parse_glyph );
+
+  FT_LOCAL( void )
+  t1_decoder_done( T1_Decoder  decoder );
+
+
+FT_END_HEADER
+
+#endif /* __T1DECODE_H__ */
+
+
+/* END */
diff --git a/src/pshinter/Jamfile b/src/pshinter/Jamfile
new file mode 100644 (file)
index 0000000..779f1b0
--- /dev/null
@@ -0,0 +1,29 @@
+# FreeType 2 src/pshinter Jamfile
+#
+# Copyright 2001, 2003 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) pshinter ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = pshrec pshglob pshalgo pshmod pshpic ;
+  }
+  else
+  {
+    _sources = pshinter ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/pshinter Jamfile
diff --git a/src/pshinter/module.mk b/src/pshinter/module.mk
new file mode 100644 (file)
index 0000000..ed24eb7
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# FreeType 2 PSHinter module definition
+#
+
+
+# Copyright 1996-2001, 2006 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.
+
+
+FTMODULE_H_COMMANDS += PSHINTER_MODULE
+
+define PSHINTER_MODULE
+$(OPEN_DRIVER) FT_Module_Class, pshinter_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)pshinter  $(ECHO_DRIVER_DESC)Postscript hinter module$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/src/pshinter/pshalgo.c b/src/pshinter/pshalgo.c
new file mode 100644 (file)
index 0000000..d798978
--- /dev/null
@@ -0,0 +1,2306 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshalgo.c                                                              */
+/*                                                                         */
+/*    PostScript hinting algorithm (body).                                 */
+/*                                                                         */
+/*  Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_CALC_H
+#include "pshalgo.h"
+
+#include "pshnterr.h"
+
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_pshalgo2
+
+
+#ifdef DEBUG_HINTER
+  PSH_Hint_Table  ps_debug_hint_table = 0;
+  PSH_HintFunc    ps_debug_hint_func  = 0;
+  PSH_Glyph       ps_debug_glyph      = 0;
+#endif
+
+
+#define  COMPUTE_INFLEXS  /* compute inflection points to optimize `S' */
+                          /* and similar glyphs                        */
+#define  STRONGER         /* slightly increase the contrast of smooth  */
+                          /* hinting                                   */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                  BASIC HINTS RECORDINGS                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* return true if two stem hints overlap */
+  static FT_Int
+  psh_hint_overlap( PSH_Hint  hint1,
+                    PSH_Hint  hint2 )
+  {
+    return hint1->org_pos + hint1->org_len >= hint2->org_pos &&
+           hint2->org_pos + hint2->org_len >= hint1->org_pos;
+  }
+
+
+  /* destroy hints table */
+  static void
+  psh_hint_table_done( PSH_Hint_Table  table,
+                       FT_Memory       memory )
+  {
+    FT_FREE( table->zones );
+    table->num_zones = 0;
+    table->zone      = 0;
+
+    FT_FREE( table->sort );
+    FT_FREE( table->hints );
+    table->num_hints   = 0;
+    table->max_hints   = 0;
+    table->sort_global = 0;
+  }
+
+
+  /* deactivate all hints in a table */
+  static void
+  psh_hint_table_deactivate( PSH_Hint_Table  table )
+  {
+    FT_UInt   count = table->max_hints;
+    PSH_Hint  hint  = table->hints;
+
+
+    for ( ; count > 0; count--, hint++ )
+    {
+      psh_hint_deactivate( hint );
+      hint->order = -1;
+    }
+  }
+
+
+  /* internal function to record a new hint */
+  static void
+  psh_hint_table_record( PSH_Hint_Table  table,
+                         FT_UInt         idx )
+  {
+    PSH_Hint  hint = table->hints + idx;
+
+
+    if ( idx >= table->max_hints )
+    {
+      FT_TRACE0(( "psh_hint_table_record: invalid hint index %d\n", idx ));
+      return;
+    }
+
+    /* ignore active hints */
+    if ( psh_hint_is_active( hint ) )
+      return;
+
+    psh_hint_activate( hint );
+
+    /* now scan the current active hint set to check */
+    /* whether `hint' overlaps with another hint     */
+    {
+      PSH_Hint*  sorted = table->sort_global;
+      FT_UInt    count  = table->num_hints;
+      PSH_Hint   hint2;
+
+
+      hint->parent = 0;
+      for ( ; count > 0; count--, sorted++ )
+      {
+        hint2 = sorted[0];
+
+        if ( psh_hint_overlap( hint, hint2 ) )
+        {
+          hint->parent = hint2;
+          break;
+        }
+      }
+    }
+
+    if ( table->num_hints < table->max_hints )
+      table->sort_global[table->num_hints++] = hint;
+    else
+      FT_TRACE0(( "psh_hint_table_record: too many sorted hints!  BUG!\n" ));
+  }
+
+
+  static void
+  psh_hint_table_record_mask( PSH_Hint_Table  table,
+                              PS_Mask         hint_mask )
+  {
+    FT_Int    mask = 0, val = 0;
+    FT_Byte*  cursor = hint_mask->bytes;
+    FT_UInt   idx, limit;
+
+
+    limit = hint_mask->num_bits;
+
+    for ( idx = 0; idx < limit; idx++ )
+    {
+      if ( mask == 0 )
+      {
+        val  = *cursor++;
+        mask = 0x80;
+      }
+
+      if ( val & mask )
+        psh_hint_table_record( table, idx );
+
+      mask >>= 1;
+    }
+  }
+
+
+  /* create hints table */
+  static FT_Error
+  psh_hint_table_init( PSH_Hint_Table  table,
+                       PS_Hint_Table   hints,
+                       PS_Mask_Table   hint_masks,
+                       PS_Mask_Table   counter_masks,
+                       FT_Memory       memory )
+  {
+    FT_UInt   count;
+    FT_Error  error;
+
+    FT_UNUSED( counter_masks );
+
+
+    count = hints->num_hints;
+
+    /* allocate our tables */
+    if ( FT_NEW_ARRAY( table->sort,  2 * count     ) ||
+         FT_NEW_ARRAY( table->hints,     count     ) ||
+         FT_NEW_ARRAY( table->zones, 2 * count + 1 ) )
+      goto Exit;
+
+    table->max_hints   = count;
+    table->sort_global = table->sort + count;
+    table->num_hints   = 0;
+    table->num_zones   = 0;
+    table->zone        = 0;
+
+    /* initialize the `table->hints' array */
+    {
+      PSH_Hint  write = table->hints;
+      PS_Hint   read  = hints->hints;
+
+
+      for ( ; count > 0; count--, write++, read++ )
+      {
+        write->org_pos = read->pos;
+        write->org_len = read->len;
+        write->flags   = read->flags;
+      }
+    }
+
+    /* we now need to determine the initial `parent' stems; first  */
+    /* activate the hints that are given by the initial hint masks */
+    if ( hint_masks )
+    {
+      PS_Mask  mask = hint_masks->masks;
+
+
+      count             = hint_masks->num_masks;
+      table->hint_masks = hint_masks;
+
+      for ( ; count > 0; count--, mask++ )
+        psh_hint_table_record_mask( table, mask );
+    }
+
+    /* finally, do a linear parse in case some hints were left alone */
+    if ( table->num_hints != table->max_hints )
+    {
+      FT_UInt  idx;
+
+
+      FT_TRACE0(( "psh_hint_table_init: missing/incorrect hint masks\n" ));
+
+      count = table->max_hints;
+      for ( idx = 0; idx < count; idx++ )
+        psh_hint_table_record( table, idx );
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static void
+  psh_hint_table_activate_mask( PSH_Hint_Table  table,
+                                PS_Mask         hint_mask )
+  {
+    FT_Int    mask = 0, val = 0;
+    FT_Byte*  cursor = hint_mask->bytes;
+    FT_UInt   idx, limit, count;
+
+
+    limit = hint_mask->num_bits;
+    count = 0;
+
+    psh_hint_table_deactivate( table );
+
+    for ( idx = 0; idx < limit; idx++ )
+    {
+      if ( mask == 0 )
+      {
+        val  = *cursor++;
+        mask = 0x80;
+      }
+
+      if ( val & mask )
+      {
+        PSH_Hint  hint = &table->hints[idx];
+
+
+        if ( !psh_hint_is_active( hint ) )
+        {
+          FT_UInt     count2;
+
+#if 0
+          PSH_Hint*  sort = table->sort;
+          PSH_Hint   hint2;
+
+
+          for ( count2 = count; count2 > 0; count2--, sort++ )
+          {
+            hint2 = sort[0];
+            if ( psh_hint_overlap( hint, hint2 ) )
+              FT_TRACE0(( "psh_hint_table_activate_mask:"
+                          " found overlapping hints\n" ))
+          }
+#else
+          count2 = 0;
+#endif
+
+          if ( count2 == 0 )
+          {
+            psh_hint_activate( hint );
+            if ( count < table->max_hints )
+              table->sort[count++] = hint;
+            else
+              FT_TRACE0(( "psh_hint_tableactivate_mask:"
+                          " too many active hints\n" ));
+          }
+        }
+      }
+
+      mask >>= 1;
+    }
+    table->num_hints = count;
+
+    /* now, sort the hints; they are guaranteed to not overlap */
+    /* so we can compare their "org_pos" field directly        */
+    {
+      FT_Int     i1, i2;
+      PSH_Hint   hint1, hint2;
+      PSH_Hint*  sort = table->sort;
+
+
+      /* a simple bubble sort will do, since in 99% of cases, the hints */
+      /* will be already sorted -- and the sort will be linear          */
+      for ( i1 = 1; i1 < (FT_Int)count; i1++ )
+      {
+        hint1 = sort[i1];
+        for ( i2 = i1 - 1; i2 >= 0; i2-- )
+        {
+          hint2 = sort[i2];
+
+          if ( hint2->org_pos < hint1->org_pos )
+            break;
+
+          sort[i2 + 1] = hint2;
+          sort[i2]     = hint1;
+        }
+      }
+    }
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****               HINTS GRID-FITTING AND OPTIMIZATION             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#if 1
+  static FT_Pos
+  psh_dimension_quantize_len( PSH_Dimension  dim,
+                              FT_Pos         len,
+                              FT_Bool        do_snapping )
+  {
+    if ( len <= 64 )
+      len = 64;
+    else
+    {
+      FT_Pos  delta = len - dim->stdw.widths[0].cur;
+
+
+      if ( delta < 0 )
+        delta = -delta;
+
+      if ( delta < 40 )
+      {
+        len = dim->stdw.widths[0].cur;
+        if ( len < 48 )
+          len = 48;
+      }
+
+      if ( len < 3 * 64 )
+      {
+        delta = ( len & 63 );
+        len  &= -64;
+
+        if ( delta < 10 )
+          len += delta;
+
+        else if ( delta < 32 )
+          len += 10;
+
+        else if ( delta < 54 )
+          len += 54;
+
+        else
+          len += delta;
+      }
+      else
+        len = FT_PIX_ROUND( len );
+    }
+
+    if ( do_snapping )
+      len = FT_PIX_ROUND( len );
+
+    return  len;
+  }
+#endif /* 0 */
+
+
+#ifdef DEBUG_HINTER
+
+  static void
+  ps_simple_scale( PSH_Hint_Table  table,
+                   FT_Fixed        scale,
+                   FT_Fixed        delta,
+                   FT_Int          dimension )
+  {
+    PSH_Hint  hint;
+    FT_UInt   count;
+
+
+    for ( count = 0; count < table->max_hints; count++ )
+    {
+      hint = table->hints + count;
+
+      hint->cur_pos = FT_MulFix( hint->org_pos, scale ) + delta;
+      hint->cur_len = FT_MulFix( hint->org_len, scale );
+
+      if ( ps_debug_hint_func )
+        ps_debug_hint_func( hint, dimension );
+    }
+  }
+
+#endif /* DEBUG_HINTER */
+
+
+  static FT_Fixed
+  psh_hint_snap_stem_side_delta( FT_Fixed  pos,
+                                 FT_Fixed  len )
+  {
+    FT_Fixed  delta1 = FT_PIX_ROUND( pos ) - pos;
+    FT_Fixed  delta2 = FT_PIX_ROUND( pos + len ) - pos - len;
+
+
+    if ( FT_ABS( delta1 ) <= FT_ABS( delta2 ) )
+      return delta1;
+    else
+      return delta2;
+  }
+
+
+  static void
+  psh_hint_align( PSH_Hint     hint,
+                  PSH_Globals  globals,
+                  FT_Int       dimension,
+                  PSH_Glyph    glyph )
+  {
+    PSH_Dimension  dim   = &globals->dimension[dimension];
+    FT_Fixed       scale = dim->scale_mult;
+    FT_Fixed       delta = dim->scale_delta;
+
+
+    if ( !psh_hint_is_fitted( hint ) )
+    {
+      FT_Pos  pos = FT_MulFix( hint->org_pos, scale ) + delta;
+      FT_Pos  len = FT_MulFix( hint->org_len, scale );
+
+      FT_Int            do_snapping;
+      FT_Pos            fit_len;
+      PSH_AlignmentRec  align;
+
+
+      /* ignore stem alignments when requested through the hint flags */
+      if ( ( dimension == 0 && !glyph->do_horz_hints ) ||
+           ( dimension == 1 && !glyph->do_vert_hints ) )
+      {
+        hint->cur_pos = pos;
+        hint->cur_len = len;
+
+        psh_hint_set_fitted( hint );
+        return;
+      }
+
+      /* perform stem snapping when requested - this is necessary
+       * for monochrome and LCD hinting modes only
+       */
+      do_snapping = ( dimension == 0 && glyph->do_horz_snapping ) ||
+                    ( dimension == 1 && glyph->do_vert_snapping );
+
+      hint->cur_len = fit_len = len;
+
+      /* check blue zones for horizontal stems */
+      align.align     = PSH_BLUE_ALIGN_NONE;
+      align.align_bot = align.align_top = 0;
+
+      if ( dimension == 1 )
+        psh_blues_snap_stem( &globals->blues,
+                             hint->org_pos + hint->org_len,
+                             hint->org_pos,
+                             &align );
+
+      switch ( align.align )
+      {
+      case PSH_BLUE_ALIGN_TOP:
+        /* the top of the stem is aligned against a blue zone */
+        hint->cur_pos = align.align_top - fit_len;
+        break;
+
+      case PSH_BLUE_ALIGN_BOT:
+        /* the bottom of the stem is aligned against a blue zone */
+        hint->cur_pos = align.align_bot;
+        break;
+
+      case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT:
+        /* both edges of the stem are aligned against blue zones */
+        hint->cur_pos = align.align_bot;
+        hint->cur_len = align.align_top - align.align_bot;
+        break;
+
+      default:
+        {
+          PSH_Hint  parent = hint->parent;
+
+
+          if ( parent )
+          {
+            FT_Pos  par_org_center, par_cur_center;
+            FT_Pos  cur_org_center, cur_delta;
+
+
+            /* ensure that parent is already fitted */
+            if ( !psh_hint_is_fitted( parent ) )
+              psh_hint_align( parent, globals, dimension, glyph );
+
+            /* keep original relation between hints, this is, use the */
+            /* scaled distance between the centers of the hints to    */
+            /* compute the new position                               */
+            par_org_center = parent->org_pos + ( parent->org_len >> 1 );
+            par_cur_center = parent->cur_pos + ( parent->cur_len >> 1 );
+            cur_org_center = hint->org_pos   + ( hint->org_len   >> 1 );
+
+            cur_delta = FT_MulFix( cur_org_center - par_org_center, scale );
+            pos       = par_cur_center + cur_delta - ( len >> 1 );
+          }
+
+          hint->cur_pos = pos;
+          hint->cur_len = fit_len;
+
+          /* Stem adjustment tries to snap stem widths to standard
+           * ones.  This is important to prevent unpleasant rounding
+           * artefacts.
+           */
+          if ( glyph->do_stem_adjust )
+          {
+            if ( len <= 64 )
+            {
+              /* the stem is less than one pixel; we will center it
+               * around the nearest pixel center
+               */
+              if ( len >= 32 )
+              {
+                /* This is a special case where we also widen the stem
+                 * and align it to the pixel grid.
+                 *
+                 *   stem_center          = pos + (len/2)
+                 *   nearest_pixel_center = FT_ROUND(stem_center-32)+32
+                 *   new_pos              = nearest_pixel_center-32
+                 *                        = FT_ROUND(stem_center-32)
+                 *                        = FT_FLOOR(stem_center-32+32)
+                 *                        = FT_FLOOR(stem_center)
+                 *   new_len              = 64
+                 */
+                pos = FT_PIX_FLOOR( pos + ( len >> 1 ) );
+                len = 64;
+              }
+              else if ( len > 0 )
+              {
+                /* This is a very small stem; we simply align it to the
+                 * pixel grid, trying to find the minimal displacement.
+                 *
+                 * left               = pos
+                 * right              = pos + len
+                 * left_nearest_edge  = ROUND(pos)
+                 * right_nearest_edge = ROUND(right)
+                 *
+                 * if ( ABS(left_nearest_edge - left) <=
+                 *      ABS(right_nearest_edge - right) )
+                 *    new_pos = left
+                 * else
+                 *    new_pos = right
+                 */
+                FT_Pos  left_nearest  = FT_PIX_ROUND( pos );
+                FT_Pos  right_nearest = FT_PIX_ROUND( pos + len );
+                FT_Pos  left_disp     = left_nearest - pos;
+                FT_Pos  right_disp    = right_nearest - ( pos + len );
+
+
+                if ( left_disp < 0 )
+                  left_disp = -left_disp;
+                if ( right_disp < 0 )
+                  right_disp = -right_disp;
+                if ( left_disp <= right_disp )
+                  pos = left_nearest;
+                else
+                  pos = right_nearest;
+              }
+              else
+              {
+                /* this is a ghost stem; we simply round it */
+                pos = FT_PIX_ROUND( pos );
+              }
+            }
+            else
+            {
+              len = psh_dimension_quantize_len( dim, len, 0 );
+            }
+          }
+
+          /* now that we have a good hinted stem width, try to position */
+          /* the stem along a pixel grid integer coordinate             */
+          hint->cur_pos = pos + psh_hint_snap_stem_side_delta( pos, len );
+          hint->cur_len = len;
+        }
+      }
+
+      if ( do_snapping )
+      {
+        pos = hint->cur_pos;
+        len = hint->cur_len;
+
+        if ( len < 64 )
+          len = 64;
+        else
+          len = FT_PIX_ROUND( len );
+
+        switch ( align.align )
+        {
+          case PSH_BLUE_ALIGN_TOP:
+            hint->cur_pos = align.align_top - len;
+            hint->cur_len = len;
+            break;
+
+          case PSH_BLUE_ALIGN_BOT:
+            hint->cur_len = len;
+            break;
+
+          case PSH_BLUE_ALIGN_BOT | PSH_BLUE_ALIGN_TOP:
+            /* don't touch */
+            break;
+
+
+          default:
+            hint->cur_len = len;
+            if ( len & 64 )
+              pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ) + 32;
+            else
+              pos = FT_PIX_ROUND( pos + ( len >> 1 ) );
+
+            hint->cur_pos = pos - ( len >> 1 );
+            hint->cur_len = len;
+        }
+      }
+
+      psh_hint_set_fitted( hint );
+
+#ifdef DEBUG_HINTER
+      if ( ps_debug_hint_func )
+        ps_debug_hint_func( hint, dimension );
+#endif
+    }
+  }
+
+
+#if 0  /* not used for now, experimental */
+
+ /*
+  *  A variant to perform "light" hinting (i.e. FT_RENDER_MODE_LIGHT)
+  *  of stems
+  */
+  static void
+  psh_hint_align_light( PSH_Hint     hint,
+                        PSH_Globals  globals,
+                        FT_Int       dimension,
+                        PSH_Glyph    glyph )
+  {
+    PSH_Dimension  dim   = &globals->dimension[dimension];
+    FT_Fixed       scale = dim->scale_mult;
+    FT_Fixed       delta = dim->scale_delta;
+
+
+    if ( !psh_hint_is_fitted( hint ) )
+    {
+      FT_Pos  pos = FT_MulFix( hint->org_pos, scale ) + delta;
+      FT_Pos  len = FT_MulFix( hint->org_len, scale );
+
+      FT_Pos  fit_len;
+
+      PSH_AlignmentRec  align;
+
+
+      /* ignore stem alignments when requested through the hint flags */
+      if ( ( dimension == 0 && !glyph->do_horz_hints ) ||
+           ( dimension == 1 && !glyph->do_vert_hints ) )
+      {
+        hint->cur_pos = pos;
+        hint->cur_len = len;
+
+        psh_hint_set_fitted( hint );
+        return;
+      }
+
+      fit_len = len;
+
+      hint->cur_len = fit_len;
+
+      /* check blue zones for horizontal stems */
+      align.align = PSH_BLUE_ALIGN_NONE;
+      align.align_bot = align.align_top = 0;
+
+      if ( dimension == 1 )
+        psh_blues_snap_stem( &globals->blues,
+                             hint->org_pos + hint->org_len,
+                             hint->org_pos,
+                             &align );
+
+      switch ( align.align )
+      {
+      case PSH_BLUE_ALIGN_TOP:
+        /* the top of the stem is aligned against a blue zone */
+        hint->cur_pos = align.align_top - fit_len;
+        break;
+
+      case PSH_BLUE_ALIGN_BOT:
+        /* the bottom of the stem is aligned against a blue zone */
+        hint->cur_pos = align.align_bot;
+        break;
+
+      case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT:
+        /* both edges of the stem are aligned against blue zones */
+        hint->cur_pos = align.align_bot;
+        hint->cur_len = align.align_top - align.align_bot;
+        break;
+
+      default:
+        {
+          PSH_Hint  parent = hint->parent;
+
+
+          if ( parent )
+          {
+            FT_Pos  par_org_center, par_cur_center;
+            FT_Pos  cur_org_center, cur_delta;
+
+
+            /* ensure that parent is already fitted */
+            if ( !psh_hint_is_fitted( parent ) )
+              psh_hint_align_light( parent, globals, dimension, glyph );
+
+            par_org_center = parent->org_pos + ( parent->org_len / 2 );
+            par_cur_center = parent->cur_pos + ( parent->cur_len / 2 );
+            cur_org_center = hint->org_pos   + ( hint->org_len   / 2 );
+
+            cur_delta = FT_MulFix( cur_org_center - par_org_center, scale );
+            pos       = par_cur_center + cur_delta - ( len >> 1 );
+          }
+
+          /* Stems less than one pixel wide are easy -- we want to
+           * make them as dark as possible, so they must fall within
+           * one pixel.  If the stem is split between two pixels
+           * then snap the edge that is nearer to the pixel boundary
+           * to the pixel boundary.
+           */
+          if ( len <= 64 )
+          {
+            if ( ( pos + len + 63 ) / 64  != pos / 64 + 1 )
+              pos += psh_hint_snap_stem_side_delta ( pos, len );
+          }
+
+          /* Position stems other to minimize the amount of mid-grays.
+           * There are, in general, two positions that do this,
+           * illustrated as A) and B) below.
+           *
+           *   +                   +                   +                   +
+           *
+           * A)             |--------------------------------|
+           * B)   |--------------------------------|
+           * C)       |--------------------------------|
+           *
+           * Position A) (split the excess stem equally) should be better
+           * for stems of width N + f where f < 0.5.
+           *
+           * Position B) (split the deficiency equally) should be better
+           * for stems of width N + f where f > 0.5.
+           *
+           * It turns out though that minimizing the total number of lit
+           * pixels is also important, so position C), with one edge
+           * aligned with a pixel boundary is actually preferable
+           * to A).  There are also more possibile positions for C) than
+           * for A) or B), so it involves less distortion of the overall
+           * character shape.
+           */
+          else /* len > 64 */
+          {
+            FT_Fixed  frac_len = len & 63;
+            FT_Fixed  center = pos + ( len >> 1 );
+            FT_Fixed  delta_a, delta_b;
+
+
+            if ( ( len / 64 ) & 1 )
+            {
+              delta_a = FT_PIX_FLOOR( center ) + 32 - center;
+              delta_b = FT_PIX_ROUND( center ) - center;
+            }
+            else
+            {
+              delta_a = FT_PIX_ROUND( center ) - center;
+              delta_b = FT_PIX_FLOOR( center ) + 32 - center;
+            }
+
+            /* We choose between B) and C) above based on the amount
+             * of fractinal stem width; for small amounts, choose
+             * C) always, for large amounts, B) always, and inbetween,
+             * pick whichever one involves less stem movement.
+             */
+            if ( frac_len < 32 )
+            {
+              pos += psh_hint_snap_stem_side_delta ( pos, len );
+            }
+            else if ( frac_len < 48 )
+            {
+              FT_Fixed  side_delta = psh_hint_snap_stem_side_delta ( pos,
+                                                                     len );
+
+              if ( FT_ABS( side_delta ) < FT_ABS( delta_b ) )
+                pos += side_delta;
+              else
+                pos += delta_b;
+            }
+            else
+            {
+              pos += delta_b;
+            }
+          }
+
+          hint->cur_pos = pos;
+        }
+      }  /* switch */
+
+      psh_hint_set_fitted( hint );
+
+#ifdef DEBUG_HINTER
+      if ( ps_debug_hint_func )
+        ps_debug_hint_func( hint, dimension );
+#endif
+    }
+  }
+
+#endif /* 0 */
+
+
+  static void
+  psh_hint_table_align_hints( PSH_Hint_Table  table,
+                              PSH_Globals     globals,
+                              FT_Int          dimension,
+                              PSH_Glyph       glyph )
+  {
+    PSH_Hint       hint;
+    FT_UInt        count;
+
+#ifdef DEBUG_HINTER
+
+    PSH_Dimension  dim   = &globals->dimension[dimension];
+    FT_Fixed       scale = dim->scale_mult;
+    FT_Fixed       delta = dim->scale_delta;
+
+
+    if ( ps_debug_no_vert_hints && dimension == 0 )
+    {
+      ps_simple_scale( table, scale, delta, dimension );
+      return;
+    }
+
+    if ( ps_debug_no_horz_hints && dimension == 1 )
+    {
+      ps_simple_scale( table, scale, delta, dimension );
+      return;
+    }
+
+#endif /* DEBUG_HINTER*/
+
+    hint  = table->hints;
+    count = table->max_hints;
+
+    for ( ; count > 0; count--, hint++ )
+      psh_hint_align( hint, globals, dimension, glyph );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                POINTS INTERPOLATION ROUTINES                  *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define PSH_ZONE_MIN  -3200000L
+#define PSH_ZONE_MAX  +3200000L
+
+#define xxDEBUG_ZONES
+
+
+#ifdef DEBUG_ZONES
+
+#include FT_CONFIG_STANDARD_LIBRARY_H
+
+  static void
+  psh_print_zone( PSH_Zone  zone )
+  {
+    printf( "zone [scale,delta,min,max] = [%.3f,%.3f,%d,%d]\n",
+             zone->scale / 65536.0,
+             zone->delta / 64.0,
+             zone->min,
+             zone->max );
+  }
+
+#else
+
+#define psh_print_zone( x )  do { } while ( 0 )
+
+#endif /* DEBUG_ZONES */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    HINTER GLYPH MANAGEMENT                    *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#if 1
+
+#define  psh_corner_is_flat      ft_corner_is_flat
+#define  psh_corner_orientation  ft_corner_orientation
+
+#else
+
+  FT_LOCAL_DEF( FT_Int )
+  psh_corner_is_flat( FT_Pos  x_in,
+                      FT_Pos  y_in,
+                      FT_Pos  x_out,
+                      FT_Pos  y_out )
+  {
+    FT_Pos  ax = x_in;
+    FT_Pos  ay = y_in;
+
+    FT_Pos  d_in, d_out, d_corner;
+
+
+    if ( ax < 0 )
+      ax = -ax;
+    if ( ay < 0 )
+      ay = -ay;
+    d_in = ax + ay;
+
+    ax = x_out;
+    if ( ax < 0 )
+      ax = -ax;
+    ay = y_out;
+    if ( ay < 0 )
+      ay = -ay;
+    d_out = ax + ay;
+
+    ax = x_out + x_in;
+    if ( ax < 0 )
+      ax = -ax;
+    ay = y_out + y_in;
+    if ( ay < 0 )
+      ay = -ay;
+    d_corner = ax + ay;
+
+    return ( d_in + d_out - d_corner ) < ( d_corner >> 4 );
+  }
+
+  static FT_Int
+  psh_corner_orientation( FT_Pos  in_x,
+                          FT_Pos  in_y,
+                          FT_Pos  out_x,
+                          FT_Pos  out_y )
+  {
+    FT_Int  result;
+
+
+    /* deal with the trivial cases quickly */
+    if ( in_y == 0 )
+    {
+      if ( in_x >= 0 )
+        result = out_y;
+      else
+        result = -out_y;
+    }
+    else if ( in_x == 0 )
+    {
+      if ( in_y >= 0 )
+        result = -out_x;
+      else
+        result = out_x;
+    }
+    else if ( out_y == 0 )
+    {
+      if ( out_x >= 0 )
+        result = in_y;
+      else
+        result = -in_y;
+    }
+    else if ( out_x == 0 )
+    {
+      if ( out_y >= 0 )
+        result = -in_x;
+      else
+        result =  in_x;
+    }
+    else /* general case */
+    {
+      long long  delta = (long long)in_x * out_y - (long long)in_y * out_x;
+
+      if ( delta == 0 )
+        result = 0;
+      else
+        result = 1 - 2 * ( delta < 0 );
+    }
+
+    return result;
+  }
+
+#endif /* !1 */
+
+
+#ifdef COMPUTE_INFLEXS
+
+  /* compute all inflex points in a given glyph */
+  static void
+  psh_glyph_compute_inflections( PSH_Glyph  glyph )
+  {
+    FT_UInt  n;
+
+
+    for ( n = 0; n < glyph->num_contours; n++ )
+    {
+      PSH_Point  first, start, end, before, after;
+      FT_Pos     in_x, in_y, out_x, out_y;
+      FT_Int     orient_prev, orient_cur;
+      FT_Int     finished = 0;
+
+
+      /* we need at least 4 points to create an inflection point */
+      if ( glyph->contours[n].count < 4 )
+        continue;
+
+      /* compute first segment in contour */
+      first = glyph->contours[n].start;
+
+      start = end = first;
+      do
+      {
+        end = end->next;
+        if ( end == first )
+          goto Skip;
+
+        in_x = end->org_u - start->org_u;
+        in_y = end->org_v - start->org_v;
+
+      } while ( in_x == 0 && in_y == 0 );
+
+      /* extend the segment start whenever possible */
+      before = start;
+      do
+      {
+        do
+        {
+          start  = before;
+          before = before->prev;
+          if ( before == first )
+            goto Skip;
+
+          out_x = start->org_u - before->org_u;
+          out_y = start->org_v - before->org_v;
+
+        } while ( out_x == 0 && out_y == 0 );
+
+        orient_prev = psh_corner_orientation( in_x, in_y, out_x, out_y );
+
+      } while ( orient_prev == 0 );
+
+      first = start;
+      in_x  = out_x;
+      in_y  = out_y;
+
+      /* now, process all segments in the contour */
+      do
+      {
+        /* first, extend current segment's end whenever possible */
+        after = end;
+        do
+        {
+          do
+          {
+            end   = after;
+            after = after->next;
+            if ( after == first )
+              finished = 1;
+
+            out_x = after->org_u - end->org_u;
+            out_y = after->org_v - end->org_v;
+
+          } while ( out_x == 0 && out_y == 0 );
+
+          orient_cur = psh_corner_orientation( in_x, in_y, out_x, out_y );
+
+        } while ( orient_cur == 0 );
+
+        if ( ( orient_cur ^ orient_prev ) < 0 )
+        {
+          do
+          {
+            psh_point_set_inflex( start );
+            start = start->next;
+          }
+          while ( start != end );
+
+          psh_point_set_inflex( start );
+        }
+
+        start       = end;
+        end         = after;
+        orient_prev = orient_cur;
+        in_x        = out_x;
+        in_y        = out_y;
+
+      } while ( !finished );
+
+    Skip:
+      ;
+    }
+  }
+
+#endif /* COMPUTE_INFLEXS */
+
+
+  static void
+  psh_glyph_done( PSH_Glyph  glyph )
+  {
+    FT_Memory  memory = glyph->memory;
+
+
+    psh_hint_table_done( &glyph->hint_tables[1], memory );
+    psh_hint_table_done( &glyph->hint_tables[0], memory );
+
+    FT_FREE( glyph->points );
+    FT_FREE( glyph->contours );
+
+    glyph->num_points   = 0;
+    glyph->num_contours = 0;
+
+    glyph->memory = 0;
+  }
+
+
+  static int
+  psh_compute_dir( FT_Pos  dx,
+                   FT_Pos  dy )
+  {
+    FT_Pos  ax, ay;
+    int     result = PSH_DIR_NONE;
+
+
+    ax = ( dx >= 0 ) ? dx : -dx;
+    ay = ( dy >= 0 ) ? dy : -dy;
+
+    if ( ay * 12 < ax )
+    {
+      /* |dy| <<< |dx|  means a near-horizontal segment */
+      result = ( dx >= 0 ) ? PSH_DIR_RIGHT : PSH_DIR_LEFT;
+    }
+    else if ( ax * 12 < ay )
+    {
+      /* |dx| <<< |dy|  means a near-vertical segment */
+      result = ( dy >= 0 ) ? PSH_DIR_UP : PSH_DIR_DOWN;
+    }
+
+    return result;
+  }
+
+
+  /* load outline point coordinates into hinter glyph */
+  static void
+  psh_glyph_load_points( PSH_Glyph  glyph,
+                         FT_Int     dimension )
+  {
+    FT_Vector*  vec   = glyph->outline->points;
+    PSH_Point   point = glyph->points;
+    FT_UInt     count = glyph->num_points;
+
+
+    for ( ; count > 0; count--, point++, vec++ )
+    {
+      point->flags2 = 0;
+      point->hint   = NULL;
+      if ( dimension == 0 )
+      {
+        point->org_u = vec->x;
+        point->org_v = vec->y;
+      }
+      else
+      {
+        point->org_u = vec->y;
+        point->org_v = vec->x;
+      }
+
+#ifdef DEBUG_HINTER
+      point->org_x = vec->x;
+      point->org_y = vec->y;
+#endif
+
+    }
+  }
+
+
+  /* save hinted point coordinates back to outline */
+  static void
+  psh_glyph_save_points( PSH_Glyph  glyph,
+                         FT_Int     dimension )
+  {
+    FT_UInt     n;
+    PSH_Point   point = glyph->points;
+    FT_Vector*  vec   = glyph->outline->points;
+    char*       tags  = glyph->outline->tags;
+
+
+    for ( n = 0; n < glyph->num_points; n++ )
+    {
+      if ( dimension == 0 )
+        vec[n].x = point->cur_u;
+      else
+        vec[n].y = point->cur_u;
+
+      if ( psh_point_is_strong( point ) )
+        tags[n] |= (char)( ( dimension == 0 ) ? 32 : 64 );
+
+#ifdef DEBUG_HINTER
+
+      if ( dimension == 0 )
+      {
+        point->cur_x   = point->cur_u;
+        point->flags_x = point->flags2 | point->flags;
+      }
+      else
+      {
+        point->cur_y   = point->cur_u;
+        point->flags_y = point->flags2 | point->flags;
+      }
+
+#endif
+
+      point++;
+    }
+  }
+
+
+  static FT_Error
+  psh_glyph_init( PSH_Glyph    glyph,
+                  FT_Outline*  outline,
+                  PS_Hints     ps_hints,
+                  PSH_Globals  globals )
+  {
+    FT_Error   error;
+    FT_Memory  memory;
+
+
+    /* clear all fields */
+    FT_MEM_ZERO( glyph, sizeof ( *glyph ) );
+
+    memory = glyph->memory = globals->memory;
+
+    /* allocate and setup points + contours arrays */
+    if ( FT_NEW_ARRAY( glyph->points,   outline->n_points   ) ||
+         FT_NEW_ARRAY( glyph->contours, outline->n_contours ) )
+      goto Exit;
+
+    glyph->num_points   = outline->n_points;
+    glyph->num_contours = outline->n_contours;
+
+    {
+      FT_UInt      first = 0, next, n;
+      PSH_Point    points  = glyph->points;
+      PSH_Contour  contour = glyph->contours;
+
+
+      for ( n = 0; n < glyph->num_contours; n++ )
+      {
+        FT_Int     count;
+        PSH_Point  point;
+
+
+        next  = outline->contours[n] + 1;
+        count = next - first;
+
+        contour->start = points + first;
+        contour->count = (FT_UInt)count;
+
+        if ( count > 0 )
+        {
+          point = points + first;
+
+          point->prev    = points + next - 1;
+          point->contour = contour;
+
+          for ( ; count > 1; count-- )
+          {
+            point[0].next = point + 1;
+            point[1].prev = point;
+            point++;
+            point->contour = contour;
+          }
+          point->next = points + first;
+        }
+
+        contour++;
+        first = next;
+      }
+    }
+
+    {
+      PSH_Point   points = glyph->points;
+      PSH_Point   point  = points;
+      FT_Vector*  vec    = outline->points;
+      FT_UInt     n;
+
+
+      for ( n = 0; n < glyph->num_points; n++, point++ )
+      {
+        FT_Int  n_prev = (FT_Int)( point->prev - points );
+        FT_Int  n_next = (FT_Int)( point->next - points );
+        FT_Pos  dxi, dyi, dxo, dyo;
+
+
+        if ( !( outline->tags[n] & FT_CURVE_TAG_ON ) )
+          point->flags = PSH_POINT_OFF;
+
+        dxi = vec[n].x - vec[n_prev].x;
+        dyi = vec[n].y - vec[n_prev].y;
+
+        point->dir_in = (FT_Char)psh_compute_dir( dxi, dyi );
+
+        dxo = vec[n_next].x - vec[n].x;
+        dyo = vec[n_next].y - vec[n].y;
+
+        point->dir_out = (FT_Char)psh_compute_dir( dxo, dyo );
+
+        /* detect smooth points */
+        if ( point->flags & PSH_POINT_OFF )
+          point->flags |= PSH_POINT_SMOOTH;
+
+        else if ( point->dir_in == point->dir_out )
+        {
+          if ( point->dir_out != PSH_DIR_NONE           ||
+               psh_corner_is_flat( dxi, dyi, dxo, dyo ) )
+            point->flags |= PSH_POINT_SMOOTH;
+        }
+      }
+    }
+
+    glyph->outline = outline;
+    glyph->globals = globals;
+
+#ifdef COMPUTE_INFLEXS
+    psh_glyph_load_points( glyph, 0 );
+    psh_glyph_compute_inflections( glyph );
+#endif /* COMPUTE_INFLEXS */
+
+    /* now deal with hints tables */
+    error = psh_hint_table_init( &glyph->hint_tables [0],
+                                 &ps_hints->dimension[0].hints,
+                                 &ps_hints->dimension[0].masks,
+                                 &ps_hints->dimension[0].counters,
+                                 memory );
+    if ( error )
+      goto Exit;
+
+    error = psh_hint_table_init( &glyph->hint_tables [1],
+                                 &ps_hints->dimension[1].hints,
+                                 &ps_hints->dimension[1].masks,
+                                 &ps_hints->dimension[1].counters,
+                                 memory );
+    if ( error )
+      goto Exit;
+
+  Exit:
+    return error;
+  }
+
+
+  /* compute all extrema in a glyph for a given dimension */
+  static void
+  psh_glyph_compute_extrema( PSH_Glyph  glyph )
+  {
+    FT_UInt  n;
+
+
+    /* first of all, compute all local extrema */
+    for ( n = 0; n < glyph->num_contours; n++ )
+    {
+      PSH_Point  first = glyph->contours[n].start;
+      PSH_Point  point, before, after;
+
+
+      if ( glyph->contours[n].count == 0 )
+        continue;
+
+      point  = first;
+      before = point;
+      after  = point;
+
+      do
+      {
+        before = before->prev;
+        if ( before == first )
+          goto Skip;
+
+      } while ( before->org_u == point->org_u );
+
+      first = point = before->next;
+
+      for (;;)
+      {
+        after = point;
+        do
+        {
+          after = after->next;
+          if ( after == first )
+            goto Next;
+
+        } while ( after->org_u == point->org_u );
+
+        if ( before->org_u < point->org_u )
+        {
+          if ( after->org_u < point->org_u )
+          {
+            /* local maximum */
+            goto Extremum;
+          }
+        }
+        else /* before->org_u > point->org_u */
+        {
+          if ( after->org_u > point->org_u )
+          {
+            /* local minimum */
+          Extremum:
+            do
+            {
+              psh_point_set_extremum( point );
+              point = point->next;
+
+            } while ( point != after );
+          }
+        }
+
+        before = after->prev;
+        point  = after;
+
+      } /* for  */
+
+    Next:
+      ;
+    }
+
+    /* for each extremum, determine its direction along the */
+    /* orthogonal axis                                      */
+    for ( n = 0; n < glyph->num_points; n++ )
+    {
+      PSH_Point  point, before, after;
+
+
+      point  = &glyph->points[n];
+      before = point;
+      after  = point;
+
+      if ( psh_point_is_extremum( point ) )
+      {
+        do
+        {
+          before = before->prev;
+          if ( before == point )
+            goto Skip;
+
+        } while ( before->org_v == point->org_v );
+
+        do
+        {
+          after = after->next;
+          if ( after == point )
+            goto Skip;
+
+        } while ( after->org_v == point->org_v );
+      }
+
+      if ( before->org_v < point->org_v &&
+           after->org_v  > point->org_v )
+      {
+        psh_point_set_positive( point );
+      }
+      else if ( before->org_v > point->org_v &&
+                after->org_v  < point->org_v )
+      {
+        psh_point_set_negative( point );
+      }
+
+    Skip:
+      ;
+    }
+  }
+
+
+  /* major_dir is the direction for points on the bottom/left of the stem; */
+  /* Points on the top/right of the stem will have a direction of          */
+  /* -major_dir.                                                           */
+
+  static void
+  psh_hint_table_find_strong_points( PSH_Hint_Table  table,
+                                     PSH_Point       point,
+                                     FT_UInt         count,
+                                     FT_Int          threshold,
+                                     FT_Int          major_dir )
+  {
+    PSH_Hint*  sort      = table->sort;
+    FT_UInt    num_hints = table->num_hints;
+
+
+    for ( ; count > 0; count--, point++ )
+    {
+      FT_Int  point_dir = 0;
+      FT_Pos  org_u     = point->org_u;
+
+
+      if ( psh_point_is_strong( point ) )
+        continue;
+
+      if ( PSH_DIR_COMPARE( point->dir_in, major_dir ) )
+        point_dir = point->dir_in;
+
+      else if ( PSH_DIR_COMPARE( point->dir_out, major_dir ) )
+        point_dir = point->dir_out;
+
+      if ( point_dir )
+      {
+        if ( point_dir == major_dir )
+        {
+          FT_UInt  nn;
+
+
+          for ( nn = 0; nn < num_hints; nn++ )
+          {
+            PSH_Hint  hint = sort[nn];
+            FT_Pos    d    = org_u - hint->org_pos;
+
+
+            if ( d < threshold && -d < threshold )
+            {
+              psh_point_set_strong( point );
+              point->flags2 |= PSH_POINT_EDGE_MIN;
+              point->hint    = hint;
+              break;
+            }
+          }
+        }
+        else if ( point_dir == -major_dir )
+        {
+          FT_UInt  nn;
+
+
+          for ( nn = 0; nn < num_hints; nn++ )
+          {
+            PSH_Hint  hint = sort[nn];
+            FT_Pos    d    = org_u - hint->org_pos - hint->org_len;
+
+
+            if ( d < threshold && -d < threshold )
+            {
+              psh_point_set_strong( point );
+              point->flags2 |= PSH_POINT_EDGE_MAX;
+              point->hint    = hint;
+              break;
+            }
+          }
+        }
+      }
+
+#if 1
+      else if ( psh_point_is_extremum( point ) )
+      {
+        /* treat extrema as special cases for stem edge alignment */
+        FT_UInt  nn, min_flag, max_flag;
+
+
+        if ( major_dir == PSH_DIR_HORIZONTAL )
+        {
+          min_flag = PSH_POINT_POSITIVE;
+          max_flag = PSH_POINT_NEGATIVE;
+        }
+        else
+        {
+          min_flag = PSH_POINT_NEGATIVE;
+          max_flag = PSH_POINT_POSITIVE;
+        }
+
+        if ( point->flags2 & min_flag )
+        {
+          for ( nn = 0; nn < num_hints; nn++ )
+          {
+            PSH_Hint  hint = sort[nn];
+            FT_Pos    d    = org_u - hint->org_pos;
+
+
+            if ( d < threshold && -d < threshold )
+            {
+              point->flags2 |= PSH_POINT_EDGE_MIN;
+              point->hint    = hint;
+              psh_point_set_strong( point );
+              break;
+            }
+          }
+        }
+        else if ( point->flags2 & max_flag )
+        {
+          for ( nn = 0; nn < num_hints; nn++ )
+          {
+            PSH_Hint  hint = sort[nn];
+            FT_Pos    d    = org_u - hint->org_pos - hint->org_len;
+
+
+            if ( d < threshold && -d < threshold )
+            {
+              point->flags2 |= PSH_POINT_EDGE_MAX;
+              point->hint    = hint;
+              psh_point_set_strong( point );
+              break;
+            }
+          }
+        }
+
+        if ( point->hint == NULL )
+        {
+          for ( nn = 0; nn < num_hints; nn++ )
+          {
+            PSH_Hint  hint = sort[nn];
+
+
+            if ( org_u >= hint->org_pos                 &&
+                org_u <= hint->org_pos + hint->org_len )
+            {
+              point->hint = hint;
+              break;
+            }
+          }
+        }
+      }
+
+#endif /* 1 */
+    }
+  }
+
+
+  /* the accepted shift for strong points in fractional pixels */
+#define PSH_STRONG_THRESHOLD  32
+
+  /* the maximum shift value in font units */
+#define PSH_STRONG_THRESHOLD_MAXIMUM  30
+
+
+  /* find strong points in a glyph */
+  static void
+  psh_glyph_find_strong_points( PSH_Glyph  glyph,
+                                FT_Int     dimension )
+  {
+    /* a point is `strong' if it is located on a stem edge and       */
+    /* has an `in' or `out' tangent parallel to the hint's direction */
+
+    PSH_Hint_Table  table     = &glyph->hint_tables[dimension];
+    PS_Mask         mask      = table->hint_masks->masks;
+    FT_UInt         num_masks = table->hint_masks->num_masks;
+    FT_UInt         first     = 0;
+    FT_Int          major_dir = dimension == 0 ? PSH_DIR_VERTICAL
+                                               : PSH_DIR_HORIZONTAL;
+    PSH_Dimension   dim       = &glyph->globals->dimension[dimension];
+    FT_Fixed        scale     = dim->scale_mult;
+    FT_Int          threshold;
+
+
+    threshold = (FT_Int)FT_DivFix( PSH_STRONG_THRESHOLD, scale );
+    if ( threshold > PSH_STRONG_THRESHOLD_MAXIMUM )
+      threshold = PSH_STRONG_THRESHOLD_MAXIMUM;
+
+    /* process secondary hints to `selected' points */
+    if ( num_masks > 1 && glyph->num_points > 0 )
+    {
+      /* the `endchar' op can reduce the number of points */
+      first = mask->end_point > glyph->num_points
+                ? glyph->num_points
+                : mask->end_point;
+      mask++;
+      for ( ; num_masks > 1; num_masks--, mask++ )
+      {
+        FT_UInt  next;
+        FT_Int   count;
+
+
+        next  = mask->end_point > glyph->num_points
+                  ? glyph->num_points
+                  : mask->end_point;
+        count = next - first;
+        if ( count > 0 )
+        {
+          PSH_Point  point = glyph->points + first;
+
+
+          psh_hint_table_activate_mask( table, mask );
+
+          psh_hint_table_find_strong_points( table, point, count,
+                                             threshold, major_dir );
+        }
+        first = next;
+      }
+    }
+
+    /* process primary hints for all points */
+    if ( num_masks == 1 )
+    {
+      FT_UInt    count = glyph->num_points;
+      PSH_Point  point = glyph->points;
+
+
+      psh_hint_table_activate_mask( table, table->hint_masks->masks );
+
+      psh_hint_table_find_strong_points( table, point, count,
+                                         threshold, major_dir );
+    }
+
+    /* now, certain points may have been attached to a hint and */
+    /* not marked as strong; update their flags then            */
+    {
+      FT_UInt    count = glyph->num_points;
+      PSH_Point  point = glyph->points;
+
+
+      for ( ; count > 0; count--, point++ )
+        if ( point->hint && !psh_point_is_strong( point ) )
+          psh_point_set_strong( point );
+    }
+  }
+
+
+  /* find points in a glyph which are in a blue zone and have `in' or */
+  /* `out' tangents parallel to the horizontal axis                   */
+  static void
+  psh_glyph_find_blue_points( PSH_Blues  blues,
+                              PSH_Glyph  glyph )
+  {
+    PSH_Blue_Table  table;
+    PSH_Blue_Zone   zone;
+    FT_UInt         glyph_count = glyph->num_points;
+    FT_UInt         blue_count;
+    PSH_Point       point = glyph->points;
+
+
+    for ( ; glyph_count > 0; glyph_count--, point++ )
+    {
+      FT_Pos  y;
+
+
+      /* check tangents */
+      if ( !PSH_DIR_COMPARE( point->dir_in,  PSH_DIR_HORIZONTAL ) &&
+           !PSH_DIR_COMPARE( point->dir_out, PSH_DIR_HORIZONTAL ) )
+        continue;
+
+      /* skip strong points */
+      if ( psh_point_is_strong( point ) )
+        continue;
+
+      y = point->org_u;
+
+      /* look up top zones */
+      table      = &blues->normal_top;
+      blue_count = table->count;
+      zone       = table->zones;
+
+      for ( ; blue_count > 0; blue_count--, zone++ )
+      {
+        FT_Pos  delta = y - zone->org_bottom;
+
+
+        if ( delta < -blues->blue_fuzz )
+          break;
+
+        if ( y <= zone->org_top + blues->blue_fuzz )
+          if ( blues->no_overshoots || delta <= blues->blue_threshold )
+          {
+            point->cur_u = zone->cur_bottom;
+            psh_point_set_strong( point );
+            psh_point_set_fitted( point );
+          }
+      }
+
+      /* look up bottom zones */
+      table      = &blues->normal_bottom;
+      blue_count = table->count;
+      zone       = table->zones + blue_count - 1;
+
+      for ( ; blue_count > 0; blue_count--, zone-- )
+      {
+        FT_Pos  delta = zone->org_top - y;
+
+
+        if ( delta < -blues->blue_fuzz )
+          break;
+
+        if ( y >= zone->org_bottom - blues->blue_fuzz )
+          if ( blues->no_overshoots || delta < blues->blue_threshold )
+          {
+            point->cur_u = zone->cur_top;
+            psh_point_set_strong( point );
+            psh_point_set_fitted( point );
+          }
+      }
+    }
+  }
+
+
+  /* interpolate strong points with the help of hinted coordinates */
+  static void
+  psh_glyph_interpolate_strong_points( PSH_Glyph  glyph,
+                                       FT_Int     dimension )
+  {
+    PSH_Dimension  dim   = &glyph->globals->dimension[dimension];
+    FT_Fixed       scale = dim->scale_mult;
+
+    FT_UInt        count = glyph->num_points;
+    PSH_Point      point = glyph->points;
+
+
+    for ( ; count > 0; count--, point++ )
+    {
+      PSH_Hint  hint = point->hint;
+
+
+      if ( hint )
+      {
+        FT_Pos  delta;
+
+
+        if ( psh_point_is_edge_min( point ) )
+          point->cur_u = hint->cur_pos;
+
+        else if ( psh_point_is_edge_max( point ) )
+          point->cur_u = hint->cur_pos + hint->cur_len;
+
+        else
+        {
+          delta = point->org_u - hint->org_pos;
+
+          if ( delta <= 0 )
+            point->cur_u = hint->cur_pos + FT_MulFix( delta, scale );
+
+          else if ( delta >= hint->org_len )
+            point->cur_u = hint->cur_pos + hint->cur_len +
+                             FT_MulFix( delta - hint->org_len, scale );
+
+          else /* hint->org_len > 0 */
+            point->cur_u = hint->cur_pos +
+                             FT_MulDiv( delta, hint->cur_len,
+                                        hint->org_len );
+        }
+        psh_point_set_fitted( point );
+      }
+    }
+  }
+
+
+#define  PSH_MAX_STRONG_INTERNAL  16
+
+  static void
+  psh_glyph_interpolate_normal_points( PSH_Glyph  glyph,
+                                       FT_Int     dimension )
+  {
+
+#if 1
+    /* first technique: a point is strong if it is a local extremum */
+
+    PSH_Dimension  dim    = &glyph->globals->dimension[dimension];
+    FT_Fixed       scale  = dim->scale_mult;
+    FT_Memory      memory = glyph->memory;
+
+    PSH_Point*     strongs     = NULL;
+    PSH_Point      strongs_0[PSH_MAX_STRONG_INTERNAL];
+    FT_UInt        num_strongs = 0;
+
+    PSH_Point      points = glyph->points;
+    PSH_Point      points_end = points + glyph->num_points;
+    PSH_Point      point;
+
+
+    /* first count the number of strong points */
+    for ( point = points; point < points_end; point++ )
+    {
+      if ( psh_point_is_strong( point ) )
+        num_strongs++;
+    }
+
+    if ( num_strongs == 0 )  /* nothing to do here */
+      return;
+
+    /* allocate an array to store a list of points, */
+    /* stored in increasing org_u order             */
+    if ( num_strongs <= PSH_MAX_STRONG_INTERNAL )
+      strongs = strongs_0;
+    else
+    {
+      FT_Error  error;
+
+
+      if ( FT_NEW_ARRAY( strongs, num_strongs ) )
+        return;
+    }
+
+    num_strongs = 0;
+    for ( point = points; point < points_end; point++ )
+    {
+      PSH_Point*  insert;
+
+
+      if ( !psh_point_is_strong( point ) )
+        continue;
+
+      for ( insert = strongs + num_strongs; insert > strongs; insert-- )
+      {
+        if ( insert[-1]->org_u <= point->org_u )
+          break;
+
+        insert[0] = insert[-1];
+      }
+      insert[0] = point;
+      num_strongs++;
+    }
+
+    /* now try to interpolate all normal points */
+    for ( point = points; point < points_end; point++ )
+    {
+      if ( psh_point_is_strong( point ) )
+        continue;
+
+      /* sometimes, some local extrema are smooth points */
+      if ( psh_point_is_smooth( point ) )
+      {
+        if ( point->dir_in == PSH_DIR_NONE   ||
+             point->dir_in != point->dir_out )
+          continue;
+
+        if ( !psh_point_is_extremum( point ) &&
+             !psh_point_is_inflex( point )   )
+          continue;
+
+        point->flags &= ~PSH_POINT_SMOOTH;
+      }
+
+      /* find best enclosing point coordinates then interpolate */
+      {
+        PSH_Point   before, after;
+        FT_UInt     nn;
+
+
+        for ( nn = 0; nn < num_strongs; nn++ )
+          if ( strongs[nn]->org_u > point->org_u )
+            break;
+
+        if ( nn == 0 )  /* point before the first strong point */
+        {
+          after = strongs[0];
+
+          point->cur_u = after->cur_u +
+                           FT_MulFix( point->org_u - after->org_u,
+                                      scale );
+        }
+        else
+        {
+          before = strongs[nn - 1];
+
+          for ( nn = num_strongs; nn > 0; nn-- )
+            if ( strongs[nn - 1]->org_u < point->org_u )
+              break;
+
+          if ( nn == num_strongs )  /* point is after last strong point */
+          {
+            before = strongs[nn - 1];
+
+            point->cur_u = before->cur_u +
+                             FT_MulFix( point->org_u - before->org_u,
+                                        scale );
+          }
+          else
+          {
+            FT_Pos  u;
+
+
+            after = strongs[nn];
+
+            /* now interpolate point between before and after */
+            u = point->org_u;
+
+            if ( u == before->org_u )
+              point->cur_u = before->cur_u;
+
+            else if ( u == after->org_u )
+              point->cur_u = after->cur_u;
+
+            else
+              point->cur_u = before->cur_u +
+                               FT_MulDiv( u - before->org_u,
+                                          after->cur_u - before->cur_u,
+                                          after->org_u - before->org_u );
+          }
+        }
+        psh_point_set_fitted( point );
+      }
+    }
+
+    if ( strongs != strongs_0 )
+      FT_FREE( strongs );
+
+#endif /* 1 */
+
+  }
+
+
+  /* interpolate other points */
+  static void
+  psh_glyph_interpolate_other_points( PSH_Glyph  glyph,
+                                      FT_Int     dimension )
+  {
+    PSH_Dimension  dim          = &glyph->globals->dimension[dimension];
+    FT_Fixed       scale        = dim->scale_mult;
+    FT_Fixed       delta        = dim->scale_delta;
+    PSH_Contour    contour      = glyph->contours;
+    FT_UInt        num_contours = glyph->num_contours;
+
+
+    for ( ; num_contours > 0; num_contours--, contour++ )
+    {
+      PSH_Point  start = contour->start;
+      PSH_Point  first, next, point;
+      FT_UInt    fit_count;
+
+
+      /* count the number of strong points in this contour */
+      next      = start + contour->count;
+      fit_count = 0;
+      first     = 0;
+
+      for ( point = start; point < next; point++ )
+        if ( psh_point_is_fitted( point ) )
+        {
+          if ( !first )
+            first = point;
+
+          fit_count++;
+        }
+
+      /* if there are less than 2 fitted points in the contour, we */
+      /* simply scale and eventually translate the contour points  */
+      if ( fit_count < 2 )
+      {
+        if ( fit_count == 1 )
+          delta = first->cur_u - FT_MulFix( first->org_u, scale );
+
+        for ( point = start; point < next; point++ )
+          if ( point != first )
+            point->cur_u = FT_MulFix( point->org_u, scale ) + delta;
+
+        goto Next_Contour;
+      }
+
+      /* there are more than 2 strong points in this contour; we */
+      /* need to interpolate weak points between them            */
+      start = first;
+      do
+      {
+        point = first;
+
+        /* skip consecutive fitted points */
+        for (;;)
+        {
+          next = first->next;
+          if ( next == start )
+            goto Next_Contour;
+
+          if ( !psh_point_is_fitted( next ) )
+            break;
+
+          first = next;
+        }
+
+        /* find next fitted point after unfitted one */
+        for (;;)
+        {
+          next = next->next;
+          if ( psh_point_is_fitted( next ) )
+            break;
+        }
+
+        /* now interpolate between them */
+        {
+          FT_Pos    org_a, org_ab, cur_a, cur_ab;
+          FT_Pos    org_c, org_ac, cur_c;
+          FT_Fixed  scale_ab;
+
+
+          if ( first->org_u <= next->org_u )
+          {
+            org_a  = first->org_u;
+            cur_a  = first->cur_u;
+            org_ab = next->org_u - org_a;
+            cur_ab = next->cur_u - cur_a;
+          }
+          else
+          {
+            org_a  = next->org_u;
+            cur_a  = next->cur_u;
+            org_ab = first->org_u - org_a;
+            cur_ab = first->cur_u - cur_a;
+          }
+
+          scale_ab = 0x10000L;
+          if ( org_ab > 0 )
+            scale_ab = FT_DivFix( cur_ab, org_ab );
+
+          point = first->next;
+          do
+          {
+            org_c  = point->org_u;
+            org_ac = org_c - org_a;
+
+            if ( org_ac <= 0 )
+            {
+              /* on the left of the interpolation zone */
+              cur_c = cur_a + FT_MulFix( org_ac, scale );
+            }
+            else if ( org_ac >= org_ab )
+            {
+              /* on the right on the interpolation zone */
+              cur_c = cur_a + cur_ab + FT_MulFix( org_ac - org_ab, scale );
+            }
+            else
+            {
+              /* within the interpolation zone */
+              cur_c = cur_a + FT_MulFix( org_ac, scale_ab );
+            }
+
+            point->cur_u = cur_c;
+
+            point = point->next;
+
+          } while ( point != next );
+        }
+
+        /* keep going until all points in the contours have been processed */
+        first = next;
+
+      } while ( first != start );
+
+    Next_Contour:
+      ;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     HIGH-LEVEL INTERFACE                      *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_Error
+  ps_hints_apply( PS_Hints        ps_hints,
+                  FT_Outline*     outline,
+                  PSH_Globals     globals,
+                  FT_Render_Mode  hint_mode )
+  {
+    PSH_GlyphRec  glyphrec;
+    PSH_Glyph     glyph = &glyphrec;
+    FT_Error      error;
+#ifdef DEBUG_HINTER
+    FT_Memory     memory;
+#endif
+    FT_Int        dimension;
+
+
+    /* something to do? */
+    if ( outline->n_points == 0 || outline->n_contours == 0 )
+      return PSH_Err_Ok;
+
+#ifdef DEBUG_HINTER
+
+    memory = globals->memory;
+
+    if ( ps_debug_glyph )
+    {
+      psh_glyph_done( ps_debug_glyph );
+      FT_FREE( ps_debug_glyph );
+    }
+
+    if ( FT_NEW( glyph ) )
+      return error;
+
+    ps_debug_glyph = glyph;
+
+#endif /* DEBUG_HINTER */
+
+    error = psh_glyph_init( glyph, outline, ps_hints, globals );
+    if ( error )
+      goto Exit;
+
+    /* try to optimize the y_scale so that the top of non-capital letters
+     * is aligned on a pixel boundary whenever possible
+     */
+    {
+      PSH_Dimension  dim_x = &glyph->globals->dimension[0];
+      PSH_Dimension  dim_y = &glyph->globals->dimension[1];
+
+      FT_Fixed  x_scale = dim_x->scale_mult;
+      FT_Fixed  y_scale = dim_y->scale_mult;
+
+      FT_Fixed  old_x_scale = x_scale;
+      FT_Fixed  old_y_scale = y_scale;
+
+      FT_Fixed  scaled;
+      FT_Fixed  fitted;
+
+      FT_Bool  rescale = FALSE;
+
+
+      scaled = FT_MulFix( globals->blues.normal_top.zones->org_ref, y_scale );
+      fitted = FT_PIX_ROUND( scaled );
+
+      if ( fitted != 0 && scaled != fitted )
+      {
+        rescale = TRUE;
+
+        y_scale = FT_MulDiv( y_scale, fitted, scaled );
+
+        if ( fitted < scaled )
+          x_scale -= x_scale / 50;
+
+        psh_globals_set_scale( glyph->globals, x_scale, y_scale, 0, 0 );
+      }
+
+      glyph->do_horz_hints = 1;
+      glyph->do_vert_hints = 1;
+
+      glyph->do_horz_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO ||
+                                         hint_mode == FT_RENDER_MODE_LCD  );
+
+      glyph->do_vert_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO  ||
+                                         hint_mode == FT_RENDER_MODE_LCD_V );
+
+      glyph->do_stem_adjust   = FT_BOOL( hint_mode != FT_RENDER_MODE_LIGHT );
+
+      for ( dimension = 0; dimension < 2; dimension++ )
+      {
+        /* load outline coordinates into glyph */
+        psh_glyph_load_points( glyph, dimension );
+
+        /* compute local extrema */
+        psh_glyph_compute_extrema( glyph );
+
+        /* compute aligned stem/hints positions */
+        psh_hint_table_align_hints( &glyph->hint_tables[dimension],
+                                    glyph->globals,
+                                    dimension,
+                                    glyph );
+
+        /* find strong points, align them, then interpolate others */
+        psh_glyph_find_strong_points( glyph, dimension );
+        if ( dimension == 1 )
+          psh_glyph_find_blue_points( &globals->blues, glyph );
+        psh_glyph_interpolate_strong_points( glyph, dimension );
+        psh_glyph_interpolate_normal_points( glyph, dimension );
+        psh_glyph_interpolate_other_points( glyph, dimension );
+
+        /* save hinted coordinates back to outline */
+        psh_glyph_save_points( glyph, dimension );
+
+        if ( rescale )
+          psh_globals_set_scale( glyph->globals,
+                                 old_x_scale, old_y_scale, 0, 0 );
+      }
+    }
+
+  Exit:
+
+#ifndef DEBUG_HINTER
+    psh_glyph_done( glyph );
+#endif
+
+    return error;
+  }
+
+
+/* END */
diff --git a/src/pshinter/pshalgo.h b/src/pshinter/pshalgo.h
new file mode 100644 (file)
index 0000000..1a248a7
--- /dev/null
@@ -0,0 +1,255 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshalgo.h                                                              */
+/*                                                                         */
+/*    PostScript hinting algorithm (specification).                        */
+/*                                                                         */
+/*  Copyright 2001, 2002, 2003, 2008 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSHALGO_H__
+#define __PSHALGO_H__
+
+
+#include "pshrec.h"
+#include "pshglob.h"
+#include FT_TRIGONOMETRY_H
+
+
+FT_BEGIN_HEADER
+
+
+  /* handle to Hint structure */
+  typedef struct PSH_HintRec_*  PSH_Hint;
+
+  /* hint bit-flags */
+  typedef enum  PSH_Hint_Flags_
+  {
+    PSH_HINT_GHOST  = PS_HINT_FLAG_GHOST,
+    PSH_HINT_BOTTOM = PS_HINT_FLAG_BOTTOM,
+    PSH_HINT_ACTIVE = 4,
+    PSH_HINT_FITTED = 8
+
+  } PSH_Hint_Flags;
+
+
+#define psh_hint_is_active( x )  ( ( (x)->flags & PSH_HINT_ACTIVE ) != 0 )
+#define psh_hint_is_ghost( x )   ( ( (x)->flags & PSH_HINT_GHOST  ) != 0 )
+#define psh_hint_is_fitted( x )  ( ( (x)->flags & PSH_HINT_FITTED ) != 0 )
+
+#define psh_hint_activate( x )    (x)->flags |=  PSH_HINT_ACTIVE
+#define psh_hint_deactivate( x )  (x)->flags &= ~PSH_HINT_ACTIVE
+#define psh_hint_set_fitted( x )  (x)->flags |=  PSH_HINT_FITTED
+
+  /* hint structure */
+  typedef struct  PSH_HintRec_
+  {
+    FT_Int    org_pos;
+    FT_Int    org_len;
+    FT_Pos    cur_pos;
+    FT_Pos    cur_len;
+    FT_UInt   flags;
+    PSH_Hint  parent;
+    FT_Int    order;
+
+  } PSH_HintRec;
+
+
+  /* this is an interpolation zone used for strong points;  */
+  /* weak points are interpolated according to their strong */
+  /* neighbours                                             */
+  typedef struct  PSH_ZoneRec_
+  {
+    FT_Fixed  scale;
+    FT_Fixed  delta;
+    FT_Pos    min;
+    FT_Pos    max;
+
+  } PSH_ZoneRec, *PSH_Zone;
+
+
+  typedef struct  PSH_Hint_TableRec_
+  {
+    FT_UInt        max_hints;
+    FT_UInt        num_hints;
+    PSH_Hint       hints;
+    PSH_Hint*      sort;
+    PSH_Hint*      sort_global;
+    FT_UInt        num_zones;
+    PSH_ZoneRec*   zones;
+    PSH_Zone       zone;
+    PS_Mask_Table  hint_masks;
+    PS_Mask_Table  counter_masks;
+
+  } PSH_Hint_TableRec, *PSH_Hint_Table;
+
+
+  typedef struct PSH_PointRec_*    PSH_Point;
+  typedef struct PSH_ContourRec_*  PSH_Contour;
+
+  enum
+  {
+    PSH_DIR_NONE  =  4,
+    PSH_DIR_UP    = -1,
+    PSH_DIR_DOWN  =  1,
+    PSH_DIR_LEFT  = -2,
+    PSH_DIR_RIGHT =  2
+  };
+
+#define PSH_DIR_HORIZONTAL  2
+#define PSH_DIR_VERTICAL    1
+
+#define PSH_DIR_COMPARE( d1, d2 )   ( (d1) == (d2) || (d1) == -(d2) )
+#define PSH_DIR_IS_HORIZONTAL( d )  PSH_DIR_COMPARE( d, PSH_DIR_HORIZONTAL )
+#define PSH_DIR_IS_VERTICAL( d )    PSH_DIR_COMPARE( d, PSH_DIR_VERTICAL )
+
+
+ /* the following bit-flags are computed once by the glyph */
+ /* analyzer, for both dimensions                          */
+  enum
+  {
+    PSH_POINT_OFF    = 1,   /* point is off the curve */
+    PSH_POINT_SMOOTH = 2,   /* point is smooth        */
+    PSH_POINT_INFLEX = 4    /* point is inflection    */
+  };
+
+#define psh_point_is_smooth( p )  ( (p)->flags & PSH_POINT_SMOOTH )
+#define psh_point_is_off( p )     ( (p)->flags & PSH_POINT_OFF    )
+#define psh_point_is_inflex( p )  ( (p)->flags & PSH_POINT_INFLEX )
+
+#define psh_point_set_smooth( p )  (p)->flags |= PSH_POINT_SMOOTH
+#define psh_point_set_off( p )     (p)->flags |= PSH_POINT_OFF
+#define psh_point_set_inflex( p )  (p)->flags |= PSH_POINT_INFLEX
+
+  /* the following bit-flags are re-computed for each dimension */
+  enum
+  {
+    PSH_POINT_STRONG   = 16,   /* point is strong                           */
+    PSH_POINT_FITTED   = 32,   /* point is already fitted                   */
+    PSH_POINT_EXTREMUM = 64,   /* point is local extremum                   */
+    PSH_POINT_POSITIVE = 128,  /* extremum has positive contour flow        */
+    PSH_POINT_NEGATIVE = 256,  /* extremum has negative contour flow        */
+    PSH_POINT_EDGE_MIN = 512,  /* point is aligned to left/bottom stem edge */
+    PSH_POINT_EDGE_MAX = 1024  /* point is aligned to top/right stem edge   */
+  };
+
+#define psh_point_is_strong( p )    ( (p)->flags2 & PSH_POINT_STRONG )
+#define psh_point_is_fitted( p )    ( (p)->flags2 & PSH_POINT_FITTED )
+#define psh_point_is_extremum( p )  ( (p)->flags2 & PSH_POINT_EXTREMUM )
+#define psh_point_is_positive( p )  ( (p)->flags2 & PSH_POINT_POSITIVE )
+#define psh_point_is_negative( p )  ( (p)->flags2 & PSH_POINT_NEGATIVE )
+#define psh_point_is_edge_min( p )  ( (p)->flags2 & PSH_POINT_EDGE_MIN )
+#define psh_point_is_edge_max( p )  ( (p)->flags2 & PSH_POINT_EDGE_MAX )
+
+#define psh_point_set_strong( p )    (p)->flags2 |= PSH_POINT_STRONG
+#define psh_point_set_fitted( p )    (p)->flags2 |= PSH_POINT_FITTED
+#define psh_point_set_extremum( p )  (p)->flags2 |= PSH_POINT_EXTREMUM
+#define psh_point_set_positive( p )  (p)->flags2 |= PSH_POINT_POSITIVE
+#define psh_point_set_negative( p )  (p)->flags2 |= PSH_POINT_NEGATIVE
+#define psh_point_set_edge_min( p )  (p)->flags2 |= PSH_POINT_EDGE_MIN
+#define psh_point_set_edge_max( p )  (p)->flags2 |= PSH_POINT_EDGE_MAX
+
+
+  typedef struct  PSH_PointRec_
+  {
+    PSH_Point    prev;
+    PSH_Point    next;
+    PSH_Contour  contour;
+    FT_UInt      flags;
+    FT_UInt      flags2;
+    FT_Char      dir_in;
+    FT_Char      dir_out;
+    FT_Angle     angle_in;
+    FT_Angle     angle_out;
+    PSH_Hint     hint;
+    FT_Pos       org_u;
+    FT_Pos       org_v;
+    FT_Pos       cur_u;
+#ifdef DEBUG_HINTER
+    FT_Pos       org_x;
+    FT_Pos       cur_x;
+    FT_Pos       org_y;
+    FT_Pos       cur_y;
+    FT_UInt      flags_x;
+    FT_UInt      flags_y;
+#endif
+
+  } PSH_PointRec;
+
+
+#define PSH_POINT_EQUAL_ORG( a, b )  ( (a)->org_u == (b)->org_u && \
+                                       (a)->org_v == (b)->org_v )
+
+#define PSH_POINT_ANGLE( a, b )  FT_Atan2( (b)->org_u - (a)->org_u,  \
+                                           (b)->org_v - (a)->org_v )
+
+  typedef struct  PSH_ContourRec_
+  {
+    PSH_Point  start;
+    FT_UInt    count;
+
+  } PSH_ContourRec;
+
+
+  typedef struct  PSH_GlyphRec_
+  {
+    FT_UInt            num_points;
+    FT_UInt            num_contours;
+
+    PSH_Point          points;
+    PSH_Contour        contours;
+
+    FT_Memory          memory;
+    FT_Outline*        outline;
+    PSH_Globals        globals;
+    PSH_Hint_TableRec  hint_tables[2];
+
+    FT_Bool            vertical;
+    FT_Int             major_dir;
+    FT_Int             minor_dir;
+
+    FT_Bool            do_horz_hints;
+    FT_Bool            do_vert_hints;
+    FT_Bool            do_horz_snapping;
+    FT_Bool            do_vert_snapping;
+    FT_Bool            do_stem_adjust;
+
+  } PSH_GlyphRec, *PSH_Glyph;
+
+
+#ifdef DEBUG_HINTER
+  extern PSH_Hint_Table  ps_debug_hint_table;
+
+  typedef void
+  (*PSH_HintFunc)( PSH_Hint  hint,
+                   FT_Bool   vertical );
+
+  extern PSH_HintFunc    ps_debug_hint_func;
+
+  extern PSH_Glyph       ps_debug_glyph;
+#endif
+
+
+  extern FT_Error
+  ps_hints_apply( PS_Hints        ps_hints,
+                  FT_Outline*     outline,
+                  PSH_Globals     globals,
+                  FT_Render_Mode  hint_mode );
+
+
+FT_END_HEADER
+
+
+#endif /* __PSHALGO_H__ */
+
+
+/* END */
diff --git a/src/pshinter/pshglob.c b/src/pshinter/pshglob.c
new file mode 100644 (file)
index 0000000..31231ad
--- /dev/null
@@ -0,0 +1,750 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshglob.c                                                              */
+/*                                                                         */
+/*    PostScript hinter global hinting management (body).                  */
+/*    Inspired by the new auto-hinter module.                              */
+/*                                                                         */
+/*  Copyright 2001, 2002, 2003, 2004, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_INTERNAL_OBJECTS_H
+#include "pshglob.h"
+
+#ifdef DEBUG_HINTER
+  PSH_Globals  ps_debug_globals = 0;
+#endif
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       STANDARD WIDTHS                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* scale the widths/heights table */
+  static void
+  psh_globals_scale_widths( PSH_Globals  globals,
+                            FT_UInt      direction )
+  {
+    PSH_Dimension  dim   = &globals->dimension[direction];
+    PSH_Widths     stdw  = &dim->stdw;
+    FT_UInt        count = stdw->count;
+    PSH_Width      width = stdw->widths;
+    PSH_Width      stand = width;               /* standard width/height */
+    FT_Fixed       scale = dim->scale_mult;
+
+
+    if ( count > 0 )
+    {
+      width->cur = FT_MulFix( width->org, scale );
+      width->fit = FT_PIX_ROUND( width->cur );
+
+      width++;
+      count--;
+
+      for ( ; count > 0; count--, width++ )
+      {
+        FT_Pos  w, dist;
+
+
+        w    = FT_MulFix( width->org, scale );
+        dist = w - stand->cur;
+
+        if ( dist < 0 )
+          dist = -dist;
+
+        if ( dist < 128 )
+          w = stand->cur;
+
+        width->cur = w;
+        width->fit = FT_PIX_ROUND( w );
+      }
+    }
+  }
+
+
+#if 0
+
+  /* org_width is is font units, result in device pixels, 26.6 format */
+  FT_LOCAL_DEF( FT_Pos )
+  psh_dimension_snap_width( PSH_Dimension  dimension,
+                            FT_Int         org_width )
+  {
+    FT_UInt  n;
+    FT_Pos   width     = FT_MulFix( org_width, dimension->scale_mult );
+    FT_Pos   best      = 64 + 32 + 2;
+    FT_Pos   reference = width;
+
+
+    for ( n = 0; n < dimension->stdw.count; n++ )
+    {
+      FT_Pos  w;
+      FT_Pos  dist;
+
+
+      w = dimension->stdw.widths[n].cur;
+      dist = width - w;
+      if ( dist < 0 )
+        dist = -dist;
+      if ( dist < best )
+      {
+        best      = dist;
+        reference = w;
+      }
+    }
+
+    if ( width >= reference )
+    {
+      width -= 0x21;
+      if ( width < reference )
+        width = reference;
+    }
+    else
+    {
+      width += 0x21;
+      if ( width > reference )
+        width = reference;
+    }
+
+    return width;
+  }
+
+#endif /* 0 */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       BLUE ZONES                              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  psh_blues_set_zones_0( PSH_Blues       target,
+                         FT_Bool         is_others,
+                         FT_UInt         read_count,
+                         FT_Short*       read,
+                         PSH_Blue_Table  top_table,
+                         PSH_Blue_Table  bot_table )
+  {
+    FT_UInt  count_top = top_table->count;
+    FT_UInt  count_bot = bot_table->count;
+    FT_Bool  first     = 1;
+
+    FT_UNUSED( target );
+
+
+    for ( ; read_count > 1; read_count -= 2 )
+    {
+      FT_Int         reference, delta;
+      FT_UInt        count;
+      PSH_Blue_Zone  zones, zone;
+      FT_Bool        top;
+
+
+      /* read blue zone entry, and select target top/bottom zone */
+      top = 0;
+      if ( first || is_others )
+      {
+        reference = read[1];
+        delta     = read[0] - reference;
+
+        zones = bot_table->zones;
+        count = count_bot;
+        first = 0;
+      }
+      else
+      {
+        reference = read[0];
+        delta     = read[1] - reference;
+
+        zones = top_table->zones;
+        count = count_top;
+        top   = 1;
+      }
+
+      /* insert into sorted table */
+      zone = zones;
+      for ( ; count > 0; count--, zone++ )
+      {
+        if ( reference < zone->org_ref )
+          break;
+
+        if ( reference == zone->org_ref )
+        {
+          FT_Int  delta0 = zone->org_delta;
+
+
+          /* we have two zones on the same reference position -- */
+          /* only keep the largest one                           */
+          if ( delta < 0 )
+          {
+            if ( delta < delta0 )
+              zone->org_delta = delta;
+          }
+          else
+          {
+            if ( delta > delta0 )
+              zone->org_delta = delta;
+          }
+          goto Skip;
+        }
+      }
+
+      for ( ; count > 0; count-- )
+        zone[count] = zone[count-1];
+
+      zone->org_ref   = reference;
+      zone->org_delta = delta;
+
+      if ( top )
+        count_top++;
+      else
+        count_bot++;
+
+    Skip:
+      read += 2;
+    }
+
+    top_table->count = count_top;
+    bot_table->count = count_bot;
+  }
+
+
+  /* Re-read blue zones from the original fonts and store them into out */
+  /* private structure.  This function re-orders, sanitizes and         */
+  /* fuzz-expands the zones as well.                                    */
+  static void
+  psh_blues_set_zones( PSH_Blues  target,
+                       FT_UInt    count,
+                       FT_Short*  blues,
+                       FT_UInt    count_others,
+                       FT_Short*  other_blues,
+                       FT_Int     fuzz,
+                       FT_Int     family )
+  {
+    PSH_Blue_Table  top_table, bot_table;
+    FT_Int          count_top, count_bot;
+
+
+    if ( family )
+    {
+      top_table = &target->family_top;
+      bot_table = &target->family_bottom;
+    }
+    else
+    {
+      top_table = &target->normal_top;
+      bot_table = &target->normal_bottom;
+    }
+
+    /* read the input blue zones, and build two sorted tables  */
+    /* (one for the top zones, the other for the bottom zones) */
+    top_table->count = 0;
+    bot_table->count = 0;
+
+    /* first, the blues */
+    psh_blues_set_zones_0( target, 0,
+                           count, blues, top_table, bot_table );
+    psh_blues_set_zones_0( target, 1,
+                           count_others, other_blues, top_table, bot_table );
+
+    count_top = top_table->count;
+    count_bot = bot_table->count;
+
+    /* sanitize top table */
+    if ( count_top > 0 )
+    {
+      PSH_Blue_Zone  zone = top_table->zones;
+
+
+      for ( count = count_top; count > 0; count--, zone++ )
+      {
+        FT_Int  delta;
+
+
+        if ( count > 1 )
+        {
+          delta = zone[1].org_ref - zone[0].org_ref;
+          if ( zone->org_delta > delta )
+            zone->org_delta = delta;
+        }
+
+        zone->org_bottom = zone->org_ref;
+        zone->org_top    = zone->org_delta + zone->org_ref;
+      }
+    }
+
+    /* sanitize bottom table */
+    if ( count_bot > 0 )
+    {
+      PSH_Blue_Zone  zone = bot_table->zones;
+
+
+      for ( count = count_bot; count > 0; count--, zone++ )
+      {
+        FT_Int  delta;
+
+
+        if ( count > 1 )
+        {
+          delta = zone[0].org_ref - zone[1].org_ref;
+          if ( zone->org_delta < delta )
+            zone->org_delta = delta;
+        }
+
+        zone->org_top    = zone->org_ref;
+        zone->org_bottom = zone->org_delta + zone->org_ref;
+      }
+    }
+
+    /* expand top and bottom tables with blue fuzz */
+    {
+      FT_Int         dim, top, bot, delta;
+      PSH_Blue_Zone  zone;
+
+
+      zone  = top_table->zones;
+      count = count_top;
+
+      for ( dim = 1; dim >= 0; dim-- )
+      {
+        if ( count > 0 )
+        {
+          /* expand the bottom of the lowest zone normally */
+          zone->org_bottom -= fuzz;
+
+          /* expand the top and bottom of intermediate zones;    */
+          /* checking that the interval is smaller than the fuzz */
+          top = zone->org_top;
+
+          for ( count--; count > 0; count-- )
+          {
+            bot   = zone[1].org_bottom;
+            delta = bot - top;
+
+            if ( delta < 2 * fuzz )
+              zone[0].org_top = zone[1].org_bottom = top + delta / 2;
+            else
+            {
+              zone[0].org_top    = top + fuzz;
+              zone[1].org_bottom = bot - fuzz;
+            }
+
+            zone++;
+            top = zone->org_top;
+          }
+
+          /* expand the top of the highest zone normally */
+          zone->org_top = top + fuzz;
+        }
+        zone  = bot_table->zones;
+        count = count_bot;
+      }
+    }
+  }
+
+
+  /* reset the blues table when the device transform changes */
+  static void
+  psh_blues_scale_zones( PSH_Blues  blues,
+                         FT_Fixed   scale,
+                         FT_Pos     delta )
+  {
+    FT_UInt         count;
+    FT_UInt         num;
+    PSH_Blue_Table  table = 0;
+
+    /*                                                        */
+    /* Determine whether we need to suppress overshoots or    */
+    /* not.  We simply need to compare the vertical scale     */
+    /* parameter to the raw bluescale value.  Here is why:    */
+    /*                                                        */
+    /*   We need to suppress overshoots for all pointsizes.   */
+    /*   At 300dpi that satisfies:                            */
+    /*                                                        */
+    /*      pointsize < 240*bluescale + 0.49                  */
+    /*                                                        */
+    /*   This corresponds to:                                 */
+    /*                                                        */
+    /*      pixelsize < 1000*bluescale + 49/24                */
+    /*                                                        */
+    /*      scale*EM_Size < 1000*bluescale + 49/24            */
+    /*                                                        */
+    /*   However, for normal Type 1 fonts, EM_Size is 1000!   */
+    /*   We thus only check:                                  */
+    /*                                                        */
+    /*      scale < bluescale + 49/24000                      */
+    /*                                                        */
+    /*   which we shorten to                                  */
+    /*                                                        */
+    /*      "scale < bluescale"                               */
+    /*                                                        */
+    /* Note that `blue_scale' is stored 1000 times its real   */
+    /* value, and that `scale' converts from font units to    */
+    /* fractional pixels.                                     */
+    /*                                                        */
+
+    /* 1000 / 64 = 125 / 8 */
+    if ( scale >= 0x20C49BAL )
+      blues->no_overshoots = FT_BOOL( scale < blues->blue_scale * 8 / 125 );
+    else
+      blues->no_overshoots = FT_BOOL( scale * 125 < blues->blue_scale * 8 );
+
+    /*                                                        */
+    /*  The blue threshold is the font units distance under   */
+    /*  which overshoots are suppressed due to the BlueShift  */
+    /*  even if the scale is greater than BlueScale.          */
+    /*                                                        */
+    /*  It is the smallest distance such that                 */
+    /*                                                        */
+    /*    dist <= BlueShift && dist*scale <= 0.5 pixels       */
+    /*                                                        */
+    {
+      FT_Int  threshold = blues->blue_shift;
+
+
+      while ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 )
+        threshold--;
+
+      blues->blue_threshold = threshold;
+    }
+
+    for ( num = 0; num < 4; num++ )
+    {
+      PSH_Blue_Zone  zone;
+
+
+      switch ( num )
+      {
+      case 0:
+        table = &blues->normal_top;
+        break;
+      case 1:
+        table = &blues->normal_bottom;
+        break;
+      case 2:
+        table = &blues->family_top;
+        break;
+      default:
+        table = &blues->family_bottom;
+        break;
+      }
+
+      zone  = table->zones;
+      count = table->count;
+      for ( ; count > 0; count--, zone++ )
+      {
+        zone->cur_top    = FT_MulFix( zone->org_top,    scale ) + delta;
+        zone->cur_bottom = FT_MulFix( zone->org_bottom, scale ) + delta;
+        zone->cur_ref    = FT_MulFix( zone->org_ref,    scale ) + delta;
+        zone->cur_delta  = FT_MulFix( zone->org_delta,  scale );
+
+        /* round scaled reference position */
+        zone->cur_ref = FT_PIX_ROUND( zone->cur_ref );
+
+#if 0
+        if ( zone->cur_ref > zone->cur_top )
+          zone->cur_ref -= 64;
+        else if ( zone->cur_ref < zone->cur_bottom )
+          zone->cur_ref += 64;
+#endif
+      }
+    }
+
+    /* process the families now */
+
+    for ( num = 0; num < 2; num++ )
+    {
+      PSH_Blue_Zone   zone1, zone2;
+      FT_UInt         count1, count2;
+      PSH_Blue_Table  normal, family;
+
+
+      switch ( num )
+      {
+      case 0:
+        normal = &blues->normal_top;
+        family = &blues->family_top;
+        break;
+
+      default:
+        normal = &blues->normal_bottom;
+        family = &blues->family_bottom;
+      }
+
+      zone1  = normal->zones;
+      count1 = normal->count;
+
+      for ( ; count1 > 0; count1--, zone1++ )
+      {
+        /* try to find a family zone whose reference position is less */
+        /* than 1 pixel far from the current zone                     */
+        zone2  = family->zones;
+        count2 = family->count;
+
+        for ( ; count2 > 0; count2--, zone2++ )
+        {
+          FT_Pos  Delta;
+
+
+          Delta = zone1->org_ref - zone2->org_ref;
+          if ( Delta < 0 )
+            Delta = -Delta;
+
+          if ( FT_MulFix( Delta, scale ) < 64 )
+          {
+            zone1->cur_top    = zone2->cur_top;
+            zone1->cur_bottom = zone2->cur_bottom;
+            zone1->cur_ref    = zone2->cur_ref;
+            zone1->cur_delta  = zone2->cur_delta;
+            break;
+          }
+        }
+      }
+    }
+  }
+
+
+  FT_LOCAL_DEF( void )
+  psh_blues_snap_stem( PSH_Blues      blues,
+                       FT_Int         stem_top,
+                       FT_Int         stem_bot,
+                       PSH_Alignment  alignment )
+  {
+    PSH_Blue_Table  table;
+    FT_UInt         count;
+    FT_Pos          delta;
+    PSH_Blue_Zone   zone;
+    FT_Int          no_shoots;
+
+
+    alignment->align = PSH_BLUE_ALIGN_NONE;
+
+    no_shoots = blues->no_overshoots;
+
+    /* look up stem top in top zones table */
+    table = &blues->normal_top;
+    count = table->count;
+    zone  = table->zones;
+
+    for ( ; count > 0; count--, zone++ )
+    {
+      delta = stem_top - zone->org_bottom;
+      if ( delta < -blues->blue_fuzz )
+        break;
+
+      if ( stem_top <= zone->org_top + blues->blue_fuzz )
+      {
+        if ( no_shoots || delta <= blues->blue_threshold )
+        {
+          alignment->align    |= PSH_BLUE_ALIGN_TOP;
+          alignment->align_top = zone->cur_ref;
+        }
+        break;
+      }
+    }
+
+    /* look up stem bottom in bottom zones table */
+    table = &blues->normal_bottom;
+    count = table->count;
+    zone  = table->zones + count-1;
+
+    for ( ; count > 0; count--, zone-- )
+    {
+      delta = zone->org_top - stem_bot;
+      if ( delta < -blues->blue_fuzz )
+        break;
+
+      if ( stem_bot >= zone->org_bottom - blues->blue_fuzz )
+      {
+        if ( no_shoots || delta < blues->blue_threshold )
+        {
+          alignment->align    |= PSH_BLUE_ALIGN_BOT;
+          alignment->align_bot = zone->cur_ref;
+        }
+        break;
+      }
+    }
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                        GLOBAL HINTS                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  psh_globals_destroy( PSH_Globals  globals )
+  {
+    if ( globals )
+    {
+      FT_Memory  memory;
+
+
+      memory = globals->memory;
+      globals->dimension[0].stdw.count = 0;
+      globals->dimension[1].stdw.count = 0;
+
+      globals->blues.normal_top.count    = 0;
+      globals->blues.normal_bottom.count = 0;
+      globals->blues.family_top.count    = 0;
+      globals->blues.family_bottom.count = 0;
+
+      FT_FREE( globals );
+
+#ifdef DEBUG_HINTER
+      ps_debug_globals = 0;
+#endif
+    }
+  }
+
+
+  static FT_Error
+  psh_globals_new( FT_Memory     memory,
+                   T1_Private*   priv,
+                   PSH_Globals  *aglobals )
+  {
+    PSH_Globals  globals = NULL;
+    FT_Error     error;
+
+
+    if ( !FT_NEW( globals ) )
+    {
+      FT_UInt    count;
+      FT_Short*  read;
+
+
+      globals->memory = memory;
+
+      /* copy standard widths */
+      {
+        PSH_Dimension  dim   = &globals->dimension[1];
+        PSH_Width      write = dim->stdw.widths;
+
+
+        write->org = priv->standard_width[0];
+        write++;
+
+        read = priv->snap_widths;
+        for ( count = priv->num_snap_widths; count > 0; count-- )
+        {
+          write->org = *read;
+          write++;
+          read++;
+        }
+
+        dim->stdw.count = priv->num_snap_widths + 1;
+      }
+
+      /* copy standard heights */
+      {
+        PSH_Dimension  dim = &globals->dimension[0];
+        PSH_Width      write = dim->stdw.widths;
+
+
+        write->org = priv->standard_height[0];
+        write++;
+        read = priv->snap_heights;
+        for ( count = priv->num_snap_heights; count > 0; count-- )
+        {
+          write->org = *read;
+          write++;
+          read++;
+        }
+
+        dim->stdw.count = priv->num_snap_heights + 1;
+      }
+
+      /* copy blue zones */
+      psh_blues_set_zones( &globals->blues, priv->num_blue_values,
+                           priv->blue_values, priv->num_other_blues,
+                           priv->other_blues, priv->blue_fuzz, 0 );
+
+      psh_blues_set_zones( &globals->blues, priv->num_family_blues,
+                           priv->family_blues, priv->num_family_other_blues,
+                           priv->family_other_blues, priv->blue_fuzz, 1 );
+
+      globals->blues.blue_scale = priv->blue_scale;
+      globals->blues.blue_shift = priv->blue_shift;
+      globals->blues.blue_fuzz  = priv->blue_fuzz;
+
+      globals->dimension[0].scale_mult  = 0;
+      globals->dimension[0].scale_delta = 0;
+      globals->dimension[1].scale_mult  = 0;
+      globals->dimension[1].scale_delta = 0;
+
+#ifdef DEBUG_HINTER
+      ps_debug_globals = globals;
+#endif
+    }
+
+    *aglobals = globals;
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  psh_globals_set_scale( PSH_Globals  globals,
+                         FT_Fixed     x_scale,
+                         FT_Fixed     y_scale,
+                         FT_Fixed     x_delta,
+                         FT_Fixed     y_delta )
+  {
+    PSH_Dimension  dim = &globals->dimension[0];
+
+
+    dim = &globals->dimension[0];
+    if ( x_scale != dim->scale_mult  ||
+         x_delta != dim->scale_delta )
+    {
+      dim->scale_mult  = x_scale;
+      dim->scale_delta = x_delta;
+
+      psh_globals_scale_widths( globals, 0 );
+    }
+
+    dim = &globals->dimension[1];
+    if ( y_scale != dim->scale_mult  ||
+         y_delta != dim->scale_delta )
+    {
+      dim->scale_mult  = y_scale;
+      dim->scale_delta = y_delta;
+
+      psh_globals_scale_widths( globals, 1 );
+      psh_blues_scale_zones( &globals->blues, y_scale, y_delta );
+    }
+
+    return 0;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  psh_globals_funcs_init( PSH_Globals_FuncsRec*  funcs )
+  {
+    funcs->create    = psh_globals_new;
+    funcs->set_scale = psh_globals_set_scale;
+    funcs->destroy   = psh_globals_destroy;
+  }
+
+
+/* END */
diff --git a/src/pshinter/pshglob.h b/src/pshinter/pshglob.h
new file mode 100644 (file)
index 0000000..c511626
--- /dev/null
@@ -0,0 +1,196 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshglob.h                                                              */
+/*                                                                         */
+/*    PostScript hinter global hinting management.                         */
+/*                                                                         */
+/*  Copyright 2001, 2002, 2003 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSHGLOB_H__
+#define __PSHGLOB_H__
+
+
+#include FT_FREETYPE_H
+#include FT_INTERNAL_POSTSCRIPT_HINTS_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    GLOBAL HINTS INTERNALS                     *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* @constant:                                                            */
+  /*    PS_GLOBALS_MAX_BLUE_ZONES                                          */
+  /*                                                                       */
+  /* @description:                                                         */
+  /*    The maximum number of blue zones in a font global hints structure. */
+  /*    See @PS_Globals_BluesRec.                                          */
+  /*                                                                       */
+#define PS_GLOBALS_MAX_BLUE_ZONES  16
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* @constant:                                                            */
+  /*    PS_GLOBALS_MAX_STD_WIDTHS                                          */
+  /*                                                                       */
+  /* @description:                                                         */
+  /*    The maximum number of standard and snap widths in either the       */
+  /*    horizontal or vertical direction.  See @PS_Globals_WidthsRec.      */
+  /*                                                                       */
+#define PS_GLOBALS_MAX_STD_WIDTHS  16
+
+
+  /* standard and snap width */
+  typedef struct  PSH_WidthRec_
+  {
+    FT_Int  org;
+    FT_Pos  cur;
+    FT_Pos  fit;
+
+  } PSH_WidthRec, *PSH_Width;
+
+
+  /* standard and snap widths table */
+  typedef struct  PSH_WidthsRec_
+  {
+    FT_UInt       count;
+    PSH_WidthRec  widths[PS_GLOBALS_MAX_STD_WIDTHS];
+
+  } PSH_WidthsRec, *PSH_Widths;
+
+
+  typedef struct  PSH_DimensionRec_
+  {
+    PSH_WidthsRec  stdw;
+    FT_Fixed       scale_mult;
+    FT_Fixed       scale_delta;
+
+  } PSH_DimensionRec, *PSH_Dimension;
+
+
+  /* blue zone descriptor */
+  typedef struct  PSH_Blue_ZoneRec_
+  {
+    FT_Int  org_ref;
+    FT_Int  org_delta;
+    FT_Int  org_top;
+    FT_Int  org_bottom;
+
+    FT_Pos  cur_ref;
+    FT_Pos  cur_delta;
+    FT_Pos  cur_bottom;
+    FT_Pos  cur_top;
+
+  } PSH_Blue_ZoneRec, *PSH_Blue_Zone;
+
+
+  typedef struct  PSH_Blue_TableRec_
+  {
+    FT_UInt           count;
+    PSH_Blue_ZoneRec  zones[PS_GLOBALS_MAX_BLUE_ZONES];
+
+  } PSH_Blue_TableRec, *PSH_Blue_Table;
+
+
+  /* blue zones table */
+  typedef struct  PSH_BluesRec_
+  {
+    PSH_Blue_TableRec  normal_top;
+    PSH_Blue_TableRec  normal_bottom;
+    PSH_Blue_TableRec  family_top;
+    PSH_Blue_TableRec  family_bottom;
+
+    FT_Fixed           blue_scale;
+    FT_Int             blue_shift;
+    FT_Int             blue_threshold;
+    FT_Int             blue_fuzz;
+    FT_Bool            no_overshoots;
+
+  } PSH_BluesRec, *PSH_Blues;
+
+
+  /* font globals.                                         */
+  /* dimension 0 => X coordinates + vertical hints/stems   */
+  /* dimension 1 => Y coordinates + horizontal hints/stems */
+  typedef struct  PSH_GlobalsRec_
+  {
+    FT_Memory         memory;
+    PSH_DimensionRec  dimension[2];
+    PSH_BluesRec      blues;
+
+  } PSH_GlobalsRec;
+
+
+#define PSH_BLUE_ALIGN_NONE  0
+#define PSH_BLUE_ALIGN_TOP   1
+#define PSH_BLUE_ALIGN_BOT   2
+
+
+  typedef struct  PSH_AlignmentRec_
+  {
+    int     align;
+    FT_Pos  align_top;
+    FT_Pos  align_bot;
+
+  } PSH_AlignmentRec, *PSH_Alignment;
+
+
+  FT_LOCAL( void )
+  psh_globals_funcs_init( PSH_Globals_FuncsRec*  funcs );
+
+
+#if 0
+  /* snap a stem width to fitter coordinates.  `org_width' is in font */
+  /* units.  The result is in device pixels (26.6 format).            */
+  FT_LOCAL( FT_Pos )
+  psh_dimension_snap_width( PSH_Dimension  dimension,
+                            FT_Int         org_width );
+#endif
+
+  FT_LOCAL( FT_Error )
+  psh_globals_set_scale( PSH_Globals  globals,
+                         FT_Fixed     x_scale,
+                         FT_Fixed     y_scale,
+                         FT_Fixed     x_delta,
+                         FT_Fixed     y_delta );
+
+  /* snap a stem to one or two blue zones */
+  FT_LOCAL( void )
+  psh_blues_snap_stem( PSH_Blues      blues,
+                       FT_Int         stem_top,
+                       FT_Int         stem_bot,
+                       PSH_Alignment  alignment );
+  /* */
+
+#ifdef DEBUG_HINTER
+  extern PSH_Globals  ps_debug_globals;
+#endif
+
+
+FT_END_HEADER
+
+
+#endif /* __PSHGLOB_H__ */
+
+
+/* END */
diff --git a/src/pshinter/pshinter.c b/src/pshinter/pshinter.c
new file mode 100644 (file)
index 0000000..b35a2a9
--- /dev/null
@@ -0,0 +1,29 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshinter.c                                                             */
+/*                                                                         */
+/*    FreeType PostScript Hinting module                                   */
+/*                                                                         */
+/*  Copyright 2001, 2003 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include <ft2build.h>
+#include "pshpic.c"
+#include "pshrec.c"
+#include "pshglob.c"
+#include "pshalgo.c"
+#include "pshmod.c"
+
+
+/* END */
diff --git a/src/pshinter/pshmod.c b/src/pshinter/pshmod.c
new file mode 100644 (file)
index 0000000..91da5d7
--- /dev/null
@@ -0,0 +1,118 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshmod.c                                                               */
+/*                                                                         */
+/*    FreeType PostScript hinter module implementation (body).             */
+/*                                                                         */
+/*  Copyright 2001, 2002, 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include "pshrec.h"
+#include "pshalgo.h"
+#include "pshpic.h"
+
+
+  /* the Postscript Hinter module structure */
+  typedef struct  PS_Hinter_Module_Rec_
+  {
+    FT_ModuleRec          root;
+    PS_HintsRec           ps_hints;
+
+    PSH_Globals_FuncsRec  globals_funcs;
+    T1_Hints_FuncsRec     t1_funcs;
+    T2_Hints_FuncsRec     t2_funcs;
+
+  } PS_Hinter_ModuleRec, *PS_Hinter_Module;
+
+
+  /* finalize module */
+  FT_CALLBACK_DEF( void )
+  ps_hinter_done( PS_Hinter_Module  module )
+  {
+    module->t1_funcs.hints = NULL;
+    module->t2_funcs.hints = NULL;
+
+    ps_hints_done( &module->ps_hints );
+  }
+
+
+  /* initialize module, create hints recorder and the interface */
+  FT_CALLBACK_DEF( FT_Error )
+  ps_hinter_init( PS_Hinter_Module  module )
+  {
+    FT_Memory  memory = module->root.memory;
+    void*      ph     = &module->ps_hints;
+
+
+    ps_hints_init( &module->ps_hints, memory );
+
+    psh_globals_funcs_init( &module->globals_funcs );
+
+    t1_hints_funcs_init( &module->t1_funcs );
+    module->t1_funcs.hints = (T1_Hints)ph;
+
+    t2_hints_funcs_init( &module->t2_funcs );
+    module->t2_funcs.hints = (T2_Hints)ph;
+
+    return 0;
+  }
+
+
+  /* returns global hints interface */
+  FT_CALLBACK_DEF( PSH_Globals_Funcs )
+  pshinter_get_globals_funcs( FT_Module  module )
+  {
+    return &((PS_Hinter_Module)module)->globals_funcs;
+  }
+
+
+  /* return Type 1 hints interface */
+  FT_CALLBACK_DEF( T1_Hints_Funcs )
+  pshinter_get_t1_funcs( FT_Module  module )
+  {
+    return &((PS_Hinter_Module)module)->t1_funcs;
+  }
+
+
+  /* return Type 2 hints interface */
+  FT_CALLBACK_DEF( T2_Hints_Funcs )
+  pshinter_get_t2_funcs( FT_Module  module )
+  {
+    return &((PS_Hinter_Module)module)->t2_funcs;
+  }
+
+
+  FT_DEFINE_PSHINTER_INTERFACE(pshinter_interface,
+    pshinter_get_globals_funcs,
+    pshinter_get_t1_funcs,
+    pshinter_get_t2_funcs
+  )
+
+
+  FT_DEFINE_MODULE(pshinter_module_class,
+
+    0,
+    sizeof ( PS_Hinter_ModuleRec ),
+    "pshinter",
+    0x10000L,
+    0x20000L,
+
+    &FTPSHINTER_INTERFACE_GET,            /* module-specific interface */
+
+    (FT_Module_Constructor)ps_hinter_init,
+    (FT_Module_Destructor) ps_hinter_done,
+    (FT_Module_Requester)  0        /* no additional interface for now */
+  )
+
+/* END */
diff --git a/src/pshinter/pshmod.h b/src/pshinter/pshmod.h
new file mode 100644 (file)
index 0000000..0ae7e96
--- /dev/null
@@ -0,0 +1,39 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshmod.h                                                               */
+/*                                                                         */
+/*    PostScript hinter module interface (specification).                  */
+/*                                                                         */
+/*  Copyright 2001 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSHMOD_H__
+#define __PSHMOD_H__
+
+
+#include <ft2build.h>
+#include FT_MODULE_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_DECLARE_MODULE( pshinter_module_class )
+
+
+FT_END_HEADER
+
+
+#endif /* __PSHMOD_H__ */
+
+
+/* END */
diff --git a/src/pshinter/pshnterr.h b/src/pshinter/pshnterr.h
new file mode 100644 (file)
index 0000000..7cc180f
--- /dev/null
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshnterr.h                                                             */
+/*                                                                         */
+/*    PS Hinter error codes (specification only).                          */
+/*                                                                         */
+/*  Copyright 2003, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the PSHinter error enumeration constants. */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __PSHNTERR_H__
+#define __PSHNTERR_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  PSH_Err_
+#define FT_ERR_BASE    FT_Mod_Err_PShinter
+
+#include FT_ERRORS_H
+
+#endif /* __PSHNTERR_H__ */
+
+
+/* END */
diff --git a/src/pshinter/pshpic.c b/src/pshinter/pshpic.c
new file mode 100644 (file)
index 0000000..1e0f9a9
--- /dev/null
@@ -0,0 +1,75 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshpic.c                                                               */
+/*                                                                         */
+/*    The FreeType position independent code services for pshinter module. */
+/*                                                                         */
+/*  Copyright 2009, 2010 by                                                */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_INTERNAL_OBJECTS_H
+#include "pshpic.h"
+#include "pshnterr.h"
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* forward declaration of PIC init functions from pshmod.c */
+  void
+  FT_Init_Class_pshinter_interface( FT_Library           library,
+                                    PSHinter_Interface*  clazz );
+
+  void
+  pshinter_module_class_pic_free( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Memory  memory = library->memory;
+
+
+    if ( pic_container->pshinter )
+    {
+      FT_FREE( pic_container->pshinter );
+      pic_container->pshinter = NULL;
+    }
+  }
+
+
+  FT_Error
+  pshinter_module_class_pic_init( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Error           error         = PSH_Err_Ok;
+    PSHinterPIC*       container;
+    FT_Memory          memory        = library->memory;
+
+
+    /* allocate pointer, clear and set global container pointer */
+    if ( FT_ALLOC ( container, sizeof ( *container ) ) )
+      return error;
+    FT_MEM_SET( container, 0, sizeof ( *container ) );
+    pic_container->pshinter = container;
+
+    /* add call to initialization function when you add new scripts */
+    FT_Init_Class_pshinter_interface(
+      library, &container->pshinter_interface );
+
+/*Exit:*/
+    if( error )
+      pshinter_module_class_pic_free( library );
+    return error;
+  }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+/* END */
diff --git a/src/pshinter/pshpic.h b/src/pshinter/pshpic.h
new file mode 100644 (file)
index 0000000..c10bdd9
--- /dev/null
@@ -0,0 +1,59 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshpic.h                                                               */
+/*                                                                         */
+/*    The FreeType position independent code services for pshinter module. */
+/*                                                                         */
+/*  Copyright 2009 by                                                      */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSHPIC_H__
+#define __PSHPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include FT_INTERNAL_PIC_H
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FTPSHINTER_INTERFACE_GET        pshinter_interface
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include FT_INTERNAL_POSTSCRIPT_HINTS_H
+
+  typedef struct PSHinterPIC_
+  {
+    PSHinter_Interface pshinter_interface;
+  } PSHinterPIC;
+
+#define GET_PIC(lib)                    ((PSHinterPIC*)((lib)->pic_container.autofit))
+#define FTPSHINTER_INTERFACE_GET        (GET_PIC(library)->pshinter_interface)
+
+  /* see pshpic.c for the implementation */
+  void
+  pshinter_module_class_pic_free( FT_Library  library );
+
+  FT_Error
+  pshinter_module_class_pic_init( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __PSHPIC_H__ */
+
+
+/* END */
diff --git a/src/pshinter/pshrec.c b/src/pshinter/pshrec.c
new file mode 100644 (file)
index 0000000..0910cc5
--- /dev/null
@@ -0,0 +1,1224 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshrec.c                                                               */
+/*                                                                         */
+/*    FreeType PostScript hints recorder (body).                           */
+/*                                                                         */
+/*  Copyright 2001, 2002, 2003, 2004, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_CALC_H
+
+#include "pshrec.h"
+#include "pshalgo.h"
+
+#include "pshnterr.h"
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_pshrec
+
+#ifdef DEBUG_HINTER
+  PS_Hints  ps_debug_hints         = 0;
+  int       ps_debug_no_horz_hints = 0;
+  int       ps_debug_no_vert_hints = 0;
+#endif
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      PS_HINT MANAGEMENT                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* destroy hints table */
+  static void
+  ps_hint_table_done( PS_Hint_Table  table,
+                      FT_Memory      memory )
+  {
+    FT_FREE( table->hints );
+    table->num_hints = 0;
+    table->max_hints = 0;
+  }
+
+
+  /* ensure that a table can contain "count" elements */
+  static FT_Error
+  ps_hint_table_ensure( PS_Hint_Table  table,
+                        FT_UInt        count,
+                        FT_Memory      memory )
+  {
+    FT_UInt   old_max = table->max_hints;
+    FT_UInt   new_max = count;
+    FT_Error  error   = PSH_Err_Ok;
+
+
+    if ( new_max > old_max )
+    {
+      /* try to grow the table */
+      new_max = FT_PAD_CEIL( new_max, 8 );
+      if ( !FT_RENEW_ARRAY( table->hints, old_max, new_max ) )
+        table->max_hints = new_max;
+    }
+    return error;
+  }
+
+
+  static FT_Error
+  ps_hint_table_alloc( PS_Hint_Table  table,
+                       FT_Memory      memory,
+                       PS_Hint       *ahint )
+  {
+    FT_Error  error = PSH_Err_Ok;
+    FT_UInt   count;
+    PS_Hint   hint = 0;
+
+
+    count = table->num_hints;
+    count++;
+
+    if ( count >= table->max_hints )
+    {
+      error = ps_hint_table_ensure( table, count, memory );
+      if ( error )
+        goto Exit;
+    }
+
+    hint        = table->hints + count - 1;
+    hint->pos   = 0;
+    hint->len   = 0;
+    hint->flags = 0;
+
+    table->num_hints = count;
+
+  Exit:
+    *ahint = hint;
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      PS_MASK MANAGEMENT                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* destroy mask */
+  static void
+  ps_mask_done( PS_Mask    mask,
+                FT_Memory  memory )
+  {
+    FT_FREE( mask->bytes );
+    mask->num_bits  = 0;
+    mask->max_bits  = 0;
+    mask->end_point = 0;
+  }
+
+
+  /* ensure that a mask can contain "count" bits */
+  static FT_Error
+  ps_mask_ensure( PS_Mask    mask,
+                  FT_UInt    count,
+                  FT_Memory  memory )
+  {
+    FT_UInt   old_max = ( mask->max_bits + 7 ) >> 3;
+    FT_UInt   new_max = ( count          + 7 ) >> 3;
+    FT_Error  error   = PSH_Err_Ok;
+
+
+    if ( new_max > old_max )
+    {
+      new_max = FT_PAD_CEIL( new_max, 8 );
+      if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) )
+        mask->max_bits = new_max * 8;
+    }
+    return error;
+  }
+
+
+  /* test a bit value in a given mask */
+  static FT_Int
+  ps_mask_test_bit( PS_Mask  mask,
+                    FT_Int   idx )
+  {
+    if ( (FT_UInt)idx >= mask->num_bits )
+      return 0;
+
+    return mask->bytes[idx >> 3] & ( 0x80 >> ( idx & 7 ) );
+  }
+
+
+  /* clear a given bit */
+  static void
+  ps_mask_clear_bit( PS_Mask  mask,
+                     FT_Int   idx )
+  {
+    FT_Byte*  p;
+
+
+    if ( (FT_UInt)idx >= mask->num_bits )
+      return;
+
+    p    = mask->bytes + ( idx >> 3 );
+    p[0] = (FT_Byte)( p[0] & ~( 0x80 >> ( idx & 7 ) ) );
+  }
+
+
+  /* set a given bit, possibly grow the mask */
+  static FT_Error
+  ps_mask_set_bit( PS_Mask    mask,
+                   FT_Int     idx,
+                   FT_Memory  memory )
+  {
+    FT_Error  error = PSH_Err_Ok;
+    FT_Byte*  p;
+
+
+    if ( idx < 0 )
+      goto Exit;
+
+    if ( (FT_UInt)idx >= mask->num_bits )
+    {
+      error = ps_mask_ensure( mask, idx + 1, memory );
+      if ( error )
+        goto Exit;
+
+      mask->num_bits = idx + 1;
+    }
+
+    p    = mask->bytes + ( idx >> 3 );
+    p[0] = (FT_Byte)( p[0] | ( 0x80 >> ( idx & 7 ) ) );
+
+  Exit:
+    return error;
+  }
+
+
+  /* destroy mask table */
+  static void
+  ps_mask_table_done( PS_Mask_Table  table,
+                      FT_Memory      memory )
+  {
+    FT_UInt  count = table->max_masks;
+    PS_Mask  mask  = table->masks;
+
+
+    for ( ; count > 0; count--, mask++ )
+      ps_mask_done( mask, memory );
+
+    FT_FREE( table->masks );
+    table->num_masks = 0;
+    table->max_masks = 0;
+  }
+
+
+  /* ensure that a mask table can contain "count" masks */
+  static FT_Error
+  ps_mask_table_ensure( PS_Mask_Table  table,
+                        FT_UInt        count,
+                        FT_Memory      memory )
+  {
+    FT_UInt   old_max = table->max_masks;
+    FT_UInt   new_max = count;
+    FT_Error  error   = PSH_Err_Ok;
+
+
+    if ( new_max > old_max )
+    {
+      new_max = FT_PAD_CEIL( new_max, 8 );
+      if ( !FT_RENEW_ARRAY( table->masks, old_max, new_max ) )
+        table->max_masks = new_max;
+    }
+    return error;
+  }
+
+
+  /* allocate a new mask in a table */
+  static FT_Error
+  ps_mask_table_alloc( PS_Mask_Table  table,
+                       FT_Memory      memory,
+                       PS_Mask       *amask )
+  {
+    FT_UInt   count;
+    FT_Error  error = PSH_Err_Ok;
+    PS_Mask   mask  = 0;
+
+
+    count = table->num_masks;
+    count++;
+
+    if ( count > table->max_masks )
+    {
+      error = ps_mask_table_ensure( table, count, memory );
+      if ( error )
+        goto Exit;
+    }
+
+    mask             = table->masks + count - 1;
+    mask->num_bits   = 0;
+    mask->end_point  = 0;
+    table->num_masks = count;
+
+  Exit:
+    *amask = mask;
+    return error;
+  }
+
+
+  /* return last hint mask in a table, create one if the table is empty */
+  static FT_Error
+  ps_mask_table_last( PS_Mask_Table  table,
+                      FT_Memory      memory,
+                      PS_Mask       *amask )
+  {
+    FT_Error  error = PSH_Err_Ok;
+    FT_UInt   count;
+    PS_Mask   mask;
+
+
+    count = table->num_masks;
+    if ( count == 0 )
+    {
+      error = ps_mask_table_alloc( table, memory, &mask );
+      if ( error )
+        goto Exit;
+    }
+    else
+      mask = table->masks + count - 1;
+
+  Exit:
+    *amask = mask;
+    return error;
+  }
+
+
+  /* set a new mask to a given bit range */
+  static FT_Error
+  ps_mask_table_set_bits( PS_Mask_Table   table,
+                          const FT_Byte*  source,
+                          FT_UInt         bit_pos,
+                          FT_UInt         bit_count,
+                          FT_Memory       memory )
+  {
+    FT_Error  error = PSH_Err_Ok;
+    PS_Mask   mask;
+
+
+    error = ps_mask_table_last( table, memory, &mask );
+    if ( error )
+      goto Exit;
+
+    error = ps_mask_ensure( mask, bit_count, memory );
+    if ( error )
+      goto Exit;
+
+    mask->num_bits = bit_count;
+
+    /* now, copy bits */
+    {
+      FT_Byte*  read  = (FT_Byte*)source + ( bit_pos >> 3 );
+      FT_Int    rmask = 0x80 >> ( bit_pos & 7 );
+      FT_Byte*  write = mask->bytes;
+      FT_Int    wmask = 0x80;
+      FT_Int    val;
+
+
+      for ( ; bit_count > 0; bit_count-- )
+      {
+        val = write[0] & ~wmask;
+
+        if ( read[0] & rmask )
+          val |= wmask;
+
+        write[0] = (FT_Byte)val;
+
+        rmask >>= 1;
+        if ( rmask == 0 )
+        {
+          read++;
+          rmask = 0x80;
+        }
+
+        wmask >>= 1;
+        if ( wmask == 0 )
+        {
+          write++;
+          wmask = 0x80;
+        }
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* test whether two masks in a table intersect */
+  static FT_Int
+  ps_mask_table_test_intersect( PS_Mask_Table  table,
+                                FT_Int         index1,
+                                FT_Int         index2 )
+  {
+    PS_Mask   mask1  = table->masks + index1;
+    PS_Mask   mask2  = table->masks + index2;
+    FT_Byte*  p1     = mask1->bytes;
+    FT_Byte*  p2     = mask2->bytes;
+    FT_UInt   count1 = mask1->num_bits;
+    FT_UInt   count2 = mask2->num_bits;
+    FT_UInt   count;
+
+
+    count = ( count1 <= count2 ) ? count1 : count2;
+    for ( ; count >= 8; count -= 8 )
+    {
+      if ( p1[0] & p2[0] )
+        return 1;
+
+      p1++;
+      p2++;
+    }
+
+    if ( count == 0 )
+      return 0;
+
+    return ( p1[0] & p2[0] ) & ~( 0xFF >> count );
+  }
+
+
+  /* merge two masks, used by ps_mask_table_merge_all */
+  static FT_Error
+  ps_mask_table_merge( PS_Mask_Table  table,
+                       FT_Int         index1,
+                       FT_Int         index2,
+                       FT_Memory      memory )
+  {
+    FT_UInt   temp;
+    FT_Error  error = PSH_Err_Ok;
+
+
+    /* swap index1 and index2 so that index1 < index2 */
+    if ( index1 > index2 )
+    {
+      temp   = index1;
+      index1 = index2;
+      index2 = temp;
+    }
+
+    if ( index1 < index2 && index1 >= 0 && index2 < (FT_Int)table->num_masks )
+    {
+      /* we need to merge the bitsets of index1 and index2 with a */
+      /* simple union                                             */
+      PS_Mask  mask1  = table->masks + index1;
+      PS_Mask  mask2  = table->masks + index2;
+      FT_UInt  count1 = mask1->num_bits;
+      FT_UInt  count2 = mask2->num_bits;
+      FT_Int   delta;
+
+
+      if ( count2 > 0 )
+      {
+        FT_UInt   pos;
+        FT_Byte*  read;
+        FT_Byte*  write;
+
+
+        /* if "count2" is greater than "count1", we need to grow the */
+        /* first bitset, and clear the highest bits                  */
+        if ( count2 > count1 )
+        {
+          error = ps_mask_ensure( mask1, count2, memory );
+          if ( error )
+            goto Exit;
+
+          for ( pos = count1; pos < count2; pos++ )
+            ps_mask_clear_bit( mask1, pos );
+        }
+
+        /* merge (unite) the bitsets */
+        read  = mask2->bytes;
+        write = mask1->bytes;
+        pos   = (FT_UInt)( ( count2 + 7 ) >> 3 );
+
+        for ( ; pos > 0; pos-- )
+        {
+          write[0] = (FT_Byte)( write[0] | read[0] );
+          write++;
+          read++;
+        }
+      }
+
+      /* Now, remove "mask2" from the list.  We need to keep the masks */
+      /* sorted in order of importance, so move table elements.        */
+      mask2->num_bits  = 0;
+      mask2->end_point = 0;
+
+      delta = table->num_masks - 1 - index2; /* number of masks to move */
+      if ( delta > 0 )
+      {
+        /* move to end of table for reuse */
+        PS_MaskRec  dummy = *mask2;
+
+
+        ft_memmove( mask2, mask2 + 1, delta * sizeof ( PS_MaskRec ) );
+
+        mask2[delta] = dummy;
+      }
+
+      table->num_masks--;
+    }
+    else
+      FT_TRACE0(( "ps_mask_table_merge: ignoring invalid indices (%d,%d)\n",
+                  index1, index2 ));
+
+  Exit:
+    return error;
+  }
+
+
+  /* Try to merge all masks in a given table.  This is used to merge */
+  /* all counter masks into independent counter "paths".             */
+  /*                                                                 */
+  static FT_Error
+  ps_mask_table_merge_all( PS_Mask_Table  table,
+                           FT_Memory      memory )
+  {
+    FT_Int    index1, index2;
+    FT_Error  error = PSH_Err_Ok;
+
+
+    for ( index1 = table->num_masks - 1; index1 > 0; index1-- )
+    {
+      for ( index2 = index1 - 1; index2 >= 0; index2-- )
+      {
+        if ( ps_mask_table_test_intersect( table, index1, index2 ) )
+        {
+          error = ps_mask_table_merge( table, index2, index1, memory );
+          if ( error )
+            goto Exit;
+
+          break;
+        }
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    PS_DIMENSION MANAGEMENT                    *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* finalize a given dimension */
+  static void
+  ps_dimension_done( PS_Dimension  dimension,
+                     FT_Memory     memory )
+  {
+    ps_mask_table_done( &dimension->counters, memory );
+    ps_mask_table_done( &dimension->masks,    memory );
+    ps_hint_table_done( &dimension->hints,    memory );
+  }
+
+
+  /* initialize a given dimension */
+  static void
+  ps_dimension_init( PS_Dimension  dimension )
+  {
+    dimension->hints.num_hints    = 0;
+    dimension->masks.num_masks    = 0;
+    dimension->counters.num_masks = 0;
+  }
+
+
+#if 0
+
+  /* set a bit at a given index in the current hint mask */
+  static FT_Error
+  ps_dimension_set_mask_bit( PS_Dimension  dim,
+                             FT_UInt       idx,
+                             FT_Memory     memory )
+  {
+    PS_Mask   mask;
+    FT_Error  error = PSH_Err_Ok;
+
+
+    /* get last hint mask */
+    error = ps_mask_table_last( &dim->masks, memory, &mask );
+    if ( error )
+      goto Exit;
+
+    error = ps_mask_set_bit( mask, idx, memory );
+
+  Exit:
+    return error;
+  }
+
+#endif
+
+  /* set the end point in a mask, called from "End" & "Reset" methods */
+  static void
+  ps_dimension_end_mask( PS_Dimension  dim,
+                         FT_UInt       end_point )
+  {
+    FT_UInt  count = dim->masks.num_masks;
+    PS_Mask  mask;
+
+
+    if ( count > 0 )
+    {
+      mask            = dim->masks.masks + count - 1;
+      mask->end_point = end_point;
+    }
+  }
+
+
+  /* set the end point in the current mask, then create a new empty one */
+  /* (called by "Reset" method)                                         */
+  static FT_Error
+  ps_dimension_reset_mask( PS_Dimension  dim,
+                           FT_UInt       end_point,
+                           FT_Memory     memory )
+  {
+    PS_Mask  mask;
+
+
+    /* end current mask */
+    ps_dimension_end_mask( dim, end_point );
+
+    /* allocate new one */
+    return ps_mask_table_alloc( &dim->masks, memory, &mask );
+  }
+
+
+  /* set a new mask, called from the "T2Stem" method */
+  static FT_Error
+  ps_dimension_set_mask_bits( PS_Dimension    dim,
+                              const FT_Byte*  source,
+                              FT_UInt         source_pos,
+                              FT_UInt         source_bits,
+                              FT_UInt         end_point,
+                              FT_Memory       memory )
+  {
+    FT_Error  error = PSH_Err_Ok;
+
+
+    /* reset current mask, if any */
+    error = ps_dimension_reset_mask( dim, end_point, memory );
+    if ( error )
+      goto Exit;
+
+    /* set bits in new mask */
+    error = ps_mask_table_set_bits( &dim->masks, source,
+                                    source_pos, source_bits, memory );
+
+  Exit:
+    return error;
+  }
+
+
+  /* add a new single stem (called from "T1Stem" method) */
+  static FT_Error
+  ps_dimension_add_t1stem( PS_Dimension  dim,
+                           FT_Int        pos,
+                           FT_Int        len,
+                           FT_Memory     memory,
+                           FT_Int       *aindex )
+  {
+    FT_Error  error = PSH_Err_Ok;
+    FT_UInt   flags = 0;
+
+
+    /* detect ghost stem */
+    if ( len < 0 )
+    {
+      flags |= PS_HINT_FLAG_GHOST;
+      if ( len == -21 )
+      {
+        flags |= PS_HINT_FLAG_BOTTOM;
+        pos   += len;
+      }
+      len = 0;
+    }
+
+    if ( aindex )
+      *aindex = -1;
+
+    /* now, lookup stem in the current hints table */
+    {
+      PS_Mask  mask;
+      FT_UInt  idx;
+      FT_UInt  max   = dim->hints.num_hints;
+      PS_Hint  hint  = dim->hints.hints;
+
+
+      for ( idx = 0; idx < max; idx++, hint++ )
+      {
+        if ( hint->pos == pos && hint->len == len )
+          break;
+      }
+
+      /* we need to create a new hint in the table */
+      if ( idx >= max )
+      {
+        error = ps_hint_table_alloc( &dim->hints, memory, &hint );
+        if ( error )
+          goto Exit;
+
+        hint->pos   = pos;
+        hint->len   = len;
+        hint->flags = flags;
+      }
+
+      /* now, store the hint in the current mask */
+      error = ps_mask_table_last( &dim->masks, memory, &mask );
+      if ( error )
+        goto Exit;
+
+      error = ps_mask_set_bit( mask, idx, memory );
+      if ( error )
+        goto Exit;
+
+      if ( aindex )
+        *aindex = (FT_Int)idx;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /* add a "hstem3/vstem3" counter to our dimension table */
+  static FT_Error
+  ps_dimension_add_counter( PS_Dimension  dim,
+                            FT_Int        hint1,
+                            FT_Int        hint2,
+                            FT_Int        hint3,
+                            FT_Memory     memory )
+  {
+    FT_Error  error   = PSH_Err_Ok;
+    FT_UInt   count   = dim->counters.num_masks;
+    PS_Mask   counter = dim->counters.masks;
+
+
+    /* try to find an existing counter mask that already uses */
+    /* one of these stems here                                */
+    for ( ; count > 0; count--, counter++ )
+    {
+      if ( ps_mask_test_bit( counter, hint1 ) ||
+           ps_mask_test_bit( counter, hint2 ) ||
+           ps_mask_test_bit( counter, hint3 ) )
+        break;
+    }
+
+    /* create a new counter when needed */
+    if ( count == 0 )
+    {
+      error = ps_mask_table_alloc( &dim->counters, memory, &counter );
+      if ( error )
+        goto Exit;
+    }
+
+    /* now, set the bits for our hints in the counter mask */
+    error = ps_mask_set_bit( counter, hint1, memory );
+    if ( error )
+      goto Exit;
+
+    error = ps_mask_set_bit( counter, hint2, memory );
+    if ( error )
+      goto Exit;
+
+    error = ps_mask_set_bit( counter, hint3, memory );
+    if ( error )
+      goto Exit;
+
+  Exit:
+    return error;
+  }
+
+
+  /* end of recording session for a given dimension */
+  static FT_Error
+  ps_dimension_end( PS_Dimension  dim,
+                    FT_UInt       end_point,
+                    FT_Memory     memory )
+  {
+    /* end hint mask table */
+    ps_dimension_end_mask( dim, end_point );
+
+    /* merge all counter masks into independent "paths" */
+    return ps_mask_table_merge_all( &dim->counters, memory );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    PS_RECORDER MANAGEMENT                     *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* destroy hints */
+  FT_LOCAL( void )
+  ps_hints_done( PS_Hints  hints )
+  {
+    FT_Memory  memory = hints->memory;
+
+
+    ps_dimension_done( &hints->dimension[0], memory );
+    ps_dimension_done( &hints->dimension[1], memory );
+
+    hints->error  = PSH_Err_Ok;
+    hints->memory = 0;
+  }
+
+
+  FT_LOCAL( FT_Error )
+  ps_hints_init( PS_Hints   hints,
+                 FT_Memory  memory )
+  {
+    FT_MEM_ZERO( hints, sizeof ( *hints ) );
+    hints->memory = memory;
+    return PSH_Err_Ok;
+  }
+
+
+  /* initialize a hints for a new session */
+  static void
+  ps_hints_open( PS_Hints      hints,
+                 PS_Hint_Type  hint_type )
+  {
+    switch ( hint_type )
+    {
+    case PS_HINT_TYPE_1:
+    case PS_HINT_TYPE_2:
+      hints->error     = PSH_Err_Ok;
+      hints->hint_type = hint_type;
+
+      ps_dimension_init( &hints->dimension[0] );
+      ps_dimension_init( &hints->dimension[1] );
+      break;
+
+    default:
+      hints->error     = PSH_Err_Invalid_Argument;
+      hints->hint_type = hint_type;
+
+      FT_TRACE0(( "ps_hints_open: invalid charstring type\n" ));
+      break;
+    }
+  }
+
+
+  /* add one or more stems to the current hints table */
+  static void
+  ps_hints_stem( PS_Hints  hints,
+                 FT_Int    dimension,
+                 FT_UInt   count,
+                 FT_Long*  stems )
+  {
+    if ( !hints->error )
+    {
+      /* limit "dimension" to 0..1 */
+      if ( dimension < 0 || dimension > 1 )
+      {
+        FT_TRACE0(( "ps_hints_stem: invalid dimension (%d) used\n",
+                    dimension ));
+        dimension = ( dimension != 0 );
+      }
+
+      /* record the stems in the current hints/masks table */
+      switch ( hints->hint_type )
+      {
+      case PS_HINT_TYPE_1:  /* Type 1 "hstem" or "vstem" operator */
+      case PS_HINT_TYPE_2:  /* Type 2 "hstem" or "vstem" operator */
+        {
+          PS_Dimension  dim = &hints->dimension[dimension];
+
+
+          for ( ; count > 0; count--, stems += 2 )
+          {
+            FT_Error   error;
+            FT_Memory  memory = hints->memory;
+
+
+            error = ps_dimension_add_t1stem(
+                      dim, (FT_Int)stems[0], (FT_Int)stems[1],
+                      memory, NULL );
+            if ( error )
+            {
+              FT_ERROR(( "ps_hints_stem: could not add stem"
+                         " (%d,%d) to hints table\n", stems[0], stems[1] ));
+
+              hints->error = error;
+              return;
+            }
+          }
+          break;
+        }
+
+      default:
+        FT_TRACE0(( "ps_hints_stem: called with invalid hint type (%d)\n",
+                    hints->hint_type ));
+        break;
+      }
+    }
+  }
+
+
+  /* add one Type1 counter stem to the current hints table */
+  static void
+  ps_hints_t1stem3( PS_Hints   hints,
+                    FT_Int     dimension,
+                    FT_Fixed*  stems )
+  {
+    FT_Error  error = PSH_Err_Ok;
+
+
+    if ( !hints->error )
+    {
+      PS_Dimension  dim;
+      FT_Memory     memory = hints->memory;
+      FT_Int        count;
+      FT_Int        idx[3];
+
+
+      /* limit "dimension" to 0..1 */
+      if ( dimension < 0 || dimension > 1 )
+      {
+        FT_TRACE0(( "ps_hints_t1stem3: invalid dimension (%d) used\n",
+                    dimension ));
+        dimension = ( dimension != 0 );
+      }
+
+      dim = &hints->dimension[dimension];
+
+      /* there must be 6 elements in the 'stem' array */
+      if ( hints->hint_type == PS_HINT_TYPE_1 )
+      {
+        /* add the three stems to our hints/masks table */
+        for ( count = 0; count < 3; count++, stems += 2 )
+        {
+          error = ps_dimension_add_t1stem( dim,
+                                           (FT_Int)FIXED_TO_INT( stems[0] ),
+                                           (FT_Int)FIXED_TO_INT( stems[1] ),
+                                           memory, &idx[count] );
+          if ( error )
+            goto Fail;
+        }
+
+        /* now, add the hints to the counters table */
+        error = ps_dimension_add_counter( dim, idx[0], idx[1], idx[2],
+                                          memory );
+        if ( error )
+          goto Fail;
+      }
+      else
+      {
+        FT_ERROR(( "ps_hints_t1stem3: called with invalid hint type\n" ));
+        error = PSH_Err_Invalid_Argument;
+        goto Fail;
+      }
+    }
+
+    return;
+
+  Fail:
+    FT_ERROR(( "ps_hints_t1stem3: could not add counter stems to table\n" ));
+    hints->error = error;
+  }
+
+
+  /* reset hints (only with Type 1 hints) */
+  static void
+  ps_hints_t1reset( PS_Hints  hints,
+                    FT_UInt   end_point )
+  {
+    FT_Error  error = PSH_Err_Ok;
+
+
+    if ( !hints->error )
+    {
+      FT_Memory  memory = hints->memory;
+
+
+      if ( hints->hint_type == PS_HINT_TYPE_1 )
+      {
+        error = ps_dimension_reset_mask( &hints->dimension[0],
+                                         end_point, memory );
+        if ( error )
+          goto Fail;
+
+        error = ps_dimension_reset_mask( &hints->dimension[1],
+                                         end_point, memory );
+        if ( error )
+          goto Fail;
+      }
+      else
+      {
+        /* invalid hint type */
+        error = PSH_Err_Invalid_Argument;
+        goto Fail;
+      }
+    }
+    return;
+
+  Fail:
+    hints->error = error;
+  }
+
+
+  /* Type2 "hintmask" operator, add a new hintmask to each direction */
+  static void
+  ps_hints_t2mask( PS_Hints        hints,
+                   FT_UInt         end_point,
+                   FT_UInt         bit_count,
+                   const FT_Byte*  bytes )
+  {
+    FT_Error  error;
+
+
+    if ( !hints->error )
+    {
+      PS_Dimension  dim    = hints->dimension;
+      FT_Memory     memory = hints->memory;
+      FT_UInt       count1 = dim[0].hints.num_hints;
+      FT_UInt       count2 = dim[1].hints.num_hints;
+
+
+      /* check bit count; must be equal to current total hint count */
+      if ( bit_count !=  count1 + count2 )
+      {
+        FT_TRACE0(( "ps_hints_t2mask:"
+                    " called with invalid bitcount %d (instead of %d)\n",
+                   bit_count, count1 + count2 ));
+
+        /* simply ignore the operator */
+        return;
+      }
+
+      /* set-up new horizontal and vertical hint mask now */
+      error = ps_dimension_set_mask_bits( &dim[0], bytes, count2, count1,
+                                          end_point, memory );
+      if ( error )
+        goto Fail;
+
+      error = ps_dimension_set_mask_bits( &dim[1], bytes, 0, count2,
+                                          end_point, memory );
+      if ( error )
+        goto Fail;
+    }
+    return;
+
+  Fail:
+    hints->error = error;
+  }
+
+
+  static void
+  ps_hints_t2counter( PS_Hints        hints,
+                      FT_UInt         bit_count,
+                      const FT_Byte*  bytes )
+  {
+    FT_Error  error;
+
+
+    if ( !hints->error )
+    {
+      PS_Dimension  dim    = hints->dimension;
+      FT_Memory     memory = hints->memory;
+      FT_UInt       count1 = dim[0].hints.num_hints;
+      FT_UInt       count2 = dim[1].hints.num_hints;
+
+
+      /* check bit count, must be equal to current total hint count */
+      if ( bit_count !=  count1 + count2 )
+      {
+        FT_TRACE0(( "ps_hints_t2counter:"
+                    " called with invalid bitcount %d (instead of %d)\n",
+                   bit_count, count1 + count2 ));
+
+        /* simply ignore the operator */
+        return;
+      }
+
+      /* set-up new horizontal and vertical hint mask now */
+      error = ps_dimension_set_mask_bits( &dim[0], bytes, 0, count1,
+                                          0, memory );
+      if ( error )
+        goto Fail;
+
+      error = ps_dimension_set_mask_bits( &dim[1], bytes, count1, count2,
+                                          0, memory );
+      if ( error )
+        goto Fail;
+    }
+    return;
+
+  Fail:
+    hints->error = error;
+  }
+
+
+  /* end recording session */
+  static FT_Error
+  ps_hints_close( PS_Hints  hints,
+                  FT_UInt   end_point )
+  {
+    FT_Error  error;
+
+
+    error = hints->error;
+    if ( !error )
+    {
+      FT_Memory     memory = hints->memory;
+      PS_Dimension  dim    = hints->dimension;
+
+
+      error = ps_dimension_end( &dim[0], end_point, memory );
+      if ( !error )
+      {
+        error = ps_dimension_end( &dim[1], end_point, memory );
+      }
+    }
+
+#ifdef DEBUG_HINTER
+    if ( !error )
+      ps_debug_hints = hints;
+#endif
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                TYPE 1 HINTS RECORDING INTERFACE               *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  t1_hints_open( T1_Hints  hints )
+  {
+    ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_1 );
+  }
+
+  static void
+  t1_hints_stem( T1_Hints   hints,
+                 FT_Int     dimension,
+                 FT_Fixed*  coords )
+  {
+    FT_Pos  stems[2];
+
+
+    stems[0] = FIXED_TO_INT( coords[0] );
+    stems[1] = FIXED_TO_INT( coords[1] );
+
+    ps_hints_stem( (PS_Hints)hints, dimension, 1, stems );
+  }
+
+
+  FT_LOCAL_DEF( void )
+  t1_hints_funcs_init( T1_Hints_FuncsRec*  funcs )
+  {
+    FT_MEM_ZERO( (char*)funcs, sizeof ( *funcs ) );
+
+    funcs->open  = (T1_Hints_OpenFunc)    t1_hints_open;
+    funcs->close = (T1_Hints_CloseFunc)   ps_hints_close;
+    funcs->stem  = (T1_Hints_SetStemFunc) t1_hints_stem;
+    funcs->stem3 = (T1_Hints_SetStem3Func)ps_hints_t1stem3;
+    funcs->reset = (T1_Hints_ResetFunc)   ps_hints_t1reset;
+    funcs->apply = (T1_Hints_ApplyFunc)   ps_hints_apply;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                TYPE 2 HINTS RECORDING INTERFACE               *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  t2_hints_open( T2_Hints  hints )
+  {
+    ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_2 );
+  }
+
+
+  static void
+  t2_hints_stems( T2_Hints   hints,
+                  FT_Int     dimension,
+                  FT_Int     count,
+                  FT_Fixed*  coords )
+  {
+    FT_Pos  stems[32], y, n;
+    FT_Int  total = count;
+
+
+    y = 0;
+    while ( total > 0 )
+    {
+      /* determine number of stems to write */
+      count = total;
+      if ( count > 16 )
+        count = 16;
+
+      /* compute integer stem positions in font units */
+      for ( n = 0; n < count * 2; n++ )
+      {
+        y       += coords[n];
+        stems[n] = FIXED_TO_INT( y );
+      }
+
+      /* compute lengths */
+      for ( n = 0; n < count * 2; n += 2 )
+        stems[n + 1] = stems[n + 1] - stems[n];
+
+      /* add them to the current dimension */
+      ps_hints_stem( (PS_Hints)hints, dimension, count, stems );
+
+      total -= count;
+    }
+  }
+
+
+  FT_LOCAL_DEF( void )
+  t2_hints_funcs_init( T2_Hints_FuncsRec*  funcs )
+  {
+    FT_MEM_ZERO( funcs, sizeof ( *funcs ) );
+
+    funcs->open    = (T2_Hints_OpenFunc)   t2_hints_open;
+    funcs->close   = (T2_Hints_CloseFunc)  ps_hints_close;
+    funcs->stems   = (T2_Hints_StemsFunc)  t2_hints_stems;
+    funcs->hintmask= (T2_Hints_MaskFunc)   ps_hints_t2mask;
+    funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter;
+    funcs->apply   = (T2_Hints_ApplyFunc)  ps_hints_apply;
+  }
+
+
+/* END */
diff --git a/src/pshinter/pshrec.h b/src/pshinter/pshrec.h
new file mode 100644 (file)
index 0000000..dcb3197
--- /dev/null
@@ -0,0 +1,176 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pshrec.h                                                               */
+/*                                                                         */
+/*    Postscript (Type1/Type2) hints recorder (specification).             */
+/*                                                                         */
+/*  Copyright 2001, 2002, 2003, 2006, 2008 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /**************************************************************************/
+  /*                                                                        */
+  /*  The functions defined here are called from the Type 1, CID and CFF    */
+  /*  font drivers to record the hints of a given character/glyph.          */
+  /*                                                                        */
+  /*  The hints are recorded in a unified format, and are later processed   */
+  /*  by the `optimizer' and `fitter' to adjust the outlines to the pixel   */
+  /*  grid.                                                                 */
+  /*                                                                        */
+  /**************************************************************************/
+
+
+#ifndef __PSHREC_H__
+#define __PSHREC_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_POSTSCRIPT_HINTS_H
+#include "pshglob.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                 GLYPH HINTS RECORDER INTERNALS                *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* handle to hint record */
+  typedef struct PS_HintRec_*  PS_Hint;
+
+  /* hint types */
+  typedef enum  PS_Hint_Type_
+  {
+    PS_HINT_TYPE_1 = 1,
+    PS_HINT_TYPE_2 = 2
+
+  } PS_Hint_Type;
+
+
+  /* hint flags */
+  typedef enum  PS_Hint_Flags_
+  {
+    PS_HINT_FLAG_GHOST  = 1,
+    PS_HINT_FLAG_BOTTOM = 2
+
+  } PS_Hint_Flags;
+
+
+  /* hint descriptor */
+  typedef struct  PS_HintRec_
+  {
+    FT_Int   pos;
+    FT_Int   len;
+    FT_UInt  flags;
+
+  } PS_HintRec;
+
+
+#define ps_hint_is_active( x )  ( (x)->flags & PS_HINT_FLAG_ACTIVE )
+#define ps_hint_is_ghost( x )   ( (x)->flags & PS_HINT_FLAG_GHOST  )
+#define ps_hint_is_bottom( x )  ( (x)->flags & PS_HINT_FLAG_BOTTOM )
+
+
+  /* hints table descriptor */
+  typedef struct  PS_Hint_TableRec_
+  {
+    FT_UInt  num_hints;
+    FT_UInt  max_hints;
+    PS_Hint  hints;
+
+  } PS_Hint_TableRec, *PS_Hint_Table;
+
+
+  /* hint and counter mask descriptor */
+  typedef struct  PS_MaskRec_
+  {
+    FT_UInt   num_bits;
+    FT_UInt   max_bits;
+    FT_Byte*  bytes;
+    FT_UInt   end_point;
+
+  } PS_MaskRec, *PS_Mask;
+
+
+  /* masks and counters table descriptor */
+  typedef struct  PS_Mask_TableRec_
+  {
+    FT_UInt  num_masks;
+    FT_UInt  max_masks;
+    PS_Mask  masks;
+
+  } PS_Mask_TableRec, *PS_Mask_Table;
+
+
+ /* dimension-specific hints descriptor */
+  typedef struct  PS_DimensionRec_
+  {
+    PS_Hint_TableRec  hints;
+    PS_Mask_TableRec  masks;
+    PS_Mask_TableRec  counters;
+
+  } PS_DimensionRec, *PS_Dimension;
+
+
+  /* glyph hints descriptor                                */
+  /* dimension 0 => X coordinates + vertical hints/stems   */
+  /* dimension 1 => Y coordinates + horizontal hints/stems */
+  typedef struct  PS_HintsRec_
+  {
+    FT_Memory        memory;
+    FT_Error         error;
+    FT_UInt32        magic;
+    PS_Hint_Type     hint_type;
+    PS_DimensionRec  dimension[2];
+
+  } PS_HintsRec, *PS_Hints;
+
+  /* */
+
+  /* initialize hints recorder */
+  FT_LOCAL( FT_Error )
+  ps_hints_init( PS_Hints   hints,
+                 FT_Memory  memory );
+
+  /* finalize hints recorder */
+  FT_LOCAL( void )
+  ps_hints_done( PS_Hints  hints );
+
+  /* initialize Type1 hints recorder interface */
+  FT_LOCAL( void )
+  t1_hints_funcs_init( T1_Hints_FuncsRec*  funcs );
+
+  /* initialize Type2 hints recorder interface */
+  FT_LOCAL( void )
+  t2_hints_funcs_init( T2_Hints_FuncsRec*  funcs );
+
+
+#ifdef DEBUG_HINTER
+  extern PS_Hints  ps_debug_hints;
+  extern  int      ps_debug_no_horz_hints;
+  extern  int      ps_debug_no_vert_hints;
+#endif
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* __PS_HINTER_RECORD_H__ */
+
+
+/* END */
diff --git a/src/pshinter/rules.mk b/src/pshinter/rules.mk
new file mode 100644 (file)
index 0000000..888ece1
--- /dev/null
@@ -0,0 +1,73 @@
+#
+# FreeType 2 PSHinter driver configuration rules
+#
+
+
+# Copyright 2001, 2003, 2011 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.
+
+
+# PSHINTER driver directory
+#
+PSHINTER_DIR := $(SRC_DIR)/pshinter
+
+
+# compilation flags for the driver
+#
+PSHINTER_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSHINTER_DIR))
+
+
+# PSHINTER driver sources (i.e., C files)
+#
+PSHINTER_DRV_SRC := $(PSHINTER_DIR)/pshalgo.c \
+                    $(PSHINTER_DIR)/pshglob.c \
+                    $(PSHINTER_DIR)/pshmod.c  \
+                    $(PSHINTER_DIR)/pshpic.c  \
+                    $(PSHINTER_DIR)/pshrec.c
+
+
+# PSHINTER driver headers
+#
+PSHINTER_DRV_H := $(PSHINTER_DRV_SRC:%c=%h) \
+                  $(PSHINTER_DIR)/pshnterr.h
+
+
+# PSHINTER driver object(s)
+#
+#   PSHINTER_DRV_OBJ_M is used during `multi' builds.
+#   PSHINTER_DRV_OBJ_S is used during `single' builds.
+#
+PSHINTER_DRV_OBJ_M := $(PSHINTER_DRV_SRC:$(PSHINTER_DIR)/%.c=$(OBJ_DIR)/%.$O)
+PSHINTER_DRV_OBJ_S := $(OBJ_DIR)/pshinter.$O
+
+# PSHINTER driver source file for single build
+#
+PSHINTER_DRV_SRC_S := $(PSHINTER_DIR)/pshinter.c
+
+
+# PSHINTER driver - single object
+#
+$(PSHINTER_DRV_OBJ_S): $(PSHINTER_DRV_SRC_S) $(PSHINTER_DRV_SRC) \
+                       $(FREETYPE_H) $(PSHINTER_DRV_H)
+       $(PSHINTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSHINTER_DRV_SRC_S))
+
+
+# PSHINTER driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(PSHINTER_DIR)/%.c $(FREETYPE_H) $(PSHINTER_DRV_H)
+       $(PSHINTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(PSHINTER_DRV_OBJ_S)
+DRV_OBJS_M += $(PSHINTER_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/psnames/Jamfile b/src/psnames/Jamfile
new file mode 100644 (file)
index 0000000..06c0dda
--- /dev/null
@@ -0,0 +1,29 @@
+# FreeType 2 src/psnames Jamfile
+#
+# Copyright 2001 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) psnames ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = psmodule pspic ;
+  }
+  else
+  {
+    _sources = psnames ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/psnames Jamfile
diff --git a/src/psnames/module.mk b/src/psnames/module.mk
new file mode 100644 (file)
index 0000000..a6e9082
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# FreeType 2 PSnames module definition
+#
+
+
+# Copyright 1996-2000, 2006 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.
+
+
+FTMODULE_H_COMMANDS += PSNAMES_MODULE
+
+define PSNAMES_MODULE
+$(OPEN_DRIVER) FT_Module_Class, psnames_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)psnames   $(ECHO_DRIVER_DESC)Postscript & Unicode Glyph name handling$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/src/psnames/psmodule.c b/src/psnames/psmodule.c
new file mode 100644 (file)
index 0000000..3619174
--- /dev/null
@@ -0,0 +1,609 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psmodule.c                                                             */
+/*                                                                         */
+/*    PSNames module implementation (body).                                */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2005, 2006, 2007, 2008 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_SERVICE_POSTSCRIPT_CMAPS_H
+
+#include "psmodule.h"
+#include "pstables.h"
+
+#include "psnamerr.h"
+#include "pspic.h"
+
+
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+
+
+#define VARIANT_BIT         0x80000000UL
+#define BASE_GLYPH( code )  ( (FT_UInt32)( (code) & ~VARIANT_BIT ) )
+
+
+  /* Return the Unicode value corresponding to a given glyph.  Note that */
+  /* we do deal with glyph variants by detecting a non-initial dot in    */
+  /* the name, as in `A.swash' or `e.final'; in this case, the           */
+  /* VARIANT_BIT is set in the return value.                             */
+  /*                                                                     */
+  static FT_UInt32
+  ps_unicode_value( const char*  glyph_name )
+  {
+    /* If the name begins with `uni', then the glyph name may be a */
+    /* hard-coded unicode character code.                          */
+    if ( glyph_name[0] == 'u' &&
+         glyph_name[1] == 'n' &&
+         glyph_name[2] == 'i' )
+    {
+      /* determine whether the next four characters following are */
+      /* hexadecimal.                                             */
+
+      /* XXX: Add code to deal with ligatures, i.e. glyph names like */
+      /*      `uniXXXXYYYYZZZZ'...                                   */
+
+      FT_Int       count;
+      FT_UInt32    value = 0;
+      const char*  p     = glyph_name + 3;
+
+
+      for ( count = 4; count > 0; count--, p++ )
+      {
+        char          c = *p;
+        unsigned int  d;
+
+
+        d = (unsigned char)c - '0';
+        if ( d >= 10 )
+        {
+          d = (unsigned char)c - 'A';
+          if ( d >= 6 )
+            d = 16;
+          else
+            d += 10;
+        }
+
+        /* Exit if a non-uppercase hexadecimal character was found   */
+        /* -- this also catches character codes below `0' since such */
+        /* negative numbers cast to `unsigned int' are far too big.  */
+        if ( d >= 16 )
+          break;
+
+        value = ( value << 4 ) + d;
+      }
+
+      /* there must be exactly four hex digits */
+      if ( count == 0 )
+      {
+        if ( *p == '\0' )
+          return value;
+        if ( *p == '.' )
+          return (FT_UInt32)( value | VARIANT_BIT );
+      }
+    }
+
+    /* If the name begins with `u', followed by four to six uppercase */
+    /* hexadecimal digits, it is a hard-coded unicode character code. */
+    if ( glyph_name[0] == 'u' )
+    {
+      FT_Int       count;
+      FT_UInt32    value = 0;
+      const char*  p     = glyph_name + 1;
+
+
+      for ( count = 6; count > 0; count--, p++ )
+      {
+        char          c = *p;
+        unsigned int  d;
+
+
+        d = (unsigned char)c - '0';
+        if ( d >= 10 )
+        {
+          d = (unsigned char)c - 'A';
+          if ( d >= 6 )
+            d = 16;
+          else
+            d += 10;
+        }
+
+        if ( d >= 16 )
+          break;
+
+        value = ( value << 4 ) + d;
+      }
+
+      if ( count <= 2 )
+      {
+        if ( *p == '\0' )
+          return value;
+        if ( *p == '.' )
+          return (FT_UInt32)( value | VARIANT_BIT );
+      }
+    }
+
+    /* Look for a non-initial dot in the glyph name in order to */
+    /* find variants like `A.swash', `e.final', etc.            */
+    {
+      const char*  p   = glyph_name;
+      const char*  dot = NULL;
+
+
+      for ( ; *p; p++ )
+      {
+        if ( *p == '.' && p > glyph_name )
+        {
+          dot = p;
+          break;
+        }
+      }
+
+      /* now look up the glyph in the Adobe Glyph List */
+      if ( !dot )
+        return (FT_UInt32)ft_get_adobe_glyph_index( glyph_name, p );
+      else
+        return (FT_UInt32)( ft_get_adobe_glyph_index( glyph_name, dot ) |
+                            VARIANT_BIT );
+    }
+  }
+
+
+  /* ft_qsort callback to sort the unicode map */
+  FT_CALLBACK_DEF( int )
+  compare_uni_maps( const void*  a,
+                    const void*  b )
+  {
+    PS_UniMap*  map1 = (PS_UniMap*)a;
+    PS_UniMap*  map2 = (PS_UniMap*)b;
+    FT_UInt32   unicode1 = BASE_GLYPH( map1->unicode );
+    FT_UInt32   unicode2 = BASE_GLYPH( map2->unicode );
+
+
+    /* sort base glyphs before glyph variants */
+    if ( unicode1 == unicode2 )
+    {
+      if ( map1->unicode > map2->unicode )
+        return 1;
+      else if ( map1->unicode < map2->unicode )
+        return -1;
+      else
+        return 0;
+    }
+    else
+    {
+      if ( unicode1 > unicode2 )
+        return 1;
+      else if ( unicode1 < unicode2 )
+        return -1;
+      else
+        return 0;
+    }
+  }
+
+
+  /* support for extra glyphs not handled (well) in AGL; */
+  /* we add extra mappings for them if necessary         */
+
+#define EXTRA_GLYPH_LIST_SIZE  10
+
+  static const FT_UInt32  ft_extra_glyph_unicodes[EXTRA_GLYPH_LIST_SIZE] =
+  {
+    /* WGL 4 */
+    0x0394,
+    0x03A9,
+    0x2215,
+    0x00AD,
+    0x02C9,
+    0x03BC,
+    0x2219,
+    0x00A0,
+    /* Romanian */
+    0x021A,
+    0x021B
+  };
+
+  static const char  ft_extra_glyph_names[] =
+  {
+    'D','e','l','t','a',0,
+    'O','m','e','g','a',0,
+    'f','r','a','c','t','i','o','n',0,
+    'h','y','p','h','e','n',0,
+    'm','a','c','r','o','n',0,
+    'm','u',0,
+    'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0,
+    's','p','a','c','e',0,
+    'T','c','o','m','m','a','a','c','c','e','n','t',0,
+    't','c','o','m','m','a','a','c','c','e','n','t',0
+  };
+
+  static const FT_Int
+  ft_extra_glyph_name_offsets[EXTRA_GLYPH_LIST_SIZE] =
+  {
+     0,
+     6,
+    12,
+    21,
+    28,
+    35,
+    38,
+    53,
+    59,
+    72
+  };
+
+
+  static void
+  ps_check_extra_glyph_name( const char*  gname,
+                             FT_UInt      glyph,
+                             FT_UInt*     extra_glyphs,
+                             FT_UInt     *states )
+  {
+    FT_UInt  n;
+
+
+    for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )
+    {
+      if ( ft_strcmp( ft_extra_glyph_names +
+                        ft_extra_glyph_name_offsets[n], gname ) == 0 )
+      {
+        if ( states[n] == 0 )
+        {
+          /* mark this extra glyph as a candidate for the cmap */
+          states[n]     = 1;
+          extra_glyphs[n] = glyph;
+        }
+
+        return;
+      }
+    }
+  }
+
+
+  static void
+  ps_check_extra_glyph_unicode( FT_UInt32  uni_char,
+                                FT_UInt   *states )
+  {
+    FT_UInt  n;
+
+
+    for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )
+    {
+      if ( uni_char == ft_extra_glyph_unicodes[n] )
+      {
+        /* disable this extra glyph from being added to the cmap */
+        states[n] = 2;
+
+        return;
+      }
+    }
+  }
+
+
+  /* Build a table that maps Unicode values to glyph indices. */
+  static FT_Error
+  ps_unicodes_init( FT_Memory             memory,
+                    PS_Unicodes           table,
+                    FT_UInt               num_glyphs,
+                    PS_GetGlyphNameFunc   get_glyph_name,
+                    PS_FreeGlyphNameFunc  free_glyph_name,
+                    FT_Pointer            glyph_data )
+  {
+    FT_Error  error;
+
+    FT_UInt  extra_glyph_list_states[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+    FT_UInt  extra_glyphs[EXTRA_GLYPH_LIST_SIZE];
+
+
+    /* we first allocate the table */
+    table->num_maps = 0;
+    table->maps     = 0;
+
+    if ( !FT_NEW_ARRAY( table->maps, num_glyphs + EXTRA_GLYPH_LIST_SIZE ) )
+    {
+      FT_UInt     n;
+      FT_UInt     count;
+      PS_UniMap*  map;
+      FT_UInt32   uni_char;
+
+
+      map = table->maps;
+
+      for ( n = 0; n < num_glyphs; n++ )
+      {
+        const char*  gname = get_glyph_name( glyph_data, n );
+
+
+        if ( gname )
+        {
+          ps_check_extra_glyph_name( gname, n,
+                                     extra_glyphs, extra_glyph_list_states );
+          uni_char = ps_unicode_value( gname );
+
+          if ( BASE_GLYPH( uni_char ) != 0 )
+          {
+            ps_check_extra_glyph_unicode( uni_char,
+                                          extra_glyph_list_states );
+            map->unicode     = uni_char;
+            map->glyph_index = n;
+            map++;
+          }
+
+          if ( free_glyph_name )
+            free_glyph_name( glyph_data, gname );
+        }
+      }
+
+      for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )
+      {
+        if ( extra_glyph_list_states[n] == 1 )
+        {
+          /* This glyph name has an additional representation. */
+          /* Add it to the cmap.                               */
+
+          map->unicode     = ft_extra_glyph_unicodes[n];
+          map->glyph_index = extra_glyphs[n];
+          map++;
+        }
+      }
+
+      /* now compress the table a bit */
+      count = (FT_UInt)( map - table->maps );
+
+      if ( count == 0 )
+      {
+        /* No unicode chars here! */
+        FT_FREE( table->maps );
+        if ( !error )
+          error = PSnames_Err_No_Unicode_Glyph_Name;
+      }
+      else
+      {
+        /* Reallocate if the number of used entries is much smaller. */
+        if ( count < num_glyphs / 2 )
+        {
+          (void)FT_RENEW_ARRAY( table->maps, num_glyphs, count );
+          error = PSnames_Err_Ok;
+        }
+
+        /* Sort the table in increasing order of unicode values, */
+        /* taking care of glyph variants.                        */
+        ft_qsort( table->maps, count, sizeof ( PS_UniMap ),
+                  compare_uni_maps );
+      }
+
+      table->num_maps = count;
+    }
+
+    return error;
+  }
+
+
+  static FT_UInt
+  ps_unicodes_char_index( PS_Unicodes  table,
+                          FT_UInt32    unicode )
+  {
+    PS_UniMap  *min, *max, *mid, *result = NULL;
+
+
+    /* Perform a binary search on the table. */
+
+    min = table->maps;
+    max = min + table->num_maps - 1;
+
+    while ( min <= max )
+    {
+      FT_UInt32  base_glyph;
+
+
+      mid = min + ( ( max - min ) >> 1 );
+
+      if ( mid->unicode == unicode )
+      {
+        result = mid;
+        break;
+      }
+
+      base_glyph = BASE_GLYPH( mid->unicode );
+
+      if ( base_glyph == unicode )
+        result = mid; /* remember match but continue search for base glyph */
+
+      if ( min == max )
+        break;
+
+      if ( base_glyph < unicode )
+        min = mid + 1;
+      else
+        max = mid - 1;
+    }
+
+    if ( result )
+      return result->glyph_index;
+    else
+      return 0;
+  }
+
+
+  static FT_UInt32
+  ps_unicodes_char_next( PS_Unicodes  table,
+                         FT_UInt32   *unicode )
+  {
+    FT_UInt    result    = 0;
+    FT_UInt32  char_code = *unicode + 1;
+
+
+    {
+      FT_UInt     min = 0;
+      FT_UInt     max = table->num_maps;
+      FT_UInt     mid;
+      PS_UniMap*  map;
+      FT_UInt32   base_glyph;
+
+
+      while ( min < max )
+      {
+        mid = min + ( ( max - min ) >> 1 );
+        map = table->maps + mid;
+
+        if ( map->unicode == char_code )
+        {
+          result = map->glyph_index;
+          goto Exit;
+        }
+
+        base_glyph = BASE_GLYPH( map->unicode );
+
+        if ( base_glyph == char_code )
+          result = map->glyph_index;
+
+        if ( base_glyph < char_code )
+          min = mid + 1;
+        else
+          max = mid;
+      }
+
+      if ( result )
+        goto Exit;               /* we have a variant glyph */
+
+      /* we didn't find it; check whether we have a map just above it */
+      char_code = 0;
+
+      if ( min < table->num_maps )
+      {
+        map       = table->maps + min;
+        result    = map->glyph_index;
+        char_code = BASE_GLYPH( map->unicode );
+      }
+    }
+
+  Exit:
+    *unicode = char_code;
+    return result;
+  }
+
+
+#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
+
+
+  static const char*
+  ps_get_macintosh_name( FT_UInt  name_index )
+  {
+    if ( name_index >= FT_NUM_MAC_NAMES )
+      name_index = 0;
+
+    return ft_standard_glyph_names + ft_mac_names[name_index];
+  }
+
+
+  static const char*
+  ps_get_standard_strings( FT_UInt  sid )
+  {
+    if ( sid >= FT_NUM_SID_NAMES )
+      return 0;
+
+    return ft_standard_glyph_names + ft_sid_names[sid];
+  }
+
+
+#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+  FT_DEFINE_SERVICE_PSCMAPSREC(pscmaps_interface,
+    (PS_Unicode_ValueFunc)     ps_unicode_value,
+    (PS_Unicodes_InitFunc)     ps_unicodes_init,
+    (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index,
+    (PS_Unicodes_CharNextFunc) ps_unicodes_char_next,
+
+    (PS_Macintosh_NameFunc)    ps_get_macintosh_name,
+    (PS_Adobe_Std_StringsFunc) ps_get_standard_strings,
+
+    t1_standard_encoding,
+    t1_expert_encoding
+  )
+
+#else
+
+  FT_DEFINE_SERVICE_PSCMAPSREC(pscmaps_interface,
+    0,
+    0,
+    0,
+    0,
+
+    (PS_Macintosh_NameFunc)    ps_get_macintosh_name,
+    (PS_Adobe_Std_StringsFunc) ps_get_standard_strings,
+
+    t1_standard_encoding,
+    t1_expert_encoding
+  )
+
+#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
+
+
+  FT_DEFINE_SERVICEDESCREC1(pscmaps_services,
+    FT_SERVICE_ID_POSTSCRIPT_CMAPS, &FT_PSCMAPS_INTERFACE_GET
+  )
+
+
+
+
+  static FT_Pointer
+  psnames_get_service( FT_Module    module,
+                       const char*  service_id )
+  {
+    /* FT_PSCMAPS_SERVICES_GET derefers `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+    FT_Library  library;
+
+
+    if ( !module )
+      return NULL;
+    library = module->library;
+    if ( !library )
+      return NULL;
+#else
+    FT_UNUSED( module );
+#endif
+
+    return ft_service_list_lookup( FT_PSCMAPS_SERVICES_GET, service_id );
+  }
+
+#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
+
+#ifndef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+#define PUT_PS_NAMES_SERVICE(a) 0
+#else
+#define PUT_PS_NAMES_SERVICE(a) a
+#endif
+
+  FT_DEFINE_MODULE(psnames_module_class,
+
+    0,  /* this is not a font driver, nor a renderer */
+    sizeof ( FT_ModuleRec ),
+
+    "psnames",  /* driver name                         */
+    0x10000L,   /* driver version                      */
+    0x20000L,   /* driver requires FreeType 2 or above */
+
+    PUT_PS_NAMES_SERVICE((void*)&FT_PSCMAPS_INTERFACE_GET),   /* module specific interface */
+    (FT_Module_Constructor)0,
+    (FT_Module_Destructor) 0,
+    (FT_Module_Requester)  PUT_PS_NAMES_SERVICE(psnames_get_service)
+  )
+
+
+
+/* END */
diff --git a/src/psnames/psmodule.h b/src/psnames/psmodule.h
new file mode 100644 (file)
index 0000000..28fa148
--- /dev/null
@@ -0,0 +1,38 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psmodule.h                                                             */
+/*                                                                         */
+/*    High-level PSNames module interface (specification).                 */
+/*                                                                         */
+/*  Copyright 1996-2001 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSMODULE_H__
+#define __PSMODULE_H__
+
+
+#include <ft2build.h>
+#include FT_MODULE_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_DECLARE_MODULE( psnames_module_class )
+
+
+FT_END_HEADER
+
+#endif /* __PSMODULE_H__ */
+
+
+/* END */
diff --git a/src/psnames/psnamerr.h b/src/psnames/psnamerr.h
new file mode 100644 (file)
index 0000000..acda7f9
--- /dev/null
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psnamerr.h                                                             */
+/*                                                                         */
+/*    PS names module error codes (specification only).                    */
+/*                                                                         */
+/*  Copyright 2001, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the PS names module error enumeration     */
+  /* constants.                                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __PSNAMERR_H__
+#define __PSNAMERR_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  PSnames_Err_
+#define FT_ERR_BASE    FT_Mod_Err_PSnames
+
+#include FT_ERRORS_H
+
+#endif /* __PSNAMERR_H__ */
+
+
+/* END */
diff --git a/src/psnames/psnames.c b/src/psnames/psnames.c
new file mode 100644 (file)
index 0000000..1ede225
--- /dev/null
@@ -0,0 +1,26 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psnames.c                                                              */
+/*                                                                         */
+/*    FreeType PSNames module component (body only).                       */
+/*                                                                         */
+/*  Copyright 1996-2001 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include <ft2build.h>
+#include "pspic.c"
+#include "psmodule.c"
+
+
+/* END */
diff --git a/src/psnames/pspic.c b/src/psnames/pspic.c
new file mode 100644 (file)
index 0000000..467ab73
--- /dev/null
@@ -0,0 +1,94 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pspic.c                                                                */
+/*                                                                         */
+/*    The FreeType position independent code services for psnames module.  */
+/*                                                                         */
+/*  Copyright 2009, 2010 by                                                */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_INTERNAL_OBJECTS_H
+#include "pspic.h"
+#include "psnamerr.h"
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* forward declaration of PIC init functions from psmodule.c */
+  FT_Error
+  FT_Create_Class_pscmaps_services( FT_Library           library,
+                                    FT_ServiceDescRec**  output_class );
+  void
+  FT_Destroy_Class_pscmaps_services( FT_Library          library,
+                                     FT_ServiceDescRec*  clazz );
+
+  void
+  FT_Init_Class_pscmaps_interface( FT_Library              library,
+                                   FT_Service_PsCMapsRec*  clazz );
+
+  void
+  psnames_module_class_pic_free( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Memory  memory = library->memory;
+
+
+    if ( pic_container->psnames )
+    {
+      PSModulePIC*  container = (PSModulePIC*)pic_container->psnames;
+
+
+      if(container->pscmaps_services)
+        FT_Destroy_Class_pscmaps_services( library,
+                                           container->pscmaps_services );
+      container->pscmaps_services = NULL;
+      FT_FREE( container );
+      pic_container->psnames = NULL;
+    }
+  }
+
+
+  FT_Error
+  psnames_module_class_pic_init( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Error           error         = PSnames_Err_Ok;
+    PSModulePIC*       container;
+    FT_Memory          memory        = library->memory;
+
+
+    /* allocate pointer, clear and set global container pointer */
+    if ( FT_ALLOC ( container, sizeof ( *container ) ) )
+      return error;
+    FT_MEM_SET( container, 0, sizeof ( *container ) );
+    pic_container->psnames = container;
+
+    /* initialize pointer table - this is how the module usually expects this data */
+    error = FT_Create_Class_pscmaps_services(
+              library, &container->pscmaps_services );
+    if ( error )
+      goto Exit;
+    FT_Init_Class_pscmaps_interface( library,
+                                     &container->pscmaps_interface );
+
+Exit:
+    if ( error )
+      psnames_module_class_pic_free( library );
+    return error;
+  }
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/src/psnames/pspic.h b/src/psnames/pspic.h
new file mode 100644 (file)
index 0000000..1169b89
--- /dev/null
@@ -0,0 +1,61 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pspic.h                                                                */
+/*                                                                         */
+/*    The FreeType position independent code services for psnames module.  */
+/*                                                                         */
+/*  Copyright 2009 by                                                      */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __PSPIC_H__
+#define __PSPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include FT_INTERNAL_PIC_H
+
+#ifndef FT_CONFIG_OPTION_PIC
+#define FT_PSCMAPS_SERVICES_GET     pscmaps_services
+#define FT_PSCMAPS_INTERFACE_GET    pscmaps_interface
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include FT_SERVICE_POSTSCRIPT_CMAPS_H
+
+  typedef struct PSModulePIC_
+  {
+    FT_ServiceDescRec* pscmaps_services;
+    FT_Service_PsCMapsRec pscmaps_interface;
+  } PSModulePIC;
+
+#define GET_PIC(lib)                ((PSModulePIC*)((lib)->pic_container.psnames))
+#define FT_PSCMAPS_SERVICES_GET     (GET_PIC(library)->pscmaps_services)
+#define FT_PSCMAPS_INTERFACE_GET    (GET_PIC(library)->pscmaps_interface)
+
+  /* see pspic.c for the implementation */
+  void
+  psnames_module_class_pic_free( FT_Library  library );
+
+  FT_Error
+  psnames_module_class_pic_init( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __PSPIC_H__ */
+
+
+/* END */
diff --git a/src/psnames/pstables.h b/src/psnames/pstables.h
new file mode 100644 (file)
index 0000000..0a6637f
--- /dev/null
@@ -0,0 +1,4170 @@
+/***************************************************************************/
+/*                                                                         */
+/*  pstables.h                                                             */
+/*                                                                         */
+/*    PostScript glyph names.                                              */
+/*                                                                         */
+/*  Copyright 2005, 2008, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /* This file has been generated automatically -- do not edit! */
+
+
+  static const char  ft_standard_glyph_names[3696] =
+  {
+    '.','n','u','l','l', 0,
+    'n','o','n','m','a','r','k','i','n','g','r','e','t','u','r','n', 0,
+    'n','o','t','e','q','u','a','l', 0,
+    'i','n','f','i','n','i','t','y', 0,
+    'l','e','s','s','e','q','u','a','l', 0,
+    'g','r','e','a','t','e','r','e','q','u','a','l', 0,
+    'p','a','r','t','i','a','l','d','i','f','f', 0,
+    's','u','m','m','a','t','i','o','n', 0,
+    'p','r','o','d','u','c','t', 0,
+    'p','i', 0,
+    'i','n','t','e','g','r','a','l', 0,
+    'O','m','e','g','a', 0,
+    'r','a','d','i','c','a','l', 0,
+    'a','p','p','r','o','x','e','q','u','a','l', 0,
+    'D','e','l','t','a', 0,
+    'n','o','n','b','r','e','a','k','i','n','g','s','p','a','c','e', 0,
+    'l','o','z','e','n','g','e', 0,
+    'a','p','p','l','e', 0,
+    'f','r','a','n','c', 0,
+    'G','b','r','e','v','e', 0,
+    'g','b','r','e','v','e', 0,
+    'I','d','o','t','a','c','c','e','n','t', 0,
+    'S','c','e','d','i','l','l','a', 0,
+    's','c','e','d','i','l','l','a', 0,
+    'C','a','c','u','t','e', 0,
+    'c','a','c','u','t','e', 0,
+    'C','c','a','r','o','n', 0,
+    'c','c','a','r','o','n', 0,
+    'd','c','r','o','a','t', 0,
+    '.','n','o','t','d','e','f', 0,
+    's','p','a','c','e', 0,
+    'e','x','c','l','a','m', 0,
+    'q','u','o','t','e','d','b','l', 0,
+    'n','u','m','b','e','r','s','i','g','n', 0,
+    'd','o','l','l','a','r', 0,
+    'p','e','r','c','e','n','t', 0,
+    'a','m','p','e','r','s','a','n','d', 0,
+    'q','u','o','t','e','r','i','g','h','t', 0,
+    'p','a','r','e','n','l','e','f','t', 0,
+    'p','a','r','e','n','r','i','g','h','t', 0,
+    'a','s','t','e','r','i','s','k', 0,
+    'p','l','u','s', 0,
+    'c','o','m','m','a', 0,
+    'h','y','p','h','e','n', 0,
+    'p','e','r','i','o','d', 0,
+    's','l','a','s','h', 0,
+    'z','e','r','o', 0,
+    'o','n','e', 0,
+    't','w','o', 0,
+    't','h','r','e','e', 0,
+    'f','o','u','r', 0,
+    'f','i','v','e', 0,
+    's','i','x', 0,
+    's','e','v','e','n', 0,
+    'e','i','g','h','t', 0,
+    'n','i','n','e', 0,
+    'c','o','l','o','n', 0,
+    's','e','m','i','c','o','l','o','n', 0,
+    'l','e','s','s', 0,
+    'e','q','u','a','l', 0,
+    'g','r','e','a','t','e','r', 0,
+    'q','u','e','s','t','i','o','n', 0,
+    'a','t', 0,
+    'A', 0,
+    'B', 0,
+    'C', 0,
+    'D', 0,
+    'E', 0,
+    'F', 0,
+    'G', 0,
+    'H', 0,
+    'I', 0,
+    'J', 0,
+    'K', 0,
+    'L', 0,
+    'M', 0,
+    'N', 0,
+    'O', 0,
+    'P', 0,
+    'Q', 0,
+    'R', 0,
+    'S', 0,
+    'T', 0,
+    'U', 0,
+    'V', 0,
+    'W', 0,
+    'X', 0,
+    'Y', 0,
+    'Z', 0,
+    'b','r','a','c','k','e','t','l','e','f','t', 0,
+    'b','a','c','k','s','l','a','s','h', 0,
+    'b','r','a','c','k','e','t','r','i','g','h','t', 0,
+    'a','s','c','i','i','c','i','r','c','u','m', 0,
+    'u','n','d','e','r','s','c','o','r','e', 0,
+    'q','u','o','t','e','l','e','f','t', 0,
+    'a', 0,
+    'b', 0,
+    'c', 0,
+    'd', 0,
+    'e', 0,
+    'f', 0,
+    'g', 0,
+    'h', 0,
+    'i', 0,
+    'j', 0,
+    'k', 0,
+    'l', 0,
+    'm', 0,
+    'n', 0,
+    'o', 0,
+    'p', 0,
+    'q', 0,
+    'r', 0,
+    's', 0,
+    't', 0,
+    'u', 0,
+    'v', 0,
+    'w', 0,
+    'x', 0,
+    'y', 0,
+    'z', 0,
+    'b','r','a','c','e','l','e','f','t', 0,
+    'b','a','r', 0,
+    'b','r','a','c','e','r','i','g','h','t', 0,
+    'a','s','c','i','i','t','i','l','d','e', 0,
+    'e','x','c','l','a','m','d','o','w','n', 0,
+    'c','e','n','t', 0,
+    's','t','e','r','l','i','n','g', 0,
+    'f','r','a','c','t','i','o','n', 0,
+    'y','e','n', 0,
+    'f','l','o','r','i','n', 0,
+    's','e','c','t','i','o','n', 0,
+    'c','u','r','r','e','n','c','y', 0,
+    'q','u','o','t','e','s','i','n','g','l','e', 0,
+    'q','u','o','t','e','d','b','l','l','e','f','t', 0,
+    'g','u','i','l','l','e','m','o','t','l','e','f','t', 0,
+    'g','u','i','l','s','i','n','g','l','l','e','f','t', 0,
+    'g','u','i','l','s','i','n','g','l','r','i','g','h','t', 0,
+    'f','i', 0,
+    'f','l', 0,
+    'e','n','d','a','s','h', 0,
+    'd','a','g','g','e','r', 0,
+    'd','a','g','g','e','r','d','b','l', 0,
+    'p','e','r','i','o','d','c','e','n','t','e','r','e','d', 0,
+    'p','a','r','a','g','r','a','p','h', 0,
+    'b','u','l','l','e','t', 0,
+    'q','u','o','t','e','s','i','n','g','l','b','a','s','e', 0,
+    'q','u','o','t','e','d','b','l','b','a','s','e', 0,
+    'q','u','o','t','e','d','b','l','r','i','g','h','t', 0,
+    'g','u','i','l','l','e','m','o','t','r','i','g','h','t', 0,
+    'e','l','l','i','p','s','i','s', 0,
+    'p','e','r','t','h','o','u','s','a','n','d', 0,
+    'q','u','e','s','t','i','o','n','d','o','w','n', 0,
+    'g','r','a','v','e', 0,
+    'a','c','u','t','e', 0,
+    'c','i','r','c','u','m','f','l','e','x', 0,
+    't','i','l','d','e', 0,
+    'm','a','c','r','o','n', 0,
+    'b','r','e','v','e', 0,
+    'd','o','t','a','c','c','e','n','t', 0,
+    'd','i','e','r','e','s','i','s', 0,
+    'r','i','n','g', 0,
+    'c','e','d','i','l','l','a', 0,
+    'h','u','n','g','a','r','u','m','l','a','u','t', 0,
+    'o','g','o','n','e','k', 0,
+    'c','a','r','o','n', 0,
+    'e','m','d','a','s','h', 0,
+    'A','E', 0,
+    'o','r','d','f','e','m','i','n','i','n','e', 0,
+    'L','s','l','a','s','h', 0,
+    'O','s','l','a','s','h', 0,
+    'O','E', 0,
+    'o','r','d','m','a','s','c','u','l','i','n','e', 0,
+    'a','e', 0,
+    'd','o','t','l','e','s','s','i', 0,
+    'l','s','l','a','s','h', 0,
+    'o','s','l','a','s','h', 0,
+    'o','e', 0,
+    'g','e','r','m','a','n','d','b','l','s', 0,
+    'o','n','e','s','u','p','e','r','i','o','r', 0,
+    'l','o','g','i','c','a','l','n','o','t', 0,
+    'm','u', 0,
+    't','r','a','d','e','m','a','r','k', 0,
+    'E','t','h', 0,
+    'o','n','e','h','a','l','f', 0,
+    'p','l','u','s','m','i','n','u','s', 0,
+    'T','h','o','r','n', 0,
+    'o','n','e','q','u','a','r','t','e','r', 0,
+    'd','i','v','i','d','e', 0,
+    'b','r','o','k','e','n','b','a','r', 0,
+    'd','e','g','r','e','e', 0,
+    't','h','o','r','n', 0,
+    't','h','r','e','e','q','u','a','r','t','e','r','s', 0,
+    't','w','o','s','u','p','e','r','i','o','r', 0,
+    'r','e','g','i','s','t','e','r','e','d', 0,
+    'm','i','n','u','s', 0,
+    'e','t','h', 0,
+    'm','u','l','t','i','p','l','y', 0,
+    't','h','r','e','e','s','u','p','e','r','i','o','r', 0,
+    'c','o','p','y','r','i','g','h','t', 0,
+    'A','a','c','u','t','e', 0,
+    'A','c','i','r','c','u','m','f','l','e','x', 0,
+    'A','d','i','e','r','e','s','i','s', 0,
+    'A','g','r','a','v','e', 0,
+    'A','r','i','n','g', 0,
+    'A','t','i','l','d','e', 0,
+    'C','c','e','d','i','l','l','a', 0,
+    'E','a','c','u','t','e', 0,
+    'E','c','i','r','c','u','m','f','l','e','x', 0,
+    'E','d','i','e','r','e','s','i','s', 0,
+    'E','g','r','a','v','e', 0,
+    'I','a','c','u','t','e', 0,
+    'I','c','i','r','c','u','m','f','l','e','x', 0,
+    'I','d','i','e','r','e','s','i','s', 0,
+    'I','g','r','a','v','e', 0,
+    'N','t','i','l','d','e', 0,
+    'O','a','c','u','t','e', 0,
+    'O','c','i','r','c','u','m','f','l','e','x', 0,
+    'O','d','i','e','r','e','s','i','s', 0,
+    'O','g','r','a','v','e', 0,
+    'O','t','i','l','d','e', 0,
+    'S','c','a','r','o','n', 0,
+    'U','a','c','u','t','e', 0,
+    'U','c','i','r','c','u','m','f','l','e','x', 0,
+    'U','d','i','e','r','e','s','i','s', 0,
+    'U','g','r','a','v','e', 0,
+    'Y','a','c','u','t','e', 0,
+    'Y','d','i','e','r','e','s','i','s', 0,
+    'Z','c','a','r','o','n', 0,
+    'a','a','c','u','t','e', 0,
+    'a','c','i','r','c','u','m','f','l','e','x', 0,
+    'a','d','i','e','r','e','s','i','s', 0,
+    'a','g','r','a','v','e', 0,
+    'a','r','i','n','g', 0,
+    'a','t','i','l','d','e', 0,
+    'c','c','e','d','i','l','l','a', 0,
+    'e','a','c','u','t','e', 0,
+    'e','c','i','r','c','u','m','f','l','e','x', 0,
+    'e','d','i','e','r','e','s','i','s', 0,
+    'e','g','r','a','v','e', 0,
+    'i','a','c','u','t','e', 0,
+    'i','c','i','r','c','u','m','f','l','e','x', 0,
+    'i','d','i','e','r','e','s','i','s', 0,
+    'i','g','r','a','v','e', 0,
+    'n','t','i','l','d','e', 0,
+    'o','a','c','u','t','e', 0,
+    'o','c','i','r','c','u','m','f','l','e','x', 0,
+    'o','d','i','e','r','e','s','i','s', 0,
+    'o','g','r','a','v','e', 0,
+    'o','t','i','l','d','e', 0,
+    's','c','a','r','o','n', 0,
+    'u','a','c','u','t','e', 0,
+    'u','c','i','r','c','u','m','f','l','e','x', 0,
+    'u','d','i','e','r','e','s','i','s', 0,
+    'u','g','r','a','v','e', 0,
+    'y','a','c','u','t','e', 0,
+    'y','d','i','e','r','e','s','i','s', 0,
+    'z','c','a','r','o','n', 0,
+    'e','x','c','l','a','m','s','m','a','l','l', 0,
+    'H','u','n','g','a','r','u','m','l','a','u','t','s','m','a','l','l', 0,
+    'd','o','l','l','a','r','o','l','d','s','t','y','l','e', 0,
+    'd','o','l','l','a','r','s','u','p','e','r','i','o','r', 0,
+    'a','m','p','e','r','s','a','n','d','s','m','a','l','l', 0,
+    'A','c','u','t','e','s','m','a','l','l', 0,
+    'p','a','r','e','n','l','e','f','t','s','u','p','e','r','i','o','r', 0,
+    'p','a','r','e','n','r','i','g','h','t','s','u','p','e','r','i','o','r', 0,
+    't','w','o','d','o','t','e','n','l','e','a','d','e','r', 0,
+    'o','n','e','d','o','t','e','n','l','e','a','d','e','r', 0,
+    'z','e','r','o','o','l','d','s','t','y','l','e', 0,
+    'o','n','e','o','l','d','s','t','y','l','e', 0,
+    't','w','o','o','l','d','s','t','y','l','e', 0,
+    't','h','r','e','e','o','l','d','s','t','y','l','e', 0,
+    'f','o','u','r','o','l','d','s','t','y','l','e', 0,
+    'f','i','v','e','o','l','d','s','t','y','l','e', 0,
+    's','i','x','o','l','d','s','t','y','l','e', 0,
+    's','e','v','e','n','o','l','d','s','t','y','l','e', 0,
+    'e','i','g','h','t','o','l','d','s','t','y','l','e', 0,
+    'n','i','n','e','o','l','d','s','t','y','l','e', 0,
+    'c','o','m','m','a','s','u','p','e','r','i','o','r', 0,
+    't','h','r','e','e','q','u','a','r','t','e','r','s','e','m','d','a','s','h', 0,
+    'p','e','r','i','o','d','s','u','p','e','r','i','o','r', 0,
+    'q','u','e','s','t','i','o','n','s','m','a','l','l', 0,
+    'a','s','u','p','e','r','i','o','r', 0,
+    'b','s','u','p','e','r','i','o','r', 0,
+    'c','e','n','t','s','u','p','e','r','i','o','r', 0,
+    'd','s','u','p','e','r','i','o','r', 0,
+    'e','s','u','p','e','r','i','o','r', 0,
+    'i','s','u','p','e','r','i','o','r', 0,
+    'l','s','u','p','e','r','i','o','r', 0,
+    'm','s','u','p','e','r','i','o','r', 0,
+    'n','s','u','p','e','r','i','o','r', 0,
+    'o','s','u','p','e','r','i','o','r', 0,
+    'r','s','u','p','e','r','i','o','r', 0,
+    's','s','u','p','e','r','i','o','r', 0,
+    't','s','u','p','e','r','i','o','r', 0,
+    'f','f', 0,
+    'f','f','i', 0,
+    'f','f','l', 0,
+    'p','a','r','e','n','l','e','f','t','i','n','f','e','r','i','o','r', 0,
+    'p','a','r','e','n','r','i','g','h','t','i','n','f','e','r','i','o','r', 0,
+    'C','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+    'h','y','p','h','e','n','s','u','p','e','r','i','o','r', 0,
+    'G','r','a','v','e','s','m','a','l','l', 0,
+    'A','s','m','a','l','l', 0,
+    'B','s','m','a','l','l', 0,
+    'C','s','m','a','l','l', 0,
+    'D','s','m','a','l','l', 0,
+    'E','s','m','a','l','l', 0,
+    'F','s','m','a','l','l', 0,
+    'G','s','m','a','l','l', 0,
+    'H','s','m','a','l','l', 0,
+    'I','s','m','a','l','l', 0,
+    'J','s','m','a','l','l', 0,
+    'K','s','m','a','l','l', 0,
+    'L','s','m','a','l','l', 0,
+    'M','s','m','a','l','l', 0,
+    'N','s','m','a','l','l', 0,
+    'O','s','m','a','l','l', 0,
+    'P','s','m','a','l','l', 0,
+    'Q','s','m','a','l','l', 0,
+    'R','s','m','a','l','l', 0,
+    'S','s','m','a','l','l', 0,
+    'T','s','m','a','l','l', 0,
+    'U','s','m','a','l','l', 0,
+    'V','s','m','a','l','l', 0,
+    'W','s','m','a','l','l', 0,
+    'X','s','m','a','l','l', 0,
+    'Y','s','m','a','l','l', 0,
+    'Z','s','m','a','l','l', 0,
+    'c','o','l','o','n','m','o','n','e','t','a','r','y', 0,
+    'o','n','e','f','i','t','t','e','d', 0,
+    'r','u','p','i','a','h', 0,
+    'T','i','l','d','e','s','m','a','l','l', 0,
+    'e','x','c','l','a','m','d','o','w','n','s','m','a','l','l', 0,
+    'c','e','n','t','o','l','d','s','t','y','l','e', 0,
+    'L','s','l','a','s','h','s','m','a','l','l', 0,
+    'S','c','a','r','o','n','s','m','a','l','l', 0,
+    'Z','c','a','r','o','n','s','m','a','l','l', 0,
+    'D','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+    'B','r','e','v','e','s','m','a','l','l', 0,
+    'C','a','r','o','n','s','m','a','l','l', 0,
+    'D','o','t','a','c','c','e','n','t','s','m','a','l','l', 0,
+    'M','a','c','r','o','n','s','m','a','l','l', 0,
+    'f','i','g','u','r','e','d','a','s','h', 0,
+    'h','y','p','h','e','n','i','n','f','e','r','i','o','r', 0,
+    'O','g','o','n','e','k','s','m','a','l','l', 0,
+    'R','i','n','g','s','m','a','l','l', 0,
+    'C','e','d','i','l','l','a','s','m','a','l','l', 0,
+    'q','u','e','s','t','i','o','n','d','o','w','n','s','m','a','l','l', 0,
+    'o','n','e','e','i','g','h','t','h', 0,
+    't','h','r','e','e','e','i','g','h','t','h','s', 0,
+    'f','i','v','e','e','i','g','h','t','h','s', 0,
+    's','e','v','e','n','e','i','g','h','t','h','s', 0,
+    'o','n','e','t','h','i','r','d', 0,
+    't','w','o','t','h','i','r','d','s', 0,
+    'z','e','r','o','s','u','p','e','r','i','o','r', 0,
+    'f','o','u','r','s','u','p','e','r','i','o','r', 0,
+    'f','i','v','e','s','u','p','e','r','i','o','r', 0,
+    's','i','x','s','u','p','e','r','i','o','r', 0,
+    's','e','v','e','n','s','u','p','e','r','i','o','r', 0,
+    'e','i','g','h','t','s','u','p','e','r','i','o','r', 0,
+    'n','i','n','e','s','u','p','e','r','i','o','r', 0,
+    'z','e','r','o','i','n','f','e','r','i','o','r', 0,
+    'o','n','e','i','n','f','e','r','i','o','r', 0,
+    't','w','o','i','n','f','e','r','i','o','r', 0,
+    't','h','r','e','e','i','n','f','e','r','i','o','r', 0,
+    'f','o','u','r','i','n','f','e','r','i','o','r', 0,
+    'f','i','v','e','i','n','f','e','r','i','o','r', 0,
+    's','i','x','i','n','f','e','r','i','o','r', 0,
+    's','e','v','e','n','i','n','f','e','r','i','o','r', 0,
+    'e','i','g','h','t','i','n','f','e','r','i','o','r', 0,
+    'n','i','n','e','i','n','f','e','r','i','o','r', 0,
+    'c','e','n','t','i','n','f','e','r','i','o','r', 0,
+    'd','o','l','l','a','r','i','n','f','e','r','i','o','r', 0,
+    'p','e','r','i','o','d','i','n','f','e','r','i','o','r', 0,
+    'c','o','m','m','a','i','n','f','e','r','i','o','r', 0,
+    'A','g','r','a','v','e','s','m','a','l','l', 0,
+    'A','a','c','u','t','e','s','m','a','l','l', 0,
+    'A','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+    'A','t','i','l','d','e','s','m','a','l','l', 0,
+    'A','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+    'A','r','i','n','g','s','m','a','l','l', 0,
+    'A','E','s','m','a','l','l', 0,
+    'C','c','e','d','i','l','l','a','s','m','a','l','l', 0,
+    'E','g','r','a','v','e','s','m','a','l','l', 0,
+    'E','a','c','u','t','e','s','m','a','l','l', 0,
+    'E','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+    'E','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+    'I','g','r','a','v','e','s','m','a','l','l', 0,
+    'I','a','c','u','t','e','s','m','a','l','l', 0,
+    'I','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+    'I','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+    'E','t','h','s','m','a','l','l', 0,
+    'N','t','i','l','d','e','s','m','a','l','l', 0,
+    'O','g','r','a','v','e','s','m','a','l','l', 0,
+    'O','a','c','u','t','e','s','m','a','l','l', 0,
+    'O','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+    'O','t','i','l','d','e','s','m','a','l','l', 0,
+    'O','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+    'O','E','s','m','a','l','l', 0,
+    'O','s','l','a','s','h','s','m','a','l','l', 0,
+    'U','g','r','a','v','e','s','m','a','l','l', 0,
+    'U','a','c','u','t','e','s','m','a','l','l', 0,
+    'U','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
+    'U','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+    'Y','a','c','u','t','e','s','m','a','l','l', 0,
+    'T','h','o','r','n','s','m','a','l','l', 0,
+    'Y','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
+    '0','0','1','.','0','0','0', 0,
+    '0','0','1','.','0','0','1', 0,
+    '0','0','1','.','0','0','2', 0,
+    '0','0','1','.','0','0','3', 0,
+    'B','l','a','c','k', 0,
+    'B','o','l','d', 0,
+    'B','o','o','k', 0,
+    'L','i','g','h','t', 0,
+    'M','e','d','i','u','m', 0,
+    'R','e','g','u','l','a','r', 0,
+    'R','o','m','a','n', 0,
+    'S','e','m','i','b','o','l','d', 0,
+  };
+
+
+#define FT_NUM_MAC_NAMES  258
+
+  /* Values are offsets into the `ft_standard_glyph_names' table */
+
+  static const short  ft_mac_names[FT_NUM_MAC_NAMES] =
+  {
+     253,   0,   6, 261, 267, 274, 283, 294, 301, 309, 758, 330, 340, 351,
+     360, 365, 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430,
+     436, 441, 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498,
+     500, 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526,
+     528, 530, 532, 534, 536, 538, 540, 552, 562, 575, 587, 979, 608, 610,
+     612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638,
+     640, 642, 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685,
+    1375,1392,1405,1414,1486,1512,1562,1603,1632,1610,1622,1645,1639,1652,
+    1661,1690,1668,1680,1697,1726,1704,1716,1733,1740,1769,1747,1759,1776,
+    1790,1819,1797,1809, 839,1263, 707, 712, 741, 881, 871,1160,1302,1346,
+    1197, 985,1031,  23,1086,1108,  32,1219,  41,  51, 730,1194,  64,  76,
+      86,  94,  97,1089,1118, 106,1131,1150, 966, 696,1183, 112, 734, 120,
+     132, 783, 930, 945, 138,1385,1398,1529,1115,1157, 832,1079, 770, 916,
+     598, 319,1246, 155,1833,1586, 721, 749, 797, 811, 826, 829, 846, 856,
+     888, 903, 954,1363,1421,1356,1433,1443,1450,1457,1469,1479,1493,1500,
+     163,1522,1543,1550,1572,1134, 991,1002,1008,1015,1021,1040,1045,1053,
+    1066,1073,1101,1143,1536,1783,1596,1843,1253,1207,1319,1579,1826,1229,
+    1270,1313,1323,1171,1290,1332,1211,1235,1276, 169, 175, 182, 189, 200,
+     209, 218, 225, 232, 239, 246
+  };
+
+
+#define FT_NUM_SID_NAMES  391
+
+  /* Values are offsets into the `ft_standard_glyph_names' table */
+
+  static const short  ft_sid_names[FT_NUM_SID_NAMES] =
+  {
+     253, 261, 267, 274, 283, 294, 301, 309, 319, 330, 340, 351, 360, 365,
+     371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, 436, 441,
+     447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, 500, 502,
+     504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, 528, 530,
+     532, 534, 536, 538, 540, 552, 562, 575, 587, 598, 608, 610, 612, 614,
+     616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642,
+     644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, 696, 707,
+     712, 721, 730, 734, 741, 749, 758, 770, 783, 797, 811, 826, 829, 832,
+     839, 846, 856, 871, 881, 888, 903, 916, 930, 945, 954, 966, 979, 985,
+     991,1002,1008,1015,1021,1031,1040,1045,1053,1066,1073,1079,1086,1089,
+    1101,1108,1115,1118,1131,1134,1143,1150,1157,1160,1171,1183,1194,1197,
+    1207,1211,1219,1229,1235,1246,1253,1263,1270,1276,1290,1302,1313,1319,
+    1323,1332,1346,1356,1363,1375,1385,1392,1398,1405,1414,1421,1433,1443,
+    1450,1457,1469,1479,1486,1493,1500,1512,1522,1529,1536,1543,1550,1562,
+    1572,1579,1586,1596,1603,1610,1622,1632,1639,1645,1652,1661,1668,1680,
+    1690,1697,1704,1716,1726,1733,1740,1747,1759,1769,1776,1783,1790,1797,
+    1809,1819,1826,1833,1843,1850,1862,1880,1895,1910,1925,1936,1954,1973,
+    1988,2003,2016,2028,2040,2054,2067,2080,2092,2106,2120,2133,2147,2167,
+    2182,2196,2206,2216,2229,2239,2249,2259,2269,2279,2289,2299,2309,2319,
+    2329,2332,2336,2340,2358,2377,2393,2408,2419,2426,2433,2440,2447,2454,
+    2461,2468,2475,2482,2489,2496,2503,2510,2517,2524,2531,2538,2545,2552,
+    2559,2566,2573,2580,2587,2594,2601,2615,2625,2632,2643,2659,2672,2684,
+    2696,2708,2722,2733,2744,2759,2771,2782,2797,2809,2819,2832,2850,2860,
+    2873,2885,2898,2907,2917,2930,2943,2956,2968,2982,2996,3009,3022,3034,
+    3046,3060,3073,3086,3098,3112,3126,3139,3152,3167,3182,3196,3208,3220,
+    3237,3249,3264,3275,3283,3297,3309,3321,3338,3353,3365,3377,3394,3409,
+    3418,3430,3442,3454,3471,3483,3498,3506,3518,3530,3542,3559,3574,3586,
+    3597,3612,3620,3628,3636,3644,3650,3655,3660,3666,3673,3681,3687
+  };
+
+
+  /* the following are indices into the SID name table */
+  static const unsigned short  t1_standard_encoding[256] =
+  {
+      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
+     17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
+     33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
+     49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
+     65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
+     81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,  0,
+      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      0, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,
+      0,111,112,113,114,  0,115,116,117,118,119,120,121,122,  0,123,
+      0,124,125,126,127,128,129,130,131,  0,132,133,  0,134,135,136,
+    137,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      0,138,  0,139,  0,  0,  0,  0,140,141,142,143,  0,  0,  0,  0,
+      0,144,  0,  0,  0,145,  0,  0,146,147,148,149,  0,  0,  0,  0
+  };
+
+
+  /* the following are indices into the SID name table */
+  static const unsigned short  t1_expert_encoding[256] =
+  {
+      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      1,229,230,  0,231,232,233,234,235,236,237,238, 13, 14, 15, 99,
+    239,240,241,242,243,244,245,246,247,248, 27, 28,249,250,251,252,
+      0,253,254,255,256,257,  0,  0,  0,258,  0,  0,259,260,261,262,
+      0,  0,263,264,265,  0,266,109,110,267,268,269,  0,270,271,272,
+    273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,
+    289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,  0,
+      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+      0,304,305,306,  0,  0,307,308,309,310,311,  0,312,  0,  0,313,
+      0,  0,314,315,  0,  0,316,317,318,  0,  0,  0,158,155,163,319,
+    320,321,322,323,324,325,  0,  0,326,150,164,169,327,328,329,330,
+    331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,
+    347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,
+    363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378
+  };
+
+
+  /*
+   *  This table is a compressed version of the Adobe Glyph List (AGL),
+   *  optimized for efficient searching.  It has been generated by the
+   *  `glnames.py' python script located in the `src/tools' directory.
+   *
+   *  The lookup function to get the Unicode value for a given string
+   *  is defined below the table.
+   */
+
+#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+
+  static const unsigned char  ft_adobe_glyph_list[55997L] =
+  {
+      0, 52,  0,106,  2,167,  3, 63,  4,220,  6,125,  9,143, 10, 23,
+     11,137, 12,199, 14,246, 15, 87, 16,233, 17,219, 18,104, 19, 88,
+     22,110, 23, 32, 23, 71, 24, 77, 27,156, 29, 73, 31,247, 32,107,
+     32,222, 33, 55, 34,154, 35,218, 58, 10, 64,122, 72,188, 80,109,
+     88,104, 93, 61, 98,168,106, 91,114,111,115,237,122,180,127,255,
+    135,164,143,132,149,213,158,108,161,115,168,175,183,147,197,199,
+    202, 25,204,166,208,209,209, 81,215, 26, 65,143,  0, 65,  0,140,
+      0,175,  0,193,  1, 15,  1,147,  1,233,  1,251,  2,  7,  2, 40,
+      2, 57,  2, 82,  2, 91,  2,128,  2,136,  2,154, 69,131,  0,198,
+      0,150,  0,158,  0,167,225,227,245,244,101,128,  1,252,237,225,
+    227,242,239,110,128,  1,226,243,237,225,236,108,128,247,230,225,
+    227,245,244,101,129,  0,193,  0,185,243,237,225,236,108,128,247,
+    225,226,242,229,246,101,134,  1,  2,  0,213,  0,221,  0,232,  0,
+    243,  0,251,  1,  7,225,227,245,244,101,128, 30,174,227,249,242,
+    233,236,236,233, 99,128,  4,208,228,239,244,226,229,236,239,119,
+    128, 30,182,231,242,225,246,101,128, 30,176,232,239,239,235,225,
+    226,239,246,101,128, 30,178,244,233,236,228,101,128, 30,180, 99,
+      4,  1, 25,  1, 32,  1,121,  1,137,225,242,239,110,128,  1,205,
+    233,242, 99,  2,  1, 40,  1, 45,236,101,128, 36,182,245,237,230,
+    236,229,120,134,  0,194,  1, 66,  1, 74,  1, 85,  1, 93,  1,105,
+      1,113,225,227,245,244,101,128, 30,164,228,239,244,226,229,236,
+    239,119,128, 30,172,231,242,225,246,101,128, 30,166,232,239,239,
+    235,225,226,239,246,101,128, 30,168,243,237,225,236,108,128,247,
+    226,244,233,236,228,101,128, 30,170,245,244,101,129,246,201,  1,
+    129,243,237,225,236,108,128,247,180,249,242,233,236,236,233, 99,
+    128,  4, 16,100,  3,  1,155,  1,165,  1,209,226,236,231,242,225,
+    246,101,128,  2,  0,233,229,242,229,243,233,115,131,  0,196,  1,
+    181,  1,192,  1,201,227,249,242,233,236,236,233, 99,128,  4,210,
+    237,225,227,242,239,110,128,  1,222,243,237,225,236,108,128,247,
+    228,239,116,  2,  1,216,  1,224,226,229,236,239,119,128, 30,160,
+    237,225,227,242,239,110,128,  1,224,231,242,225,246,101,129,  0,
+    192,  1,243,243,237,225,236,108,128,247,224,232,239,239,235,225,
+    226,239,246,101,128, 30,162,105,  2,  2, 13,  2, 25,229,227,249,
+    242,233,236,236,233, 99,128,  4,212,238,246,229,242,244,229,228,
+    226,242,229,246,101,128,  2,  2,236,240,232, 97,129,  3,145,  2,
+     49,244,239,238,239,115,128,  3,134,109,  2,  2, 63,  2, 71,225,
+    227,242,239,110,128,  1,  0,239,238,239,243,240,225,227,101,128,
+    255, 33,239,231,239,238,229,107,128,  1,  4,242,233,238,103,131,
+      0,197,  2,104,  2,112,  2,120,225,227,245,244,101,128,  1,250,
+    226,229,236,239,119,128, 30,  0,243,237,225,236,108,128,247,229,
+    243,237,225,236,108,128,247, 97,244,233,236,228,101,129,  0,195,
+      2,146,243,237,225,236,108,128,247,227,249,226,225,242,237,229,
+    238,233,225,110,128,  5, 49, 66,137,  0, 66,  2,189,  2,198,  2,
+    223,  3,  3,  3, 10,  3, 22,  3, 34,  3, 46,  3, 54,227,233,242,
+    227,236,101,128, 36,183,228,239,116,  2,  2,206,  2,215,225,227,
+    227,229,238,116,128, 30,  2,226,229,236,239,119,128, 30,  4,101,
+      3,  2,231,  2,242,  2,254,227,249,242,233,236,236,233, 99,128,
+      4, 17,238,225,242,237,229,238,233,225,110,128,  5, 50,244, 97,
+    128,  3,146,232,239,239,107,128,  1,129,236,233,238,229,226,229,
+    236,239,119,128, 30,  6,237,239,238,239,243,240,225,227,101,128,
+    255, 34,242,229,246,229,243,237,225,236,108,128,246,244,243,237,
+    225,236,108,128,247, 98,244,239,240,226,225,114,128,  1,130, 67,
+    137,  0, 67,  3, 85,  3,127,  3,193,  3,210,  3,224,  4,171,  4,
+    188,  4,200,  4,212, 97,  3,  3, 93,  3,104,  3,111,225,242,237,
+    229,238,233,225,110,128,  5, 62,227,245,244,101,128,  1,  6,242,
+    239,110,129,246,202,  3,119,243,237,225,236,108,128,246,245, 99,
+      3,  3,135,  3,142,  3,171,225,242,239,110,128,  1, 12,229,228,
+    233,236,236, 97,130,  0,199,  3,155,  3,163,225,227,245,244,101,
+    128, 30,  8,243,237,225,236,108,128,247,231,233,242, 99,  2,  3,
+    179,  3,184,236,101,128, 36,184,245,237,230,236,229,120,128,  1,
+      8,228,239,116,129,  1, 10,  3,201,225,227,227,229,238,116,128,
+      1, 10,229,228,233,236,236,225,243,237,225,236,108,128,247,184,
+    104,  4,  3,234,  3,246,  4,161,  4,165,225,225,242,237,229,238,
+    233,225,110,128,  5, 73,101,  6,  4,  4,  4, 24,  4, 35,  4,103,
+      4,115,  4,136,225,226,235,232,225,243,233,225,238,227,249,242,
+    233,236,236,233, 99,128,  4,188,227,249,242,233,236,236,233, 99,
+    128,  4, 39,100,  2,  4, 41,  4, 85,229,243,227,229,238,228,229,
+    114,  2,  4, 54,  4, 74,225,226,235,232,225,243,233,225,238,227,
+    249,242,233,236,236,233, 99,128,  4,190,227,249,242,233,236,236,
+    233, 99,128,  4,182,233,229,242,229,243,233,243,227,249,242,233,
+    236,236,233, 99,128,  4,244,232,225,242,237,229,238,233,225,110,
+    128,  5, 67,235,232,225,235,225,243,243,233,225,238,227,249,242,
+    233,236,236,233, 99,128,  4,203,246,229,242,244,233,227,225,236,
+    243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,
+    184,105,128,  3,167,239,239,107,128,  1,135,233,242,227,245,237,
+    230,236,229,248,243,237,225,236,108,128,246,246,237,239,238,239,
+    243,240,225,227,101,128,255, 35,239,225,242,237,229,238,233,225,
+    110,128,  5, 81,243,237,225,236,108,128,247, 99, 68,142,  0, 68,
+      4,252,  5, 10,  5, 36,  5, 96,  5,121,  5,166,  5,173,  5,231,
+      5,244,  6,  0,  6, 12,  6, 28,  6, 48,  6, 57, 90,129,  1,241,
+      5,  2,227,225,242,239,110,128,  1,196, 97,  2,  5, 16,  5, 27,
+    225,242,237,229,238,233,225,110,128,  5, 52,230,242,233,227,225,
+    110,128,  1,137, 99,  4,  5, 46,  5, 53,  5, 62,  5, 89,225,242,
+    239,110,128,  1, 14,229,228,233,236,236, 97,128, 30, 16,233,242,
+     99,  2,  5, 70,  5, 75,236,101,128, 36,185,245,237,230,236,229,
+    248,226,229,236,239,119,128, 30, 18,242,239,225,116,128,  1, 16,
+    228,239,116,  2,  5,104,  5,113,225,227,227,229,238,116,128, 30,
+     10,226,229,236,239,119,128, 30, 12,101,  3,  5,129,  5,140,  5,
+    150,227,249,242,233,236,236,233, 99,128,  4, 20,233,227,239,240,
+    244,233, 99,128,  3,238,236,244, 97,129, 34,  6,  5,158,231,242,
+    229,229,107,128,  3,148,232,239,239,107,128,  1,138,105,  2,  5,
+    179,  5,218,229,242,229,243,233,115,131,246,203,  5,194,  5,202,
+      5,210,193,227,245,244,101,128,246,204,199,242,225,246,101,128,
+    246,205,243,237,225,236,108,128,247,168,231,225,237,237,225,231,
+    242,229,229,107,128,  3,220,234,229,227,249,242,233,236,236,233,
+     99,128,  4,  2,236,233,238,229,226,229,236,239,119,128, 30, 14,
+    237,239,238,239,243,240,225,227,101,128,255, 36,239,244,225,227,
+    227,229,238,244,243,237,225,236,108,128,246,247,115,  2,  6, 34,
+      6, 41,236,225,243,104,128,  1, 16,237,225,236,108,128,247,100,
+    244,239,240,226,225,114,128,  1,139,122,131,  1,242,  6, 67,  6,
+     75,  6,112,227,225,242,239,110,128,  1,197,101,  2,  6, 81,  6,
+    101,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236,
+    233, 99,128,  4,224,227,249,242,233,236,236,233, 99,128,  4,  5,
+    232,229,227,249,242,233,236,236,233, 99,128,  4, 15, 69,146,  0,
+     69,  6,165,  6,183,  6,191,  7, 89,  7,153,  7,165,  7,183,  7,
+    211,  8,  7,  8, 36,  8, 94,  8,169,  8,189,  8,208,  8,248,  9,
+     44,  9,109,  9,115,225,227,245,244,101,129,  0,201,  6,175,243,
+    237,225,236,108,128,247,233,226,242,229,246,101,128,  1, 20, 99,
+      5,  6,203,  6,210,  6,224,  6,236,  7, 79,225,242,239,110,128,
+      1, 26,229,228,233,236,236,225,226,242,229,246,101,128, 30, 28,
+    232,225,242,237,229,238,233,225,110,128,  5, 53,233,242, 99,  2,
+      6,244,  6,249,236,101,128, 36,186,245,237,230,236,229,120,135,
+      0,202,  7, 16,  7, 24,  7, 32,  7, 43,  7, 51,  7, 63,  7, 71,
+    225,227,245,244,101,128, 30,190,226,229,236,239,119,128, 30, 24,
+    228,239,244,226,229,236,239,119,128, 30,198,231,242,225,246,101,
+    128, 30,192,232,239,239,235,225,226,239,246,101,128, 30,194,243,
+    237,225,236,108,128,247,234,244,233,236,228,101,128, 30,196,249,
+    242,233,236,236,233, 99,128,  4,  4,100,  3,  7, 97,  7,107,  7,
+    127,226,236,231,242,225,246,101,128,  2,  4,233,229,242,229,243,
+    233,115,129,  0,203,  7,119,243,237,225,236,108,128,247,235,239,
+    116,130,  1, 22,  7,136,  7,145,225,227,227,229,238,116,128,  1,
+     22,226,229,236,239,119,128, 30,184,230,227,249,242,233,236,236,
+    233, 99,128,  4, 36,231,242,225,246,101,129,  0,200,  7,175,243,
+    237,225,236,108,128,247,232,104,  2,  7,189,  7,200,225,242,237,
+    229,238,233,225,110,128,  5, 55,239,239,235,225,226,239,246,101,
+    128, 30,186,105,  3,  7,219,  7,230,  7,245,231,232,244,242,239,
+    237,225,110,128, 33,103,238,246,229,242,244,229,228,226,242,229,
+    246,101,128,  2,  6,239,244,233,230,233,229,228,227,249,242,233,
+    236,236,233, 99,128,  4,100,108,  2,  8, 13,  8, 24,227,249,242,
+    233,236,236,233, 99,128,  4, 27,229,246,229,238,242,239,237,225,
+    110,128, 33,106,109,  3,  8, 44,  8, 72,  8, 83,225,227,242,239,
+    110,130,  1, 18,  8, 56,  8, 64,225,227,245,244,101,128, 30, 22,
+    231,242,225,246,101,128, 30, 20,227,249,242,233,236,236,233, 99,
+    128,  4, 28,239,238,239,243,240,225,227,101,128,255, 37,110,  4,
+      8,104,  8,115,  8,135,  8,154,227,249,242,233,236,236,233, 99,
+    128,  4, 29,228,229,243,227,229,238,228,229,242,227,249,242,233,
+    236,236,233, 99,128,  4,162,103,129,  1, 74,  8,141,232,229,227,
+    249,242,233,236,236,233, 99,128,  4,164,232,239,239,235,227,249,
+    242,233,236,236,233, 99,128,  4,199,111,  2,  8,175,  8,183,231,
+    239,238,229,107,128,  1, 24,240,229,110,128,  1,144,240,243,233,
+    236,239,110,129,  3,149,  8,200,244,239,238,239,115,128,  3,136,
+    114,  2,  8,214,  8,225,227,249,242,233,236,236,233, 99,128,  4,
+     32,229,246,229,242,243,229,100,129,  1,142,  8,237,227,249,242,
+    233,236,236,233, 99,128,  4, 45,115,  4,  9,  2,  9, 13,  9, 33,
+      9, 37,227,249,242,233,236,236,233, 99,128,  4, 33,228,229,243,
+    227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,
+    170,104,128,  1,169,237,225,236,108,128,247,101,116,  3,  9, 52,
+      9, 78,  9, 92, 97,130,  3,151,  9, 60,  9, 70,242,237,229,238,
+    233,225,110,128,  5, 56,244,239,238,239,115,128,  3,137,104,129,
+      0,208,  9, 84,243,237,225,236,108,128,247,240,233,236,228,101,
+    129, 30,188,  9,101,226,229,236,239,119,128, 30, 26,245,242,111,
+    128, 32,172,250,104,130,  1,183,  9,124,  9,132,227,225,242,239,
+    110,128,  1,238,242,229,246,229,242,243,229,100,128,  1,184, 70,
+    136,  0, 70,  9,163,  9,172,  9,184,  9,212,  9,219,  9,248, 10,
+      4, 10, 15,227,233,242,227,236,101,128, 36,187,228,239,244,225,
+    227,227,229,238,116,128, 30, 30,101,  2,  9,190,  9,202,232,225,
+    242,237,229,238,233,225,110,128,  5, 86,233,227,239,240,244,233,
+     99,128,  3,228,232,239,239,107,128,  1,145,105,  2,  9,225,  9,
+    238,244,225,227,249,242,233,236,236,233, 99,128,  4,114,246,229,
+    242,239,237,225,110,128, 33,100,237,239,238,239,243,240,225,227,
+    101,128,255, 38,239,245,242,242,239,237,225,110,128, 33, 99,243,
+    237,225,236,108,128,247,102, 71,140,  0, 71, 10, 51, 10, 61, 10,
+    107, 10,115, 10,176, 10,193, 10,205, 11, 39, 11, 52, 11, 65, 11,
+     90, 11,107,194,243,241,245,225,242,101,128, 51,135, 97,  3, 10,
+     69, 10, 76, 10, 94,227,245,244,101,128,  1,244,237,237, 97,129,
+      3,147, 10, 84,225,230,242,233,227,225,110,128,  1,148,238,231,
+    233,225,227,239,240,244,233, 99,128,  3,234,226,242,229,246,101,
+    128,  1, 30, 99,  4, 10,125, 10,132, 10,141, 10,163,225,242,239,
+    110,128,  1,230,229,228,233,236,236, 97,128,  1, 34,233,242, 99,
+      2, 10,149, 10,154,236,101,128, 36,188,245,237,230,236,229,120,
+    128,  1, 28,239,237,237,225,225,227,227,229,238,116,128,  1, 34,
+    228,239,116,129,  1, 32, 10,184,225,227,227,229,238,116,128,  1,
+     32,229,227,249,242,233,236,236,233, 99,128,  4, 19,104,  3, 10,
+    213, 10,226, 11, 33,225,228,225,242,237,229,238,233,225,110,128,
+      5, 66,101,  3, 10,234, 10,255, 11, 16,237,233,228,228,236,229,
+    232,239,239,235,227,249,242,233,236,236,233, 99,128,  4,148,243,
+    244,242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,146,
+    245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128,  4,
+    144,239,239,107,128,  1,147,233,237,225,242,237,229,238,233,225,
+    110,128,  5, 51,234,229,227,249,242,233,236,236,233, 99,128,  4,
+      3,109,  2, 11, 71, 11, 79,225,227,242,239,110,128, 30, 32,239,
+    238,239,243,240,225,227,101,128,255, 39,242,225,246,101,129,246,
+    206, 11, 99,243,237,225,236,108,128,247, 96,115,  2, 11,113, 11,
+    129,237,225,236,108,129,247,103, 11,122,232,239,239,107,128,  2,
+    155,244,242,239,235,101,128,  1,228, 72,140,  0, 72, 11,165, 11,
+    190, 11,198, 11,208, 12, 17, 12, 40, 12, 77, 12,117, 12,129, 12,
+    157, 12,165, 12,189,177,184, 53,  3, 11,175, 11,180, 11,185,179,
+     51,128, 37,207,180, 51,128, 37,170,181, 49,128, 37,171,178,178,
+    176,183, 51,128, 37,161,208,243,241,245,225,242,101,128, 51,203,
+     97,  3, 11,216, 11,236, 12,  0,225,226,235,232,225,243,233,225,
+    238,227,249,242,233,236,236,233, 99,128,  4,168,228,229,243,227,
+    229,238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,178,
+    242,228,243,233,231,238,227,249,242,233,236,236,233, 99,128,  4,
+     42, 98,  2, 12, 23, 12, 28,225,114,128,  1, 38,242,229,246,229,
+    226,229,236,239,119,128, 30, 42, 99,  2, 12, 46, 12, 55,229,228,
+    233,236,236, 97,128, 30, 40,233,242, 99,  2, 12, 63, 12, 68,236,
+    101,128, 36,189,245,237,230,236,229,120,128,  1, 36,100,  2, 12,
+     83, 12, 93,233,229,242,229,243,233,115,128, 30, 38,239,116,  2,
+     12,100, 12,109,225,227,227,229,238,116,128, 30, 34,226,229,236,
+    239,119,128, 30, 36,237,239,238,239,243,240,225,227,101,128,255,
+     40,111,  2, 12,135, 12,146,225,242,237,229,238,233,225,110,128,
+      5, 64,242,233,227,239,240,244,233, 99,128,  3,232,243,237,225,
+    236,108,128,247,104,245,238,231,225,242,245,237,236,225,245,116,
+    129,246,207, 12,181,243,237,225,236,108,128,246,248,250,243,241,
+    245,225,242,101,128, 51,144, 73,146,  0, 73, 12,239, 12,251, 12,
+    255, 13, 11, 13, 29, 13, 37, 13, 94, 13,181, 13,214, 13,224, 13,
+    242, 13,254, 14, 48, 14, 86, 14, 99, 14,166, 14,187, 14,205,193,
+    227,249,242,233,236,236,233, 99,128,  4, 47, 74,128,  1, 50,213,
+    227,249,242,233,236,236,233, 99,128,  4, 46,225,227,245,244,101,
+    129,  0,205, 13, 21,243,237,225,236,108,128,247,237,226,242,229,
+    246,101,128,  1, 44, 99,  3, 13, 45, 13, 52, 13, 84,225,242,239,
+    110,128,  1,207,233,242, 99,  2, 13, 60, 13, 65,236,101,128, 36,
+    190,245,237,230,236,229,120,129,  0,206, 13, 76,243,237,225,236,
+    108,128,247,238,249,242,233,236,236,233, 99,128,  4,  6,100,  3,
+     13,102, 13,112, 13,155,226,236,231,242,225,246,101,128,  2,  8,
+    233,229,242,229,243,233,115,131,  0,207, 13,128, 13,136, 13,147,
+    225,227,245,244,101,128, 30, 46,227,249,242,233,236,236,233, 99,
+    128,  4,228,243,237,225,236,108,128,247,239,239,116,130,  1, 48,
+     13,164, 13,173,225,227,227,229,238,116,128,  1, 48,226,229,236,
+    239,119,128, 30,202,101,  2, 13,187, 13,203,226,242,229,246,229,
+    227,249,242,233,236,236,233, 99,128,  4,214,227,249,242,233,236,
+    236,233, 99,128,  4, 21,230,242,225,235,244,245,114,128, 33, 17,
+    231,242,225,246,101,129,  0,204, 13,234,243,237,225,236,108,128,
+    247,236,232,239,239,235,225,226,239,246,101,128, 30,200,105,  3,
+     14,  6, 14, 17, 14, 32,227,249,242,233,236,236,233, 99,128,  4,
+     24,238,246,229,242,244,229,228,226,242,229,246,101,128,  2, 10,
+    243,232,239,242,244,227,249,242,233,236,236,233, 99,128,  4, 25,
+    109,  2, 14, 54, 14, 75,225,227,242,239,110,129,  1, 42, 14, 64,
+    227,249,242,233,236,236,233, 99,128,  4,226,239,238,239,243,240,
+    225,227,101,128,255, 41,238,233,225,242,237,229,238,233,225,110,
+    128,  5, 59,111,  3, 14,107, 14,118, 14,126,227,249,242,233,236,
+    236,233, 99,128,  4,  1,231,239,238,229,107,128,  1, 46,244, 97,
+    131,  3,153, 14,137, 14,147, 14,158,225,230,242,233,227,225,110,
+    128,  1,150,228,233,229,242,229,243,233,115,128,  3,170,244,239,
+    238,239,115,128,  3,138,115,  2, 14,172, 14,179,237,225,236,108,
+    128,247,105,244,242,239,235,101,128,  1,151,244,233,236,228,101,
+    129,  1, 40, 14,197,226,229,236,239,119,128, 30, 44,250,232,233,
+    244,243, 97,  2, 14,216, 14,227,227,249,242,233,236,236,233, 99,
+    128,  4,116,228,226,236,231,242,225,246,229,227,249,242,233,236,
+    236,233, 99,128,  4,118, 74,134,  0, 74, 15,  6, 15, 18, 15, 41,
+     15, 53, 15, 67, 15, 79,225,225,242,237,229,238,233,225,110,128,
+      5, 65,227,233,242, 99,  2, 15, 27, 15, 32,236,101,128, 36,191,
+    245,237,230,236,229,120,128,  1, 52,229,227,249,242,233,236,236,
+    233, 99,128,  4,  8,232,229,232,225,242,237,229,238,233,225,110,
+    128,  5, 75,237,239,238,239,243,240,225,227,101,128,255, 42,243,
+    237,225,236,108,128,247,106, 75,140,  0, 75, 15,115, 15,125, 15,
+    135, 16, 18, 16, 65, 16, 76, 16,106, 16,143, 16,156, 16,168, 16,
+    180, 16,208,194,243,241,245,225,242,101,128, 51,133,203,243,241,
+    245,225,242,101,128, 51,205, 97,  7, 15,151, 15,169, 15,191, 15,
+    211, 15,226, 15,232, 15,249,226,225,243,232,235,233,242,227,249,
+    242,233,236,236,233, 99,128,  4,160, 99,  2, 15,175, 15,181,245,
+    244,101,128, 30, 48,249,242,233,236,236,233, 99,128,  4, 26,228,
+    229,243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99,
+    128,  4,154,232,239,239,235,227,249,242,233,236,236,233, 99,128,
+      4,195,240,240, 97,128,  3,154,243,244,242,239,235,229,227,249,
+    242,233,236,236,233, 99,128,  4,158,246,229,242,244,233,227,225,
+    236,243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128,
+      4,156, 99,  4, 16, 28, 16, 35, 16, 44, 16, 52,225,242,239,110,
+    128,  1,232,229,228,233,236,236, 97,128,  1, 54,233,242,227,236,
+    101,128, 36,192,239,237,237,225,225,227,227,229,238,116,128,  1,
+     54,228,239,244,226,229,236,239,119,128, 30, 50,101,  2, 16, 82,
+     16, 94,232,225,242,237,229,238,233,225,110,128,  5, 84,238,225,
+    242,237,229,238,233,225,110,128,  5, 63,104,  3, 16,114, 16,126,
+     16,137,225,227,249,242,233,236,236,233, 99,128,  4, 37,229,233,
+    227,239,240,244,233, 99,128,  3,230,239,239,107,128,  1,152,234,
+    229,227,249,242,233,236,236,233, 99,128,  4, 12,236,233,238,229,
+    226,229,236,239,119,128, 30, 52,237,239,238,239,243,240,225,227,
+    101,128,255, 43,239,240,240, 97,  2, 16,189, 16,200,227,249,242,
+    233,236,236,233, 99,128,  4,128,231,242,229,229,107,128,  3,222,
+    115,  2, 16,214, 16,226,233,227,249,242,233,236,236,233, 99,128,
+      4,110,237,225,236,108,128,247,107, 76,138,  0, 76, 17,  1, 17,
+      5, 17,  9, 17, 29, 17, 95, 17,133, 17,147, 17,165, 17,177, 17,
+    189, 74,128,  1,199, 76,128,246,191, 97,  2, 17, 15, 17, 22,227,
+    245,244,101,128,  1, 57,237,226,228, 97,128,  3,155, 99,  4, 17,
+     39, 17, 46, 17, 55, 17, 82,225,242,239,110,128,  1, 61,229,228,
+    233,236,236, 97,128,  1, 59,233,242, 99,  2, 17, 63, 17, 68,236,
+    101,128, 36,193,245,237,230,236,229,248,226,229,236,239,119,128,
+     30, 60,239,237,237,225,225,227,227,229,238,116,128,  1, 59,228,
+    239,116,130,  1, 63, 17,105, 17,114,225,227,227,229,238,116,128,
+      1, 63,226,229,236,239,119,129, 30, 54, 17,124,237,225,227,242,
+    239,110,128, 30, 56,233,247,238,225,242,237,229,238,233,225,110,
+    128,  5, 60,106,129,  1,200, 17,153,229,227,249,242,233,236,236,
+    233, 99,128,  4,  9,236,233,238,229,226,229,236,239,119,128, 30,
+     58,237,239,238,239,243,240,225,227,101,128,255, 44,115,  2, 17,
+    195, 17,212,236,225,243,104,129,  1, 65, 17,204,243,237,225,236,
+    108,128,246,249,237,225,236,108,128,247,108, 77,137,  0, 77, 17,
+    241, 17,251, 18, 24, 18, 33, 18, 58, 18, 71, 18, 83, 18, 91, 18,
+    100,194,243,241,245,225,242,101,128, 51,134,225, 99,  2, 18,  2,
+     18, 18,242,239,110,129,246,208, 18, 10,243,237,225,236,108,128,
+    247,175,245,244,101,128, 30, 62,227,233,242,227,236,101,128, 36,
+    194,228,239,116,  2, 18, 41, 18, 50,225,227,227,229,238,116,128,
+     30, 64,226,229,236,239,119,128, 30, 66,229,238,225,242,237,229,
+    238,233,225,110,128,  5, 68,237,239,238,239,243,240,225,227,101,
+    128,255, 45,243,237,225,236,108,128,247,109,244,245,242,238,229,
+    100,128,  1,156,117,128,  3,156, 78,141,  0, 78, 18,134, 18,138,
+     18,146, 18,212, 18,237, 18,248, 19,  3, 19, 21, 19, 33, 19, 45,
+     19, 58, 19, 66, 19, 84, 74,128,  1,202,225,227,245,244,101,128,
+      1, 67, 99,  4, 18,156, 18,163, 18,172, 18,199,225,242,239,110,
+    128,  1, 71,229,228,233,236,236, 97,128,  1, 69,233,242, 99,  2,
+     18,180, 18,185,236,101,128, 36,195,245,237,230,236,229,248,226,
+    229,236,239,119,128, 30, 74,239,237,237,225,225,227,227,229,238,
+    116,128,  1, 69,228,239,116,  2, 18,220, 18,229,225,227,227,229,
+    238,116,128, 30, 68,226,229,236,239,119,128, 30, 70,232,239,239,
+    235,236,229,230,116,128,  1,157,233,238,229,242,239,237,225,110,
+    128, 33,104,106,129,  1,203, 19,  9,229,227,249,242,233,236,236,
+    233, 99,128,  4, 10,236,233,238,229,226,229,236,239,119,128, 30,
+     72,237,239,238,239,243,240,225,227,101,128,255, 46,239,247,225,
+    242,237,229,238,233,225,110,128,  5, 70,243,237,225,236,108,128,
+    247,110,244,233,236,228,101,129,  0,209, 19, 76,243,237,225,236,
+    108,128,247,241,117,128,  3,157, 79,141,  0, 79, 19,118, 19,132,
+     19,150, 19,203, 20, 78, 20,152, 20,187, 21, 48, 21, 69, 21,213,
+     21,223, 21,254, 22, 53, 69,129,  1, 82, 19,124,243,237,225,236,
+    108,128,246,250,225,227,245,244,101,129,  0,211, 19,142,243,237,
+    225,236,108,128,247,243, 98,  2, 19,156, 19,196,225,242,242,229,
+    100,  2, 19,166, 19,177,227,249,242,233,236,236,233, 99,128,  4,
+    232,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233,
+     99,128,  4,234,242,229,246,101,128,  1, 78, 99,  4, 19,213, 19,
+    220, 19,235, 20, 68,225,242,239,110,128,  1,209,229,238,244,229,
+    242,229,228,244,233,236,228,101,128,  1,159,233,242, 99,  2, 19,
+    243, 19,248,236,101,128, 36,196,245,237,230,236,229,120,134,  0,
+    212, 20, 13, 20, 21, 20, 32, 20, 40, 20, 52, 20, 60,225,227,245,
+    244,101,128, 30,208,228,239,244,226,229,236,239,119,128, 30,216,
+    231,242,225,246,101,128, 30,210,232,239,239,235,225,226,239,246,
+    101,128, 30,212,243,237,225,236,108,128,247,244,244,233,236,228,
+    101,128, 30,214,249,242,233,236,236,233, 99,128,  4, 30,100,  3,
+     20, 86, 20,109, 20,142,226,108,  2, 20, 93, 20,101,225,227,245,
+    244,101,128,  1, 80,231,242,225,246,101,128,  2, 12,233,229,242,
+    229,243,233,115,130,  0,214, 20,123, 20,134,227,249,242,233,236,
+    236,233, 99,128,  4,230,243,237,225,236,108,128,247,246,239,244,
+    226,229,236,239,119,128, 30,204,103,  2, 20,158, 20,170,239,238,
+    229,235,243,237,225,236,108,128,246,251,242,225,246,101,129,  0,
+    210, 20,179,243,237,225,236,108,128,247,242,104,  4, 20,197, 20,
+    208, 20,212, 21, 34,225,242,237,229,238,233,225,110,128,  5, 85,
+    109,128, 33, 38,111,  2, 20,218, 20,228,239,235,225,226,239,246,
+    101,128, 30,206,242,110,133,  1,160, 20,243, 20,251, 21,  6, 21,
+     14, 21, 26,225,227,245,244,101,128, 30,218,228,239,244,226,229,
+    236,239,119,128, 30,226,231,242,225,246,101,128, 30,220,232,239,
+    239,235,225,226,239,246,101,128, 30,222,244,233,236,228,101,128,
+     30,224,245,238,231,225,242,245,237,236,225,245,116,128,  1, 80,
+    105,129,  1,162, 21, 54,238,246,229,242,244,229,228,226,242,229,
+    246,101,128,  2, 14,109,  4, 21, 79, 21,107, 21,184, 21,202,225,
+    227,242,239,110,130,  1, 76, 21, 91, 21, 99,225,227,245,244,101,
+    128, 30, 82,231,242,225,246,101,128, 30, 80,229,231, 97,132, 33,
+     38, 21,121, 21,132, 21,140, 21,156,227,249,242,233,236,236,233,
+     99,128,  4, 96,231,242,229,229,107,128,  3,169,242,239,245,238,
+    228,227,249,242,233,236,236,233, 99,128,  4,122,116,  2, 21,162,
+     21,177,233,244,236,239,227,249,242,233,236,236,233, 99,128,  4,
+    124,239,238,239,115,128,  3,143,233,227,242,239,110,129,  3,159,
+     21,194,244,239,238,239,115,128,  3,140,239,238,239,243,240,225,
+    227,101,128,255, 47,238,229,242,239,237,225,110,128, 33, 96,111,
+      2, 21,229, 21,248,231,239,238,229,107,129,  1,234, 21,239,237,
+    225,227,242,239,110,128,  1,236,240,229,110,128,  1,134,115,  3,
+     22,  6, 22, 33, 22, 40,236,225,243,104,130,  0,216, 22, 17, 22,
+     25,225,227,245,244,101,128,  1,254,243,237,225,236,108,128,247,
+    248,237,225,236,108,128,247,111,244,242,239,235,229,225,227,245,
+    244,101,128,  1,254,116,  2, 22, 59, 22, 70,227,249,242,233,236,
+    236,233, 99,128,  4,126,233,236,228,101,131,  0,213, 22, 83, 22,
+     91, 22,102,225,227,245,244,101,128, 30, 76,228,233,229,242,229,
+    243,233,115,128, 30, 78,243,237,225,236,108,128,247,245, 80,136,
+      0, 80, 22,130, 22,138, 22,147, 22,159, 22,211, 22,227, 22,246,
+     23,  2,225,227,245,244,101,128, 30, 84,227,233,242,227,236,101,
+    128, 36,197,228,239,244,225,227,227,229,238,116,128, 30, 86,101,
+      3, 22,167, 22,178, 22,190,227,249,242,233,236,236,233, 99,128,
+      4, 31,232,225,242,237,229,238,233,225,110,128,  5, 74,237,233,
+    228,228,236,229,232,239,239,235,227,249,242,233,236,236,233, 99,
+    128,  4,166,104,  2, 22,217, 22,221,105,128,  3,166,239,239,107,
+    128,  1,164,105,129,  3,160, 22,233,247,242,225,242,237,229,238,
+    233,225,110,128,  5, 83,237,239,238,239,243,240,225,227,101,128,
+    255, 48,115,  2, 23,  8, 23, 25,105,129,  3,168, 23, 14,227,249,
+    242,233,236,236,233, 99,128,  4,112,237,225,236,108,128,247,112,
+     81,131,  0, 81, 23, 42, 23, 51, 23, 63,227,233,242,227,236,101,
+    128, 36,198,237,239,238,239,243,240,225,227,101,128,255, 49,243,
+    237,225,236,108,128,247,113, 82,138,  0, 82, 23, 95, 23,119, 23,
+    166, 23,217, 23,230, 23,240, 23,245, 24, 19, 24, 31, 24, 43, 97,
+      2, 23,101, 23,112,225,242,237,229,238,233,225,110,128,  5, 76,
+    227,245,244,101,128,  1, 84, 99,  4, 23,129, 23,136, 23,145, 23,
+    153,225,242,239,110,128,  1, 88,229,228,233,236,236, 97,128,  1,
+     86,233,242,227,236,101,128, 36,199,239,237,237,225,225,227,227,
+    229,238,116,128,  1, 86,100,  2, 23,172, 23,182,226,236,231,242,
+    225,246,101,128,  2, 16,239,116,  2, 23,189, 23,198,225,227,227,
+    229,238,116,128, 30, 88,226,229,236,239,119,129, 30, 90, 23,208,
+    237,225,227,242,239,110,128, 30, 92,229,232,225,242,237,229,238,
+    233,225,110,128,  5, 80,230,242,225,235,244,245,114,128, 33, 28,
+    232,111,128,  3,161,233,110,  2, 23,252, 24,  5,231,243,237,225,
+    236,108,128,246,252,246,229,242,244,229,228,226,242,229,246,101,
+    128,  2, 18,236,233,238,229,226,229,236,239,119,128, 30, 94,237,
+    239,238,239,243,240,225,227,101,128,255, 50,243,237,225,236,108,
+    129,247,114, 24, 53,233,238,246,229,242,244,229,100,129,  2,129,
+     24, 66,243,245,240,229,242,233,239,114,128,  2,182, 83,139,  0,
+     83, 24,103, 26, 17, 26, 55, 26,182, 26,221, 26,250, 27, 84, 27,
+    105, 27,117, 27,135, 27,143, 70,  6, 24,117, 24,209, 24,241, 25,
+     77, 25,119, 25,221, 48,  9, 24,137, 24,145, 24,153, 24,161, 24,
+    169, 24,177, 24,185, 24,193, 24,201,177,176,176,176, 48,128, 37,
+     12,178,176,176,176, 48,128, 37, 20,179,176,176,176, 48,128, 37,
+     16,180,176,176,176, 48,128, 37, 24,181,176,176,176, 48,128, 37,
+     60,182,176,176,176, 48,128, 37, 44,183,176,176,176, 48,128, 37,
+     52,184,176,176,176, 48,128, 37, 28,185,176,176,176, 48,128, 37,
+     36, 49,  3, 24,217, 24,225, 24,233,176,176,176,176, 48,128, 37,
+      0,177,176,176,176, 48,128, 37,  2,185,176,176,176, 48,128, 37,
+     97, 50,  9, 25,  5, 25, 13, 25, 21, 25, 29, 25, 37, 25, 45, 25,
+     53, 25, 61, 25, 69,176,176,176,176, 48,128, 37, 98,177,176,176,
+    176, 48,128, 37, 86,178,176,176,176, 48,128, 37, 85,179,176,176,
+    176, 48,128, 37, 99,180,176,176,176, 48,128, 37, 81,181,176,176,
+    176, 48,128, 37, 87,182,176,176,176, 48,128, 37, 93,183,176,176,
+    176, 48,128, 37, 92,184,176,176,176, 48,128, 37, 91, 51,  4, 25,
+     87, 25, 95, 25,103, 25,111,182,176,176,176, 48,128, 37, 94,183,
+    176,176,176, 48,128, 37, 95,184,176,176,176, 48,128, 37, 90,185,
+    176,176,176, 48,128, 37, 84, 52, 10, 25,141, 25,149, 25,157, 25,
+    165, 25,173, 25,181, 25,189, 25,197, 25,205, 25,213,176,176,176,
+    176, 48,128, 37,105,177,176,176,176, 48,128, 37,102,178,176,176,
+    176, 48,128, 37, 96,179,176,176,176, 48,128, 37, 80,180,176,176,
+    176, 48,128, 37,108,181,176,176,176, 48,128, 37,103,182,176,176,
+    176, 48,128, 37,104,183,176,176,176, 48,128, 37,100,184,176,176,
+    176, 48,128, 37,101,185,176,176,176, 48,128, 37, 89, 53,  5, 25,
+    233, 25,241, 25,249, 26,  1, 26,  9,176,176,176,176, 48,128, 37,
+     88,177,176,176,176, 48,128, 37, 82,178,176,176,176, 48,128, 37,
+     83,179,176,176,176, 48,128, 37,107,180,176,176,176, 48,128, 37,
+    106, 97,  2, 26, 23, 26, 44,227,245,244,101,129,  1, 90, 26, 32,
+    228,239,244,225,227,227,229,238,116,128, 30,100,237,240,233,231,
+    242,229,229,107,128,  3,224, 99,  5, 26, 67, 26, 98, 26,107, 26,
+    147, 26,169,225,242,239,110,130,  1, 96, 26, 78, 26, 90,228,239,
+    244,225,227,227,229,238,116,128, 30,102,243,237,225,236,108,128,
+    246,253,229,228,233,236,236, 97,128,  1, 94,232,247, 97,130,  1,
+    143, 26,117, 26,128,227,249,242,233,236,236,233, 99,128,  4,216,
+    228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,
+    128,  4,218,233,242, 99,  2, 26,155, 26,160,236,101,128, 36,200,
+    245,237,230,236,229,120,128,  1, 92,239,237,237,225,225,227,227,
+    229,238,116,128,  2, 24,228,239,116,  2, 26,190, 26,199,225,227,
+    227,229,238,116,128, 30, 96,226,229,236,239,119,129, 30, 98, 26,
+    209,228,239,244,225,227,227,229,238,116,128, 30,104,101,  2, 26,
+    227, 26,239,232,225,242,237,229,238,233,225,110,128,  5, 77,246,
+    229,238,242,239,237,225,110,128, 33,102,104,  5, 27,  6, 27, 34,
+     27, 48, 27, 59, 27, 72, 97,  2, 27, 12, 27, 23,225,242,237,229,
+    238,233,225,110,128,  5, 71,227,249,242,233,236,236,233, 99,128,
+      4, 40,227,232,225,227,249,242,233,236,236,233, 99,128,  4, 41,
+    229,233,227,239,240,244,233, 99,128,  3,226,232,225,227,249,242,
+    233,236,236,233, 99,128,  4,186,233,237,225,227,239,240,244,233,
+     99,128,  3,236,105,  2, 27, 90, 27, 96,231,237, 97,128,  3,163,
+    248,242,239,237,225,110,128, 33,101,237,239,238,239,243,240,225,
+    227,101,128,255, 51,239,230,244,243,233,231,238,227,249,242,233,
+    236,236,233, 99,128,  4, 44,243,237,225,236,108,128,247,115,244,
+    233,231,237,225,231,242,229,229,107,128,  3,218, 84,141,  0, 84,
+     27,186, 27,191, 27,197, 28,  7, 28, 32, 28, 96, 28,147, 28,177,
+     28,189, 28,201, 28,246, 29,  6, 29, 46,225,117,128,  3,164,226,
+    225,114,128,  1,102, 99,  4, 27,207, 27,214, 27,223, 27,250,225,
+    242,239,110,128,  1,100,229,228,233,236,236, 97,128,  1, 98,233,
+    242, 99,  2, 27,231, 27,236,236,101,128, 36,201,245,237,230,236,
+    229,248,226,229,236,239,119,128, 30,112,239,237,237,225,225,227,
+    227,229,238,116,128,  1, 98,228,239,116,  2, 28, 15, 28, 24,225,
+    227,227,229,238,116,128, 30,106,226,229,236,239,119,128, 30,108,
+    101,  4, 28, 42, 28, 53, 28, 73, 28, 82,227,249,242,233,236,236,
+    233, 99,128,  4, 34,228,229,243,227,229,238,228,229,242,227,249,
+    242,233,236,236,233, 99,128,  4,172,238,242,239,237,225,110,128,
+     33,105,244,243,229,227,249,242,233,236,236,233, 99,128,  4,180,
+    104,  3, 28,104, 28,110, 28,136,229,244, 97,128,  3,152,111,  2,
+     28,116, 28,121,239,107,128,  1,172,242,110,129,  0,222, 28,128,
+    243,237,225,236,108,128,247,254,242,229,229,242,239,237,225,110,
+    128, 33, 98,105,  2, 28,153, 28,164,236,228,229,243,237,225,236,
+    108,128,246,254,247,238,225,242,237,229,238,233,225,110,128,  5,
+     79,236,233,238,229,226,229,236,239,119,128, 30,110,237,239,238,
+    239,243,240,225,227,101,128,255, 52,111,  2, 28,207, 28,218,225,
+    242,237,229,238,233,225,110,128,  5, 57,238,101,  3, 28,227, 28,
+    234, 28,240,230,233,246,101,128,  1,188,243,233,120,128,  1,132,
+    244,247,111,128,  1,167,242,229,244,242,239,230,236,229,248,232,
+    239,239,107,128,  1,174,115,  3, 29, 14, 29, 26, 29, 39,229,227,
+    249,242,233,236,236,233, 99,128,  4, 38,232,229,227,249,242,233,
+    236,236,233, 99,128,  4, 11,237,225,236,108,128,247,116,119,  2,
+     29, 52, 29, 64,229,236,246,229,242,239,237,225,110,128, 33,107,
+    239,242,239,237,225,110,128, 33, 97, 85,142,  0, 85, 29,105, 29,
+    123, 29,131, 29,198, 30, 69, 30, 87, 30,198, 30,214, 30,226, 31,
+     21, 31, 30, 31,142, 31,149, 31,219,225,227,245,244,101,129,  0,
+    218, 29,115,243,237,225,236,108,128,247,250,226,242,229,246,101,
+    128,  1,108, 99,  3, 29,139, 29,146, 29,188,225,242,239,110,128,
+      1,211,233,242, 99,  2, 29,154, 29,159,236,101,128, 36,202,245,
+    237,230,236,229,120,130,  0,219, 29,172, 29,180,226,229,236,239,
+    119,128, 30,118,243,237,225,236,108,128,247,251,249,242,233,236,
+    236,233, 99,128,  4, 35,100,  3, 29,206, 29,229, 30, 59,226,108,
+      2, 29,213, 29,221,225,227,245,244,101,128,  1,112,231,242,225,
+    246,101,128,  2, 20,233,229,242,229,243,233,115,134,  0,220, 29,
+    251, 30,  3, 30, 11, 30, 34, 30, 42, 30, 51,225,227,245,244,101,
+    128,  1,215,226,229,236,239,119,128, 30,114, 99,  2, 30, 17, 30,
+     24,225,242,239,110,128,  1,217,249,242,233,236,236,233, 99,128,
+      4,240,231,242,225,246,101,128,  1,219,237,225,227,242,239,110,
+    128,  1,213,243,237,225,236,108,128,247,252,239,244,226,229,236,
+    239,119,128, 30,228,231,242,225,246,101,129,  0,217, 30, 79,243,
+    237,225,236,108,128,247,249,104,  2, 30, 93, 30,171,111,  2, 30,
+     99, 30,109,239,235,225,226,239,246,101,128, 30,230,242,110,133,
+      1,175, 30,124, 30,132, 30,143, 30,151, 30,163,225,227,245,244,
+    101,128, 30,232,228,239,244,226,229,236,239,119,128, 30,240,231,
+    242,225,246,101,128, 30,234,232,239,239,235,225,226,239,246,101,
+    128, 30,236,244,233,236,228,101,128, 30,238,245,238,231,225,242,
+    245,237,236,225,245,116,129,  1,112, 30,187,227,249,242,233,236,
+    236,233, 99,128,  4,242,233,238,246,229,242,244,229,228,226,242,
+    229,246,101,128,  2, 22,235,227,249,242,233,236,236,233, 99,128,
+      4,120,109,  2, 30,232, 31, 10,225,227,242,239,110,130,  1,106,
+     30,244, 30,255,227,249,242,233,236,236,233, 99,128,  4,238,228,
+    233,229,242,229,243,233,115,128, 30,122,239,238,239,243,240,225,
+    227,101,128,255, 53,239,231,239,238,229,107,128,  1,114,240,243,
+    233,236,239,110,133,  3,165, 31, 49, 31, 53, 31, 90, 31,121, 31,
+    134, 49,128,  3,210, 97,  2, 31, 59, 31, 81,227,245,244,229,232,
+    239,239,235,243,249,237,226,239,236,231,242,229,229,107,128,  3,
+    211,230,242,233,227,225,110,128,  1,177,228,233,229,242,229,243,
+    233,115,129,  3,171, 31,103,232,239,239,235,243,249,237,226,239,
+    236,231,242,229,229,107,128,  3,212,232,239,239,235,243,249,237,
+    226,239,108,128,  3,210,244,239,238,239,115,128,  3,142,242,233,
+    238,103,128,  1,110,115,  3, 31,157, 31,172, 31,179,232,239,242,
+    244,227,249,242,233,236,236,233, 99,128,  4, 14,237,225,236,108,
+    128,247,117,244,242,225,233,231,232,116,  2, 31,191, 31,202,227,
+    249,242,233,236,236,233, 99,128,  4,174,243,244,242,239,235,229,
+    227,249,242,233,236,236,233, 99,128,  4,176,244,233,236,228,101,
+    130,  1,104, 31,231, 31,239,225,227,245,244,101,128, 30,120,226,
+    229,236,239,119,128, 30,116, 86,136,  0, 86, 32, 11, 32, 20, 32,
+     31, 32, 60, 32, 67, 32, 79, 32, 91, 32, 99,227,233,242,227,236,
+    101,128, 36,203,228,239,244,226,229,236,239,119,128, 30,126,101,
+      2, 32, 37, 32, 48,227,249,242,233,236,236,233, 99,128,  4, 18,
+    247,225,242,237,229,238,233,225,110,128,  5, 78,232,239,239,107,
+    128,  1,178,237,239,238,239,243,240,225,227,101,128,255, 54,239,
+    225,242,237,229,238,233,225,110,128,  5, 72,243,237,225,236,108,
+    128,247,118,244,233,236,228,101,128, 30,124, 87,134,  0, 87, 32,
+    123, 32,131, 32,154, 32,194, 32,202, 32,214,225,227,245,244,101,
+    128, 30,130,227,233,242, 99,  2, 32,140, 32,145,236,101,128, 36,
+    204,245,237,230,236,229,120,128,  1,116,100,  2, 32,160, 32,170,
+    233,229,242,229,243,233,115,128, 30,132,239,116,  2, 32,177, 32,
+    186,225,227,227,229,238,116,128, 30,134,226,229,236,239,119,128,
+     30,136,231,242,225,246,101,128, 30,128,237,239,238,239,243,240,
+    225,227,101,128,255, 55,243,237,225,236,108,128,247,119, 88,134,
+      0, 88, 32,238, 32,247, 33, 18, 33, 31, 33, 35, 33, 47,227,233,
+    242,227,236,101,128, 36,205,100,  2, 32,253, 33,  7,233,229,242,
+    229,243,233,115,128, 30,140,239,244,225,227,227,229,238,116,128,
+     30,138,229,232,225,242,237,229,238,233,225,110,128,  5, 61,105,
+    128,  3,158,237,239,238,239,243,240,225,227,101,128,255, 56,243,
+    237,225,236,108,128,247,120, 89,139,  0, 89, 33, 81, 33,116, 33,
+    139, 33,189, 33,228, 33,236, 33,253, 34, 40, 34, 52, 34, 60, 34,
+     68, 97,  2, 33, 87, 33,104,227,245,244,101,129,  0,221, 33, 96,
+    243,237,225,236,108,128,247,253,244,227,249,242,233,236,236,233,
+     99,128,  4, 98,227,233,242, 99,  2, 33,125, 33,130,236,101,128,
+     36,206,245,237,230,236,229,120,128,  1,118,100,  2, 33,145, 33,
+    165,233,229,242,229,243,233,115,129,  1,120, 33,157,243,237,225,
+    236,108,128,247,255,239,116,  2, 33,172, 33,181,225,227,227,229,
+    238,116,128, 30,142,226,229,236,239,119,128, 30,244,229,114,  2,
+     33,196, 33,208,233,227,249,242,233,236,236,233, 99,128,  4, 43,
+    245,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233,
+     99,128,  4,248,231,242,225,246,101,128, 30,242,232,239,239,107,
+    129,  1,179, 33,245,225,226,239,246,101,128, 30,246,105,  3, 34,
+      5, 34, 16, 34, 27,225,242,237,229,238,233,225,110,128,  5, 69,
+    227,249,242,233,236,236,233, 99,128,  4,  7,247,238,225,242,237,
+    229,238,233,225,110,128,  5, 82,237,239,238,239,243,240,225,227,
+    101,128,255, 57,243,237,225,236,108,128,247,121,244,233,236,228,
+    101,128, 30,248,245,115,  2, 34, 75, 34,113,226,233,103,  2, 34,
+     83, 34, 94,227,249,242,233,236,236,233, 99,128,  4,106,233,239,
+    244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128,  4,
+    108,236,233,244,244,236,101,  2, 34,124, 34,135,227,249,242,233,
+    236,236,233, 99,128,  4,102,233,239,244,233,230,233,229,228,227,
+    249,242,233,236,236,233, 99,128,  4,104, 90,136,  0, 90, 34,174,
+     34,198, 34,243, 35, 14, 35, 81, 35,173, 35,185, 35,197, 97,  2,
+     34,180, 34,191,225,242,237,229,238,233,225,110,128,  5, 54,227,
+    245,244,101,128,  1,121, 99,  2, 34,204, 34,221,225,242,239,110,
+    129,  1,125, 34,213,243,237,225,236,108,128,246,255,233,242, 99,
+      2, 34,229, 34,234,236,101,128, 36,207,245,237,230,236,229,120,
+    128, 30,144,228,239,116,130,  1,123, 34,253, 35,  6,225,227,227,
+    229,238,116,128,  1,123,226,229,236,239,119,128, 30,146,101,  3,
+     35, 22, 35, 33, 35, 76,227,249,242,233,236,236,233, 99,128,  4,
+     23,100,  2, 35, 39, 35, 58,229,243,227,229,238,228,229,242,227,
+    249,242,233,236,236,233, 99,128,  4,152,233,229,242,229,243,233,
+    243,227,249,242,233,236,236,233, 99,128,  4,222,244, 97,128,  3,
+    150,232,101,  4, 35, 92, 35,103, 35,119, 35,130,225,242,237,229,
+    238,233,225,110,128,  5, 58,226,242,229,246,229,227,249,242,233,
+    236,236,233, 99,128,  4,193,227,249,242,233,236,236,233, 99,128,
+      4, 22,100,  2, 35,136, 35,155,229,243,227,229,238,228,229,242,
+    227,249,242,233,236,236,233, 99,128,  4,150,233,229,242,229,243,
+    233,243,227,249,242,233,236,236,233, 99,128,  4,220,236,233,238,
+    229,226,229,236,239,119,128, 30,148,237,239,238,239,243,240,225,
+    227,101,128,255, 58,115,  2, 35,203, 35,210,237,225,236,108,128,
+    247,122,244,242,239,235,101,128,  1,181, 97,158,  0, 97, 36, 26,
+     38,154, 39,  4, 39, 68, 39,132, 39,196, 40,  4, 40, 68, 40,126,
+     40,190, 41, 70, 41,217, 42,137, 42,237, 43, 17, 49,192, 49,229,
+     50,  0, 50,225, 51,  7, 52, 96, 52,168, 53,123, 53,132, 54,  5,
+     56, 13, 57,  3, 57, 50, 57,201, 57,215, 49,138, 39,  1, 36, 50,
+     36,114, 36,154, 36,218, 37, 26, 37, 90, 37,154, 37,218, 38, 26,
+     38, 90, 48,138, 39, 33, 36, 74, 36, 78, 36, 82, 36, 86, 36, 90,
+     36, 94, 36, 98, 36,102, 36,106, 36,110, 48,128, 39, 94, 49,128,
+     39, 97, 50,128, 39, 98, 51,128, 39, 99, 52,128, 39,100, 53,128,
+     39, 16, 54,128, 39,101, 55,128, 39,102, 56,128, 39,103, 57,128,
+     38, 96, 49,134, 38, 27, 36,130, 36,134, 36,138, 36,142, 36,146,
+     36,150, 48,128, 38,101, 49,128, 38,102, 50,128, 38, 99, 55,128,
+     39,  9, 56,128, 39,  8, 57,128, 39,  7, 50,138, 38, 30, 36,178,
+     36,182, 36,186, 36,190, 36,194, 36,198, 36,202, 36,206, 36,210,
+     36,214, 48,128, 36, 96, 49,128, 36, 97, 50,128, 36, 98, 51,128,
+     36, 99, 52,128, 36,100, 53,128, 36,101, 54,128, 36,102, 55,128,
+     36,103, 56,128, 36,104, 57,128, 36,105, 51,138, 39, 12, 36,242,
+     36,246, 36,250, 36,254, 37,  2, 37,  6, 37, 10, 37, 14, 37, 18,
+     37, 22, 48,128, 39,118, 49,128, 39,119, 50,128, 39,120, 51,128,
+     39,121, 52,128, 39,122, 53,128, 39,123, 54,128, 39,124, 55,128,
+     39,125, 56,128, 39,126, 57,128, 39,127, 52,138, 39, 13, 37, 50,
+     37, 54, 37, 58, 37, 62, 37, 66, 37, 70, 37, 74, 37, 78, 37, 82,
+     37, 86, 48,128, 39,128, 49,128, 39,129, 50,128, 39,130, 51,128,
+     39,131, 52,128, 39,132, 53,128, 39,133, 54,128, 39,134, 55,128,
+     39,135, 56,128, 39,136, 57,128, 39,137, 53,138, 39, 14, 37,114,
+     37,118, 37,122, 37,126, 37,130, 37,134, 37,138, 37,142, 37,146,
+     37,150, 48,128, 39,138, 49,128, 39,139, 50,128, 39,140, 51,128,
+     39,141, 52,128, 39,142, 53,128, 39,143, 54,128, 39,144, 55,128,
+     39,145, 56,128, 39,146, 57,128, 39,147, 54,138, 39, 15, 37,178,
+     37,182, 37,186, 37,190, 37,194, 37,198, 37,202, 37,206, 37,210,
+     37,214, 48,128, 39,148, 49,128, 33,146, 50,128, 39,163, 51,128,
+     33,148, 52,128, 33,149, 53,128, 39,153, 54,128, 39,155, 55,128,
+     39,156, 56,128, 39,157, 57,128, 39,158, 55,138, 39, 17, 37,242,
+     37,246, 37,250, 37,254, 38,  2, 38,  6, 38, 10, 38, 14, 38, 18,
+     38, 22, 48,128, 39,159, 49,128, 39,160, 50,128, 39,161, 51,128,
+     39,162, 52,128, 39,164, 53,128, 39,165, 54,128, 39,166, 55,128,
+     39,167, 56,128, 39,168, 57,128, 39,169, 56,138, 39, 18, 38, 50,
+     38, 54, 38, 58, 38, 62, 38, 66, 38, 70, 38, 74, 38, 78, 38, 82,
+     38, 86, 48,128, 39,171, 49,128, 39,173, 50,128, 39,175, 51,128,
+     39,178, 52,128, 39,179, 53,128, 39,181, 54,128, 39,184, 55,128,
+     39,186, 56,128, 39,187, 57,128, 39,188, 57,138, 39, 19, 38,114,
+     38,118, 38,122, 38,126, 38,130, 38,134, 38,138, 38,142, 38,146,
+     38,150, 48,128, 39,189, 49,128, 39,190, 50,128, 39,154, 51,128,
+     39,170, 52,128, 39,182, 53,128, 39,185, 54,128, 39,152, 55,128,
+     39,180, 56,128, 39,183, 57,128, 39,172, 50,138, 39,  2, 38,178,
+     38,224, 38,228, 38,232, 38,236, 38,240, 38,244, 38,248, 38,252,
+     39,  0, 48,135, 39, 20, 38,196, 38,200, 38,204, 38,208, 38,212,
+     38,216, 38,220, 48,128, 39,174, 49,128, 39,177, 50,128, 39,  3,
+     51,128, 39, 80, 52,128, 39, 82, 53,128, 39,110, 54,128, 39,112,
+     49,128, 39, 21, 50,128, 39, 22, 51,128, 39, 23, 52,128, 39, 24,
+     53,128, 39, 25, 54,128, 39, 26, 55,128, 39, 27, 56,128, 39, 28,
+     57,128, 39, 34, 51,138, 39,  4, 39, 28, 39, 32, 39, 36, 39, 40,
+     39, 44, 39, 48, 39, 52, 39, 56, 39, 60, 39, 64, 48,128, 39, 35,
+     49,128, 39, 36, 50,128, 39, 37, 51,128, 39, 38, 52,128, 39, 39,
+     53,128, 38,  5, 54,128, 39, 41, 55,128, 39, 42, 56,128, 39, 43,
+     57,128, 39, 44, 52,138, 38, 14, 39, 92, 39, 96, 39,100, 39,104,
+     39,108, 39,112, 39,116, 39,120, 39,124, 39,128, 48,128, 39, 45,
+     49,128, 39, 46, 50,128, 39, 47, 51,128, 39, 48, 52,128, 39, 49,
+     53,128, 39, 50, 54,128, 39, 51, 55,128, 39, 52, 56,128, 39, 53,
+     57,128, 39, 54, 53,138, 39,  6, 39,156, 39,160, 39,164, 39,168,
+     39,172, 39,176, 39,180, 39,184, 39,188, 39,192, 48,128, 39, 55,
+     49,128, 39, 56, 50,128, 39, 57, 51,128, 39, 58, 52,128, 39, 59,
+     53,128, 39, 60, 54,128, 39, 61, 55,128, 39, 62, 56,128, 39, 63,
+     57,128, 39, 64, 54,138, 39, 29, 39,220, 39,224, 39,228, 39,232,
+     39,236, 39,240, 39,244, 39,248, 39,252, 40,  0, 48,128, 39, 65,
+     49,128, 39, 66, 50,128, 39, 67, 51,128, 39, 68, 52,128, 39, 69,
+     53,128, 39, 70, 54,128, 39, 71, 55,128, 39, 72, 56,128, 39, 73,
+     57,128, 39, 74, 55,138, 39, 30, 40, 28, 40, 32, 40, 36, 40, 40,
+     40, 44, 40, 48, 40, 52, 40, 56, 40, 60, 40, 64, 48,128, 39, 75,
+     49,128, 37,207, 50,128, 39, 77, 51,128, 37,160, 52,128, 39, 79,
+     53,128, 39, 81, 54,128, 37,178, 55,128, 37,188, 56,128, 37,198,
+     57,128, 39, 86, 56,137, 39, 31, 40, 90, 40, 94, 40, 98, 40,102,
+     40,106, 40,110, 40,114, 40,118, 40,122, 49,128, 37,215, 50,128,
+     39, 88, 51,128, 39, 89, 52,128, 39, 90, 53,128, 39,111, 54,128,
+     39,113, 55,128, 39,114, 56,128, 39,115, 57,128, 39,104, 57,138,
+     39, 32, 40,150, 40,154, 40,158, 40,162, 40,166, 40,170, 40,174,
+     40,178, 40,182, 40,186, 48,128, 39,105, 49,128, 39,108, 50,128,
+     39,109, 51,128, 39,106, 52,128, 39,107, 53,128, 39,116, 54,128,
+     39,117, 55,128, 39, 91, 56,128, 39, 92, 57,128, 39, 93, 97,  7,
+     40,206, 40,216, 40,223, 40,230, 40,255, 41, 15, 41, 26,226,229,
+    238,231,225,236,105,128,  9,134,227,245,244,101,128,  0,225,228,
+    229,246, 97,128,  9,  6,231,117,  2, 40,237, 40,246,234,225,242,
+    225,244,105,128, 10,134,242,237,245,235,232,105,128, 10,  6,237,
+    225,244,242,225,231,245,242,237,245,235,232,105,128, 10, 62,242,
+    245,243,241,245,225,242,101,128, 51,  3,246,239,247,229,236,243,
+    233,231,110,  3, 41, 42, 41, 52, 41, 59,226,229,238,231,225,236,
+    105,128,  9,190,228,229,246, 97,128,  9, 62,231,245,234,225,242,
+    225,244,105,128, 10,190, 98,  4, 41, 80, 41,121, 41,130, 41,140,
+    226,242,229,246,233,225,244,233,239,110,  2, 41, 95, 41,110,237,
+    225,242,235,225,242,237,229,238,233,225,110,128,  5, 95,243,233,
+    231,238,228,229,246, 97,128,  9,112,229,238,231,225,236,105,128,
+      9,133,239,240,239,237,239,230,111,128, 49, 26,242,229,246,101,
+    134,  1,  3, 41,159, 41,167, 41,178, 41,189, 41,197, 41,209,225,
+    227,245,244,101,128, 30,175,227,249,242,233,236,236,233, 99,128,
+      4,209,228,239,244,226,229,236,239,119,128, 30,183,231,242,225,
+    246,101,128, 30,177,232,239,239,235,225,226,239,246,101,128, 30,
+    179,244,233,236,228,101,128, 30,181, 99,  4, 41,227, 41,234, 42,
+     57, 42,127,225,242,239,110,128,  1,206,233,242, 99,  2, 41,242,
+     41,247,236,101,128, 36,208,245,237,230,236,229,120,133,  0,226,
+     42, 10, 42, 18, 42, 29, 42, 37, 42, 49,225,227,245,244,101,128,
+     30,165,228,239,244,226,229,236,239,119,128, 30,173,231,242,225,
+    246,101,128, 30,167,232,239,239,235,225,226,239,246,101,128, 30,
+    169,244,233,236,228,101,128, 30,171,245,244,101,133,  0,180, 42,
+     73, 42, 84, 42,101, 42,108, 42,117,226,229,236,239,247,227,237,
+     98,128,  3, 23, 99,  2, 42, 90, 42, 95,237, 98,128,  3,  1,239,
+    237, 98,128,  3,  1,228,229,246, 97,128,  9, 84,236,239,247,237,
+    239,100,128,  2,207,244,239,238,229,227,237, 98,128,  3, 65,249,
+    242,233,236,236,233, 99,128,  4, 48,100,  5, 42,149, 42,159, 42,
+    173, 42,179, 42,213,226,236,231,242,225,246,101,128,  2,  1,228,
+    225,235,231,245,242,237,245,235,232,105,128, 10,113,229,246, 97,
+    128,  9,  5,233,229,242,229,243,233,115,130,  0,228, 42,193, 42,
+    204,227,249,242,233,236,236,233, 99,128,  4,211,237,225,227,242,
+    239,110,128,  1,223,239,116,  2, 42,220, 42,228,226,229,236,239,
+    119,128, 30,161,237,225,227,242,239,110,128,  1,225,101,131,  0,
+    230, 42,247, 42,255, 43,  8,225,227,245,244,101,128,  1,253,235,
+    239,242,229,225,110,128, 49, 80,237,225,227,242,239,110,128,  1,
+    227,230,233,105,  6, 43, 33, 43, 53, 45,246, 45,252, 46, 11, 49,
+    111, 48,  2, 43, 39, 43, 46,176,178,176, 56,128, 32, 21,184,185,
+    180, 49,128, 32,164,177, 48,  3, 43, 62, 45, 86, 45,221, 48,  9,
+     43, 82, 43,102, 43,164, 43,226, 44, 32, 44, 94, 44,156, 44,218,
+     45, 24, 49,  3, 43, 90, 43, 94, 43, 98, 55,128,  4, 16, 56,128,
+      4, 17, 57,128,  4, 18, 50, 10, 43,124, 43,128, 43,132, 43,136,
+     43,140, 43,144, 43,148, 43,152, 43,156, 43,160, 48,128,  4, 19,
+     49,128,  4, 20, 50,128,  4, 21, 51,128,  4,  1, 52,128,  4, 22,
+     53,128,  4, 23, 54,128,  4, 24, 55,128,  4, 25, 56,128,  4, 26,
+     57,128,  4, 27, 51, 10, 43,186, 43,190, 43,194, 43,198, 43,202,
+     43,206, 43,210, 43,214, 43,218, 43,222, 48,128,  4, 28, 49,128,
+      4, 29, 50,128,  4, 30, 51,128,  4, 31, 52,128,  4, 32, 53,128,
+      4, 33, 54,128,  4, 34, 55,128,  4, 35, 56,128,  4, 36, 57,128,
+      4, 37, 52, 10, 43,248, 43,252, 44,  0, 44,  4, 44,  8, 44, 12,
+     44, 16, 44, 20, 44, 24, 44, 28, 48,128,  4, 38, 49,128,  4, 39,
+     50,128,  4, 40, 51,128,  4, 41, 52,128,  4, 42, 53,128,  4, 43,
+     54,128,  4, 44, 55,128,  4, 45, 56,128,  4, 46, 57,128,  4, 47,
+     53, 10, 44, 54, 44, 58, 44, 62, 44, 66, 44, 70, 44, 74, 44, 78,
+     44, 82, 44, 86, 44, 90, 48,128,  4,144, 49,128,  4,  2, 50,128,
+      4,  3, 51,128,  4,  4, 52,128,  4,  5, 53,128,  4,  6, 54,128,
+      4,  7, 55,128,  4,  8, 56,128,  4,  9, 57,128,  4, 10, 54, 10,
+     44,116, 44,120, 44,124, 44,128, 44,132, 44,136, 44,140, 44,144,
+     44,148, 44,152, 48,128,  4, 11, 49,128,  4, 12, 50,128,  4, 14,
+     51,128,246,196, 52,128,246,197, 53,128,  4, 48, 54,128,  4, 49,
+     55,128,  4, 50, 56,128,  4, 51, 57,128,  4, 52, 55, 10, 44,178,
+     44,182, 44,186, 44,190, 44,194, 44,198, 44,202, 44,206, 44,210,
+     44,214, 48,128,  4, 53, 49,128,  4, 81, 50,128,  4, 54, 51,128,
+      4, 55, 52,128,  4, 56, 53,128,  4, 57, 54,128,  4, 58, 55,128,
+      4, 59, 56,128,  4, 60, 57,128,  4, 61, 56, 10, 44,240, 44,244,
+     44,248, 44,252, 45,  0, 45,  4, 45,  8, 45, 12, 45, 16, 45, 20,
+     48,128,  4, 62, 49,128,  4, 63, 50,128,  4, 64, 51,128,  4, 65,
+     52,128,  4, 66, 53,128,  4, 67, 54,128,  4, 68, 55,128,  4, 69,
+     56,128,  4, 70, 57,128,  4, 71, 57, 10, 45, 46, 45, 50, 45, 54,
+     45, 58, 45, 62, 45, 66, 45, 70, 45, 74, 45, 78, 45, 82, 48,128,
+      4, 72, 49,128,  4, 73, 50,128,  4, 74, 51,128,  4, 75, 52,128,
+      4, 76, 53,128,  4, 77, 54,128,  4, 78, 55,128,  4, 79, 56,128,
+      4,145, 57,128,  4, 82, 49,  4, 45, 96, 45,158, 45,163, 45,189,
+     48, 10, 45,118, 45,122, 45,126, 45,130, 45,134, 45,138, 45,142,
+     45,146, 45,150, 45,154, 48,128,  4, 83, 49,128,  4, 84, 50,128,
+      4, 85, 51,128,  4, 86, 52,128,  4, 87, 53,128,  4, 88, 54,128,
+      4, 89, 55,128,  4, 90, 56,128,  4, 91, 57,128,  4, 92,177, 48,
+    128,  4, 94, 52,  4, 45,173, 45,177, 45,181, 45,185, 53,128,  4,
+     15, 54,128,  4, 98, 55,128,  4,114, 56,128,  4,116, 57,  5, 45,
+    201, 45,205, 45,209, 45,213, 45,217, 50,128,246,198, 51,128,  4,
+     95, 52,128,  4, 99, 53,128,  4,115, 54,128,  4,117, 56,  2, 45,
+    227, 45,241, 51,  2, 45,233, 45,237, 49,128,246,199, 50,128,246,
+    200,180, 54,128,  4,217,178,185, 57,128, 32, 14,179, 48,  2, 46,
+      3, 46,  7, 48,128, 32, 15, 49,128, 32, 13,181, 55,  7, 46, 28,
+     46, 98, 47,163, 47,240, 48,197, 49, 34, 49,105, 51,  2, 46, 34,
+     46, 48, 56,  2, 46, 40, 46, 44, 49,128,  6,106, 56,128,  6, 12,
+     57,  8, 46, 66, 46, 70, 46, 74, 46, 78, 46, 82, 46, 86, 46, 90,
+     46, 94, 50,128,  6, 96, 51,128,  6, 97, 52,128,  6, 98, 53,128,
+      6, 99, 54,128,  6,100, 55,128,  6,101, 56,128,  6,102, 57,128,
+      6,103, 52,  7, 46,114, 46,146, 46,208, 47, 14, 47, 46, 47,102,
+     47,158, 48,  5, 46,126, 46,130, 46,134, 46,138, 46,142, 48,128,
+      6,104, 49,128,  6,105, 51,128,  6, 27, 55,128,  6, 31, 57,128,
+      6, 33, 49, 10, 46,168, 46,172, 46,176, 46,180, 46,184, 46,188,
+     46,192, 46,196, 46,200, 46,204, 48,128,  6, 34, 49,128,  6, 35,
+     50,128,  6, 36, 51,128,  6, 37, 52,128,  6, 38, 53,128,  6, 39,
+     54,128,  6, 40, 55,128,  6, 41, 56,128,  6, 42, 57,128,  6, 43,
+     50, 10, 46,230, 46,234, 46,238, 46,242, 46,246, 46,250, 46,254,
+     47,  2, 47,  6, 47, 10, 48,128,  6, 44, 49,128,  6, 45, 50,128,
+      6, 46, 51,128,  6, 47, 52,128,  6, 48, 53,128,  6, 49, 54,128,
+      6, 50, 55,128,  6, 51, 56,128,  6, 52, 57,128,  6, 53, 51,  5,
+     47, 26, 47, 30, 47, 34, 47, 38, 47, 42, 48,128,  6, 54, 49,128,
+      6, 55, 50,128,  6, 56, 51,128,  6, 57, 52,128,  6, 58, 52,  9,
+     47, 66, 47, 70, 47, 74, 47, 78, 47, 82, 47, 86, 47, 90, 47, 94,
+     47, 98, 48,128,  6, 64, 49,128,  6, 65, 50,128,  6, 66, 51,128,
+      6, 67, 52,128,  6, 68, 53,128,  6, 69, 54,128,  6, 70, 56,128,
+      6, 72, 57,128,  6, 73, 53,  9, 47,122, 47,126, 47,130, 47,134,
+     47,138, 47,142, 47,146, 47,150, 47,154, 48,128,  6, 74, 49,128,
+      6, 75, 50,128,  6, 76, 51,128,  6, 77, 52,128,  6, 78, 53,128,
+      6, 79, 54,128,  6, 80, 55,128,  6, 81, 56,128,  6, 82,183, 48,
+    128,  6, 71, 53,  3, 47,171, 47,203, 47,235, 48,  5, 47,183, 47,
+    187, 47,191, 47,195, 47,199, 53,128,  6,164, 54,128,  6,126, 55,
+    128,  6,134, 56,128,  6,152, 57,128,  6,175, 49,  5, 47,215, 47,
+    219, 47,223, 47,227, 47,231, 49,128,  6,121, 50,128,  6,136, 51,
+    128,  6,145, 52,128,  6,186, 57,128,  6,210,179, 52,128,  6,213,
+     54,  7, 48,  0, 48,  5, 48, 10, 48, 15, 48, 53, 48,115, 48,177,
+    179, 54,128, 32,170,180, 53,128,  5,190,181, 56,128,  5,195, 54,
+      6, 48, 29, 48, 33, 48, 37, 48, 41, 48, 45, 48, 49, 52,128,  5,
+    208, 53,128,  5,209, 54,128,  5,210, 55,128,  5,211, 56,128,  5,
+    212, 57,128,  5,213, 55, 10, 48, 75, 48, 79, 48, 83, 48, 87, 48,
+     91, 48, 95, 48, 99, 48,103, 48,107, 48,111, 48,128,  5,214, 49,
+    128,  5,215, 50,128,  5,216, 51,128,  5,217, 52,128,  5,218, 53,
+    128,  5,219, 54,128,  5,220, 55,128,  5,221, 56,128,  5,222, 57,
+    128,  5,223, 56, 10, 48,137, 48,141, 48,145, 48,149, 48,153, 48,
+    157, 48,161, 48,165, 48,169, 48,173, 48,128,  5,224, 49,128,  5,
+    225, 50,128,  5,226, 51,128,  5,227, 52,128,  5,228, 53,128,  5,
+    229, 54,128,  5,230, 55,128,  5,231, 56,128,  5,232, 57,128,  5,
+    233, 57,  3, 48,185, 48,189, 48,193, 48,128,  5,234, 52,128,251,
+     42, 53,128,251, 43, 55,  4, 48,207, 48,221, 48,241, 48,246, 48,
+      2, 48,213, 48,217, 48,128,251, 75, 53,128,251, 31, 49,  3, 48,
+    229, 48,233, 48,237, 54,128,  5,240, 55,128,  5,241, 56,128,  5,
+    242,178, 51,128,251, 53, 57,  7, 49,  6, 49, 10, 49, 14, 49, 18,
+     49, 22, 49, 26, 49, 30, 51,128,  5,180, 52,128,  5,181, 53,128,
+      5,182, 54,128,  5,187, 55,128,  5,184, 56,128,  5,183, 57,128,
+      5,176, 56,  3, 49, 42, 49, 86, 49, 91, 48,  7, 49, 58, 49, 62,
+     49, 66, 49, 70, 49, 74, 49, 78, 49, 82, 48,128,  5,178, 49,128,
+      5,177, 50,128,  5,179, 51,128,  5,194, 52,128,  5,193, 54,128,
+      5,185, 55,128,  5,188,179, 57,128,  5,189, 52,  2, 49, 97, 49,
+    101, 49,128,  5,191, 50,128,  5,192,185,178, 57,128,  2,188, 54,
+      3, 49,119, 49,178, 49,185, 49,  4, 49,129, 49,145, 49,151, 49,
+    172, 50,  2, 49,135, 49,140,180, 56,128, 33,  5,184, 57,128, 33,
+     19,179,181, 50,128, 33, 22,181, 55,  3, 49,160, 49,164, 49,168,
+     51,128, 32, 44, 52,128, 32, 45, 53,128, 32, 46,182,182, 52,128,
+     32, 12,179,177,182, 55,128,  6,109,180,185,179, 55,128,  2,189,
+    103,  2, 49,198, 49,205,242,225,246,101,128,  0,224,117,  2, 49,
+    211, 49,220,234,225,242,225,244,105,128, 10,133,242,237,245,235,
+    232,105,128, 10,  5,104,  2, 49,235, 49,245,233,242,225,231,225,
+    238, 97,128, 48, 66,239,239,235,225,226,239,246,101,128, 30,163,
+    105,  7, 50, 16, 50, 41, 50, 48, 50, 60, 50, 85, 50,101, 50,181,
+     98,  2, 50, 22, 50, 31,229,238,231,225,236,105,128,  9,144,239,
+    240,239,237,239,230,111,128, 49, 30,228,229,246, 97,128,  9, 16,
+    229,227,249,242,233,236,236,233, 99,128,  4,213,231,117,  2, 50,
+     67, 50, 76,234,225,242,225,244,105,128, 10,144,242,237,245,235,
+    232,105,128, 10, 16,237,225,244,242,225,231,245,242,237,245,235,
+    232,105,128, 10, 72,110,  5, 50,113, 50,122, 50,136, 50,152, 50,
+    167,225,242,225,226,233, 99,128,  6, 57,230,233,238,225,236,225,
+    242,225,226,233, 99,128,254,202,233,238,233,244,233,225,236,225,
+    242,225,226,233, 99,128,254,203,237,229,228,233,225,236,225,242,
+    225,226,233, 99,128,254,204,246,229,242,244,229,228,226,242,229,
+    246,101,128,  2,  3,246,239,247,229,236,243,233,231,110,  3, 50,
+    197, 50,207, 50,214,226,229,238,231,225,236,105,128,  9,200,228,
+    229,246, 97,128,  9, 72,231,245,234,225,242,225,244,105,128, 10,
+    200,107,  2, 50,231, 50,255,225,244,225,235,225,238, 97,129, 48,
+    162, 50,243,232,225,236,230,247,233,228,244,104,128,255,113,239,
+    242,229,225,110,128, 49, 79,108,  3, 51, 15, 52, 71, 52, 80,101,
+      2, 51, 21, 52, 66,102,136,  5,208, 51, 41, 51, 50, 51, 65, 51,
+     79, 51,168, 51,182, 52, 37, 52, 51,225,242,225,226,233, 99,128,
+      6, 39,228,225,231,229,243,232,232,229,226,242,229,119,128,251,
+     48,230,233,238,225,236,225,242,225,226,233, 99,128,254,142,104,
+      2, 51, 85, 51,160,225,237,250, 97,  2, 51, 94, 51,127,225,226,
+    239,246,101,  2, 51,104, 51,113,225,242,225,226,233, 99,128,  6,
+     35,230,233,238,225,236,225,242,225,226,233, 99,128,254,132,226,
+    229,236,239,119,  2, 51,137, 51,146,225,242,225,226,233, 99,128,
+      6, 37,230,233,238,225,236,225,242,225,226,233, 99,128,254,136,
+    229,226,242,229,119,128,  5,208,236,225,237,229,228,232,229,226,
+    242,229,119,128,251, 79,237, 97,  2, 51,189, 51,225,228,228,225,
+    225,226,239,246,101,  2, 51,202, 51,211,225,242,225,226,233, 99,
+    128,  6, 34,230,233,238,225,236,225,242,225,226,233, 99,128,254,
+    130,235,243,245,242, 97,  4, 51,239, 51,248, 52,  6, 52, 22,225,
+    242,225,226,233, 99,128,  6, 73,230,233,238,225,236,225,242,225,
+    226,233, 99,128,254,240,233,238,233,244,233,225,236,225,242,225,
+    226,233, 99,128,254,243,237,229,228,233,225,236,225,242,225,226,
+    233, 99,128,254,244,240,225,244,225,232,232,229,226,242,229,119,
+    128,251, 46,241,225,237,225,244,243,232,229,226,242,229,119,128,
+    251, 47,240,104,128, 33, 53,236,229,241,245,225,108,128, 34, 76,
+    240,232, 97,129,  3,177, 52, 88,244,239,238,239,115,128,  3,172,
+    109,  4, 52,106, 52,114, 52,125, 52,159,225,227,242,239,110,128,
+      1,  1,239,238,239,243,240,225,227,101,128,255, 65,240,229,242,
+    243,225,238,100,130,  0, 38, 52,139, 52,151,237,239,238,239,243,
+    240,225,227,101,128,255,  6,243,237,225,236,108,128,247, 38,243,
+    241,245,225,242,101,128, 51,194,110,  4, 52,178, 52,189, 53, 55,
+     53, 65,226,239,240,239,237,239,230,111,128, 49, 34,103,  4, 52,
+    199, 52,210, 52,224, 53, 47,226,239,240,239,237,239,230,111,128,
+     49, 36,235,232,225,238,235,232,245,244,232,225,105,128, 14, 90,
+    236,101,131, 34, 32, 52,235, 53, 32, 53, 39,226,242,225,227,235,
+    229,116,  2, 52,247, 53, 11,236,229,230,116,129, 48,  8, 53,  0,
+    246,229,242,244,233,227,225,108,128,254, 63,242,233,231,232,116,
+    129, 48,  9, 53, 21,246,229,242,244,233,227,225,108,128,254, 64,
+    236,229,230,116,128, 35, 41,242,233,231,232,116,128, 35, 42,243,
+    244,242,239,109,128, 33, 43,239,244,229,236,229,233, 97,128,  3,
+    135,117,  2, 53, 71, 53, 83,228,225,244,244,225,228,229,246, 97,
+    128,  9, 82,243,246,225,242, 97,  3, 53, 95, 53,105, 53,112,226,
+    229,238,231,225,236,105,128,  9,130,228,229,246, 97,128,  9,  2,
+    231,245,234,225,242,225,244,105,128, 10,130,239,231,239,238,229,
+    107,128,  1,  5,112,  3, 53,140, 53,164, 53,194, 97,  2, 53,146,
+     53,158,225,244,239,243,241,245,225,242,101,128, 51,  0,242,229,
+    110,128, 36,156,239,243,244,242,239,240,232,101,  2, 53,177, 53,
+    188,225,242,237,229,238,233,225,110,128,  5, 90,237,239,100,128,
+      2,188,112,  2, 53,200, 53,205,236,101,128,248,255,242,111,  2,
+     53,212, 53,220,225,227,232,229,115,128, 34, 80,120,  2, 53,226,
+     53,246,229,241,245,225,108,129, 34, 72, 53,236,239,242,233,237,
+    225,231,101,128, 34, 82,233,237,225,244,229,236,249,229,241,245,
+    225,108,128, 34, 69,114,  4, 54, 15, 54, 42, 54, 46, 54, 91,225,
+    229, 97,  2, 54, 23, 54, 33,229,235,239,242,229,225,110,128, 49,
+    142,235,239,242,229,225,110,128, 49,141, 99,128, 35, 18,105,  2,
+     54, 52, 54, 66,231,232,244,232,225,236,230,242,233,238,103,128,
+     30,154,238,103,130,  0,229, 54, 75, 54, 83,225,227,245,244,101,
+    128,  1,251,226,229,236,239,119,128, 30,  1,242,239,119,  8, 54,
+    111, 54,118, 54,247, 55, 57, 55,107, 55,162, 55,185, 56,  4,226,
+    239,244,104,128, 33,148,100,  3, 54,126, 54,165, 54,212,225,243,
+    104,  4, 54,138, 54,145, 54,152, 54,160,228,239,247,110,128, 33,
+    227,236,229,230,116,128, 33,224,242,233,231,232,116,128, 33,226,
+    245,112,128, 33,225,226,108,  5, 54,178, 54,185, 54,192, 54,199,
+     54,207,226,239,244,104,128, 33,212,228,239,247,110,128, 33,211,
+    236,229,230,116,128, 33,208,242,233,231,232,116,128, 33,210,245,
+    112,128, 33,209,239,247,110,131, 33,147, 54,224, 54,231, 54,239,
+    236,229,230,116,128, 33,153,242,233,231,232,116,128, 33,152,247,
+    232,233,244,101,128, 33,233,104,  2, 54,253, 55, 48,229,225,100,
+      4, 55,  9, 55, 19, 55, 29, 55, 40,228,239,247,238,237,239,100,
+    128,  2,197,236,229,230,244,237,239,100,128,  2,194,242,233,231,
+    232,244,237,239,100,128,  2,195,245,240,237,239,100,128,  2,196,
+    239,242,233,250,229,120,128,248,231,236,229,230,116,131, 33,144,
+     55, 70, 55, 87, 55, 99,228,226,108,129, 33,208, 55, 78,243,244,
+    242,239,235,101,128, 33,205,239,246,229,242,242,233,231,232,116,
+    128, 33,198,247,232,233,244,101,128, 33,230,242,233,231,232,116,
+    132, 33,146, 55,123, 55,135, 55,143, 55,154,228,226,236,243,244,
+    242,239,235,101,128, 33,207,232,229,225,246,121,128, 39,158,239,
+    246,229,242,236,229,230,116,128, 33,196,247,232,233,244,101,128,
+     33,232,244,225, 98,  2, 55,170, 55,177,236,229,230,116,128, 33,
+    228,242,233,231,232,116,128, 33,229,245,112,132, 33,145, 55,198,
+     55,226, 55,244, 55,252,100,  2, 55,204, 55,216,110,129, 33,149,
+     55,210,226,243,101,128, 33,168,239,247,238,226,225,243,101,128,
+     33,168,236,229,230,116,129, 33,150, 55,235,239,230,228,239,247,
+    110,128, 33,197,242,233,231,232,116,128, 33,151,247,232,233,244,
+    101,128, 33,231,246,229,242,244,229,120,128,248,230,115,  5, 56,
+     25, 56,101, 56,146, 56,229, 56,239, 99,  2, 56, 31, 56, 83,233,
+    105,  2, 56, 38, 56, 61,227,233,242,227,245,109,129,  0, 94, 56,
+     49,237,239,238,239,243,240,225,227,101,128,255, 62,244,233,236,
+    228,101,129,  0,126, 56, 71,237,239,238,239,243,240,225,227,101,
+    128,255, 94,242,233,240,116,129,  2, 81, 56, 92,244,245,242,238,
+    229,100,128,  2, 82,237,225,236,108,  2, 56,110, 56,121,232,233,
+    242,225,231,225,238, 97,128, 48, 65,235,225,244,225,235,225,238,
+     97,129, 48,161, 56,134,232,225,236,230,247,233,228,244,104,128,
+    255,103,244,229,242,233,115,  2, 56,156, 56,225,107,131,  0, 42,
+     56,166, 56,194, 56,217, 97,  2, 56,172, 56,186,236,244,239,238,
+    229,225,242,225,226,233, 99,128,  6,109,242,225,226,233, 99,128,
+      6,109,109,  2, 56,200, 56,206,225,244,104,128, 34, 23,239,238,
+    239,243,240,225,227,101,128,255, 10,243,237,225,236,108,128,254,
+     97,109,128, 32, 66,245,240,229,242,233,239,114,128,246,233,249,
+    237,240,244,239,244,233,227,225,236,236,249,229,241,245,225,108,
+    128, 34, 67,116,132,  0, 64, 57, 15, 57, 22, 57, 34, 57, 42,233,
+    236,228,101,128,  0,227,237,239,238,239,243,240,225,227,101,128,
+    255, 32,243,237,225,236,108,128,254,107,245,242,238,229,100,128,
+      2, 80,117,  6, 57, 64, 57, 89, 57, 96, 57,121, 57,141, 57,157,
+     98,  2, 57, 70, 57, 79,229,238,231,225,236,105,128,  9,148,239,
+    240,239,237,239,230,111,128, 49, 32,228,229,246, 97,128,  9, 20,
+    231,117,  2, 57,103, 57,112,234,225,242,225,244,105,128, 10,148,
+    242,237,245,235,232,105,128, 10, 20,236,229,238,231,244,232,237,
+    225,242,235,226,229,238,231,225,236,105,128,  9,215,237,225,244,
+    242,225,231,245,242,237,245,235,232,105,128, 10, 76,246,239,247,
+    229,236,243,233,231,110,  3, 57,173, 57,183, 57,190,226,229,238,
+    231,225,236,105,128,  9,204,228,229,246, 97,128,  9, 76,231,245,
+    234,225,242,225,244,105,128, 10,204,246,225,231,242,225,232,225,
+    228,229,246, 97,128,  9, 61,121,  2, 57,221, 57,233,226,225,242,
+    237,229,238,233,225,110,128,  5, 97,233,110,130,  5,226, 57,242,
+     58,  1,225,236,244,239,238,229,232,229,226,242,229,119,128,251,
+     32,232,229,226,242,229,119,128,  5,226, 98,144,  0, 98, 58, 46,
+     58,181, 58,192, 58,201, 58,226, 60, 11, 60, 73, 60,146, 62, 72,
+     62, 84, 62,127, 62,135, 62,145, 64, 15, 64, 39, 64, 48, 97,  7,
+     58, 62, 58, 72, 58, 96, 58,103, 58,128, 58,152, 58,163,226,229,
+    238,231,225,236,105,128,  9,172,227,235,243,236,225,243,104,129,
+      0, 92, 58, 84,237,239,238,239,243,240,225,227,101,128,255, 60,
+    228,229,246, 97,128,  9, 44,231,117,  2, 58,110, 58,119,234,225,
+    242,225,244,105,128, 10,172,242,237,245,235,232,105,128, 10, 44,
+    104,  2, 58,134, 58,144,233,242,225,231,225,238, 97,128, 48,112,
+    244,244,232,225,105,128, 14, 63,235,225,244,225,235,225,238, 97,
+    128, 48,208,114,129,  0,124, 58,169,237,239,238,239,243,240,225,
+    227,101,128,255, 92,226,239,240,239,237,239,230,111,128, 49,  5,
+    227,233,242,227,236,101,128, 36,209,228,239,116,  2, 58,209, 58,
+    218,225,227,227,229,238,116,128, 30,  3,226,229,236,239,119,128,
+     30,  5,101,  6, 58,240, 59,  5, 59, 28, 59,170, 59,181, 59,193,
+    225,237,229,228,243,233,248,244,229,229,238,244,232,238,239,244,
+    229,115,128, 38,108, 99,  2, 59, 11, 59, 18,225,245,243,101,128,
+     34, 53,249,242,233,236,236,233, 99,128,  4, 49,104,  5, 59, 40,
+     59, 49, 59, 63, 59, 93, 59,152,225,242,225,226,233, 99,128,  6,
+     40,230,233,238,225,236,225,242,225,226,233, 99,128,254,144,105,
+      2, 59, 69, 59, 84,238,233,244,233,225,236,225,242,225,226,233,
+     99,128,254,145,242,225,231,225,238, 97,128, 48,121,237,101,  2,
+     59,100, 59,113,228,233,225,236,225,242,225,226,233, 99,128,254,
+    146,229,237,105,  2, 59,121, 59,136,238,233,244,233,225,236,225,
+    242,225,226,233, 99,128,252,159,243,239,236,225,244,229,228,225,
+    242,225,226,233, 99,128,252,  8,238,239,239,238,230,233,238,225,
+    236,225,242,225,226,233, 99,128,252,109,235,225,244,225,235,225,
+    238, 97,128, 48,217,238,225,242,237,229,238,233,225,110,128,  5,
+     98,116,132,  5,209, 59,205, 59,225, 59,245, 59,254, 97,129,  3,
+    178, 59,211,243,249,237,226,239,236,231,242,229,229,107,128,  3,
+    208,228,225,231,229,243,104,129,251, 49, 59,236,232,229,226,242,
+    229,119,128,251, 49,232,229,226,242,229,119,128,  5,209,242,225,
+    230,229,232,229,226,242,229,119,128,251, 76,104,  2, 60, 17, 60,
+     67, 97,  3, 60, 25, 60, 35, 60, 42,226,229,238,231,225,236,105,
+    128,  9,173,228,229,246, 97,128,  9, 45,231,117,  2, 60, 49, 60,
+     58,234,225,242,225,244,105,128, 10,173,242,237,245,235,232,105,
+    128, 10, 45,239,239,107,128,  2, 83,105,  5, 60, 85, 60, 96, 60,
+    107, 60,121, 60,135,232,233,242,225,231,225,238, 97,128, 48,115,
+    235,225,244,225,235,225,238, 97,128, 48,211,236,225,226,233,225,
+    236,227,236,233,227,107,128,  2,152,238,228,233,231,245,242,237,
+    245,235,232,105,128, 10,  2,242,245,243,241,245,225,242,101,128,
+     51, 49,108,  3, 60,154, 62, 55, 62, 66, 97,  2, 60,160, 62, 50,
+    227,107,  6, 60,175, 60,184, 60,221, 61,114, 61,169, 61,221,227,
+    233,242,227,236,101,128, 37,207,100,  2, 60,190, 60,199,233,225,
+    237,239,238,100,128, 37,198,239,247,238,240,239,233,238,244,233,
+    238,231,244,242,233,225,238,231,236,101,128, 37,188,108,  2, 60,
+    227, 61, 74,101,  2, 60,233, 61, 13,230,244,240,239,233,238,244,
+    233,238,103,  2, 60,248, 61,  2,240,239,233,238,244,229,114,128,
+     37,196,244,242,233,225,238,231,236,101,128, 37,192,238,244,233,
+    227,245,236,225,242,226,242,225,227,235,229,116,  2, 61, 33, 61,
+     53,236,229,230,116,129, 48, 16, 61, 42,246,229,242,244,233,227,
+    225,108,128,254, 59,242,233,231,232,116,129, 48, 17, 61, 63,246,
+    229,242,244,233,227,225,108,128,254, 60,239,247,229,114,  2, 61,
+     83, 61, 98,236,229,230,244,244,242,233,225,238,231,236,101,128,
+     37,227,242,233,231,232,244,244,242,233,225,238,231,236,101,128,
+     37,226,114,  2, 61,120, 61,131,229,227,244,225,238,231,236,101,
+    128, 37,172,233,231,232,244,240,239,233,238,244,233,238,103,  2,
+     61,148, 61,158,240,239,233,238,244,229,114,128, 37,186,244,242,
+    233,225,238,231,236,101,128, 37,182,115,  3, 61,177, 61,207, 61,
+    215,109,  2, 61,183, 61,195,225,236,236,243,241,245,225,242,101,
+    128, 37,170,233,236,233,238,231,230,225,227,101,128, 38, 59,241,
+    245,225,242,101,128, 37,160,244,225,114,128, 38,  5,245,240,112,
+      2, 61,229, 62, 11,229,114,  2, 61,236, 61,251,236,229,230,244,
+    244,242,233,225,238,231,236,101,128, 37,228,242,233,231,232,244,
+    244,242,233,225,238,231,236,101,128, 37,229,239,233,238,244,233,
+    238,103,  2, 62, 23, 62, 39,243,237,225,236,236,244,242,233,225,
+    238,231,236,101,128, 37,180,244,242,233,225,238,231,236,101,128,
+     37,178,238,107,128, 36, 35,233,238,229,226,229,236,239,119,128,
+     30,  7,239,227,107,128, 37,136,237,239,238,239,243,240,225,227,
+    101,128,255, 66,111,  3, 62, 92, 62,105, 62,116,226,225,233,237,
+    225,233,244,232,225,105,128, 14, 26,232,233,242,225,231,225,238,
+     97,128, 48,124,235,225,244,225,235,225,238, 97,128, 48,220,240,
+    225,242,229,110,128, 36,157,241,243,241,245,225,242,101,128, 51,
+    195,114,  4, 62,155, 63,149, 63,222, 64,  5,225, 99,  2, 62,162,
+     63, 56,101,  3, 62,170, 62,175, 62,243,229,120,128,248,244,236,
+    229,230,116,133,  0,123, 62,192, 62,197, 62,219, 62,227, 62,232,
+    226,116,128,248,243,109,  2, 62,203, 62,208,233,100,128,248,242,
+    239,238,239,243,240,225,227,101,128,255, 91,243,237,225,236,108,
+    128,254, 91,244,112,128,248,241,246,229,242,244,233,227,225,108,
+    128,254, 55,242,233,231,232,116,133,  0,125, 63,  5, 63, 10, 63,
+     32, 63, 40, 63, 45,226,116,128,248,254,109,  2, 63, 16, 63, 21,
+    233,100,128,248,253,239,238,239,243,240,225,227,101,128,255, 93,
+    243,237,225,236,108,128,254, 92,244,112,128,248,252,246,229,242,
+    244,233,227,225,108,128,254, 56,235,229,116,  2, 63, 64, 63,106,
+    236,229,230,116,132,  0, 91, 63, 79, 63, 84, 63, 89, 63,101,226,
+    116,128,248,240,229,120,128,248,239,237,239,238,239,243,240,225,
+    227,101,128,255, 59,244,112,128,248,238,242,233,231,232,116,132,
+      0, 93, 63,122, 63,127, 63,132, 63,144,226,116,128,248,251,229,
+    120,128,248,250,237,239,238,239,243,240,225,227,101,128,255, 61,
+    244,112,128,248,249,229,246,101,131,  2,216, 63,161, 63,172, 63,
+    178,226,229,236,239,247,227,237, 98,128,  3, 46,227,237, 98,128,
+      3,  6,233,238,246,229,242,244,229,100,  3, 63,193, 63,204, 63,
+    210,226,229,236,239,247,227,237, 98,128,  3, 47,227,237, 98,128,
+      3, 17,228,239,245,226,236,229,227,237, 98,128,  3, 97,233,228,
+    231,101,  2, 63,231, 63,242,226,229,236,239,247,227,237, 98,128,
+      3, 42,233,238,246,229,242,244,229,228,226,229,236,239,247,227,
+    237, 98,128,  3, 58,239,235,229,238,226,225,114,128,  0,166,115,
+      2, 64, 21, 64, 29,244,242,239,235,101,128,  1,128,245,240,229,
+    242,233,239,114,128,246,234,244,239,240,226,225,114,128,  1,131,
+    117,  3, 64, 56, 64, 67, 64, 78,232,233,242,225,231,225,238, 97,
+    128, 48,118,235,225,244,225,235,225,238, 97,128, 48,214,236,108,
+      2, 64, 85, 64,115,229,116,130, 32, 34, 64, 94, 64,104,233,238,
+    246,229,242,243,101,128, 37,216,239,240,229,242,225,244,239,114,
+    128, 34, 25,243,229,249,101,128, 37,206, 99,143,  0, 99, 64,156,
+     65,105, 65,116, 65,180, 65,211, 66, 48, 67,215, 68,199, 69, 43,
+     69, 92, 72, 84, 72, 92, 72,102, 72,114, 72,147, 97,  9, 64,176,
+     64,187, 64,197, 64,204, 64,211, 64,236, 64,246, 65, 42, 65, 51,
+    225,242,237,229,238,233,225,110,128,  5,110,226,229,238,231,225,
+    236,105,128,  9,154,227,245,244,101,128,  1,  7,228,229,246, 97,
+    128,  9, 26,231,117,  2, 64,218, 64,227,234,225,242,225,244,105,
+    128, 10,154,242,237,245,235,232,105,128, 10, 26,236,243,241,245,
+    225,242,101,128, 51,136,238,228,242,225,226,233,238,228,117,  4,
+     65,  8, 65, 18, 65, 24, 65, 31,226,229,238,231,225,236,105,128,
+      9,129,227,237, 98,128,  3, 16,228,229,246, 97,128,  9,  1,231,
+    245,234,225,242,225,244,105,128, 10,129,240,243,236,239,227,107,
+    128, 33,234,114,  3, 65, 59, 65, 65, 65, 91,229,239,102,128, 33,
+      5,239,110,130,  2,199, 65, 74, 65, 85,226,229,236,239,247,227,
+    237, 98,128,  3, 44,227,237, 98,128,  3, 12,242,233,225,231,229,
+    242,229,244,245,242,110,128, 33,181,226,239,240,239,237,239,230,
+    111,128, 49, 24, 99,  4, 65,126, 65,133, 65,152, 65,174,225,242,
+    239,110,128,  1, 13,229,228,233,236,236, 97,129,  0,231, 65,144,
+    225,227,245,244,101,128, 30,  9,233,242, 99,  2, 65,160, 65,165,
+    236,101,128, 36,210,245,237,230,236,229,120,128,  1,  9,245,242,
+    108,128,  2, 85,100,  2, 65,186, 65,202,239,116,129,  1, 11, 65,
+    193,225,227,227,229,238,116,128,  1, 11,243,241,245,225,242,101,
+    128, 51,197,101,  2, 65,217, 65,233,228,233,236,236, 97,129,  0,
+    184, 65,227,227,237, 98,128,  3, 39,238,116,132,  0,162, 65,246,
+     66, 14, 66, 26, 66, 37,105,  2, 65,252, 66,  4,231,242,225,228,
+    101,128, 33,  3,238,230,229,242,233,239,114,128,246,223,237,239,
+    238,239,243,240,225,227,101,128,255,224,239,236,228,243,244,249,
+    236,101,128,247,162,243,245,240,229,242,233,239,114,128,246,224,
+    104,  5, 66, 60, 66,123, 66,134, 67, 62, 67,154, 97,  4, 66, 70,
+     66, 81, 66, 91, 66, 98,225,242,237,229,238,233,225,110,128,  5,
+    121,226,229,238,231,225,236,105,128,  9,155,228,229,246, 97,128,
+      9, 27,231,117,  2, 66,105, 66,114,234,225,242,225,244,105,128,
+     10,155,242,237,245,235,232,105,128, 10, 27,226,239,240,239,237,
+    239,230,111,128, 49, 20,101,  6, 66,148, 66,168, 66,192, 67,  4,
+     67, 16, 67, 37,225,226,235,232,225,243,233,225,238,227,249,242,
+    233,236,236,233, 99,128,  4,189, 99,  2, 66,174, 66,182,235,237,
+    225,242,107,128, 39, 19,249,242,233,236,236,233, 99,128,  4, 71,
+    100,  2, 66,198, 66,242,229,243,227,229,238,228,229,114,  2, 66,
+    211, 66,231,225,226,235,232,225,243,233,225,238,227,249,242,233,
+    236,236,233, 99,128,  4,191,227,249,242,233,236,236,233, 99,128,
+      4,183,233,229,242,229,243,233,243,227,249,242,233,236,236,233,
+     99,128,  4,245,232,225,242,237,229,238,233,225,110,128,  5,115,
+    235,232,225,235,225,243,243,233,225,238,227,249,242,233,236,236,
+    233, 99,128,  4,204,246,229,242,244,233,227,225,236,243,244,242,
+    239,235,229,227,249,242,233,236,236,233, 99,128,  4,185,105,129,
+      3,199, 67, 68,229,245,227,104,  4, 67, 81, 67,116, 67,131, 67,
+    140, 97,  2, 67, 87, 67,102,227,233,242,227,236,229,235,239,242,
+    229,225,110,128, 50,119,240,225,242,229,238,235,239,242,229,225,
+    110,128, 50, 23,227,233,242,227,236,229,235,239,242,229,225,110,
+    128, 50,105,235,239,242,229,225,110,128, 49, 74,240,225,242,229,
+    238,235,239,242,229,225,110,128, 50,  9,111,  2, 67,160, 67,210,
+    227,104,  3, 67,169, 67,191, 67,201,225,110,  2, 67,176, 67,184,
+    231,244,232,225,105,128, 14, 10,244,232,225,105,128, 14,  8,233,
+    238,231,244,232,225,105,128, 14,  9,239,229,244,232,225,105,128,
+     14, 12,239,107,128,  1,136,105,  2, 67,221, 68, 67,229,245, 99,
+      5, 67,235, 68, 14, 68, 29, 68, 38, 68, 52, 97,  2, 67,241, 68,
+      0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,118,
+    240,225,242,229,238,235,239,242,229,225,110,128, 50, 22,227,233,
+    242,227,236,229,235,239,242,229,225,110,128, 50,104,235,239,242,
+    229,225,110,128, 49, 72,240,225,242,229,238,235,239,242,229,225,
+    110,128, 50,  8,245,240,225,242,229,238,235,239,242,229,225,110,
+    128, 50, 28,242, 99,  2, 68, 74, 68,169,236,101,132, 37,203, 68,
+     87, 68, 98, 68,103, 68,127,237,245,236,244,233,240,236,121,128,
+     34,151,239,116,128, 34,153,112,  2, 68,109, 68,115,236,245,115,
+    128, 34,149,239,243,244,225,236,237,225,242,107,128, 48, 54,247,
+    233,244,104,  2, 68,136, 68,152,236,229,230,244,232,225,236,230,
+    226,236,225,227,107,128, 37,208,242,233,231,232,244,232,225,236,
+    230,226,236,225,227,107,128, 37,209,245,237,230,236,229,120,130,
+      2,198, 68,182, 68,193,226,229,236,239,247,227,237, 98,128,  3,
+     45,227,237, 98,128,  3,  2,108,  3, 68,207, 68,213, 69, 11,229,
+    225,114,128, 35, 39,233,227,107,  4, 68,225, 68,236, 68,245, 68,
+    255,225,236,246,229,239,236,225,114,128,  1,194,228,229,238,244,
+    225,108,128,  1,192,236,225,244,229,242,225,108,128,  1,193,242,
+    229,244,242,239,230,236,229,120,128,  1,195,245, 98,129, 38, 99,
+     69, 18,243,245,233,116,  2, 69, 27, 69, 35,226,236,225,227,107,
+    128, 38, 99,247,232,233,244,101,128, 38,103,109,  3, 69, 51, 69,
+     65, 69, 76,227,245,226,229,228,243,241,245,225,242,101,128, 51,
+    164,239,238,239,243,240,225,227,101,128,255, 67,243,241,245,225,
+    242,229,228,243,241,245,225,242,101,128, 51,160,111,  8, 69,110,
+     69,121, 69,208, 70,150, 71,179, 71,210, 72, 61, 72, 70,225,242,
+    237,229,238,233,225,110,128,  5,129,236,239,110,131,  0, 58, 69,
+    133, 69,158, 69,177,237,239,110,  2, 69,141, 69,149,229,244,225,
+    242,121,128, 32,161,239,243,240,225,227,101,128,255, 26,115,  2,
+     69,164, 69,170,233,231,110,128, 32,161,237,225,236,108,128,254,
+     85,244,242,233,225,238,231,245,236,225,114,  2, 69,192, 69,202,
+    232,225,236,230,237,239,100,128,  2,209,237,239,100,128,  2,208,
+    109,  2, 69,214, 70,143,237, 97,134,  0, 44, 69,231, 70, 39, 70,
+     50, 70, 62, 70, 92, 70,115, 97,  3, 69,239, 70,  9, 70, 17,226,
+    239,246,101,  2, 69,248, 69,254,227,237, 98,128,  3, 19,242,233,
+    231,232,244,227,237, 98,128,  3, 21,227,227,229,238,116,128,246,
+    195,114,  2, 70, 23, 70, 30,225,226,233, 99,128,  6, 12,237,229,
+    238,233,225,110,128,  5, 93,233,238,230,229,242,233,239,114,128,
+    246,225,237,239,238,239,243,240,225,227,101,128,255, 12,242,229,
+    246,229,242,243,229,100,  2, 70, 75, 70, 86,225,226,239,246,229,
+    227,237, 98,128,  3, 20,237,239,100,128,  2,189,115,  2, 70, 98,
+     70,105,237,225,236,108,128,254, 80,245,240,229,242,233,239,114,
+    128,246,226,244,245,242,238,229,100,  2, 70,126, 70,137,225,226,
+    239,246,229,227,237, 98,128,  3, 18,237,239,100,128,  2,187,240,
+    225,243,115,128, 38, 60,110,  2, 70,156, 70,165,231,242,245,229,
+    238,116,128, 34, 69,116,  2, 70,171, 70,185,239,245,242,233,238,
+    244,229,231,242,225,108,128, 34, 46,242,239,108,142, 35,  3, 70,
+    219, 70,225, 70,240, 70,255, 71, 43, 71, 88, 71,102, 71,107, 71,
+    112, 71,117, 71,123, 71,128, 71,169, 71,174,193,195, 75,128,  0,
+      6, 66,  2, 70,231, 70,236,197, 76,128,  0,  7, 83,128,  0,  8,
+     67,  2, 70,246, 70,251,193, 78,128,  0, 24, 82,128,  0, 13, 68,
+      3, 71,  7, 71, 33, 71, 38, 67,  4, 71, 17, 71, 21, 71, 25, 71,
+     29, 49,128,  0, 17, 50,128,  0, 18, 51,128,  0, 19, 52,128,  0,
+     20,197, 76,128,  0,127,204, 69,128,  0, 16, 69,  5, 71, 55, 71,
+     59, 71, 64, 71, 69, 71, 74, 77,128,  0, 25,206, 81,128,  0,  5,
+    207, 84,128,  0,  4,211, 67,128,  0, 27, 84,  2, 71, 80, 71, 84,
+     66,128,  0, 23, 88,128,  0,  3, 70,  2, 71, 94, 71, 98, 70,128,
+      0, 12, 83,128,  0, 28,199, 83,128,  0, 29,200, 84,128,  0,  9,
+    204, 70,128,  0, 10,206,193, 75,128,  0, 21,210, 83,128,  0, 30,
+     83,  5, 71,140, 71,144, 71,154, 71,159, 71,164, 73,128,  0, 15,
+     79,129,  0, 14, 71,150, 84,128,  0,  2,212, 88,128,  0,  1,213,
+     66,128,  0, 26,217, 78,128,  0, 22,213, 83,128,  0, 31,214, 84,
+    128,  0, 11,240,249,242,233,231,232,116,129,  0,169, 71,191,115,
+      2, 71,197, 71,203,225,238,115,128,248,233,229,242,233,102,128,
+    246,217,114,  2, 71,216, 72, 44,238,229,242,226,242,225,227,235,
+    229,116,  2, 71,231, 72,  9,236,229,230,116,130, 48, 12, 71,242,
+     71,254,232,225,236,230,247,233,228,244,104,128,255, 98,246,229,
+    242,244,233,227,225,108,128,254, 65,242,233,231,232,116,130, 48,
+     13, 72, 21, 72, 33,232,225,236,230,247,233,228,244,104,128,255,
+     99,246,229,242,244,233,227,225,108,128,254, 66,240,239,242,225,
+    244,233,239,238,243,241,245,225,242,101,128, 51,127,243,241,245,
+    225,242,101,128, 51,199,246,229,242,235,231,243,241,245,225,242,
+    101,128, 51,198,240,225,242,229,110,128, 36,158,242,245,250,229,
+    233,242,111,128, 32,162,243,244,242,229,244,227,232,229,100,128,
+      2,151,245,114,  2, 72,121, 72,139,236,121,  2, 72,128, 72,134,
+    225,238,100,128, 34,207,239,114,128, 34,206,242,229,238,227,121,
+    128,  0,164,249,114,  4, 72,158, 72,166, 72,173, 72,181,194,242,
+    229,246,101,128,246,209,198,236,229,120,128,246,210,226,242,229,
+    246,101,128,246,212,230,236,229,120,128,246,213,100,146,  0,100,
+     72,228, 74,110, 75,134, 75,194, 76,114, 77, 68, 77,130, 78, 59,
+     78, 72, 78, 81, 78,107, 78,132, 78,141, 79,208, 79,216, 79,227,
+     79,247, 80, 19, 97, 11, 72,252, 73,  7, 73, 17, 73, 89, 73,152,
+     73,163, 73,174, 73,243, 74, 49, 74, 55, 74, 85,225,242,237,229,
+    238,233,225,110,128,  5,100,226,229,238,231,225,236,105,128,  9,
+    166,100,  5, 73, 29, 73, 38, 73, 44, 73, 58, 73, 74,225,242,225,
+    226,233, 99,128,  6, 54,229,246, 97,128,  9, 38,230,233,238,225,
+    236,225,242,225,226,233, 99,128,254,190,233,238,233,244,233,225,
+    236,225,242,225,226,233, 99,128,254,191,237,229,228,233,225,236,
+    225,242,225,226,233, 99,128,254,192,103,  3, 73, 97, 73,114, 73,
+    128,229,243,104,129,  5,188, 73,105,232,229,226,242,229,119,128,
+      5,188,231,229,114,129, 32, 32, 73,122,228,226,108,128, 32, 33,
+    117,  2, 73,134, 73,143,234,225,242,225,244,105,128, 10,166,242,
+    237,245,235,232,105,128, 10, 38,232,233,242,225,231,225,238, 97,
+    128, 48, 96,235,225,244,225,235,225,238, 97,128, 48,192,108,  3,
+     73,182, 73,191, 73,229,225,242,225,226,233, 99,128,  6, 47,229,
+    116,130,  5,211, 73,200, 73,220,228,225,231,229,243,104,129,251,
+     51, 73,211,232,229,226,242,229,119,128,251, 51,232,229,226,242,
+    229,119,128,  5,211,230,233,238,225,236,225,242,225,226,233, 99,
+    128,254,170,237,237, 97,  3, 73,253, 74,  6, 74, 18,225,242,225,
+    226,233, 99,128,  6, 79,236,239,247,225,242,225,226,233, 99,128,
+      6, 79,244,225,238, 97,  2, 74, 27, 74, 41,236,244,239,238,229,
+    225,242,225,226,233, 99,128,  6, 76,242,225,226,233, 99,128,  6,
+     76,238,228, 97,128,  9,100,242,231, 97,  2, 74, 63, 74, 72,232,
+    229,226,242,229,119,128,  5,167,236,229,230,244,232,229,226,242,
+    229,119,128,  5,167,243,233,225,240,238,229,245,237,225,244,225,
+    227,249,242,233,236,236,233,227,227,237, 98,128,  4,133, 98,  3,
+     74,118, 75,115, 75,125,108,  9, 74,138, 74,146, 75,  3, 75, 11,
+     75, 27, 75, 38, 75, 56, 75, 70, 75, 81,199,242,225,246,101,128,
+    246,211, 97,  2, 74,152, 74,209,238,231,236,229,226,242,225,227,
+    235,229,116,  2, 74,168, 74,188,236,229,230,116,129, 48, 10, 74,
+    177,246,229,242,244,233,227,225,108,128,254, 61,242,233,231,232,
+    116,129, 48, 11, 74,198,246,229,242,244,233,227,225,108,128,254,
+     62,114,  2, 74,215, 74,236,227,232,233,238,246,229,242,244,229,
+    228,226,229,236,239,247,227,237, 98,128,  3, 43,242,239,119,  2,
+     74,244, 74,251,236,229,230,116,128, 33,212,242,233,231,232,116,
+    128, 33,210,228,225,238,228, 97,128,  9,101,231,242,225,246,101,
+    129,246,214, 75, 21,227,237, 98,128,  3, 15,233,238,244,229,231,
+    242,225,108,128, 34, 44,236,239,247,236,233,238,101,129, 32, 23,
+     75, 50,227,237, 98,128,  3, 51,239,246,229,242,236,233,238,229,
+    227,237, 98,128,  3, 63,240,242,233,237,229,237,239,100,128,  2,
+    186,246,229,242,244,233,227,225,108,  2, 75, 94, 75,100,226,225,
+    114,128, 32, 22,236,233,238,229,225,226,239,246,229,227,237, 98,
+    128,  3, 14,239,240,239,237,239,230,111,128, 49,  9,243,241,245,
+    225,242,101,128, 51,200, 99,  4, 75,144, 75,151, 75,160, 75,187,
+    225,242,239,110,128,  1, 15,229,228,233,236,236, 97,128, 30, 17,
+    233,242, 99,  2, 75,168, 75,173,236,101,128, 36,211,245,237,230,
+    236,229,248,226,229,236,239,119,128, 30, 19,242,239,225,116,128,
+      1, 17,100,  4, 75,204, 76, 29, 76, 39, 76, 90, 97,  4, 75,214,
+     75,224, 75,231, 76,  0,226,229,238,231,225,236,105,128,  9,161,
+    228,229,246, 97,128,  9, 33,231,117,  2, 75,238, 75,247,234,225,
+    242,225,244,105,128, 10,161,242,237,245,235,232,105,128, 10, 33,
+    108,  2, 76,  6, 76, 15,225,242,225,226,233, 99,128,  6,136,230,
+    233,238,225,236,225,242,225,226,233, 99,128,251,137,228,232,225,
+    228,229,246, 97,128,  9, 92,232, 97,  3, 76, 48, 76, 58, 76, 65,
+    226,229,238,231,225,236,105,128,  9,162,228,229,246, 97,128,  9,
+     34,231,117,  2, 76, 72, 76, 81,234,225,242,225,244,105,128, 10,
+    162,242,237,245,235,232,105,128, 10, 34,239,116,  2, 76, 97, 76,
+    106,225,227,227,229,238,116,128, 30, 11,226,229,236,239,119,128,
+     30, 13,101,  8, 76,132, 76,185, 76,192, 76,217, 76,227, 76,238,
+     77, 27, 77, 63, 99,  2, 76,138, 76,175,233,237,225,236,243,229,
+    240,225,242,225,244,239,114,  2, 76,156, 76,165,225,242,225,226,
+    233, 99,128,  6,107,240,229,242,243,233,225,110,128,  6,107,249,
+    242,233,236,236,233, 99,128,  4, 52,231,242,229,101,128,  0,176,
+    232,105,  2, 76,199, 76,208,232,229,226,242,229,119,128,  5,173,
+    242,225,231,225,238, 97,128, 48,103,233,227,239,240,244,233, 99,
+    128,  3,239,235,225,244,225,235,225,238, 97,128, 48,199,108,  2,
+     76,244, 77, 11,229,244,101,  2, 76,252, 77,  3,236,229,230,116,
+    128, 35, 43,242,233,231,232,116,128, 35, 38,244, 97,129,  3,180,
+     77, 18,244,245,242,238,229,100,128,  1,141,238,239,237,233,238,
+    225,244,239,242,237,233,238,245,243,239,238,229,238,245,237,229,
+    242,225,244,239,242,226,229,238,231,225,236,105,128,  9,248,250,
+    104,128,  2,164,104,  2, 77, 74, 77,124, 97,  3, 77, 82, 77, 92,
+     77, 99,226,229,238,231,225,236,105,128,  9,167,228,229,246, 97,
+    128,  9, 39,231,117,  2, 77,106, 77,115,234,225,242,225,244,105,
+    128, 10,167,242,237,245,235,232,105,128, 10, 39,239,239,107,128,
+      2, 87,105,  6, 77,144, 77,193, 77,253, 78,  8, 78, 19, 78, 29,
+     97,  2, 77,150, 77,172,236,249,244,233,235,225,244,239,238,239,
+    115,129,  3,133, 77,166,227,237, 98,128,  3, 68,237,239,238,100,
+    129, 38,102, 77,181,243,245,233,244,247,232,233,244,101,128, 38,
+     98,229,242,229,243,233,115,133,  0,168, 77,212, 77,220, 77,231,
+     77,237, 77,245,225,227,245,244,101,128,246,215,226,229,236,239,
+    247,227,237, 98,128,  3, 36,227,237, 98,128,  3,  8,231,242,225,
+    246,101,128,246,216,244,239,238,239,115,128,  3,133,232,233,242,
+    225,231,225,238, 97,128, 48, 98,235,225,244,225,235,225,238, 97,
+    128, 48,194,244,244,239,237,225,242,107,128, 48,  3,246,105,  2,
+     78, 36, 78, 47,228,101,129,  0,247, 78, 43,115,128, 34, 35,243,
+    233,239,238,243,236,225,243,104,128, 34, 21,234,229,227,249,242,
+    233,236,236,233, 99,128,  4, 82,235,243,232,225,228,101,128, 37,
+    147,108,  2, 78, 87, 78, 98,233,238,229,226,229,236,239,119,128,
+     30, 15,243,241,245,225,242,101,128, 51,151,109,  2, 78,113, 78,
+    121,225,227,242,239,110,128,  1, 17,239,238,239,243,240,225,227,
+    101,128,255, 68,238,226,236,239,227,107,128, 37,132,111, 10, 78,
+    163, 78,175, 78,185, 78,196, 78,207, 79, 23, 79, 28, 79, 39, 79,
+    154, 79,180,227,232,225,228,225,244,232,225,105,128, 14, 14,228,
+    229,235,244,232,225,105,128, 14, 20,232,233,242,225,231,225,238,
+     97,128, 48,105,235,225,244,225,235,225,238, 97,128, 48,201,236,
+    236,225,114,132,  0, 36, 78,222, 78,233, 78,245, 79,  0,233,238,
+    230,229,242,233,239,114,128,246,227,237,239,238,239,243,240,225,
+    227,101,128,255,  4,239,236,228,243,244,249,236,101,128,247, 36,
+    115,  2, 79,  6, 79, 13,237,225,236,108,128,254,105,245,240,229,
+    242,233,239,114,128,246,228,238,103,128, 32,171,242,245,243,241,
+    245,225,242,101,128, 51, 38,116,  6, 79, 53, 79, 70, 79, 92, 79,
+    103, 79,135, 79,142,225,227,227,229,238,116,129,  2,217, 79, 64,
+    227,237, 98,128,  3,  7,226,229,236,239,247, 99,  2, 79, 81, 79,
+     86,237, 98,128,  3, 35,239,237, 98,128,  3, 35,235,225,244,225,
+    235,225,238, 97,128, 48,251,236,229,243,115,  2, 79,112, 79,116,
+    105,128,  1, 49,106,129,246,190, 79,122,243,244,242,239,235,229,
+    232,239,239,107,128,  2,132,237,225,244,104,128, 34,197,244,229,
+    228,227,233,242,227,236,101,128, 37,204,245,226,236,229,249,239,
+    228,240,225,244,225,104,129,251, 31, 79,171,232,229,226,242,229,
+    119,128,251, 31,247,238,244,225,227,107,  2, 79,191, 79,202,226,
+    229,236,239,247,227,237, 98,128,  3, 30,237,239,100,128,  2,213,
+    240,225,242,229,110,128, 36,159,243,245,240,229,242,233,239,114,
+    128,246,235,116,  2, 79,233, 79,239,225,233,108,128,  2, 86,239,
+    240,226,225,114,128,  1,140,117,  2, 79,253, 80,  8,232,233,242,
+    225,231,225,238, 97,128, 48,101,235,225,244,225,235,225,238, 97,
+    128, 48,197,122,132,  1,243, 80, 31, 80, 40, 80, 59, 80, 96,225,
+    236,244,239,238,101,128,  2,163, 99,  2, 80, 46, 80, 53,225,242,
+    239,110,128,  1,198,245,242,108,128,  2,165,101,  2, 80, 65, 80,
+     85,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236,
+    233, 99,128,  4,225,227,249,242,233,236,236,233, 99,128,  4, 85,
+    232,229,227,249,242,233,236,236,233, 99,128,  4, 95,101,151,  0,
+    101, 80,159, 80,178, 80,212, 81,186, 81,248, 82, 25, 82, 37, 82,
+     60, 82,113, 83,225, 84, 27, 84,129, 84,245, 85,124, 85,199, 85,
+    230, 86, 36, 86, 89, 87, 24, 87,157, 87,177, 87,221, 88, 56, 97,
+      2, 80,165, 80,172,227,245,244,101,128,  0,233,242,244,104,128,
+     38, 65, 98,  3, 80,186, 80,195, 80,205,229,238,231,225,236,105,
+    128,  9,143,239,240,239,237,239,230,111,128, 49, 28,242,229,246,
+    101,128,  1, 21, 99,  5, 80,224, 81, 41, 81, 55, 81, 87, 81,176,
+     97,  2, 80,230, 81, 35,238,228,242, 97,  3, 80,241, 80,248, 81,
+      3,228,229,246, 97,128,  9, 13,231,245,234,225,242,225,244,105,
+    128, 10,141,246,239,247,229,236,243,233,231,110,  2, 81, 17, 81,
+     24,228,229,246, 97,128,  9, 69,231,245,234,225,242,225,244,105,
+    128, 10,197,242,239,110,128,  1, 27,229,228,233,236,236,225,226,
+    242,229,246,101,128, 30, 29,104,  2, 81, 61, 81, 72,225,242,237,
+    229,238,233,225,110,128,  5,101,249,233,247,238,225,242,237,229,
+    238,233,225,110,128,  5,135,233,242, 99,  2, 81, 95, 81,100,236,
+    101,128, 36,212,245,237,230,236,229,120,134,  0,234, 81,121, 81,
+    129, 81,137, 81,148, 81,156, 81,168,225,227,245,244,101,128, 30,
+    191,226,229,236,239,119,128, 30, 25,228,239,244,226,229,236,239,
+    119,128, 30,199,231,242,225,246,101,128, 30,193,232,239,239,235,
+    225,226,239,246,101,128, 30,195,244,233,236,228,101,128, 30,197,
+    249,242,233,236,236,233, 99,128,  4, 84,100,  4, 81,196, 81,206,
+     81,212, 81,222,226,236,231,242,225,246,101,128,  2,  5,229,246,
+     97,128,  9, 15,233,229,242,229,243,233,115,128,  0,235,239,116,
+    130,  1, 23, 81,231, 81,240,225,227,227,229,238,116,128,  1, 23,
+    226,229,236,239,119,128, 30,185,101,  2, 81,254, 82,  9,231,245,
+    242,237,245,235,232,105,128, 10, 15,237,225,244,242,225,231,245,
+    242,237,245,235,232,105,128, 10, 71,230,227,249,242,233,236,236,
+    233, 99,128,  4, 68,103,  2, 82, 43, 82, 50,242,225,246,101,128,
+      0,232,245,234,225,242,225,244,105,128, 10,143,104,  4, 82, 70,
+     82, 81, 82, 92, 82,102,225,242,237,229,238,233,225,110,128,  5,
+    103,226,239,240,239,237,239,230,111,128, 49, 29,233,242,225,231,
+    225,238, 97,128, 48, 72,239,239,235,225,226,239,246,101,128, 30,
+    187,105,  4, 82,123, 82,134, 83,192, 83,207,226,239,240,239,237,
+    239,230,111,128, 49, 31,231,232,116,142,  0, 56, 82,168, 82,177,
+     82,187, 82,217, 82,224, 83,  6, 83, 31, 83, 76, 83,110, 83,122,
+     83,133, 83,166, 83,174, 83,185,225,242,225,226,233, 99,128,  6,
+    104,226,229,238,231,225,236,105,128,  9,238,227,233,242,227,236,
+    101,129, 36,103, 82,198,233,238,246,229,242,243,229,243,225,238,
+    243,243,229,242,233,102,128, 39,145,228,229,246, 97,128,  9,110,
+    229,229,110,  2, 82,232, 82,241,227,233,242,227,236,101,128, 36,
+    113,112,  2, 82,247, 82,254,225,242,229,110,128, 36,133,229,242,
+    233,239,100,128, 36,153,231,117,  2, 83, 13, 83, 22,234,225,242,
+    225,244,105,128, 10,238,242,237,245,235,232,105,128, 10,110,104,
+      2, 83, 37, 83, 63, 97,  2, 83, 43, 83, 54,227,235,225,242,225,
+    226,233, 99,128,  6,104,238,231,250,232,239,117,128, 48, 40,238,
+    239,244,229,226,229,225,237,229,100,128, 38,107,105,  2, 83, 82,
+     83,100,228,229,239,231,242,225,240,232,233,227,240,225,242,229,
+    110,128, 50, 39,238,230,229,242,233,239,114,128, 32,136,237,239,
+    238,239,243,240,225,227,101,128,255, 24,239,236,228,243,244,249,
+    236,101,128,247, 56,112,  2, 83,139, 83,146,225,242,229,110,128,
+     36,123,229,114,  2, 83,153, 83,159,233,239,100,128, 36,143,243,
+    233,225,110,128,  6,248,242,239,237,225,110,128, 33,119,243,245,
+    240,229,242,233,239,114,128, 32,120,244,232,225,105,128, 14, 88,
+    238,246,229,242,244,229,228,226,242,229,246,101,128,  2,  7,239,
+    244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128,  4,
+    101,107,  2, 83,231, 83,255,225,244,225,235,225,238, 97,129, 48,
+    168, 83,243,232,225,236,230,247,233,228,244,104,128,255,116,111,
+      2, 84,  5, 84, 20,238,235,225,242,231,245,242,237,245,235,232,
+    105,128, 10,116,242,229,225,110,128, 49, 84,108,  3, 84, 35, 84,
+     46, 84,107,227,249,242,233,236,236,233, 99,128,  4, 59,101,  2,
+     84, 52, 84, 59,237,229,238,116,128, 34,  8,246,229,110,  3, 84,
+     69, 84, 78, 84, 99,227,233,242,227,236,101,128, 36,106,112,  2,
+     84, 84, 84, 91,225,242,229,110,128, 36,126,229,242,233,239,100,
+    128, 36,146,242,239,237,225,110,128, 33,122,236,233,240,243,233,
+    115,129, 32, 38, 84,118,246,229,242,244,233,227,225,108,128, 34,
+    238,109,  5, 84,141, 84,169, 84,180, 84,200, 84,211,225,227,242,
+    239,110,130,  1, 19, 84,153, 84,161,225,227,245,244,101,128, 30,
+     23,231,242,225,246,101,128, 30, 21,227,249,242,233,236,236,233,
+     99,128,  4, 60,228,225,243,104,129, 32, 20, 84,189,246,229,242,
+    244,233,227,225,108,128,254, 49,239,238,239,243,240,225,227,101,
+    128,255, 69,112,  2, 84,217, 84,237,232,225,243,233,243,237,225,
+    242,235,225,242,237,229,238,233,225,110,128,  5, 91,244,249,243,
+    229,116,128, 34,  5,110,  6, 85,  3, 85, 14, 85, 25, 85, 69, 85,
+    101, 85,116,226,239,240,239,237,239,230,111,128, 49, 35,227,249,
+    242,233,236,236,233, 99,128,  4, 61,100,  2, 85, 31, 85, 50,225,
+    243,104,129, 32, 19, 85, 39,246,229,242,244,233,227,225,108,128,
+    254, 50,229,243,227,229,238,228,229,242,227,249,242,233,236,236,
+    233, 99,128,  4,163,103,130,  1, 75, 85, 77, 85, 88,226,239,240,
+    239,237,239,230,111,128, 49, 37,232,229,227,249,242,233,236,236,
+    233, 99,128,  4,165,232,239,239,235,227,249,242,233,236,236,233,
+     99,128,  4,200,243,240,225,227,101,128, 32,  2,111,  3, 85,132,
+     85,140, 85,149,231,239,238,229,107,128,  1, 25,235,239,242,229,
+    225,110,128, 49, 83,240,229,110,130,  2, 91, 85,159, 85,168,227,
+    236,239,243,229,100,128,  2,154,242,229,246,229,242,243,229,100,
+    130,  2, 92, 85,183, 85,192,227,236,239,243,229,100,128,  2, 94,
+    232,239,239,107,128,  2, 93,112,  2, 85,205, 85,212,225,242,229,
+    110,128, 36,160,243,233,236,239,110,129,  3,181, 85,222,244,239,
+    238,239,115,128,  3,173,241,117,  2, 85,237, 86, 25,225,108,130,
+      0, 61, 85,246, 86,  2,237,239,238,239,243,240,225,227,101,128,
+    255, 29,115,  2, 86,  8, 86, 15,237,225,236,108,128,254,102,245,
+    240,229,242,233,239,114,128, 32,124,233,246,225,236,229,238,227,
+    101,128, 34, 97,114,  3, 86, 44, 86, 55, 86, 66,226,239,240,239,
+    237,239,230,111,128, 49, 38,227,249,242,233,236,236,233, 99,128,
+      4, 64,229,246,229,242,243,229,100,129,  2, 88, 86, 78,227,249,
+    242,233,236,236,233, 99,128,  4, 77,115,  6, 86,103, 86,114, 86,
+    134, 86,215, 87,  4, 87, 14,227,249,242,233,236,236,233, 99,128,
+      4, 65,228,229,243,227,229,238,228,229,242,227,249,242,233,236,
+    236,233, 99,128,  4,171,104,132,  2,131, 86,146, 86,153, 86,184,
+     86,199,227,245,242,108,128,  2,134,239,242,116,  2, 86,161, 86,
+    168,228,229,246, 97,128,  9, 14,246,239,247,229,236,243,233,231,
+    238,228,229,246, 97,128,  9, 70,242,229,246,229,242,243,229,228,
+    236,239,239,112,128,  1,170,243,241,245,225,244,242,229,246,229,
+    242,243,229,100,128,  2,133,237,225,236,108,  2, 86,224, 86,235,
+    232,233,242,225,231,225,238, 97,128, 48, 71,235,225,244,225,235,
+    225,238, 97,129, 48,167, 86,248,232,225,236,230,247,233,228,244,
+    104,128,255,106,244,233,237,225,244,229,100,128, 33, 46,245,240,
+    229,242,233,239,114,128,246,236,116,  5, 87, 36, 87, 62, 87, 66,
+     87, 83, 87,149, 97,130,  3,183, 87, 44, 87, 54,242,237,229,238,
+    233,225,110,128,  5,104,244,239,238,239,115,128,  3,174,104,128,
+      0,240,233,236,228,101,129, 30,189, 87, 75,226,229,236,239,119,
+    128, 30, 27,238,225,232,244, 97,  3, 87, 95, 87,127, 87,136,230,
+    239,245,235,104,  2, 87,105, 87,114,232,229,226,242,229,119,128,
+      5,145,236,229,230,244,232,229,226,242,229,119,128,  5,145,232,
+    229,226,242,229,119,128,  5,145,236,229,230,244,232,229,226,242,
+    229,119,128,  5,145,245,242,238,229,100,128,  1,221,117,  2, 87,
+    163, 87,172,235,239,242,229,225,110,128, 49, 97,242,111,128, 32,
+    172,246,239,247,229,236,243,233,231,110,  3, 87,193, 87,203, 87,
+    210,226,229,238,231,225,236,105,128,  9,199,228,229,246, 97,128,
+      9, 71,231,245,234,225,242,225,244,105,128, 10,199,120,  2, 87,
+    227, 88, 44,227,236,225,109,132,  0, 33, 87,242, 87,253, 88, 24,
+     88, 36,225,242,237,229,238,233,225,110,128,  5, 92,100,  2, 88,
+      3, 88,  8,226,108,128, 32, 60,239,247,110,129,  0,161, 88, 16,
+    243,237,225,236,108,128,247,161,237,239,238,239,243,240,225,227,
+    101,128,255,  1,243,237,225,236,108,128,247, 33,233,243,244,229,
+    238,244,233,225,108,128, 34,  3,250,104,131,  2,146, 88, 67, 88,
+     86, 88, 97, 99,  2, 88, 73, 88, 80,225,242,239,110,128,  1,239,
+    245,242,108,128,  2,147,242,229,246,229,242,243,229,100,128,  1,
+    185,244,225,233,108,128,  1,186,102,140,  0,102, 88,132, 88,214,
+     88,225, 88,234, 88,246, 89, 93, 89,109, 91,117, 91,130, 91,156,
+     93, 33, 93, 41, 97,  4, 88,142, 88,149, 88,160, 88,171,228,229,
+    246, 97,128,  9, 94,231,245,242,237,245,235,232,105,128, 10, 94,
+    232,242,229,238,232,229,233,116,128, 33,  9,244,232, 97,  3, 88,
+    181, 88,190, 88,202,225,242,225,226,233, 99,128,  6, 78,236,239,
+    247,225,242,225,226,233, 99,128,  6, 78,244,225,238,225,242,225,
+    226,233, 99,128,  6, 75,226,239,240,239,237,239,230,111,128, 49,
+      8,227,233,242,227,236,101,128, 36,213,228,239,244,225,227,227,
+    229,238,116,128, 30, 31,101,  3, 88,254, 89, 76, 89, 86,104,  4,
+     89,  8, 89, 31, 89, 45, 89, 61,225,114,  2, 89, 15, 89, 22,225,
+    226,233, 99,128,  6, 65,237,229,238,233,225,110,128,  5,134,230,
+    233,238,225,236,225,242,225,226,233, 99,128,254,210,233,238,233,
+    244,233,225,236,225,242,225,226,233, 99,128,254,211,237,229,228,
+    233,225,236,225,242,225,226,233, 99,128,254,212,233,227,239,240,
+    244,233, 99,128,  3,229,237,225,236,101,128, 38, 64,102,130,251,
+      0, 89,101, 89,105,105,128,251,  3,108,128,251,  4,105,136,251,
+      1, 89,129, 89,169, 89,180, 89,202, 90, 68, 90, 85, 90, 93, 90,
+    106,230,244,229,229,110,  2, 89,139, 89,148,227,233,242,227,236,
+    101,128, 36,110,112,  2, 89,154, 89,161,225,242,229,110,128, 36,
+    130,229,242,233,239,100,128, 36,150,231,245,242,229,228,225,243,
+    104,128, 32, 18,236,236,229,100,  2, 89,189, 89,195,226,239,120,
+    128, 37,160,242,229,227,116,128, 37,172,238,225,108,  5, 89,216,
+     89,255, 90, 16, 90, 33, 90, 49,235,225,102,130,  5,218, 89,226,
+     89,246,228,225,231,229,243,104,129,251, 58, 89,237,232,229,226,
+    242,229,119,128,251, 58,232,229,226,242,229,119,128,  5,218,237,
+    229,109,129,  5,221, 90,  7,232,229,226,242,229,119,128,  5,221,
+    238,245,110,129,  5,223, 90, 24,232,229,226,242,229,119,128,  5,
+    223,240,101,129,  5,227, 90, 40,232,229,226,242,229,119,128,  5,
+    227,244,243,225,228,105,129,  5,229, 90, 59,232,229,226,242,229,
+    119,128,  5,229,242,243,244,244,239,238,229,227,232,233,238,229,
+    243,101,128,  2,201,243,232,229,249,101,128, 37,201,244,225,227,
+    249,242,233,236,236,233, 99,128,  4,115,246,101,142,  0, 53, 90,
+    139, 90,148, 90,158, 90,188, 90,195, 90,205, 90,230, 91,  1, 91,
+     35, 91, 47, 91, 58, 91, 91, 91, 99, 91,110,225,242,225,226,233,
+     99,128,  6,101,226,229,238,231,225,236,105,128,  9,235,227,233,
+    242,227,236,101,129, 36,100, 90,169,233,238,246,229,242,243,229,
+    243,225,238,243,243,229,242,233,102,128, 39,142,228,229,246, 97,
+    128,  9,107,229,233,231,232,244,232,115,128, 33, 93,231,117,  2,
+     90,212, 90,221,234,225,242,225,244,105,128, 10,235,242,237,245,
+    235,232,105,128, 10,107,232, 97,  2, 90,237, 90,248,227,235,225,
+    242,225,226,233, 99,128,  6,101,238,231,250,232,239,117,128, 48,
+     37,105,  2, 91,  7, 91, 25,228,229,239,231,242,225,240,232,233,
+    227,240,225,242,229,110,128, 50, 36,238,230,229,242,233,239,114,
+    128, 32,133,237,239,238,239,243,240,225,227,101,128,255, 21,239,
+    236,228,243,244,249,236,101,128,247, 53,112,  2, 91, 64, 91, 71,
+    225,242,229,110,128, 36,120,229,114,  2, 91, 78, 91, 84,233,239,
+    100,128, 36,140,243,233,225,110,128,  6,245,242,239,237,225,110,
+    128, 33,116,243,245,240,229,242,233,239,114,128, 32,117,244,232,
+    225,105,128, 14, 85,108,129,251,  2, 91,123,239,242,233,110,128,
+      1,146,109,  2, 91,136, 91,147,239,238,239,243,240,225,227,101,
+    128,255, 70,243,241,245,225,242,101,128, 51,153,111,  4, 91,166,
+     91,188, 91,200, 91,207,230, 97,  2, 91,173, 91,181,238,244,232,
+    225,105,128, 14, 31,244,232,225,105,128, 14, 29,238,231,237,225,
+    238,244,232,225,105,128, 14, 79,242,225,236,108,128, 34,  0,245,
+    114,142,  0, 52, 91,240, 91,249, 92,  3, 92, 33, 92, 40, 92, 65,
+     92, 92, 92,126, 92,138, 92,157, 92,168, 92,201, 92,209, 92,220,
+    225,242,225,226,233, 99,128,  6,100,226,229,238,231,225,236,105,
+    128,  9,234,227,233,242,227,236,101,129, 36, 99, 92, 14,233,238,
+    246,229,242,243,229,243,225,238,243,243,229,242,233,102,128, 39,
+    141,228,229,246, 97,128,  9,106,231,117,  2, 92, 47, 92, 56,234,
+    225,242,225,244,105,128, 10,234,242,237,245,235,232,105,128, 10,
+    106,232, 97,  2, 92, 72, 92, 83,227,235,225,242,225,226,233, 99,
+    128,  6,100,238,231,250,232,239,117,128, 48, 36,105,  2, 92, 98,
+     92,116,228,229,239,231,242,225,240,232,233,227,240,225,242,229,
+    110,128, 50, 35,238,230,229,242,233,239,114,128, 32,132,237,239,
+    238,239,243,240,225,227,101,128,255, 20,238,245,237,229,242,225,
+    244,239,242,226,229,238,231,225,236,105,128,  9,247,239,236,228,
+    243,244,249,236,101,128,247, 52,112,  2, 92,174, 92,181,225,242,
+    229,110,128, 36,119,229,114,  2, 92,188, 92,194,233,239,100,128,
+     36,139,243,233,225,110,128,  6,244,242,239,237,225,110,128, 33,
+    115,243,245,240,229,242,233,239,114,128, 32,116,116,  2, 92,226,
+     93,  8,229,229,110,  2, 92,234, 92,243,227,233,242,227,236,101,
+    128, 36,109,112,  2, 92,249, 93,  0,225,242,229,110,128, 36,129,
+    229,242,233,239,100,128, 36,149,104,  2, 93, 14, 93, 19,225,105,
+    128, 14, 84,244,239,238,229,227,232,233,238,229,243,101,128,  2,
+    203,240,225,242,229,110,128, 36,161,242, 97,  2, 93, 48, 93, 56,
+    227,244,233,239,110,128, 32, 68,238, 99,128, 32,163,103,144,  0,
+    103, 93, 97, 94, 43, 94, 66, 94,127, 94,144, 95, 65, 96, 58, 96,
+    143, 96,156, 97, 14, 97, 39, 97, 67, 97, 89, 98, 34, 98, 56, 98,
+    158, 97,  9, 93,117, 93,127, 93,134, 93,141, 93,205, 93,230, 93,
+    241, 93,252, 94, 30,226,229,238,231,225,236,105,128,  9,151,227,
+    245,244,101,128,  1,245,228,229,246, 97,128,  9, 23,102,  4, 93,
+    151, 93,160, 93,174, 93,190,225,242,225,226,233, 99,128,  6,175,
+    230,233,238,225,236,225,242,225,226,233, 99,128,251,147,233,238,
+    233,244,233,225,236,225,242,225,226,233, 99,128,251,148,237,229,
+    228,233,225,236,225,242,225,226,233, 99,128,251,149,231,117,  2,
+     93,212, 93,221,234,225,242,225,244,105,128, 10,151,242,237,245,
+    235,232,105,128, 10, 23,232,233,242,225,231,225,238, 97,128, 48,
+     76,235,225,244,225,235,225,238, 97,128, 48,172,237,237, 97,130,
+      3,179, 94,  6, 94, 19,236,225,244,233,238,243,237,225,236,108,
+    128,  2, 99,243,245,240,229,242,233,239,114,128,  2,224,238,231,
+    233,225,227,239,240,244,233, 99,128,  3,235, 98,  2, 94, 49, 94,
+     59,239,240,239,237,239,230,111,128, 49, 13,242,229,246,101,128,
+      1, 31, 99,  4, 94, 76, 94, 83, 94, 92, 94,114,225,242,239,110,
+    128,  1,231,229,228,233,236,236, 97,128,  1, 35,233,242, 99,  2,
+     94,100, 94,105,236,101,128, 36,214,245,237,230,236,229,120,128,
+      1, 29,239,237,237,225,225,227,227,229,238,116,128,  1, 35,228,
+    239,116,129,  1, 33, 94,135,225,227,227,229,238,116,128,  1, 33,
+    101,  6, 94,158, 94,169, 94,180, 94,191, 94,210, 95, 56,227,249,
+    242,233,236,236,233, 99,128,  4, 51,232,233,242,225,231,225,238,
+     97,128, 48, 82,235,225,244,225,235,225,238, 97,128, 48,178,239,
+    237,229,244,242,233,227,225,236,236,249,229,241,245,225,108,128,
+     34, 81,114,  3, 94,218, 95, 11, 95, 21,229,243,104,  3, 94,228,
+     94,243, 94,252,225,227,227,229,238,244,232,229,226,242,229,119,
+    128,  5,156,232,229,226,242,229,119,128,  5,243,237,245,241,228,
+    225,237,232,229,226,242,229,119,128,  5,157,237,225,238,228,226,
+    236,115,128,  0,223,243,232,225,249,233,109,  2, 95, 32, 95, 47,
+    225,227,227,229,238,244,232,229,226,242,229,119,128,  5,158,232,
+    229,226,242,229,119,128,  5,244,244,225,237,225,242,107,128, 48,
+     19,104,  5, 95, 77, 95,210, 96, 17, 96, 42, 96, 48, 97,  4, 95,
+     87, 95, 97, 95,120, 95,145,226,229,238,231,225,236,105,128,  9,
+    152,100,  2, 95,103, 95,114,225,242,237,229,238,233,225,110,128,
+      5,114,229,246, 97,128,  9, 24,231,117,  2, 95,127, 95,136,234,
+    225,242,225,244,105,128, 10,152,242,237,245,235,232,105,128, 10,
+     24,233,110,  4, 95,156, 95,165, 95,179, 95,195,225,242,225,226,
+    233, 99,128,  6, 58,230,233,238,225,236,225,242,225,226,233, 99,
+    128,254,206,233,238,233,244,233,225,236,225,242,225,226,233, 99,
+    128,254,207,237,229,228,233,225,236,225,242,225,226,233, 99,128,
+    254,208,101,  3, 95,218, 95,239, 96,  0,237,233,228,228,236,229,
+    232,239,239,235,227,249,242,233,236,236,233, 99,128,  4,149,243,
+    244,242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,147,
+    245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128,  4,
+    145,232, 97,  2, 96, 24, 96, 31,228,229,246, 97,128,  9, 90,231,
+    245,242,237,245,235,232,105,128, 10, 90,239,239,107,128,  2, 96,
+    250,243,241,245,225,242,101,128, 51,147,105,  3, 96, 66, 96, 77,
+     96, 88,232,233,242,225,231,225,238, 97,128, 48, 78,235,225,244,
+    225,235,225,238, 97,128, 48,174,109,  2, 96, 94, 96,105,225,242,
+    237,229,238,233,225,110,128,  5, 99,229,108,130,  5,210, 96,114,
+     96,134,228,225,231,229,243,104,129,251, 50, 96,125,232,229,226,
+    242,229,119,128,251, 50,232,229,226,242,229,119,128,  5,210,234,
+    229,227,249,242,233,236,236,233, 99,128,  4, 83,236,239,244,244,
+    225,108,  2, 96,167, 96,184,233,238,246,229,242,244,229,228,243,
+    244,242,239,235,101,128,  1,190,243,244,239,112,132,  2,148, 96,
+    199, 96,210, 96,216, 96,248,233,238,246,229,242,244,229,100,128,
+      2,150,237,239,100,128,  2,192,242,229,246,229,242,243,229,100,
+    130,  2,149, 96,231, 96,237,237,239,100,128,  2,193,243,245,240,
+    229,242,233,239,114,128,  2,228,243,244,242,239,235,101,129,  2,
+    161, 97,  3,242,229,246,229,242,243,229,100,128,  2,162,109,  2,
+     97, 20, 97, 28,225,227,242,239,110,128, 30, 33,239,238,239,243,
+    240,225,227,101,128,255, 71,111,  2, 97, 45, 97, 56,232,233,242,
+    225,231,225,238, 97,128, 48, 84,235,225,244,225,235,225,238, 97,
+    128, 48,180,240, 97,  2, 97, 74, 97, 80,242,229,110,128, 36,162,
+    243,241,245,225,242,101,128, 51,172,114,  2, 97, 95, 97,192, 97,
+      2, 97,101, 97,109,228,233,229,238,116,128, 34,  7,246,101,134,
+      0, 96, 97,126, 97,137, 97,154, 97,161, 97,170, 97,182,226,229,
+    236,239,247,227,237, 98,128,  3, 22, 99,  2, 97,143, 97,148,237,
+     98,128,  3,  0,239,237, 98,128,  3,  0,228,229,246, 97,128,  9,
+     83,236,239,247,237,239,100,128,  2,206,237,239,238,239,243,240,
+    225,227,101,128,255, 64,244,239,238,229,227,237, 98,128,  3, 64,
+    229,225,244,229,114,132,  0, 62, 97,208, 97,227, 97,239, 98, 26,
+    229,241,245,225,108,129, 34,101, 97,218,239,242,236,229,243,115,
+    128, 34,219,237,239,238,239,243,240,225,227,101,128,255, 30,111,
+      2, 97,245, 98, 15,114,  2, 97,251, 98,  8,229,241,245,233,246,
+    225,236,229,238,116,128, 34,115,236,229,243,115,128, 34,119,246,
+    229,242,229,241,245,225,108,128, 34,103,243,237,225,236,108,128,
+    254,101,115,  2, 98, 40, 98, 48,227,242,233,240,116,128,  2, 97,
+    244,242,239,235,101,128,  1,229,117,  4, 98, 66, 98, 77, 98,134,
+     98,145,232,233,242,225,231,225,238, 97,128, 48, 80,233,108,  2,
+     98, 84, 98,109,236,229,237,239,116,  2, 98, 94, 98,101,236,229,
+    230,116,128,  0,171,242,233,231,232,116,128,  0,187,243,233,238,
+    231,108,  2, 98,119, 98,126,236,229,230,116,128, 32, 57,242,233,
+    231,232,116,128, 32, 58,235,225,244,225,235,225,238, 97,128, 48,
+    176,242,225,237,245,243,241,245,225,242,101,128, 51, 24,249,243,
+    241,245,225,242,101,128, 51,201,104,144,  0,104, 98,204,101, 90,
+    101,125,101,162,101,202,103, 90,103,110,104, 75,104, 87,104, 99,
+    105,167,105,175,105,186,105,195,106, 19,106, 23, 97, 13, 98,232,
+     99, 15, 99, 25, 99, 55, 99, 80, 99,158, 99,170, 99,195, 99,210,
+     99,239, 99,252,100, 54,100, 63, 97,  2, 98,238, 99,  1,226,235,
+    232,225,243,233,225,238,227,249,242,233,236,236,233, 99,128,  4,
+    169,236,244,239,238,229,225,242,225,226,233, 99,128,  6,193,226,
+    229,238,231,225,236,105,128,  9,185,228,101,  2, 99, 32, 99, 50,
+    243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128,
+      4,179,246, 97,128,  9, 57,231,117,  2, 99, 62, 99, 71,234,225,
+    242,225,244,105,128, 10,185,242,237,245,235,232,105,128, 10, 57,
+    104,  4, 99, 90, 99, 99, 99,113, 99,143,225,242,225,226,233, 99,
+    128,  6, 45,230,233,238,225,236,225,242,225,226,233, 99,128,254,
+    162,105,  2, 99,119, 99,134,238,233,244,233,225,236,225,242,225,
+    226,233, 99,128,254,163,242,225,231,225,238, 97,128, 48,111,237,
+    229,228,233,225,236,225,242,225,226,233, 99,128,254,164,233,244,
+    245,243,241,245,225,242,101,128, 51, 42,235,225,244,225,235,225,
+    238, 97,129, 48,207, 99,183,232,225,236,230,247,233,228,244,104,
+    128,255,138,236,225,238,244,231,245,242,237,245,235,232,105,128,
+     10, 77,237,250, 97,  2, 99,218, 99,227,225,242,225,226,233, 99,
+    128,  6, 33,236,239,247,225,242,225,226,233, 99,128,  6, 33,238,
+    231,245,236,230,233,236,236,229,114,128, 49,100,114,  2,100,  2,
+    100, 18,228,243,233,231,238,227,249,242,233,236,236,233, 99,128,
+      4, 74,240,239,239,110,  2,100, 27,100, 40,236,229,230,244,226,
+    225,242,226,245,112,128, 33,188,242,233,231,232,244,226,225,242,
+    226,245,112,128, 33,192,243,241,245,225,242,101,128, 51,202,244,
+    225,102,  3,100, 73,100,165,101,  0,240,225,244,225,104,134,  5,
+    178,100, 93,100, 98,100,112,100,121,100,136,100,152,177, 54,128,
+      5,178, 50,  2,100,104,100,108, 51,128,  5,178,102,128,  5,178,
+    232,229,226,242,229,119,128,  5,178,238,225,242,242,239,247,232,
+    229,226,242,229,119,128,  5,178,241,245,225,242,244,229,242,232,
+    229,226,242,229,119,128,  5,178,247,233,228,229,232,229,226,242,
+    229,119,128,  5,178,241,225,237,225,244,115,135,  5,179,100,188,
+    100,193,100,198,100,203,100,212,100,227,100,243,177, 98,128,  5,
+    179,178, 56,128,  5,179,179, 52,128,  5,179,232,229,226,242,229,
+    119,128,  5,179,238,225,242,242,239,247,232,229,226,242,229,119,
+    128,  5,179,241,245,225,242,244,229,242,232,229,226,242,229,119,
+    128,  5,179,247,233,228,229,232,229,226,242,229,119,128,  5,179,
+    243,229,231,239,108,135,  5,177,101, 22,101, 27,101, 32,101, 37,
+    101, 46,101, 61,101, 77,177, 55,128,  5,177,178, 52,128,  5,177,
+    179, 48,128,  5,177,232,229,226,242,229,119,128,  5,177,238,225,
+    242,242,239,247,232,229,226,242,229,119,128,  5,177,241,245,225,
+    242,244,229,242,232,229,226,242,229,119,128,  5,177,247,233,228,
+    229,232,229,226,242,229,119,128,  5,177, 98,  3,101, 98,101,103,
+    101,113,225,114,128,  1, 39,239,240,239,237,239,230,111,128, 49,
+     15,242,229,246,229,226,229,236,239,119,128, 30, 43, 99,  2,101,
+    131,101,140,229,228,233,236,236, 97,128, 30, 41,233,242, 99,  2,
+    101,148,101,153,236,101,128, 36,215,245,237,230,236,229,120,128,
+      1, 37,100,  2,101,168,101,178,233,229,242,229,243,233,115,128,
+     30, 39,239,116,  2,101,185,101,194,225,227,227,229,238,116,128,
+     30, 35,226,229,236,239,119,128, 30, 37,101,136,  5,212,101,222,
+    101,255,102, 19,102,248,103,  8,103, 53,103, 62,103, 75,225,242,
+    116,129, 38,101,101,230,243,245,233,116,  2,101,239,101,247,226,
+    236,225,227,107,128, 38,101,247,232,233,244,101,128, 38, 97,228,
+    225,231,229,243,104,129,251, 52,102, 10,232,229,226,242,229,119,
+    128,251, 52,104,  6,102, 33,102, 61,102, 69,102,119,102,165,102,
+    214, 97,  2,102, 39,102, 53,236,244,239,238,229,225,242,225,226,
+    233, 99,128,  6,193,242,225,226,233, 99,128,  6, 71,229,226,242,
+    229,119,128,  5,212,230,233,238,225,236, 97,  2,102, 80,102,111,
+    236,116,  2,102, 87,102, 99,239,238,229,225,242,225,226,233, 99,
+    128,251,167,244,247,239,225,242,225,226,233, 99,128,254,234,242,
+    225,226,233, 99,128,254,234,232,225,237,250,225,225,226,239,246,
+    101,  2,102,134,102,148,230,233,238,225,236,225,242,225,226,233,
+     99,128,251,165,233,243,239,236,225,244,229,228,225,242,225,226,
+    233, 99,128,251,164,105,  2,102,171,102,205,238,233,244,233,225,
+    236, 97,  2,102,183,102,197,236,244,239,238,229,225,242,225,226,
+    233, 99,128,251,168,242,225,226,233, 99,128,254,235,242,225,231,
+    225,238, 97,128, 48,120,237,229,228,233,225,236, 97,  2,102,226,
+    102,240,236,244,239,238,229,225,242,225,226,233, 99,128,251,169,
+    242,225,226,233, 99,128,254,236,233,243,229,233,229,242,225,243,
+    241,245,225,242,101,128, 51,123,107,  2,103, 14,103, 38,225,244,
+    225,235,225,238, 97,129, 48,216,103, 26,232,225,236,230,247,233,
+    228,244,104,128,255,141,245,244,225,225,242,245,243,241,245,225,
+    242,101,128, 51, 54,238,231,232,239,239,107,128,  2,103,242,245,
+    244,245,243,241,245,225,242,101,128, 51, 57,116,129,  5,215,103,
+     81,232,229,226,242,229,119,128,  5,215,232,239,239,107,129,  2,
+    102,103, 99,243,245,240,229,242,233,239,114,128,  2,177,105,  4,
+    103,120,103,205,103,216,103,241,229,245,104,  4,103,132,103,167,
+    103,182,103,191, 97,  2,103,138,103,153,227,233,242,227,236,229,
+    235,239,242,229,225,110,128, 50,123,240,225,242,229,238,235,239,
+    242,229,225,110,128, 50, 27,227,233,242,227,236,229,235,239,242,
+    229,225,110,128, 50,109,235,239,242,229,225,110,128, 49, 78,240,
+    225,242,229,238,235,239,242,229,225,110,128, 50, 13,232,233,242,
+    225,231,225,238, 97,128, 48,114,235,225,244,225,235,225,238, 97,
+    129, 48,210,103,229,232,225,236,230,247,233,228,244,104,128,255,
+    139,242,233,113,134,  5,180,104,  3,104,  8,104, 22,104, 31,104,
+     46,104, 62,177, 52,128,  5,180, 50,  2,104, 14,104, 18, 49,128,
+      5,180,100,128,  5,180,232,229,226,242,229,119,128,  5,180,238,
+    225,242,242,239,247,232,229,226,242,229,119,128,  5,180,241,245,
+    225,242,244,229,242,232,229,226,242,229,119,128,  5,180,247,233,
+    228,229,232,229,226,242,229,119,128,  5,180,236,233,238,229,226,
+    229,236,239,119,128, 30,150,237,239,238,239,243,240,225,227,101,
+    128,255, 72,111,  9,104,119,104,130,104,154,104,179,105, 11,105,
+     24,105,110,105,150,105,161,225,242,237,229,238,233,225,110,128,
+      5,112,232,105,  2,104,137,104,145,240,244,232,225,105,128, 14,
+     43,242,225,231,225,238, 97,128, 48,123,235,225,244,225,235,225,
+    238, 97,129, 48,219,104,167,232,225,236,230,247,233,228,244,104,
+    128,255,142,236,225,109,135,  5,185,104,199,104,204,104,209,104,
+    214,104,223,104,238,104,254,177, 57,128,  5,185,178, 54,128,  5,
+    185,179, 50,128,  5,185,232,229,226,242,229,119,128,  5,185,238,
+    225,242,242,239,247,232,229,226,242,229,119,128,  5,185,241,245,
+    225,242,244,229,242,232,229,226,242,229,119,128,  5,185,247,233,
+    228,229,232,229,226,242,229,119,128,  5,185,238,239,235,232,245,
+    235,244,232,225,105,128, 14, 46,111,  2,105, 30,105,100,107,  4,
+    105, 40,105, 52,105, 58,105, 80,225,226,239,246,229,227,239,237,
+     98,128,  3,  9,227,237, 98,128,  3,  9,240,225,236,225,244,225,
+    236,233,250,229,228,226,229,236,239,247,227,237, 98,128,  3, 33,
+    242,229,244,242,239,230,236,229,248,226,229,236,239,247,227,237,
+     98,128,  3, 34,238,243,241,245,225,242,101,128, 51, 66,114,  2,
+    105,116,105,143,105,  2,105,122,105,131,227,239,240,244,233, 99,
+    128,  3,233,250,239,238,244,225,236,226,225,114,128, 32, 21,238,
+    227,237, 98,128,  3, 27,244,243,240,242,233,238,231,115,128, 38,
+    104,245,243,101,128, 35,  2,240,225,242,229,110,128, 36,163,243,
+    245,240,229,242,233,239,114,128,  2,176,244,245,242,238,229,100,
+    128,  2,101,117,  4,105,205,105,216,105,229,105,254,232,233,242,
+    225,231,225,238, 97,128, 48,117,233,233,244,239,243,241,245,225,
+    242,101,128, 51, 51,235,225,244,225,235,225,238, 97,129, 48,213,
+    105,242,232,225,236,230,247,233,228,244,104,128,255,140,238,231,
+    225,242,245,237,236,225,245,116,129,  2,221,106, 13,227,237, 98,
+    128,  3, 11,118,128,  1,149,249,240,232,229,110,132,  0, 45,106,
+     39,106, 50,106, 62,106, 85,233,238,230,229,242,233,239,114,128,
+    246,229,237,239,238,239,243,240,225,227,101,128,255, 13,115,  2,
+    106, 68,106, 75,237,225,236,108,128,254, 99,245,240,229,242,233,
+    239,114,128,246,230,244,247,111,128, 32, 16,105,149,  0,105,106,
+    137,106,160,106,194,106,241,110,123,110,243,111, 24,111, 51,111,
+    213,111,217,111,255,112, 21,112,105,113, 14,113, 89,113, 97,113,
+    110,113,197,113,254,114, 26,114, 70,225, 99,  2,106,144,106,150,
+    245,244,101,128,  0,237,249,242,233,236,236,233, 99,128,  4, 79,
+     98,  3,106,168,106,177,106,187,229,238,231,225,236,105,128,  9,
+    135,239,240,239,237,239,230,111,128, 49, 39,242,229,246,101,128,
+      1, 45, 99,  3,106,202,106,209,106,231,225,242,239,110,128,  1,
+    208,233,242, 99,  2,106,217,106,222,236,101,128, 36,216,245,237,
+    230,236,229,120,128,  0,238,249,242,233,236,236,233, 99,128,  4,
+     86,100,  4,106,251,107,  5,110, 80,110,113,226,236,231,242,225,
+    246,101,128,  2,  9,101,  2,107, 11,110, 75,239,231,242,225,240,
+    104,  7,107, 32,107, 46,107, 59,109,244,110, 19,110, 32,110, 44,
+    229,225,242,244,232,227,233,242,227,236,101,128, 50,143,230,233,
+    242,229,227,233,242,227,236,101,128, 50,139,233, 99, 14,107, 90,
+    107,106,107,205,108,  3,108, 69,108, 98,108,114,108,171,108,220,
+    108,232,109,  3,109, 70,109,208,109,237,225,236,236,233,225,238,
+    227,229,240,225,242,229,110,128, 50, 63, 99,  4,107,116,107,127,
+    107,141,107,148,225,236,236,240,225,242,229,110,128, 50, 58,229,
+    238,244,242,229,227,233,242,227,236,101,128, 50,165,236,239,243,
+    101,128, 48,  6,111,  3,107,156,107,171,107,191,237,237, 97,129,
+     48,  1,107,164,236,229,230,116,128,255,100,238,231,242,225,244,
+    245,236,225,244,233,239,238,240,225,242,229,110,128, 50, 55,242,
+    242,229,227,244,227,233,242,227,236,101,128, 50,163,101,  3,107,
+    213,107,225,107,242,225,242,244,232,240,225,242,229,110,128, 50,
+     47,238,244,229,242,240,242,233,243,229,240,225,242,229,110,128,
+     50, 61,248,227,229,236,236,229,238,244,227,233,242,227,236,101,
+    128, 50,157,102,  2,108,  9,108, 24,229,243,244,233,246,225,236,
+    240,225,242,229,110,128, 50, 64,105,  2,108, 30,108, 59,238,225,
+    238,227,233,225,108,  2,108, 42,108, 51,227,233,242,227,236,101,
+    128, 50,150,240,225,242,229,110,128, 50, 54,242,229,240,225,242,
+    229,110,128, 50, 43,104,  2,108, 75,108, 86,225,246,229,240,225,
+    242,229,110,128, 50, 50,233,231,232,227,233,242,227,236,101,128,
+     50,164,233,244,229,242,225,244,233,239,238,237,225,242,107,128,
+     48,  5,108,  3,108,122,108,148,108,160,225,226,239,114,  2,108,
+    131,108,140,227,233,242,227,236,101,128, 50,152,240,225,242,229,
+    110,128, 50, 56,229,230,244,227,233,242,227,236,101,128, 50,167,
+    239,247,227,233,242,227,236,101,128, 50,166,109,  2,108,177,108,
+    209,101,  2,108,183,108,198,228,233,227,233,238,229,227,233,242,
+    227,236,101,128, 50,169,244,225,236,240,225,242,229,110,128, 50,
+     46,239,239,238,240,225,242,229,110,128, 50, 42,238,225,237,229,
+    240,225,242,229,110,128, 50, 52,112,  2,108,238,108,246,229,242,
+    233,239,100,128, 48,  2,242,233,238,244,227,233,242,227,236,101,
+    128, 50,158,114,  2,109,  9,109, 57,101,  3,109, 17,109, 28,109,
+     43,225,227,232,240,225,242,229,110,128, 50, 67,240,242,229,243,
+    229,238,244,240,225,242,229,110,128, 50, 57,243,239,245,242,227,
+    229,240,225,242,229,110,128, 50, 62,233,231,232,244,227,233,242,
+    227,236,101,128, 50,168,115,  5,109, 82,109,111,109,125,109,150,
+    109,178,101,  2,109, 88,109,101,227,242,229,244,227,233,242,227,
+    236,101,128, 50,153,236,230,240,225,242,229,110,128, 50, 66,239,
+    227,233,229,244,249,240,225,242,229,110,128, 50, 51,112,  2,109,
+    131,109,137,225,227,101,128, 48,  0,229,227,233,225,236,240,225,
+    242,229,110,128, 50, 53,116,  2,109,156,109,167,239,227,235,240,
+    225,242,229,110,128, 50, 49,245,228,249,240,225,242,229,110,128,
+     50, 59,117,  2,109,184,109,193,238,240,225,242,229,110,128, 50,
+     48,240,229,242,246,233,243,229,240,225,242,229,110,128, 50, 60,
+    119,  2,109,214,109,226,225,244,229,242,240,225,242,229,110,128,
+     50, 44,239,239,228,240,225,242,229,110,128, 50, 45,250,229,242,
+    111,128, 48,  7,109,  2,109,250,110,  7,229,244,225,236,227,233,
+    242,227,236,101,128, 50,142,239,239,238,227,233,242,227,236,101,
+    128, 50,138,238,225,237,229,227,233,242,227,236,101,128, 50,148,
+    243,245,238,227,233,242,227,236,101,128, 50,144,119,  2,110, 50,
+    110, 63,225,244,229,242,227,233,242,227,236,101,128, 50,140,239,
+    239,228,227,233,242,227,236,101,128, 50,141,246, 97,128,  9,  7,
+    233,229,242,229,243,233,115,130,  0,239,110, 94,110,102,225,227,
+    245,244,101,128, 30, 47,227,249,242,233,236,236,233, 99,128,  4,
+    229,239,244,226,229,236,239,119,128, 30,203,101,  3,110,131,110,
+    147,110,158,226,242,229,246,229,227,249,242,233,236,236,233, 99,
+    128,  4,215,227,249,242,233,236,236,233, 99,128,  4, 53,245,238,
+    103,  4,110,170,110,205,110,220,110,229, 97,  2,110,176,110,191,
+    227,233,242,227,236,229,235,239,242,229,225,110,128, 50,117,240,
+    225,242,229,238,235,239,242,229,225,110,128, 50, 21,227,233,242,
+    227,236,229,235,239,242,229,225,110,128, 50,103,235,239,242,229,
+    225,110,128, 49, 71,240,225,242,229,238,235,239,242,229,225,110,
+    128, 50,  7,103,  2,110,249,111,  0,242,225,246,101,128,  0,236,
+    117,  2,111,  6,111, 15,234,225,242,225,244,105,128, 10,135,242,
+    237,245,235,232,105,128, 10,  7,104,  2,111, 30,111, 40,233,242,
+    225,231,225,238, 97,128, 48, 68,239,239,235,225,226,239,246,101,
+    128, 30,201,105,  8,111, 69,111, 79,111, 90,111, 97,111,122,111,
+    138,111,153,111,169,226,229,238,231,225,236,105,128,  9,136,227,
+    249,242,233,236,236,233, 99,128,  4, 56,228,229,246, 97,128,  9,
+      8,231,117,  2,111,104,111,113,234,225,242,225,244,105,128, 10,
+    136,242,237,245,235,232,105,128, 10,  8,237,225,244,242,225,231,
+    245,242,237,245,235,232,105,128, 10, 64,238,246,229,242,244,229,
+    228,226,242,229,246,101,128,  2, 11,243,232,239,242,244,227,249,
+    242,233,236,236,233, 99,128,  4, 57,246,239,247,229,236,243,233,
+    231,110,  3,111,185,111,195,111,202,226,229,238,231,225,236,105,
+    128,  9,192,228,229,246, 97,128,  9, 64,231,245,234,225,242,225,
+    244,105,128, 10,192,106,128,  1, 51,107,  2,111,223,111,247,225,
+    244,225,235,225,238, 97,129, 48,164,111,235,232,225,236,230,247,
+    233,228,244,104,128,255,114,239,242,229,225,110,128, 49, 99,108,
+      2,112,  5,112, 10,228,101,128,  2,220,245,249,232,229,226,242,
+    229,119,128,  5,172,109,  2,112, 27,112, 94, 97,  3,112, 35,112,
+     55,112, 80,227,242,239,110,129,  1, 43,112, 44,227,249,242,233,
+    236,236,233, 99,128,  4,227,231,229,239,242,225,240,240,242,239,
+    248,233,237,225,244,229,236,249,229,241,245,225,108,128, 34, 83,
+    244,242,225,231,245,242,237,245,235,232,105,128, 10, 63,239,238,
+    239,243,240,225,227,101,128,255, 73,110,  5,112,117,112,127,112,
+    136,112,148,112,232,227,242,229,237,229,238,116,128, 34,  6,230,
+    233,238,233,244,121,128, 34, 30,233,225,242,237,229,238,233,225,
+    110,128,  5,107,116,  2,112,154,112,222,101,  2,112,160,112,211,
+    231,242,225,108,131, 34, 43,112,173,112,191,112,196, 98,  2,112,
+    179,112,187,239,244,244,239,109,128, 35, 33,116,128, 35, 33,229,
+    120,128,248,245,116,  2,112,202,112,207,239,112,128, 35, 32,112,
+    128, 35, 32,242,243,229,227,244,233,239,110,128, 34, 41,233,243,
+    241,245,225,242,101,128, 51,  5,118,  3,112,240,112,249,113,  2,
+    226,245,236,236,229,116,128, 37,216,227,233,242,227,236,101,128,
+     37,217,243,237,233,236,229,230,225,227,101,128, 38, 59,111,  3,
+    113, 22,113, 33,113, 41,227,249,242,233,236,236,233, 99,128,  4,
+     81,231,239,238,229,107,128,  1, 47,244, 97,131,  3,185,113, 52,
+    113, 73,113, 81,228,233,229,242,229,243,233,115,129,  3,202,113,
+     65,244,239,238,239,115,128,  3,144,236,225,244,233,110,128,  2,
+    105,244,239,238,239,115,128,  3,175,240,225,242,229,110,128, 36,
+    164,242,233,231,245,242,237,245,235,232,105,128, 10,114,115,  4,
+    113,120,113,165,113,179,113,187,237,225,236,108,  2,113,129,113,
+    140,232,233,242,225,231,225,238, 97,128, 48, 67,235,225,244,225,
+    235,225,238, 97,129, 48,163,113,153,232,225,236,230,247,233,228,
+    244,104,128,255,104,243,232,225,242,226,229,238,231,225,236,105,
+    128,  9,250,244,242,239,235,101,128,  2,104,245,240,229,242,233,
+    239,114,128,246,237,116,  2,113,203,113,237,229,242,225,244,233,
+    239,110,  2,113,215,113,226,232,233,242,225,231,225,238, 97,128,
+     48,157,235,225,244,225,235,225,238, 97,128, 48,253,233,236,228,
+    101,129,  1, 41,113,246,226,229,236,239,119,128, 30, 45,117,  2,
+    114,  4,114, 15,226,239,240,239,237,239,230,111,128, 49, 41,227,
+    249,242,233,236,236,233, 99,128,  4, 78,246,239,247,229,236,243,
+    233,231,110,  3,114, 42,114, 52,114, 59,226,229,238,231,225,236,
+    105,128,  9,191,228,229,246, 97,128,  9, 63,231,245,234,225,242,
+    225,244,105,128, 10,191,250,232,233,244,243, 97,  2,114, 81,114,
+     92,227,249,242,233,236,236,233, 99,128,  4,117,228,226,236,231,
+    242,225,246,229,227,249,242,233,236,236,233, 99,128,  4,119,106,
+    138,  0,106,114,135,114,198,114,209,115,  3,115, 19,115,132,115,
+    201,115,206,115,218,115,226, 97,  4,114,145,114,156,114,166,114,
+    173,225,242,237,229,238,233,225,110,128,  5,113,226,229,238,231,
+    225,236,105,128,  9,156,228,229,246, 97,128,  9, 28,231,117,  2,
+    114,180,114,189,234,225,242,225,244,105,128, 10,156,242,237,245,
+    235,232,105,128, 10, 28,226,239,240,239,237,239,230,111,128, 49,
+     16, 99,  3,114,217,114,224,114,246,225,242,239,110,128,  1,240,
+    233,242, 99,  2,114,232,114,237,236,101,128, 36,217,245,237,230,
+    236,229,120,128,  1, 53,242,239,243,243,229,228,244,225,233,108,
+    128,  2,157,228,239,244,236,229,243,243,243,244,242,239,235,101,
+    128,  2, 95,101,  3,115, 27,115, 38,115,103,227,249,242,233,236,
+    236,233, 99,128,  4, 88,229,109,  4,115, 49,115, 58,115, 72,115,
+     88,225,242,225,226,233, 99,128,  6, 44,230,233,238,225,236,225,
+    242,225,226,233, 99,128,254,158,233,238,233,244,233,225,236,225,
+    242,225,226,233, 99,128,254,159,237,229,228,233,225,236,225,242,
+    225,226,233, 99,128,254,160,104,  2,115,109,115,118,225,242,225,
+    226,233, 99,128,  6,152,230,233,238,225,236,225,242,225,226,233,
+     99,128,251,139,104,  2,115,138,115,188, 97,  3,115,146,115,156,
+    115,163,226,229,238,231,225,236,105,128,  9,157,228,229,246, 97,
+    128,  9, 29,231,117,  2,115,170,115,179,234,225,242,225,244,105,
+    128, 10,157,242,237,245,235,232,105,128, 10, 29,229,232,225,242,
+    237,229,238,233,225,110,128,  5,123,233,115,128, 48,  4,237,239,
+    238,239,243,240,225,227,101,128,255, 74,240,225,242,229,110,128,
+     36,165,243,245,240,229,242,233,239,114,128,  2,178,107,146,  0,
+    107,116, 21,118,110,118,121,118,183,118,194,119, 28,119, 42,120,
+    150,121, 90,121,103,121,129,121,178,122, 60,122, 82,122, 95,122,
+    118,122,160,122,170, 97, 12,116, 47,116, 79,116,101,116,131,116,
+    245,117, 14,117, 44,117, 69,117,175,117,189,118, 56,118, 85, 98,
+      2,116, 53,116, 70,225,243,232,235,233,242,227,249,242,233,236,
+    236,233, 99,128,  4,161,229,238,231,225,236,105,128,  9,149, 99,
+      2,116, 85,116, 91,245,244,101,128, 30, 49,249,242,233,236,236,
+    233, 99,128,  4, 58,228,101,  2,116,108,116,126,243,227,229,238,
+    228,229,242,227,249,242,233,236,236,233, 99,128,  4,155,246, 97,
+    128,  9, 21,102,135,  5,219,116,149,116,158,116,178,116,192,116,
+    201,116,217,116,232,225,242,225,226,233, 99,128,  6, 67,228,225,
+    231,229,243,104,129,251, 59,116,169,232,229,226,242,229,119,128,
+    251, 59,230,233,238,225,236,225,242,225,226,233, 99,128,254,218,
+    232,229,226,242,229,119,128,  5,219,233,238,233,244,233,225,236,
+    225,242,225,226,233, 99,128,254,219,237,229,228,233,225,236,225,
+    242,225,226,233, 99,128,254,220,242,225,230,229,232,229,226,242,
+    229,119,128,251, 77,231,117,  2,116,252,117,  5,234,225,242,225,
+    244,105,128, 10,149,242,237,245,235,232,105,128, 10, 21,104,  2,
+    117, 20,117, 30,233,242,225,231,225,238, 97,128, 48, 75,239,239,
+    235,227,249,242,233,236,236,233, 99,128,  4,196,235,225,244,225,
+    235,225,238, 97,129, 48,171,117, 57,232,225,236,230,247,233,228,
+    244,104,128,255,118,112,  2,117, 75,117, 96,240, 97,129,  3,186,
+    117, 82,243,249,237,226,239,236,231,242,229,229,107,128,  3,240,
+    249,229,239,245,110,  3,117,108,117,122,117,156,237,233,229,245,
+    237,235,239,242,229,225,110,128, 49,113,112,  2,117,128,117,143,
+    232,233,229,245,240,232,235,239,242,229,225,110,128, 49,132,233,
+    229,245,240,235,239,242,229,225,110,128, 49,120,243,243,225,238,
+    231,240,233,229,245,240,235,239,242,229,225,110,128, 49,121,242,
+    239,242,233,233,243,241,245,225,242,101,128, 51, 13,115,  5,117,
+    201,117,245,118,  4,118, 12,118, 40,232,233,228,225,225,245,244,
+    111,  2,117,214,117,223,225,242,225,226,233, 99,128,  6, 64,238,
+    239,243,233,228,229,226,229,225,242,233,238,231,225,242,225,226,
+    233, 99,128,  6, 64,237,225,236,236,235,225,244,225,235,225,238,
+     97,128, 48,245,241,245,225,242,101,128, 51,132,242, 97,  2,118,
+     19,118, 28,225,242,225,226,233, 99,128,  6, 80,244,225,238,225,
+    242,225,226,233, 99,128,  6, 77,244,242,239,235,229,227,249,242,
+    233,236,236,233, 99,128,  4,159,244,225,232,233,242,225,240,242,
+    239,236,239,238,231,237,225,242,235,232,225,236,230,247,233,228,
+    244,104,128,255,112,246,229,242,244,233,227,225,236,243,244,242,
+    239,235,229,227,249,242,233,236,236,233, 99,128,  4,157,226,239,
+    240,239,237,239,230,111,128, 49, 14, 99,  4,118,131,118,153,118,
+    162,118,170, 97,  2,118,137,118,147,236,243,241,245,225,242,101,
+    128, 51,137,242,239,110,128,  1,233,229,228,233,236,236, 97,128,
+      1, 55,233,242,227,236,101,128, 36,218,239,237,237,225,225,227,
+    227,229,238,116,128,  1, 55,228,239,244,226,229,236,239,119,128,
+     30, 51,101,  4,118,204,118,231,119,  0,119, 12,104,  2,118,210,
+    118,221,225,242,237,229,238,233,225,110,128,  5,132,233,242,225,
+    231,225,238, 97,128, 48, 81,235,225,244,225,235,225,238, 97,129,
+     48,177,118,244,232,225,236,230,247,233,228,244,104,128,255,121,
+    238,225,242,237,229,238,233,225,110,128,  5,111,243,237,225,236,
+    236,235,225,244,225,235,225,238, 97,128, 48,246,231,242,229,229,
+    238,236,225,238,228,233, 99,128,  1, 56,104,  6,119, 56,119,185,
+    119,196,119,221,120, 52,120,140, 97,  5,119, 68,119, 78,119, 89,
+    119, 96,119,121,226,229,238,231,225,236,105,128,  9,150,227,249,
+    242,233,236,236,233, 99,128,  4, 69,228,229,246, 97,128,  9, 22,
+    231,117,  2,119,103,119,112,234,225,242,225,244,105,128, 10,150,
+    242,237,245,235,232,105,128, 10, 22,104,  4,119,131,119,140,119,
+    154,119,170,225,242,225,226,233, 99,128,  6, 46,230,233,238,225,
+    236,225,242,225,226,233, 99,128,254,166,233,238,233,244,233,225,
+    236,225,242,225,226,233, 99,128,254,167,237,229,228,233,225,236,
+    225,242,225,226,233, 99,128,254,168,229,233,227,239,240,244,233,
+     99,128,  3,231,232, 97,  2,119,203,119,210,228,229,246, 97,128,
+      9, 89,231,245,242,237,245,235,232,105,128, 10, 89,233,229,245,
+    235,104,  4,119,235,120, 14,120, 29,120, 38, 97,  2,119,241,120,
+      0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,120,
+    240,225,242,229,238,235,239,242,229,225,110,128, 50, 24,227,233,
+    242,227,236,229,235,239,242,229,225,110,128, 50,106,235,239,242,
+    229,225,110,128, 49, 75,240,225,242,229,238,235,239,242,229,225,
+    110,128, 50, 10,111,  4,120, 62,120,111,120,121,120,126,235,104,
+      4,120, 73,120, 82,120, 91,120,101,225,233,244,232,225,105,128,
+     14,  2,239,238,244,232,225,105,128, 14,  5,245,225,244,244,232,
+    225,105,128, 14,  3,247,225,233,244,232,225,105,128, 14,  4,237,
+    245,244,244,232,225,105,128, 14, 91,239,107,128,  1,153,242,225,
+    235,232,225,238,231,244,232,225,105,128, 14,  6,250,243,241,245,
+    225,242,101,128, 51,145,105,  4,120,160,120,171,120,196,120,245,
+    232,233,242,225,231,225,238, 97,128, 48, 77,235,225,244,225,235,
+    225,238, 97,129, 48,173,120,184,232,225,236,230,247,233,228,244,
+    104,128,255,119,242,111,  3,120,205,120,220,120,236,231,245,242,
+    225,237,245,243,241,245,225,242,101,128, 51, 21,237,229,229,244,
+    239,242,245,243,241,245,225,242,101,128, 51, 22,243,241,245,225,
+    242,101,128, 51, 20,249,229,239,107,  5,121,  4,121, 39,121, 54,
+    121, 63,121, 77, 97,  2,121, 10,121, 25,227,233,242,227,236,229,
+    235,239,242,229,225,110,128, 50,110,240,225,242,229,238,235,239,
+    242,229,225,110,128, 50, 14,227,233,242,227,236,229,235,239,242,
+    229,225,110,128, 50, 96,235,239,242,229,225,110,128, 49, 49,240,
+    225,242,229,238,235,239,242,229,225,110,128, 50,  0,243,233,239,
+    243,235,239,242,229,225,110,128, 49, 51,234,229,227,249,242,233,
+    236,236,233, 99,128,  4, 92,108,  2,121,109,121,120,233,238,229,
+    226,229,236,239,119,128, 30, 53,243,241,245,225,242,101,128, 51,
+    152,109,  3,121,137,121,151,121,162,227,245,226,229,228,243,241,
+    245,225,242,101,128, 51,166,239,238,239,243,240,225,227,101,128,
+    255, 75,243,241,245,225,242,229,228,243,241,245,225,242,101,128,
+     51,162,111,  5,121,190,121,216,121,254,122, 10,122, 24,104,  2,
+    121,196,121,206,233,242,225,231,225,238, 97,128, 48, 83,237,243,
+    241,245,225,242,101,128, 51,192,235, 97,  2,121,223,121,231,233,
+    244,232,225,105,128, 14,  1,244,225,235,225,238, 97,129, 48,179,
+    121,242,232,225,236,230,247,233,228,244,104,128,255,122,239,240,
+    239,243,241,245,225,242,101,128, 51, 30,240,240,225,227,249,242,
+    233,236,236,233, 99,128,  4,129,114,  2,122, 30,122, 50,229,225,
+    238,243,244,225,238,228,225,242,228,243,249,237,226,239,108,128,
+     50,127,239,238,233,243,227,237, 98,128,  3, 67,240, 97,  2,122,
+     67,122, 73,242,229,110,128, 36,166,243,241,245,225,242,101,128,
+     51,170,243,233,227,249,242,233,236,236,233, 99,128,  4,111,116,
+      2,122,101,122,110,243,241,245,225,242,101,128, 51,207,245,242,
+    238,229,100,128,  2,158,117,  2,122,124,122,135,232,233,242,225,
+    231,225,238, 97,128, 48, 79,235,225,244,225,235,225,238, 97,129,
+     48,175,122,148,232,225,236,230,247,233,228,244,104,128,255,120,
+    246,243,241,245,225,242,101,128, 51,184,247,243,241,245,225,242,
+    101,128, 51,190,108,146,  0,108,122,220,124,247,125, 20,125, 86,
+    125,124,126, 20,126, 29,126, 45,126, 69,126, 87,126,205,126,246,
+    127,125,127,133,127,166,127,175,127,183,127,245, 97,  7,122,236,
+    122,246,122,253,123,  4,123, 29,123, 45,124,235,226,229,238,231,
+    225,236,105,128,  9,178,227,245,244,101,128,  1, 58,228,229,246,
+     97,128,  9, 50,231,117,  2,123, 11,123, 20,234,225,242,225,244,
+    105,128, 10,178,242,237,245,235,232,105,128, 10, 50,235,235,232,
+    225,238,231,249,225,239,244,232,225,105,128, 14, 69,109, 10,123,
+     67,124,  6,124, 23,124, 61,124, 75,124, 94,124,110,124,130,124,
+    150,124,173, 97,  2,123, 73,123,254,236,229,102,  4,123, 85,123,
+     99,123,191,123,208,230,233,238,225,236,225,242,225,226,233, 99,
+    128,254,252,232,225,237,250, 97,  2,123,109,123,150,225,226,239,
+    246,101,  2,123,119,123,133,230,233,238,225,236,225,242,225,226,
+    233, 99,128,254,248,233,243,239,236,225,244,229,228,225,242,225,
+    226,233, 99,128,254,247,226,229,236,239,119,  2,123,160,123,174,
+    230,233,238,225,236,225,242,225,226,233, 99,128,254,250,233,243,
+    239,236,225,244,229,228,225,242,225,226,233, 99,128,254,249,233,
+    243,239,236,225,244,229,228,225,242,225,226,233, 99,128,254,251,
+    237,225,228,228,225,225,226,239,246,101,  2,123,223,123,237,230,
+    233,238,225,236,225,242,225,226,233, 99,128,254,246,233,243,239,
+    236,225,244,229,228,225,242,225,226,233, 99,128,254,245,242,225,
+    226,233, 99,128,  6, 68,226,228, 97,129,  3,187,124, 14,243,244,
+    242,239,235,101,128,  1,155,229,100,130,  5,220,124, 32,124, 52,
+    228,225,231,229,243,104,129,251, 60,124, 43,232,229,226,242,229,
+    119,128,251, 60,232,229,226,242,229,119,128,  5,220,230,233,238,
+    225,236,225,242,225,226,233, 99,128,254,222,232,225,232,233,238,
+    233,244,233,225,236,225,242,225,226,233, 99,128,252,202,233,238,
+    233,244,233,225,236,225,242,225,226,233, 99,128,254,223,234,229,
+    229,237,233,238,233,244,233,225,236,225,242,225,226,233, 99,128,
+    252,201,235,232,225,232,233,238,233,244,233,225,236,225,242,225,
+    226,233, 99,128,252,203,236,225,237,232,229,232,233,243,239,236,
+    225,244,229,228,225,242,225,226,233, 99,128,253,242,237,101,  2,
+    124,180,124,193,228,233,225,236,225,242,225,226,233, 99,128,254,
+    224,229,109,  2,124,200,124,219,232,225,232,233,238,233,244,233,
+    225,236,225,242,225,226,233, 99,128,253,136,233,238,233,244,233,
+    225,236,225,242,225,226,233, 99,128,252,204,242,231,229,227,233,
+    242,227,236,101,128, 37,239, 98,  3,124,255,125,  4,125, 10,225,
+    114,128,  1,154,229,236,116,128,  2,108,239,240,239,237,239,230,
+    111,128, 49, 12, 99,  4,125, 30,125, 37,125, 46,125, 73,225,242,
+    239,110,128,  1, 62,229,228,233,236,236, 97,128,  1, 60,233,242,
+     99,  2,125, 54,125, 59,236,101,128, 36,219,245,237,230,236,229,
+    248,226,229,236,239,119,128, 30, 61,239,237,237,225,225,227,227,
+    229,238,116,128,  1, 60,228,239,116,130,  1, 64,125, 96,125,105,
+    225,227,227,229,238,116,128,  1, 64,226,229,236,239,119,129, 30,
+     55,125,115,237,225,227,242,239,110,128, 30, 57,101,  3,125,132,
+    125,170,126, 15,230,116,  2,125,139,125,155,225,238,231,236,229,
+    225,226,239,246,229,227,237, 98,128,  3, 26,244,225,227,235,226,
+    229,236,239,247,227,237, 98,128,  3, 24,243,115,132,  0, 60,125,
+    183,125,205,125,217,126,  7,229,241,245,225,108,129, 34,100,125,
+    193,239,242,231,242,229,225,244,229,114,128, 34,218,237,239,238,
+    239,243,240,225,227,101,128,255, 28,111,  2,125,223,125,252,114,
+      2,125,229,125,242,229,241,245,233,246,225,236,229,238,116,128,
+     34,114,231,242,229,225,244,229,114,128, 34,118,246,229,242,229,
+    241,245,225,108,128, 34,102,243,237,225,236,108,128,254,100,250,
+    104,128,  2,110,230,226,236,239,227,107,128, 37,140,232,239,239,
+    235,242,229,244,242,239,230,236,229,120,128,  2,109,105,  2,126,
+     51,126, 56,242, 97,128, 32,164,247,238,225,242,237,229,238,233,
+    225,110,128,  5,108,106,129,  1,201,126, 75,229,227,249,242,233,
+    236,236,233, 99,128,  4, 89,108,132,246,192,126, 99,126,123,126,
+    134,126,143, 97,  2,126,105,126,112,228,229,246, 97,128,  9, 51,
+    231,245,234,225,242,225,244,105,128, 10,179,233,238,229,226,229,
+    236,239,119,128, 30, 59,236,225,228,229,246, 97,128,  9, 52,246,
+    239,227,225,236,233, 99,  3,126,157,126,167,126,174,226,229,238,
+    231,225,236,105,128,  9,225,228,229,246, 97,128,  9, 97,246,239,
+    247,229,236,243,233,231,110,  2,126,188,126,198,226,229,238,231,
+    225,236,105,128,  9,227,228,229,246, 97,128,  9, 99,109,  3,126,
+    213,126,226,126,237,233,228,228,236,229,244,233,236,228,101,128,
+      2,107,239,238,239,243,240,225,227,101,128,255, 76,243,241,245,
+    225,242,101,128, 51,208,111,  6,127,  4,127, 16,127, 58,127, 69,
+    127, 75,127,117,227,232,245,236,225,244,232,225,105,128, 14, 44,
+    231,233,227,225,108,  3,127, 28,127, 34,127, 53,225,238,100,128,
+     34, 39,238,239,116,129,  0,172,127, 42,242,229,246,229,242,243,
+    229,100,128, 35, 16,239,114,128, 34, 40,236,233,238,231,244,232,
+    225,105,128, 14, 37,238,231,115,128,  1,127,247,236,233,238,101,
+      2,127, 85,127,108, 99,  2,127, 91,127,103,229,238,244,229,242,
+    236,233,238,101,128,254, 78,237, 98,128,  3, 50,228,225,243,232,
+    229,100,128,254, 77,250,229,238,231,101,128, 37,202,240,225,242,
+    229,110,128, 36,167,115,  3,127,141,127,148,127,156,236,225,243,
+    104,128,  1, 66,241,245,225,242,101,128, 33, 19,245,240,229,242,
+    233,239,114,128,246,238,244,243,232,225,228,101,128, 37,145,245,
+    244,232,225,105,128, 14, 38,246,239,227,225,236,233, 99,  3,127,
+    197,127,207,127,214,226,229,238,231,225,236,105,128,  9,140,228,
+    229,246, 97,128,  9, 12,246,239,247,229,236,243,233,231,110,  2,
+    127,228,127,238,226,229,238,231,225,236,105,128,  9,226,228,229,
+    246, 97,128,  9, 98,248,243,241,245,225,242,101,128, 51,211,109,
+    144,  0,109,128, 35,130,144,130,169,130,196,130,221,132, 18,132,
+     40,133, 95,133,125,133,174,134, 25,134, 47,134, 72,134, 81,135,
+    108,135,136, 97, 12,128, 61,128, 71,128,135,128,142,128,167,128,
+    215,130, 51,130, 76,130, 81,130, 95,130,107,130,112,226,229,238,
+    231,225,236,105,128,  9,174, 99,  2,128, 77,128,129,242,239,110,
+    132,  0,175,128, 91,128,102,128,108,128,117,226,229,236,239,247,
+    227,237, 98,128,  3, 49,227,237, 98,128,  3,  4,236,239,247,237,
+    239,100,128,  2,205,237,239,238,239,243,240,225,227,101,128,255,
+    227,245,244,101,128, 30, 63,228,229,246, 97,128,  9, 46,231,117,
+      2,128,149,128,158,234,225,242,225,244,105,128, 10,174,242,237,
+    245,235,232,105,128, 10, 46,104,  2,128,173,128,205,225,240,225,
+    235,104,  2,128,183,128,192,232,229,226,242,229,119,128,  5,164,
+    236,229,230,244,232,229,226,242,229,119,128,  5,164,233,242,225,
+    231,225,238, 97,128, 48,126,105,  5,128,227,129, 40,129,103,129,
+    133,130, 39,227,232,225,244,244,225,247, 97,  3,128,242,129, 17,
+    129, 24,236,239,119,  2,128,250,129,  5,236,229,230,244,244,232,
+    225,105,128,248,149,242,233,231,232,244,244,232,225,105,128,248,
+    148,244,232,225,105,128, 14, 75,245,240,240,229,242,236,229,230,
+    244,244,232,225,105,128,248,147,229,107,  3,129, 49,129, 80,129,
+     87,236,239,119,  2,129, 57,129, 68,236,229,230,244,244,232,225,
+    105,128,248,140,242,233,231,232,244,244,232,225,105,128,248,139,
+    244,232,225,105,128, 14, 72,245,240,240,229,242,236,229,230,244,
+    244,232,225,105,128,248,138,232,225,238,225,235,225,116,  2,129,
+    115,129,126,236,229,230,244,244,232,225,105,128,248,132,244,232,
+    225,105,128, 14, 49,116,  3,129,141,129,169,129,232,225,233,235,
+    232,117,  2,129,151,129,162,236,229,230,244,244,232,225,105,128,
+    248,137,244,232,225,105,128, 14, 71,232,111,  3,129,178,129,209,
+    129,216,236,239,119,  2,129,186,129,197,236,229,230,244,244,232,
+    225,105,128,248,143,242,233,231,232,244,244,232,225,105,128,248,
+    142,244,232,225,105,128, 14, 73,245,240,240,229,242,236,229,230,
+    244,244,232,225,105,128,248,141,242,105,  3,129,241,130, 16,130,
+     23,236,239,119,  2,129,249,130,  4,236,229,230,244,244,232,225,
+    105,128,248,146,242,233,231,232,244,244,232,225,105,128,248,145,
+    244,232,225,105,128, 14, 74,245,240,240,229,242,236,229,230,244,
+    244,232,225,105,128,248,144,249,225,237,239,235,244,232,225,105,
+    128, 14, 70,235,225,244,225,235,225,238, 97,129, 48,222,130, 64,
+    232,225,236,230,247,233,228,244,104,128,255,143,236,101,128, 38,
+     66,238,243,249,239,238,243,241,245,225,242,101,128, 51, 71,241,
+    225,230,232,229,226,242,229,119,128,  5,190,242,115,128, 38, 66,
+    115,  2,130,118,130,136,239,242,225,227,233,242,227,236,229,232,
+    229,226,242,229,119,128,  5,175,241,245,225,242,101,128, 51,131,
+     98,  2,130,150,130,160,239,240,239,237,239,230,111,128, 49,  7,
+    243,241,245,225,242,101,128, 51,212, 99,  2,130,175,130,183,233,
+    242,227,236,101,128, 36,220,245,226,229,228,243,241,245,225,242,
+    101,128, 51,165,228,239,116,  2,130,204,130,213,225,227,227,229,
+    238,116,128, 30, 65,226,229,236,239,119,128, 30, 67,101,  7,130,
+    237,131,108,131,119,131,134,131,159,131,196,131,208,101,  2,130,
+    243,131, 95,109,  4,130,253,131,  6,131, 20,131, 36,225,242,225,
+    226,233, 99,128,  6, 69,230,233,238,225,236,225,242,225,226,233,
+     99,128,254,226,233,238,233,244,233,225,236,225,242,225,226,233,
+     99,128,254,227,237,101,  2,131, 43,131, 56,228,233,225,236,225,
+    242,225,226,233, 99,128,254,228,229,237,105,  2,131, 64,131, 79,
+    238,233,244,233,225,236,225,242,225,226,233, 99,128,252,209,243,
+    239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 72,244,
+    239,242,245,243,241,245,225,242,101,128, 51, 77,232,233,242,225,
+    231,225,238, 97,128, 48,129,233,250,233,229,242,225,243,241,245,
+    225,242,101,128, 51,126,235,225,244,225,235,225,238, 97,129, 48,
+    225,131,147,232,225,236,230,247,233,228,244,104,128,255,146,109,
+    130,  5,222,131,167,131,187,228,225,231,229,243,104,129,251, 62,
+    131,178,232,229,226,242,229,119,128,251, 62,232,229,226,242,229,
+    119,128,  5,222,238,225,242,237,229,238,233,225,110,128,  5,116,
+    242,235,232, 97,  3,131,219,131,228,132,  5,232,229,226,242,229,
+    119,128,  5,165,235,229,230,245,236, 97,  2,131,239,131,248,232,
+    229,226,242,229,119,128,  5,166,236,229,230,244,232,229,226,242,
+    229,119,128,  5,166,236,229,230,244,232,229,226,242,229,119,128,
+      5,165,104,  2,132, 24,132, 30,239,239,107,128,  2,113,250,243,
+    241,245,225,242,101,128, 51,146,105,  6,132, 54,132, 91,132,228,
+    132,239,133,  8,133, 65,228,100,  2,132, 61,132, 86,236,229,228,
+    239,244,235,225,244,225,235,225,238,225,232,225,236,230,247,233,
+    228,244,104,128,255,101,239,116,128,  0,183,229,245,109,  5,132,
+    105,132,140,132,155,132,164,132,215, 97,  2,132,111,132,126,227,
+    233,242,227,236,229,235,239,242,229,225,110,128, 50,114,240,225,
+    242,229,238,235,239,242,229,225,110,128, 50, 18,227,233,242,227,
+    236,229,235,239,242,229,225,110,128, 50,100,235,239,242,229,225,
+    110,128, 49, 65,112,  2,132,170,132,202, 97,  2,132,176,132,190,
+    238,243,233,239,243,235,239,242,229,225,110,128, 49,112,242,229,
+    238,235,239,242,229,225,110,128, 50,  4,233,229,245,240,235,239,
+    242,229,225,110,128, 49,110,243,233,239,243,235,239,242,229,225,
+    110,128, 49,111,232,233,242,225,231,225,238, 97,128, 48,127,235,
+    225,244,225,235,225,238, 97,129, 48,223,132,252,232,225,236,230,
+    247,233,228,244,104,128,255,144,238,117,  2,133, 15,133, 60,115,
+    132, 34, 18,133, 27,133, 38,133, 47,133, 53,226,229,236,239,247,
+    227,237, 98,128,  3, 32,227,233,242,227,236,101,128, 34,150,237,
+    239,100,128,  2,215,240,236,245,115,128, 34, 19,244,101,128, 32,
+     50,242,105,  2,133, 72,133, 86,226,225,225,242,245,243,241,245,
+    225,242,101,128, 51, 74,243,241,245,225,242,101,128, 51, 73,108,
+      2,133,101,133,116,239,238,231,236,229,231,244,245,242,238,229,
+    100,128,  2,112,243,241,245,225,242,101,128, 51,150,109,  3,133,
+    133,133,147,133,158,227,245,226,229,228,243,241,245,225,242,101,
+    128, 51,163,239,238,239,243,240,225,227,101,128,255, 77,243,241,
+    245,225,242,229,228,243,241,245,225,242,101,128, 51,159,111,  5,
+    133,186,133,212,133,237,133,247,134,  0,104,  2,133,192,133,202,
+    233,242,225,231,225,238, 97,128, 48,130,237,243,241,245,225,242,
+    101,128, 51,193,235,225,244,225,235,225,238, 97,129, 48,226,133,
+    225,232,225,236,230,247,233,228,244,104,128,255,147,236,243,241,
+    245,225,242,101,128, 51,214,237,225,244,232,225,105,128, 14, 33,
+    246,229,242,243,243,241,245,225,242,101,129, 51,167,134, 15,228,
+    243,241,245,225,242,101,128, 51,168,240, 97,  2,134, 32,134, 38,
+    242,229,110,128, 36,168,243,241,245,225,242,101,128, 51,171,115,
+      2,134, 53,134, 62,243,241,245,225,242,101,128, 51,179,245,240,
+    229,242,233,239,114,128,246,239,244,245,242,238,229,100,128,  2,
+    111,117,141,  0,181,134,111,134,115,134,125,134,149,134,159,134,
+    181,134,192,134,217,134,240,134,250,135, 24,135, 88,135, 98, 49,
+    128,  0,181,225,243,241,245,225,242,101,128, 51,130,227,104,  2,
+    134,132,134,142,231,242,229,225,244,229,114,128, 34,107,236,229,
+    243,115,128, 34,106,230,243,241,245,225,242,101,128, 51,140,103,
+      2,134,165,134,172,242,229,229,107,128,  3,188,243,241,245,225,
+    242,101,128, 51,141,232,233,242,225,231,225,238, 97,128, 48,128,
+    235,225,244,225,235,225,238, 97,129, 48,224,134,205,232,225,236,
+    230,247,233,228,244,104,128,255,145,108,  2,134,223,134,232,243,
+    241,245,225,242,101,128, 51,149,244,233,240,236,121,128,  0,215,
+    237,243,241,245,225,242,101,128, 51,155,238,225,104,  2,135,  2,
+    135, 11,232,229,226,242,229,119,128,  5,163,236,229,230,244,232,
+    229,226,242,229,119,128,  5,163,115,  2,135, 30,135, 79,233, 99,
+      3,135, 39,135, 56,135, 67,225,236,238,239,244,101,129, 38,106,
+    135, 50,228,226,108,128, 38,107,230,236,225,244,243,233,231,110,
+    128, 38,109,243,232,225,242,240,243,233,231,110,128, 38,111,243,
+    241,245,225,242,101,128, 51,178,246,243,241,245,225,242,101,128,
+     51,182,247,243,241,245,225,242,101,128, 51,188,118,  2,135,114,
+    135,127,237,229,231,225,243,241,245,225,242,101,128, 51,185,243,
+    241,245,225,242,101,128, 51,183,119,  2,135,142,135,155,237,229,
+    231,225,243,241,245,225,242,101,128, 51,191,243,241,245,225,242,
+    101,128, 51,189,110,150,  0,110,135,212,136, 90,136,114,136,180,
+    136,205,137,  7,137, 17,137, 84,137,127,139,161,139,179,139,204,
+    139,235,140,  5,140, 70,142, 52,142, 60,142, 85,142, 93,143, 61,
+    143, 71,143, 81, 97,  8,135,230,135,250,136,  1,136,  8,136, 33,
+    136, 44,136, 69,136, 81, 98,  2,135,236,135,245,229,238,231,225,
+    236,105,128,  9,168,236, 97,128, 34,  7,227,245,244,101,128,  1,
+     68,228,229,246, 97,128,  9, 40,231,117,  2,136, 15,136, 24,234,
+    225,242,225,244,105,128, 10,168,242,237,245,235,232,105,128, 10,
+     40,232,233,242,225,231,225,238, 97,128, 48,106,235,225,244,225,
+    235,225,238, 97,129, 48,202,136, 57,232,225,236,230,247,233,228,
+    244,104,128,255,133,240,239,243,244,242,239,240,232,101,128,  1,
+     73,243,241,245,225,242,101,128, 51,129, 98,  2,136, 96,136,106,
+    239,240,239,237,239,230,111,128, 49, 11,243,240,225,227,101,128,
+      0,160, 99,  4,136,124,136,131,136,140,136,167,225,242,239,110,
+    128,  1, 72,229,228,233,236,236, 97,128,  1, 70,233,242, 99,  2,
+    136,148,136,153,236,101,128, 36,221,245,237,230,236,229,248,226,
+    229,236,239,119,128, 30, 75,239,237,237,225,225,227,227,229,238,
+    116,128,  1, 70,228,239,116,  2,136,188,136,197,225,227,227,229,
+    238,116,128, 30, 69,226,229,236,239,119,128, 30, 71,101,  3,136,
+    213,136,224,136,249,232,233,242,225,231,225,238, 97,128, 48,109,
+    235,225,244,225,235,225,238, 97,129, 48,205,136,237,232,225,236,
+    230,247,233,228,244,104,128,255,136,247,243,232,229,241,229,236,
+    243,233,231,110,128, 32,170,230,243,241,245,225,242,101,128, 51,
+    139,103,  2,137, 23,137, 73, 97,  3,137, 31,137, 41,137, 48,226,
+    229,238,231,225,236,105,128,  9,153,228,229,246, 97,128,  9, 25,
+    231,117,  2,137, 55,137, 64,234,225,242,225,244,105,128, 10,153,
+    242,237,245,235,232,105,128, 10, 25,239,238,231,245,244,232,225,
+    105,128, 14,  7,104,  2,137, 90,137,100,233,242,225,231,225,238,
+     97,128, 48,147,239,239,107,  2,137,108,137,115,236,229,230,116,
+    128,  2,114,242,229,244,242,239,230,236,229,120,128,  2,115,105,
+      4,137,137,138, 50,138, 61,138,119,229,245,110,  7,137,155,137,
+    190,137,222,137,236,137,245,138, 22,138, 35, 97,  2,137,161,137,
+    176,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,111,
+    240,225,242,229,238,235,239,242,229,225,110,128, 50, 15,227,105,
+      2,137,197,137,209,229,245,227,235,239,242,229,225,110,128, 49,
+     53,242,227,236,229,235,239,242,229,225,110,128, 50, 97,232,233,
+    229,245,232,235,239,242,229,225,110,128, 49, 54,235,239,242,229,
+    225,110,128, 49, 52,240, 97,  2,137,252,138, 10,238,243,233,239,
+    243,235,239,242,229,225,110,128, 49,104,242,229,238,235,239,242,
+    229,225,110,128, 50,  1,243,233,239,243,235,239,242,229,225,110,
+    128, 49,103,244,233,235,229,245,244,235,239,242,229,225,110,128,
+     49,102,232,233,242,225,231,225,238, 97,128, 48,107,107,  2,138,
+     67,138, 91,225,244,225,235,225,238, 97,129, 48,203,138, 79,232,
+    225,236,230,247,233,228,244,104,128,255,134,232,225,232,233,116,
+      2,138,101,138,112,236,229,230,244,244,232,225,105,128,248,153,
+    244,232,225,105,128, 14, 77,238,101,141,  0, 57,138,150,138,159,
+    138,169,138,199,138,206,138,231,139,  2,139, 36,139, 48,139, 59,
+    139, 92,139,100,139,111,225,242,225,226,233, 99,128,  6,105,226,
+    229,238,231,225,236,105,128,  9,239,227,233,242,227,236,101,129,
+     36,104,138,180,233,238,246,229,242,243,229,243,225,238,243,243,
+    229,242,233,102,128, 39,146,228,229,246, 97,128,  9,111,231,117,
+      2,138,213,138,222,234,225,242,225,244,105,128, 10,239,242,237,
+    245,235,232,105,128, 10,111,232, 97,  2,138,238,138,249,227,235,
+    225,242,225,226,233, 99,128,  6,105,238,231,250,232,239,117,128,
+     48, 41,105,  2,139,  8,139, 26,228,229,239,231,242,225,240,232,
+    233,227,240,225,242,229,110,128, 50, 40,238,230,229,242,233,239,
+    114,128, 32,137,237,239,238,239,243,240,225,227,101,128,255, 25,
+    239,236,228,243,244,249,236,101,128,247, 57,112,  2,139, 65,139,
+     72,225,242,229,110,128, 36,124,229,114,  2,139, 79,139, 85,233,
+    239,100,128, 36,144,243,233,225,110,128,  6,249,242,239,237,225,
+    110,128, 33,120,243,245,240,229,242,233,239,114,128, 32,121,116,
+      2,139,117,139,155,229,229,110,  2,139,125,139,134,227,233,242,
+    227,236,101,128, 36,114,112,  2,139,140,139,147,225,242,229,110,
+    128, 36,134,229,242,233,239,100,128, 36,154,232,225,105,128, 14,
+     89,106,129,  1,204,139,167,229,227,249,242,233,236,236,233, 99,
+    128,  4, 90,235,225,244,225,235,225,238, 97,129, 48,243,139,192,
+    232,225,236,230,247,233,228,244,104,128,255,157,108,  2,139,210,
+    139,224,229,231,242,233,231,232,244,236,239,238,103,128,  1,158,
+    233,238,229,226,229,236,239,119,128, 30, 73,109,  2,139,241,139,
+    252,239,238,239,243,240,225,227,101,128,255, 78,243,241,245,225,
+    242,101,128, 51,154,110,  2,140, 11,140, 61, 97,  3,140, 19,140,
+     29,140, 36,226,229,238,231,225,236,105,128,  9,163,228,229,246,
+     97,128,  9, 35,231,117,  2,140, 43,140, 52,234,225,242,225,244,
+    105,128, 10,163,242,237,245,235,232,105,128, 10, 35,238,225,228,
+    229,246, 97,128,  9, 41,111,  6,140, 84,140, 95,140,120,140,161,
+    141,113,142, 40,232,233,242,225,231,225,238, 97,128, 48,110,235,
+    225,244,225,235,225,238, 97,129, 48,206,140,108,232,225,236,230,
+    247,233,228,244,104,128,255,137,110,  3,140,128,140,144,140,153,
+    226,242,229,225,235,233,238,231,243,240,225,227,101,128,  0,160,
+    229,238,244,232,225,105,128, 14, 19,245,244,232,225,105,128, 14,
+     25,239,110,  7,140,178,140,187,140,201,140,235,140,251,141, 36,
+    141, 95,225,242,225,226,233, 99,128,  6, 70,230,233,238,225,236,
+    225,242,225,226,233, 99,128,254,230,231,232,245,238,238, 97,  2,
+    140,212,140,221,225,242,225,226,233, 99,128,  6,186,230,233,238,
+    225,236,225,242,225,226,233, 99,128,251,159,233,238,233,244,233,
+    225,236,225,242,225,226,233, 99,128,254,231,234,229,229,237,105,
+      2,141,  5,141, 20,238,233,244,233,225,236,225,242,225,226,233,
+     99,128,252,210,243,239,236,225,244,229,228,225,242,225,226,233,
+     99,128,252, 75,237,101,  2,141, 43,141, 56,228,233,225,236,225,
+    242,225,226,233, 99,128,254,232,229,237,105,  2,141, 64,141, 79,
+    238,233,244,233,225,236,225,242,225,226,233, 99,128,252,213,243,
+    239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 78,238,
+    239,239,238,230,233,238,225,236,225,242,225,226,233, 99,128,252,
+    141,116,  7,141,129,141,140,141,169,141,204,141,216,141,236,142,
+      6,227,239,238,244,225,233,238,115,128, 34, 12,101,  2,141,146,
+    141,162,236,229,237,229,238,116,129, 34,  9,141,157,239,102,128,
+     34,  9,241,245,225,108,128, 34, 96,231,242,229,225,244,229,114,
+    129, 34,111,141,181,238,239,114,  2,141,189,141,197,229,241,245,
+    225,108,128, 34,113,236,229,243,115,128, 34,121,233,228,229,238,
+    244,233,227,225,108,128, 34, 98,236,229,243,115,129, 34,110,141,
+    225,238,239,242,229,241,245,225,108,128, 34,112,112,  2,141,242,
+    141,252,225,242,225,236,236,229,108,128, 34, 38,242,229,227,229,
+    228,229,115,128, 34,128,243,117,  3,142, 15,142, 22,142, 31,226,
+    243,229,116,128, 34,132,227,227,229,229,228,115,128, 34,129,240,
+    229,242,243,229,116,128, 34,133,247,225,242,237,229,238,233,225,
+    110,128,  5,118,240,225,242,229,110,128, 36,169,115,  2,142, 66,
+    142, 75,243,241,245,225,242,101,128, 51,177,245,240,229,242,233,
+    239,114,128, 32,127,244,233,236,228,101,128,  0,241,117,132,  3,
+    189,142,105,142,116,142,197,143, 24,232,233,242,225,231,225,238,
+     97,128, 48,108,107,  2,142,122,142,146,225,244,225,235,225,238,
+     97,129, 48,204,142,134,232,225,236,230,247,233,228,244,104,128,
+    255,135,244, 97,  3,142,155,142,165,142,172,226,229,238,231,225,
+    236,105,128,  9,188,228,229,246, 97,128,  9, 60,231,117,  2,142,
+    179,142,188,234,225,242,225,244,105,128, 10,188,242,237,245,235,
+    232,105,128, 10, 60,109,  2,142,203,142,237,226,229,242,243,233,
+    231,110,130,  0, 35,142,217,142,229,237,239,238,239,243,240,225,
+    227,101,128,255,  3,243,237,225,236,108,128,254, 95,229,114,  2,
+    142,244,143, 20,225,236,243,233,231,110,  2,142,255,143,  7,231,
+    242,229,229,107,128,  3,116,236,239,247,229,242,231,242,229,229,
+    107,128,  3,117,111,128, 33, 22,110,130,  5,224,143, 32,143, 52,
+    228,225,231,229,243,104,129,251, 64,143, 43,232,229,226,242,229,
+    119,128,251, 64,232,229,226,242,229,119,128,  5,224,246,243,241,
+    245,225,242,101,128, 51,181,247,243,241,245,225,242,101,128, 51,
+    187,249, 97,  3,143, 90,143,100,143,107,226,229,238,231,225,236,
+    105,128,  9,158,228,229,246, 97,128,  9, 30,231,117,  2,143,114,
+    143,123,234,225,242,225,244,105,128, 10,158,242,237,245,235,232,
+    105,128, 10, 30,111,147,  0,111,143,174,143,196,144, 18,144,188,
+    145,  4,145, 19,145, 59,145,182,145,203,145,241,145,252,146,174,
+    148,  8,148, 72,148,105,148,151,149, 24,149, 71,149, 83, 97,  2,
+    143,180,143,187,227,245,244,101,128,  0,243,238,231,244,232,225,
+    105,128, 14, 45, 98,  4,143,206,143,248,144,  1,144, 11,225,242,
+    242,229,100,130,  2,117,143,218,143,229,227,249,242,233,236,236,
+    233, 99,128,  4,233,228,233,229,242,229,243,233,243,227,249,242,
+    233,236,236,233, 99,128,  4,235,229,238,231,225,236,105,128,  9,
+    147,239,240,239,237,239,230,111,128, 49, 27,242,229,246,101,128,
+      1, 79, 99,  3,144, 26,144, 99,144,178, 97,  2,144, 32,144, 93,
+    238,228,242, 97,  3,144, 43,144, 50,144, 61,228,229,246, 97,128,
+      9, 17,231,245,234,225,242,225,244,105,128, 10,145,246,239,247,
+    229,236,243,233,231,110,  2,144, 75,144, 82,228,229,246, 97,128,
+      9, 73,231,245,234,225,242,225,244,105,128, 10,201,242,239,110,
+    128,  1,210,233,242, 99,  2,144,107,144,112,236,101,128, 36,222,
+    245,237,230,236,229,120,133,  0,244,144,131,144,139,144,150,144,
+    158,144,170,225,227,245,244,101,128, 30,209,228,239,244,226,229,
+    236,239,119,128, 30,217,231,242,225,246,101,128, 30,211,232,239,
+    239,235,225,226,239,246,101,128, 30,213,244,233,236,228,101,128,
+     30,215,249,242,233,236,236,233, 99,128,  4, 62,100,  4,144,198,
+    144,221,144,227,144,250,226,108,  2,144,205,144,213,225,227,245,
+    244,101,128,  1, 81,231,242,225,246,101,128,  2, 13,229,246, 97,
+    128,  9, 19,233,229,242,229,243,233,115,129,  0,246,144,239,227,
+    249,242,233,236,236,233, 99,128,  4,231,239,244,226,229,236,239,
+    119,128, 30,205,101,129,  1, 83,145, 10,235,239,242,229,225,110,
+    128, 49, 90,103,  3,145, 27,145, 42,145, 49,239,238,229,107,129,
+      2,219,145, 36,227,237, 98,128,  3, 40,242,225,246,101,128,  0,
+    242,245,234,225,242,225,244,105,128, 10,147,104,  4,145, 69,145,
+     80,145, 90,145,168,225,242,237,229,238,233,225,110,128,  5,133,
+    233,242,225,231,225,238, 97,128, 48, 74,111,  2,145, 96,145,106,
+    239,235,225,226,239,246,101,128, 30,207,242,110,133,  1,161,145,
+    121,145,129,145,140,145,148,145,160,225,227,245,244,101,128, 30,
+    219,228,239,244,226,229,236,239,119,128, 30,227,231,242,225,246,
+    101,128, 30,221,232,239,239,235,225,226,239,246,101,128, 30,223,
+    244,233,236,228,101,128, 30,225,245,238,231,225,242,245,237,236,
+    225,245,116,128,  1, 81,105,129,  1,163,145,188,238,246,229,242,
+    244,229,228,226,242,229,246,101,128,  2, 15,107,  2,145,209,145,
+    233,225,244,225,235,225,238, 97,129, 48,170,145,221,232,225,236,
+    230,247,233,228,244,104,128,255,117,239,242,229,225,110,128, 49,
+     87,236,229,232,229,226,242,229,119,128,  5,171,109,  6,146, 10,
+    146, 38,146, 45,146,134,146,145,146,163,225,227,242,239,110,130,
+      1, 77,146, 22,146, 30,225,227,245,244,101,128, 30, 83,231,242,
+    225,246,101,128, 30, 81,228,229,246, 97,128,  9, 80,229,231, 97,
+    133,  3,201,146, 61,146, 65,146, 76,146, 90,146,106, 49,128,  3,
+    214,227,249,242,233,236,236,233, 99,128,  4, 97,236,225,244,233,
+    238,227,236,239,243,229,100,128,  2,119,242,239,245,238,228,227,
+    249,242,233,236,236,233, 99,128,  4,123,116,  2,146,112,146,127,
+    233,244,236,239,227,249,242,233,236,236,233, 99,128,  4,125,239,
+    238,239,115,128,  3,206,231,245,234,225,242,225,244,105,128, 10,
+    208,233,227,242,239,110,129,  3,191,146,155,244,239,238,239,115,
+    128,  3,204,239,238,239,243,240,225,227,101,128,255, 79,238,101,
+    145,  0, 49,146,213,146,222,146,232,147,  6,147, 31,147, 40,147,
+     49,147, 74,147,108,147,142,147,154,147,173,147,184,147,217,147,
+    227,147,235,147,246,225,242,225,226,233, 99,128,  6, 97,226,229,
+    238,231,225,236,105,128,  9,231,227,233,242,227,236,101,129, 36,
+     96,146,243,233,238,246,229,242,243,229,243,225,238,243,243,229,
+    242,233,102,128, 39,138,100,  2,147, 12,147, 18,229,246, 97,128,
+      9,103,239,244,229,238,236,229,225,228,229,114,128, 32, 36,229,
+    233,231,232,244,104,128, 33, 91,230,233,244,244,229,100,128,246,
+    220,231,117,  2,147, 56,147, 65,234,225,242,225,244,105,128, 10,
+    231,242,237,245,235,232,105,128, 10,103,232, 97,  3,147, 83,147,
+     94,147, 99,227,235,225,242,225,226,233, 99,128,  6, 97,236,102,
+    128,  0,189,238,231,250,232,239,117,128, 48, 33,105,  2,147,114,
+    147,132,228,229,239,231,242,225,240,232,233,227,240,225,242,229,
+    110,128, 50, 32,238,230,229,242,233,239,114,128, 32,129,237,239,
+    238,239,243,240,225,227,101,128,255, 17,238,245,237,229,242,225,
+    244,239,242,226,229,238,231,225,236,105,128,  9,244,239,236,228,
+    243,244,249,236,101,128,247, 49,112,  2,147,190,147,197,225,242,
+    229,110,128, 36,116,229,114,  2,147,204,147,210,233,239,100,128,
+     36,136,243,233,225,110,128,  6,241,241,245,225,242,244,229,114,
+    128,  0,188,242,239,237,225,110,128, 33,112,243,245,240,229,242,
+    233,239,114,128,  0,185,244,104,  2,147,253,148,  2,225,105,128,
+     14, 81,233,242,100,128, 33, 83,111,  3,148, 16,148, 50,148, 66,
+    103,  2,148, 22,148, 40,239,238,229,107,129,  1,235,148, 31,237,
+    225,227,242,239,110,128,  1,237,245,242,237,245,235,232,105,128,
+     10, 19,237,225,244,242,225,231,245,242,237,245,235,232,105,128,
+     10, 75,240,229,110,128,  2, 84,112,  3,148, 80,148, 87,148, 98,
+    225,242,229,110,128, 36,170,229,238,226,245,236,236,229,116,128,
+     37,230,244,233,239,110,128, 35, 37,114,  2,148,111,148,140,100,
+      2,148,117,148,128,230,229,237,233,238,233,238,101,128,  0,170,
+    237,225,243,227,245,236,233,238,101,128,  0,186,244,232,239,231,
+    239,238,225,108,128, 34, 31,115,  5,148,163,148,195,148,212,149,
+      1,149, 14,232,239,242,116,  2,148,172,148,179,228,229,246, 97,
+    128,  9, 18,246,239,247,229,236,243,233,231,238,228,229,246, 97,
+    128,  9, 74,236,225,243,104,129,  0,248,148,204,225,227,245,244,
+    101,128,  1,255,237,225,236,108,  2,148,221,148,232,232,233,242,
+    225,231,225,238, 97,128, 48, 73,235,225,244,225,235,225,238, 97,
+    129, 48,169,148,245,232,225,236,230,247,233,228,244,104,128,255,
+    107,244,242,239,235,229,225,227,245,244,101,128,  1,255,245,240,
+    229,242,233,239,114,128,246,240,116,  2,149, 30,149, 41,227,249,
+    242,233,236,236,233, 99,128,  4,127,233,236,228,101,130,  0,245,
+    149, 52,149, 60,225,227,245,244,101,128, 30, 77,228,233,229,242,
+    229,243,233,115,128, 30, 79,245,226,239,240,239,237,239,230,111,
+    128, 49, 33,118,  2,149, 89,149,170,229,114,  2,149, 96,149,162,
+    236,233,238,101,131, 32, 62,149,109,149,132,149,155, 99,  2,149,
+    115,149,127,229,238,244,229,242,236,233,238,101,128,254, 74,237,
+     98,128,  3,  5,100,  2,149,138,149,146,225,243,232,229,100,128,
+    254, 73,226,236,247,225,246,121,128,254, 76,247,225,246,121,128,
+    254, 75,243,227,239,242,101,128,  0,175,239,247,229,236,243,233,
+    231,110,  3,149,185,149,195,149,202,226,229,238,231,225,236,105,
+    128,  9,203,228,229,246, 97,128,  9, 75,231,245,234,225,242,225,
+    244,105,128, 10,203,112,145,  0,112,149,251,152,123,152,134,152,
+    143,152,155,154, 80,154, 90,155, 82,156,101,156,191,156,217,157,
+     92,157,100,158,  2,158, 60,158, 88,158, 98, 97, 14,150, 25,150,
+     57,150, 67,150, 74,150, 81,150,129,150,140,150,154,150,165,150,
+    212,150,226,151,238,152, 21,152,111, 97,  2,150, 31,150, 43,237,
+    240,243,243,241,245,225,242,101,128, 51,128,243,229,238,244,239,
+    243,241,245,225,242,101,128, 51, 43,226,229,238,231,225,236,105,
+    128,  9,170,227,245,244,101,128, 30, 85,228,229,246, 97,128,  9,
+     42,103,  2,150, 87,150,105,101,  2,150, 93,150,100,228,239,247,
+    110,128, 33,223,245,112,128, 33,222,117,  2,150,111,150,120,234,
+    225,242,225,244,105,128, 10,170,242,237,245,235,232,105,128, 10,
+     42,232,233,242,225,231,225,238, 97,128, 48,113,233,249,225,238,
+    238,239,233,244,232,225,105,128, 14, 47,235,225,244,225,235,225,
+    238, 97,128, 48,209,108,  2,150,171,150,196,225,244,225,236,233,
+    250,225,244,233,239,238,227,249,242,233,236,236,233,227,227,237,
+     98,128,  4,132,239,227,232,235,225,227,249,242,233,236,236,233,
+     99,128,  4,192,238,243,233,239,243,235,239,242,229,225,110,128,
+     49,127,114,  3,150,234,150,255,151,227, 97,  2,150,240,150,248,
+    231,242,225,240,104,128,  0,182,236,236,229,108,128, 34, 37,229,
+    110,  2,151,  6,151,116,236,229,230,116,136,  0, 40,151, 29,151,
+     44,151, 49,151, 54,151, 65,151, 77,151,100,151,105,225,236,244,
+    239,238,229,225,242,225,226,233, 99,128,253, 62,226,116,128,248,
+    237,229,120,128,248,236,233,238,230,229,242,233,239,114,128, 32,
+    141,237,239,238,239,243,240,225,227,101,128,255,  8,115,  2,151,
+     83,151, 90,237,225,236,108,128,254, 89,245,240,229,242,233,239,
+    114,128, 32,125,244,112,128,248,235,246,229,242,244,233,227,225,
+    108,128,254, 53,242,233,231,232,116,136,  0, 41,151,140,151,155,
+    151,160,151,165,151,176,151,188,151,211,151,216,225,236,244,239,
+    238,229,225,242,225,226,233, 99,128,253, 63,226,116,128,248,248,
+    229,120,128,248,247,233,238,230,229,242,233,239,114,128, 32,142,
+    237,239,238,239,243,240,225,227,101,128,255,  9,115,  2,151,194,
+    151,201,237,225,236,108,128,254, 90,245,240,229,242,233,239,114,
+    128, 32,126,244,112,128,248,246,246,229,242,244,233,227,225,108,
+    128,254, 54,244,233,225,236,228,233,230,102,128, 34,  2,115,  3,
+    151,246,152,  1,152, 13,229,241,232,229,226,242,229,119,128,  5,
+    192,232,244,225,232,229,226,242,229,119,128,  5,153,241,245,225,
+    242,101,128, 51,169,244,225,104,134,  5,183,152, 39,152, 53,152,
+     58,152, 67,152, 82,152, 98, 49,  2,152, 45,152, 49, 49,128,  5,
+    183,100,128,  5,183,178, 97,128,  5,183,232,229,226,242,229,119,
+    128,  5,183,238,225,242,242,239,247,232,229,226,242,229,119,128,
+      5,183,241,245,225,242,244,229,242,232,229,226,242,229,119,128,
+      5,183,247,233,228,229,232,229,226,242,229,119,128,  5,183,250,
+    229,242,232,229,226,242,229,119,128,  5,161,226,239,240,239,237,
+    239,230,111,128, 49,  6,227,233,242,227,236,101,128, 36,223,228,
+    239,244,225,227,227,229,238,116,128, 30, 87,101,137,  5,228,152,
+    177,152,188,152,208,152,220,152,240,153, 86,153, 97,153,118,154,
+     73,227,249,242,233,236,236,233, 99,128,  4, 63,228,225,231,229,
+    243,104,129,251, 68,152,199,232,229,226,242,229,119,128,251, 68,
+    229,250,233,243,241,245,225,242,101,128, 51, 59,230,233,238,225,
+    236,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 67,
+    104,  5,152,252,153, 19,153, 27,153, 41,153, 71,225,114,  2,153,
+      3,153, 10,225,226,233, 99,128,  6,126,237,229,238,233,225,110,
+    128,  5,122,229,226,242,229,119,128,  5,228,230,233,238,225,236,
+    225,242,225,226,233, 99,128,251, 87,105,  2,153, 47,153, 62,238,
+    233,244,233,225,236,225,242,225,226,233, 99,128,251, 88,242,225,
+    231,225,238, 97,128, 48,122,237,229,228,233,225,236,225,242,225,
+    226,233, 99,128,251, 89,235,225,244,225,235,225,238, 97,128, 48,
+    218,237,233,228,228,236,229,232,239,239,235,227,249,242,233,236,
+    236,233, 99,128,  4,167,114,  5,153,130,153,142,153,184,154, 49,
+    154, 62,225,230,229,232,229,226,242,229,119,128,251, 78,227,229,
+    238,116,131,  0, 37,153,155,153,164,153,176,225,242,225,226,233,
+     99,128,  6,106,237,239,238,239,243,240,225,227,101,128,255,  5,
+    243,237,225,236,108,128,254,106,105,  2,153,190,154, 31,239,100,
+    134,  0, 46,153,207,153,218,153,229,153,241,153,252,154,  8,225,
+    242,237,229,238,233,225,110,128,  5,137,227,229,238,244,229,242,
+    229,100,128,  0,183,232,225,236,230,247,233,228,244,104,128,255,
+     97,233,238,230,229,242,233,239,114,128,246,231,237,239,238,239,
+    243,240,225,227,101,128,255, 14,115,  2,154, 14,154, 21,237,225,
+    236,108,128,254, 82,245,240,229,242,233,239,114,128,246,232,243,
+    240,239,237,229,238,233,231,242,229,229,235,227,237, 98,128,  3,
+     66,240,229,238,228,233,227,245,236,225,114,128, 34,165,244,232,
+    239,245,243,225,238,100,128, 32, 48,243,229,244, 97,128, 32,167,
+    230,243,241,245,225,242,101,128, 51,138,104,  3,154, 98,154,148,
+    155, 29, 97,  3,154,106,154,116,154,123,226,229,238,231,225,236,
+    105,128,  9,171,228,229,246, 97,128,  9, 43,231,117,  2,154,130,
+    154,139,234,225,242,225,244,105,128, 10,171,242,237,245,235,232,
+    105,128, 10, 43,105,133,  3,198,154,162,154,166,154,252,155,  4,
+    155, 15, 49,128,  3,213,229,245,240,104,  4,154,179,154,214,154,
+    229,154,238, 97,  2,154,185,154,200,227,233,242,227,236,229,235,
+    239,242,229,225,110,128, 50,122,240,225,242,229,238,235,239,242,
+    229,225,110,128, 50, 26,227,233,242,227,236,229,235,239,242,229,
+    225,110,128, 50,108,235,239,242,229,225,110,128, 49, 77,240,225,
+    242,229,238,235,239,242,229,225,110,128, 50, 12,236,225,244,233,
+    110,128,  2,120,238,244,232,245,244,232,225,105,128, 14, 58,243,
+    249,237,226,239,236,231,242,229,229,107,128,  3,213,111,  3,155,
+     37,155, 42,155, 68,239,107,128,  1,165,240,104,  2,155, 49,155,
+     58,225,238,244,232,225,105,128, 14, 30,245,238,231,244,232,225,
+    105,128, 14, 28,243,225,237,240,232,225,239,244,232,225,105,128,
+     14, 32,105,133,  3,192,155, 96,156, 52,156, 63,156, 74,156, 88,
+    229,245,112,  6,155,112,155,147,155,179,155,207,155,221,156, 17,
+     97,  2,155,118,155,133,227,233,242,227,236,229,235,239,242,229,
+    225,110,128, 50,115,240,225,242,229,238,235,239,242,229,225,110,
+    128, 50, 19,227,105,  2,155,154,155,166,229,245,227,235,239,242,
+    229,225,110,128, 49,118,242,227,236,229,235,239,242,229,225,110,
+    128, 50,101,107,  2,155,185,155,199,233,249,229,239,235,235,239,
+    242,229,225,110,128, 49,114,239,242,229,225,110,128, 49, 66,240,
+    225,242,229,238,235,239,242,229,225,110,128, 50,  5,243,233,239,
+    115,  2,155,230,156,  2,107,  2,155,236,155,250,233,249,229,239,
+    235,235,239,242,229,225,110,128, 49,116,239,242,229,225,110,128,
+     49, 68,244,233,235,229,245,244,235,239,242,229,225,110,128, 49,
+    117,116,  2,156, 23,156, 38,232,233,229,245,244,232,235,239,242,
+    229,225,110,128, 49,119,233,235,229,245,244,235,239,242,229,225,
+    110,128, 49,115,232,233,242,225,231,225,238, 97,128, 48,116,235,
+    225,244,225,235,225,238, 97,128, 48,212,243,249,237,226,239,236,
+    231,242,229,229,107,128,  3,214,247,242,225,242,237,229,238,233,
+    225,110,128,  5,131,236,245,115,132,  0, 43,156,115,156,126,156,
+    135,156,168,226,229,236,239,247,227,237, 98,128,  3, 31,227,233,
+    242,227,236,101,128, 34,149,109,  2,156,141,156,148,233,238,245,
+    115,128,  0,177,111,  2,156,154,156,158,100,128,  2,214,238,239,
+    243,240,225,227,101,128,255, 11,115,  2,156,174,156,181,237,225,
+    236,108,128,254, 98,245,240,229,242,233,239,114,128, 32,122,109,
+      2,156,197,156,208,239,238,239,243,240,225,227,101,128,255, 80,
+    243,241,245,225,242,101,128, 51,216,111,  5,156,229,156,240,157,
+     51,157, 62,157, 72,232,233,242,225,231,225,238, 97,128, 48,125,
+    233,238,244,233,238,231,233,238,228,229,120,  4,157,  4,157, 16,
+    157, 28,157, 41,228,239,247,238,247,232,233,244,101,128, 38, 31,
+    236,229,230,244,247,232,233,244,101,128, 38, 28,242,233,231,232,
+    244,247,232,233,244,101,128, 38, 30,245,240,247,232,233,244,101,
+    128, 38, 29,235,225,244,225,235,225,238, 97,128, 48,221,240,236,
+    225,244,232,225,105,128, 14, 27,243,244,225,236,237,225,242,107,
+    129, 48, 18,157, 85,230,225,227,101,128, 48, 32,240,225,242,229,
+    110,128, 36,171,114,  3,157,108,157,134,157,159,101,  2,157,114,
+    157,122,227,229,228,229,115,128, 34,122,243,227,242,233,240,244,
+    233,239,110,128, 33, 30,233,237,101,  2,157,142,157,148,237,239,
+    100,128,  2,185,242,229,246,229,242,243,229,100,128, 32, 53,111,
+      4,157,169,157,176,157,186,157,199,228,245,227,116,128, 34, 15,
+    234,229,227,244,233,246,101,128, 35,  5,236,239,238,231,229,228,
+    235,225,238, 97,128, 48,252,112,  2,157,205,157,242,101,  2,157,
+    211,157,218,236,236,239,114,128, 35, 24,242,243,117,  2,157,226,
+    157,233,226,243,229,116,128, 34,130,240,229,242,243,229,116,128,
+     34,131,239,242,244,233,239,110,129, 34, 55,157,253,225,108,128,
+     34, 29,115,  2,158,  8,158, 51,105,130,  3,200,158, 16,158, 27,
+    227,249,242,233,236,236,233, 99,128,  4,113,236,233,240,238,229,
+    245,237,225,244,225,227,249,242,233,236,236,233,227,227,237, 98,
+    128,  4,134,243,241,245,225,242,101,128, 51,176,117,  2,158, 66,
+    158, 77,232,233,242,225,231,225,238, 97,128, 48,119,235,225,244,
+    225,235,225,238, 97,128, 48,215,246,243,241,245,225,242,101,128,
+     51,180,247,243,241,245,225,242,101,128, 51,186,113,136,  0,113,
+    158,128,159,177,159,188,159,197,159,204,159,216,159,254,160,  6,
+     97,  4,158,138,158,161,158,225,159,160,100,  2,158,144,158,150,
+    229,246, 97,128,  9, 88,237,225,232,229,226,242,229,119,128,  5,
+    168,102,  4,158,171,158,180,158,194,158,210,225,242,225,226,233,
+     99,128,  6, 66,230,233,238,225,236,225,242,225,226,233, 99,128,
+    254,214,233,238,233,244,233,225,236,225,242,225,226,233, 99,128,
+    254,215,237,229,228,233,225,236,225,242,225,226,233, 99,128,254,
+    216,237,225,244,115,136,  5,184,158,248,159, 12,159, 26,159, 31,
+    159, 36,159, 45,159, 60,159,147, 49,  3,159,  0,159,  4,159,  8,
+     48,128,  5,184, 97,128,  5,184, 99,128,  5,184, 50,  2,159, 18,
+    159, 22, 55,128,  5,184, 57,128,  5,184,179, 51,128,  5,184,228,
+    101,128,  5,184,232,229,226,242,229,119,128,  5,184,238,225,242,
+    242,239,247,232,229,226,242,229,119,128,  5,184,113,  2,159, 66,
+    159,132,225,244,225,110,  4,159, 79,159, 88,159,103,159,119,232,
+    229,226,242,229,119,128,  5,184,238,225,242,242,239,247,232,229,
+    226,242,229,119,128,  5,184,241,245,225,242,244,229,242,232,229,
+    226,242,229,119,128,  5,184,247,233,228,229,232,229,226,242,229,
+    119,128,  5,184,245,225,242,244,229,242,232,229,226,242,229,119,
+    128,  5,184,247,233,228,229,232,229,226,242,229,119,128,  5,184,
+    242,238,229,249,240,225,242,225,232,229,226,242,229,119,128,  5,
+    159,226,239,240,239,237,239,230,111,128, 49, 17,227,233,242,227,
+    236,101,128, 36,224,232,239,239,107,128,  2,160,237,239,238,239,
+    243,240,225,227,101,128,255, 81,239,102,130,  5,231,159,225,159,
+    245,228,225,231,229,243,104,129,251, 71,159,236,232,229,226,242,
+    229,119,128,251, 71,232,229,226,242,229,119,128,  5,231,240,225,
+    242,229,110,128, 36,172,117,  4,160, 16,160, 28,160,117,160,204,
+    225,242,244,229,242,238,239,244,101,128, 38,105,226,245,244,115,
+    135,  5,187,160, 49,160, 54,160, 59,160, 64,160, 73,160, 88,160,
+    104,177, 56,128,  5,187,178, 53,128,  5,187,179, 49,128,  5,187,
+    232,229,226,242,229,119,128,  5,187,238,225,242,242,239,247,232,
+    229,226,242,229,119,128,  5,187,241,245,225,242,244,229,242,232,
+    229,226,242,229,119,128,  5,187,247,233,228,229,232,229,226,242,
+    229,119,128,  5,187,229,243,244,233,239,110,133,  0, 63,160,136,
+    160,159,160,176,160,184,160,196,225,114,  2,160,143,160,150,225,
+    226,233, 99,128,  6, 31,237,229,238,233,225,110,128,  5, 94,228,
+    239,247,110,129,  0,191,160,168,243,237,225,236,108,128,247,191,
+    231,242,229,229,107,128,  3,126,237,239,238,239,243,240,225,227,
+    101,128,255, 31,243,237,225,236,108,128,247, 63,239,244,101,  4,
+    160,216,161, 31,161, 51,161, 80,228,226,108,133,  0, 34,160,232,
+    160,239,160,246,161,  2,161, 23,226,225,243,101,128, 32, 30,236,
+    229,230,116,128, 32, 28,237,239,238,239,243,240,225,227,101,128,
+    255,  2,240,242,233,237,101,129, 48, 30,161, 12,242,229,246,229,
+    242,243,229,100,128, 48, 29,242,233,231,232,116,128, 32, 29,236,
+    229,230,116,129, 32, 24,161, 40,242,229,246,229,242,243,229,100,
+    128, 32, 27,114,  2,161, 57,161, 67,229,246,229,242,243,229,100,
+    128, 32, 27,233,231,232,116,129, 32, 25,161, 76,110,128,  1, 73,
+    243,233,238,231,108,  2,161, 90,161, 97,226,225,243,101,128, 32,
+     26,101,129,  0, 39,161,103,237,239,238,239,243,240,225,227,101,
+    128,255,  7,114,145,  0,114,161,153,162,157,162,168,162,215,163,
+     10,164, 27,164, 51,164,146,166,180,166,217,166,229,167, 27,167,
+     35,167,197,167,208,167,243,168, 87, 97, 11,161,177,161,188,161,
+    198,161,205,162, 14,162, 30,162, 55,162, 66,162, 91,162,114,162,
+    151,225,242,237,229,238,233,225,110,128,  5,124,226,229,238,231,
+    225,236,105,128,  9,176,227,245,244,101,128,  1, 85,100,  4,161,
+    215,161,221,161,235,162,  5,229,246, 97,128,  9, 48,233,227,225,
+    108,129, 34, 26,161,230,229,120,128,248,229,239,246,229,242,243,
+    243,241,245,225,242,101,129, 51,174,161,251,228,243,241,245,225,
+    242,101,128, 51,175,243,241,245,225,242,101,128, 51,173,230,101,
+    129,  5,191,162, 21,232,229,226,242,229,119,128,  5,191,231,117,
+      2,162, 37,162, 46,234,225,242,225,244,105,128, 10,176,242,237,
+    245,235,232,105,128, 10, 48,232,233,242,225,231,225,238, 97,128,
+     48,137,235,225,244,225,235,225,238, 97,129, 48,233,162, 79,232,
+    225,236,230,247,233,228,244,104,128,255,151,236,239,247,229,242,
+    228,233,225,231,239,238,225,236,226,229,238,231,225,236,105,128,
+      9,241,109,  2,162,120,162,143,233,228,228,236,229,228,233,225,
+    231,239,238,225,236,226,229,238,231,225,236,105,128,  9,240,243,
+    232,239,242,110,128,  2,100,244,233,111,128, 34, 54,226,239,240,
+    239,237,239,230,111,128, 49, 22, 99,  4,162,178,162,185,162,194,
+    162,202,225,242,239,110,128,  1, 89,229,228,233,236,236, 97,128,
+      1, 87,233,242,227,236,101,128, 36,225,239,237,237,225,225,227,
+    227,229,238,116,128,  1, 87,100,  2,162,221,162,231,226,236,231,
+    242,225,246,101,128,  2, 17,239,116,  2,162,238,162,247,225,227,
+    227,229,238,116,128, 30, 89,226,229,236,239,119,129, 30, 91,163,
+      1,237,225,227,242,239,110,128, 30, 93,101,  6,163, 24,163, 69,
+    163,104,163,159,163,184,163,217,102,  2,163, 30,163, 43,229,242,
+    229,238,227,229,237,225,242,107,128, 32, 59,236,229,248,243,117,
+      2,163, 53,163, 60,226,243,229,116,128, 34,134,240,229,242,243,
+    229,116,128, 34,135,231,233,243,244,229,114,  2,163, 80,163, 85,
+    229,100,128,  0,174,115,  2,163, 91,163, 97,225,238,115,128,248,
+    232,229,242,233,102,128,246,218,104,  3,163,112,163,135,163,149,
+    225,114,  2,163,119,163,126,225,226,233, 99,128,  6, 49,237,229,
+    238,233,225,110,128,  5,128,230,233,238,225,236,225,242,225,226,
+    233, 99,128,254,174,233,242,225,231,225,238, 97,128, 48,140,235,
+    225,244,225,235,225,238, 97,129, 48,236,163,172,232,225,236,230,
+    247,233,228,244,104,128,255,154,243,104,130,  5,232,163,193,163,
+    208,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 72,
+    232,229,226,242,229,119,128,  5,232,118,  3,163,225,163,238,164,
+     14,229,242,243,229,228,244,233,236,228,101,128, 34, 61,233, 97,
+      2,163,245,163,254,232,229,226,242,229,119,128,  5,151,237,245,
+    231,242,225,243,232,232,229,226,242,229,119,128,  5,151,236,239,
+    231,233,227,225,236,238,239,116,128, 35, 16,230,233,243,232,232,
+    239,239,107,129,  2,126,164, 40,242,229,246,229,242,243,229,100,
+    128,  2,127,104,  2,164, 57,164, 80, 97,  2,164, 63,164, 73,226,
+    229,238,231,225,236,105,128,  9,221,228,229,246, 97,128,  9, 93,
+    111,131,  3,193,164, 90,164,119,164,133,239,107,129,  2,125,164,
+     97,244,245,242,238,229,100,129,  2,123,164,108,243,245,240,229,
+    242,233,239,114,128,  2,181,243,249,237,226,239,236,231,242,229,
+    229,107,128,  3,241,244,233,227,232,239,239,235,237,239,100,128,
+      2,222,105,  6,164,160,165,204,165,250,166,  5,166, 30,166,166,
+    229,245,108,  9,164,182,164,217,164,232,164,246,165, 36,165, 50,
+    165,136,165,149,165,184, 97,  2,164,188,164,203,227,233,242,227,
+    236,229,235,239,242,229,225,110,128, 50,113,240,225,242,229,238,
+    235,239,242,229,225,110,128, 50, 17,227,233,242,227,236,229,235,
+    239,242,229,225,110,128, 50, 99,232,233,229,245,232,235,239,242,
+    229,225,110,128, 49, 64,107,  2,164,252,165, 28,233,249,229,239,
+    107,  2,165,  6,165, 15,235,239,242,229,225,110,128, 49, 58,243,
+    233,239,243,235,239,242,229,225,110,128, 49,105,239,242,229,225,
+    110,128, 49, 57,237,233,229,245,237,235,239,242,229,225,110,128,
+     49, 59,112,  3,165, 58,165, 90,165,105, 97,  2,165, 64,165, 78,
+    238,243,233,239,243,235,239,242,229,225,110,128, 49,108,242,229,
+    238,235,239,242,229,225,110,128, 50,  3,232,233,229,245,240,232,
+    235,239,242,229,225,110,128, 49, 63,233,229,245,112,  2,165,114,
+    165,123,235,239,242,229,225,110,128, 49, 60,243,233,239,243,235,
+    239,242,229,225,110,128, 49,107,243,233,239,243,235,239,242,229,
+    225,110,128, 49, 61,116,  2,165,155,165,170,232,233,229,245,244,
+    232,235,239,242,229,225,110,128, 49, 62,233,235,229,245,244,235,
+    239,242,229,225,110,128, 49,106,249,229,239,242,233,238,232,233,
+    229,245,232,235,239,242,229,225,110,128, 49,109,231,232,116,  2,
+    165,212,165,220,225,238,231,236,101,128, 34, 31,116,  2,165,226,
+    165,240,225,227,235,226,229,236,239,247,227,237, 98,128,  3, 25,
+    242,233,225,238,231,236,101,128, 34,191,232,233,242,225,231,225,
+    238, 97,128, 48,138,235,225,244,225,235,225,238, 97,129, 48,234,
+    166, 18,232,225,236,230,247,233,228,244,104,128,255,152,110,  2,
+    166, 36,166,152,103,131,  2,218,166, 46,166, 57,166, 63,226,229,
+    236,239,247,227,237, 98,128,  3, 37,227,237, 98,128,  3, 10,232,
+    225,236,102,  2,166, 72,166,118,236,229,230,116,131,  2,191,166,
+     85,166, 96,166,107,225,242,237,229,238,233,225,110,128,  5, 89,
+    226,229,236,239,247,227,237, 98,128,  3, 28,227,229,238,244,229,
+    242,229,100,128,  2,211,242,233,231,232,116,130,  2,190,166,130,
+    166,141,226,229,236,239,247,227,237, 98,128,  3, 57,227,229,238,
+    244,229,242,229,100,128,  2,210,246,229,242,244,229,228,226,242,
+    229,246,101,128,  2, 19,244,244,239,242,245,243,241,245,225,242,
+    101,128, 51, 81,108,  2,166,186,166,197,233,238,229,226,229,236,
+    239,119,128, 30, 95,239,238,231,236,229,103,129,  2,124,166,208,
+    244,245,242,238,229,100,128,  2,122,237,239,238,239,243,240,225,
+    227,101,128,255, 82,111,  3,166,237,166,248,167, 17,232,233,242,
+    225,231,225,238, 97,128, 48,141,235,225,244,225,235,225,238, 97,
+    129, 48,237,167,  5,232,225,236,230,247,233,228,244,104,128,255,
+    155,242,245,225,244,232,225,105,128, 14, 35,240,225,242,229,110,
+    128, 36,173,114,  3,167, 43,167, 79,167,109, 97,  3,167, 51,167,
+     61,167, 68,226,229,238,231,225,236,105,128,  9,220,228,229,246,
+     97,128,  9, 49,231,245,242,237,245,235,232,105,128, 10, 92,229,
+    104,  2,167, 86,167, 95,225,242,225,226,233, 99,128,  6,145,230,
+    233,238,225,236,225,242,225,226,233, 99,128,251,141,246,239,227,
+    225,236,233, 99,  4,167,125,167,135,167,142,167,153,226,229,238,
+    231,225,236,105,128,  9,224,228,229,246, 97,128,  9, 96,231,245,
+    234,225,242,225,244,105,128, 10,224,246,239,247,229,236,243,233,
+    231,110,  3,167,169,167,179,167,186,226,229,238,231,225,236,105,
+    128,  9,196,228,229,246, 97,128,  9, 68,231,245,234,225,242,225,
+    244,105,128, 10,196,243,245,240,229,242,233,239,114,128,246,241,
+    116,  2,167,214,167,222,226,236,239,227,107,128, 37,144,245,242,
+    238,229,100,129,  2,121,167,232,243,245,240,229,242,233,239,114,
+    128,  2,180,117,  4,167,253,168,  8,168, 33,168, 80,232,233,242,
+    225,231,225,238, 97,128, 48,139,235,225,244,225,235,225,238, 97,
+    129, 48,235,168, 21,232,225,236,230,247,233,228,244,104,128,255,
+    153,112,  2,168, 39,168, 74,229,101,  2,168, 46,168, 60,237,225,
+    242,235,226,229,238,231,225,236,105,128,  9,242,243,233,231,238,
+    226,229,238,231,225,236,105,128,  9,243,233,225,104,128,246,221,
+    244,232,225,105,128, 14, 36,246,239,227,225,236,233, 99,  4,168,
+    103,168,113,168,120,168,131,226,229,238,231,225,236,105,128,  9,
+    139,228,229,246, 97,128,  9, 11,231,245,234,225,242,225,244,105,
+    128, 10,139,246,239,247,229,236,243,233,231,110,  3,168,147,168,
+    157,168,164,226,229,238,231,225,236,105,128,  9,195,228,229,246,
+     97,128,  9, 67,231,245,234,225,242,225,244,105,128, 10,195,115,
+    147,  0,115,168,217,170,187,170,198,171, 68,171,107,174, 49,174,
+     60,176,203,179, 85,179,131,179,158,180, 93,180,160,181,193,181,
+    203,182,133,182,206,183,120,183,130, 97,  9,168,237,168,247,169,
+     12,169, 84,169,109,169,120,169,145,169,177,169,217,226,229,238,
+    231,225,236,105,128,  9,184,227,245,244,101,129,  1, 91,169,  0,
+    228,239,244,225,227,227,229,238,116,128, 30,101,100,  5,169, 24,
+    169, 33,169, 39,169, 53,169, 69,225,242,225,226,233, 99,128,  6,
+     53,229,246, 97,128,  9, 56,230,233,238,225,236,225,242,225,226,
+    233, 99,128,254,186,233,238,233,244,233,225,236,225,242,225,226,
+    233, 99,128,254,187,237,229,228,233,225,236,225,242,225,226,233,
+     99,128,254,188,231,117,  2,169, 91,169,100,234,225,242,225,244,
+    105,128, 10,184,242,237,245,235,232,105,128, 10, 56,232,233,242,
+    225,231,225,238, 97,128, 48, 85,235,225,244,225,235,225,238, 97,
+    129, 48,181,169,133,232,225,236,230,247,233,228,244,104,128,255,
+    123,236,236,225,236,236,225,232,239,245,225,236,225,249,232,229,
+    247,225,243,225,236,236,225,237,225,242,225,226,233, 99,128,253,
+    250,237,229,235,104,130,  5,225,169,188,169,208,228,225,231,229,
+    243,104,129,251, 65,169,199,232,229,226,242,229,119,128,251, 65,
+    232,229,226,242,229,119,128,  5,225,242, 97,  5,169,230,170, 48,
+    170, 56,170,106,170,114, 97,  5,169,242,169,250,170,  2,170, 33,
+    170, 41,225,244,232,225,105,128, 14, 50,229,244,232,225,105,128,
+     14, 65,233,237,225,233,109,  2,170, 12,170, 23,225,236,225,233,
+    244,232,225,105,128, 14, 68,245,225,238,244,232,225,105,128, 14,
+     67,237,244,232,225,105,128, 14, 51,244,232,225,105,128, 14, 48,
+    229,244,232,225,105,128, 14, 64,105,  3,170, 64,170, 88,170, 99,
+    105,  2,170, 70,170, 81,236,229,230,244,244,232,225,105,128,248,
+    134,244,232,225,105,128, 14, 53,236,229,230,244,244,232,225,105,
+    128,248,133,244,232,225,105,128, 14, 52,239,244,232,225,105,128,
+     14, 66,117,  3,170,122,170,172,170,179,101,  3,170,130,170,154,
+    170,165,101,  2,170,136,170,147,236,229,230,244,244,232,225,105,
+    128,248,136,244,232,225,105,128, 14, 55,236,229,230,244,244,232,
+    225,105,128,248,135,244,232,225,105,128, 14, 54,244,232,225,105,
+    128, 14, 56,245,244,232,225,105,128, 14, 57,226,239,240,239,237,
+    239,230,111,128, 49, 25, 99,  5,170,210,170,231,170,240,171, 33,
+    171, 55,225,242,239,110,129,  1, 97,170,219,228,239,244,225,227,
+    227,229,238,116,128, 30,103,229,228,233,236,236, 97,128,  1, 95,
+    232,247, 97,131,  2, 89,170,252,171,  7,171, 26,227,249,242,233,
+    236,236,233, 99,128,  4,217,228,233,229,242,229,243,233,243,227,
+    249,242,233,236,236,233, 99,128,  4,219,232,239,239,107,128,  2,
+     90,233,242, 99,  2,171, 41,171, 46,236,101,128, 36,226,245,237,
+    230,236,229,120,128,  1, 93,239,237,237,225,225,227,227,229,238,
+    116,128,  2, 25,228,239,116,  2,171, 76,171, 85,225,227,227,229,
+    238,116,128, 30, 97,226,229,236,239,119,129, 30, 99,171, 95,228,
+    239,244,225,227,227,229,238,116,128, 30,105,101,  9,171,127,171,
+    143,171,178,171,243,172, 90,172,117,172,142,172,223,172,250,225,
+    231,245,236,236,226,229,236,239,247,227,237, 98,128,  3, 60, 99,
+      2,171,149,171,171,239,238,100,129, 32, 51,171,157,244,239,238,
+    229,227,232,233,238,229,243,101,128,  2,202,244,233,239,110,128,
+      0,167,229,110,  4,171,189,171,198,171,212,171,228,225,242,225,
+    226,233, 99,128,  6, 51,230,233,238,225,236,225,242,225,226,233,
+     99,128,254,178,233,238,233,244,233,225,236,225,242,225,226,233,
+     99,128,254,179,237,229,228,233,225,236,225,242,225,226,233, 99,
+    128,254,180,231,239,108,135,  5,182,172,  7,172, 21,172, 26,172,
+     35,172, 50,172, 66,172, 77, 49,  2,172, 13,172, 17, 51,128,  5,
+    182,102,128,  5,182,178, 99,128,  5,182,232,229,226,242,229,119,
+    128,  5,182,238,225,242,242,239,247,232,229,226,242,229,119,128,
+      5,182,241,245,225,242,244,229,242,232,229,226,242,229,119,128,
+      5,182,244,225,232,229,226,242,229,119,128,  5,146,247,233,228,
+    229,232,229,226,242,229,119,128,  5,182,104,  2,172, 96,172,107,
+    225,242,237,229,238,233,225,110,128,  5,125,233,242,225,231,225,
+    238, 97,128, 48, 91,235,225,244,225,235,225,238, 97,129, 48,187,
+    172,130,232,225,236,230,247,233,228,244,104,128,255,126,237,105,
+      2,172,149,172,192,227,239,236,239,110,131,  0, 59,172,163,172,
+    172,172,184,225,242,225,226,233, 99,128,  6, 27,237,239,238,239,
+    243,240,225,227,101,128,255, 27,243,237,225,236,108,128,254, 84,
+    246,239,233,227,229,228,237,225,242,235,235,225,238, 97,129, 48,
+    156,172,211,232,225,236,230,247,233,228,244,104,128,255,159,238,
+    116,  2,172,230,172,240,233,243,241,245,225,242,101,128, 51, 34,
+    239,243,241,245,225,242,101,128, 51, 35,246,229,110,142,  0, 55,
+    173, 28,173, 37,173, 47,173, 77,173, 84,173, 94,173,119,173,146,
+    173,180,173,192,173,203,173,236,173,244,173,255,225,242,225,226,
+    233, 99,128,  6,103,226,229,238,231,225,236,105,128,  9,237,227,
+    233,242,227,236,101,129, 36,102,173, 58,233,238,246,229,242,243,
+    229,243,225,238,243,243,229,242,233,102,128, 39,144,228,229,246,
+     97,128,  9,109,229,233,231,232,244,232,115,128, 33, 94,231,117,
+      2,173,101,173,110,234,225,242,225,244,105,128, 10,237,242,237,
+    245,235,232,105,128, 10,109,232, 97,  2,173,126,173,137,227,235,
+    225,242,225,226,233, 99,128,  6,103,238,231,250,232,239,117,128,
+     48, 39,105,  2,173,152,173,170,228,229,239,231,242,225,240,232,
+    233,227,240,225,242,229,110,128, 50, 38,238,230,229,242,233,239,
+    114,128, 32,135,237,239,238,239,243,240,225,227,101,128,255, 23,
+    239,236,228,243,244,249,236,101,128,247, 55,112,  2,173,209,173,
+    216,225,242,229,110,128, 36,122,229,114,  2,173,223,173,229,233,
+    239,100,128, 36,142,243,233,225,110,128,  6,247,242,239,237,225,
+    110,128, 33,118,243,245,240,229,242,233,239,114,128, 32,119,116,
+      2,174,  5,174, 43,229,229,110,  2,174, 13,174, 22,227,233,242,
+    227,236,101,128, 36,112,112,  2,174, 28,174, 35,225,242,229,110,
+    128, 36,132,229,242,233,239,100,128, 36,152,232,225,105,128, 14,
+     87,230,244,232,249,240,232,229,110,128,  0,173,104,  7,174, 76,
+    175, 50,175, 61,175, 75,176, 20,176, 33,176,197, 97,  6,174, 90,
+    174,101,174,111,174,122,175,  9,175, 34,225,242,237,229,238,233,
+    225,110,128,  5,119,226,229,238,231,225,236,105,128,  9,182,227,
+    249,242,233,236,236,233, 99,128,  4, 72,100,  2,174,128,174,224,
+    228, 97,  4,174,139,174,148,174,179,174,193,225,242,225,226,233,
+     99,128,  6, 81,228,225,237,237, 97,  2,174,158,174,167,225,242,
+    225,226,233, 99,128,252, 97,244,225,238,225,242,225,226,233, 99,
+    128,252, 94,230,225,244,232,225,225,242,225,226,233, 99,128,252,
+     96,235,225,243,242, 97,  2,174,203,174,212,225,242,225,226,233,
+     99,128,252, 98,244,225,238,225,242,225,226,233, 99,128,252, 95,
+    101,132, 37,146,174,236,174,243,174,251,175,  4,228,225,242,107,
+    128, 37,147,236,233,231,232,116,128, 37,145,237,229,228,233,245,
+    109,128, 37,146,246, 97,128,  9, 54,231,117,  2,175, 16,175, 25,
+    234,225,242,225,244,105,128, 10,182,242,237,245,235,232,105,128,
+     10, 54,236,243,232,229,236,229,244,232,229,226,242,229,119,128,
+      5,147,226,239,240,239,237,239,230,111,128, 49, 21,227,232,225,
+    227,249,242,233,236,236,233, 99,128,  4, 73,101,  4,175, 85,175,
+    150,175,160,175,177,229,110,  4,175, 96,175,105,175,119,175,135,
+    225,242,225,226,233, 99,128,  6, 52,230,233,238,225,236,225,242,
+    225,226,233, 99,128,254,182,233,238,233,244,233,225,236,225,242,
+    225,226,233, 99,128,254,183,237,229,228,233,225,236,225,242,225,
+    226,233, 99,128,254,184,233,227,239,240,244,233, 99,128,  3,227,
+    241,229,108,129, 32,170,175,168,232,229,226,242,229,119,128, 32,
+    170,246, 97,134,  5,176,175,194,175,209,175,223,175,232,175,247,
+    176,  7, 49,  2,175,200,175,205,177, 53,128,  5,176, 53,128,  5,
+    176, 50,  2,175,215,175,219, 50,128,  5,176,101,128,  5,176,232,
+    229,226,242,229,119,128,  5,176,238,225,242,242,239,247,232,229,
+    226,242,229,119,128,  5,176,241,245,225,242,244,229,242,232,229,
+    226,242,229,119,128,  5,176,247,233,228,229,232,229,226,242,229,
+    119,128,  5,176,232,225,227,249,242,233,236,236,233, 99,128,  4,
+    187,105,  2,176, 39,176, 50,237,225,227,239,240,244,233, 99,128,
+      3,237,110,131,  5,233,176, 60,176,143,176,152,100,  2,176, 66,
+    176,132,225,231,229,243,104,130,251, 73,176, 78,176, 87,232,229,
+    226,242,229,119,128,251, 73,115,  2,176, 93,176,113,232,233,238,
+    228,239,116,129,251, 44,176,104,232,229,226,242,229,119,128,251,
+     44,233,238,228,239,116,129,251, 45,176,123,232,229,226,242,229,
+    119,128,251, 45,239,244,232,229,226,242,229,119,128,  5,193,232,
+    229,226,242,229,119,128,  5,233,115,  2,176,158,176,178,232,233,
+    238,228,239,116,129,251, 42,176,169,232,229,226,242,229,119,128,
+    251, 42,233,238,228,239,116,129,251, 43,176,188,232,229,226,242,
+    229,119,128,251, 43,239,239,107,128,  2,130,105,  8,176,221,177,
+      9,177, 20,177, 45,177, 75,177, 83,177, 96,178, 11,231,237, 97,
+    131,  3,195,176,233,176,237,176,245, 49,128,  3,194,230,233,238,
+    225,108,128,  3,194,236,245,238,225,244,229,243,249,237,226,239,
+    236,231,242,229,229,107,128,  3,242,232,233,242,225,231,225,238,
+     97,128, 48, 87,235,225,244,225,235,225,238, 97,129, 48,183,177,
+     33,232,225,236,230,247,233,228,244,104,128,255,124,236,245,113,
+      2,177, 53,177, 62,232,229,226,242,229,119,128,  5,189,236,229,
+    230,244,232,229,226,242,229,119,128,  5,189,237,233,236,225,114,
+    128, 34, 60,238,228,239,244,232,229,226,242,229,119,128,  5,194,
+    239,115,  6,177,111,177,146,177,178,177,206,177,220,177,252, 97,
+      2,177,117,177,132,227,233,242,227,236,229,235,239,242,229,225,
+    110,128, 50,116,240,225,242,229,238,235,239,242,229,225,110,128,
+     50, 20,227,105,  2,177,153,177,165,229,245,227,235,239,242,229,
+    225,110,128, 49,126,242,227,236,229,235,239,242,229,225,110,128,
+     50,102,107,  2,177,184,177,198,233,249,229,239,235,235,239,242,
+    229,225,110,128, 49,122,239,242,229,225,110,128, 49, 69,238,233,
+    229,245,238,235,239,242,229,225,110,128, 49,123,112,  2,177,226,
+    177,239,225,242,229,238,235,239,242,229,225,110,128, 50,  6,233,
+    229,245,240,235,239,242,229,225,110,128, 49,125,244,233,235,229,
+    245,244,235,239,242,229,225,110,128, 49,124,120,141,  0, 54,178,
+     41,178, 50,178, 60,178, 90,178, 97,178,122,178,149,178,183,178,
+    195,178,206,178,239,178,247,179,  2,225,242,225,226,233, 99,128,
+      6,102,226,229,238,231,225,236,105,128,  9,236,227,233,242,227,
+    236,101,129, 36,101,178, 71,233,238,246,229,242,243,229,243,225,
+    238,243,243,229,242,233,102,128, 39,143,228,229,246, 97,128,  9,
+    108,231,117,  2,178,104,178,113,234,225,242,225,244,105,128, 10,
+    236,242,237,245,235,232,105,128, 10,108,232, 97,  2,178,129,178,
+    140,227,235,225,242,225,226,233, 99,128,  6,102,238,231,250,232,
+    239,117,128, 48, 38,105,  2,178,155,178,173,228,229,239,231,242,
+    225,240,232,233,227,240,225,242,229,110,128, 50, 37,238,230,229,
+    242,233,239,114,128, 32,134,237,239,238,239,243,240,225,227,101,
+    128,255, 22,239,236,228,243,244,249,236,101,128,247, 54,112,  2,
+    178,212,178,219,225,242,229,110,128, 36,121,229,114,  2,178,226,
+    178,232,233,239,100,128, 36,141,243,233,225,110,128,  6,246,242,
+    239,237,225,110,128, 33,117,243,245,240,229,242,233,239,114,128,
+     32,118,116,  2,179,  8,179, 79,229,229,110,  2,179, 16,179, 58,
+     99,  2,179, 22,179, 30,233,242,227,236,101,128, 36,111,245,242,
+    242,229,238,227,249,228,229,238,239,237,233,238,225,244,239,242,
+    226,229,238,231,225,236,105,128,  9,249,112,  2,179, 64,179, 71,
+    225,242,229,110,128, 36,131,229,242,233,239,100,128, 36,151,232,
+    225,105,128, 14, 86,108,  2,179, 91,179,111,225,243,104,129,  0,
+     47,179, 99,237,239,238,239,243,240,225,227,101,128,255, 15,239,
+    238,103,129,  1,127,179,119,228,239,244,225,227,227,229,238,116,
+    128, 30,155,109,  2,179,137,179,147,233,236,229,230,225,227,101,
+    128, 38, 58,239,238,239,243,240,225,227,101,128,255, 83,111,  6,
+    179,172,179,222,179,233,180,  2,180, 47,180, 58,102,  2,179,178,
+    179,192,240,225,243,245,241,232,229,226,242,229,119,128,  5,195,
+    116,  2,179,198,179,207,232,249,240,232,229,110,128,  0,173,243,
+    233,231,238,227,249,242,233,236,236,233, 99,128,  4, 76,232,233,
+    242,225,231,225,238, 97,128, 48, 93,235,225,244,225,235,225,238,
+     97,129, 48,189,179,246,232,225,236,230,247,233,228,244,104,128,
+    255,127,236,233,228,245,115,  2,180, 12,180, 29,236,239,238,231,
+    239,246,229,242,236,225,249,227,237, 98,128,  3, 56,243,232,239,
+    242,244,239,246,229,242,236,225,249,227,237, 98,128,  3, 55,242,
+    245,243,233,244,232,225,105,128, 14, 41,115,  3,180, 66,180, 76,
+    180, 84,225,236,225,244,232,225,105,128, 14, 40,239,244,232,225,
+    105,128, 14, 11,245,225,244,232,225,105,128, 14, 42,240, 97,  3,
+    180,102,180,122,180,154,227,101,129,  0, 32,180,109,232,225,227,
+    235,225,242,225,226,233, 99,128,  0, 32,228,101,129, 38, 96,180,
+    129,243,245,233,116,  2,180,138,180,146,226,236,225,227,107,128,
+     38, 96,247,232,233,244,101,128, 38,100,242,229,110,128, 36,174,
+    241,245,225,242,101, 11,180,188,180,199,180,213,180,238,180,255,
+    181, 25,181, 40,181, 73,181,100,181,156,181,171,226,229,236,239,
+    247,227,237, 98,128,  3, 59, 99,  2,180,205,180,209, 99,128, 51,
+    196,109,128, 51,157,228,233,225,231,239,238,225,236,227,242,239,
+    243,243,232,225,244,227,232,230,233,236,108,128, 37,169,232,239,
+    242,233,250,239,238,244,225,236,230,233,236,108,128, 37,164,107,
+      2,181,  5,181,  9,103,128, 51,143,109,129, 51,158,181, 15,227,
+    225,240,233,244,225,108,128, 51,206,108,  2,181, 31,181, 35,110,
+    128, 51,209,239,103,128, 51,210,109,  4,181, 50,181, 54,181, 59,
+    181, 63,103,128, 51,142,233,108,128, 51,213,109,128, 51,156,243,
+    241,245,225,242,229,100,128, 51,161,239,242,244,232,239,231,239,
+    238,225,236,227,242,239,243,243,232,225,244,227,232,230,233,236,
+    108,128, 37,166,245,240,240,229,114,  2,181,110,181,133,236,229,
+    230,244,244,239,236,239,247,229,242,242,233,231,232,244,230,233,
+    236,108,128, 37,167,242,233,231,232,244,244,239,236,239,247,229,
+    242,236,229,230,244,230,233,236,108,128, 37,168,246,229,242,244,
+    233,227,225,236,230,233,236,108,128, 37,165,247,232,233,244,229,
+    247,233,244,232,243,237,225,236,236,226,236,225,227,107,128, 37,
+    163,242,243,241,245,225,242,101,128, 51,219,115,  2,181,209,182,
+    123, 97,  4,181,219,181,229,181,236,181,247,226,229,238,231,225,
+    236,105,128,  9,183,228,229,246, 97,128,  9, 55,231,245,234,225,
+    242,225,244,105,128, 10,183,238,103,  8,182, 10,182, 24,182, 38,
+    182, 52,182, 67,182, 81,182, 95,182,108,227,233,229,245,227,235,
+    239,242,229,225,110,128, 49, 73,232,233,229,245,232,235,239,242,
+    229,225,110,128, 49,133,233,229,245,238,231,235,239,242,229,225,
+    110,128, 49,128,235,233,249,229,239,235,235,239,242,229,225,110,
+    128, 49, 50,238,233,229,245,238,235,239,242,229,225,110,128, 49,
+    101,240,233,229,245,240,235,239,242,229,225,110,128, 49, 67,243,
+    233,239,243,235,239,242,229,225,110,128, 49, 70,244,233,235,229,
+    245,244,235,239,242,229,225,110,128, 49, 56,245,240,229,242,233,
+    239,114,128,246,242,116,  2,182,139,182,162,229,242,236,233,238,
+    103,129,  0,163,182,150,237,239,238,239,243,240,225,227,101,128,
+    255,225,242,239,235,101,  2,182,171,182,188,236,239,238,231,239,
+    246,229,242,236,225,249,227,237, 98,128,  3, 54,243,232,239,242,
+    244,239,246,229,242,236,225,249,227,237, 98,128,  3, 53,117,  7,
+    182,222,182,254,183, 20,183, 31,183, 72,183, 82,183, 86,226,243,
+    229,116,130, 34,130,182,233,182,244,238,239,244,229,241,245,225,
+    108,128, 34,138,239,242,229,241,245,225,108,128, 34,134, 99,  2,
+    183,  4,183, 12,227,229,229,228,115,128, 34,123,232,244,232,225,
+    116,128, 34, 11,232,233,242,225,231,225,238, 97,128, 48, 89,107,
+      2,183, 37,183, 61,225,244,225,235,225,238, 97,129, 48,185,183,
+     49,232,225,236,230,247,233,228,244,104,128,255,125,245,238,225,
+    242,225,226,233, 99,128,  6, 82,237,237,225,244,233,239,110,128,
+     34, 17,110,128, 38, 60,240,229,242,243,229,116,130, 34,131,183,
+     99,183,110,238,239,244,229,241,245,225,108,128, 34,139,239,242,
+    229,241,245,225,108,128, 34,135,246,243,241,245,225,242,101,128,
+     51,220,249,239,245,247,225,229,242,225,243,241,245,225,242,101,
+    128, 51,124,116,144,  0,116,183,183,184,192,184,213,185,100,185,
+    140,187,188,191, 70,192,145,192,157,192,169,193,202,193,227,194,
+     57,194,237,195,165,195,255, 97, 10,183,205,183,215,183,236,183,
+    243,184, 12,184, 90,184,107,184,132,184,146,184,150,226,229,238,
+    231,225,236,105,128,  9,164,227,107,  2,183,222,183,229,228,239,
+    247,110,128, 34,164,236,229,230,116,128, 34,163,228,229,246, 97,
+    128,  9, 36,231,117,  2,183,250,184,  3,234,225,242,225,244,105,
+    128, 10,164,242,237,245,235,232,105,128, 10, 36,104,  4,184, 22,
+    184, 31,184, 45,184, 75,225,242,225,226,233, 99,128,  6, 55,230,
+    233,238,225,236,225,242,225,226,233, 99,128,254,194,105,  2,184,
+     51,184, 66,238,233,244,233,225,236,225,242,225,226,233, 99,128,
+    254,195,242,225,231,225,238, 97,128, 48, 95,237,229,228,233,225,
+    236,225,242,225,226,233, 99,128,254,196,233,243,249,239,245,229,
+    242,225,243,241,245,225,242,101,128, 51,125,235,225,244,225,235,
+    225,238, 97,129, 48,191,184,120,232,225,236,230,247,233,228,244,
+    104,128,255,128,244,247,229,229,236,225,242,225,226,233, 99,128,
+      6, 64,117,128,  3,196,118,130,  5,234,184,158,184,183,228,225,
+    231,229,115,129,251, 74,184,168,104,129,251, 74,184,174,232,229,
+    226,242,229,119,128,251, 74,232,229,226,242,229,119,128,  5,234,
+     98,  2,184,198,184,203,225,114,128,  1,103,239,240,239,237,239,
+    230,111,128, 49, 10, 99,  6,184,227,184,234,184,241,184,250,185,
+     60,185, 87,225,242,239,110,128,  1,101,227,245,242,108,128,  2,
+    168,229,228,233,236,236, 97,128,  1, 99,232,229,104,  4,185,  6,
+    185, 15,185, 29,185, 45,225,242,225,226,233, 99,128,  6,134,230,
+    233,238,225,236,225,242,225,226,233, 99,128,251,123,233,238,233,
+    244,233,225,236,225,242,225,226,233, 99,128,251,124,237,229,228,
+    233,225,236,225,242,225,226,233, 99,128,251,125,233,242, 99,  2,
+    185, 68,185, 73,236,101,128, 36,227,245,237,230,236,229,248,226,
+    229,236,239,119,128, 30,113,239,237,237,225,225,227,227,229,238,
+    116,128,  1, 99,100,  2,185,106,185,116,233,229,242,229,243,233,
+    115,128, 30,151,239,116,  2,185,123,185,132,225,227,227,229,238,
+    116,128, 30,107,226,229,236,239,119,128, 30,109,101,  9,185,160,
+    185,171,185,191,186,201,186,226,187, 34,187,101,187,106,187,158,
+    227,249,242,233,236,236,233, 99,128,  4, 66,228,229,243,227,229,
+    238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,173,104,
+      7,185,207,185,216,185,230,186, 14,186, 44,186, 85,186,183,225,
+    242,225,226,233, 99,128,  6, 42,230,233,238,225,236,225,242,225,
+    226,233, 99,128,254,150,232,225,232,105,  2,185,239,185,254,238,
+    233,244,233,225,236,225,242,225,226,233, 99,128,252,162,243,239,
+    236,225,244,229,228,225,242,225,226,233, 99,128,252, 12,105,  2,
+    186, 20,186, 35,238,233,244,233,225,236,225,242,225,226,233, 99,
+    128,254,151,242,225,231,225,238, 97,128, 48,102,234,229,229,237,
+    105,  2,186, 54,186, 69,238,233,244,233,225,236,225,242,225,226,
+    233, 99,128,252,161,243,239,236,225,244,229,228,225,242,225,226,
+    233, 99,128,252, 11,109,  2,186, 91,186,125,225,242,226,245,244,
+     97,  2,186,102,186,111,225,242,225,226,233, 99,128,  6, 41,230,
+    233,238,225,236,225,242,225,226,233, 99,128,254,148,101,  2,186,
+    131,186,144,228,233,225,236,225,242,225,226,233, 99,128,254,152,
+    229,237,105,  2,186,152,186,167,238,233,244,233,225,236,225,242,
+    225,226,233, 99,128,252,164,243,239,236,225,244,229,228,225,242,
+    225,226,233, 99,128,252, 14,238,239,239,238,230,233,238,225,236,
+    225,242,225,226,233, 99,128,252,115,235,225,244,225,235,225,238,
+     97,129, 48,198,186,214,232,225,236,230,247,233,228,244,104,128,
+    255,131,108,  2,186,232,186,251,229,240,232,239,238,101,129, 33,
+     33,186,243,226,236,225,227,107,128, 38, 14,233,243,232, 97,  2,
+    187,  4,187, 19,231,229,228,239,236,225,232,229,226,242,229,119,
+    128,  5,160,241,229,244,225,238,225,232,229,226,242,229,119,128,
+      5,169,110,  4,187, 44,187, 53,187, 72,187, 93,227,233,242,227,
+    236,101,128, 36,105,233,228,229,239,231,242,225,240,232,233,227,
+    240,225,242,229,110,128, 50, 41,112,  2,187, 78,187, 85,225,242,
+    229,110,128, 36,125,229,242,233,239,100,128, 36,145,242,239,237,
+    225,110,128, 33,121,243,104,128,  2,167,116,131,  5,216,187,116,
+    187,136,187,145,228,225,231,229,243,104,129,251, 56,187,127,232,
+    229,226,242,229,119,128,251, 56,232,229,226,242,229,119,128,  5,
+    216,243,229,227,249,242,233,236,236,233, 99,128,  4,181,246,233,
+    114,  2,187,166,187,175,232,229,226,242,229,119,128,  5,155,236,
+    229,230,244,232,229,226,242,229,119,128,  5,155,104,  6,187,202,
+    188, 98,188,220,189, 96,190,  3,191, 60, 97,  5,187,214,187,224,
+    187,231,188,  0,188, 29,226,229,238,231,225,236,105,128,  9,165,
+    228,229,246, 97,128,  9, 37,231,117,  2,187,238,187,247,234,225,
+    242,225,244,105,128, 10,165,242,237,245,235,232,105,128, 10, 37,
+    108,  2,188,  6,188, 15,225,242,225,226,233, 99,128,  6, 48,230,
+    233,238,225,236,225,242,225,226,233, 99,128,254,172,238,244,232,
+    225,235,232,225,116,  3,188, 44,188, 75,188, 82,236,239,119,  2,
+    188, 52,188, 63,236,229,230,244,244,232,225,105,128,248,152,242,
+    233,231,232,244,244,232,225,105,128,248,151,244,232,225,105,128,
+     14, 76,245,240,240,229,242,236,229,230,244,244,232,225,105,128,
+    248,150,101,  3,188,106,188,170,188,193,104,  4,188,116,188,125,
+    188,139,188,155,225,242,225,226,233, 99,128,  6, 43,230,233,238,
+    225,236,225,242,225,226,233, 99,128,254,154,233,238,233,244,233,
+    225,236,225,242,225,226,233, 99,128,254,155,237,229,228,233,225,
+    236,225,242,225,226,233, 99,128,254,156,242,101,  2,188,177,188,
+    186,229,248,233,243,244,115,128, 34,  3,230,239,242,101,128, 34,
+     52,244, 97,130,  3,184,188,202,188,206, 49,128,  3,209,243,249,
+    237,226,239,236,231,242,229,229,107,128,  3,209,105,  2,188,226,
+    189, 56,229,245,244,104,  4,188,239,189, 18,189, 33,189, 42, 97,
+      2,188,245,189,  4,227,233,242,227,236,229,235,239,242,229,225,
+    110,128, 50,121,240,225,242,229,238,235,239,242,229,225,110,128,
+     50, 25,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,
+    107,235,239,242,229,225,110,128, 49, 76,240,225,242,229,238,235,
+    239,242,229,225,110,128, 50, 11,242,244,229,229,110,  2,189, 66,
+    189, 75,227,233,242,227,236,101,128, 36,108,112,  2,189, 81,189,
+     88,225,242,229,110,128, 36,128,229,242,233,239,100,128, 36,148,
+    111,  6,189,110,189,127,189,132,189,146,189,151,189,204,238,225,
+    238,231,237,239,238,244,232,239,244,232,225,105,128, 14, 17,239,
+    107,128,  1,173,240,232,245,244,232,225,239,244,232,225,105,128,
+     14, 18,242,110,128,  0,254,244,104,  3,189,160,189,184,189,194,
+     97,  2,189,166,189,176,232,225,238,244,232,225,105,128, 14, 23,
+    238,244,232,225,105,128, 14, 16,239,238,231,244,232,225,105,128,
+     14, 24,245,238,231,244,232,225,105,128, 14, 22,245,243,225,238,
+    100,  2,189,214,189,225,227,249,242,233,236,236,233, 99,128,  4,
+    130,243,243,229,240,225,242,225,244,239,114,  2,189,240,189,249,
+    225,242,225,226,233, 99,128,  6,108,240,229,242,243,233,225,110,
+    128,  6,108,242,229,101,144,  0, 51,190, 41,190, 50,190, 60,190,
+     90,190, 97,190,107,190,132,190,159,190,193,190,205,190,224,190,
+    235,191, 12,191, 34,191, 42,191, 53,225,242,225,226,233, 99,128,
+      6, 99,226,229,238,231,225,236,105,128,  9,233,227,233,242,227,
+    236,101,129, 36, 98,190, 71,233,238,246,229,242,243,229,243,225,
+    238,243,243,229,242,233,102,128, 39,140,228,229,246, 97,128,  9,
+    105,229,233,231,232,244,232,115,128, 33, 92,231,117,  2,190,114,
+    190,123,234,225,242,225,244,105,128, 10,233,242,237,245,235,232,
+    105,128, 10,105,232, 97,  2,190,139,190,150,227,235,225,242,225,
+    226,233, 99,128,  6, 99,238,231,250,232,239,117,128, 48, 35,105,
+      2,190,165,190,183,228,229,239,231,242,225,240,232,233,227,240,
+    225,242,229,110,128, 50, 34,238,230,229,242,233,239,114,128, 32,
+    131,237,239,238,239,243,240,225,227,101,128,255, 19,238,245,237,
+    229,242,225,244,239,242,226,229,238,231,225,236,105,128,  9,246,
+    239,236,228,243,244,249,236,101,128,247, 51,112,  2,190,241,190,
+    248,225,242,229,110,128, 36,118,229,114,  2,190,255,191,  5,233,
+    239,100,128, 36,138,243,233,225,110,128,  6,243,241,245,225,242,
+    244,229,242,115,129,  0,190,191, 25,229,237,228,225,243,104,128,
+    246,222,242,239,237,225,110,128, 33,114,243,245,240,229,242,233,
+    239,114,128,  0,179,244,232,225,105,128, 14, 83,250,243,241,245,
+    225,242,101,128, 51,148,105,  7,191, 86,191, 97,191,212,192, 54,
+    192, 66,192,115,192,132,232,233,242,225,231,225,238, 97,128, 48,
+     97,107,  2,191,103,191,127,225,244,225,235,225,238, 97,129, 48,
+    193,191,115,232,225,236,230,247,233,228,244,104,128,255,129,229,
+    245,116,  4,191,139,191,174,191,189,191,198, 97,  2,191,145,191,
+    160,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,112,
+    240,225,242,229,238,235,239,242,229,225,110,128, 50, 16,227,233,
+    242,227,236,229,235,239,242,229,225,110,128, 50, 98,235,239,242,
+    229,225,110,128, 49, 55,240,225,242,229,238,235,239,242,229,225,
+    110,128, 50,  2,236,228,101,133,  2,220,191,228,191,239,192,  0,
+    192, 12,192, 40,226,229,236,239,247,227,237, 98,128,  3, 48, 99,
+      2,191,245,191,250,237, 98,128,  3,  3,239,237, 98,128,  3,  3,
+    228,239,245,226,236,229,227,237, 98,128,  3, 96,111,  2,192, 18,
+    192, 28,240,229,242,225,244,239,114,128, 34, 60,246,229,242,236,
+    225,249,227,237, 98,128,  3, 52,246,229,242,244,233,227,225,236,
+    227,237, 98,128,  3, 62,237,229,243,227,233,242,227,236,101,128,
+     34,151,112,  2,192, 72,192,102,229,232, 97,  2,192, 80,192, 89,
+    232,229,226,242,229,119,128,  5,150,236,229,230,244,232,229,226,
+    242,229,119,128,  5,150,240,233,231,245,242,237,245,235,232,105,
+    128, 10,112,244,236,239,227,249,242,233,236,236,233,227,227,237,
+     98,128,  4,131,247,238,225,242,237,229,238,233,225,110,128,  5,
+    127,236,233,238,229,226,229,236,239,119,128, 30,111,237,239,238,
+    239,243,240,225,227,101,128,255, 84,111,  7,192,185,192,196,192,
+    207,192,232,193, 96,193,108,193,192,225,242,237,229,238,233,225,
+    110,128,  5,105,232,233,242,225,231,225,238, 97,128, 48,104,235,
+    225,244,225,235,225,238, 97,129, 48,200,192,220,232,225,236,230,
+    247,233,228,244,104,128,255,132,110,  3,192,240,193, 82,193, 87,
+    101,  4,192,250,193, 63,193, 70,193, 76,226,225,114,  4,193,  6,
+    193, 35,193, 45,193, 54,229,248,244,242, 97,  2,193, 16,193, 26,
+    232,233,231,232,237,239,100,128,  2,229,236,239,247,237,239,100,
+    128,  2,233,232,233,231,232,237,239,100,128,  2,230,236,239,247,
+    237,239,100,128,  2,232,237,233,228,237,239,100,128,  2,231,230,
+    233,246,101,128,  1,189,243,233,120,128,  1,133,244,247,111,128,
+      1,168,239,115,128,  3,132,243,241,245,225,242,101,128, 51, 39,
+    240,225,244,225,235,244,232,225,105,128, 14, 15,242,244,239,233,
+    243,229,243,232,229,236,236,226,242,225,227,235,229,116,  2,193,
+    131,193,161,236,229,230,116,130, 48, 20,193,142,193,150,243,237,
+    225,236,108,128,254, 93,246,229,242,244,233,227,225,108,128,254,
+     57,242,233,231,232,116,130, 48, 21,193,173,193,181,243,237,225,
+    236,108,128,254, 94,246,229,242,244,233,227,225,108,128,254, 58,
+    244,225,239,244,232,225,105,128, 14, 21,240, 97,  2,193,209,193,
+    221,236,225,244,225,236,232,239,239,107,128,  1,171,242,229,110,
+    128, 36,175,114,  3,193,235,194, 10,194, 25,225,228,229,237,225,
+    242,107,129, 33, 34,193,247,115,  2,193,253,194,  3,225,238,115,
+    128,248,234,229,242,233,102,128,246,219,229,244,242,239,230,236,
+    229,248,232,239,239,107,128,  2,136,233,225,103,  4,194, 37,194,
+     42,194, 47,194, 52,228,110,128, 37,188,236,102,128, 37,196,242,
+    116,128, 37,186,245,112,128, 37,178,115,132,  2,166,194, 69,194,
+    108,194,214,194,227,225,228,105,130,  5,230,194, 79,194, 99,228,
+    225,231,229,243,104,129,251, 70,194, 90,232,229,226,242,229,119,
+    128,251, 70,232,229,226,242,229,119,128,  5,230,101,  2,194,114,
+    194,125,227,249,242,233,236,236,233, 99,128,  4, 70,242,101,134,
+      5,181,194,142,194,156,194,161,194,170,194,185,194,201, 49,  2,
+    194,148,194,152, 50,128,  5,181,101,128,  5,181,178, 98,128,  5,
+    181,232,229,226,242,229,119,128,  5,181,238,225,242,242,239,247,
+    232,229,226,242,229,119,128,  5,181,241,245,225,242,244,229,242,
+    232,229,226,242,229,119,128,  5,181,247,233,228,229,232,229,226,
+    242,229,119,128,  5,181,232,229,227,249,242,233,236,236,233, 99,
+    128,  4, 91,245,240,229,242,233,239,114,128,246,243,116,  4,194,
+    247,195, 41,195,106,195,157, 97,  3,194,255,195,  9,195, 16,226,
+    229,238,231,225,236,105,128,  9,159,228,229,246, 97,128,  9, 31,
+    231,117,  2,195, 23,195, 32,234,225,242,225,244,105,128, 10,159,
+    242,237,245,235,232,105,128, 10, 31,229,104,  4,195, 52,195, 61,
+    195, 75,195, 91,225,242,225,226,233, 99,128,  6,121,230,233,238,
+    225,236,225,242,225,226,233, 99,128,251,103,233,238,233,244,233,
+    225,236,225,242,225,226,233, 99,128,251,104,237,229,228,233,225,
+    236,225,242,225,226,233, 99,128,251,105,232, 97,  3,195,115,195,
+    125,195,132,226,229,238,231,225,236,105,128,  9,160,228,229,246,
+     97,128,  9, 32,231,117,  2,195,139,195,148,234,225,242,225,244,
+    105,128, 10,160,242,237,245,235,232,105,128, 10, 32,245,242,238,
+    229,100,128,  2,135,117,  3,195,173,195,184,195,209,232,233,242,
+    225,231,225,238, 97,128, 48,100,235,225,244,225,235,225,238, 97,
+    129, 48,196,195,197,232,225,236,230,247,233,228,244,104,128,255,
+    130,243,237,225,236,108,  2,195,219,195,230,232,233,242,225,231,
+    225,238, 97,128, 48, 99,235,225,244,225,235,225,238, 97,129, 48,
+    195,195,243,232,225,236,230,247,233,228,244,104,128,255,111,119,
+      2,196,  5,196,110,101,  2,196, 11,196, 59,236,246,101,  3,196,
+     21,196, 30,196, 51,227,233,242,227,236,101,128, 36,107,112,  2,
+    196, 36,196, 43,225,242,229,110,128, 36,127,229,242,233,239,100,
+    128, 36,147,242,239,237,225,110,128, 33,123,238,244,121,  3,196,
+     69,196, 78,196, 89,227,233,242,227,236,101,128, 36,115,232,225,
+    238,231,250,232,239,117,128, 83, 68,112,  2,196, 95,196,102,225,
+    242,229,110,128, 36,135,229,242,233,239,100,128, 36,155,111,142,
+      0, 50,196,142,196,151,196,161,196,191,196,243,197, 12,197, 39,
+    197, 73,197, 85,197,104,197,115,197,148,197,156,197,180,225,242,
+    225,226,233, 99,128,  6, 98,226,229,238,231,225,236,105,128,  9,
+    232,227,233,242,227,236,101,129, 36, 97,196,172,233,238,246,229,
+    242,243,229,243,225,238,243,243,229,242,233,102,128, 39,139,100,
+      2,196,197,196,203,229,246, 97,128,  9,104,239,116,  2,196,210,
+    196,221,229,238,236,229,225,228,229,114,128, 32, 37,236,229,225,
+    228,229,114,129, 32, 37,196,232,246,229,242,244,233,227,225,108,
+    128,254, 48,231,117,  2,196,250,197,  3,234,225,242,225,244,105,
+    128, 10,232,242,237,245,235,232,105,128, 10,104,232, 97,  2,197,
+     19,197, 30,227,235,225,242,225,226,233, 99,128,  6, 98,238,231,
+    250,232,239,117,128, 48, 34,105,  2,197, 45,197, 63,228,229,239,
+    231,242,225,240,232,233,227,240,225,242,229,110,128, 50, 33,238,
+    230,229,242,233,239,114,128, 32,130,237,239,238,239,243,240,225,
+    227,101,128,255, 18,238,245,237,229,242,225,244,239,242,226,229,
+    238,231,225,236,105,128,  9,245,239,236,228,243,244,249,236,101,
+    128,247, 50,112,  2,197,121,197,128,225,242,229,110,128, 36,117,
+    229,114,  2,197,135,197,141,233,239,100,128, 36,137,243,233,225,
+    110,128,  6,242,242,239,237,225,110,128, 33,113,115,  2,197,162,
+    197,170,244,242,239,235,101,128,  1,187,245,240,229,242,233,239,
+    114,128,  0,178,244,104,  2,197,187,197,192,225,105,128, 14, 82,
+    233,242,228,115,128, 33, 84,117,145,  0,117,197,237,197,245,198,
+     30,198, 87,198,225,199,  6,199,129,199,145,199,196,200, 10,200,
+     91,200,100,200,219,200,243,201, 95,201,123,201,237,225,227,245,
+    244,101,128,  0,250, 98,  4,197,255,198,  4,198, 13,198, 23,225,
+    114,128,  2,137,229,238,231,225,236,105,128,  9,137,239,240,239,
+    237,239,230,111,128, 49, 40,242,229,246,101,128,  1,109, 99,  3,
+    198, 38,198, 45,198, 77,225,242,239,110,128,  1,212,233,242, 99,
+      2,198, 53,198, 58,236,101,128, 36,228,245,237,230,236,229,120,
+    129,  0,251,198, 69,226,229,236,239,119,128, 30,119,249,242,233,
+    236,236,233, 99,128,  4, 67,100,  5,198, 99,198,110,198,133,198,
+    139,198,215,225,244,244,225,228,229,246, 97,128,  9, 81,226,108,
+      2,198,117,198,125,225,227,245,244,101,128,  1,113,231,242,225,
+    246,101,128,  2, 21,229,246, 97,128,  9,  9,233,229,242,229,243,
+    233,115,133,  0,252,198,159,198,167,198,175,198,198,198,206,225,
+    227,245,244,101,128,  1,216,226,229,236,239,119,128, 30,115, 99,
+      2,198,181,198,188,225,242,239,110,128,  1,218,249,242,233,236,
+    236,233, 99,128,  4,241,231,242,225,246,101,128,  1,220,237,225,
+    227,242,239,110,128,  1,214,239,244,226,229,236,239,119,128, 30,
+    229,103,  2,198,231,198,238,242,225,246,101,128,  0,249,117,  2,
+    198,244,198,253,234,225,242,225,244,105,128, 10,137,242,237,245,
+    235,232,105,128, 10,  9,104,  3,199, 14,199, 24,199,102,233,242,
+    225,231,225,238, 97,128, 48, 70,111,  2,199, 30,199, 40,239,235,
+    225,226,239,246,101,128, 30,231,242,110,133,  1,176,199, 55,199,
+     63,199, 74,199, 82,199, 94,225,227,245,244,101,128, 30,233,228,
+    239,244,226,229,236,239,119,128, 30,241,231,242,225,246,101,128,
+     30,235,232,239,239,235,225,226,239,246,101,128, 30,237,244,233,
+    236,228,101,128, 30,239,245,238,231,225,242,245,237,236,225,245,
+    116,129,  1,113,199,118,227,249,242,233,236,236,233, 99,128,  4,
+    243,233,238,246,229,242,244,229,228,226,242,229,246,101,128,  2,
+     23,107,  3,199,153,199,177,199,188,225,244,225,235,225,238, 97,
+    129, 48,166,199,165,232,225,236,230,247,233,228,244,104,128,255,
+    115,227,249,242,233,236,236,233, 99,128,  4,121,239,242,229,225,
+    110,128, 49, 92,109,  2,199,202,199,255, 97,  2,199,208,199,241,
+    227,242,239,110,130,  1,107,199,219,199,230,227,249,242,233,236,
+    236,233, 99,128,  4,239,228,233,229,242,229,243,233,115,128, 30,
+    123,244,242,225,231,245,242,237,245,235,232,105,128, 10, 65,239,
+    238,239,243,240,225,227,101,128,255, 85,110,  2,200, 16,200, 71,
+    228,229,242,243,227,239,242,101,132,  0, 95,200, 35,200, 41,200,
+     53,200, 64,228,226,108,128, 32, 23,237,239,238,239,243,240,225,
+    227,101,128,255, 63,246,229,242,244,233,227,225,108,128,254, 51,
+    247,225,246,121,128,254, 79,105,  2,200, 77,200, 82,239,110,128,
+     34, 42,246,229,242,243,225,108,128, 34,  0,239,231,239,238,229,
+    107,128,  1,115,112,  5,200,112,200,119,200,127,200,142,200,193,
+    225,242,229,110,128, 36,176,226,236,239,227,107,128, 37,128,240,
+    229,242,228,239,244,232,229,226,242,229,119,128,  5,196,243,233,
+    236,239,110,131,  3,197,200,156,200,177,200,185,228,233,229,242,
+    229,243,233,115,129,  3,203,200,169,244,239,238,239,115,128,  3,
+    176,236,225,244,233,110,128,  2,138,244,239,238,239,115,128,  3,
+    205,244,225,227,107,  2,200,202,200,213,226,229,236,239,247,227,
+    237, 98,128,  3, 29,237,239,100,128,  2,212,114,  2,200,225,200,
+    237,225,231,245,242,237,245,235,232,105,128, 10,115,233,238,103,
+    128,  1,111,115,  3,200,251,201, 10,201, 55,232,239,242,244,227,
+    249,242,233,236,236,233, 99,128,  4, 94,237,225,236,108,  2,201,
+     19,201, 30,232,233,242,225,231,225,238, 97,128, 48, 69,235,225,
+    244,225,235,225,238, 97,129, 48,165,201, 43,232,225,236,230,247,
+    233,228,244,104,128,255,105,244,242,225,233,231,232,116,  2,201,
+     67,201, 78,227,249,242,233,236,236,233, 99,128,  4,175,243,244,
+    242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,177,244,
+    233,236,228,101,130,  1,105,201,107,201,115,225,227,245,244,101,
+    128, 30,121,226,229,236,239,119,128, 30,117,117,  5,201,135,201,
+    145,201,152,201,177,201,193,226,229,238,231,225,236,105,128,  9,
+    138,228,229,246, 97,128,  9, 10,231,117,  2,201,159,201,168,234,
+    225,242,225,244,105,128, 10,138,242,237,245,235,232,105,128, 10,
+     10,237,225,244,242,225,231,245,242,237,245,235,232,105,128, 10,
+     66,246,239,247,229,236,243,233,231,110,  3,201,209,201,219,201,
+    226,226,229,238,231,225,236,105,128,  9,194,228,229,246, 97,128,
+      9, 66,231,245,234,225,242,225,244,105,128, 10,194,246,239,247,
+    229,236,243,233,231,110,  3,201,253,202,  7,202, 14,226,229,238,
+    231,225,236,105,128,  9,193,228,229,246, 97,128,  9, 65,231,245,
+    234,225,242,225,244,105,128, 10,193,118,139,  0,118,202, 51,202,
+    199,202,208,202,219,203,148,203,155,203,253,204,  9,204,109,204,
+    117,204,138, 97,  4,202, 61,202, 68,202, 93,202,104,228,229,246,
+     97,128,  9, 53,231,117,  2,202, 75,202, 84,234,225,242,225,244,
+    105,128, 10,181,242,237,245,235,232,105,128, 10, 53,235,225,244,
+    225,235,225,238, 97,128, 48,247,118,132,  5,213,202,116,202,143,
+    202,175,202,187,228,225,231,229,243,104,130,251, 53,202,129,202,
+    134,182, 53,128,251, 53,232,229,226,242,229,119,128,251, 53,104,
+      2,202,149,202,157,229,226,242,229,119,128,  5,213,239,236,225,
+    109,129,251, 75,202,166,232,229,226,242,229,119,128,251, 75,246,
+    225,246,232,229,226,242,229,119,128,  5,240,249,239,228,232,229,
+    226,242,229,119,128,  5,241,227,233,242,227,236,101,128, 36,229,
+    228,239,244,226,229,236,239,119,128, 30,127,101,  6,202,233,202,
+    244,203, 52,203, 63,203, 69,203,136,227,249,242,233,236,236,233,
+     99,128,  4, 50,104,  4,202,254,203,  7,203, 21,203, 37,225,242,
+    225,226,233, 99,128,  6,164,230,233,238,225,236,225,242,225,226,
+    233, 99,128,251,107,233,238,233,244,233,225,236,225,242,225,226,
+    233, 99,128,251,108,237,229,228,233,225,236,225,242,225,226,233,
+     99,128,251,109,235,225,244,225,235,225,238, 97,128, 48,249,238,
+    245,115,128, 38, 64,242,244,233,227,225,108,  2,203, 80,203, 86,
+    226,225,114,128,  0,124,236,233,238,101,  4,203, 99,203,110,203,
+    121,203,130,225,226,239,246,229,227,237, 98,128,  3, 13,226,229,
+    236,239,247,227,237, 98,128,  3, 41,236,239,247,237,239,100,128,
+      2,204,237,239,100,128,  2,200,247,225,242,237,229,238,233,225,
+    110,128,  5,126,232,239,239,107,128,  2,139,105,  3,203,163,203,
+    174,203,213,235,225,244,225,235,225,238, 97,128, 48,248,242,225,
+    237, 97,  3,203,185,203,195,203,202,226,229,238,231,225,236,105,
+    128,  9,205,228,229,246, 97,128,  9, 77,231,245,234,225,242,225,
+    244,105,128, 10,205,243,225,242,231, 97,  3,203,225,203,235,203,
+    242,226,229,238,231,225,236,105,128,  9,131,228,229,246, 97,128,
+      9,  3,231,245,234,225,242,225,244,105,128, 10,131,237,239,238,
+    239,243,240,225,227,101,128,255, 86,111,  3,204, 17,204, 28,204,
+     98,225,242,237,229,238,233,225,110,128,  5,120,233,227,229,100,
+      2,204, 37,204, 73,233,244,229,242,225,244,233,239,110,  2,204,
+     51,204, 62,232,233,242,225,231,225,238, 97,128, 48,158,235,225,
+    244,225,235,225,238, 97,128, 48,254,237,225,242,235,235,225,238,
+     97,129, 48,155,204, 86,232,225,236,230,247,233,228,244,104,128,
+    255,158,235,225,244,225,235,225,238, 97,128, 48,250,240,225,242,
+    229,110,128, 36,177,116,  2,204,123,204,130,233,236,228,101,128,
+     30,125,245,242,238,229,100,128,  2,140,117,  2,204,144,204,155,
+    232,233,242,225,231,225,238, 97,128, 48,148,235,225,244,225,235,
+    225,238, 97,128, 48,244,119,143,  0,119,204,200,205,177,205,187,
+    205,210,205,250,206, 61,206, 69,208, 40,208, 81,208, 93,208,168,
+    208,176,208,183,208,194,208,203, 97,  8,204,218,204,225,204,235,
+    204,246,205, 28,205, 60,205, 72,205,108,227,245,244,101,128, 30,
+    131,229,235,239,242,229,225,110,128, 49, 89,232,233,242,225,231,
+    225,238, 97,128, 48,143,107,  2,204,252,205, 20,225,244,225,235,
+    225,238, 97,129, 48,239,205,  8,232,225,236,230,247,233,228,244,
+    104,128,255,156,239,242,229,225,110,128, 49, 88,243,237,225,236,
+    108,  2,205, 38,205, 49,232,233,242,225,231,225,238, 97,128, 48,
+    142,235,225,244,225,235,225,238, 97,128, 48,238,244,244,239,243,
+    241,245,225,242,101,128, 51, 87,118,  2,205, 78,205, 86,229,228,
+    225,243,104,128, 48, 28,249,245,238,228,229,242,243,227,239,242,
+    229,246,229,242,244,233,227,225,108,128,254, 52,119,  3,205,116,
+    205,125,205,139,225,242,225,226,233, 99,128,  6, 72,230,233,238,
+    225,236,225,242,225,226,233, 99,128,254,238,232,225,237,250,225,
+    225,226,239,246,101,  2,205,154,205,163,225,242,225,226,233, 99,
+    128,  6, 36,230,233,238,225,236,225,242,225,226,233, 99,128,254,
+    134,226,243,241,245,225,242,101,128, 51,221,227,233,242, 99,  2,
+    205,196,205,201,236,101,128, 36,230,245,237,230,236,229,120,128,
+      1,117,100,  2,205,216,205,226,233,229,242,229,243,233,115,128,
+     30,133,239,116,  2,205,233,205,242,225,227,227,229,238,116,128,
+     30,135,226,229,236,239,119,128, 30,137,101,  4,206,  4,206, 15,
+    206, 27,206, 51,232,233,242,225,231,225,238, 97,128, 48,145,233,
+    229,242,243,244,242,225,243,115,128, 33, 24,107,  2,206, 33,206,
+     43,225,244,225,235,225,238, 97,128, 48,241,239,242,229,225,110,
+    128, 49, 94,239,235,239,242,229,225,110,128, 49, 93,231,242,225,
+    246,101,128, 30,129,232,233,244,101,  8,206, 90,206, 99,206,183,
+    207, 17,207,101,207,146,207,198,207,254,226,245,236,236,229,116,
+    128, 37,230, 99,  2,206,105,206,125,233,242,227,236,101,129, 37,
+    203,206,115,233,238,246,229,242,243,101,128, 37,217,239,242,238,
+    229,242,226,242,225,227,235,229,116,  2,206,142,206,162,236,229,
+    230,116,129, 48, 14,206,151,246,229,242,244,233,227,225,108,128,
+    254, 67,242,233,231,232,116,129, 48, 15,206,172,246,229,242,244,
+    233,227,225,108,128,254, 68,100,  2,206,189,206,230,233,225,237,
+    239,238,100,129, 37,199,206,200,227,239,238,244,225,233,238,233,
+    238,231,226,236,225,227,235,243,237,225,236,236,228,233,225,237,
+    239,238,100,128, 37,200,239,247,238,240,239,233,238,244,233,238,
+    103,  2,206,246,207,  6,243,237,225,236,236,244,242,233,225,238,
+    231,236,101,128, 37,191,244,242,233,225,238,231,236,101,128, 37,
+    189,236,101,  2,207, 24,207, 66,230,244,240,239,233,238,244,233,
+    238,103,  2,207, 39,207, 55,243,237,225,236,236,244,242,233,225,
+    238,231,236,101,128, 37,195,244,242,233,225,238,231,236,101,128,
+     37,193,238,244,233,227,245,236,225,242,226,242,225,227,235,229,
+    116,  2,207, 86,207, 93,236,229,230,116,128, 48, 22,242,233,231,
+    232,116,128, 48, 23,242,233,231,232,244,240,239,233,238,244,233,
+    238,103,  2,207,119,207,135,243,237,225,236,236,244,242,233,225,
+    238,231,236,101,128, 37,185,244,242,233,225,238,231,236,101,128,
+     37,183,115,  3,207,154,207,184,207,192,109,  2,207,160,207,172,
+    225,236,236,243,241,245,225,242,101,128, 37,171,233,236,233,238,
+    231,230,225,227,101,128, 38, 58,241,245,225,242,101,128, 37,161,
+    244,225,114,128, 38,  6,116,  2,207,204,207,215,229,236,229,240,
+    232,239,238,101,128, 38, 15,239,242,244,239,233,243,229,243,232,
+    229,236,236,226,242,225,227,235,229,116,  2,207,239,207,246,236,
+    229,230,116,128, 48, 24,242,233,231,232,116,128, 48, 25,245,240,
+    240,239,233,238,244,233,238,103,  2,208, 13,208, 29,243,237,225,
+    236,236,244,242,233,225,238,231,236,101,128, 37,181,244,242,233,
+    225,238,231,236,101,128, 37,179,105,  2,208, 46,208, 57,232,233,
+    242,225,231,225,238, 97,128, 48,144,107,  2,208, 63,208, 73,225,
+    244,225,235,225,238, 97,128, 48,240,239,242,229,225,110,128, 49,
+     95,237,239,238,239,243,240,225,227,101,128,255, 87,111,  4,208,
+    103,208,114,208,139,208,157,232,233,242,225,231,225,238, 97,128,
+     48,146,235,225,244,225,235,225,238, 97,129, 48,242,208,127,232,
+    225,236,230,247,233,228,244,104,128,255,102,110,129, 32,169,208,
+    145,237,239,238,239,243,240,225,227,101,128,255,230,247,225,229,
+    238,244,232,225,105,128, 14, 39,240,225,242,229,110,128, 36,178,
+    242,233,238,103,128, 30,152,243,245,240,229,242,233,239,114,128,
+      2,183,244,245,242,238,229,100,128,  2,141,249,238,110,128,  1,
+    191,120,137,  0,120,208,231,208,242,208,253,209,  6,209, 33,209,
+     46,209, 50,209, 62,209, 70,225,226,239,246,229,227,237, 98,128,
+      3, 61,226,239,240,239,237,239,230,111,128, 49, 18,227,233,242,
+    227,236,101,128, 36,231,100,  2,209, 12,209, 22,233,229,242,229,
+    243,233,115,128, 30,141,239,244,225,227,227,229,238,116,128, 30,
+    139,229,232,225,242,237,229,238,233,225,110,128,  5,109,105,128,
+      3,190,237,239,238,239,243,240,225,227,101,128,255, 88,240,225,
+    242,229,110,128, 36,179,243,245,240,229,242,233,239,114,128,  2,
+    227,121,143,  0,121,209,115,210, 74,210, 97,210,137,212,103,212,
+    111,212,128,212,192,212,204,213,201,213,241,213,253,214,  8,214,
+     29,215,  2, 97, 11,209,139,209,151,209,161,209,168,209,175,209,
+    185,209,210,209,221,210,  3,210, 16,210, 62,225,228,239,243,241,
+    245,225,242,101,128, 51, 78,226,229,238,231,225,236,105,128,  9,
+    175,227,245,244,101,128,  0,253,228,229,246, 97,128,  9, 47,229,
+    235,239,242,229,225,110,128, 49, 82,231,117,  2,209,192,209,201,
+    234,225,242,225,244,105,128, 10,175,242,237,245,235,232,105,128,
+     10, 47,232,233,242,225,231,225,238, 97,128, 48,132,107,  2,209,
+    227,209,251,225,244,225,235,225,238, 97,129, 48,228,209,239,232,
+    225,236,230,247,233,228,244,104,128,255,148,239,242,229,225,110,
+    128, 49, 81,237,225,235,235,225,238,244,232,225,105,128, 14, 78,
+    243,237,225,236,108,  2,210, 26,210, 37,232,233,242,225,231,225,
+    238, 97,128, 48,131,235,225,244,225,235,225,238, 97,129, 48,227,
+    210, 50,232,225,236,230,247,233,228,244,104,128,255,108,244,227,
+    249,242,233,236,236,233, 99,128,  4, 99,227,233,242, 99,  2,210,
+     83,210, 88,236,101,128, 36,232,245,237,230,236,229,120,128,  1,
+    119,100,  2,210,103,210,113,233,229,242,229,243,233,115,128,  0,
+    255,239,116,  2,210,120,210,129,225,227,227,229,238,116,128, 30,
+    143,226,229,236,239,119,128, 30,245,101,  7,210,153,211,161,211,
+    170,211,188,211,220,212, 40,212, 91,104,  8,210,171,210,180,210,
+    214,210,228,211, 45,211, 61,211,120,211,138,225,242,225,226,233,
+     99,128,  6, 74,226,225,242,242,229,101,  2,210,191,210,200,225,
+    242,225,226,233, 99,128,  6,210,230,233,238,225,236,225,242,225,
+    226,233, 99,128,251,175,230,233,238,225,236,225,242,225,226,233,
+     99,128,254,242,232,225,237,250,225,225,226,239,246,101,  4,210,
+    247,211,  0,211, 14,211, 30,225,242,225,226,233, 99,128,  6, 38,
+    230,233,238,225,236,225,242,225,226,233, 99,128,254,138,233,238,
+    233,244,233,225,236,225,242,225,226,233, 99,128,254,139,237,229,
+    228,233,225,236,225,242,225,226,233, 99,128,254,140,233,238,233,
+    244,233,225,236,225,242,225,226,233, 99,128,254,243,237,101,  2,
+    211, 68,211, 81,228,233,225,236,225,242,225,226,233, 99,128,254,
+    244,229,237,105,  2,211, 89,211,104,238,233,244,233,225,236,225,
+    242,225,226,233, 99,128,252,221,243,239,236,225,244,229,228,225,
+    242,225,226,233, 99,128,252, 88,238,239,239,238,230,233,238,225,
+    236,225,242,225,226,233, 99,128,252,148,244,232,242,229,229,228,
+    239,244,243,226,229,236,239,247,225,242,225,226,233, 99,128,  6,
+    209,235,239,242,229,225,110,128, 49, 86,110,129,  0,165,211,176,
+    237,239,238,239,243,240,225,227,101,128,255,229,111,  2,211,194,
+    211,203,235,239,242,229,225,110,128, 49, 85,242,233,238,232,233,
+    229,245,232,235,239,242,229,225,110,128, 49,134,114,  3,211,228,
+    212,  8,212, 20,225,232,226,229,238,249,239,237,111,  2,211,242,
+    211,251,232,229,226,242,229,119,128,  5,170,236,229,230,244,232,
+    229,226,242,229,119,128,  5,170,233,227,249,242,233,236,236,233,
+     99,128,  4, 75,245,228,233,229,242,229,243,233,243,227,249,242,
+    233,236,236,233, 99,128,  4,249,243,233,229,245,238,103,  3,212,
+     53,212, 62,212, 78,235,239,242,229,225,110,128, 49,129,240,225,
+    238,243,233,239,243,235,239,242,229,225,110,128, 49,131,243,233,
+    239,243,235,239,242,229,225,110,128, 49,130,244,233,246,232,229,
+    226,242,229,119,128,  5,154,231,242,225,246,101,128, 30,243,232,
+    239,239,107,129,  1,180,212,120,225,226,239,246,101,128, 30,247,
+    105,  5,212,140,212,151,212,162,212,171,212,179,225,242,237,229,
+    238,233,225,110,128,  5,117,227,249,242,233,236,236,233, 99,128,
+      4, 87,235,239,242,229,225,110,128, 49, 98,238,249,225,238,103,
+    128, 38, 47,247,238,225,242,237,229,238,233,225,110,128,  5,130,
+    237,239,238,239,243,240,225,227,101,128,255, 89,111,  7,212,220,
+    213, 34,213, 45,213, 55,213, 93,213,139,213,148,100,131,  5,217,
+    212,230,212,250,213,  3,228,225,231,229,243,104,129,251, 57,212,
+    241,232,229,226,242,229,119,128,251, 57,232,229,226,242,229,119,
+    128,  5,217,249,239,100,  2,213, 11,213, 20,232,229,226,242,229,
+    119,128,  5,242,240,225,244,225,232,232,229,226,242,229,119,128,
+    251, 31,232,233,242,225,231,225,238, 97,128, 48,136,233,235,239,
+    242,229,225,110,128, 49,137,107,  2,213, 61,213, 85,225,244,225,
+    235,225,238, 97,129, 48,232,213, 73,232,225,236,230,247,233,228,
+    244,104,128,255,150,239,242,229,225,110,128, 49, 91,243,237,225,
+    236,108,  2,213,103,213,114,232,233,242,225,231,225,238, 97,128,
+     48,135,235,225,244,225,235,225,238, 97,129, 48,231,213,127,232,
+    225,236,230,247,233,228,244,104,128,255,110,244,231,242,229,229,
+    107,128,  3,243,121,  2,213,154,213,191, 97,  2,213,160,213,170,
+    229,235,239,242,229,225,110,128, 49,136,107,  2,213,176,213,184,
+    239,242,229,225,110,128, 49,135,244,232,225,105,128, 14, 34,233,
+    238,231,244,232,225,105,128, 14, 13,112,  2,213,207,213,214,225,
+    242,229,110,128, 36,180,239,231,229,231,242,225,237,237,229,238,
+    105,129,  3,122,213,230,231,242,229,229,235,227,237, 98,128,  3,
+     69,114,129,  1,166,213,247,233,238,103,128, 30,153,243,245,240,
+    229,242,233,239,114,128,  2,184,116,  2,214, 14,214, 21,233,236,
+    228,101,128, 30,249,245,242,238,229,100,128,  2,142,117,  5,214,
+     41,214, 52,214, 62,214,100,214,232,232,233,242,225,231,225,238,
+     97,128, 48,134,233,235,239,242,229,225,110,128, 49,140,107,  2,
+    214, 68,214, 92,225,244,225,235,225,238, 97,129, 48,230,214, 80,
+    232,225,236,230,247,233,228,244,104,128,255,149,239,242,229,225,
+    110,128, 49, 96,115,  3,214,108,214,146,214,187,226,233,103,  2,
+    214,116,214,127,227,249,242,233,236,236,233, 99,128,  4,107,233,
+    239,244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128,
+      4,109,236,233,244,244,236,101,  2,214,157,214,168,227,249,242,
+    233,236,236,233, 99,128,  4,103,233,239,244,233,230,233,229,228,
+    227,249,242,233,236,236,233, 99,128,  4,105,237,225,236,108,  2,
+    214,196,214,207,232,233,242,225,231,225,238, 97,128, 48,133,235,
+    225,244,225,235,225,238, 97,129, 48,229,214,220,232,225,236,230,
+    247,233,228,244,104,128,255,109,249,101,  2,214,239,214,248,235,
+    239,242,229,225,110,128, 49,139,239,235,239,242,229,225,110,128,
+     49,138,249, 97,  2,215,  9,215, 19,226,229,238,231,225,236,105,
+    128,  9,223,228,229,246, 97,128,  9, 95,122,142,  0,122,215, 58,
+    216, 66,216, 77,216,120,216,147,217,182,218, 34,218, 76,218, 88,
+    218,100,218,128,218,136,218,152,218,161, 97, 10,215, 80,215, 91,
+    215, 98,215,105,215,116,215,194,215,224,215,235,216, 15,216, 27,
+    225,242,237,229,238,233,225,110,128,  5,102,227,245,244,101,128,
+      1,122,228,229,246, 97,128,  9, 91,231,245,242,237,245,235,232,
+    105,128, 10, 91,104,  4,215,126,215,135,215,149,215,179,225,242,
+    225,226,233, 99,128,  6, 56,230,233,238,225,236,225,242,225,226,
+    233, 99,128,254,198,105,  2,215,155,215,170,238,233,244,233,225,
+    236,225,242,225,226,233, 99,128,254,199,242,225,231,225,238, 97,
+    128, 48, 86,237,229,228,233,225,236,225,242,225,226,233, 99,128,
+    254,200,233,110,  2,215,201,215,210,225,242,225,226,233, 99,128,
+      6, 50,230,233,238,225,236,225,242,225,226,233, 99,128,254,176,
+    235,225,244,225,235,225,238, 97,128, 48,182,241,229,102,  2,215,
+    243,216,  1,231,225,228,239,236,232,229,226,242,229,119,128,  5,
+    149,241,225,244,225,238,232,229,226,242,229,119,128,  5,148,242,
+    241,225,232,229,226,242,229,119,128,  5,152,249,233,110,130,  5,
+    214,216, 37,216, 57,228,225,231,229,243,104,129,251, 54,216, 48,
+    232,229,226,242,229,119,128,251, 54,232,229,226,242,229,119,128,
+      5,214,226,239,240,239,237,239,230,111,128, 49, 23, 99,  3,216,
+     85,216, 92,216,114,225,242,239,110,128,  1,126,233,242, 99,  2,
+    216,100,216,105,236,101,128, 36,233,245,237,230,236,229,120,128,
+     30,145,245,242,108,128,  2,145,228,239,116,130,  1,124,216,130,
+    216,139,225,227,227,229,238,116,128,  1,124,226,229,236,239,119,
+    128, 30,147,101,  6,216,161,216,172,216,215,216,226,216,237,217,
+    177,227,249,242,233,236,236,233, 99,128,  4, 55,100,  2,216,178,
+    216,197,229,243,227,229,238,228,229,242,227,249,242,233,236,236,
+    233, 99,128,  4,153,233,229,242,229,243,233,243,227,249,242,233,
+    236,236,233, 99,128,  4,223,232,233,242,225,231,225,238, 97,128,
+     48, 92,235,225,244,225,235,225,238, 97,128, 48,188,242,111,140,
+      0, 48,217, 10,217, 19,217, 29,217, 36,217, 61,217, 74,217, 85,
+    217, 97,217,108,217,118,217,129,217,136,225,242,225,226,233, 99,
+    128,  6, 96,226,229,238,231,225,236,105,128,  9,230,228,229,246,
+     97,128,  9,102,231,117,  2,217, 43,217, 52,234,225,242,225,244,
+    105,128, 10,230,242,237,245,235,232,105,128, 10,102,232,225,227,
+    235,225,242,225,226,233, 99,128,  6, 96,233,238,230,229,242,233,
+    239,114,128, 32,128,237,239,238,239,243,240,225,227,101,128,255,
+     16,239,236,228,243,244,249,236,101,128,247, 48,240,229,242,243,
+    233,225,110,128,  6,240,243,245,240,229,242,233,239,114,128, 32,
+    112,244,232,225,105,128, 14, 80,247,233,228,244,104,  3,217,148,
+    217,157,217,169,234,239,233,238,229,114,128,254,255,238,239,238,
+    234,239,233,238,229,114,128, 32, 12,243,240,225,227,101,128, 32,
+     11,244, 97,128,  3,182,104,  2,217,188,217,199,226,239,240,239,
+    237,239,230,111,128, 49, 19,101,  4,217,209,217,220,217,236,217,
+    247,225,242,237,229,238,233,225,110,128,  5,106,226,242,229,246,
+    229,227,249,242,233,236,236,233, 99,128,  4,194,227,249,242,233,
+    236,236,233, 99,128,  4, 54,100,  2,217,253,218, 16,229,243,227,
+    229,238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,151,
+    233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128,
+      4,221,105,  3,218, 42,218, 53,218, 64,232,233,242,225,231,225,
+    238, 97,128, 48, 88,235,225,244,225,235,225,238, 97,128, 48,184,
+    238,239,242,232,229,226,242,229,119,128,  5,174,236,233,238,229,
+    226,229,236,239,119,128, 30,149,237,239,238,239,243,240,225,227,
+    101,128,255, 90,111,  2,218,106,218,117,232,233,242,225,231,225,
+    238, 97,128, 48, 94,235,225,244,225,235,225,238, 97,128, 48,190,
+    240,225,242,229,110,128, 36,181,242,229,244,242,239,230,236,229,
+    248,232,239,239,107,128,  2,144,243,244,242,239,235,101,128,  1,
+    182,117,  2,218,167,218,178,232,233,242,225,231,225,238, 97,128,
+     48, 90,235,225,244,225,235,225,238, 97,128, 48,186
+  };
+
+
+  /*
+   *  This function searches the compressed table efficiently.
+   */
+  static unsigned long
+  ft_get_adobe_glyph_index( const char*  name,
+                            const char*  limit )
+  {
+    int                   c = 0;
+    int                   count, min, max;
+    const unsigned char*  p = ft_adobe_glyph_list;
+
+
+    if ( name == 0 || name >= limit )
+      goto NotFound;
+
+    c     = *name++;
+    count = p[1];
+    p    += 2;
+
+    min = 0;
+    max = count;
+
+    while ( min < max )
+    {
+      int                   mid = ( min + max ) >> 1;
+      const unsigned char*  q   = p + mid * 2;
+      int                   c2;
+
+
+      q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] );
+
+      c2 = q[0] & 127;
+      if ( c2 == c )
+      {
+        p = q;
+        goto Found;
+      }
+      if ( c2 < c )
+        min = mid + 1;
+      else
+        max = mid;
+    }
+    goto NotFound;
+
+  Found:
+    for (;;)
+    {
+      /* assert (*p & 127) == c */
+
+      if ( name >= limit )
+      {
+        if ( (p[0] & 128) == 0 &&
+             (p[1] & 128) != 0 )
+          return (unsigned long)( ( (int)p[2] << 8 ) | p[3] );
+
+        goto NotFound;
+      }
+      c = *name++;
+      if ( p[0] & 128 )
+      {
+        p++;
+        if ( c != (p[0] & 127) )
+          goto NotFound;
+
+        continue;
+      }
+
+      p++;
+      count = p[0] & 127;
+      if ( p[0] & 128 )
+        p += 2;
+
+      p++;
+
+      for ( ; count > 0; count--, p += 2 )
+      {
+        int                   offset = ( (int)p[0] << 8 ) | p[1];
+        const unsigned char*  q      = ft_adobe_glyph_list + offset;
+
+        if ( c == ( q[0] & 127 ) )
+        {
+          p = q;
+          goto NextIter;
+        }
+      }
+      goto NotFound;
+
+    NextIter:
+      ;
+    }
+
+  NotFound:
+    return 0;
+  }
+
+#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
+
+
+/* END */
diff --git a/src/psnames/rules.mk b/src/psnames/rules.mk
new file mode 100644 (file)
index 0000000..4cd39a8
--- /dev/null
@@ -0,0 +1,71 @@
+#
+# FreeType 2 PSNames driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003, 2011 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.
+
+
+# PSNames driver directory
+#
+PSNAMES_DIR := $(SRC_DIR)/psnames
+
+
+# compilation flags for the driver
+#
+PSNAMES_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(PSNAMES_DIR))
+
+
+# PSNames driver sources (i.e., C files)
+#
+PSNAMES_DRV_SRC := $(PSNAMES_DIR)/psmodule.c \
+                   $(PSNAMES_DIR)/pspic.c
+
+
+# PSNames driver headers
+#
+PSNAMES_DRV_H := $(PSNAMES_DRV_SRC:%.c=%.h) \
+                 $(PSNAMES_DIR)/psnamerr.h  \
+                 $(PSNAMES_DIR)/pstables.h
+
+
+# PSNames driver object(s)
+#
+#   PSNAMES_DRV_OBJ_M is used during `multi' builds
+#   PSNAMES_DRV_OBJ_S is used during `single' builds
+#
+PSNAMES_DRV_OBJ_M := $(PSNAMES_DRV_SRC:$(PSNAMES_DIR)/%.c=$(OBJ_DIR)/%.$O)
+PSNAMES_DRV_OBJ_S := $(OBJ_DIR)/psnames.$O
+
+# PSNames driver source file for single build
+#
+PSNAMES_DRV_SRC_S := $(PSNAMES_DIR)/psmodule.c
+
+
+# PSNames driver - single object
+#
+$(PSNAMES_DRV_OBJ_S): $(PSNAMES_DRV_SRC_S) $(PSNAMES_DRV_SRC) \
+                      $(FREETYPE_H) $(PSNAMES_DRV_H)
+       $(PSNAMES_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(PSNAMES_DRV_SRC_S))
+
+
+# PSNames driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(PSNAMES_DIR)/%.c $(FREETYPE_H) $(PSNAMES_DRV_H)
+       $(PSNAMES_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(PSNAMES_DRV_OBJ_S)
+DRV_OBJS_M += $(PSNAMES_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/raster/Jamfile b/src/raster/Jamfile
new file mode 100644 (file)
index 0000000..4f60e87
--- /dev/null
@@ -0,0 +1,29 @@
+# FreeType 2 src/raster Jamfile
+#
+# Copyright 2001 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) raster ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = ftraster ftrend1 rastpic ;
+  }
+  else
+  {
+    _sources = raster ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/raster Jamfile
diff --git a/src/raster/ftmisc.h b/src/raster/ftmisc.h
new file mode 100644 (file)
index 0000000..7773924
--- /dev/null
@@ -0,0 +1,121 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftmisc.h                                                               */
+/*                                                                         */
+/*    Miscellaneous macros for stand-alone rasterizer (specification       */
+/*    only).                                                               */
+/*                                                                         */
+/*  Copyright 2005, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /***************************************************/
+  /*                                                 */
+  /* This file is *not* portable!  You have to adapt */
+  /* its definitions to your platform.               */
+  /*                                                 */
+  /***************************************************/
+
+#ifndef __FTMISC_H__
+#define __FTMISC_H__
+
+
+  /* memset */
+#include FT_CONFIG_STANDARD_LIBRARY_H
+
+#define FT_BEGIN_HEADER
+#define FT_END_HEADER
+
+#define FT_LOCAL_DEF( x )   static x
+
+
+  /* from include/freetype2/fttypes.h */
+
+  typedef unsigned char  FT_Byte;
+  typedef signed int     FT_Int;
+  typedef unsigned int   FT_UInt;
+  typedef signed long    FT_Long;
+  typedef unsigned long  FT_ULong;
+  typedef signed long    FT_F26Dot6;
+  typedef int            FT_Error;
+
+#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
+          ( ( (FT_ULong)_x1 << 24 ) |     \
+            ( (FT_ULong)_x2 << 16 ) |     \
+            ( (FT_ULong)_x3 <<  8 ) |     \
+              (FT_ULong)_x4         )
+
+
+  /* from include/freetype2/ftsystem.h */
+
+  typedef struct FT_MemoryRec_*  FT_Memory;
+
+  typedef void* (*FT_Alloc_Func)( FT_Memory  memory,
+                                  long       size );
+
+  typedef void (*FT_Free_Func)( FT_Memory  memory,
+                                void*      block );
+
+  typedef void* (*FT_Realloc_Func)( FT_Memory  memory,
+                                    long       cur_size,
+                                    long       new_size,
+                                    void*      block );
+
+  typedef struct FT_MemoryRec_
+  {
+    void*            user;
+
+    FT_Alloc_Func    alloc;
+    FT_Free_Func     free;
+    FT_Realloc_Func  realloc;
+
+  } FT_MemoryRec;
+
+
+  /* from src/ftcalc.c */
+
+#if ( defined _WIN32 || defined _WIN64 )
+
+  typedef __int64  FT_Int64;
+
+#else
+
+#include "inttypes.h"
+
+  typedef int64_t  FT_Int64;
+
+#endif
+
+
+  static FT_Long
+  FT_MulDiv( FT_Long  a,
+             FT_Long  b,
+             FT_Long  c )
+  {
+    FT_Int   s;
+    FT_Long  d;
+
+
+    s = 1;
+    if ( a < 0 ) { a = -a; s = -1; }
+    if ( b < 0 ) { b = -b; s = -s; }
+    if ( c < 0 ) { c = -c; s = -s; }
+
+    d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c
+                         : 0x7FFFFFFFL );
+
+    return ( s > 0 ) ? d : -d;
+  }
+
+#endif /* __FTMISC_H__ */
+
+
+/* END */
diff --git a/src/raster/ftraster.c b/src/raster/ftraster.c
new file mode 100644 (file)
index 0000000..f85845e
--- /dev/null
@@ -0,0 +1,3612 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftraster.c                                                             */
+/*                                                                         */
+/*    The FreeType glyph rasterizer (body).                                */
+/*                                                                         */
+/*  Copyright 1996-2003, 2005, 2007-2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file can be compiled without the rest of the FreeType engine, by */
+  /* defining the _STANDALONE_ macro when compiling it.  You also need to  */
+  /* put the files `ftimage.h' and `ftmisc.h' into the $(incdir)           */
+  /* directory.  Typically, you should do something like                   */
+  /*                                                                       */
+  /* - copy `src/raster/ftraster.c' (this file) to your current directory  */
+  /*                                                                       */
+  /* - copy `include/freetype/ftimage.h' and `src/raster/ftmisc.h'         */
+  /*   to your current directory                                           */
+  /*                                                                       */
+  /* - compile `ftraster' with the _STANDALONE_ macro defined, as in       */
+  /*                                                                       */
+  /*     cc -c -D_STANDALONE_ ftraster.c                                   */
+  /*                                                                       */
+  /* The renderer can be initialized with a call to                        */
+  /* `ft_standard_raster.raster_new'; a bitmap can be generated            */
+  /* with a call to `ft_standard_raster.raster_render'.                    */
+  /*                                                                       */
+  /* See the comments and documentation in the file `ftimage.h' for more   */
+  /* details on how the raster works.                                      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This is a rewrite of the FreeType 1.x scan-line converter             */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef _STANDALONE_
+
+#define FT_CONFIG_STANDARD_LIBRARY_H  <stdlib.h>
+
+#include <string.h>           /* for memset */
+
+#include "ftmisc.h"
+#include "ftimage.h"
+
+#else /* !_STANDALONE_ */
+
+#include <ft2build.h>
+#include "ftraster.h"
+#include FT_INTERNAL_CALC_H   /* for FT_MulDiv only */
+
+#include "rastpic.h"
+
+#endif /* !_STANDALONE_ */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* A simple technical note on how the raster works                       */
+  /* -----------------------------------------------                       */
+  /*                                                                       */
+  /*   Converting an outline into a bitmap is achieved in several steps:   */
+  /*                                                                       */
+  /*   1 - Decomposing the outline into successive `profiles'.  Each       */
+  /*       profile is simply an array of scanline intersections on a given */
+  /*       dimension.  A profile's main attributes are                     */
+  /*                                                                       */
+  /*       o its scanline position boundaries, i.e. `Ymin' and `Ymax'      */
+  /*                                                                       */
+  /*       o an array of intersection coordinates for each scanline        */
+  /*         between `Ymin' and `Ymax'                                     */
+  /*                                                                       */
+  /*       o a direction, indicating whether it was built going `up' or    */
+  /*         `down', as this is very important for filling rules           */
+  /*                                                                       */
+  /*       o its drop-out mode                                             */
+  /*                                                                       */
+  /*   2 - Sweeping the target map's scanlines in order to compute segment */
+  /*       `spans' which are then filled.  Additionally, this pass         */
+  /*       performs drop-out control.                                      */
+  /*                                                                       */
+  /*   The outline data is parsed during step 1 only.  The profiles are    */
+  /*   built from the bottom of the render pool, used as a stack.  The     */
+  /*   following graphics shows the profile list under construction:       */
+  /*                                                                       */
+  /*     __________________________________________________________ _ _    */
+  /*    |         |                 |         |                 |          */
+  /*    | profile | coordinates for | profile | coordinates for |-->       */
+  /*    |    1    |  profile 1      |    2    |  profile 2      |-->       */
+  /*    |_________|_________________|_________|_________________|__ _ _    */
+  /*                                                                       */
+  /*    ^                                                       ^          */
+  /*    |                                                       |          */
+  /* start of render pool                                      top         */
+  /*                                                                       */
+  /*   The top of the profile stack is kept in the `top' variable.         */
+  /*                                                                       */
+  /*   As you can see, a profile record is pushed on top of the render     */
+  /*   pool, which is then followed by its coordinates/intersections.  If  */
+  /*   a change of direction is detected in the outline, a new profile is  */
+  /*   generated until the end of the outline.                             */
+  /*                                                                       */
+  /*   Note that when all profiles have been generated, the function       */
+  /*   Finalize_Profile_Table() is used to record, for each profile, its   */
+  /*   bottom-most scanline as well as the scanline above its upmost       */
+  /*   boundary.  These positions are called `y-turns' because they (sort  */
+  /*   of) correspond to local extrema.  They are stored in a sorted list  */
+  /*   built from the top of the render pool as a downwards stack:         */
+  /*                                                                       */
+  /*      _ _ _______________________________________                      */
+  /*                            |                    |                     */
+  /*                         <--| sorted list of     |                     */
+  /*                         <--|  extrema scanlines |                     */
+  /*      _ _ __________________|____________________|                     */
+  /*                                                                       */
+  /*                            ^                    ^                     */
+  /*                            |                    |                     */
+  /*                         maxBuff           sizeBuff = end of pool      */
+  /*                                                                       */
+  /*   This list is later used during the sweep phase in order to          */
+  /*   optimize performance (see technical note on the sweep below).       */
+  /*                                                                       */
+  /*   Of course, the raster detects whether the two stacks collide and    */
+  /*   handles the situation properly.                                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /**                                                                     **/
+  /**  CONFIGURATION MACROS                                               **/
+  /**                                                                     **/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /* define DEBUG_RASTER if you want to compile a debugging version */
+/* #define DEBUG_RASTER */
+
+  /* define FT_RASTER_OPTION_ANTI_ALIASING if you want to support */
+  /* 5-levels anti-aliasing                                       */
+/* #define FT_RASTER_OPTION_ANTI_ALIASING */
+
+  /* The size of the two-lines intermediate bitmap used */
+  /* for anti-aliasing, in bytes.                       */
+#define RASTER_GRAY_LINES  2048
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /**                                                                     **/
+  /**  OTHER MACROS (do not change)                                       **/
+  /**                                                                     **/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_raster
+
+
+#ifdef _STANDALONE_
+
+
+  /* This macro is used to indicate that a function parameter is unused. */
+  /* Its purpose is simply to reduce compiler warnings.  Note also that  */
+  /* simply defining it as `(void)x' doesn't avoid warnings with certain */
+  /* ANSI compilers (e.g. LCC).                                          */
+#define FT_UNUSED( x )  (x) = (x)
+
+  /* Disable the tracing mechanism for simplicity -- developers can      */
+  /* activate it easily by redefining these two macros.                  */
+#ifndef FT_ERROR
+#define FT_ERROR( x )  do { } while ( 0 )     /* nothing */
+#endif
+
+#ifndef FT_TRACE
+#define FT_TRACE( x )   do { } while ( 0 )    /* nothing */
+#define FT_TRACE1( x )  do { } while ( 0 )    /* nothing */
+#define FT_TRACE6( x )  do { } while ( 0 )    /* nothing */
+#endif
+
+#define Raster_Err_None          0
+#define Raster_Err_Not_Ini      -1
+#define Raster_Err_Overflow     -2
+#define Raster_Err_Neg_Height   -3
+#define Raster_Err_Invalid      -4
+#define Raster_Err_Unsupported  -5
+
+#define ft_memset  memset
+
+#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, raster_new_, \
+                                raster_reset_, raster_set_mode_,    \
+                                raster_render_, raster_done_ )      \
+          const FT_Raster_Funcs class_ =                            \
+          {                                                         \
+            glyph_format_,                                          \
+            raster_new_,                                            \
+            raster_reset_,                                          \
+            raster_set_mode_,                                       \
+            raster_render_,                                         \
+            raster_done_                                            \
+         };
+
+#else /* !_STANDALONE_ */
+
+
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_DEBUG_H        /* for FT_TRACE() and FT_ERROR() */
+
+#include "rasterrs.h"
+
+#define Raster_Err_None         Raster_Err_Ok
+#define Raster_Err_Not_Ini      Raster_Err_Raster_Uninitialized
+#define Raster_Err_Overflow     Raster_Err_Raster_Overflow
+#define Raster_Err_Neg_Height   Raster_Err_Raster_Negative_Height
+#define Raster_Err_Invalid      Raster_Err_Invalid_Outline
+#define Raster_Err_Unsupported  Raster_Err_Cannot_Render_Glyph
+
+
+#endif /* !_STANDALONE_ */
+
+
+#ifndef FT_MEM_SET
+#define FT_MEM_SET( d, s, c )  ft_memset( d, s, c )
+#endif
+
+#ifndef FT_MEM_ZERO
+#define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )
+#endif
+
+  /* FMulDiv means `Fast MulDiv'; it is used in case where `b' is       */
+  /* typically a small value and the result of a*b is known to fit into */
+  /* 32 bits.                                                           */
+#define FMulDiv( a, b, c )  ( (a) * (b) / (c) )
+
+  /* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */
+  /* for clipping computations.  It simply uses the FT_MulDiv() function   */
+  /* defined in `ftcalc.h'.                                                */
+#define SMulDiv  FT_MulDiv
+
+  /* The rasterizer is a very general purpose component; please leave */
+  /* the following redefinitions there (you never know your target    */
+  /* environment).                                                    */
+
+#ifndef TRUE
+#define TRUE   1
+#endif
+
+#ifndef FALSE
+#define FALSE  0
+#endif
+
+#ifndef NULL
+#define NULL  (void*)0
+#endif
+
+#ifndef SUCCESS
+#define SUCCESS  0
+#endif
+
+#ifndef FAILURE
+#define FAILURE  1
+#endif
+
+
+#define MaxBezier  32   /* The maximum number of stacked Bezier curves. */
+                        /* Setting this constant to more than 32 is a   */
+                        /* pure waste of space.                         */
+
+#define Pixel_Bits  6   /* fractional bits of *input* coordinates */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /**                                                                     **/
+  /**  SIMPLE TYPE DECLARATIONS                                           **/
+  /**                                                                     **/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  typedef int             Int;
+  typedef unsigned int    UInt;
+  typedef short           Short;
+  typedef unsigned short  UShort, *PUShort;
+  typedef long            Long, *PLong;
+
+  typedef unsigned char   Byte, *PByte;
+  typedef char            Bool;
+
+
+  typedef union  Alignment_
+  {
+    long    l;
+    void*   p;
+    void  (*f)(void);
+
+  } Alignment, *PAlignment;
+
+
+  typedef struct  TPoint_
+  {
+    Long  x;
+    Long  y;
+
+  } TPoint;
+
+
+  /* values for the `flags' bit field */
+#define Flow_Up           0x8
+#define Overshoot_Top     0x10
+#define Overshoot_Bottom  0x20
+
+
+  /* States of each line, arc, and profile */
+  typedef enum  TStates_
+  {
+    Unknown_State,
+    Ascending_State,
+    Descending_State,
+    Flat_State
+
+  } TStates;
+
+
+  typedef struct TProfile_  TProfile;
+  typedef TProfile*         PProfile;
+
+  struct  TProfile_
+  {
+    FT_F26Dot6  X;           /* current coordinate during sweep          */
+    PProfile    link;        /* link to next profile (various purposes)  */
+    PLong       offset;      /* start of profile's data in render pool   */
+    unsigned    flags;       /* Bit 0-2: drop-out mode                   */
+                             /* Bit 3: profile orientation (up/down)     */
+                             /* Bit 4: is top profile?                   */
+                             /* Bit 5: is bottom profile?                */
+    long        height;      /* profile's height in scanlines            */
+    long        start;       /* profile's starting scanline              */
+
+    unsigned    countL;      /* number of lines to step before this      */
+                             /* profile becomes drawable                 */
+
+    PProfile    next;        /* next profile in same contour, used       */
+                             /* during drop-out control                  */
+  };
+
+  typedef PProfile   TProfileList;
+  typedef PProfile*  PProfileList;
+
+
+  /* Simple record used to implement a stack of bands, required */
+  /* by the sub-banding mechanism                               */
+  typedef struct  black_TBand_
+  {
+    Short  y_min;   /* band's minimum */
+    Short  y_max;   /* band's maximum */
+
+  } black_TBand;
+
+
+#define AlignProfileSize \
+  ( ( sizeof ( TProfile ) + sizeof ( Alignment ) - 1 ) / sizeof ( long ) )
+
+
+#undef RAS_ARG
+#undef RAS_ARGS
+#undef RAS_VAR
+#undef RAS_VARS
+
+#ifdef FT_STATIC_RASTER
+
+
+#define RAS_ARGS       /* void */
+#define RAS_ARG        /* void */
+
+#define RAS_VARS       /* void */
+#define RAS_VAR        /* void */
+
+#define FT_UNUSED_RASTER  do { } while ( 0 )
+
+
+#else /* !FT_STATIC_RASTER */
+
+
+#define RAS_ARGS       black_PWorker  worker,
+#define RAS_ARG        black_PWorker  worker
+
+#define RAS_VARS       worker,
+#define RAS_VAR        worker
+
+#define FT_UNUSED_RASTER  FT_UNUSED( worker )
+
+
+#endif /* !FT_STATIC_RASTER */
+
+
+  typedef struct black_TWorker_  black_TWorker, *black_PWorker;
+
+
+  /* prototypes used for sweep function dispatch */
+  typedef void
+  Function_Sweep_Init( RAS_ARGS Short*  min,
+                                Short*  max );
+
+  typedef void
+  Function_Sweep_Span( RAS_ARGS Short       y,
+                                FT_F26Dot6  x1,
+                                FT_F26Dot6  x2,
+                                PProfile    left,
+                                PProfile    right );
+
+  typedef void
+  Function_Sweep_Step( RAS_ARG );
+
+
+  /* NOTE: These operations are only valid on 2's complement processors */
+#undef FLOOR
+#undef CEILING
+#undef TRUNC
+#undef SCALED
+
+#define FLOOR( x )    ( (x) & -ras.precision )
+#define CEILING( x )  ( ( (x) + ras.precision - 1 ) & -ras.precision )
+#define TRUNC( x )    ( (signed long)(x) >> ras.precision_bits )
+#define FRAC( x )     ( (x) & ( ras.precision - 1 ) )
+#define SCALED( x )   ( ( (x) << ras.scale_shift ) - ras.precision_half )
+
+#define IS_BOTTOM_OVERSHOOT( x )  ( CEILING( x ) - x >= ras.precision_half )
+#define IS_TOP_OVERSHOOT( x )     ( x - FLOOR( x ) >= ras.precision_half )
+
+  /* The most used variables are positioned at the top of the structure. */
+  /* Thus, their offset can be coded with less opcodes, resulting in a   */
+  /* smaller executable.                                                 */
+
+  struct  black_TWorker_
+  {
+    Int         precision_bits;     /* precision related variables         */
+    Int         precision;
+    Int         precision_half;
+    Int         precision_shift;
+    Int         precision_step;
+    Int         precision_jitter;
+
+    Int         scale_shift;        /* == precision_shift   for bitmaps    */
+                                    /* == precision_shift+1 for pixmaps    */
+
+    PLong       buff;               /* The profiles buffer                 */
+    PLong       sizeBuff;           /* Render pool size                    */
+    PLong       maxBuff;            /* Profiles buffer size                */
+    PLong       top;                /* Current cursor in buffer            */
+
+    FT_Error    error;
+
+    Int         numTurns;           /* number of Y-turns in outline        */
+
+    TPoint*     arc;                /* current Bezier arc pointer          */
+
+    UShort      bWidth;             /* target bitmap width                 */
+    PByte       bTarget;            /* target bitmap buffer                */
+    PByte       gTarget;            /* target pixmap buffer                */
+
+    Long        lastX, lastY;
+    Long        minY, maxY;
+
+    UShort      num_Profs;          /* current number of profiles          */
+
+    Bool        fresh;              /* signals a fresh new profile which   */
+                                    /* `start' field must be completed     */
+    Bool        joint;              /* signals that the last arc ended     */
+                                    /* exactly on a scanline.  Allows      */
+                                    /* removal of doublets                 */
+    PProfile    cProfile;           /* current profile                     */
+    PProfile    fProfile;           /* head of linked list of profiles     */
+    PProfile    gProfile;           /* contour's first profile in case     */
+                                    /* of impact                           */
+
+    TStates     state;              /* rendering state                     */
+
+    FT_Bitmap   target;             /* description of target bit/pixmap    */
+    FT_Outline  outline;
+
+    Long        traceOfs;           /* current offset in target bitmap     */
+    Long        traceG;             /* current offset in target pixmap     */
+
+    Short       traceIncr;          /* sweep's increment in target bitmap  */
+
+    Short       gray_min_x;         /* current min x during gray rendering */
+    Short       gray_max_x;         /* current max x during gray rendering */
+
+    /* dispatch variables */
+
+    Function_Sweep_Init*  Proc_Sweep_Init;
+    Function_Sweep_Span*  Proc_Sweep_Span;
+    Function_Sweep_Span*  Proc_Sweep_Drop;
+    Function_Sweep_Step*  Proc_Sweep_Step;
+
+    Byte        dropOutControl;     /* current drop_out control method     */
+
+    Bool        second_pass;        /* indicates whether a horizontal pass */
+                                    /* should be performed to control      */
+                                    /* drop-out accurately when calling    */
+                                    /* Render_Glyph.  Note that there is   */
+                                    /* no horizontal pass during gray      */
+                                    /* rendering.                          */
+
+    TPoint      arcs[3 * MaxBezier + 1]; /* The Bezier stack               */
+
+    black_TBand  band_stack[16];    /* band stack used for sub-banding     */
+    Int          band_top;          /* band stack top                      */
+
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+    Byte*       grays;
+
+    Byte        gray_lines[RASTER_GRAY_LINES];
+                                /* Intermediate table used to render the   */
+                                /* graylevels pixmaps.                     */
+                                /* gray_lines is a buffer holding two      */
+                                /* monochrome scanlines                    */
+
+    Short       gray_width;     /* width in bytes of one monochrome        */
+                                /* intermediate scanline of gray_lines.    */
+                                /* Each gray pixel takes 2 bits long there */
+
+                       /* The gray_lines must hold 2 lines, thus with size */
+                       /* in bytes of at least `gray_width*2'.             */
+
+#endif /* FT_RASTER_ANTI_ALIASING */
+
+  };
+
+
+  typedef struct  black_TRaster_
+  {
+    char*          buffer;
+    long           buffer_size;
+    void*          memory;
+    black_PWorker  worker;
+    Byte           grays[5];
+    Short          gray_width;
+
+  } black_TRaster, *black_PRaster;
+
+#ifdef FT_STATIC_RASTER
+
+  static black_TWorker  cur_ras;
+#define ras  cur_ras
+
+#else /* !FT_STATIC_RASTER */
+
+#define ras  (*worker)
+
+#endif /* !FT_STATIC_RASTER */
+
+
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+  /* A lookup table used to quickly count set bits in four gray 2x2 */
+  /* cells.  The values of the table have been produced with the    */
+  /* following code:                                                */
+  /*                                                                */
+  /*   for ( i = 0; i < 256; i++ )                                  */
+  /*   {                                                            */
+  /*     l = 0;                                                     */
+  /*     j = i;                                                     */
+  /*                                                                */
+  /*     for ( c = 0; c < 4; c++ )                                  */
+  /*     {                                                          */
+  /*       l <<= 4;                                                 */
+  /*                                                                */
+  /*       if ( j & 0x80 ) l++;                                     */
+  /*       if ( j & 0x40 ) l++;                                     */
+  /*                                                                */
+  /*       j = ( j << 2 ) & 0xFF;                                   */
+  /*     }                                                          */
+  /*     printf( "0x%04X", l );                                     */
+  /*   }                                                            */
+  /*                                                                */
+
+  static const short  count_table[256] =
+  {
+    0x0000, 0x0001, 0x0001, 0x0002, 0x0010, 0x0011, 0x0011, 0x0012,
+    0x0010, 0x0011, 0x0011, 0x0012, 0x0020, 0x0021, 0x0021, 0x0022,
+    0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112,
+    0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122,
+    0x0100, 0x0101, 0x0101, 0x0102, 0x0110, 0x0111, 0x0111, 0x0112,
+    0x0110, 0x0111, 0x0111, 0x0112, 0x0120, 0x0121, 0x0121, 0x0122,
+    0x0200, 0x0201, 0x0201, 0x0202, 0x0210, 0x0211, 0x0211, 0x0212,
+    0x0210, 0x0211, 0x0211, 0x0212, 0x0220, 0x0221, 0x0221, 0x0222,
+    0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012,
+    0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022,
+    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
+    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
+    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
+    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
+    0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212,
+    0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222,
+    0x1000, 0x1001, 0x1001, 0x1002, 0x1010, 0x1011, 0x1011, 0x1012,
+    0x1010, 0x1011, 0x1011, 0x1012, 0x1020, 0x1021, 0x1021, 0x1022,
+    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
+    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
+    0x1100, 0x1101, 0x1101, 0x1102, 0x1110, 0x1111, 0x1111, 0x1112,
+    0x1110, 0x1111, 0x1111, 0x1112, 0x1120, 0x1121, 0x1121, 0x1122,
+    0x1200, 0x1201, 0x1201, 0x1202, 0x1210, 0x1211, 0x1211, 0x1212,
+    0x1210, 0x1211, 0x1211, 0x1212, 0x1220, 0x1221, 0x1221, 0x1222,
+    0x2000, 0x2001, 0x2001, 0x2002, 0x2010, 0x2011, 0x2011, 0x2012,
+    0x2010, 0x2011, 0x2011, 0x2012, 0x2020, 0x2021, 0x2021, 0x2022,
+    0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112,
+    0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122,
+    0x2100, 0x2101, 0x2101, 0x2102, 0x2110, 0x2111, 0x2111, 0x2112,
+    0x2110, 0x2111, 0x2111, 0x2112, 0x2120, 0x2121, 0x2121, 0x2122,
+    0x2200, 0x2201, 0x2201, 0x2202, 0x2210, 0x2211, 0x2211, 0x2212,
+    0x2210, 0x2211, 0x2211, 0x2212, 0x2220, 0x2221, 0x2221, 0x2222
+  };
+
+#endif /* FT_RASTER_OPTION_ANTI_ALIASING */
+
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /**                                                                     **/
+  /**  PROFILES COMPUTATION                                               **/
+  /**                                                                     **/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Set_High_Precision                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Set precision variables according to param flag.                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    High :: Set to True for high precision (typically for ppem < 18),  */
+  /*            false otherwise.                                           */
+  /*                                                                       */
+  static void
+  Set_High_Precision( RAS_ARGS Int  High )
+  {
+    /*
+     * `precision_step' is used in `Bezier_Up' to decide when to split a
+     * given y-monotonous Bezier arc that crosses a scanline before
+     * approximating it as a straight segment.  The default value of 32 (for
+     * low accuracy) corresponds to
+     *
+     *   32 / 64 == 0.5 pixels ,
+     *
+     * while for the high accuracy case we have
+     *
+     *   256/ (1 << 12) = 0.0625 pixels .
+     *
+     * `precision_jitter' is an epsilon threshold used in
+     * `Vertical_Sweep_Span' to deal with small imperfections in the Bezier
+     * decomposition (after all, we are working with approximations only);
+     * it avoids switching on additional pixels which would cause artifacts
+     * otherwise.
+     *
+     * The value of `precision_jitter' has been determined heuristically.
+     *
+     */
+
+    if ( High )
+    {
+      ras.precision_bits   = 12;
+      ras.precision_step   = 256;
+      ras.precision_jitter = 30;
+    }
+    else
+    {
+      ras.precision_bits   = 6;
+      ras.precision_step   = 32;
+      ras.precision_jitter = 2;
+    }
+
+    FT_TRACE6(( "Set_High_Precision(%s)\n", High ? "true" : "false" ));
+
+    ras.precision       = 1 << ras.precision_bits;
+    ras.precision_half  = ras.precision / 2;
+    ras.precision_shift = ras.precision_bits - Pixel_Bits;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    New_Profile                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Create a new profile in the render pool.                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    aState    :: The state/orientation of the new profile.             */
+  /*                                                                       */
+  /*    overshoot :: Whether the profile's unrounded start position        */
+  /*                 differs by at least a half pixel.                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*   SUCCESS on success.  FAILURE in case of overflow or of incoherent   */
+  /*   profile.                                                            */
+  /*                                                                       */
+  static Bool
+  New_Profile( RAS_ARGS TStates  aState,
+                        Bool     overshoot )
+  {
+    if ( !ras.fProfile )
+    {
+      ras.cProfile  = (PProfile)ras.top;
+      ras.fProfile  = ras.cProfile;
+      ras.top      += AlignProfileSize;
+    }
+
+    if ( ras.top >= ras.maxBuff )
+    {
+      ras.error = Raster_Err_Overflow;
+      return FAILURE;
+    }
+
+    ras.cProfile->flags  = 0;
+    ras.cProfile->start  = 0;
+    ras.cProfile->height = 0;
+    ras.cProfile->offset = ras.top;
+    ras.cProfile->link   = (PProfile)0;
+    ras.cProfile->next   = (PProfile)0;
+    ras.cProfile->flags  = ras.dropOutControl;
+
+    switch ( aState )
+    {
+    case Ascending_State:
+      ras.cProfile->flags |= Flow_Up;
+      if ( overshoot )
+        ras.cProfile->flags |= Overshoot_Bottom;
+
+      FT_TRACE6(( "New ascending profile = %p\n", ras.cProfile ));
+      break;
+
+    case Descending_State:
+      if ( overshoot )
+        ras.cProfile->flags |= Overshoot_Top;
+      FT_TRACE6(( "New descending profile = %p\n", ras.cProfile ));
+      break;
+
+    default:
+      FT_ERROR(( "New_Profile: invalid profile direction\n" ));
+      ras.error = Raster_Err_Invalid;
+      return FAILURE;
+    }
+
+    if ( !ras.gProfile )
+      ras.gProfile = ras.cProfile;
+
+    ras.state = aState;
+    ras.fresh = TRUE;
+    ras.joint = FALSE;
+
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    End_Profile                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalize the current profile.                                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    overshoot :: Whether the profile's unrounded end position differs  */
+  /*                 by at least a half pixel.                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS on success.  FAILURE in case of overflow or incoherency.   */
+  /*                                                                       */
+  static Bool
+  End_Profile( RAS_ARGS Bool  overshoot )
+  {
+    Long      h;
+    PProfile  oldProfile;
+
+
+    h = (Long)( ras.top - ras.cProfile->offset );
+
+    if ( h < 0 )
+    {
+      FT_ERROR(( "End_Profile: negative height encountered\n" ));
+      ras.error = Raster_Err_Neg_Height;
+      return FAILURE;
+    }
+
+    if ( h > 0 )
+    {
+      FT_TRACE6(( "Ending profile %p, start = %ld, height = %ld\n",
+                  ras.cProfile, ras.cProfile->start, h ));
+
+      ras.cProfile->height = h;
+      if ( overshoot )
+      {
+        if ( ras.cProfile->flags & Flow_Up )
+          ras.cProfile->flags |= Overshoot_Top;
+        else
+          ras.cProfile->flags |= Overshoot_Bottom;
+      }
+
+      oldProfile   = ras.cProfile;
+      ras.cProfile = (PProfile)ras.top;
+
+      ras.top += AlignProfileSize;
+
+      ras.cProfile->height = 0;
+      ras.cProfile->offset = ras.top;
+
+      oldProfile->next = ras.cProfile;
+      ras.num_Profs++;
+    }
+
+    if ( ras.top >= ras.maxBuff )
+    {
+      FT_TRACE1(( "overflow in End_Profile\n" ));
+      ras.error = Raster_Err_Overflow;
+      return FAILURE;
+    }
+
+    ras.joint = FALSE;
+
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Insert_Y_Turn                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Insert a salient into the sorted list placed on top of the render  */
+  /*    pool.                                                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    New y scanline position.                                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS on success.  FAILURE in case of overflow.                  */
+  /*                                                                       */
+  static Bool
+  Insert_Y_Turn( RAS_ARGS Int  y )
+  {
+    PLong  y_turns;
+    Int    y2, n;
+
+
+    n       = ras.numTurns - 1;
+    y_turns = ras.sizeBuff - ras.numTurns;
+
+    /* look for first y value that is <= */
+    while ( n >= 0 && y < y_turns[n] )
+      n--;
+
+    /* if it is <, simply insert it, ignore if == */
+    if ( n >= 0 && y > y_turns[n] )
+      while ( n >= 0 )
+      {
+        y2 = (Int)y_turns[n];
+        y_turns[n] = y;
+        y = y2;
+        n--;
+      }
+
+    if ( n < 0 )
+    {
+      ras.maxBuff--;
+      if ( ras.maxBuff <= ras.top )
+      {
+        ras.error = Raster_Err_Overflow;
+        return FAILURE;
+      }
+      ras.numTurns++;
+      ras.sizeBuff[-ras.numTurns] = y;
+    }
+
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Finalize_Profile_Table                                             */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Adjust all links in the profiles list.                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS on success.  FAILURE in case of overflow.                  */
+  /*                                                                       */
+  static Bool
+  Finalize_Profile_Table( RAS_ARG )
+  {
+    Int       bottom, top;
+    UShort    n;
+    PProfile  p;
+
+
+    n = ras.num_Profs;
+    p = ras.fProfile;
+
+    if ( n > 1 && p )
+    {
+      while ( n > 0 )
+      {
+        if ( n > 1 )
+          p->link = (PProfile)( p->offset + p->height );
+        else
+          p->link = NULL;
+
+        if ( p->flags & Flow_Up )
+        {
+          bottom = (Int)p->start;
+          top    = (Int)( p->start + p->height - 1 );
+        }
+        else
+        {
+          bottom     = (Int)( p->start - p->height + 1 );
+          top        = (Int)p->start;
+          p->start   = bottom;
+          p->offset += p->height - 1;
+        }
+
+        if ( Insert_Y_Turn( RAS_VARS bottom )  ||
+             Insert_Y_Turn( RAS_VARS top + 1 ) )
+          return FAILURE;
+
+        p = p->link;
+        n--;
+      }
+    }
+    else
+      ras.fProfile = NULL;
+
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Split_Conic                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Subdivide one conic Bezier into two joint sub-arcs in the Bezier   */
+  /*    stack.                                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    None (subdivided Bezier is taken from the top of the stack).       */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This routine is the `beef' of this component.  It is  _the_ inner  */
+  /*    loop that should be optimized to hell to get the best performance. */
+  /*                                                                       */
+  static void
+  Split_Conic( TPoint*  base )
+  {
+    Long  a, b;
+
+
+    base[4].x = base[2].x;
+    b = base[1].x;
+    a = base[3].x = ( base[2].x + b ) / 2;
+    b = base[1].x = ( base[0].x + b ) / 2;
+    base[2].x = ( a + b ) / 2;
+
+    base[4].y = base[2].y;
+    b = base[1].y;
+    a = base[3].y = ( base[2].y + b ) / 2;
+    b = base[1].y = ( base[0].y + b ) / 2;
+    base[2].y = ( a + b ) / 2;
+
+    /* hand optimized.  gcc doesn't seem to be too good at common      */
+    /* expression substitution and instruction scheduling ;-)          */
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Split_Cubic                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Subdivide a third-order Bezier arc into two joint sub-arcs in the  */
+  /*    Bezier stack.                                                      */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This routine is the `beef' of the component.  It is one of _the_   */
+  /*    inner loops that should be optimized like hell to get the best     */
+  /*    performance.                                                       */
+  /*                                                                       */
+  static void
+  Split_Cubic( TPoint*  base )
+  {
+    Long  a, b, c, d;
+
+
+    base[6].x = base[3].x;
+    c = base[1].x;
+    d = base[2].x;
+    base[1].x = a = ( base[0].x + c + 1 ) >> 1;
+    base[5].x = b = ( base[3].x + d + 1 ) >> 1;
+    c = ( c + d + 1 ) >> 1;
+    base[2].x = a = ( a + c + 1 ) >> 1;
+    base[4].x = b = ( b + c + 1 ) >> 1;
+    base[3].x = ( a + b + 1 ) >> 1;
+
+    base[6].y = base[3].y;
+    c = base[1].y;
+    d = base[2].y;
+    base[1].y = a = ( base[0].y + c + 1 ) >> 1;
+    base[5].y = b = ( base[3].y + d + 1 ) >> 1;
+    c = ( c + d + 1 ) >> 1;
+    base[2].y = a = ( a + c + 1 ) >> 1;
+    base[4].y = b = ( b + c + 1 ) >> 1;
+    base[3].y = ( a + b + 1 ) >> 1;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Line_Up                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Compute the x-coordinates of an ascending line segment and store   */
+  /*    them in the render pool.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    x1   :: The x-coordinate of the segment's start point.             */
+  /*                                                                       */
+  /*    y1   :: The y-coordinate of the segment's start point.             */
+  /*                                                                       */
+  /*    x2   :: The x-coordinate of the segment's end point.               */
+  /*                                                                       */
+  /*    y2   :: The y-coordinate of the segment's end point.               */
+  /*                                                                       */
+  /*    miny :: A lower vertical clipping bound value.                     */
+  /*                                                                       */
+  /*    maxy :: An upper vertical clipping bound value.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS on success, FAILURE on render pool overflow.               */
+  /*                                                                       */
+  static Bool
+  Line_Up( RAS_ARGS Long  x1,
+                    Long  y1,
+                    Long  x2,
+                    Long  y2,
+                    Long  miny,
+                    Long  maxy )
+  {
+    Long   Dx, Dy;
+    Int    e1, e2, f1, f2, size;     /* XXX: is `Short' sufficient? */
+    Long   Ix, Rx, Ax;
+
+    PLong  top;
+
+
+    Dx = x2 - x1;
+    Dy = y2 - y1;
+
+    if ( Dy <= 0 || y2 < miny || y1 > maxy )
+      return SUCCESS;
+
+    if ( y1 < miny )
+    {
+      /* Take care: miny-y1 can be a very large value; we use     */
+      /*            a slow MulDiv function to avoid clipping bugs */
+      x1 += SMulDiv( Dx, miny - y1, Dy );
+      e1  = (Int)TRUNC( miny );
+      f1  = 0;
+    }
+    else
+    {
+      e1 = (Int)TRUNC( y1 );
+      f1 = (Int)FRAC( y1 );
+    }
+
+    if ( y2 > maxy )
+    {
+      /* x2 += FMulDiv( Dx, maxy - y2, Dy );  UNNECESSARY */
+      e2  = (Int)TRUNC( maxy );
+      f2  = 0;
+    }
+    else
+    {
+      e2 = (Int)TRUNC( y2 );
+      f2 = (Int)FRAC( y2 );
+    }
+
+    if ( f1 > 0 )
+    {
+      if ( e1 == e2 )
+        return SUCCESS;
+      else
+      {
+        x1 += SMulDiv( Dx, ras.precision - f1, Dy );
+        e1 += 1;
+      }
+    }
+    else
+      if ( ras.joint )
+      {
+        ras.top--;
+        ras.joint = FALSE;
+      }
+
+    ras.joint = (char)( f2 == 0 );
+
+    if ( ras.fresh )
+    {
+      ras.cProfile->start = e1;
+      ras.fresh           = FALSE;
+    }
+
+    size = e2 - e1 + 1;
+    if ( ras.top + size >= ras.maxBuff )
+    {
+      ras.error = Raster_Err_Overflow;
+      return FAILURE;
+    }
+
+    if ( Dx > 0 )
+    {
+      Ix = SMulDiv( ras.precision, Dx, Dy);
+      Rx = ( ras.precision * Dx ) % Dy;
+      Dx = 1;
+    }
+    else
+    {
+      Ix = SMulDiv( ras.precision, -Dx, Dy) * -1;
+      Rx =    ( ras.precision * -Dx ) % Dy;
+      Dx = -1;
+    }
+
+    Ax  = -Dy;
+    top = ras.top;
+
+    while ( size > 0 )
+    {
+      *top++ = x1;
+
+      x1 += Ix;
+      Ax += Rx;
+      if ( Ax >= 0 )
+      {
+        Ax -= Dy;
+        x1 += Dx;
+      }
+      size--;
+    }
+
+    ras.top = top;
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Line_Down                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Compute the x-coordinates of an descending line segment and store  */
+  /*    them in the render pool.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    x1   :: The x-coordinate of the segment's start point.             */
+  /*                                                                       */
+  /*    y1   :: The y-coordinate of the segment's start point.             */
+  /*                                                                       */
+  /*    x2   :: The x-coordinate of the segment's end point.               */
+  /*                                                                       */
+  /*    y2   :: The y-coordinate of the segment's end point.               */
+  /*                                                                       */
+  /*    miny :: A lower vertical clipping bound value.                     */
+  /*                                                                       */
+  /*    maxy :: An upper vertical clipping bound value.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS on success, FAILURE on render pool overflow.               */
+  /*                                                                       */
+  static Bool
+  Line_Down( RAS_ARGS Long  x1,
+                      Long  y1,
+                      Long  x2,
+                      Long  y2,
+                      Long  miny,
+                      Long  maxy )
+  {
+    Bool  result, fresh;
+
+
+    fresh  = ras.fresh;
+
+    result = Line_Up( RAS_VARS x1, -y1, x2, -y2, -maxy, -miny );
+
+    if ( fresh && !ras.fresh )
+      ras.cProfile->start = -ras.cProfile->start;
+
+    return result;
+  }
+
+
+  /* A function type describing the functions used to split Bezier arcs */
+  typedef void  (*TSplitter)( TPoint*  base );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Bezier_Up                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Compute the x-coordinates of an ascending Bezier arc and store     */
+  /*    them in the render pool.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    degree   :: The degree of the Bezier arc (either 2 or 3).          */
+  /*                                                                       */
+  /*    splitter :: The function to split Bezier arcs.                     */
+  /*                                                                       */
+  /*    miny     :: A lower vertical clipping bound value.                 */
+  /*                                                                       */
+  /*    maxy     :: An upper vertical clipping bound value.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS on success, FAILURE on render pool overflow.               */
+  /*                                                                       */
+  static Bool
+  Bezier_Up( RAS_ARGS Int        degree,
+                      TSplitter  splitter,
+                      Long       miny,
+                      Long       maxy )
+  {
+    Long   y1, y2, e, e2, e0;
+    Short  f1;
+
+    TPoint*  arc;
+    TPoint*  start_arc;
+
+    PLong top;
+
+
+    arc = ras.arc;
+    y1  = arc[degree].y;
+    y2  = arc[0].y;
+    top = ras.top;
+
+    if ( y2 < miny || y1 > maxy )
+      goto Fin;
+
+    e2 = FLOOR( y2 );
+
+    if ( e2 > maxy )
+      e2 = maxy;
+
+    e0 = miny;
+
+    if ( y1 < miny )
+      e = miny;
+    else
+    {
+      e  = CEILING( y1 );
+      f1 = (Short)( FRAC( y1 ) );
+      e0 = e;
+
+      if ( f1 == 0 )
+      {
+        if ( ras.joint )
+        {
+          top--;
+          ras.joint = FALSE;
+        }
+
+        *top++ = arc[degree].x;
+
+        e += ras.precision;
+      }
+    }
+
+    if ( ras.fresh )
+    {
+      ras.cProfile->start = TRUNC( e0 );
+      ras.fresh = FALSE;
+    }
+
+    if ( e2 < e )
+      goto Fin;
+
+    if ( ( top + TRUNC( e2 - e ) + 1 ) >= ras.maxBuff )
+    {
+      ras.top   = top;
+      ras.error = Raster_Err_Overflow;
+      return FAILURE;
+    }
+
+    start_arc = arc;
+
+    while ( arc >= start_arc && e <= e2 )
+    {
+      ras.joint = FALSE;
+
+      y2 = arc[0].y;
+
+      if ( y2 > e )
+      {
+        y1 = arc[degree].y;
+        if ( y2 - y1 >= ras.precision_step )
+        {
+          splitter( arc );
+          arc += degree;
+        }
+        else
+        {
+          *top++ = arc[degree].x + FMulDiv( arc[0].x - arc[degree].x,
+                                            e - y1, y2 - y1 );
+          arc -= degree;
+          e   += ras.precision;
+        }
+      }
+      else
+      {
+        if ( y2 == e )
+        {
+          ras.joint  = TRUE;
+          *top++     = arc[0].x;
+
+          e += ras.precision;
+        }
+        arc -= degree;
+      }
+    }
+
+  Fin:
+    ras.top  = top;
+    ras.arc -= degree;
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Bezier_Down                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Compute the x-coordinates of an descending Bezier arc and store    */
+  /*    them in the render pool.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    degree   :: The degree of the Bezier arc (either 2 or 3).          */
+  /*                                                                       */
+  /*    splitter :: The function to split Bezier arcs.                     */
+  /*                                                                       */
+  /*    miny     :: A lower vertical clipping bound value.                 */
+  /*                                                                       */
+  /*    maxy     :: An upper vertical clipping bound value.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS on success, FAILURE on render pool overflow.               */
+  /*                                                                       */
+  static Bool
+  Bezier_Down( RAS_ARGS Int        degree,
+                        TSplitter  splitter,
+                        Long       miny,
+                        Long       maxy )
+  {
+    TPoint*  arc = ras.arc;
+    Bool     result, fresh;
+
+
+    arc[0].y = -arc[0].y;
+    arc[1].y = -arc[1].y;
+    arc[2].y = -arc[2].y;
+    if ( degree > 2 )
+      arc[3].y = -arc[3].y;
+
+    fresh = ras.fresh;
+
+    result = Bezier_Up( RAS_VARS degree, splitter, -maxy, -miny );
+
+    if ( fresh && !ras.fresh )
+      ras.cProfile->start = -ras.cProfile->start;
+
+    arc[0].y = -arc[0].y;
+    return result;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Line_To                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Inject a new line segment and adjust the Profiles list.            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*   x :: The x-coordinate of the segment's end point (its start point   */
+  /*        is stored in `lastX').                                         */
+  /*                                                                       */
+  /*   y :: The y-coordinate of the segment's end point (its start point   */
+  /*        is stored in `lastY').                                         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*   SUCCESS on success, FAILURE on render pool overflow or incorrect    */
+  /*   profile.                                                            */
+  /*                                                                       */
+  static Bool
+  Line_To( RAS_ARGS Long  x,
+                    Long  y )
+  {
+    /* First, detect a change of direction */
+
+    switch ( ras.state )
+    {
+    case Unknown_State:
+      if ( y > ras.lastY )
+      {
+        if ( New_Profile( RAS_VARS Ascending_State,
+                                   IS_BOTTOM_OVERSHOOT( ras.lastY ) ) )
+          return FAILURE;
+      }
+      else
+      {
+        if ( y < ras.lastY )
+          if ( New_Profile( RAS_VARS Descending_State,
+                                     IS_TOP_OVERSHOOT( ras.lastY ) ) )
+            return FAILURE;
+      }
+      break;
+
+    case Ascending_State:
+      if ( y < ras.lastY )
+      {
+        if ( End_Profile( RAS_VARS IS_TOP_OVERSHOOT( ras.lastY ) ) ||
+             New_Profile( RAS_VARS Descending_State,
+                                   IS_TOP_OVERSHOOT( ras.lastY ) ) )
+          return FAILURE;
+      }
+      break;
+
+    case Descending_State:
+      if ( y > ras.lastY )
+      {
+        if ( End_Profile( RAS_VARS IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ||
+             New_Profile( RAS_VARS Ascending_State,
+                                   IS_BOTTOM_OVERSHOOT( ras.lastY ) ) )
+          return FAILURE;
+      }
+      break;
+
+    default:
+      ;
+    }
+
+    /* Then compute the lines */
+
+    switch ( ras.state )
+    {
+    case Ascending_State:
+      if ( Line_Up( RAS_VARS ras.lastX, ras.lastY,
+                             x, y, ras.minY, ras.maxY ) )
+        return FAILURE;
+      break;
+
+    case Descending_State:
+      if ( Line_Down( RAS_VARS ras.lastX, ras.lastY,
+                               x, y, ras.minY, ras.maxY ) )
+        return FAILURE;
+      break;
+
+    default:
+      ;
+    }
+
+    ras.lastX = x;
+    ras.lastY = y;
+
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Conic_To                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Inject a new conic arc and adjust the profile list.                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*   cx :: The x-coordinate of the arc's new control point.              */
+  /*                                                                       */
+  /*   cy :: The y-coordinate of the arc's new control point.              */
+  /*                                                                       */
+  /*   x  :: The x-coordinate of the arc's end point (its start point is   */
+  /*         stored in `lastX').                                           */
+  /*                                                                       */
+  /*   y  :: The y-coordinate of the arc's end point (its start point is   */
+  /*         stored in `lastY').                                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*   SUCCESS on success, FAILURE on render pool overflow or incorrect    */
+  /*   profile.                                                            */
+  /*                                                                       */
+  static Bool
+  Conic_To( RAS_ARGS Long  cx,
+                     Long  cy,
+                     Long  x,
+                     Long  y )
+  {
+    Long     y1, y2, y3, x3, ymin, ymax;
+    TStates  state_bez;
+
+
+    ras.arc      = ras.arcs;
+    ras.arc[2].x = ras.lastX;
+    ras.arc[2].y = ras.lastY;
+    ras.arc[1].x = cx;
+    ras.arc[1].y = cy;
+    ras.arc[0].x = x;
+    ras.arc[0].y = y;
+
+    do
+    {
+      y1 = ras.arc[2].y;
+      y2 = ras.arc[1].y;
+      y3 = ras.arc[0].y;
+      x3 = ras.arc[0].x;
+
+      /* first, categorize the Bezier arc */
+
+      if ( y1 <= y3 )
+      {
+        ymin = y1;
+        ymax = y3;
+      }
+      else
+      {
+        ymin = y3;
+        ymax = y1;
+      }
+
+      if ( y2 < ymin || y2 > ymax )
+      {
+        /* this arc has no given direction, split it! */
+        Split_Conic( ras.arc );
+        ras.arc += 2;
+      }
+      else if ( y1 == y3 )
+      {
+        /* this arc is flat, ignore it and pop it from the Bezier stack */
+        ras.arc -= 2;
+      }
+      else
+      {
+        /* the arc is y-monotonous, either ascending or descending */
+        /* detect a change of direction                            */
+        state_bez = y1 < y3 ? Ascending_State : Descending_State;
+        if ( ras.state != state_bez )
+        {
+          Bool  o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 )
+                                                 : IS_TOP_OVERSHOOT( y1 );
+
+
+          /* finalize current profile if any */
+          if ( ras.state != Unknown_State &&
+               End_Profile( RAS_VARS o )  )
+            goto Fail;
+
+          /* create a new profile */
+          if ( New_Profile( RAS_VARS state_bez, o ) )
+            goto Fail;
+        }
+
+        /* now call the appropriate routine */
+        if ( state_bez == Ascending_State )
+        {
+          if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
+            goto Fail;
+        }
+        else
+          if ( Bezier_Down( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
+            goto Fail;
+      }
+
+    } while ( ras.arc >= ras.arcs );
+
+    ras.lastX = x3;
+    ras.lastY = y3;
+
+    return SUCCESS;
+
+  Fail:
+    return FAILURE;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Cubic_To                                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Inject a new cubic arc and adjust the profile list.                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*   cx1 :: The x-coordinate of the arc's first new control point.       */
+  /*                                                                       */
+  /*   cy1 :: The y-coordinate of the arc's first new control point.       */
+  /*                                                                       */
+  /*   cx2 :: The x-coordinate of the arc's second new control point.      */
+  /*                                                                       */
+  /*   cy2 :: The y-coordinate of the arc's second new control point.      */
+  /*                                                                       */
+  /*   x   :: The x-coordinate of the arc's end point (its start point is  */
+  /*          stored in `lastX').                                          */
+  /*                                                                       */
+  /*   y   :: The y-coordinate of the arc's end point (its start point is  */
+  /*          stored in `lastY').                                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*   SUCCESS on success, FAILURE on render pool overflow or incorrect    */
+  /*   profile.                                                            */
+  /*                                                                       */
+  static Bool
+  Cubic_To( RAS_ARGS Long  cx1,
+                     Long  cy1,
+                     Long  cx2,
+                     Long  cy2,
+                     Long  x,
+                     Long  y )
+  {
+    Long     y1, y2, y3, y4, x4, ymin1, ymax1, ymin2, ymax2;
+    TStates  state_bez;
+
+
+    ras.arc      = ras.arcs;
+    ras.arc[3].x = ras.lastX;
+    ras.arc[3].y = ras.lastY;
+    ras.arc[2].x = cx1;
+    ras.arc[2].y = cy1;
+    ras.arc[1].x = cx2;
+    ras.arc[1].y = cy2;
+    ras.arc[0].x = x;
+    ras.arc[0].y = y;
+
+    do
+    {
+      y1 = ras.arc[3].y;
+      y2 = ras.arc[2].y;
+      y3 = ras.arc[1].y;
+      y4 = ras.arc[0].y;
+      x4 = ras.arc[0].x;
+
+      /* first, categorize the Bezier arc */
+
+      if ( y1 <= y4 )
+      {
+        ymin1 = y1;
+        ymax1 = y4;
+      }
+      else
+      {
+        ymin1 = y4;
+        ymax1 = y1;
+      }
+
+      if ( y2 <= y3 )
+      {
+        ymin2 = y2;
+        ymax2 = y3;
+      }
+      else
+      {
+        ymin2 = y3;
+        ymax2 = y2;
+      }
+
+      if ( ymin2 < ymin1 || ymax2 > ymax1 )
+      {
+        /* this arc has no given direction, split it! */
+        Split_Cubic( ras.arc );
+        ras.arc += 3;
+      }
+      else if ( y1 == y4 )
+      {
+        /* this arc is flat, ignore it and pop it from the Bezier stack */
+        ras.arc -= 3;
+      }
+      else
+      {
+        state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State;
+
+        /* detect a change of direction */
+        if ( ras.state != state_bez )
+        {
+          Bool  o = state_bez == Ascending_State ? IS_BOTTOM_OVERSHOOT( y1 )
+                                                 : IS_TOP_OVERSHOOT( y1 );
+
+
+          /* finalize current profile if any */
+          if ( ras.state != Unknown_State &&
+               End_Profile( RAS_VARS o )  )
+            goto Fail;
+
+          if ( New_Profile( RAS_VARS state_bez, o ) )
+            goto Fail;
+        }
+
+        /* compute intersections */
+        if ( state_bez == Ascending_State )
+        {
+          if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
+            goto Fail;
+        }
+        else
+          if ( Bezier_Down( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
+            goto Fail;
+      }
+
+    } while ( ras.arc >= ras.arcs );
+
+    ras.lastX = x4;
+    ras.lastY = y4;
+
+    return SUCCESS;
+
+  Fail:
+    return FAILURE;
+  }
+
+
+#undef  SWAP_
+#define SWAP_( x, y )  do                \
+                       {                 \
+                         Long  swap = x; \
+                                         \
+                                         \
+                         x = y;          \
+                         y = swap;       \
+                       } while ( 0 )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Decompose_Curve                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Scan the outline arrays in order to emit individual segments and   */
+  /*    Beziers by calling Line_To() and Bezier_To().  It handles all      */
+  /*    weird cases, like when the first point is off the curve, or when   */
+  /*    there are simply no `on' points in the contour!                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    first   :: The index of the first point in the contour.            */
+  /*                                                                       */
+  /*    last    :: The index of the last point in the contour.             */
+  /*                                                                       */
+  /*    flipped :: If set, flip the direction of the curve.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS on success, FAILURE on error.                              */
+  /*                                                                       */
+  static Bool
+  Decompose_Curve( RAS_ARGS UShort  first,
+                            UShort  last,
+                            int     flipped )
+  {
+    FT_Vector   v_last;
+    FT_Vector   v_control;
+    FT_Vector   v_start;
+
+    FT_Vector*  points;
+    FT_Vector*  point;
+    FT_Vector*  limit;
+    char*       tags;
+
+    unsigned    tag;       /* current point's state           */
+
+
+    points = ras.outline.points;
+    limit  = points + last;
+
+    v_start.x = SCALED( points[first].x );
+    v_start.y = SCALED( points[first].y );
+    v_last.x  = SCALED( points[last].x );
+    v_last.y  = SCALED( points[last].y );
+
+    if ( flipped )
+    {
+      SWAP_( v_start.x, v_start.y );
+      SWAP_( v_last.x, v_last.y );
+    }
+
+    v_control = v_start;
+
+    point = points + first;
+    tags  = ras.outline.tags + first;
+
+    /* set scan mode if necessary */
+    if ( tags[0] & FT_CURVE_TAG_HAS_SCANMODE )
+      ras.dropOutControl = (Byte)tags[0] >> 5;
+
+    tag = FT_CURVE_TAG( tags[0] );
+
+    /* A contour cannot start with a cubic control point! */
+    if ( tag == FT_CURVE_TAG_CUBIC )
+      goto Invalid_Outline;
+
+    /* check first point to determine origin */
+    if ( tag == FT_CURVE_TAG_CONIC )
+    {
+      /* first point is conic control.  Yes, this happens. */
+      if ( FT_CURVE_TAG( ras.outline.tags[last] ) == FT_CURVE_TAG_ON )
+      {
+        /* start at last point if it is on the curve */
+        v_start = v_last;
+        limit--;
+      }
+      else
+      {
+        /* if both first and last points are conic,         */
+        /* start at their middle and record its position    */
+        /* for closure                                      */
+        v_start.x = ( v_start.x + v_last.x ) / 2;
+        v_start.y = ( v_start.y + v_last.y ) / 2;
+
+        v_last = v_start;
+      }
+      point--;
+      tags--;
+    }
+
+    ras.lastX = v_start.x;
+    ras.lastY = v_start.y;
+
+    while ( point < limit )
+    {
+      point++;
+      tags++;
+
+      tag = FT_CURVE_TAG( tags[0] );
+
+      switch ( tag )
+      {
+      case FT_CURVE_TAG_ON:  /* emit a single line_to */
+        {
+          Long  x, y;
+
+
+          x = SCALED( point->x );
+          y = SCALED( point->y );
+          if ( flipped )
+            SWAP_( x, y );
+
+          if ( Line_To( RAS_VARS x, y ) )
+            goto Fail;
+          continue;
+        }
+
+      case FT_CURVE_TAG_CONIC:  /* consume conic arcs */
+        v_control.x = SCALED( point[0].x );
+        v_control.y = SCALED( point[0].y );
+
+        if ( flipped )
+          SWAP_( v_control.x, v_control.y );
+
+      Do_Conic:
+        if ( point < limit )
+        {
+          FT_Vector  v_middle;
+          Long       x, y;
+
+
+          point++;
+          tags++;
+          tag = FT_CURVE_TAG( tags[0] );
+
+          x = SCALED( point[0].x );
+          y = SCALED( point[0].y );
+
+          if ( flipped )
+            SWAP_( x, y );
+
+          if ( tag == FT_CURVE_TAG_ON )
+          {
+            if ( Conic_To( RAS_VARS v_control.x, v_control.y, x, y ) )
+              goto Fail;
+            continue;
+          }
+
+          if ( tag != FT_CURVE_TAG_CONIC )
+            goto Invalid_Outline;
+
+          v_middle.x = ( v_control.x + x ) / 2;
+          v_middle.y = ( v_control.y + y ) / 2;
+
+          if ( Conic_To( RAS_VARS v_control.x, v_control.y,
+                                  v_middle.x,  v_middle.y ) )
+            goto Fail;
+
+          v_control.x = x;
+          v_control.y = y;
+
+          goto Do_Conic;
+        }
+
+        if ( Conic_To( RAS_VARS v_control.x, v_control.y,
+                                v_start.x,   v_start.y ) )
+          goto Fail;
+
+        goto Close;
+
+      default:  /* FT_CURVE_TAG_CUBIC */
+        {
+          Long  x1, y1, x2, y2, x3, y3;
+
+
+          if ( point + 1 > limit                             ||
+               FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
+            goto Invalid_Outline;
+
+          point += 2;
+          tags  += 2;
+
+          x1 = SCALED( point[-2].x );
+          y1 = SCALED( point[-2].y );
+          x2 = SCALED( point[-1].x );
+          y2 = SCALED( point[-1].y );
+
+          if ( flipped )
+          {
+            SWAP_( x1, y1 );
+            SWAP_( x2, y2 );
+          }
+
+          if ( point <= limit )
+          {
+            x3 = SCALED( point[0].x );
+            y3 = SCALED( point[0].y );
+
+            if ( flipped )
+              SWAP_( x3, y3 );
+
+            if ( Cubic_To( RAS_VARS x1, y1, x2, y2, x3, y3 ) )
+              goto Fail;
+            continue;
+          }
+
+          if ( Cubic_To( RAS_VARS x1, y1, x2, y2, v_start.x, v_start.y ) )
+            goto Fail;
+          goto Close;
+        }
+      }
+    }
+
+    /* close the contour with a line segment */
+    if ( Line_To( RAS_VARS v_start.x, v_start.y ) )
+      goto Fail;
+
+  Close:
+    return SUCCESS;
+
+  Invalid_Outline:
+    ras.error = Raster_Err_Invalid;
+
+  Fail:
+    return FAILURE;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Convert_Glyph                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Convert a glyph into a series of segments and arcs and make a      */
+  /*    profiles list with them.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    flipped :: If set, flip the direction of curve.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS on success, FAILURE if any error was encountered during    */
+  /*    rendering.                                                         */
+  /*                                                                       */
+  static Bool
+  Convert_Glyph( RAS_ARGS int  flipped )
+  {
+    int       i;
+    unsigned  start;
+
+    PProfile  lastProfile;
+
+
+    ras.fProfile = NULL;
+    ras.joint    = FALSE;
+    ras.fresh    = FALSE;
+
+    ras.maxBuff  = ras.sizeBuff - AlignProfileSize;
+
+    ras.numTurns = 0;
+
+    ras.cProfile         = (PProfile)ras.top;
+    ras.cProfile->offset = ras.top;
+    ras.num_Profs        = 0;
+
+    start = 0;
+
+    for ( i = 0; i < ras.outline.n_contours; i++ )
+    {
+      Bool  o;
+
+
+      ras.state    = Unknown_State;
+      ras.gProfile = NULL;
+
+      if ( Decompose_Curve( RAS_VARS (unsigned short)start,
+                                     ras.outline.contours[i],
+                                     flipped ) )
+        return FAILURE;
+
+      start = ras.outline.contours[i] + 1;
+
+      /* we must now check whether the extreme arcs join or not */
+      if ( FRAC( ras.lastY ) == 0 &&
+           ras.lastY >= ras.minY  &&
+           ras.lastY <= ras.maxY  )
+        if ( ras.gProfile                        &&
+             ( ras.gProfile->flags & Flow_Up ) ==
+               ( ras.cProfile->flags & Flow_Up ) )
+          ras.top--;
+        /* Note that ras.gProfile can be nil if the contour was too small */
+        /* to be drawn.                                                   */
+
+      lastProfile = ras.cProfile;
+      if ( ras.cProfile->flags & Flow_Up )
+        o = IS_TOP_OVERSHOOT( ras.lastY );
+      else
+        o = IS_BOTTOM_OVERSHOOT( ras.lastY );
+      if ( End_Profile( RAS_VARS o ) )
+        return FAILURE;
+
+      /* close the `next profile in contour' linked list */
+      if ( ras.gProfile )
+        lastProfile->next = ras.gProfile;
+    }
+
+    if ( Finalize_Profile_Table( RAS_VAR ) )
+      return FAILURE;
+
+    return (Bool)( ras.top < ras.maxBuff ? SUCCESS : FAILURE );
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /**                                                                     **/
+  /**  SCAN-LINE SWEEPS AND DRAWING                                       **/
+  /**                                                                     **/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Init_Linked                                                          */
+  /*                                                                       */
+  /*    Initializes an empty linked list.                                  */
+  /*                                                                       */
+  static void
+  Init_Linked( TProfileList*  l )
+  {
+    *l = NULL;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  InsNew                                                               */
+  /*                                                                       */
+  /*    Inserts a new profile in a linked list.                            */
+  /*                                                                       */
+  static void
+  InsNew( PProfileList  list,
+          PProfile      profile )
+  {
+    PProfile  *old, current;
+    Long       x;
+
+
+    old     = list;
+    current = *old;
+    x       = profile->X;
+
+    while ( current )
+    {
+      if ( x < current->X )
+        break;
+      old     = &current->link;
+      current = *old;
+    }
+
+    profile->link = current;
+    *old          = profile;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  DelOld                                                               */
+  /*                                                                       */
+  /*    Removes an old profile from a linked list.                         */
+  /*                                                                       */
+  static void
+  DelOld( PProfileList  list,
+          PProfile      profile )
+  {
+    PProfile  *old, current;
+
+
+    old     = list;
+    current = *old;
+
+    while ( current )
+    {
+      if ( current == profile )
+      {
+        *old = current->link;
+        return;
+      }
+
+      old     = &current->link;
+      current = *old;
+    }
+
+    /* we should never get there, unless the profile was not part of */
+    /* the list.                                                     */
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Sort                                                                 */
+  /*                                                                       */
+  /*    Sorts a trace list.  In 95%, the list is already sorted.  We need  */
+  /*    an algorithm which is fast in this case.  Bubble sort is enough    */
+  /*    and simple.                                                        */
+  /*                                                                       */
+  static void
+  Sort( PProfileList  list )
+  {
+    PProfile  *old, current, next;
+
+
+    /* First, set the new X coordinate of each profile */
+    current = *list;
+    while ( current )
+    {
+      current->X       = *current->offset;
+      current->offset += current->flags & Flow_Up ? 1 : -1;
+      current->height--;
+      current = current->link;
+    }
+
+    /* Then sort them */
+    old     = list;
+    current = *old;
+
+    if ( !current )
+      return;
+
+    next = current->link;
+
+    while ( next )
+    {
+      if ( current->X <= next->X )
+      {
+        old     = &current->link;
+        current = *old;
+
+        if ( !current )
+          return;
+      }
+      else
+      {
+        *old          = next;
+        current->link = next->link;
+        next->link    = current;
+
+        old     = list;
+        current = *old;
+      }
+
+      next = current->link;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Vertical Sweep Procedure Set                                         */
+  /*                                                                       */
+  /*  These four routines are used during the vertical black/white sweep   */
+  /*  phase by the generic Draw_Sweep() function.                          */
+  /*                                                                       */
+  /*************************************************************************/
+
+  static void
+  Vertical_Sweep_Init( RAS_ARGS Short*  min,
+                                Short*  max )
+  {
+    Long  pitch = ras.target.pitch;
+
+    FT_UNUSED( max );
+
+
+    ras.traceIncr = (Short)-pitch;
+    ras.traceOfs  = -*min * pitch;
+    if ( pitch > 0 )
+      ras.traceOfs += ( ras.target.rows - 1 ) * pitch;
+
+    ras.gray_min_x = 0;
+    ras.gray_max_x = 0;
+  }
+
+
+  static void
+  Vertical_Sweep_Span( RAS_ARGS Short       y,
+                                FT_F26Dot6  x1,
+                                FT_F26Dot6  x2,
+                                PProfile    left,
+                                PProfile    right )
+  {
+    Long   e1, e2;
+    int    c1, c2;
+    Byte   f1, f2;
+    Byte*  target;
+
+    FT_UNUSED( y );
+    FT_UNUSED( left );
+    FT_UNUSED( right );
+
+
+    /* Drop-out control */
+
+    e1 = TRUNC( CEILING( x1 ) );
+
+    if ( x2 - x1 - ras.precision <= ras.precision_jitter )
+      e2 = e1;
+    else
+      e2 = TRUNC( FLOOR( x2 ) );
+
+    if ( e2 >= 0 && e1 < ras.bWidth )
+    {
+      if ( e1 < 0 )
+        e1 = 0;
+      if ( e2 >= ras.bWidth )
+        e2 = ras.bWidth - 1;
+
+      c1 = (Short)( e1 >> 3 );
+      c2 = (Short)( e2 >> 3 );
+
+      f1 = (Byte)  ( 0xFF >> ( e1 & 7 ) );
+      f2 = (Byte) ~( 0x7F >> ( e2 & 7 ) );
+
+      if ( ras.gray_min_x > c1 )
+        ras.gray_min_x = (short)c1;
+      if ( ras.gray_max_x < c2 )
+        ras.gray_max_x = (short)c2;
+
+      target = ras.bTarget + ras.traceOfs + c1;
+      c2 -= c1;
+
+      if ( c2 > 0 )
+      {
+        target[0] |= f1;
+
+        /* memset() is slower than the following code on many platforms. */
+        /* This is due to the fact that, in the vast majority of cases,  */
+        /* the span length in bytes is relatively small.                 */
+        c2--;
+        while ( c2 > 0 )
+        {
+          *(++target) = 0xFF;
+          c2--;
+        }
+        target[1] |= f2;
+      }
+      else
+        *target |= ( f1 & f2 );
+    }
+  }
+
+
+  static void
+  Vertical_Sweep_Drop( RAS_ARGS Short       y,
+                                FT_F26Dot6  x1,
+                                FT_F26Dot6  x2,
+                                PProfile    left,
+                                PProfile    right )
+  {
+    Long   e1, e2, pxl;
+    Short  c1, f1;
+
+
+    /* Drop-out control */
+
+    /*   e2            x2                    x1           e1   */
+    /*                                                         */
+    /*                 ^                     |                 */
+    /*                 |                     |                 */
+    /*   +-------------+---------------------+------------+    */
+    /*                 |                     |                 */
+    /*                 |                     v                 */
+    /*                                                         */
+    /* pixel         contour              contour       pixel  */
+    /* center                                           center */
+
+    /* drop-out mode    scan conversion rules (as defined in OpenType) */
+    /* --------------------------------------------------------------- */
+    /*  0                1, 2, 3                                       */
+    /*  1                1, 2, 4                                       */
+    /*  2                1, 2                                          */
+    /*  3                same as mode 2                                */
+    /*  4                1, 2, 5                                       */
+    /*  5                1, 2, 6                                       */
+    /*  6, 7             same as mode 2                                */
+
+    e1  = CEILING( x1 );
+    e2  = FLOOR  ( x2 );
+    pxl = e1;
+
+    if ( e1 > e2 )
+    {
+      Int  dropOutControl = left->flags & 7;
+
+
+      if ( e1 == e2 + ras.precision )
+      {
+        switch ( dropOutControl )
+        {
+        case 0: /* simple drop-outs including stubs */
+          pxl = e2;
+          break;
+
+        case 4: /* smart drop-outs including stubs */
+          pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+          break;
+
+        case 1: /* simple drop-outs excluding stubs */
+        case 5: /* smart drop-outs excluding stubs  */
+
+          /* Drop-out Control Rules #4 and #6 */
+
+          /* The specification neither provides an exact definition */
+          /* of a `stub' nor gives exact rules to exclude them.     */
+          /*                                                        */
+          /* Here the constraints we use to recognize a stub.       */
+          /*                                                        */
+          /*  upper stub:                                           */
+          /*                                                        */
+          /*   - P_Left and P_Right are in the same contour         */
+          /*   - P_Right is the successor of P_Left in that contour */
+          /*   - y is the top of P_Left and P_Right                 */
+          /*                                                        */
+          /*  lower stub:                                           */
+          /*                                                        */
+          /*   - P_Left and P_Right are in the same contour         */
+          /*   - P_Left is the successor of P_Right in that contour */
+          /*   - y is the bottom of P_Left                          */
+          /*                                                        */
+          /* We draw a stub if the following constraints are met.   */
+          /*                                                        */
+          /*   - for an upper or lower stub, there is top or bottom */
+          /*     overshoot, respectively                            */
+          /*   - the covered interval is greater or equal to a half */
+          /*     pixel                                              */
+
+          /* upper stub test */
+          if ( left->next == right                &&
+               left->height <= 0                  &&
+               !( left->flags & Overshoot_Top   &&
+                  x2 - x1 >= ras.precision_half ) )
+            return;
+
+          /* lower stub test */
+          if ( right->next == left                 &&
+               left->start == y                    &&
+               !( left->flags & Overshoot_Bottom &&
+                  x2 - x1 >= ras.precision_half  ) )
+            return;
+
+          if ( dropOutControl == 1 )
+            pxl = e2;
+          else
+            pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+          break;
+
+        default: /* modes 2, 3, 6, 7 */
+          return;  /* no drop-out control */
+        }
+
+        /* undocumented but confirmed: If the drop-out would result in a  */
+        /* pixel outside of the bounding box, use the pixel inside of the */
+        /* bounding box instead                                           */
+        if ( pxl < 0 )
+          pxl = e1;
+        else if ( TRUNC( pxl ) >= ras.bWidth )
+          pxl = e2;
+
+        /* check that the other pixel isn't set */
+        e1 = pxl == e1 ? e2 : e1;
+
+        e1 = TRUNC( e1 );
+
+        c1 = (Short)( e1 >> 3 );
+        f1 = (Short)( e1 &  7 );
+
+        if ( e1 >= 0 && e1 < ras.bWidth                      &&
+             ras.bTarget[ras.traceOfs + c1] & ( 0x80 >> f1 ) )
+          return;
+      }
+      else
+        return;
+    }
+
+    e1 = TRUNC( pxl );
+
+    if ( e1 >= 0 && e1 < ras.bWidth )
+    {
+      c1 = (Short)( e1 >> 3 );
+      f1 = (Short)( e1 & 7 );
+
+      if ( ras.gray_min_x > c1 )
+        ras.gray_min_x = c1;
+      if ( ras.gray_max_x < c1 )
+        ras.gray_max_x = c1;
+
+      ras.bTarget[ras.traceOfs + c1] |= (char)( 0x80 >> f1 );
+    }
+  }
+
+
+  static void
+  Vertical_Sweep_Step( RAS_ARG )
+  {
+    ras.traceOfs += ras.traceIncr;
+  }
+
+
+  /***********************************************************************/
+  /*                                                                     */
+  /*  Horizontal Sweep Procedure Set                                     */
+  /*                                                                     */
+  /*  These four routines are used during the horizontal black/white     */
+  /*  sweep phase by the generic Draw_Sweep() function.                  */
+  /*                                                                     */
+  /***********************************************************************/
+
+  static void
+  Horizontal_Sweep_Init( RAS_ARGS Short*  min,
+                                  Short*  max )
+  {
+    /* nothing, really */
+    FT_UNUSED_RASTER;
+    FT_UNUSED( min );
+    FT_UNUSED( max );
+  }
+
+
+  static void
+  Horizontal_Sweep_Span( RAS_ARGS Short       y,
+                                  FT_F26Dot6  x1,
+                                  FT_F26Dot6  x2,
+                                  PProfile    left,
+                                  PProfile    right )
+  {
+    Long   e1, e2;
+    PByte  bits;
+    Byte   f1;
+
+    FT_UNUSED( left );
+    FT_UNUSED( right );
+
+
+    if ( x2 - x1 < ras.precision )
+    {
+      e1 = CEILING( x1 );
+      e2 = FLOOR  ( x2 );
+
+      if ( e1 == e2 )
+      {
+        bits = ras.bTarget + ( y >> 3 );
+        f1   = (Byte)( 0x80 >> ( y & 7 ) );
+
+        e1 = TRUNC( e1 );
+
+        if ( e1 >= 0 && e1 < ras.target.rows )
+        {
+          PByte  p;
+
+
+          p = bits - e1 * ras.target.pitch;
+          if ( ras.target.pitch > 0 )
+            p += ( ras.target.rows - 1 ) * ras.target.pitch;
+
+          p[0] |= f1;
+        }
+      }
+    }
+  }
+
+
+  static void
+  Horizontal_Sweep_Drop( RAS_ARGS Short       y,
+                                  FT_F26Dot6  x1,
+                                  FT_F26Dot6  x2,
+                                  PProfile    left,
+                                  PProfile    right )
+  {
+    Long   e1, e2, pxl;
+    PByte  bits;
+    Byte   f1;
+
+
+    /* During the horizontal sweep, we only take care of drop-outs */
+
+    /* e1     +       <-- pixel center */
+    /*        |                        */
+    /* x1  ---+-->    <-- contour      */
+    /*        |                        */
+    /*        |                        */
+    /* x2  <--+---    <-- contour      */
+    /*        |                        */
+    /*        |                        */
+    /* e2     +       <-- pixel center */
+
+    e1  = CEILING( x1 );
+    e2  = FLOOR  ( x2 );
+    pxl = e1;
+
+    if ( e1 > e2 )
+    {
+      Int  dropOutControl = left->flags & 7;
+
+
+      if ( e1 == e2 + ras.precision )
+      {
+        switch ( dropOutControl )
+        {
+        case 0: /* simple drop-outs including stubs */
+          pxl = e2;
+          break;
+
+        case 4: /* smart drop-outs including stubs */
+          pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+          break;
+
+        case 1: /* simple drop-outs excluding stubs */
+        case 5: /* smart drop-outs excluding stubs  */
+          /* see Vertical_Sweep_Drop for details */
+
+          /* rightmost stub test */
+          if ( left->next == right                &&
+               left->height <= 0                  &&
+               !( left->flags & Overshoot_Top   &&
+                  x2 - x1 >= ras.precision_half ) )
+            return;
+
+          /* leftmost stub test */
+          if ( right->next == left                 &&
+               left->start == y                    &&
+               !( left->flags & Overshoot_Bottom &&
+                  x2 - x1 >= ras.precision_half  ) )
+            return;
+
+          if ( dropOutControl == 1 )
+            pxl = e2;
+          else
+            pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+          break;
+
+        default: /* modes 2, 3, 6, 7 */
+          return;  /* no drop-out control */
+        }
+
+        /* undocumented but confirmed: If the drop-out would result in a  */
+        /* pixel outside of the bounding box, use the pixel inside of the */
+        /* bounding box instead                                           */
+        if ( pxl < 0 )
+          pxl = e1;
+        else if ( TRUNC( pxl ) >= ras.target.rows )
+          pxl = e2;
+
+        /* check that the other pixel isn't set */
+        e1 = pxl == e1 ? e2 : e1;
+
+        e1 = TRUNC( e1 );
+
+        bits = ras.bTarget + ( y >> 3 );
+        f1   = (Byte)( 0x80 >> ( y & 7 ) );
+
+        bits -= e1 * ras.target.pitch;
+        if ( ras.target.pitch > 0 )
+          bits += ( ras.target.rows - 1 ) * ras.target.pitch;
+
+        if ( e1 >= 0              &&
+             e1 < ras.target.rows &&
+             *bits & f1           )
+          return;
+      }
+      else
+        return;
+    }
+
+    bits = ras.bTarget + ( y >> 3 );
+    f1   = (Byte)( 0x80 >> ( y & 7 ) );
+
+    e1 = TRUNC( pxl );
+
+    if ( e1 >= 0 && e1 < ras.target.rows )
+    {
+      bits -= e1 * ras.target.pitch;
+      if ( ras.target.pitch > 0 )
+        bits += ( ras.target.rows - 1 ) * ras.target.pitch;
+
+      bits[0] |= f1;
+    }
+  }
+
+
+  static void
+  Horizontal_Sweep_Step( RAS_ARG )
+  {
+    /* Nothing, really */
+    FT_UNUSED_RASTER;
+  }
+
+
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Vertical Gray Sweep Procedure Set                                    */
+  /*                                                                       */
+  /*  These two routines are used during the vertical gray-levels sweep    */
+  /*  phase by the generic Draw_Sweep() function.                          */
+  /*                                                                       */
+  /*  NOTES                                                                */
+  /*                                                                       */
+  /*  - The target pixmap's width *must* be a multiple of 4.               */
+  /*                                                                       */
+  /*  - You have to use the function Vertical_Sweep_Span() for the gray    */
+  /*    span call.                                                         */
+  /*                                                                       */
+  /*************************************************************************/
+
+  static void
+  Vertical_Gray_Sweep_Init( RAS_ARGS Short*  min,
+                                     Short*  max )
+  {
+    Long  pitch, byte_len;
+
+
+    *min = *min & -2;
+    *max = ( *max + 3 ) & -2;
+
+    ras.traceOfs  = 0;
+    pitch         = ras.target.pitch;
+    byte_len      = -pitch;
+    ras.traceIncr = (Short)byte_len;
+    ras.traceG    = ( *min / 2 ) * byte_len;
+
+    if ( pitch > 0 )
+    {
+      ras.traceG += ( ras.target.rows - 1 ) * pitch;
+      byte_len    = -byte_len;
+    }
+
+    ras.gray_min_x =  (Short)byte_len;
+    ras.gray_max_x = -(Short)byte_len;
+  }
+
+
+  static void
+  Vertical_Gray_Sweep_Step( RAS_ARG )
+  {
+    Int     c1, c2;
+    PByte   pix, bit, bit2;
+    short*  count = (short*)count_table;
+    Byte*   grays;
+
+
+    ras.traceOfs += ras.gray_width;
+
+    if ( ras.traceOfs > ras.gray_width )
+    {
+      pix   = ras.gTarget + ras.traceG + ras.gray_min_x * 4;
+      grays = ras.grays;
+
+      if ( ras.gray_max_x >= 0 )
+      {
+        Long  last_pixel = ras.target.width - 1;
+        Int   last_cell  = last_pixel >> 2;
+        Int   last_bit   = last_pixel & 3;
+        Bool  over       = 0;
+
+
+        if ( ras.gray_max_x >= last_cell && last_bit != 3 )
+        {
+          ras.gray_max_x = last_cell - 1;
+          over = 1;
+        }
+
+        if ( ras.gray_min_x < 0 )
+          ras.gray_min_x = 0;
+
+        bit  = ras.bTarget + ras.gray_min_x;
+        bit2 = bit + ras.gray_width;
+
+        c1 = ras.gray_max_x - ras.gray_min_x;
+
+        while ( c1 >= 0 )
+        {
+          c2 = count[*bit] + count[*bit2];
+
+          if ( c2 )
+          {
+            pix[0] = grays[(c2 >> 12) & 0x000F];
+            pix[1] = grays[(c2 >> 8 ) & 0x000F];
+            pix[2] = grays[(c2 >> 4 ) & 0x000F];
+            pix[3] = grays[ c2        & 0x000F];
+
+            *bit  = 0;
+            *bit2 = 0;
+          }
+
+          bit++;
+          bit2++;
+          pix += 4;
+          c1--;
+        }
+
+        if ( over )
+        {
+          c2 = count[*bit] + count[*bit2];
+          if ( c2 )
+          {
+            switch ( last_bit )
+            {
+            case 2:
+              pix[2] = grays[(c2 >> 4 ) & 0x000F];
+            case 1:
+              pix[1] = grays[(c2 >> 8 ) & 0x000F];
+            default:
+              pix[0] = grays[(c2 >> 12) & 0x000F];
+            }
+
+            *bit  = 0;
+            *bit2 = 0;
+          }
+        }
+      }
+
+      ras.traceOfs = 0;
+      ras.traceG  += ras.traceIncr;
+
+      ras.gray_min_x =  32000;
+      ras.gray_max_x = -32000;
+    }
+  }
+
+
+  static void
+  Horizontal_Gray_Sweep_Span( RAS_ARGS Short       y,
+                                       FT_F26Dot6  x1,
+                                       FT_F26Dot6  x2,
+                                       PProfile    left,
+                                       PProfile    right )
+  {
+    /* nothing, really */
+    FT_UNUSED_RASTER;
+    FT_UNUSED( y );
+    FT_UNUSED( x1 );
+    FT_UNUSED( x2 );
+    FT_UNUSED( left );
+    FT_UNUSED( right );
+  }
+
+
+  static void
+  Horizontal_Gray_Sweep_Drop( RAS_ARGS Short       y,
+                                       FT_F26Dot6  x1,
+                                       FT_F26Dot6  x2,
+                                       PProfile    left,
+                                       PProfile    right )
+  {
+    Long   e1, e2;
+    PByte  pixel;
+    Byte   color;
+
+
+    /* During the horizontal sweep, we only take care of drop-outs */
+
+    e1 = CEILING( x1 );
+    e2 = FLOOR  ( x2 );
+
+    if ( e1 > e2 )
+    {
+      Int  dropOutControl = left->flags & 7;
+
+
+      if ( e1 == e2 + ras.precision )
+      {
+        switch ( dropOutControl )
+        {
+        case 0: /* simple drop-outs including stubs */
+          e1 = e2;
+          break;
+
+        case 4: /* smart drop-outs including stubs */
+          e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+          break;
+
+        case 1: /* simple drop-outs excluding stubs */
+        case 5: /* smart drop-outs excluding stubs  */
+          /* see Vertical_Sweep_Drop for details */
+
+          /* rightmost stub test */
+          if ( left->next == right && left->height <= 0 )
+            return;
+
+          /* leftmost stub test */
+          if ( right->next == left && left->start == y )
+            return;
+
+          if ( dropOutControl == 1 )
+            e1 = e2;
+          else
+            e1 = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
+
+          break;
+
+        default: /* modes 2, 3, 6, 7 */
+          return;  /* no drop-out control */
+        }
+      }
+      else
+        return;
+    }
+
+    if ( e1 >= 0 )
+    {
+      if ( x2 - x1 >= ras.precision_half )
+        color = ras.grays[2];
+      else
+        color = ras.grays[1];
+
+      e1 = TRUNC( e1 ) / 2;
+      if ( e1 < ras.target.rows )
+      {
+        pixel = ras.gTarget - e1 * ras.target.pitch + y / 2;
+        if ( ras.target.pitch > 0 )
+          pixel += ( ras.target.rows - 1 ) * ras.target.pitch;
+
+        if ( pixel[0] == ras.grays[0] )
+          pixel[0] = color;
+      }
+    }
+  }
+
+
+#endif /* FT_RASTER_OPTION_ANTI_ALIASING */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  Generic Sweep Drawing routine                                        */
+  /*                                                                       */
+  /*************************************************************************/
+
+  static Bool
+  Draw_Sweep( RAS_ARG )
+  {
+    Short         y, y_change, y_height;
+
+    PProfile      P, Q, P_Left, P_Right;
+
+    Short         min_Y, max_Y, top, bottom, dropouts;
+
+    Long          x1, x2, xs, e1, e2;
+
+    TProfileList  waiting;
+    TProfileList  draw_left, draw_right;
+
+
+    /* initialize empty linked lists */
+
+    Init_Linked( &waiting );
+
+    Init_Linked( &draw_left  );
+    Init_Linked( &draw_right );
+
+    /* first, compute min and max Y */
+
+    P     = ras.fProfile;
+    max_Y = (Short)TRUNC( ras.minY );
+    min_Y = (Short)TRUNC( ras.maxY );
+
+    while ( P )
+    {
+      Q = P->link;
+
+      bottom = (Short)P->start;
+      top    = (Short)( P->start + P->height - 1 );
+
+      if ( min_Y > bottom )
+        min_Y = bottom;
+      if ( max_Y < top )
+        max_Y = top;
+
+      P->X = 0;
+      InsNew( &waiting, P );
+
+      P = Q;
+    }
+
+    /* check the Y-turns */
+    if ( ras.numTurns == 0 )
+    {
+      ras.error = Raster_Err_Invalid;
+      return FAILURE;
+    }
+
+    /* now initialize the sweep */
+
+    ras.Proc_Sweep_Init( RAS_VARS &min_Y, &max_Y );
+
+    /* then compute the distance of each profile from min_Y */
+
+    P = waiting;
+
+    while ( P )
+    {
+      P->countL = (UShort)( P->start - min_Y );
+      P = P->link;
+    }
+
+    /* let's go */
+
+    y        = min_Y;
+    y_height = 0;
+
+    if ( ras.numTurns > 0                     &&
+         ras.sizeBuff[-ras.numTurns] == min_Y )
+      ras.numTurns--;
+
+    while ( ras.numTurns > 0 )
+    {
+      /* check waiting list for new activations */
+
+      P = waiting;
+
+      while ( P )
+      {
+        Q = P->link;
+        P->countL -= y_height;
+        if ( P->countL == 0 )
+        {
+          DelOld( &waiting, P );
+
+          if ( P->flags & Flow_Up )
+            InsNew( &draw_left,  P );
+          else
+            InsNew( &draw_right, P );
+        }
+
+        P = Q;
+      }
+
+      /* sort the drawing lists */
+
+      Sort( &draw_left );
+      Sort( &draw_right );
+
+      y_change = (Short)ras.sizeBuff[-ras.numTurns--];
+      y_height = (Short)( y_change - y );
+
+      while ( y < y_change )
+      {
+        /* let's trace */
+
+        dropouts = 0;
+
+        P_Left  = draw_left;
+        P_Right = draw_right;
+
+        while ( P_Left )
+        {
+          x1 = P_Left ->X;
+          x2 = P_Right->X;
+
+          if ( x1 > x2 )
+          {
+            xs = x1;
+            x1 = x2;
+            x2 = xs;
+          }
+
+          e1 = FLOOR( x1 );
+          e2 = CEILING( x2 );
+
+          if ( x2 - x1 <= ras.precision &&
+               e1 != x1 && e2 != x2     )
+          {
+            if ( e1 > e2 || e2 == e1 + ras.precision )
+            {
+              Int  dropOutControl = P_Left->flags & 7;
+
+
+              if ( dropOutControl != 2 )
+              {
+                /* a drop-out was detected */
+
+                P_Left ->X = x1;
+                P_Right->X = x2;
+
+                /* mark profile for drop-out processing */
+                P_Left->countL = 1;
+                dropouts++;
+              }
+
+              goto Skip_To_Next;
+            }
+          }
+
+          ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right );
+
+        Skip_To_Next:
+
+          P_Left  = P_Left->link;
+          P_Right = P_Right->link;
+        }
+
+        /* handle drop-outs _after_ the span drawing --       */
+        /* drop-out processing has been moved out of the loop */
+        /* for performance tuning                             */
+        if ( dropouts > 0 )
+          goto Scan_DropOuts;
+
+      Next_Line:
+
+        ras.Proc_Sweep_Step( RAS_VAR );
+
+        y++;
+
+        if ( y < y_change )
+        {
+          Sort( &draw_left  );
+          Sort( &draw_right );
+        }
+      }
+
+      /* now finalize the profiles that need it */
+
+      P = draw_left;
+      while ( P )
+      {
+        Q = P->link;
+        if ( P->height == 0 )
+          DelOld( &draw_left, P );
+        P = Q;
+      }
+
+      P = draw_right;
+      while ( P )
+      {
+        Q = P->link;
+        if ( P->height == 0 )
+          DelOld( &draw_right, P );
+        P = Q;
+      }
+    }
+
+    /* for gray-scaling, flush the bitmap scanline cache */
+    while ( y <= max_Y )
+    {
+      ras.Proc_Sweep_Step( RAS_VAR );
+      y++;
+    }
+
+    return SUCCESS;
+
+  Scan_DropOuts:
+
+    P_Left  = draw_left;
+    P_Right = draw_right;
+
+    while ( P_Left )
+    {
+      if ( P_Left->countL )
+      {
+        P_Left->countL = 0;
+#if 0
+        dropouts--;  /* -- this is useful when debugging only */
+#endif
+        ras.Proc_Sweep_Drop( RAS_VARS y,
+                                      P_Left->X,
+                                      P_Right->X,
+                                      P_Left,
+                                      P_Right );
+      }
+
+      P_Left  = P_Left->link;
+      P_Right = P_Right->link;
+    }
+
+    goto Next_Line;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Render_Single_Pass                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Perform one sweep with sub-banding.                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    flipped :: If set, flip the direction of the outline.              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Renderer error code.                                               */
+  /*                                                                       */
+  static int
+  Render_Single_Pass( RAS_ARGS Bool  flipped )
+  {
+    Short  i, j, k;
+
+
+    while ( ras.band_top >= 0 )
+    {
+      ras.maxY = (Long)ras.band_stack[ras.band_top].y_max * ras.precision;
+      ras.minY = (Long)ras.band_stack[ras.band_top].y_min * ras.precision;
+
+      ras.top = ras.buff;
+
+      ras.error = Raster_Err_None;
+
+      if ( Convert_Glyph( RAS_VARS flipped ) )
+      {
+        if ( ras.error != Raster_Err_Overflow )
+          return FAILURE;
+
+        ras.error = Raster_Err_None;
+
+        /* sub-banding */
+
+#ifdef DEBUG_RASTER
+        ClearBand( RAS_VARS TRUNC( ras.minY ), TRUNC( ras.maxY ) );
+#endif
+
+        i = ras.band_stack[ras.band_top].y_min;
+        j = ras.band_stack[ras.band_top].y_max;
+
+        k = (Short)( ( i + j ) / 2 );
+
+        if ( ras.band_top >= 7 || k < i )
+        {
+          ras.band_top = 0;
+          ras.error    = Raster_Err_Invalid;
+
+          return ras.error;
+        }
+
+        ras.band_stack[ras.band_top + 1].y_min = k;
+        ras.band_stack[ras.band_top + 1].y_max = j;
+
+        ras.band_stack[ras.band_top].y_max = (Short)( k - 1 );
+
+        ras.band_top++;
+      }
+      else
+      {
+        if ( ras.fProfile )
+          if ( Draw_Sweep( RAS_VAR ) )
+             return ras.error;
+        ras.band_top--;
+      }
+    }
+
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Render_Glyph                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Render a glyph in a bitmap.  Sub-banding if needed.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  Render_Glyph( RAS_ARG )
+  {
+    FT_Error  error;
+
+
+    Set_High_Precision( RAS_VARS ras.outline.flags &
+                                 FT_OUTLINE_HIGH_PRECISION );
+    ras.scale_shift = ras.precision_shift;
+
+    if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS )
+      ras.dropOutControl = 2;
+    else
+    {
+      if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS )
+        ras.dropOutControl = 4;
+      else
+        ras.dropOutControl = 0;
+
+      if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) )
+        ras.dropOutControl += 1;
+    }
+
+    ras.second_pass = (FT_Byte)( !( ras.outline.flags &
+                                    FT_OUTLINE_SINGLE_PASS ) );
+
+    /* Vertical Sweep */
+    ras.Proc_Sweep_Init = Vertical_Sweep_Init;
+    ras.Proc_Sweep_Span = Vertical_Sweep_Span;
+    ras.Proc_Sweep_Drop = Vertical_Sweep_Drop;
+    ras.Proc_Sweep_Step = Vertical_Sweep_Step;
+
+    ras.band_top            = 0;
+    ras.band_stack[0].y_min = 0;
+    ras.band_stack[0].y_max = (short)( ras.target.rows - 1 );
+
+    ras.bWidth  = (unsigned short)ras.target.width;
+    ras.bTarget = (Byte*)ras.target.buffer;
+
+    if ( ( error = Render_Single_Pass( RAS_VARS 0 ) ) != 0 )
+      return error;
+
+    /* Horizontal Sweep */
+    if ( ras.second_pass && ras.dropOutControl != 2 )
+    {
+      ras.Proc_Sweep_Init = Horizontal_Sweep_Init;
+      ras.Proc_Sweep_Span = Horizontal_Sweep_Span;
+      ras.Proc_Sweep_Drop = Horizontal_Sweep_Drop;
+      ras.Proc_Sweep_Step = Horizontal_Sweep_Step;
+
+      ras.band_top            = 0;
+      ras.band_stack[0].y_min = 0;
+      ras.band_stack[0].y_max = (short)( ras.target.width - 1 );
+
+      if ( ( error = Render_Single_Pass( RAS_VARS 1 ) ) != 0 )
+        return error;
+    }
+
+    return Raster_Err_None;
+  }
+
+
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Render_Gray_Glyph                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Render a glyph with grayscaling.  Sub-banding if needed.           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  Render_Gray_Glyph( RAS_ARG )
+  {
+    Long      pixel_width;
+    FT_Error  error;
+
+
+    Set_High_Precision( RAS_VARS ras.outline.flags &
+                                 FT_OUTLINE_HIGH_PRECISION );
+    ras.scale_shift = ras.precision_shift + 1;
+
+    if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS )
+      ras.dropOutControl = 2;
+    else
+    {
+      if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS )
+        ras.dropOutControl = 4;
+      else
+        ras.dropOutControl = 0;
+
+      if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) )
+        ras.dropOutControl += 1;
+    }
+
+    ras.second_pass = !( ras.outline.flags & FT_OUTLINE_SINGLE_PASS );
+
+    /* Vertical Sweep */
+
+    ras.band_top            = 0;
+    ras.band_stack[0].y_min = 0;
+    ras.band_stack[0].y_max = 2 * ras.target.rows - 1;
+
+    ras.bWidth  = ras.gray_width;
+    pixel_width = 2 * ( ( ras.target.width + 3 ) >> 2 );
+
+    if ( ras.bWidth > pixel_width )
+      ras.bWidth = pixel_width;
+
+    ras.bWidth  = ras.bWidth * 8;
+    ras.bTarget = (Byte*)ras.gray_lines;
+    ras.gTarget = (Byte*)ras.target.buffer;
+
+    ras.Proc_Sweep_Init = Vertical_Gray_Sweep_Init;
+    ras.Proc_Sweep_Span = Vertical_Sweep_Span;
+    ras.Proc_Sweep_Drop = Vertical_Sweep_Drop;
+    ras.Proc_Sweep_Step = Vertical_Gray_Sweep_Step;
+
+    error = Render_Single_Pass( RAS_VARS 0 );
+    if ( error )
+      return error;
+
+    /* Horizontal Sweep */
+    if ( ras.second_pass && ras.dropOutControl != 2 )
+    {
+      ras.Proc_Sweep_Init = Horizontal_Sweep_Init;
+      ras.Proc_Sweep_Span = Horizontal_Gray_Sweep_Span;
+      ras.Proc_Sweep_Drop = Horizontal_Gray_Sweep_Drop;
+      ras.Proc_Sweep_Step = Horizontal_Sweep_Step;
+
+      ras.band_top            = 0;
+      ras.band_stack[0].y_min = 0;
+      ras.band_stack[0].y_max = ras.target.width * 2 - 1;
+
+      error = Render_Single_Pass( RAS_VARS 1 );
+      if ( error )
+        return error;
+    }
+
+    return Raster_Err_None;
+  }
+
+#else /* !FT_RASTER_OPTION_ANTI_ALIASING */
+
+  FT_LOCAL_DEF( FT_Error )
+  Render_Gray_Glyph( RAS_ARG )
+  {
+    FT_UNUSED_RASTER;
+
+    return Raster_Err_Unsupported;
+  }
+
+#endif /* !FT_RASTER_OPTION_ANTI_ALIASING */
+
+
+  static void
+  ft_black_init( black_PRaster  raster )
+  {
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+    FT_UInt  n;
+
+
+    /* set default 5-levels gray palette */
+    for ( n = 0; n < 5; n++ )
+      raster->grays[n] = n * 255 / 4;
+
+    raster->gray_width = RASTER_GRAY_LINES / 2;
+#else
+    FT_UNUSED( raster );
+#endif
+  }
+
+
+  /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/
+  /****                         a static object.                  *****/
+
+
+#ifdef _STANDALONE_
+
+
+  static int
+  ft_black_new( void*       memory,
+                FT_Raster  *araster )
+  {
+     static black_TRaster  the_raster;
+     FT_UNUSED( memory );
+
+
+     *araster = (FT_Raster)&the_raster;
+     FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) );
+     ft_black_init( &the_raster );
+
+     return 0;
+  }
+
+
+  static void
+  ft_black_done( FT_Raster  raster )
+  {
+    /* nothing */
+    FT_UNUSED( raster );
+  }
+
+
+#else /* !_STANDALONE_ */
+
+
+  static int
+  ft_black_new( FT_Memory       memory,
+                black_PRaster  *araster )
+  {
+    FT_Error       error;
+    black_PRaster  raster = NULL;
+
+
+    *araster = 0;
+    if ( !FT_NEW( raster ) )
+    {
+      raster->memory = memory;
+      ft_black_init( raster );
+
+      *araster = raster;
+    }
+
+    return error;
+  }
+
+
+  static void
+  ft_black_done( black_PRaster  raster )
+  {
+    FT_Memory  memory = (FT_Memory)raster->memory;
+
+
+    FT_FREE( raster );
+  }
+
+
+#endif /* !_STANDALONE_ */
+
+
+  static void
+  ft_black_reset( black_PRaster  raster,
+                  char*          pool_base,
+                  long           pool_size )
+  {
+    if ( raster )
+    {
+      if ( pool_base && pool_size >= (long)sizeof ( black_TWorker ) + 2048 )
+      {
+        black_PWorker  worker = (black_PWorker)pool_base;
+
+
+        raster->buffer      = pool_base + ( ( sizeof ( *worker ) + 7 ) & ~7 );
+        raster->buffer_size = pool_base + pool_size - (char*)raster->buffer;
+        raster->worker      = worker;
+      }
+      else
+      {
+        raster->buffer      = NULL;
+        raster->buffer_size = 0;
+        raster->worker      = NULL;
+      }
+    }
+  }
+
+
+  static void
+  ft_black_set_mode( black_PRaster  raster,
+                     unsigned long  mode,
+                     const char*    palette )
+  {
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+
+    if ( mode == FT_MAKE_TAG( 'p', 'a', 'l', '5' ) )
+    {
+      /* set 5-levels gray palette */
+      raster->grays[0] = palette[0];
+      raster->grays[1] = palette[1];
+      raster->grays[2] = palette[2];
+      raster->grays[3] = palette[3];
+      raster->grays[4] = palette[4];
+    }
+
+#else
+
+    FT_UNUSED( raster );
+    FT_UNUSED( mode );
+    FT_UNUSED( palette );
+
+#endif
+  }
+
+
+  static int
+  ft_black_render( black_PRaster            raster,
+                   const FT_Raster_Params*  params )
+  {
+    const FT_Outline*  outline    = (const FT_Outline*)params->source;
+    const FT_Bitmap*   target_map = params->target;
+    black_PWorker      worker;
+
+
+    if ( !raster || !raster->buffer || !raster->buffer_size )
+      return Raster_Err_Not_Ini;
+
+    if ( !outline )
+      return Raster_Err_Invalid;
+
+    /* return immediately if the outline is empty */
+    if ( outline->n_points == 0 || outline->n_contours <= 0 )
+      return Raster_Err_None;
+
+    if ( !outline->contours || !outline->points )
+      return Raster_Err_Invalid;
+
+    if ( outline->n_points !=
+           outline->contours[outline->n_contours - 1] + 1 )
+      return Raster_Err_Invalid;
+
+    worker = raster->worker;
+
+    /* this version of the raster does not support direct rendering, sorry */
+    if ( params->flags & FT_RASTER_FLAG_DIRECT )
+      return Raster_Err_Unsupported;
+
+    if ( !target_map )
+      return Raster_Err_Invalid;
+
+    /* nothing to do */
+    if ( !target_map->width || !target_map->rows )
+      return Raster_Err_None;
+
+    if ( !target_map->buffer )
+      return Raster_Err_Invalid;
+
+    ras.outline = *outline;
+    ras.target  = *target_map;
+
+    worker->buff       = (PLong) raster->buffer;
+    worker->sizeBuff   = worker->buff +
+                           raster->buffer_size / sizeof ( Long );
+#ifdef FT_RASTER_OPTION_ANTI_ALIASING
+    worker->grays      = raster->grays;
+    worker->gray_width = raster->gray_width;
+
+    FT_MEM_ZERO( worker->gray_lines, worker->gray_width * 2 );
+#endif
+
+    return ( params->flags & FT_RASTER_FLAG_AA )
+           ? Render_Gray_Glyph( RAS_VAR )
+           : Render_Glyph( RAS_VAR );
+  }
+
+
+  FT_DEFINE_RASTER_FUNCS( ft_standard_raster,
+    FT_GLYPH_FORMAT_OUTLINE,
+    (FT_Raster_New_Func)     ft_black_new,
+    (FT_Raster_Reset_Func)   ft_black_reset,
+    (FT_Raster_Set_Mode_Func)ft_black_set_mode,
+    (FT_Raster_Render_Func)  ft_black_render,
+    (FT_Raster_Done_Func)    ft_black_done
+  )
+
+
+/* END */
diff --git a/src/raster/ftraster.h b/src/raster/ftraster.h
new file mode 100644 (file)
index 0000000..80fe46d
--- /dev/null
@@ -0,0 +1,46 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftraster.h                                                             */
+/*                                                                         */
+/*    The FreeType glyph rasterizer (specification).                       */
+/*                                                                         */
+/*  Copyright 1996-2001 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTRASTER_H__
+#define __FTRASTER_H__
+
+
+#include <ft2build.h>
+#include FT_CONFIG_CONFIG_H
+#include FT_IMAGE_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Uncomment the following line if you are using ftraster.c as a         */
+  /* standalone module, fully independent of FreeType.                     */
+  /*                                                                       */
+/* #define _STANDALONE_ */
+
+  FT_EXPORT_VAR( const FT_Raster_Funcs )  ft_standard_raster;
+
+
+FT_END_HEADER
+
+#endif /* __FTRASTER_H__ */
+
+
+/* END */
diff --git a/src/raster/ftrend1.c b/src/raster/ftrend1.c
new file mode 100644 (file)
index 0000000..859cb7d
--- /dev/null
@@ -0,0 +1,305 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftrend1.c                                                              */
+/*                                                                         */
+/*    The FreeType glyph rasterizer interface (body).                      */
+/*                                                                         */
+/*  Copyright 1996-2003, 2005, 2006, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_OUTLINE_H
+#include "ftrend1.h"
+#include "ftraster.h"
+#include "rastpic.h"
+
+#include "rasterrs.h"
+
+
+  /* initialize renderer -- init its raster */
+  static FT_Error
+  ft_raster1_init( FT_Renderer  render )
+  {
+    FT_Library  library = FT_MODULE_LIBRARY( render );
+
+
+    render->clazz->raster_class->raster_reset( render->raster,
+                                               library->raster_pool,
+                                               library->raster_pool_size );
+
+    return Raster_Err_Ok;
+  }
+
+
+  /* set render-specific mode */
+  static FT_Error
+  ft_raster1_set_mode( FT_Renderer  render,
+                       FT_ULong     mode_tag,
+                       FT_Pointer   data )
+  {
+    /* we simply pass it to the raster */
+    return render->clazz->raster_class->raster_set_mode( render->raster,
+                                                         mode_tag,
+                                                         data );
+  }
+
+
+  /* transform a given glyph image */
+  static FT_Error
+  ft_raster1_transform( FT_Renderer       render,
+                        FT_GlyphSlot      slot,
+                        const FT_Matrix*  matrix,
+                        const FT_Vector*  delta )
+  {
+    FT_Error error = Raster_Err_Ok;
+
+
+    if ( slot->format != render->glyph_format )
+    {
+      error = Raster_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    if ( matrix )
+      FT_Outline_Transform( &slot->outline, matrix );
+
+    if ( delta )
+      FT_Outline_Translate( &slot->outline, delta->x, delta->y );
+
+  Exit:
+    return error;
+  }
+
+
+  /* return the glyph's control box */
+  static void
+  ft_raster1_get_cbox( FT_Renderer   render,
+                       FT_GlyphSlot  slot,
+                       FT_BBox*      cbox )
+  {
+    FT_MEM_ZERO( cbox, sizeof ( *cbox ) );
+
+    if ( slot->format == render->glyph_format )
+      FT_Outline_Get_CBox( &slot->outline, cbox );
+  }
+
+
+  /* convert a slot's glyph image into a bitmap */
+  static FT_Error
+  ft_raster1_render( FT_Renderer       render,
+                     FT_GlyphSlot      slot,
+                     FT_Render_Mode    mode,
+                     const FT_Vector*  origin )
+  {
+    FT_Error     error;
+    FT_Outline*  outline;
+    FT_BBox      cbox;
+    FT_UInt      width, height, pitch;
+    FT_Bitmap*   bitmap;
+    FT_Memory    memory;
+
+    FT_Raster_Params  params;
+
+
+    /* check glyph image format */
+    if ( slot->format != render->glyph_format )
+    {
+      error = Raster_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    /* check rendering mode */
+#ifndef FT_CONFIG_OPTION_PIC
+    if ( mode != FT_RENDER_MODE_MONO )
+    {
+      /* raster1 is only capable of producing monochrome bitmaps */
+      if ( render->clazz == &ft_raster1_renderer_class )
+        return Raster_Err_Cannot_Render_Glyph;
+    }
+    else
+    {
+      /* raster5 is only capable of producing 5-gray-levels bitmaps */
+      if ( render->clazz == &ft_raster5_renderer_class )
+        return Raster_Err_Cannot_Render_Glyph;
+    }
+#else /* FT_CONFIG_OPTION_PIC */
+    /* When PIC is enabled, we cannot get to the class object      */
+    /* so instead we check the final character in the class name   */
+    /* ("raster5" or "raster1"). Yes this is a hack.               */
+    /* The "correct" thing to do is have different render function */
+    /* for each of the classes.                                    */
+    if ( mode != FT_RENDER_MODE_MONO )
+    {
+      /* raster1 is only capable of producing monochrome bitmaps */
+      if ( render->clazz->root.module_name[6] == '1' )
+        return Raster_Err_Cannot_Render_Glyph;
+    }
+    else
+    {
+      /* raster5 is only capable of producing 5-gray-levels bitmaps */
+      if ( render->clazz->root.module_name[6] == '5' )
+        return Raster_Err_Cannot_Render_Glyph;
+    }
+#endif /* FT_CONFIG_OPTION_PIC */
+
+    outline = &slot->outline;
+
+    /* translate the outline to the new origin if needed */
+    if ( origin )
+      FT_Outline_Translate( outline, origin->x, origin->y );
+
+    /* compute the control box, and grid fit it */
+    FT_Outline_Get_CBox( outline, &cbox );
+
+    /* undocumented but confirmed: bbox values get rounded */
+#if 1
+    cbox.xMin = FT_PIX_ROUND( cbox.xMin );
+    cbox.yMin = FT_PIX_ROUND( cbox.yMin );
+    cbox.xMax = FT_PIX_ROUND( cbox.xMax );
+    cbox.yMax = FT_PIX_ROUND( cbox.yMax );
+#else
+    cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
+    cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
+    cbox.xMax = FT_PIX_CEIL( cbox.xMax );
+    cbox.yMax = FT_PIX_CEIL( cbox.yMax );
+#endif
+
+    width  = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 );
+    height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 );
+
+    if ( width > FT_USHORT_MAX || height > FT_USHORT_MAX )
+    {
+      error = Raster_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    bitmap = &slot->bitmap;
+    memory = render->root.memory;
+
+    /* release old bitmap buffer */
+    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+    {
+      FT_FREE( bitmap->buffer );
+      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+    }
+
+    /* allocate new one, depends on pixel format */
+    if ( !( mode & FT_RENDER_MODE_MONO ) )
+    {
+      /* we pad to 32 bits, only for backwards compatibility with FT 1.x */
+      pitch              = FT_PAD_CEIL( width, 4 );
+      bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
+      bitmap->num_grays  = 256;
+    }
+    else
+    {
+      pitch              = ( ( width + 15 ) >> 4 ) << 1;
+      bitmap->pixel_mode = FT_PIXEL_MODE_MONO;
+    }
+
+    bitmap->width = width;
+    bitmap->rows  = height;
+    bitmap->pitch = pitch;
+
+    if ( FT_ALLOC_MULT( bitmap->buffer, pitch, height ) )
+      goto Exit;
+
+    slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
+
+    /* translate outline to render it into the bitmap */
+    FT_Outline_Translate( outline, -cbox.xMin, -cbox.yMin );
+
+    /* set up parameters */
+    params.target = bitmap;
+    params.source = outline;
+    params.flags  = 0;
+
+    if ( bitmap->pixel_mode == FT_PIXEL_MODE_GRAY )
+      params.flags |= FT_RASTER_FLAG_AA;
+
+    /* render outline into the bitmap */
+    error = render->raster_render( render->raster, &params );
+
+    FT_Outline_Translate( outline, cbox.xMin, cbox.yMin );
+
+    if ( error )
+      goto Exit;
+
+    slot->format      = FT_GLYPH_FORMAT_BITMAP;
+    slot->bitmap_left = (FT_Int)( cbox.xMin >> 6 );
+    slot->bitmap_top  = (FT_Int)( cbox.yMax >> 6 );
+
+  Exit:
+    return error;
+  }
+
+
+  FT_DEFINE_RENDERER( ft_raster1_renderer_class,
+
+      FT_MODULE_RENDERER,
+      sizeof ( FT_RendererRec ),
+
+      "raster1",
+      0x10000L,
+      0x20000L,
+
+      0,    /* module specific interface */
+
+      (FT_Module_Constructor)ft_raster1_init,
+      (FT_Module_Destructor) 0,
+      (FT_Module_Requester)  0
+    ,
+
+    FT_GLYPH_FORMAT_OUTLINE,
+
+    (FT_Renderer_RenderFunc)   ft_raster1_render,
+    (FT_Renderer_TransformFunc)ft_raster1_transform,
+    (FT_Renderer_GetCBoxFunc)  ft_raster1_get_cbox,
+    (FT_Renderer_SetModeFunc)  ft_raster1_set_mode,
+
+    (FT_Raster_Funcs*)    &FT_STANDARD_RASTER_GET
+  )
+
+
+  /* This renderer is _NOT_ part of the default modules; you will need */
+  /* to register it by hand in your application.  It should only be    */
+  /* used for backwards-compatibility with FT 1.x anyway.              */
+  /*                                                                   */
+  FT_DEFINE_RENDERER( ft_raster5_renderer_class,
+
+      FT_MODULE_RENDERER,
+      sizeof ( FT_RendererRec ),
+
+      "raster5",
+      0x10000L,
+      0x20000L,
+
+      0,    /* module specific interface */
+
+      (FT_Module_Constructor)ft_raster1_init,
+      (FT_Module_Destructor) 0,
+      (FT_Module_Requester)  0
+    ,
+
+    FT_GLYPH_FORMAT_OUTLINE,
+
+    (FT_Renderer_RenderFunc)   ft_raster1_render,
+    (FT_Renderer_TransformFunc)ft_raster1_transform,
+    (FT_Renderer_GetCBoxFunc)  ft_raster1_get_cbox,
+    (FT_Renderer_SetModeFunc)  ft_raster1_set_mode,
+
+    (FT_Raster_Funcs*)    &FT_STANDARD_RASTER_GET
+  )
+
+
+/* END */
diff --git a/src/raster/ftrend1.h b/src/raster/ftrend1.h
new file mode 100644 (file)
index 0000000..4cf1286
--- /dev/null
@@ -0,0 +1,44 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftrend1.h                                                              */
+/*                                                                         */
+/*    The FreeType glyph rasterizer interface (specification).             */
+/*                                                                         */
+/*  Copyright 1996-2001 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTREND1_H__
+#define __FTREND1_H__
+
+
+#include <ft2build.h>
+#include FT_RENDER_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_DECLARE_RENDERER( ft_raster1_renderer_class )
+
+  /* this renderer is _NOT_ part of the default modules, you'll need */
+  /* to register it by hand in your application.  It should only be  */
+  /* used for backwards-compatibility with FT 1.x anyway.            */
+  /*                                                                 */
+  FT_DECLARE_RENDERER( ft_raster5_renderer_class )
+
+
+FT_END_HEADER
+
+#endif /* __FTREND1_H__ */
+
+
+/* END */
diff --git a/src/raster/module.mk b/src/raster/module.mk
new file mode 100644 (file)
index 0000000..cbff5df
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# FreeType 2 renderer module definition
+#
+
+
+# Copyright 1996-2000, 2006 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.
+
+
+FTMODULE_H_COMMANDS += RASTER_MODULE
+
+define RASTER_MODULE
+$(OPEN_DRIVER) FT_Renderer_Class, ft_raster1_renderer_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)raster    $(ECHO_DRIVER_DESC)monochrome bitmap renderer$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/src/raster/raster.c b/src/raster/raster.c
new file mode 100644 (file)
index 0000000..1202a11
--- /dev/null
@@ -0,0 +1,27 @@
+/***************************************************************************/
+/*                                                                         */
+/*  raster.c                                                               */
+/*                                                                         */
+/*    FreeType monochrome rasterer module component (body only).           */
+/*                                                                         */
+/*  Copyright 1996-2001 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include <ft2build.h>
+#include "rastpic.c"
+#include "ftraster.c"
+#include "ftrend1.c"
+
+
+/* END */
diff --git a/src/raster/rasterrs.h b/src/raster/rasterrs.h
new file mode 100644 (file)
index 0000000..ab85c00
--- /dev/null
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  rasterrs.h                                                             */
+/*                                                                         */
+/*    monochrome renderer error codes (specification only).                */
+/*                                                                         */
+/*  Copyright 2001, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the monochrome renderer error enumeration */
+  /* constants.                                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __RASTERRS_H__
+#define __RASTERRS_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  Raster_Err_
+#define FT_ERR_BASE    FT_Mod_Err_Raster
+
+#include FT_ERRORS_H
+
+#endif /* __RASTERRS_H__ */
+
+
+/* END */
diff --git a/src/raster/rastpic.c b/src/raster/rastpic.c
new file mode 100644 (file)
index 0000000..2883e3f
--- /dev/null
@@ -0,0 +1,97 @@
+/***************************************************************************/
+/*                                                                         */
+/*  rastpic.c                                                              */
+/*                                                                         */
+/*    The FreeType position independent code services for raster module.   */
+/*                                                                         */
+/*  Copyright 2009, 2010 by                                                */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_INTERNAL_OBJECTS_H
+#include "rastpic.h"
+#include "rasterrs.h"
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* forward declaration of PIC init functions from ftraster.c */
+  void
+  FT_Init_Class_ft_standard_raster( FT_Raster_Funcs*  funcs );
+
+  void
+  ft_raster1_renderer_class_pic_free( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Memory  memory = library->memory;
+
+
+    if ( pic_container->raster )
+    {
+      RasterPIC* container = (RasterPIC*)pic_container->raster;
+      if ( --container->ref_count )
+        return;
+      FT_FREE( container );
+      pic_container->raster = NULL;
+    }
+  }
+
+
+  FT_Error
+  ft_raster1_renderer_class_pic_init( FT_Library  library )
+  {
+    FT_PIC_Container* pic_container = &library->pic_container;
+    FT_Error          error         = Raster_Err_Ok;
+    RasterPIC*        container;
+    FT_Memory         memory        = library->memory;
+
+
+    /* since this function also serve raster5 renderer,
+       it implements reference counting */
+    if ( pic_container->raster )
+    {
+      ((RasterPIC*)pic_container->raster)->ref_count++;
+      return error;
+    }
+
+    /* allocate pointer, clear and set global container pointer */
+    if ( FT_ALLOC( container, sizeof ( *container ) ) )
+      return error;
+    FT_MEM_SET( container, 0, sizeof ( *container ) );
+    pic_container->raster = container;
+    container->ref_count = 1;
+
+    /* initialize pointer table - this is how the module usually expects this data */
+    FT_Init_Class_ft_standard_raster( &container->ft_standard_raster );
+/*Exit:*/
+    if( error )
+      ft_raster1_renderer_class_pic_free( library );
+    return error;
+  }
+
+  /* re-route these init and free functions to the above functions */
+  FT_Error
+  ft_raster5_renderer_class_pic_init( FT_Library  library )
+  {
+    return ft_raster1_renderer_class_pic_init( library );
+  }
+
+  void
+  ft_raster5_renderer_class_pic_free( FT_Library  library )
+  {
+    ft_raster1_renderer_class_pic_free( library );
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/src/raster/rastpic.h b/src/raster/rastpic.h
new file mode 100644 (file)
index 0000000..7822a24
--- /dev/null
@@ -0,0 +1,63 @@
+/***************************************************************************/
+/*                                                                         */
+/*  rastpic.h                                                              */
+/*                                                                         */
+/*    The FreeType position independent code services for raster module.   */
+/*                                                                         */
+/*  Copyright 2009 by                                                      */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __RASTPIC_H__
+#define __RASTPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include FT_INTERNAL_PIC_H
+
+#ifndef FT_CONFIG_OPTION_PIC
+#define FT_STANDARD_RASTER_GET     ft_standard_raster
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+  typedef struct RasterPIC_
+  {
+    int ref_count;
+    FT_Raster_Funcs ft_standard_raster;
+  } RasterPIC;
+
+#define GET_PIC(lib)               ((RasterPIC*)((lib)->pic_container.raster))
+#define FT_STANDARD_RASTER_GET     (GET_PIC(library)->ft_standard_raster)
+
+  /* see rastpic.c for the implementation */
+  void
+  ft_raster1_renderer_class_pic_free( FT_Library  library );
+
+  void
+  ft_raster5_renderer_class_pic_free( FT_Library  library );
+
+  FT_Error
+  ft_raster1_renderer_class_pic_init( FT_Library  library );
+
+  FT_Error
+  ft_raster5_renderer_class_pic_init( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __RASTPIC_H__ */
+
+
+/* END */
diff --git a/src/raster/rules.mk b/src/raster/rules.mk
new file mode 100644 (file)
index 0000000..0e0b5e4
--- /dev/null
@@ -0,0 +1,70 @@
+#
+# FreeType 2 renderer module build rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003, 2008, 2009, 2011 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.
+
+
+# raster driver directory
+#
+RASTER_DIR := $(SRC_DIR)/raster
+
+# compilation flags for the driver
+#
+RASTER_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(RASTER_DIR))
+
+
+# raster driver sources (i.e., C files)
+#
+RASTER_DRV_SRC := $(RASTER_DIR)/ftraster.c \
+                  $(RASTER_DIR)/ftrend1.c  \
+                  $(RASTER_DIR)/rastpic.c
+
+
+# raster driver headers
+#
+RASTER_DRV_H := $(RASTER_DRV_SRC:%.c=%.h) \
+                $(RASTER_DIR)/rasterrs.h
+
+
+# raster driver object(s)
+#
+#   RASTER_DRV_OBJ_M is used during `multi' builds.
+#   RASTER_DRV_OBJ_S is used during `single' builds.
+#
+RASTER_DRV_OBJ_M := $(RASTER_DRV_SRC:$(RASTER_DIR)/%.c=$(OBJ_DIR)/%.$O)
+RASTER_DRV_OBJ_S := $(OBJ_DIR)/raster.$O
+
+# raster driver source file for single build
+#
+RASTER_DRV_SRC_S := $(RASTER_DIR)/raster.c
+
+
+# raster driver - single object
+#
+$(RASTER_DRV_OBJ_S): $(RASTER_DRV_SRC_S) $(RASTER_DRV_SRC) \
+                     $(FREETYPE_H) $(RASTER_DRV_H)
+       $(RASTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(RASTER_DRV_SRC_S))
+
+
+# raster driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(RASTER_DIR)/%.c $(FREETYPE_H) $(RASTER_DRV_H)
+       $(RASTER_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(RASTER_DRV_OBJ_S)
+DRV_OBJS_M += $(RASTER_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/sfnt/Jamfile b/src/sfnt/Jamfile
new file mode 100644 (file)
index 0000000..cb20b1b
--- /dev/null
@@ -0,0 +1,29 @@
+# FreeType 2 src/sfnt Jamfile
+#
+# Copyright 2001, 2002, 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) sfnt ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = sfobjs sfdriver ttcmap ttmtx ttpost ttload ttsbit ttkern ttbdf sfntpic ;
+  }
+  else
+  {
+    _sources = sfnt ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/sfnt Jamfile
diff --git a/src/sfnt/module.mk b/src/sfnt/module.mk
new file mode 100644 (file)
index 0000000..95fd6a3
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# FreeType 2 SFNT module definition
+#
+
+
+# Copyright 1996-2000, 2006 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.
+
+
+FTMODULE_H_COMMANDS += SFNT_MODULE
+
+define SFNT_MODULE
+$(OPEN_DRIVER) FT_Module_Class, sfnt_module_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)sfnt      $(ECHO_DRIVER_DESC)helper module for TrueType & OpenType formats$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/src/sfnt/rules.mk b/src/sfnt/rules.mk
new file mode 100644 (file)
index 0000000..02cee58
--- /dev/null
@@ -0,0 +1,80 @@
+#
+# FreeType 2 SFNT driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2011 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.
+
+
+# SFNT driver directory
+#
+SFNT_DIR := $(SRC_DIR)/sfnt
+
+
+# compilation flags for the driver
+#
+SFNT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SFNT_DIR))
+
+
+# SFNT driver sources (i.e., C files)
+#
+SFNT_DRV_SRC := $(SFNT_DIR)/ttload.c   \
+                $(SFNT_DIR)/ttmtx.c    \
+                $(SFNT_DIR)/ttcmap.c   \
+                $(SFNT_DIR)/ttsbit.c   \
+                $(SFNT_DIR)/ttpost.c   \
+                $(SFNT_DIR)/ttkern.c   \
+                $(SFNT_DIR)/ttbdf.c    \
+                $(SFNT_DIR)/sfobjs.c   \
+                $(SFNT_DIR)/sfdriver.c \
+                $(SFNT_DIR)/sfntpic.c
+
+# SFNT driver headers
+#
+# Note that ttsbit0.c gets #included by ttsbit.c.
+#
+SFNT_DRV_H := $(SFNT_DRV_SRC:%c=%h)  \
+              $(SFNT_DIR)/sferrors.h \
+              $(SFNT_DIR)/ttsbit0.c
+
+
+# SFNT driver object(s)
+#
+#   SFNT_DRV_OBJ_M is used during `multi' builds.
+#   SFNT_DRV_OBJ_S is used during `single' builds.
+#
+SFNT_DRV_OBJ_M := $(SFNT_DRV_SRC:$(SFNT_DIR)/%.c=$(OBJ_DIR)/%.$O)
+SFNT_DRV_OBJ_S := $(OBJ_DIR)/sfnt.$O
+
+# SFNT driver source file for single build
+#
+SFNT_DRV_SRC_S := $(SFNT_DIR)/sfnt.c
+
+
+# SFNT driver - single object
+#
+$(SFNT_DRV_OBJ_S): $(SFNT_DRV_SRC_S) $(SFNT_DRV_SRC) \
+                   $(FREETYPE_H) $(SFNT_DRV_H)
+       $(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SFNT_DRV_SRC_S))
+
+
+# SFNT driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(SFNT_DIR)/%.c $(FREETYPE_H) $(SFNT_DRV_H)
+       $(SFNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(SFNT_DRV_OBJ_S)
+DRV_OBJS_M += $(SFNT_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/sfnt/sfdriver.c b/src/sfnt/sfdriver.c
new file mode 100644 (file)
index 0000000..847d83d
--- /dev/null
@@ -0,0 +1,667 @@
+/***************************************************************************/
+/*                                                                         */
+/*  sfdriver.c                                                             */
+/*                                                                         */
+/*    High-level SFNT driver interface (body).                             */
+/*                                                                         */
+/*  Copyright 1996-2007, 2009-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_SFNT_H
+#include FT_INTERNAL_OBJECTS_H
+
+#include "sfdriver.h"
+#include "ttload.h"
+#include "sfobjs.h"
+#include "sfntpic.h"
+
+#include "sferrors.h"
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#include "ttsbit.h"
+#endif
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+#include "ttpost.h"
+#endif
+
+#ifdef TT_CONFIG_OPTION_BDF
+#include "ttbdf.h"
+#include FT_SERVICE_BDF_H
+#endif
+
+#include "ttcmap.h"
+#include "ttkern.h"
+#include "ttmtx.h"
+
+#include FT_SERVICE_GLYPH_DICT_H
+#include FT_SERVICE_POSTSCRIPT_NAME_H
+#include FT_SERVICE_SFNT_H
+#include FT_SERVICE_TT_CMAP_H
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_sfdriver
+
+
+ /*
+  *  SFNT TABLE SERVICE
+  *
+  */
+
+  static void*
+  get_sfnt_table( TT_Face      face,
+                  FT_Sfnt_Tag  tag )
+  {
+    void*  table;
+
+
+    switch ( tag )
+    {
+    case ft_sfnt_head:
+      table = &face->header;
+      break;
+
+    case ft_sfnt_hhea:
+      table = &face->horizontal;
+      break;
+
+    case ft_sfnt_vhea:
+      table = face->vertical_info ? &face->vertical : 0;
+      break;
+
+    case ft_sfnt_os2:
+      table = face->os2.version == 0xFFFFU ? 0 : &face->os2;
+      break;
+
+    case ft_sfnt_post:
+      table = &face->postscript;
+      break;
+
+    case ft_sfnt_maxp:
+      table = &face->max_profile;
+      break;
+
+    case ft_sfnt_pclt:
+      table = face->pclt.Version ? &face->pclt : 0;
+      break;
+
+    default:
+      table = 0;
+    }
+
+    return table;
+  }
+
+
+  static FT_Error
+  sfnt_table_info( TT_Face    face,
+                   FT_UInt    idx,
+                   FT_ULong  *tag,
+                   FT_ULong  *offset,
+                   FT_ULong  *length )
+  {
+    if ( !offset || !length )
+      return SFNT_Err_Invalid_Argument;
+
+    if ( !tag )
+      *length = face->num_tables;
+    else
+    {
+      if ( idx >= face->num_tables )
+        return SFNT_Err_Table_Missing;
+
+      *tag    = face->dir_tables[idx].Tag;
+      *offset = face->dir_tables[idx].Offset;
+      *length = face->dir_tables[idx].Length;
+    }
+
+    return SFNT_Err_Ok;
+  }
+
+
+  FT_DEFINE_SERVICE_SFNT_TABLEREC(sfnt_service_sfnt_table,
+    (FT_SFNT_TableLoadFunc)tt_face_load_any,
+    (FT_SFNT_TableGetFunc) get_sfnt_table,
+    (FT_SFNT_TableInfoFunc)sfnt_table_info
+  )
+
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+ /*
+  *  GLYPH DICT SERVICE
+  *
+  */
+
+  static FT_Error
+  sfnt_get_glyph_name( TT_Face     face,
+                       FT_UInt     glyph_index,
+                       FT_Pointer  buffer,
+                       FT_UInt     buffer_max )
+  {
+    FT_String*  gname;
+    FT_Error    error;
+
+
+    error = tt_face_get_ps_name( face, glyph_index, &gname );
+    if ( !error )
+      FT_STRCPYN( buffer, gname, buffer_max );
+
+    return error;
+  }
+
+
+  static FT_UInt
+  sfnt_get_name_index( TT_Face     face,
+                       FT_String*  glyph_name )
+  {
+    FT_Face   root = &face->root;
+    FT_UInt   i, max_gid = FT_UINT_MAX;
+
+
+    if ( root->num_glyphs < 0 )
+      return 0;
+    else if ( ( FT_ULong ) root->num_glyphs < FT_UINT_MAX )
+      max_gid = ( FT_UInt ) root->num_glyphs;
+    else
+      FT_TRACE0(( "Ignore glyph names for invalid GID 0x%08x - 0x%08x\n",
+         FT_UINT_MAX, root->num_glyphs ));
+
+    for ( i = 0; i < max_gid; i++ )
+    {
+      FT_String*  gname;
+      FT_Error    error = tt_face_get_ps_name( face, i, &gname );
+
+
+      if ( error )
+        continue;
+
+      if ( !ft_strcmp( glyph_name, gname ) )
+        return i;
+    }
+
+    return 0;
+  }
+
+
+  FT_DEFINE_SERVICE_GLYPHDICTREC(sfnt_service_glyph_dict,
+    (FT_GlyphDict_GetNameFunc)  sfnt_get_glyph_name,
+    (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index
+  )
+
+#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
+
+ /*
+  *  POSTSCRIPT NAME SERVICE
+  *
+  */
+
+  static const char*
+  sfnt_get_ps_name( TT_Face  face )
+  {
+    FT_Int       n, found_win, found_apple;
+    const char*  result = NULL;
+
+
+    /* shouldn't happen, but just in case to avoid memory leaks */
+    if ( face->postscript_name )
+      return face->postscript_name;
+
+    /* scan the name table to see whether we have a Postscript name here, */
+    /* either in Macintosh or Windows platform encodings                  */
+    found_win   = -1;
+    found_apple = -1;
+
+    for ( n = 0; n < face->num_names; n++ )
+    {
+      TT_NameEntryRec*  name = face->name_table.names + n;
+
+
+      if ( name->nameID == 6 && name->stringLength > 0 )
+      {
+        if ( name->platformID == 3     &&
+             name->encodingID == 1     &&
+             name->languageID == 0x409 )
+          found_win = n;
+
+        if ( name->platformID == 1 &&
+             name->encodingID == 0 &&
+             name->languageID == 0 )
+          found_apple = n;
+      }
+    }
+
+    if ( found_win != -1 )
+    {
+      FT_Memory         memory = face->root.memory;
+      TT_NameEntryRec*  name   = face->name_table.names + found_win;
+      FT_UInt           len    = name->stringLength / 2;
+      FT_Error          error  = SFNT_Err_Ok;
+
+      FT_UNUSED( error );
+
+
+      if ( !FT_ALLOC( result, name->stringLength + 1 ) )
+      {
+        FT_Stream   stream = face->name_table.stream;
+        FT_String*  r      = (FT_String*)result;
+        FT_Byte*    p      = (FT_Byte*)name->string;
+
+
+        if ( FT_STREAM_SEEK( name->stringOffset ) ||
+             FT_FRAME_ENTER( name->stringLength ) )
+        {
+          FT_FREE( result );
+          name->stringLength = 0;
+          name->stringOffset = 0;
+          FT_FREE( name->string );
+
+          goto Exit;
+        }
+
+        p = (FT_Byte*)stream->cursor;
+
+        for ( ; len > 0; len--, p += 2 )
+        {
+          if ( p[0] == 0 && p[1] >= 32 && p[1] < 128 )
+            *r++ = p[1];
+        }
+        *r = '\0';
+
+        FT_FRAME_EXIT();
+      }
+      goto Exit;
+    }
+
+    if ( found_apple != -1 )
+    {
+      FT_Memory         memory = face->root.memory;
+      TT_NameEntryRec*  name   = face->name_table.names + found_apple;
+      FT_UInt           len    = name->stringLength;
+      FT_Error          error  = SFNT_Err_Ok;
+
+      FT_UNUSED( error );
+
+
+      if ( !FT_ALLOC( result, len + 1 ) )
+      {
+        FT_Stream  stream = face->name_table.stream;
+
+
+        if ( FT_STREAM_SEEK( name->stringOffset ) ||
+             FT_STREAM_READ( result, len )        )
+        {
+          name->stringOffset = 0;
+          name->stringLength = 0;
+          FT_FREE( name->string );
+          FT_FREE( result );
+          goto Exit;
+        }
+        ((char*)result)[len] = '\0';
+      }
+    }
+
+  Exit:
+    face->postscript_name = result;
+    return result;
+  }
+
+  FT_DEFINE_SERVICE_PSFONTNAMEREC(sfnt_service_ps_name,
+    (FT_PsName_GetFunc)sfnt_get_ps_name
+  )
+
+
+  /*
+   *  TT CMAP INFO
+   */
+  FT_DEFINE_SERVICE_TTCMAPSREC(tt_service_get_cmap_info,
+    (TT_CMap_Info_GetFunc)tt_get_cmap_info
+  )
+
+
+#ifdef TT_CONFIG_OPTION_BDF
+
+  static FT_Error
+  sfnt_get_charset_id( TT_Face       face,
+                       const char*  *acharset_encoding,
+                       const char*  *acharset_registry )
+  {
+    BDF_PropertyRec  encoding, registry;
+    FT_Error         error;
+
+
+    /* XXX: I don't know whether this is correct, since
+     *      tt_face_find_bdf_prop only returns something correct if we have
+     *      previously selected a size that is listed in the BDF table.
+     *      Should we change the BDF table format to include single offsets
+     *      for `CHARSET_REGISTRY' and `CHARSET_ENCODING'?
+     */
+    error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", &registry );
+    if ( !error )
+    {
+      error = tt_face_find_bdf_prop( face, "CHARSET_ENCODING", &encoding );
+      if ( !error )
+      {
+        if ( registry.type == BDF_PROPERTY_TYPE_ATOM &&
+             encoding.type == BDF_PROPERTY_TYPE_ATOM )
+        {
+          *acharset_encoding = encoding.u.atom;
+          *acharset_registry = registry.u.atom;
+        }
+        else
+          error = SFNT_Err_Invalid_Argument;
+      }
+    }
+
+    return error;
+  }
+
+
+  FT_DEFINE_SERVICE_BDFRec(sfnt_service_bdf,
+    (FT_BDF_GetCharsetIdFunc) sfnt_get_charset_id,
+    (FT_BDF_GetPropertyFunc)  tt_face_find_bdf_prop
+  )
+
+#endif /* TT_CONFIG_OPTION_BDF */
+
+
+  /*
+   *  SERVICE LIST
+   */
+
+#if defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES && defined TT_CONFIG_OPTION_BDF
+  FT_DEFINE_SERVICEDESCREC5(sfnt_services,
+    FT_SERVICE_ID_SFNT_TABLE,           &FT_SFNT_SERVICE_SFNT_TABLE_GET,
+    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_SFNT_SERVICE_PS_NAME_GET,
+    FT_SERVICE_ID_GLYPH_DICT,           &FT_SFNT_SERVICE_GLYPH_DICT_GET,
+    FT_SERVICE_ID_BDF,                  &FT_SFNT_SERVICE_BDF_GET,
+    FT_SERVICE_ID_TT_CMAP,              &FT_TT_SERVICE_GET_CMAP_INFO_GET
+  )
+#elif defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+  FT_DEFINE_SERVICEDESCREC4(sfnt_services,
+    FT_SERVICE_ID_SFNT_TABLE,           &FT_SFNT_SERVICE_SFNT_TABLE_GET,
+    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_SFNT_SERVICE_PS_NAME_GET,
+    FT_SERVICE_ID_GLYPH_DICT,           &FT_SFNT_SERVICE_GLYPH_DICT_GET,
+    FT_SERVICE_ID_TT_CMAP,              &FT_TT_SERVICE_GET_CMAP_INFO_GET
+  )
+#elif defined TT_CONFIG_OPTION_BDF
+  FT_DEFINE_SERVICEDESCREC4(sfnt_services,
+    FT_SERVICE_ID_SFNT_TABLE,           &FT_SFNT_SERVICE_SFNT_TABLE_GET,
+    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_SFNT_SERVICE_PS_NAME_GET,
+    FT_SERVICE_ID_BDF,                  &FT_SFNT_SERVICE_BDF_GET,
+    FT_SERVICE_ID_TT_CMAP,              &FT_TT_SERVICE_GET_CMAP_INFO_GET
+  )
+#else
+  FT_DEFINE_SERVICEDESCREC3(sfnt_services,
+    FT_SERVICE_ID_SFNT_TABLE,           &FT_SFNT_SERVICE_SFNT_TABLE_GET,
+    FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_SFNT_SERVICE_PS_NAME_GET,
+    FT_SERVICE_ID_TT_CMAP,              &FT_TT_SERVICE_GET_CMAP_INFO_GET
+  )
+#endif
+
+
+  FT_CALLBACK_DEF( FT_Module_Interface )
+  sfnt_get_interface( FT_Module    module,
+                      const char*  module_interface )
+  {
+    /* FT_SFNT_SERVICES_GET derefers `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+    FT_Library  library;
+
+
+    if ( !module )
+      return NULL;
+    library = module->library;
+    if ( !library )
+      return NULL;
+#else
+    FT_UNUSED( module );
+#endif
+    return ft_service_list_lookup( FT_SFNT_SERVICES_GET, module_interface );
+  }
+
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_face_load_sfnt_header_stub( TT_Face      face,
+                                 FT_Stream    stream,
+                                 FT_Long      face_index,
+                                 SFNT_Header  header )
+  {
+    FT_UNUSED( face );
+    FT_UNUSED( stream );
+    FT_UNUSED( face_index );
+    FT_UNUSED( header );
+
+    return SFNT_Err_Unimplemented_Feature;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_face_load_directory_stub( TT_Face      face,
+                               FT_Stream    stream,
+                               SFNT_Header  header )
+  {
+    FT_UNUSED( face );
+    FT_UNUSED( stream );
+    FT_UNUSED( header );
+
+    return SFNT_Err_Unimplemented_Feature;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_face_load_hdmx_stub( TT_Face    face,
+                          FT_Stream  stream )
+  {
+    FT_UNUSED( face );
+    FT_UNUSED( stream );
+
+    return SFNT_Err_Unimplemented_Feature;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  tt_face_free_hdmx_stub( TT_Face  face )
+  {
+    FT_UNUSED( face );
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_face_set_sbit_strike_stub( TT_Face    face,
+                                FT_UInt    x_ppem,
+                                FT_UInt    y_ppem,
+                                FT_ULong*  astrike_index )
+  {
+    /*
+     * We simply forge a FT_Size_Request and call the real function
+     * that does all the work.
+     *
+     * This stub might be called by libXfont in the X.Org Xserver,
+     * compiled against version 2.1.8 or newer.
+     */
+
+    FT_Size_RequestRec  req;
+
+
+    req.type           = FT_SIZE_REQUEST_TYPE_NOMINAL;
+    req.width          = (FT_F26Dot6)x_ppem;
+    req.height         = (FT_F26Dot6)y_ppem;
+    req.horiResolution = 0;
+    req.vertResolution = 0;
+
+    *astrike_index = 0x7FFFFFFFUL;
+
+    return tt_face_set_sbit_strike( face, &req, astrike_index );
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_face_load_sbit_stub( TT_Face    face,
+                          FT_Stream  stream )
+  {
+    FT_UNUSED( face );
+    FT_UNUSED( stream );
+
+    /*
+     *  This function was originally implemented to load the sbit table.
+     *  However, it has been replaced by `tt_face_load_eblc', and this stub
+     *  is only there for some rogue clients which would want to call it
+     *  directly (which doesn't make much sense).
+     */
+    return SFNT_Err_Unimplemented_Feature;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  tt_face_free_sbit_stub( TT_Face  face )
+  {
+    /* nothing to do in this stub */
+    FT_UNUSED( face );
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_face_load_charmap_stub( TT_Face    face,
+                             void*      cmap,
+                             FT_Stream  input )
+  {
+    FT_UNUSED( face );
+    FT_UNUSED( cmap );
+    FT_UNUSED( input );
+
+    return SFNT_Err_Unimplemented_Feature;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_face_free_charmap_stub( TT_Face  face,
+                             void*    cmap )
+  {
+    FT_UNUSED( face );
+    FT_UNUSED( cmap );
+
+    return SFNT_Err_Ok;
+  }
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#define PUT_EMBEDDED_BITMAPS(a) a
+#else
+#define PUT_EMBEDDED_BITMAPS(a) 0
+#endif
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+#define PUT_PS_NAMES(a) a
+#else
+#define PUT_PS_NAMES(a) 0
+#endif
+
+  FT_DEFINE_SFNT_INTERFACE(sfnt_interface,
+    tt_face_goto_table,
+
+    sfnt_init_face,
+    sfnt_load_face,
+    sfnt_done_face,
+    sfnt_get_interface,
+
+    tt_face_load_any,
+
+    tt_face_load_sfnt_header_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */
+    tt_face_load_directory_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+    tt_face_load_head,
+    tt_face_load_hhea,
+    tt_face_load_cmap,
+    tt_face_load_maxp,
+    tt_face_load_os2,
+    tt_face_load_post,
+
+    tt_face_load_name,
+    tt_face_free_name,
+
+    tt_face_load_hdmx_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */
+    tt_face_free_hdmx_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+    tt_face_load_kern,
+    tt_face_load_gasp,
+    tt_face_load_pclt,
+
+    /* see `ttload.h' */
+    PUT_EMBEDDED_BITMAPS(tt_face_load_bhed),
+
+    tt_face_set_sbit_strike_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */
+    tt_face_load_sbit_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+    tt_find_sbit_image, /* FT_CONFIG_OPTION_OLD_INTERNALS */
+    tt_load_sbit_metrics, /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+    PUT_EMBEDDED_BITMAPS(tt_face_load_sbit_image),
+
+    tt_face_free_sbit_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+    /* see `ttpost.h' */
+    PUT_PS_NAMES(tt_face_get_ps_name),
+    PUT_PS_NAMES(tt_face_free_ps_names),
+
+    tt_face_load_charmap_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */
+    tt_face_free_charmap_stub, /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+    /* since version 2.1.8 */
+
+    tt_face_get_kerning,
+
+    /* since version 2.2 */
+
+    tt_face_load_font_dir,
+    tt_face_load_hmtx,
+
+    /* see `ttsbit.h' and `sfnt.h' */
+    PUT_EMBEDDED_BITMAPS(tt_face_load_eblc),
+    PUT_EMBEDDED_BITMAPS(tt_face_free_eblc),
+
+    PUT_EMBEDDED_BITMAPS(tt_face_set_sbit_strike),
+    PUT_EMBEDDED_BITMAPS(tt_face_load_strike_metrics),
+
+    tt_face_get_metrics
+  )
+
+
+  FT_DEFINE_MODULE(sfnt_module_class,
+
+    0,  /* not a font driver or renderer */
+    sizeof ( FT_ModuleRec ),
+
+    "sfnt",     /* driver name                            */
+    0x10000L,   /* driver version 1.0                     */
+    0x20000L,   /* driver requires FreeType 2.0 or higher */
+
+    (const void*)&FT_SFNT_INTERFACE_GET,  /* module specific interface */
+
+    (FT_Module_Constructor)0,
+    (FT_Module_Destructor) 0,
+    (FT_Module_Requester)  sfnt_get_interface
+  )
+
+
+/* END */
diff --git a/src/sfnt/sfdriver.h b/src/sfnt/sfdriver.h
new file mode 100644 (file)
index 0000000..5de25d5
--- /dev/null
@@ -0,0 +1,38 @@
+/***************************************************************************/
+/*                                                                         */
+/*  sfdriver.h                                                             */
+/*                                                                         */
+/*    High-level SFNT driver interface (specification).                    */
+/*                                                                         */
+/*  Copyright 1996-2001 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SFDRIVER_H__
+#define __SFDRIVER_H__
+
+
+#include <ft2build.h>
+#include FT_MODULE_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_DECLARE_MODULE( sfnt_module_class )
+
+
+FT_END_HEADER
+
+#endif /* __SFDRIVER_H__ */
+
+
+/* END */
diff --git a/src/sfnt/sferrors.h b/src/sfnt/sferrors.h
new file mode 100644 (file)
index 0000000..564a3fe
--- /dev/null
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  sferrors.h                                                             */
+/*                                                                         */
+/*    SFNT error codes (specification only).                               */
+/*                                                                         */
+/*  Copyright 2001, 2004, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the SFNT error enumeration constants.     */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __SFERRORS_H__
+#define __SFERRORS_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  SFNT_Err_
+#define FT_ERR_BASE    FT_Mod_Err_SFNT
+
+#define FT_KEEP_ERR_PREFIX
+
+#include FT_ERRORS_H
+
+#endif /* __SFERRORS_H__ */
+
+/* END */
diff --git a/src/sfnt/sfnt.c b/src/sfnt/sfnt.c
new file mode 100644 (file)
index 0000000..fc507b4
--- /dev/null
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  sfnt.c                                                                 */
+/*                                                                         */
+/*    Single object library component.                                     */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include <ft2build.h>
+#include "sfntpic.c"
+#include "ttload.c"
+#include "ttmtx.c"
+#include "ttcmap.c"
+#include "ttkern.c"
+#include "sfobjs.c"
+#include "sfdriver.c"
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#include "ttsbit.c"
+#endif
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+#include "ttpost.c"
+#endif
+
+#ifdef TT_CONFIG_OPTION_BDF
+#include "ttbdf.c"
+#endif
+
+/* END */
diff --git a/src/sfnt/sfntpic.c b/src/sfnt/sfntpic.c
new file mode 100644 (file)
index 0000000..1372376
--- /dev/null
@@ -0,0 +1,146 @@
+/***************************************************************************/
+/*                                                                         */
+/*  sfntpic.c                                                              */
+/*                                                                         */
+/*    The FreeType position independent code services for sfnt module.     */
+/*                                                                         */
+/*  Copyright 2009, 2010 by                                                */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_INTERNAL_OBJECTS_H
+#include "sfntpic.h"
+#include "sferrors.h"
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* forward declaration of PIC init functions from sfdriver.c */
+  FT_Error
+  FT_Create_Class_sfnt_services( FT_Library           library,
+                                 FT_ServiceDescRec**  ouput_class );
+
+  void
+  FT_Destroy_Class_sfnt_services( FT_Library          library,
+                                  FT_ServiceDescRec*  clazz );
+
+  void
+  FT_Init_Class_sfnt_service_bdf( FT_Service_BDFRec*  clazz );
+
+  void
+  FT_Init_Class_sfnt_interface( FT_Library       library,
+                                SFNT_Interface*  clazz );
+
+  void
+  FT_Init_Class_sfnt_service_glyph_dict(
+    FT_Library                library,
+    FT_Service_GlyphDictRec*  clazz );
+
+  void
+  FT_Init_Class_sfnt_service_ps_name(
+    FT_Library                 library,
+    FT_Service_PsFontNameRec*  clazz );
+
+  void
+  FT_Init_Class_tt_service_get_cmap_info(
+    FT_Library              library,
+    FT_Service_TTCMapsRec*  clazz );
+
+  void
+  FT_Init_Class_sfnt_service_sfnt_table(
+    FT_Service_SFNT_TableRec*  clazz );
+
+  /* forward declaration of PIC init functions from ttcmap.c */
+  FT_Error
+  FT_Create_Class_tt_cmap_classes( FT_Library       library,
+                                   TT_CMap_Class**  output_class );
+
+  void
+  FT_Destroy_Class_tt_cmap_classes( FT_Library      library,
+                                    TT_CMap_Class*  clazz );
+
+  void
+  sfnt_module_class_pic_free( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Memory  memory = library->memory;
+
+
+    if ( pic_container->sfnt )
+    {
+      sfntModulePIC*  container = (sfntModulePIC*)pic_container->sfnt;
+
+
+      if ( container->sfnt_services )
+        FT_Destroy_Class_sfnt_services( library,
+                                        container->sfnt_services );
+      container->sfnt_services = NULL;
+      if ( container->tt_cmap_classes )
+        FT_Destroy_Class_tt_cmap_classes( library,
+                                          container->tt_cmap_classes );
+      container->tt_cmap_classes = NULL;
+      FT_FREE( container );
+      pic_container->sfnt = NULL;
+    }
+  }
+
+
+  FT_Error
+  sfnt_module_class_pic_init(  FT_Library library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Error           error = SFNT_Err_Ok;
+    sfntModulePIC*     container;
+    FT_Memory          memory = library->memory;
+
+
+    /* allocate pointer, clear and set global container pointer */
+    if ( FT_ALLOC ( container, sizeof ( *container ) ) )
+      return error;
+    FT_MEM_SET( container, 0, sizeof ( *container ) );
+    pic_container->sfnt = container;
+
+    /* initialize pointer table - this is how the module usually expects this data */
+    error = FT_Create_Class_sfnt_services( library,
+                                           &container->sfnt_services );
+    if ( error )
+      goto Exit;
+    error = FT_Create_Class_tt_cmap_classes( library,
+                                             &container->tt_cmap_classes );
+    if ( error )
+      goto Exit;
+
+    FT_Init_Class_sfnt_service_glyph_dict(
+      library, &container->sfnt_service_glyph_dict );
+    FT_Init_Class_sfnt_service_ps_name(
+      library, &container->sfnt_service_ps_name );
+    FT_Init_Class_tt_service_get_cmap_info(
+      library, &container->tt_service_get_cmap_info );
+    FT_Init_Class_sfnt_service_sfnt_table(
+      &container->sfnt_service_sfnt_table );
+#ifdef TT_CONFIG_OPTION_BDF
+    FT_Init_Class_sfnt_service_bdf( &container->sfnt_service_bdf );
+#endif
+    FT_Init_Class_sfnt_interface( library, &container->sfnt_interface );
+
+Exit:
+    if ( error )
+      sfnt_module_class_pic_free( library );
+    return error;
+  }
+
+
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/src/sfnt/sfntpic.h b/src/sfnt/sfntpic.h
new file mode 100644 (file)
index 0000000..f7993d1
--- /dev/null
@@ -0,0 +1,95 @@
+/***************************************************************************/
+/*                                                                         */
+/*  sfntpic.h                                                              */
+/*                                                                         */
+/*    The FreeType position independent code services for sfnt module.     */
+/*                                                                         */
+/*  Copyright 2009 by                                                      */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SFNTPIC_H__
+#define __SFNTPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include FT_INTERNAL_PIC_H
+
+ #ifndef FT_CONFIG_OPTION_PIC
+#define FT_SFNT_SERVICES_GET             sfnt_services
+#define FT_SFNT_SERVICE_GLYPH_DICT_GET   sfnt_service_glyph_dict
+#define FT_SFNT_SERVICE_PS_NAME_GET      sfnt_service_ps_name
+#define FT_TT_SERVICE_GET_CMAP_INFO_GET  tt_service_get_cmap_info
+#define FT_SFNT_SERVICES_GET             sfnt_services
+#define FT_TT_CMAP_CLASSES_GET           tt_cmap_classes
+#define FT_SFNT_SERVICE_SFNT_TABLE_GET   sfnt_service_sfnt_table
+#define FT_SFNT_SERVICE_BDF_GET          sfnt_service_bdf
+#define FT_SFNT_INTERFACE_GET            sfnt_interface
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+/* some include files required for members of sfntModulePIC */
+#include FT_SERVICE_GLYPH_DICT_H
+#include FT_SERVICE_POSTSCRIPT_NAME_H
+#include FT_SERVICE_SFNT_H
+#include FT_SERVICE_TT_CMAP_H
+#ifdef TT_CONFIG_OPTION_BDF
+#include "ttbdf.h"
+#include FT_SERVICE_BDF_H
+#endif
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_SFNT_H
+#include "ttcmap.h"
+
+typedef struct sfntModulePIC_
+  {
+    FT_ServiceDescRec* sfnt_services;
+    FT_Service_GlyphDictRec sfnt_service_glyph_dict;
+    FT_Service_PsFontNameRec  sfnt_service_ps_name;
+    FT_Service_TTCMapsRec  tt_service_get_cmap_info;
+    TT_CMap_Class* tt_cmap_classes;
+    FT_Service_SFNT_TableRec sfnt_service_sfnt_table;
+#ifdef TT_CONFIG_OPTION_BDF
+    FT_Service_BDFRec sfnt_service_bdf;
+#endif
+    SFNT_Interface sfnt_interface;
+  } sfntModulePIC;
+
+#define GET_PIC(lib)                      ((sfntModulePIC*)((lib)->pic_container.sfnt))
+#define FT_SFNT_SERVICES_GET              (GET_PIC(library)->sfnt_services)
+#define FT_SFNT_SERVICE_GLYPH_DICT_GET    (GET_PIC(library)->sfnt_service_glyph_dict)
+#define FT_SFNT_SERVICE_PS_NAME_GET       (GET_PIC(library)->sfnt_service_ps_name)
+#define FT_TT_SERVICE_GET_CMAP_INFO_GET   (GET_PIC(library)->tt_service_get_cmap_info)
+#define FT_SFNT_SERVICES_GET              (GET_PIC(library)->sfnt_services)
+#define FT_TT_CMAP_CLASSES_GET            (GET_PIC(library)->tt_cmap_classes)
+#define FT_SFNT_SERVICE_SFNT_TABLE_GET    (GET_PIC(library)->sfnt_service_sfnt_table)
+#define FT_SFNT_SERVICE_BDF_GET           (GET_PIC(library)->sfnt_service_bdf)
+#define FT_SFNT_INTERFACE_GET             (GET_PIC(library)->sfnt_interface)
+
+  /* see sfntpic.c for the implementation */
+  void
+  sfnt_module_class_pic_free( FT_Library  library );
+
+  FT_Error
+  sfnt_module_class_pic_init( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+/* */
+
+FT_END_HEADER
+
+#endif /* __SFNTPIC_H__ */
+
+
+/* END */
diff --git a/src/sfnt/sfobjs.c b/src/sfnt/sfobjs.c
new file mode 100644 (file)
index 0000000..d7be631
--- /dev/null
@@ -0,0 +1,1163 @@
+/***************************************************************************/
+/*                                                                         */
+/*  sfobjs.c                                                               */
+/*                                                                         */
+/*    SFNT object management (base).                                       */
+/*                                                                         */
+/*  Copyright 1996-2008, 2010-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include "sfobjs.h"
+#include "ttload.h"
+#include "ttcmap.h"
+#include "ttkern.h"
+#include FT_INTERNAL_SFNT_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_TRUETYPE_IDS_H
+#include FT_TRUETYPE_TAGS_H
+#include FT_SERVICE_POSTSCRIPT_CMAPS_H
+#include FT_SFNT_NAMES_H
+#include "sferrors.h"
+
+#ifdef TT_CONFIG_OPTION_BDF
+#include "ttbdf.h"
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_sfobjs
+
+
+
+  /* convert a UTF-16 name entry to ASCII */
+  static FT_String*
+  tt_name_entry_ascii_from_utf16( TT_NameEntry  entry,
+                                  FT_Memory     memory )
+  {
+    FT_String*  string = NULL;
+    FT_UInt     len, code, n;
+    FT_Byte*    read   = (FT_Byte*)entry->string;
+    FT_Error    error;
+
+
+    len = (FT_UInt)entry->stringLength / 2;
+
+    if ( FT_NEW_ARRAY( string, len + 1 ) )
+      return NULL;
+
+    for ( n = 0; n < len; n++ )
+    {
+      code = FT_NEXT_USHORT( read );
+      if ( code < 32 || code > 127 )
+        code = '?';
+
+      string[n] = (char)code;
+    }
+
+    string[len] = 0;
+
+    return string;
+  }
+
+
+  /* convert an Apple Roman or symbol name entry to ASCII */
+  static FT_String*
+  tt_name_entry_ascii_from_other( TT_NameEntry  entry,
+                                  FT_Memory     memory )
+  {
+    FT_String*  string = NULL;
+    FT_UInt     len, code, n;
+    FT_Byte*    read   = (FT_Byte*)entry->string;
+    FT_Error    error;
+
+
+    len = (FT_UInt)entry->stringLength;
+
+    if ( FT_NEW_ARRAY( string, len + 1 ) )
+      return NULL;
+
+    for ( n = 0; n < len; n++ )
+    {
+      code = *read++;
+      if ( code < 32 || code > 127 )
+        code = '?';
+
+      string[n] = (char)code;
+    }
+
+    string[len] = 0;
+
+    return string;
+  }
+
+
+  typedef FT_String*  (*TT_NameEntry_ConvertFunc)( TT_NameEntry  entry,
+                                                   FT_Memory     memory );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_get_name                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Returns a given ENGLISH name record in ASCII.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the source face object.                      */
+  /*                                                                       */
+  /*    nameid :: The name id of the name record to return.                */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    name   :: The address of a string pointer.  NULL if no name is     */
+  /*              present.                                                 */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  static FT_Error
+  tt_face_get_name( TT_Face      face,
+                    FT_UShort    nameid,
+                    FT_String**  name )
+  {
+    FT_Memory         memory = face->root.memory;
+    FT_Error          error  = SFNT_Err_Ok;
+    FT_String*        result = NULL;
+    FT_UShort         n;
+    TT_NameEntryRec*  rec;
+    FT_Int            found_apple         = -1;
+    FT_Int            found_apple_roman   = -1;
+    FT_Int            found_apple_english = -1;
+    FT_Int            found_win           = -1;
+    FT_Int            found_unicode       = -1;
+
+    FT_Bool           is_english = 0;
+
+    TT_NameEntry_ConvertFunc  convert;
+
+
+    FT_ASSERT( name );
+
+    rec = face->name_table.names;
+    for ( n = 0; n < face->num_names; n++, rec++ )
+    {
+      /* According to the OpenType 1.3 specification, only Microsoft or  */
+      /* Apple platform IDs might be used in the `name' table.  The      */
+      /* `Unicode' platform is reserved for the `cmap' table, and the    */
+      /* `ISO' one is deprecated.                                        */
+      /*                                                                 */
+      /* However, the Apple TrueType specification doesn't say the same  */
+      /* thing and goes to suggest that all Unicode `name' table entries */
+      /* should be coded in UTF-16 (in big-endian format I suppose).     */
+      /*                                                                 */
+      if ( rec->nameID == nameid && rec->stringLength > 0 )
+      {
+        switch ( rec->platformID )
+        {
+        case TT_PLATFORM_APPLE_UNICODE:
+        case TT_PLATFORM_ISO:
+          /* there is `languageID' to check there.  We should use this */
+          /* field only as a last solution when nothing else is        */
+          /* available.                                                */
+          /*                                                           */
+          found_unicode = n;
+          break;
+
+        case TT_PLATFORM_MACINTOSH:
+          /* This is a bit special because some fonts will use either    */
+          /* an English language id, or a Roman encoding id, to indicate */
+          /* the English version of its font name.                       */
+          /*                                                             */
+          if ( rec->languageID == TT_MAC_LANGID_ENGLISH )
+            found_apple_english = n;
+          else if ( rec->encodingID == TT_MAC_ID_ROMAN )
+            found_apple_roman = n;
+          break;
+
+        case TT_PLATFORM_MICROSOFT:
+          /* we only take a non-English name when there is nothing */
+          /* else available in the font                            */
+          /*                                                       */
+          if ( found_win == -1 || ( rec->languageID & 0x3FF ) == 0x009 )
+          {
+            switch ( rec->encodingID )
+            {
+            case TT_MS_ID_SYMBOL_CS:
+            case TT_MS_ID_UNICODE_CS:
+            case TT_MS_ID_UCS_4:
+              is_english = FT_BOOL( ( rec->languageID & 0x3FF ) == 0x009 );
+              found_win  = n;
+              break;
+
+            default:
+              ;
+            }
+          }
+          break;
+
+        default:
+          ;
+        }
+      }
+    }
+
+    found_apple = found_apple_roman;
+    if ( found_apple_english >= 0 )
+      found_apple = found_apple_english;
+
+    /* some fonts contain invalid Unicode or Macintosh formatted entries; */
+    /* we will thus favor names encoded in Windows formats if available   */
+    /* (provided it is an English name)                                   */
+    /*                                                                    */
+    convert = NULL;
+    if ( found_win >= 0 && !( found_apple >= 0 && !is_english ) )
+    {
+      rec = face->name_table.names + found_win;
+      switch ( rec->encodingID )
+      {
+        /* all Unicode strings are encoded using UTF-16BE */
+      case TT_MS_ID_UNICODE_CS:
+      case TT_MS_ID_SYMBOL_CS:
+        convert = tt_name_entry_ascii_from_utf16;
+        break;
+
+      case TT_MS_ID_UCS_4:
+        /* Apparently, if this value is found in a name table entry, it is */
+        /* documented as `full Unicode repertoire'.  Experience with the   */
+        /* MsGothic font shipped with Windows Vista shows that this really */
+        /* means UTF-16 encoded names (UCS-4 values are only used within   */
+        /* charmaps).                                                      */
+        convert = tt_name_entry_ascii_from_utf16;
+        break;
+
+      default:
+        ;
+      }
+    }
+    else if ( found_apple >= 0 )
+    {
+      rec     = face->name_table.names + found_apple;
+      convert = tt_name_entry_ascii_from_other;
+    }
+    else if ( found_unicode >= 0 )
+    {
+      rec     = face->name_table.names + found_unicode;
+      convert = tt_name_entry_ascii_from_utf16;
+    }
+
+    if ( rec && convert )
+    {
+      if ( rec->string == NULL )
+      {
+        FT_Stream  stream = face->name_table.stream;
+
+
+        if ( FT_QNEW_ARRAY ( rec->string, rec->stringLength ) ||
+             FT_STREAM_SEEK( rec->stringOffset )              ||
+             FT_STREAM_READ( rec->string, rec->stringLength ) )
+        {
+          FT_FREE( rec->string );
+          rec->stringLength = 0;
+          result            = NULL;
+          goto Exit;
+        }
+      }
+
+      result = convert( rec, memory );
+    }
+
+  Exit:
+    *name = result;
+    return error;
+  }
+
+
+  static FT_Encoding
+  sfnt_find_encoding( int  platform_id,
+                      int  encoding_id )
+  {
+    typedef struct  TEncoding_
+    {
+      int          platform_id;
+      int          encoding_id;
+      FT_Encoding  encoding;
+
+    } TEncoding;
+
+    static
+    const TEncoding  tt_encodings[] =
+    {
+      { TT_PLATFORM_ISO,           -1,                  FT_ENCODING_UNICODE },
+
+      { TT_PLATFORM_APPLE_UNICODE, -1,                  FT_ENCODING_UNICODE },
+
+      { TT_PLATFORM_MACINTOSH,     TT_MAC_ID_ROMAN,     FT_ENCODING_APPLE_ROMAN },
+
+      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_SYMBOL_CS,  FT_ENCODING_MS_SYMBOL },
+      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_UCS_4,      FT_ENCODING_UNICODE },
+      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_UNICODE_CS, FT_ENCODING_UNICODE },
+      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_SJIS,       FT_ENCODING_SJIS },
+      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_GB2312,     FT_ENCODING_GB2312 },
+      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_BIG_5,      FT_ENCODING_BIG5 },
+      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_WANSUNG,    FT_ENCODING_WANSUNG },
+      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_JOHAB,      FT_ENCODING_JOHAB }
+    };
+
+    const TEncoding  *cur, *limit;
+
+
+    cur   = tt_encodings;
+    limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] );
+
+    for ( ; cur < limit; cur++ )
+    {
+      if ( cur->platform_id == platform_id )
+      {
+        if ( cur->encoding_id == encoding_id ||
+             cur->encoding_id == -1          )
+          return cur->encoding;
+      }
+    }
+
+    return FT_ENCODING_NONE;
+  }
+
+
+  /* Fill in face->ttc_header.  If the font is not a TTC, it is */
+  /* synthesized into a TTC with one offset table.              */
+  static FT_Error
+  sfnt_open_font( FT_Stream  stream,
+                  TT_Face    face )
+  {
+    FT_Memory  memory = stream->memory;
+    FT_Error   error;
+    FT_ULong   tag, offset;
+
+    static const FT_Frame_Field  ttc_header_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TTC_HeaderRec
+
+      FT_FRAME_START( 8 ),
+        FT_FRAME_LONG( version ),
+        FT_FRAME_LONG( count   ),  /* this is ULong in the specs */
+      FT_FRAME_END
+    };
+
+
+    face->ttc_header.tag     = 0;
+    face->ttc_header.version = 0;
+    face->ttc_header.count   = 0;
+
+    offset = FT_STREAM_POS();
+
+    if ( FT_READ_ULONG( tag ) )
+      return error;
+
+    if ( tag != 0x00010000UL &&
+         tag != TTAG_ttcf    &&
+         tag != TTAG_OTTO    &&
+         tag != TTAG_true    &&
+         tag != TTAG_typ1    &&
+         tag != 0x00020000UL )
+    {
+      FT_TRACE2(( "  not a font using the SFNT container format\n" ));
+      return SFNT_Err_Unknown_File_Format;
+    }
+
+    face->ttc_header.tag = TTAG_ttcf;
+
+    if ( tag == TTAG_ttcf )
+    {
+      FT_Int  n;
+
+
+      FT_TRACE3(( "sfnt_open_font: file is a collection\n" ));
+
+      if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) )
+        return error;
+
+      if ( face->ttc_header.count == 0 )
+        return SFNT_Err_Invalid_Table;
+
+      /* a rough size estimate: let's conservatively assume that there   */
+      /* is just a single table info in each subfont header (12 + 16*1 = */
+      /* 28 bytes), thus we have (at least) `12 + 4*count' bytes for the */
+      /* size of the TTC header plus `28*count' bytes for all subfont    */
+      /* headers                                                         */
+      if ( (FT_ULong)face->ttc_header.count > stream->size / ( 28 + 4 ) )
+        return SFNT_Err_Array_Too_Large;
+
+      /* now read the offsets of each font in the file */
+      if ( FT_NEW_ARRAY( face->ttc_header.offsets, face->ttc_header.count ) )
+        return error;
+
+      if ( FT_FRAME_ENTER( face->ttc_header.count * 4L ) )
+        return error;
+
+      for ( n = 0; n < face->ttc_header.count; n++ )
+        face->ttc_header.offsets[n] = FT_GET_ULONG();
+
+      FT_FRAME_EXIT();
+    }
+    else
+    {
+      FT_TRACE3(( "sfnt_open_font: synthesize TTC\n" ));
+
+      face->ttc_header.version = 1 << 16;
+      face->ttc_header.count   = 1;
+
+      if ( FT_NEW( face->ttc_header.offsets ) )
+        return error;
+
+      face->ttc_header.offsets[0] = offset;
+    }
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  sfnt_init_face( FT_Stream      stream,
+                  TT_Face        face,
+                  FT_Int         face_index,
+                  FT_Int         num_params,
+                  FT_Parameter*  params )
+  {
+    FT_Error        error;
+    FT_Library      library = face->root.driver->root.library;
+    SFNT_Service    sfnt;
+
+
+    /* for now, parameters are unused */
+    FT_UNUSED( num_params );
+    FT_UNUSED( params );
+
+
+    sfnt = (SFNT_Service)face->sfnt;
+    if ( !sfnt )
+    {
+      sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" );
+      if ( !sfnt )
+      {
+        FT_ERROR(( "sfnt_init_face: cannot access `sfnt' module\n" ));
+        return SFNT_Err_Missing_Module;
+      }
+
+      face->sfnt       = sfnt;
+      face->goto_table = sfnt->goto_table;
+    }
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS );
+
+    FT_TRACE2(( "SFNT driver\n" ));
+
+    error = sfnt_open_font( stream, face );
+    if ( error )
+      return error;
+
+    FT_TRACE2(( "sfnt_init_face: %08p, %ld\n", face, face_index ));
+
+    if ( face_index < 0 )
+      face_index = 0;
+
+    if ( face_index >= face->ttc_header.count )
+      return SFNT_Err_Invalid_Argument;
+
+    if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) )
+      return error;
+
+    /* check that we have a valid TrueType file */
+    error = sfnt->load_font_dir( face, stream );
+    if ( error )
+      return error;
+
+    face->root.num_faces  = face->ttc_header.count;
+    face->root.face_index = face_index;
+
+    return error;
+  }
+
+
+#define LOAD_( x )                                            \
+  do {                                                        \
+    FT_TRACE2(( "`" #x "' " ));                               \
+    FT_TRACE3(( "-->\n" ));                                   \
+                                                              \
+    error = sfnt->load_##x( face, stream );                   \
+                                                              \
+    FT_TRACE2(( "%s\n", ( !error )                            \
+                        ? "loaded"                            \
+                        : ( error == SFNT_Err_Table_Missing ) \
+                          ? "missing"                         \
+                          : "failed to load" ));              \
+    FT_TRACE3(( "\n" ));                                      \
+  } while ( 0 )
+
+#define LOADM_( x, vertical )                                 \
+  do {                                                        \
+    FT_TRACE2(( "`%s" #x "' ",                                \
+                vertical ? "vertical " : "" ));               \
+    FT_TRACE3(( "-->\n" ));                                   \
+                                                              \
+    error = sfnt->load_##x( face, stream, vertical );         \
+                                                              \
+    FT_TRACE2(( "%s\n", ( !error )                            \
+                        ? "loaded"                            \
+                        : ( error == SFNT_Err_Table_Missing ) \
+                          ? "missing"                         \
+                          : "failed to load" ));              \
+    FT_TRACE3(( "\n" ));                                      \
+  } while ( 0 )
+
+#define GET_NAME( id, field )                                 \
+  do {                                                        \
+    error = tt_face_get_name( face, TT_NAME_ID_##id, field ); \
+    if ( error )                                              \
+      goto Exit;                                              \
+  } while ( 0 )
+
+
+  FT_LOCAL_DEF( FT_Error )
+  sfnt_load_face( FT_Stream      stream,
+                  TT_Face        face,
+                  FT_Int         face_index,
+                  FT_Int         num_params,
+                  FT_Parameter*  params )
+  {
+    FT_Error      error;
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+    FT_Error      psnames_error;
+#endif
+    FT_Bool       has_outline;
+    FT_Bool       is_apple_sbit;
+    FT_Bool       ignore_preferred_family = FALSE;
+    FT_Bool       ignore_preferred_subfamily = FALSE;
+
+    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
+
+    FT_UNUSED( face_index );
+
+    /* Check parameters */
+
+    {
+      FT_Int  i;
+
+
+      for ( i = 0; i < num_params; i++ )
+      {
+        if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY )
+          ignore_preferred_family = TRUE;
+        else if ( params[i].tag == FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY )
+          ignore_preferred_subfamily = TRUE;
+      }
+    }
+
+    /* Load tables */
+
+    /* We now support two SFNT-based bitmapped font formats.  They */
+    /* are recognized easily as they do not include a `glyf'       */
+    /* table.                                                      */
+    /*                                                             */
+    /* The first format comes from Apple, and uses a table named   */
+    /* `bhed' instead of `head' to store the font header (using    */
+    /* the same format).  It also doesn't include horizontal and   */
+    /* vertical metrics tables (i.e. `hhea' and `vhea' tables are  */
+    /* missing).                                                   */
+    /*                                                             */
+    /* The other format comes from Microsoft, and is used with     */
+    /* WinCE/PocketPC.  It looks like a standard TTF, except that  */
+    /* it doesn't contain outlines.                                */
+    /*                                                             */
+
+    FT_TRACE2(( "sfnt_load_face: %08p\n\n", face ));
+
+    /* do we have outlines in there? */
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    has_outline = FT_BOOL( face->root.internal->incremental_interface != 0 ||
+                           tt_face_lookup_table( face, TTAG_glyf )    != 0 ||
+                           tt_face_lookup_table( face, TTAG_CFF )     != 0 );
+#else
+    has_outline = FT_BOOL( tt_face_lookup_table( face, TTAG_glyf ) != 0 ||
+                           tt_face_lookup_table( face, TTAG_CFF )  != 0 );
+#endif
+
+    is_apple_sbit = 0;
+
+    /* if this font doesn't contain outlines, we try to load */
+    /* a `bhed' table                                        */
+    if ( !has_outline && sfnt->load_bhed )
+    {
+      LOAD_( bhed );
+      is_apple_sbit = FT_BOOL( !error );
+    }
+
+    /* load the font header (`head' table) if this isn't an Apple */
+    /* sbit font file                                             */
+    if ( !is_apple_sbit )
+    {
+      LOAD_( head );
+      if ( error )
+        goto Exit;
+    }
+
+    if ( face->header.Units_Per_EM == 0 )
+    {
+      error = SFNT_Err_Invalid_Table;
+
+      goto Exit;
+    }
+
+    /* the following tables are often not present in embedded TrueType */
+    /* fonts within PDF documents, so don't check for them.            */
+    LOAD_( maxp );
+    LOAD_( cmap );
+
+    /* the following tables are optional in PCL fonts -- */
+    /* don't check for errors                            */
+    LOAD_( name );
+    LOAD_( post );
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+    psnames_error = error;
+#endif
+
+    /* do not load the metrics headers and tables if this is an Apple */
+    /* sbit font file                                                 */
+    if ( !is_apple_sbit )
+    {
+      /* load the `hhea' and `hmtx' tables */
+      LOADM_( hhea, 0 );
+      if ( !error )
+      {
+        LOADM_( hmtx, 0 );
+        if ( error == SFNT_Err_Table_Missing )
+        {
+          error = SFNT_Err_Hmtx_Table_Missing;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+          /* If this is an incrementally loaded font and there are */
+          /* overriding metrics, tolerate a missing `hmtx' table.  */
+          if ( face->root.internal->incremental_interface          &&
+               face->root.internal->incremental_interface->funcs->
+                 get_glyph_metrics                                 )
+          {
+            face->horizontal.number_Of_HMetrics = 0;
+            error = SFNT_Err_Ok;
+          }
+#endif
+        }
+      }
+      else if ( error == SFNT_Err_Table_Missing )
+      {
+        /* No `hhea' table necessary for SFNT Mac fonts. */
+        if ( face->format_tag == TTAG_true )
+        {
+          FT_TRACE2(( "This is an SFNT Mac font.\n" ));
+
+          has_outline = 0;
+          error       = SFNT_Err_Ok;
+        }
+        else
+        {
+          error = SFNT_Err_Horiz_Header_Missing;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+          /* If this is an incrementally loaded font and there are */
+          /* overriding metrics, tolerate a missing `hhea' table.  */
+          if ( face->root.internal->incremental_interface          &&
+               face->root.internal->incremental_interface->funcs->
+                 get_glyph_metrics                                 )
+          {
+            face->horizontal.number_Of_HMetrics = 0;
+            error = SFNT_Err_Ok;
+          }
+#endif
+
+        }
+      }
+
+      if ( error )
+        goto Exit;
+
+      /* try to load the `vhea' and `vmtx' tables */
+      LOADM_( hhea, 1 );
+      if ( !error )
+      {
+        LOADM_( hmtx, 1 );
+        if ( !error )
+          face->vertical_info = 1;
+      }
+
+      if ( error && error != SFNT_Err_Table_Missing )
+        goto Exit;
+
+      LOAD_( os2 );
+      if ( error )
+      {
+        /* we treat the table as missing if there are any errors */
+        face->os2.version = 0xFFFFU;
+      }
+    }
+
+    /* the optional tables */
+
+    /* embedded bitmap support */
+    if ( sfnt->load_eblc )
+    {
+      LOAD_( eblc );
+      if ( error )
+      {
+        /* a font which contains neither bitmaps nor outlines is */
+        /* still valid (although rather useless in most cases);  */
+        /* however, you can find such stripped fonts in PDFs     */
+        if ( error == SFNT_Err_Table_Missing )
+          error = SFNT_Err_Ok;
+        else
+          goto Exit;
+      }
+    }
+
+    LOAD_( pclt );
+    if ( error )
+    {
+      if ( error != SFNT_Err_Table_Missing )
+        goto Exit;
+
+      face->pclt.Version = 0;
+    }
+
+    /* consider the kerning and gasp tables as optional */
+    LOAD_( gasp );
+    LOAD_( kern );
+
+    face->root.num_glyphs = face->max_profile.numGlyphs;
+
+    /* Bit 8 of the `fsSelection' field in the `OS/2' table denotes  */
+    /* a WWS-only font face.  `WWS' stands for `weight', width', and */
+    /* `slope', a term used by Microsoft's Windows Presentation      */
+    /* Foundation (WPF).  This flag has been introduced in version   */
+    /* 1.5 of the OpenType specification (May 2008).                 */
+
+    face->root.family_name = NULL;
+    face->root.style_name  = NULL;
+    if ( face->os2.version != 0xFFFFU && face->os2.fsSelection & 256 )
+    {
+      if ( !ignore_preferred_family )
+        GET_NAME( PREFERRED_FAMILY, &face->root.family_name );
+      if ( !face->root.family_name )
+        GET_NAME( FONT_FAMILY, &face->root.family_name );
+
+      if ( !ignore_preferred_subfamily )
+        GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name );
+      if ( !face->root.style_name )
+        GET_NAME( FONT_SUBFAMILY, &face->root.style_name );
+    }
+    else
+    {
+      GET_NAME( WWS_FAMILY, &face->root.family_name );
+      if ( !face->root.family_name && !ignore_preferred_family )
+        GET_NAME( PREFERRED_FAMILY, &face->root.family_name );
+      if ( !face->root.family_name )
+        GET_NAME( FONT_FAMILY, &face->root.family_name );
+
+      GET_NAME( WWS_SUBFAMILY, &face->root.style_name );
+      if ( !face->root.style_name && !ignore_preferred_subfamily )
+        GET_NAME( PREFERRED_SUBFAMILY, &face->root.style_name );
+      if ( !face->root.style_name )
+        GET_NAME( FONT_SUBFAMILY, &face->root.style_name );
+    }
+
+    /* now set up root fields */
+    {
+      FT_Face  root  = &face->root;
+      FT_Long  flags = root->face_flags;
+
+
+      /*********************************************************************/
+      /*                                                                   */
+      /* Compute face flags.                                               */
+      /*                                                                   */
+      if ( has_outline == TRUE )
+        flags |= FT_FACE_FLAG_SCALABLE;   /* scalable outlines */
+
+      /* The sfnt driver only supports bitmap fonts natively, thus we */
+      /* don't set FT_FACE_FLAG_HINTER.                               */
+      flags |= FT_FACE_FLAG_SFNT       |  /* SFNT file format  */
+               FT_FACE_FLAG_HORIZONTAL;   /* horizontal data   */
+
+#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
+      if ( psnames_error == SFNT_Err_Ok               &&
+           face->postscript.FormatType != 0x00030000L )
+        flags |= FT_FACE_FLAG_GLYPH_NAMES;
+#endif
+
+      /* fixed width font? */
+      if ( face->postscript.isFixedPitch )
+        flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+      /* vertical information? */
+      if ( face->vertical_info )
+        flags |= FT_FACE_FLAG_VERTICAL;
+
+      /* kerning available ? */
+      if ( TT_FACE_HAS_KERNING( face ) )
+        flags |= FT_FACE_FLAG_KERNING;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+      /* Don't bother to load the tables unless somebody asks for them. */
+      /* No need to do work which will (probably) not be used.          */
+      if ( tt_face_lookup_table( face, TTAG_glyf ) != 0 &&
+           tt_face_lookup_table( face, TTAG_fvar ) != 0 &&
+           tt_face_lookup_table( face, TTAG_gvar ) != 0 )
+        flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
+#endif
+
+      root->face_flags = flags;
+
+      /*********************************************************************/
+      /*                                                                   */
+      /* Compute style flags.                                              */
+      /*                                                                   */
+
+      flags = 0;
+      if ( has_outline == TRUE && face->os2.version != 0xFFFFU )
+      {
+        /* We have an OS/2 table; use the `fsSelection' field.  Bit 9 */
+        /* indicates an oblique font face.  This flag has been        */
+        /* introduced in version 1.5 of the OpenType specification.   */
+
+        if ( face->os2.fsSelection & 512 )       /* bit 9 */
+          flags |= FT_STYLE_FLAG_ITALIC;
+        else if ( face->os2.fsSelection & 1 )    /* bit 0 */
+          flags |= FT_STYLE_FLAG_ITALIC;
+
+        if ( face->os2.fsSelection & 32 )        /* bit 5 */
+          flags |= FT_STYLE_FLAG_BOLD;
+      }
+      else
+      {
+        /* this is an old Mac font, use the header field */
+
+        if ( face->header.Mac_Style & 1 )
+          flags |= FT_STYLE_FLAG_BOLD;
+
+        if ( face->header.Mac_Style & 2 )
+          flags |= FT_STYLE_FLAG_ITALIC;
+      }
+
+      root->style_flags = flags;
+
+      /*********************************************************************/
+      /*                                                                   */
+      /* Polish the charmaps.                                              */
+      /*                                                                   */
+      /*   Try to set the charmap encoding according to the platform &     */
+      /*   encoding ID of each charmap.                                    */
+      /*                                                                   */
+
+      tt_face_build_cmaps( face );  /* ignore errors */
+
+
+      /* set the encoding fields */
+      {
+        FT_Int  m;
+
+
+        for ( m = 0; m < root->num_charmaps; m++ )
+        {
+          FT_CharMap  charmap = root->charmaps[m];
+
+
+          charmap->encoding = sfnt_find_encoding( charmap->platform_id,
+                                                  charmap->encoding_id );
+
+#if 0
+          if ( root->charmap     == NULL &&
+               charmap->encoding == FT_ENCODING_UNICODE )
+          {
+            /* set 'root->charmap' to the first Unicode encoding we find */
+            root->charmap = charmap;
+          }
+#endif
+        }
+      }
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+      /*
+       *  Now allocate the root array of FT_Bitmap_Size records and
+       *  populate them.  Unfortunately, it isn't possible to indicate bit
+       *  depths in the FT_Bitmap_Size record.  This is a design error.
+       */
+      {
+        FT_UInt  i, count;
+
+
+#ifndef FT_CONFIG_OPTION_OLD_INTERNALS
+        count = face->sbit_num_strikes;
+#else
+        count = (FT_UInt)face->num_sbit_strikes;
+#endif
+
+        if ( count > 0 )
+        {
+          FT_Memory        memory   = face->root.stream->memory;
+          FT_UShort        em_size  = face->header.Units_Per_EM;
+          FT_Short         avgwidth = face->os2.xAvgCharWidth;
+          FT_Size_Metrics  metrics;
+
+
+          if ( em_size == 0 || face->os2.version == 0xFFFFU )
+          {
+            avgwidth = 0;
+            em_size = 1;
+          }
+
+          if ( FT_NEW_ARRAY( root->available_sizes, count ) )
+            goto Exit;
+
+          for ( i = 0; i < count; i++ )
+          {
+            FT_Bitmap_Size*  bsize = root->available_sizes + i;
+
+
+            error = sfnt->load_strike_metrics( face, i, &metrics );
+            if ( error )
+              goto Exit;
+
+            bsize->height = (FT_Short)( metrics.height >> 6 );
+            bsize->width = (FT_Short)(
+                ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size );
+
+            bsize->x_ppem = metrics.x_ppem << 6;
+            bsize->y_ppem = metrics.y_ppem << 6;
+
+            /* assume 72dpi */
+            bsize->size   = metrics.y_ppem << 6;
+          }
+
+          root->face_flags     |= FT_FACE_FLAG_FIXED_SIZES;
+          root->num_fixed_sizes = (FT_Int)count;
+        }
+      }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+      /* a font with no bitmaps and no outlines is scalable; */
+      /* it has only empty glyphs then                       */
+      if ( !FT_HAS_FIXED_SIZES( root ) && !FT_IS_SCALABLE( root ) )
+        root->face_flags |= FT_FACE_FLAG_SCALABLE;
+
+
+      /*********************************************************************/
+      /*                                                                   */
+      /*  Set up metrics.                                                  */
+      /*                                                                   */
+      if ( FT_IS_SCALABLE( root ) )
+      {
+        /* XXX What about if outline header is missing */
+        /*     (e.g. sfnt wrapped bitmap)?             */
+        root->bbox.xMin    = face->header.xMin;
+        root->bbox.yMin    = face->header.yMin;
+        root->bbox.xMax    = face->header.xMax;
+        root->bbox.yMax    = face->header.yMax;
+        root->units_per_EM = face->header.Units_Per_EM;
+
+
+        /* XXX: Computing the ascender/descender/height is very different */
+        /*      from what the specification tells you.  Apparently, we    */
+        /*      must be careful because                                   */
+        /*                                                                */
+        /*      - not all fonts have an OS/2 table; in this case, we take */
+        /*        the values in the horizontal header.  However, these    */
+        /*        values very often are not reliable.                     */
+        /*                                                                */
+        /*      - otherwise, the correct typographic values are in the    */
+        /*        sTypoAscender, sTypoDescender & sTypoLineGap fields.    */
+        /*                                                                */
+        /*        However, certain fonts have these fields set to 0.      */
+        /*        Rather, they have usWinAscent & usWinDescent correctly  */
+        /*        set (but with different values).                        */
+        /*                                                                */
+        /*      As an example, Arial Narrow is implemented through four   */
+        /*      files ARIALN.TTF, ARIALNI.TTF, ARIALNB.TTF & ARIALNBI.TTF */
+        /*                                                                */
+        /*      Strangely, all fonts have the same values in their        */
+        /*      sTypoXXX fields, except ARIALNB which sets them to 0.     */
+        /*                                                                */
+        /*      On the other hand, they all have different                */
+        /*      usWinAscent/Descent values -- as a conclusion, the OS/2   */
+        /*      table cannot be used to compute the text height reliably! */
+        /*                                                                */
+
+        /* The ascender and descender are taken from the `hhea' table. */
+        /* If zero, they are taken from the `OS/2' table.              */
+
+        root->ascender  = face->horizontal.Ascender;
+        root->descender = face->horizontal.Descender;
+
+        root->height = (FT_Short)( root->ascender - root->descender +
+                                   face->horizontal.Line_Gap );
+
+        if ( !( root->ascender || root->descender ) )
+        {
+          if ( face->os2.version != 0xFFFFU )
+          {
+            if ( face->os2.sTypoAscender || face->os2.sTypoDescender )
+            {
+              root->ascender  = face->os2.sTypoAscender;
+              root->descender = face->os2.sTypoDescender;
+
+              root->height = (FT_Short)( root->ascender - root->descender +
+                                         face->os2.sTypoLineGap );
+            }
+            else
+            {
+              root->ascender  =  (FT_Short)face->os2.usWinAscent;
+              root->descender = -(FT_Short)face->os2.usWinDescent;
+
+              root->height = (FT_UShort)( root->ascender - root->descender );
+            }
+          }
+        }
+
+        root->max_advance_width  = face->horizontal.advance_Width_Max;
+        root->max_advance_height = (FT_Short)( face->vertical_info
+                                     ? face->vertical.advance_Height_Max
+                                     : root->height );
+
+        /* See http://www.microsoft.com/OpenType/OTSpec/post.htm -- */
+        /* Adjust underline position from top edge to centre of     */
+        /* stroke to convert TrueType meaning to FreeType meaning.  */
+        root->underline_position  = face->postscript.underlinePosition -
+                                    face->postscript.underlineThickness / 2;
+        root->underline_thickness = face->postscript.underlineThickness;
+      }
+
+    }
+
+  Exit:
+    FT_TRACE2(( "sfnt_load_face: done\n" ));
+
+    return error;
+  }
+
+
+#undef LOAD_
+#undef LOADM_
+#undef GET_NAME
+
+
+  FT_LOCAL_DEF( void )
+  sfnt_done_face( TT_Face  face )
+  {
+    FT_Memory     memory;
+    SFNT_Service  sfnt;
+
+
+    if ( !face )
+      return;
+
+    memory = face->root.memory;
+    sfnt   = (SFNT_Service)face->sfnt;
+
+    if ( sfnt )
+    {
+      /* destroy the postscript names table if it is loaded */
+      if ( sfnt->free_psnames )
+        sfnt->free_psnames( face );
+
+      /* destroy the embedded bitmaps table if it is loaded */
+      if ( sfnt->free_eblc )
+        sfnt->free_eblc( face );
+    }
+
+#ifdef TT_CONFIG_OPTION_BDF
+    /* freeing the embedded BDF properties */
+    tt_face_free_bdf_props( face );
+#endif
+
+    /* freeing the kerning table */
+    tt_face_done_kern( face );
+
+    /* freeing the collection table */
+    FT_FREE( face->ttc_header.offsets );
+    face->ttc_header.count = 0;
+
+    /* freeing table directory */
+    FT_FREE( face->dir_tables );
+    face->num_tables = 0;
+
+    {
+      FT_Stream  stream = FT_FACE_STREAM( face );
+
+
+      /* simply release the 'cmap' table frame */
+      FT_FRAME_RELEASE( face->cmap_table );
+      face->cmap_size = 0;
+    }
+
+    /* freeing the horizontal metrics */
+#ifndef FT_CONFIG_OPTION_OLD_INTERNALS
+    {
+      FT_Stream  stream = FT_FACE_STREAM( face );
+
+
+      FT_FRAME_RELEASE( face->horz_metrics );
+      FT_FRAME_RELEASE( face->vert_metrics );
+      face->horz_metrics_size = 0;
+      face->vert_metrics_size = 0;
+    }
+#else
+    FT_FREE( face->horizontal.long_metrics );
+    FT_FREE( face->horizontal.short_metrics );
+#endif
+
+    /* freeing the vertical ones, if any */
+    if ( face->vertical_info )
+    {
+      FT_FREE( face->vertical.long_metrics  );
+      FT_FREE( face->vertical.short_metrics );
+      face->vertical_info = 0;
+    }
+
+    /* freeing the gasp table */
+    FT_FREE( face->gasp.gaspRanges );
+    face->gasp.numRanges = 0;
+
+    /* freeing the name table */
+    if ( sfnt )
+      sfnt->free_name( face );
+
+    /* freeing family and style name */
+    FT_FREE( face->root.family_name );
+    FT_FREE( face->root.style_name );
+
+    /* freeing sbit size table */
+    FT_FREE( face->root.available_sizes );
+    face->root.num_fixed_sizes = 0;
+
+    FT_FREE( face->postscript_name );
+
+    face->sfnt = 0;
+  }
+
+
+/* END */
diff --git a/src/sfnt/sfobjs.h b/src/sfnt/sfobjs.h
new file mode 100644 (file)
index 0000000..6241c93
--- /dev/null
@@ -0,0 +1,54 @@
+/***************************************************************************/
+/*                                                                         */
+/*  sfobjs.h                                                               */
+/*                                                                         */
+/*    SFNT object management (specification).                              */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __SFOBJS_H__
+#define __SFOBJS_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_SFNT_H
+#include FT_INTERNAL_OBJECTS_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error )
+  sfnt_init_face( FT_Stream      stream,
+                  TT_Face        face,
+                  FT_Int         face_index,
+                  FT_Int         num_params,
+                  FT_Parameter*  params );
+
+  FT_LOCAL( FT_Error )
+  sfnt_load_face( FT_Stream      stream,
+                  TT_Face        face,
+                  FT_Int         face_index,
+                  FT_Int         num_params,
+                  FT_Parameter*  params );
+
+  FT_LOCAL( void )
+  sfnt_done_face( TT_Face  face );
+
+
+FT_END_HEADER
+
+#endif /* __SFDRIVER_H__ */
+
+
+/* END */
diff --git a/src/sfnt/ttbdf.c b/src/sfnt/ttbdf.c
new file mode 100644 (file)
index 0000000..18845c3
--- /dev/null
@@ -0,0 +1,250 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttbdf.c                                                                */
+/*                                                                         */
+/*    TrueType and OpenType embedded BDF properties (body).                */
+/*                                                                         */
+/*  Copyright 2005, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_TRUETYPE_TAGS_H
+#include "ttbdf.h"
+
+#include "sferrors.h"
+
+
+#ifdef TT_CONFIG_OPTION_BDF
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttbdf
+
+
+  FT_LOCAL_DEF( void )
+  tt_face_free_bdf_props( TT_Face  face )
+  {
+    TT_BDF  bdf = &face->bdf;
+
+
+    if ( bdf->loaded )
+    {
+      FT_Stream  stream = FT_FACE(face)->stream;
+
+
+      if ( bdf->table != NULL )
+        FT_FRAME_RELEASE( bdf->table );
+
+      bdf->table_end    = NULL;
+      bdf->strings      = NULL;
+      bdf->strings_size = 0;
+    }
+  }
+
+
+  static FT_Error
+  tt_face_load_bdf_props( TT_Face    face,
+                          FT_Stream  stream )
+  {
+    TT_BDF    bdf = &face->bdf;
+    FT_ULong  length;
+    FT_Error  error;
+
+
+    FT_ZERO( bdf );
+
+    error = tt_face_goto_table( face, TTAG_BDF, stream, &length );
+    if ( error                                  ||
+         length < 8                             ||
+         FT_FRAME_EXTRACT( length, bdf->table ) )
+    {
+      error = SFNT_Err_Invalid_Table;
+      goto Exit;
+    }
+
+    bdf->table_end = bdf->table + length;
+
+    {
+      FT_Byte*   p           = bdf->table;
+      FT_UInt    version     = FT_NEXT_USHORT( p );
+      FT_UInt    num_strikes = FT_NEXT_USHORT( p );
+      FT_ULong   strings     = FT_NEXT_ULONG ( p );
+      FT_UInt    count;
+      FT_Byte*   strike;
+
+
+      if ( version != 0x0001                 ||
+           strings < 8                       ||
+           ( strings - 8 ) / 4 < num_strikes ||
+           strings + 1 > length              )
+      {
+        goto BadTable;
+      }
+
+      bdf->num_strikes  = num_strikes;
+      bdf->strings      = bdf->table + strings;
+      bdf->strings_size = length - strings;
+
+      count  = bdf->num_strikes;
+      p      = bdf->table + 8;
+      strike = p + count * 4;
+
+
+      for ( ; count > 0; count-- )
+      {
+        FT_UInt  num_items = FT_PEEK_USHORT( p + 2 );
+
+        /*
+         *  We don't need to check the value sets themselves, since this
+         *  is done later.
+         */
+        strike += 10 * num_items;
+
+        p += 4;
+      }
+
+      if ( strike > bdf->strings )
+        goto BadTable;
+    }
+
+    bdf->loaded = 1;
+
+  Exit:
+    return error;
+
+  BadTable:
+    FT_FRAME_RELEASE( bdf->table );
+    FT_ZERO( bdf );
+    error = SFNT_Err_Invalid_Table;
+    goto Exit;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_find_bdf_prop( TT_Face           face,
+                         const char*       property_name,
+                         BDF_PropertyRec  *aprop )
+  {
+    TT_BDF     bdf   = &face->bdf;
+    FT_Size    size  = FT_FACE(face)->size;
+    FT_Error   error = SFNT_Err_Ok;
+    FT_Byte*   p;
+    FT_UInt    count;
+    FT_Byte*   strike;
+    FT_Offset  property_len;
+
+
+    aprop->type = BDF_PROPERTY_TYPE_NONE;
+
+    if ( bdf->loaded == 0 )
+    {
+      error = tt_face_load_bdf_props( face, FT_FACE( face )->stream );
+      if ( error )
+        goto Exit;
+    }
+
+    count  = bdf->num_strikes;
+    p      = bdf->table + 8;
+    strike = p + 4 * count;
+
+    error = SFNT_Err_Invalid_Argument;
+
+    if ( size == NULL || property_name == NULL )
+      goto Exit;
+
+    property_len = ft_strlen( property_name );
+    if ( property_len == 0 )
+      goto Exit;
+
+    for ( ; count > 0; count-- )
+    {
+      FT_UInt  _ppem  = FT_NEXT_USHORT( p );
+      FT_UInt  _count = FT_NEXT_USHORT( p );
+
+      if ( _ppem == size->metrics.y_ppem )
+      {
+        count = _count;
+        goto FoundStrike;
+      }
+
+      strike += 10 * _count;
+    }
+    goto Exit;
+
+  FoundStrike:
+    p = strike;
+    for ( ; count > 0; count-- )
+    {
+      FT_UInt  type = FT_PEEK_USHORT( p + 4 );
+
+      if ( ( type & 0x10 ) != 0 )
+      {
+        FT_UInt32  name_offset = FT_PEEK_ULONG( p     );
+        FT_UInt32  value       = FT_PEEK_ULONG( p + 6 );
+
+        /* be a bit paranoid for invalid entries here */
+        if ( name_offset < bdf->strings_size                    &&
+             property_len < bdf->strings_size - name_offset     &&
+             ft_strncmp( property_name,
+                         (const char*)bdf->strings + name_offset,
+                         bdf->strings_size - name_offset ) == 0 )
+        {
+          switch ( type & 0x0F )
+          {
+          case 0x00:  /* string */
+          case 0x01:  /* atoms */
+            /* check that the content is really 0-terminated */
+            if ( value < bdf->strings_size &&
+                 ft_memchr( bdf->strings + value, 0, bdf->strings_size ) )
+            {
+              aprop->type   = BDF_PROPERTY_TYPE_ATOM;
+              aprop->u.atom = (const char*)bdf->strings + value;
+              error         = SFNT_Err_Ok;
+              goto Exit;
+            }
+            break;
+
+          case 0x02:
+            aprop->type      = BDF_PROPERTY_TYPE_INTEGER;
+            aprop->u.integer = (FT_Int32)value;
+            error            = SFNT_Err_Ok;
+            goto Exit;
+
+          case 0x03:
+            aprop->type       = BDF_PROPERTY_TYPE_CARDINAL;
+            aprop->u.cardinal = value;
+            error             = SFNT_Err_Ok;
+            goto Exit;
+
+          default:
+            ;
+          }
+        }
+      }
+      p += 10;
+    }
+
+  Exit:
+    return error;
+  }
+
+#endif /* TT_CONFIG_OPTION_BDF */
+
+
+/* END */
diff --git a/src/sfnt/ttbdf.h b/src/sfnt/ttbdf.h
new file mode 100644 (file)
index 0000000..48a10d6
--- /dev/null
@@ -0,0 +1,46 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttbdf.h                                                                */
+/*                                                                         */
+/*    TrueType and OpenType embedded BDF properties (specification).       */
+/*                                                                         */
+/*  Copyright 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTBDF_H__
+#define __TTBDF_H__
+
+
+#include <ft2build.h>
+#include "ttload.h"
+#include FT_BDF_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( void )
+  tt_face_free_bdf_props( TT_Face  face );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_find_bdf_prop( TT_Face           face,
+                         const char*       property_name,
+                         BDF_PropertyRec  *aprop );
+
+
+FT_END_HEADER
+
+#endif /* __TTBDF_H__ */
+
+
+/* END */
diff --git a/src/sfnt/ttcmap.c b/src/sfnt/ttcmap.c
new file mode 100644 (file)
index 0000000..1dfd987
--- /dev/null
@@ -0,0 +1,3512 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttcmap.c                                                               */
+/*                                                                         */
+/*    TrueType character mapping table (cmap) support (body).              */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2004, 2005, 2006, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+
+#include "sferrors.h"           /* must come before FT_INTERNAL_VALIDATE_H */
+
+#include FT_INTERNAL_VALIDATE_H
+#include FT_INTERNAL_STREAM_H
+#include "ttload.h"
+#include "ttcmap.h"
+#include "sfntpic.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttcmap
+
+
+#define TT_PEEK_SHORT   FT_PEEK_SHORT
+#define TT_PEEK_USHORT  FT_PEEK_USHORT
+#define TT_PEEK_UINT24  FT_PEEK_UOFF3
+#define TT_PEEK_LONG    FT_PEEK_LONG
+#define TT_PEEK_ULONG   FT_PEEK_ULONG
+
+#define TT_NEXT_SHORT   FT_NEXT_SHORT
+#define TT_NEXT_USHORT  FT_NEXT_USHORT
+#define TT_NEXT_UINT24  FT_NEXT_UOFF3
+#define TT_NEXT_LONG    FT_NEXT_LONG
+#define TT_NEXT_ULONG   FT_NEXT_ULONG
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap_init( TT_CMap   cmap,
+                FT_Byte*  table )
+  {
+    cmap->data = table;
+    return SFNT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                           FORMAT 0                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TABLE OVERVIEW                                                        */
+  /* --------------                                                        */
+  /*                                                                       */
+  /*   NAME        OFFSET         TYPE          DESCRIPTION                */
+  /*                                                                       */
+  /*   format      0              USHORT        must be 0                  */
+  /*   length      2              USHORT        table length in bytes      */
+  /*   language    4              USHORT        Mac language code          */
+  /*   glyph_ids   6              BYTE[256]     array of glyph indices     */
+  /*               262                                                     */
+  /*                                                                       */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_0
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap0_validate( FT_Byte*      table,
+                     FT_Validator  valid )
+  {
+    FT_Byte*  p      = table + 2;
+    FT_UInt   length = TT_NEXT_USHORT( p );
+
+
+    if ( table + length > valid->limit || length < 262 )
+      FT_INVALID_TOO_SHORT;
+
+    /* check glyph indices whenever necessary */
+    if ( valid->level >= FT_VALIDATE_TIGHT )
+    {
+      FT_UInt  n, idx;
+
+
+      p = table + 6;
+      for ( n = 0; n < 256; n++ )
+      {
+        idx = *p++;
+        if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
+          FT_INVALID_GLYPH_ID;
+      }
+    }
+
+    return SFNT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap0_char_index( TT_CMap    cmap,
+                       FT_UInt32  char_code )
+  {
+    FT_Byte*  table = cmap->data;
+
+
+    return char_code < 256 ? table[6 + char_code] : 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap0_char_next( TT_CMap     cmap,
+                      FT_UInt32  *pchar_code )
+  {
+    FT_Byte*   table    = cmap->data;
+    FT_UInt32  charcode = *pchar_code;
+    FT_UInt32  result   = 0;
+    FT_UInt    gindex   = 0;
+
+
+    table += 6;  /* go to glyph IDs */
+    while ( ++charcode < 256 )
+    {
+      gindex = table[charcode];
+      if ( gindex != 0 )
+      {
+        result = charcode;
+        break;
+      }
+    }
+
+    *pchar_code = result;
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap0_get_info( TT_CMap       cmap,
+                     TT_CMapInfo  *cmap_info )
+  {
+    FT_Byte*  p = cmap->data + 4;
+
+
+    cmap_info->format   = 0;
+    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+
+    return SFNT_Err_Ok;
+  }
+
+
+  FT_DEFINE_TT_CMAP(tt_cmap0_class_rec,
+      sizeof ( TT_CMapRec ),
+
+      (FT_CMap_InitFunc)     tt_cmap_init,
+      (FT_CMap_DoneFunc)     NULL,
+      (FT_CMap_CharIndexFunc)tt_cmap0_char_index,
+      (FT_CMap_CharNextFunc) tt_cmap0_char_next,
+
+      NULL, NULL, NULL, NULL, NULL
+    ,
+    0,
+    (TT_CMap_ValidateFunc)   tt_cmap0_validate,
+    (TT_CMap_Info_GetFunc)   tt_cmap0_get_info
+  )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_0 */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          FORMAT 2                             *****/
+  /*****                                                               *****/
+  /***** This is used for certain CJK encodings that encode text in a  *****/
+  /***** mixed 8/16 bits encoding along the following lines:           *****/
+  /*****                                                               *****/
+  /***** * Certain byte values correspond to an 8-bit character code   *****/
+  /*****   (typically in the range 0..127 for ASCII compatibility).    *****/
+  /*****                                                               *****/
+  /***** * Certain byte values signal the first byte of a 2-byte       *****/
+  /*****   character code (but these values are also valid as the      *****/
+  /*****   second byte of a 2-byte character).                         *****/
+  /*****                                                               *****/
+  /***** The following charmap lookup and iteration functions all      *****/
+  /***** assume that the value "charcode" correspond to following:     *****/
+  /*****                                                               *****/
+  /*****   - For one byte characters, "charcode" is simply the         *****/
+  /*****     character code.                                           *****/
+  /*****                                                               *****/
+  /*****   - For two byte characters, "charcode" is the 2-byte         *****/
+  /*****     character code in big endian format.  More exactly:       *****/
+  /*****                                                               *****/
+  /*****       (charcode >> 8)    is the first byte value              *****/
+  /*****       (charcode & 0xFF)  is the second byte value             *****/
+  /*****                                                               *****/
+  /***** Note that not all values of "charcode" are valid according    *****/
+  /***** to these rules, and the function moderately check the         *****/
+  /***** arguments.                                                    *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TABLE OVERVIEW                                                        */
+  /* --------------                                                        */
+  /*                                                                       */
+  /*   NAME        OFFSET         TYPE            DESCRIPTION              */
+  /*                                                                       */
+  /*   format      0              USHORT          must be 2                */
+  /*   length      2              USHORT          table length in bytes    */
+  /*   language    4              USHORT          Mac language code        */
+  /*   keys        6              USHORT[256]     sub-header keys          */
+  /*   subs        518            SUBHEAD[NSUBS]  sub-headers array        */
+  /*   glyph_ids   518+NSUB*8     USHORT[]        glyph ID array           */
+  /*                                                                       */
+  /* The `keys' table is used to map charcode high-bytes to sub-headers.   */
+  /* The value of `NSUBS' is the number of sub-headers defined in the      */
+  /* table and is computed by finding the maximum of the `keys' table.     */
+  /*                                                                       */
+  /* Note that for any n, `keys[n]' is a byte offset within the `subs'     */
+  /* table, i.e., it is the corresponding sub-header index multiplied      */
+  /* by 8.                                                                 */
+  /*                                                                       */
+  /* Each sub-header has the following format:                             */
+  /*                                                                       */
+  /*   NAME        OFFSET      TYPE            DESCRIPTION                 */
+  /*                                                                       */
+  /*   first       0           USHORT          first valid low-byte        */
+  /*   count       2           USHORT          number of valid low-bytes   */
+  /*   delta       4           SHORT           see below                   */
+  /*   offset      6           USHORT          see below                   */
+  /*                                                                       */
+  /* A sub-header defines, for each high-byte, the range of valid          */
+  /* low-bytes within the charmap.  Note that the range defined by `first' */
+  /* and `count' must be completely included in the interval [0..255]      */
+  /* according to the specification.                                       */
+  /*                                                                       */
+  /* If a character code is contained within a given sub-header, then      */
+  /* mapping it to a glyph index is done as follows:                       */
+  /*                                                                       */
+  /* * The value of `offset' is read.  This is a _byte_ distance from the  */
+  /*   location of the `offset' field itself into a slice of the           */
+  /*   `glyph_ids' table.  Let's call it `slice' (it is a USHORT[] too).   */
+  /*                                                                       */
+  /* * The value `slice[char.lo - first]' is read.  If it is 0, there is   */
+  /*   no glyph for the charcode.  Otherwise, the value of `delta' is      */
+  /*   added to it (modulo 65536) to form a new glyph index.               */
+  /*                                                                       */
+  /* It is up to the validation routine to check that all offsets fall     */
+  /* within the glyph IDs table (and not within the `subs' table itself or */
+  /* outside of the CMap).                                                 */
+  /*                                                                       */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_2
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap2_validate( FT_Byte*      table,
+                     FT_Validator  valid )
+  {
+    FT_Byte*  p      = table + 2;           /* skip format */
+    FT_UInt   length = TT_PEEK_USHORT( p );
+    FT_UInt   n, max_subs;
+    FT_Byte*  keys;                         /* keys table */
+    FT_Byte*  subs;                         /* sub-headers */
+    FT_Byte*  glyph_ids;                    /* glyph ID array */
+
+
+    if ( table + length > valid->limit || length < 6 + 512 )
+      FT_INVALID_TOO_SHORT;
+
+    keys = table + 6;
+
+    /* parse keys to compute sub-headers count */
+    p        = keys;
+    max_subs = 0;
+    for ( n = 0; n < 256; n++ )
+    {
+      FT_UInt  idx = TT_NEXT_USHORT( p );
+
+
+      /* value must be multiple of 8 */
+      if ( valid->level >= FT_VALIDATE_PARANOID && ( idx & 7 ) != 0 )
+        FT_INVALID_DATA;
+
+      idx >>= 3;
+
+      if ( idx > max_subs )
+        max_subs = idx;
+    }
+
+    FT_ASSERT( p == table + 518 );
+
+    subs      = p;
+    glyph_ids = subs + (max_subs + 1) * 8;
+    if ( glyph_ids > valid->limit )
+      FT_INVALID_TOO_SHORT;
+
+    /* parse sub-headers */
+    for ( n = 0; n <= max_subs; n++ )
+    {
+      FT_UInt   first_code, code_count, offset;
+      FT_Int    delta;
+      FT_Byte*  ids;
+
+
+      first_code = TT_NEXT_USHORT( p );
+      code_count = TT_NEXT_USHORT( p );
+      delta      = TT_NEXT_SHORT( p );
+      offset     = TT_NEXT_USHORT( p );
+
+      /* many Dynalab fonts have empty sub-headers */
+      if ( code_count == 0 )
+        continue;
+
+      /* check range within 0..255 */
+      if ( valid->level >= FT_VALIDATE_PARANOID )
+      {
+        if ( first_code >= 256 || first_code + code_count > 256 )
+          FT_INVALID_DATA;
+      }
+
+      /* check offset */
+      if ( offset != 0 )
+      {
+        ids = p - 2 + offset;
+        if ( ids < glyph_ids || ids + code_count*2 > table + length )
+          FT_INVALID_OFFSET;
+
+        /* check glyph IDs */
+        if ( valid->level >= FT_VALIDATE_TIGHT )
+        {
+          FT_Byte*  limit = p + code_count * 2;
+          FT_UInt   idx;
+
+
+          for ( ; p < limit; )
+          {
+            idx = TT_NEXT_USHORT( p );
+            if ( idx != 0 )
+            {
+              idx = ( idx + delta ) & 0xFFFFU;
+              if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
+                FT_INVALID_GLYPH_ID;
+            }
+          }
+        }
+      }
+    }
+
+    return SFNT_Err_Ok;
+  }
+
+
+  /* return sub header corresponding to a given character code */
+  /* NULL on invalid charcode                                  */
+  static FT_Byte*
+  tt_cmap2_get_subheader( FT_Byte*   table,
+                          FT_UInt32  char_code )
+  {
+    FT_Byte*  result = NULL;
+
+
+    if ( char_code < 0x10000UL )
+    {
+      FT_UInt   char_lo = (FT_UInt)( char_code & 0xFF );
+      FT_UInt   char_hi = (FT_UInt)( char_code >> 8 );
+      FT_Byte*  p       = table + 6;    /* keys table */
+      FT_Byte*  subs    = table + 518;  /* subheaders table */
+      FT_Byte*  sub;
+
+
+      if ( char_hi == 0 )
+      {
+        /* an 8-bit character code -- we use subHeader 0 in this case */
+        /* to test whether the character code is in the charmap       */
+        /*                                                            */
+        sub = subs;  /* jump to first sub-header */
+
+        /* check that the sub-header for this byte is 0, which */
+        /* indicates that it is really a valid one-byte value  */
+        /* Otherwise, return 0                                 */
+        /*                                                     */
+        p += char_lo * 2;
+        if ( TT_PEEK_USHORT( p ) != 0 )
+          goto Exit;
+      }
+      else
+      {
+        /* a 16-bit character code */
+
+        /* jump to key entry  */
+        p  += char_hi * 2;
+        /* jump to sub-header */
+        sub = subs + ( FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 8 ) );
+
+        /* check that the high byte isn't a valid one-byte value */
+        if ( sub == subs )
+          goto Exit;
+      }
+      result = sub;
+    }
+  Exit:
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap2_char_index( TT_CMap    cmap,
+                       FT_UInt32  char_code )
+  {
+    FT_Byte*  table   = cmap->data;
+    FT_UInt   result  = 0;
+    FT_Byte*  subheader;
+
+
+    subheader = tt_cmap2_get_subheader( table, char_code );
+    if ( subheader )
+    {
+      FT_Byte*  p   = subheader;
+      FT_UInt   idx = (FT_UInt)(char_code & 0xFF);
+      FT_UInt   start, count;
+      FT_Int    delta;
+      FT_UInt   offset;
+
+
+      start  = TT_NEXT_USHORT( p );
+      count  = TT_NEXT_USHORT( p );
+      delta  = TT_NEXT_SHORT ( p );
+      offset = TT_PEEK_USHORT( p );
+
+      idx -= start;
+      if ( idx < count && offset != 0 )
+      {
+        p  += offset + 2 * idx;
+        idx = TT_PEEK_USHORT( p );
+
+        if ( idx != 0 )
+          result = (FT_UInt)( idx + delta ) & 0xFFFFU;
+      }
+    }
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap2_char_next( TT_CMap     cmap,
+                      FT_UInt32  *pcharcode )
+  {
+    FT_Byte*   table    = cmap->data;
+    FT_UInt    gindex   = 0;
+    FT_UInt32  result   = 0;
+    FT_UInt32  charcode = *pcharcode + 1;
+    FT_Byte*   subheader;
+
+
+    while ( charcode < 0x10000UL )
+    {
+      subheader = tt_cmap2_get_subheader( table, charcode );
+      if ( subheader )
+      {
+        FT_Byte*  p       = subheader;
+        FT_UInt   start   = TT_NEXT_USHORT( p );
+        FT_UInt   count   = TT_NEXT_USHORT( p );
+        FT_Int    delta   = TT_NEXT_SHORT ( p );
+        FT_UInt   offset  = TT_PEEK_USHORT( p );
+        FT_UInt   char_lo = (FT_UInt)( charcode & 0xFF );
+        FT_UInt   pos, idx;
+
+
+        if ( offset == 0 )
+          goto Next_SubHeader;
+
+        if ( char_lo < start )
+        {
+          char_lo = start;
+          pos     = 0;
+        }
+        else
+          pos = (FT_UInt)( char_lo - start );
+
+        p       += offset + pos * 2;
+        charcode = FT_PAD_FLOOR( charcode, 256 ) + char_lo;
+
+        for ( ; pos < count; pos++, charcode++ )
+        {
+          idx = TT_NEXT_USHORT( p );
+
+          if ( idx != 0 )
+          {
+            gindex = ( idx + delta ) & 0xFFFFU;
+            if ( gindex != 0 )
+            {
+              result = charcode;
+              goto Exit;
+            }
+          }
+        }
+      }
+
+      /* jump to next sub-header, i.e. higher byte value */
+    Next_SubHeader:
+      charcode = FT_PAD_FLOOR( charcode, 256 ) + 256;
+    }
+
+  Exit:
+    *pcharcode = result;
+
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap2_get_info( TT_CMap       cmap,
+                     TT_CMapInfo  *cmap_info )
+  {
+    FT_Byte*  p = cmap->data + 4;
+
+
+    cmap_info->format   = 2;
+    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+
+    return SFNT_Err_Ok;
+  }
+
+
+  FT_DEFINE_TT_CMAP(tt_cmap2_class_rec,
+      sizeof ( TT_CMapRec ),
+
+      (FT_CMap_InitFunc)     tt_cmap_init,
+      (FT_CMap_DoneFunc)     NULL,
+      (FT_CMap_CharIndexFunc)tt_cmap2_char_index,
+      (FT_CMap_CharNextFunc) tt_cmap2_char_next,
+
+      NULL, NULL, NULL, NULL, NULL
+    ,
+    2,
+    (TT_CMap_ValidateFunc)   tt_cmap2_validate,
+    (TT_CMap_Info_GetFunc)   tt_cmap2_get_info
+  )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_2 */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                           FORMAT 4                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TABLE OVERVIEW                                                        */
+  /* --------------                                                        */
+  /*                                                                       */
+  /*   NAME          OFFSET         TYPE              DESCRIPTION          */
+  /*                                                                       */
+  /*   format        0              USHORT            must be 4            */
+  /*   length        2              USHORT            table length         */
+  /*                                                  in bytes             */
+  /*   language      4              USHORT            Mac language code    */
+  /*                                                                       */
+  /*   segCountX2    6              USHORT            2*NUM_SEGS           */
+  /*   searchRange   8              USHORT            2*(1 << LOG_SEGS)    */
+  /*   entrySelector 10             USHORT            LOG_SEGS             */
+  /*   rangeShift    12             USHORT            segCountX2 -         */
+  /*                                                    searchRange        */
+  /*                                                                       */
+  /*   endCount      14             USHORT[NUM_SEGS]  end charcode for     */
+  /*                                                  each segment; last   */
+  /*                                                  is 0xFFFF            */
+  /*                                                                       */
+  /*   pad           14+NUM_SEGS*2  USHORT            padding              */
+  /*                                                                       */
+  /*   startCount    16+NUM_SEGS*2  USHORT[NUM_SEGS]  first charcode for   */
+  /*                                                  each segment         */
+  /*                                                                       */
+  /*   idDelta       16+NUM_SEGS*4  SHORT[NUM_SEGS]   delta for each       */
+  /*                                                  segment              */
+  /*   idOffset      16+NUM_SEGS*6  SHORT[NUM_SEGS]   range offset for     */
+  /*                                                  each segment; can be */
+  /*                                                  zero                 */
+  /*                                                                       */
+  /*   glyphIds      16+NUM_SEGS*8  USHORT[]          array of glyph ID    */
+  /*                                                  ranges               */
+  /*                                                                       */
+  /* Character codes are modelled by a series of ordered (increasing)      */
+  /* intervals called segments.  Each segment has start and end codes,     */
+  /* provided by the `startCount' and `endCount' arrays.  Segments must    */
+  /* not overlap, and the last segment should always contain the value     */
+  /* 0xFFFF for `endCount'.                                                */
+  /*                                                                       */
+  /* The fields `searchRange', `entrySelector' and `rangeShift' are better */
+  /* ignored (they are traces of over-engineering in the TrueType          */
+  /* specification).                                                       */
+  /*                                                                       */
+  /* Each segment also has a signed `delta', as well as an optional offset */
+  /* within the `glyphIds' table.                                          */
+  /*                                                                       */
+  /* If a segment's idOffset is 0, the glyph index corresponding to any    */
+  /* charcode within the segment is obtained by adding the value of        */
+  /* `idDelta' directly to the charcode, modulo 65536.                     */
+  /*                                                                       */
+  /* Otherwise, a glyph index is taken from the glyph IDs sub-array for    */
+  /* the segment, and the value of `idDelta' is added to it.               */
+  /*                                                                       */
+  /*                                                                       */
+  /* Finally, note that a lot of fonts contain an invalid last segment,    */
+  /* where `start' and `end' are correctly set to 0xFFFF but both `delta'  */
+  /* and `offset' are incorrect (e.g., `opens___.ttf' which comes with     */
+  /* OpenOffice.org).  We need special code to deal with them correctly.   */
+  /*                                                                       */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_4
+
+  typedef struct  TT_CMap4Rec_
+  {
+    TT_CMapRec  cmap;
+    FT_UInt32   cur_charcode;   /* current charcode */
+    FT_UInt     cur_gindex;     /* current glyph index */
+
+    FT_UInt     num_ranges;
+    FT_UInt     cur_range;
+    FT_UInt     cur_start;
+    FT_UInt     cur_end;
+    FT_Int      cur_delta;
+    FT_Byte*    cur_values;
+
+  } TT_CMap4Rec, *TT_CMap4;
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap4_init( TT_CMap4  cmap,
+                 FT_Byte*  table )
+  {
+    FT_Byte*  p;
+
+
+    cmap->cmap.data    = table;
+
+    p                  = table + 6;
+    cmap->num_ranges   = FT_PEEK_USHORT( p ) >> 1;
+    cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL;
+    cmap->cur_gindex   = 0;
+
+    return SFNT_Err_Ok;
+  }
+
+
+  static FT_Int
+  tt_cmap4_set_range( TT_CMap4  cmap,
+                      FT_UInt   range_index )
+  {
+    FT_Byte*  table = cmap->cmap.data;
+    FT_Byte*  p;
+    FT_UInt   num_ranges = cmap->num_ranges;
+
+
+    while ( range_index < num_ranges )
+    {
+      FT_UInt  offset;
+
+
+      p             = table + 14 + range_index * 2;
+      cmap->cur_end = FT_PEEK_USHORT( p );
+
+      p              += 2 + num_ranges * 2;
+      cmap->cur_start = FT_PEEK_USHORT( p );
+
+      p              += num_ranges * 2;
+      cmap->cur_delta = FT_PEEK_SHORT( p );
+
+      p     += num_ranges * 2;
+      offset = FT_PEEK_USHORT( p );
+
+      /* some fonts have an incorrect last segment; */
+      /* we have to catch it                        */
+      if ( range_index     >= num_ranges - 1 &&
+           cmap->cur_start == 0xFFFFU        &&
+           cmap->cur_end   == 0xFFFFU        )
+      {
+        TT_Face   face  = (TT_Face)cmap->cmap.cmap.charmap.face;
+        FT_Byte*  limit = face->cmap_table + face->cmap_size;
+
+
+        if ( offset && p + offset + 2 > limit )
+        {
+          cmap->cur_delta = 1;
+          offset          = 0;
+        }
+      }
+
+      if ( offset != 0xFFFFU )
+      {
+        cmap->cur_values = offset ? p + offset : NULL;
+        cmap->cur_range  = range_index;
+        return 0;
+      }
+
+      /* we skip empty segments */
+      range_index++;
+    }
+
+    return -1;
+  }
+
+
+  /* search the index of the charcode next to cmap->cur_charcode; */
+  /* caller should call tt_cmap4_set_range with proper range      */
+  /* before calling this function                                 */
+  /*                                                              */
+  static void
+  tt_cmap4_next( TT_CMap4  cmap )
+  {
+    FT_UInt  charcode;
+
+
+    if ( cmap->cur_charcode >= 0xFFFFUL )
+      goto Fail;
+
+    charcode = (FT_UInt)cmap->cur_charcode + 1;
+
+    if ( charcode < cmap->cur_start )
+      charcode = cmap->cur_start;
+
+    for ( ;; )
+    {
+      FT_Byte*  values = cmap->cur_values;
+      FT_UInt   end    = cmap->cur_end;
+      FT_Int    delta  = cmap->cur_delta;
+
+
+      if ( charcode <= end )
+      {
+        if ( values )
+        {
+          FT_Byte*  p = values + 2 * ( charcode - cmap->cur_start );
+
+
+          do
+          {
+            FT_UInt  gindex = FT_NEXT_USHORT( p );
+
+
+            if ( gindex != 0 )
+            {
+              gindex = (FT_UInt)( ( gindex + delta ) & 0xFFFFU );
+              if ( gindex != 0 )
+              {
+                cmap->cur_charcode = charcode;
+                cmap->cur_gindex   = gindex;
+                return;
+              }
+            }
+          } while ( ++charcode <= end );
+        }
+        else
+        {
+          do
+          {
+            FT_UInt  gindex = (FT_UInt)( ( charcode + delta ) & 0xFFFFU );
+
+
+            if ( gindex != 0 )
+            {
+              cmap->cur_charcode = charcode;
+              cmap->cur_gindex   = gindex;
+              return;
+            }
+          } while ( ++charcode <= end );
+        }
+      }
+
+      /* we need to find another range */
+      if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 )
+        break;
+
+      if ( charcode < cmap->cur_start )
+        charcode = cmap->cur_start;
+    }
+
+  Fail:
+    cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL;
+    cmap->cur_gindex   = 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap4_validate( FT_Byte*      table,
+                     FT_Validator  valid )
+  {
+    FT_Byte*  p      = table + 2;               /* skip format */
+    FT_UInt   length = TT_NEXT_USHORT( p );
+    FT_Byte   *ends, *starts, *offsets, *deltas, *glyph_ids;
+    FT_UInt   num_segs;
+    FT_Error  error = SFNT_Err_Ok;
+
+
+    if ( length < 16 )
+      FT_INVALID_TOO_SHORT;
+
+    /* in certain fonts, the `length' field is invalid and goes */
+    /* out of bound.  We try to correct this here...            */
+    if ( table + length > valid->limit )
+    {
+      if ( valid->level >= FT_VALIDATE_TIGHT )
+        FT_INVALID_TOO_SHORT;
+
+      length = (FT_UInt)( valid->limit - table );
+    }
+
+    p        = table + 6;
+    num_segs = TT_NEXT_USHORT( p );   /* read segCountX2 */
+
+    if ( valid->level >= FT_VALIDATE_PARANOID )
+    {
+      /* check that we have an even value here */
+      if ( num_segs & 1 )
+        FT_INVALID_DATA;
+    }
+
+    num_segs /= 2;
+
+    if ( length < 16 + num_segs * 2 * 4 )
+      FT_INVALID_TOO_SHORT;
+
+    /* check the search parameters - even though we never use them */
+    /*                                                             */
+    if ( valid->level >= FT_VALIDATE_PARANOID )
+    {
+      /* check the values of `searchRange', `entrySelector', `rangeShift' */
+      FT_UInt  search_range   = TT_NEXT_USHORT( p );
+      FT_UInt  entry_selector = TT_NEXT_USHORT( p );
+      FT_UInt  range_shift    = TT_NEXT_USHORT( p );
+
+
+      if ( ( search_range | range_shift ) & 1 )  /* must be even values */
+        FT_INVALID_DATA;
+
+      search_range /= 2;
+      range_shift  /= 2;
+
+      /* `search range' is the greatest power of 2 that is <= num_segs */
+
+      if ( search_range                > num_segs                 ||
+           search_range * 2            < num_segs                 ||
+           search_range + range_shift != num_segs                 ||
+           search_range               != ( 1U << entry_selector ) )
+        FT_INVALID_DATA;
+    }
+
+    ends      = table   + 14;
+    starts    = table   + 16 + num_segs * 2;
+    deltas    = starts  + num_segs * 2;
+    offsets   = deltas  + num_segs * 2;
+    glyph_ids = offsets + num_segs * 2;
+
+    /* check last segment; its end count value must be 0xFFFF */
+    if ( valid->level >= FT_VALIDATE_PARANOID )
+    {
+      p = ends + ( num_segs - 1 ) * 2;
+      if ( TT_PEEK_USHORT( p ) != 0xFFFFU )
+        FT_INVALID_DATA;
+    }
+
+    {
+      FT_UInt   start, end, offset, n;
+      FT_UInt   last_start = 0, last_end = 0;
+      FT_Int    delta;
+      FT_Byte*  p_start   = starts;
+      FT_Byte*  p_end     = ends;
+      FT_Byte*  p_delta   = deltas;
+      FT_Byte*  p_offset  = offsets;
+
+
+      for ( n = 0; n < num_segs; n++ )
+      {
+        p      = p_offset;
+        start  = TT_NEXT_USHORT( p_start );
+        end    = TT_NEXT_USHORT( p_end );
+        delta  = TT_NEXT_SHORT( p_delta );
+        offset = TT_NEXT_USHORT( p_offset );
+
+        if ( start > end )
+          FT_INVALID_DATA;
+
+        /* this test should be performed at default validation level; */
+        /* unfortunately, some popular Asian fonts have overlapping   */
+        /* ranges in their charmaps                                   */
+        /*                                                            */
+        if ( start <= last_end && n > 0 )
+        {
+          if ( valid->level >= FT_VALIDATE_TIGHT )
+            FT_INVALID_DATA;
+          else
+          {
+            /* allow overlapping segments, provided their start points */
+            /* and end points, respectively, are in ascending order    */
+            /*                                                         */
+            if ( last_start > start || last_end > end )
+              error |= TT_CMAP_FLAG_UNSORTED;
+            else
+              error |= TT_CMAP_FLAG_OVERLAPPING;
+          }
+        }
+
+        if ( offset && offset != 0xFFFFU )
+        {
+          p += offset;  /* start of glyph ID array */
+
+          /* check that we point within the glyph IDs table only */
+          if ( valid->level >= FT_VALIDATE_TIGHT )
+          {
+            if ( p < glyph_ids                                ||
+                 p + ( end - start + 1 ) * 2 > table + length )
+              FT_INVALID_DATA;
+          }
+          /* Some fonts handle the last segment incorrectly.  In */
+          /* theory, 0xFFFF might point to an ordinary glyph --  */
+          /* a cmap 4 is versatile and could be used for any     */
+          /* encoding, not only Unicode.  However, reality shows */
+          /* that far too many fonts are sloppy and incorrectly  */
+          /* set all fields but `start' and `end' for the last   */
+          /* segment if it contains only a single character.     */
+          /*                                                     */
+          /* We thus omit the test here, delaying it to the      */
+          /* routines which actually access the cmap.            */
+          else if ( n != num_segs - 1                       ||
+                    !( start == 0xFFFFU && end == 0xFFFFU ) )
+          {
+            if ( p < glyph_ids                              ||
+                 p + ( end - start + 1 ) * 2 > valid->limit )
+              FT_INVALID_DATA;
+          }
+
+          /* check glyph indices within the segment range */
+          if ( valid->level >= FT_VALIDATE_TIGHT )
+          {
+            FT_UInt  i, idx;
+
+
+            for ( i = start; i < end; i++ )
+            {
+              idx = FT_NEXT_USHORT( p );
+              if ( idx != 0 )
+              {
+                idx = (FT_UInt)( idx + delta ) & 0xFFFFU;
+
+                if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
+                  FT_INVALID_GLYPH_ID;
+              }
+            }
+          }
+        }
+        else if ( offset == 0xFFFFU )
+        {
+          /* some fonts (erroneously?) use a range offset of 0xFFFF */
+          /* to mean missing glyph in cmap table                    */
+          /*                                                        */
+          if ( valid->level >= FT_VALIDATE_PARANOID    ||
+               n != num_segs - 1                       ||
+               !( start == 0xFFFFU && end == 0xFFFFU ) )
+            FT_INVALID_DATA;
+        }
+
+        last_start = start;
+        last_end   = end;
+      }
+    }
+
+    return error;
+  }
+
+
+  static FT_UInt
+  tt_cmap4_char_map_linear( TT_CMap     cmap,
+                            FT_UInt32*  pcharcode,
+                            FT_Bool     next )
+  {
+    FT_UInt    num_segs2, start, end, offset;
+    FT_Int     delta;
+    FT_UInt    i, num_segs;
+    FT_UInt32  charcode = *pcharcode;
+    FT_UInt    gindex   = 0;
+    FT_Byte*   p;
+
+
+    p = cmap->data + 6;
+    num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );
+
+    num_segs = num_segs2 >> 1;
+
+    if ( !num_segs )
+      return 0;
+
+    if ( next )
+      charcode++;
+
+    /* linear search */
+    for ( ; charcode <= 0xFFFFU; charcode++ )
+    {
+      FT_Byte*  q;
+
+
+      p = cmap->data + 14;               /* ends table   */
+      q = cmap->data + 16 + num_segs2;   /* starts table */
+
+      for ( i = 0; i < num_segs; i++ )
+      {
+        end   = TT_NEXT_USHORT( p );
+        start = TT_NEXT_USHORT( q );
+
+        if ( charcode >= start && charcode <= end )
+        {
+          p       = q - 2 + num_segs2;
+          delta   = TT_PEEK_SHORT( p );
+          p      += num_segs2;
+          offset  = TT_PEEK_USHORT( p );
+
+          /* some fonts have an incorrect last segment; */
+          /* we have to catch it                        */
+          if ( i >= num_segs - 1                  &&
+               start == 0xFFFFU && end == 0xFFFFU )
+          {
+            TT_Face   face  = (TT_Face)cmap->cmap.charmap.face;
+            FT_Byte*  limit = face->cmap_table + face->cmap_size;
+
+
+            if ( offset && p + offset + 2 > limit )
+            {
+              delta  = 1;
+              offset = 0;
+            }
+          }
+
+          if ( offset == 0xFFFFU )
+            continue;
+
+          if ( offset )
+          {
+            p += offset + ( charcode - start ) * 2;
+            gindex = TT_PEEK_USHORT( p );
+            if ( gindex != 0 )
+              gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU;
+          }
+          else
+            gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU;
+
+          break;
+        }
+      }
+
+      if ( !next || gindex )
+        break;
+    }
+
+    if ( next && gindex )
+      *pcharcode = charcode;
+
+    return gindex;
+  }
+
+
+  static FT_UInt
+  tt_cmap4_char_map_binary( TT_CMap     cmap,
+                            FT_UInt32*  pcharcode,
+                            FT_Bool     next )
+  {
+    FT_UInt   num_segs2, start, end, offset;
+    FT_Int    delta;
+    FT_UInt   max, min, mid, num_segs;
+    FT_UInt   charcode = (FT_UInt)*pcharcode;
+    FT_UInt   gindex   = 0;
+    FT_Byte*  p;
+
+
+    p = cmap->data + 6;
+    num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );
+
+    if ( !num_segs2 )
+      return 0;
+
+    num_segs = num_segs2 >> 1;
+
+    /* make compiler happy */
+    mid = num_segs;
+    end = 0xFFFFU;
+
+    if ( next )
+      charcode++;
+
+    min = 0;
+    max = num_segs;
+
+    /* binary search */
+    while ( min < max )
+    {
+      mid    = ( min + max ) >> 1;
+      p      = cmap->data + 14 + mid * 2;
+      end    = TT_PEEK_USHORT( p );
+      p     += 2 + num_segs2;
+      start  = TT_PEEK_USHORT( p );
+
+      if ( charcode < start )
+        max = mid;
+      else if ( charcode > end )
+        min = mid + 1;
+      else
+      {
+        p     += num_segs2;
+        delta  = TT_PEEK_SHORT( p );
+        p     += num_segs2;
+        offset = TT_PEEK_USHORT( p );
+
+        /* some fonts have an incorrect last segment; */
+        /* we have to catch it                        */
+        if ( mid >= num_segs - 1                &&
+             start == 0xFFFFU && end == 0xFFFFU )
+        {
+          TT_Face   face  = (TT_Face)cmap->cmap.charmap.face;
+          FT_Byte*  limit = face->cmap_table + face->cmap_size;
+
+
+          if ( offset && p + offset + 2 > limit )
+          {
+            delta  = 1;
+            offset = 0;
+          }
+        }
+
+        /* search the first segment containing `charcode' */
+        if ( cmap->flags & TT_CMAP_FLAG_OVERLAPPING )
+        {
+          FT_UInt  i;
+
+
+          /* call the current segment `max' */
+          max = mid;
+
+          if ( offset == 0xFFFFU )
+            mid = max + 1;
+
+          /* search in segments before the current segment */
+          for ( i = max ; i > 0; i-- )
+          {
+            FT_UInt   prev_end;
+            FT_Byte*  old_p;
+
+
+            old_p    = p;
+            p        = cmap->data + 14 + ( i - 1 ) * 2;
+            prev_end = TT_PEEK_USHORT( p );
+
+            if ( charcode > prev_end )
+            {
+              p = old_p;
+              break;
+            }
+
+            end    = prev_end;
+            p     += 2 + num_segs2;
+            start  = TT_PEEK_USHORT( p );
+            p     += num_segs2;
+            delta  = TT_PEEK_SHORT( p );
+            p     += num_segs2;
+            offset = TT_PEEK_USHORT( p );
+
+            if ( offset != 0xFFFFU )
+              mid = i - 1;
+          }
+
+          /* no luck */
+          if ( mid == max + 1 )
+          {
+            if ( i != max )
+            {
+              p      = cmap->data + 14 + max * 2;
+              end    = TT_PEEK_USHORT( p );
+              p     += 2 + num_segs2;
+              start  = TT_PEEK_USHORT( p );
+              p     += num_segs2;
+              delta  = TT_PEEK_SHORT( p );
+              p     += num_segs2;
+              offset = TT_PEEK_USHORT( p );
+            }
+
+            mid = max;
+
+            /* search in segments after the current segment */
+            for ( i = max + 1; i < num_segs; i++ )
+            {
+              FT_UInt  next_end, next_start;
+
+
+              p          = cmap->data + 14 + i * 2;
+              next_end   = TT_PEEK_USHORT( p );
+              p         += 2 + num_segs2;
+              next_start = TT_PEEK_USHORT( p );
+
+              if ( charcode < next_start )
+                break;
+
+              end    = next_end;
+              start  = next_start;
+              p     += num_segs2;
+              delta  = TT_PEEK_SHORT( p );
+              p     += num_segs2;
+              offset = TT_PEEK_USHORT( p );
+
+              if ( offset != 0xFFFFU )
+                mid = i;
+            }
+            i--;
+
+            /* still no luck */
+            if ( mid == max )
+            {
+              mid = i;
+
+              break;
+            }
+          }
+
+          /* end, start, delta, and offset are for the i'th segment */
+          if ( mid != i )
+          {
+            p      = cmap->data + 14 + mid * 2;
+            end    = TT_PEEK_USHORT( p );
+            p     += 2 + num_segs2;
+            start  = TT_PEEK_USHORT( p );
+            p     += num_segs2;
+            delta  = TT_PEEK_SHORT( p );
+            p     += num_segs2;
+            offset = TT_PEEK_USHORT( p );
+          }
+        }
+        else
+        {
+          if ( offset == 0xFFFFU )
+            break;
+        }
+
+        if ( offset )
+        {
+          p += offset + ( charcode - start ) * 2;
+          gindex = TT_PEEK_USHORT( p );
+          if ( gindex != 0 )
+            gindex = (FT_UInt)( gindex + delta ) & 0xFFFFU;
+        }
+        else
+          gindex = (FT_UInt)( charcode + delta ) & 0xFFFFU;
+
+        break;
+      }
+    }
+
+    if ( next )
+    {
+      TT_CMap4  cmap4 = (TT_CMap4)cmap;
+
+
+      /* if `charcode' is not in any segment, then `mid' is */
+      /* the segment nearest to `charcode'                  */
+      /*                                                    */
+
+      if ( charcode > end )
+      {
+        mid++;
+        if ( mid == num_segs )
+          return 0;
+      }
+
+      if ( tt_cmap4_set_range( cmap4, mid ) )
+      {
+        if ( gindex )
+          *pcharcode = charcode;
+      }
+      else
+      {
+        cmap4->cur_charcode = charcode;
+
+        if ( gindex )
+          cmap4->cur_gindex = gindex;
+        else
+        {
+          cmap4->cur_charcode = charcode;
+          tt_cmap4_next( cmap4 );
+          gindex = cmap4->cur_gindex;
+        }
+
+        if ( gindex )
+          *pcharcode = cmap4->cur_charcode;
+      }
+    }
+
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap4_char_index( TT_CMap    cmap,
+                       FT_UInt32  char_code )
+  {
+    if ( char_code >= 0x10000UL )
+      return 0;
+
+    if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )
+      return tt_cmap4_char_map_linear( cmap, &char_code, 0 );
+    else
+      return tt_cmap4_char_map_binary( cmap, &char_code, 0 );
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap4_char_next( TT_CMap     cmap,
+                      FT_UInt32  *pchar_code )
+  {
+    FT_UInt  gindex;
+
+
+    if ( *pchar_code >= 0xFFFFU )
+      return 0;
+
+    if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )
+      gindex = tt_cmap4_char_map_linear( cmap, pchar_code, 1 );
+    else
+    {
+      TT_CMap4  cmap4 = (TT_CMap4)cmap;
+
+
+      /* no need to search */
+      if ( *pchar_code == cmap4->cur_charcode )
+      {
+        tt_cmap4_next( cmap4 );
+        gindex = cmap4->cur_gindex;
+        if ( gindex )
+          *pchar_code = cmap4->cur_charcode;
+      }
+      else
+        gindex = tt_cmap4_char_map_binary( cmap, pchar_code, 1 );
+    }
+
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap4_get_info( TT_CMap       cmap,
+                     TT_CMapInfo  *cmap_info )
+  {
+    FT_Byte*  p = cmap->data + 4;
+
+
+    cmap_info->format   = 4;
+    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+
+    return SFNT_Err_Ok;
+  }
+
+
+  FT_DEFINE_TT_CMAP(tt_cmap4_class_rec,
+      sizeof ( TT_CMap4Rec ),
+      (FT_CMap_InitFunc)     tt_cmap4_init,
+      (FT_CMap_DoneFunc)     NULL,
+      (FT_CMap_CharIndexFunc)tt_cmap4_char_index,
+      (FT_CMap_CharNextFunc) tt_cmap4_char_next,
+
+      NULL, NULL, NULL, NULL, NULL
+    ,
+    4,
+    (TT_CMap_ValidateFunc)   tt_cmap4_validate,
+    (TT_CMap_Info_GetFunc)   tt_cmap4_get_info
+  )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_4 */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          FORMAT 6                             *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TABLE OVERVIEW                                                        */
+  /* --------------                                                        */
+  /*                                                                       */
+  /*   NAME        OFFSET          TYPE             DESCRIPTION            */
+  /*                                                                       */
+  /*   format       0              USHORT           must be 4              */
+  /*   length       2              USHORT           table length in bytes  */
+  /*   language     4              USHORT           Mac language code      */
+  /*                                                                       */
+  /*   first        6              USHORT           first segment code     */
+  /*   count        8              USHORT           segment size in chars  */
+  /*   glyphIds     10             USHORT[count]    glyph IDs              */
+  /*                                                                       */
+  /* A very simplified segment mapping.                                    */
+  /*                                                                       */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_6
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap6_validate( FT_Byte*      table,
+                     FT_Validator  valid )
+  {
+    FT_Byte*  p;
+    FT_UInt   length, count;
+
+
+    if ( table + 10 > valid->limit )
+      FT_INVALID_TOO_SHORT;
+
+    p      = table + 2;
+    length = TT_NEXT_USHORT( p );
+
+    p      = table + 8;             /* skip language and start index */
+    count  = TT_NEXT_USHORT( p );
+
+    if ( table + length > valid->limit || length < 10 + count * 2 )
+      FT_INVALID_TOO_SHORT;
+
+    /* check glyph indices */
+    if ( valid->level >= FT_VALIDATE_TIGHT )
+    {
+      FT_UInt  gindex;
+
+
+      for ( ; count > 0; count-- )
+      {
+        gindex = TT_NEXT_USHORT( p );
+        if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) )
+          FT_INVALID_GLYPH_ID;
+      }
+    }
+
+    return SFNT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap6_char_index( TT_CMap    cmap,
+                       FT_UInt32  char_code )
+  {
+    FT_Byte*  table  = cmap->data;
+    FT_UInt   result = 0;
+    FT_Byte*  p      = table + 6;
+    FT_UInt   start  = TT_NEXT_USHORT( p );
+    FT_UInt   count  = TT_NEXT_USHORT( p );
+    FT_UInt   idx    = (FT_UInt)( char_code - start );
+
+
+    if ( idx < count )
+    {
+      p += 2 * idx;
+      result = TT_PEEK_USHORT( p );
+    }
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap6_char_next( TT_CMap     cmap,
+                      FT_UInt32  *pchar_code )
+  {
+    FT_Byte*   table     = cmap->data;
+    FT_UInt32  result    = 0;
+    FT_UInt32  char_code = *pchar_code + 1;
+    FT_UInt    gindex    = 0;
+
+    FT_Byte*   p         = table + 6;
+    FT_UInt    start     = TT_NEXT_USHORT( p );
+    FT_UInt    count     = TT_NEXT_USHORT( p );
+    FT_UInt    idx;
+
+
+    if ( char_code >= 0x10000UL )
+      goto Exit;
+
+    if ( char_code < start )
+      char_code = start;
+
+    idx = (FT_UInt)( char_code - start );
+    p  += 2 * idx;
+
+    for ( ; idx < count; idx++ )
+    {
+      gindex = TT_NEXT_USHORT( p );
+      if ( gindex != 0 )
+      {
+        result = char_code;
+        break;
+      }
+      char_code++;
+    }
+
+  Exit:
+    *pchar_code = result;
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap6_get_info( TT_CMap       cmap,
+                     TT_CMapInfo  *cmap_info )
+  {
+    FT_Byte*  p = cmap->data + 4;
+
+
+    cmap_info->format   = 6;
+    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
+
+    return SFNT_Err_Ok;
+  }
+
+
+  FT_DEFINE_TT_CMAP(tt_cmap6_class_rec,
+      sizeof ( TT_CMapRec ),
+
+      (FT_CMap_InitFunc)     tt_cmap_init,
+      (FT_CMap_DoneFunc)     NULL,
+      (FT_CMap_CharIndexFunc)tt_cmap6_char_index,
+      (FT_CMap_CharNextFunc) tt_cmap6_char_next,
+
+      NULL, NULL, NULL, NULL, NULL
+    ,
+    6,
+    (TT_CMap_ValidateFunc)   tt_cmap6_validate,
+    (TT_CMap_Info_GetFunc)   tt_cmap6_get_info
+  )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_6 */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          FORMAT 8                             *****/
+  /*****                                                               *****/
+  /***** It is hard to completely understand what the OpenType spec    *****/
+  /***** says about this format, but here is my conclusion.            *****/
+  /*****                                                               *****/
+  /***** The purpose of this format is to easily map UTF-16 text to    *****/
+  /***** glyph indices.  Basically, the `char_code' must be in one of  *****/
+  /***** the following formats:                                        *****/
+  /*****                                                               *****/
+  /*****   - A 16-bit value that isn't part of the Unicode Surrogates  *****/
+  /*****     Area (i.e. U+D800-U+DFFF).                                *****/
+  /*****                                                               *****/
+  /*****   - A 32-bit value, made of two surrogate values, i.e.. if    *****/
+  /*****     `char_code = (char_hi << 16) | char_lo', then both        *****/
+  /*****     `char_hi' and `char_lo' must be in the Surrogates Area.   *****/
+  /*****      Area.                                                    *****/
+  /*****                                                               *****/
+  /***** The `is32' table embedded in the charmap indicates whether a  *****/
+  /***** given 16-bit value is in the surrogates area or not.          *****/
+  /*****                                                               *****/
+  /***** So, for any given `char_code', we can assert the following:   *****/
+  /*****                                                               *****/
+  /*****   If `char_hi == 0' then we must have `is32[char_lo] == 0'.   *****/
+  /*****                                                               *****/
+  /*****   If `char_hi != 0' then we must have both                    *****/
+  /*****   `is32[char_hi] != 0' and `is32[char_lo] != 0'.              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TABLE OVERVIEW                                                        */
+  /* --------------                                                        */
+  /*                                                                       */
+  /*   NAME        OFFSET         TYPE        DESCRIPTION                  */
+  /*                                                                       */
+  /*   format      0              USHORT      must be 8                    */
+  /*   reserved    2              USHORT      reserved                     */
+  /*   length      4              ULONG       length in bytes              */
+  /*   language    8              ULONG       Mac language code            */
+  /*   is32        12             BYTE[8192]  32-bitness bitmap            */
+  /*   count       8204           ULONG       number of groups             */
+  /*                                                                       */
+  /* This header is followed by `count' groups of the following format:    */
+  /*                                                                       */
+  /*   start       0              ULONG       first charcode               */
+  /*   end         4              ULONG       last charcode                */
+  /*   startId     8              ULONG       start glyph ID for the group */
+  /*                                                                       */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_8
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap8_validate( FT_Byte*      table,
+                     FT_Validator  valid )
+  {
+    FT_Byte*   p = table + 4;
+    FT_Byte*   is32;
+    FT_UInt32  length;
+    FT_UInt32  num_groups;
+
+
+    if ( table + 16 + 8192 > valid->limit )
+      FT_INVALID_TOO_SHORT;
+
+    length = TT_NEXT_ULONG( p );
+    if ( length > (FT_UInt32)( valid->limit - table ) || length < 8192 + 16 )
+      FT_INVALID_TOO_SHORT;
+
+    is32       = table + 12;
+    p          = is32  + 8192;          /* skip `is32' array */
+    num_groups = TT_NEXT_ULONG( p );
+
+    if ( p + num_groups * 12 > valid->limit )
+      FT_INVALID_TOO_SHORT;
+
+    /* check groups, they must be in increasing order */
+    {
+      FT_UInt32  n, start, end, start_id, count, last = 0;
+
+
+      for ( n = 0; n < num_groups; n++ )
+      {
+        FT_UInt   hi, lo;
+
+
+        start    = TT_NEXT_ULONG( p );
+        end      = TT_NEXT_ULONG( p );
+        start_id = TT_NEXT_ULONG( p );
+
+        if ( start > end )
+          FT_INVALID_DATA;
+
+        if ( n > 0 && start <= last )
+          FT_INVALID_DATA;
+
+        if ( valid->level >= FT_VALIDATE_TIGHT )
+        {
+          if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) )
+            FT_INVALID_GLYPH_ID;
+
+          count = (FT_UInt32)( end - start + 1 );
+
+          if ( start & ~0xFFFFU )
+          {
+            /* start_hi != 0; check that is32[i] is 1 for each i in */
+            /* the `hi' and `lo' of the range [start..end]          */
+            for ( ; count > 0; count--, start++ )
+            {
+              hi = (FT_UInt)( start >> 16 );
+              lo = (FT_UInt)( start & 0xFFFFU );
+
+              if ( (is32[hi >> 3] & ( 0x80 >> ( hi & 7 ) ) ) == 0 )
+                FT_INVALID_DATA;
+
+              if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) == 0 )
+                FT_INVALID_DATA;
+            }
+          }
+          else
+          {
+            /* start_hi == 0; check that is32[i] is 0 for each i in */
+            /* the range [start..end]                               */
+
+            /* end_hi cannot be != 0! */
+            if ( end & ~0xFFFFU )
+              FT_INVALID_DATA;
+
+            for ( ; count > 0; count--, start++ )
+            {
+              lo = (FT_UInt)( start & 0xFFFFU );
+
+              if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) != 0 )
+                FT_INVALID_DATA;
+            }
+          }
+        }
+
+        last = end;
+      }
+    }
+
+    return SFNT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap8_char_index( TT_CMap    cmap,
+                       FT_UInt32  char_code )
+  {
+    FT_Byte*   table      = cmap->data;
+    FT_UInt    result     = 0;
+    FT_Byte*   p          = table + 8204;
+    FT_UInt32  num_groups = TT_NEXT_ULONG( p );
+    FT_UInt32  start, end, start_id;
+
+
+    for ( ; num_groups > 0; num_groups-- )
+    {
+      start    = TT_NEXT_ULONG( p );
+      end      = TT_NEXT_ULONG( p );
+      start_id = TT_NEXT_ULONG( p );
+
+      if ( char_code < start )
+        break;
+
+      if ( char_code <= end )
+      {
+        result = (FT_UInt)( start_id + char_code - start );
+        break;
+      }
+    }
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap8_char_next( TT_CMap     cmap,
+                      FT_UInt32  *pchar_code )
+  {
+    FT_UInt32  result     = 0;
+    FT_UInt32  char_code  = *pchar_code + 1;
+    FT_UInt    gindex     = 0;
+    FT_Byte*   table      = cmap->data;
+    FT_Byte*   p          = table + 8204;
+    FT_UInt32  num_groups = TT_NEXT_ULONG( p );
+    FT_UInt32  start, end, start_id;
+
+
+    p = table + 8208;
+
+    for ( ; num_groups > 0; num_groups-- )
+    {
+      start    = TT_NEXT_ULONG( p );
+      end      = TT_NEXT_ULONG( p );
+      start_id = TT_NEXT_ULONG( p );
+
+      if ( char_code < start )
+        char_code = start;
+
+      if ( char_code <= end )
+      {
+        gindex = (FT_UInt)( char_code - start + start_id );
+        if ( gindex != 0 )
+        {
+          result = char_code;
+          goto Exit;
+        }
+      }
+    }
+
+  Exit:
+    *pchar_code = result;
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap8_get_info( TT_CMap       cmap,
+                     TT_CMapInfo  *cmap_info )
+  {
+    FT_Byte*  p = cmap->data + 8;
+
+
+    cmap_info->format   = 8;
+    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+
+    return SFNT_Err_Ok;
+  }
+
+
+  FT_DEFINE_TT_CMAP(tt_cmap8_class_rec,
+      sizeof ( TT_CMapRec ),
+
+      (FT_CMap_InitFunc)     tt_cmap_init,
+      (FT_CMap_DoneFunc)     NULL,
+      (FT_CMap_CharIndexFunc)tt_cmap8_char_index,
+      (FT_CMap_CharNextFunc) tt_cmap8_char_next,
+
+      NULL, NULL, NULL, NULL, NULL
+    ,
+    8,
+    (TT_CMap_ValidateFunc)   tt_cmap8_validate,
+    (TT_CMap_Info_GetFunc)   tt_cmap8_get_info
+  )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_8 */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          FORMAT 10                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TABLE OVERVIEW                                                        */
+  /* --------------                                                        */
+  /*                                                                       */
+  /*   NAME      OFFSET  TYPE               DESCRIPTION                    */
+  /*                                                                       */
+  /*   format     0      USHORT             must be 10                     */
+  /*   reserved   2      USHORT             reserved                       */
+  /*   length     4      ULONG              length in bytes                */
+  /*   language   8      ULONG              Mac language code              */
+  /*                                                                       */
+  /*   start     12      ULONG              first char in range            */
+  /*   count     16      ULONG              number of chars in range       */
+  /*   glyphIds  20      USHORT[count]      glyph indices covered          */
+  /*                                                                       */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_10
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap10_validate( FT_Byte*      table,
+                      FT_Validator  valid )
+  {
+    FT_Byte*  p = table + 4;
+    FT_ULong  length, count;
+
+
+    if ( table + 20 > valid->limit )
+      FT_INVALID_TOO_SHORT;
+
+    length = TT_NEXT_ULONG( p );
+    p      = table + 16;
+    count  = TT_NEXT_ULONG( p );
+
+    if ( length > (FT_ULong)( valid->limit - table ) ||
+         length < 20 + count * 2                     )
+      FT_INVALID_TOO_SHORT;
+
+    /* check glyph indices */
+    if ( valid->level >= FT_VALIDATE_TIGHT )
+    {
+      FT_UInt  gindex;
+
+
+      for ( ; count > 0; count-- )
+      {
+        gindex = TT_NEXT_USHORT( p );
+        if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) )
+          FT_INVALID_GLYPH_ID;
+      }
+    }
+
+    return SFNT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap10_char_index( TT_CMap    cmap,
+                        FT_UInt32  char_code )
+  {
+    FT_Byte*   table  = cmap->data;
+    FT_UInt    result = 0;
+    FT_Byte*   p      = table + 12;
+    FT_UInt32  start  = TT_NEXT_ULONG( p );
+    FT_UInt32  count  = TT_NEXT_ULONG( p );
+    FT_UInt32  idx    = (FT_ULong)( char_code - start );
+
+
+    if ( idx < count )
+    {
+      p     += 2 * idx;
+      result = TT_PEEK_USHORT( p );
+    }
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap10_char_next( TT_CMap     cmap,
+                       FT_UInt32  *pchar_code )
+  {
+    FT_Byte*   table     = cmap->data;
+    FT_UInt32  char_code = *pchar_code + 1;
+    FT_UInt    gindex    = 0;
+    FT_Byte*   p         = table + 12;
+    FT_UInt32  start     = TT_NEXT_ULONG( p );
+    FT_UInt32  count     = TT_NEXT_ULONG( p );
+    FT_UInt32  idx;
+
+
+    if ( char_code < start )
+      char_code = start;
+
+    idx = (FT_UInt32)( char_code - start );
+    p  += 2 * idx;
+
+    for ( ; idx < count; idx++ )
+    {
+      gindex = TT_NEXT_USHORT( p );
+      if ( gindex != 0 )
+        break;
+      char_code++;
+    }
+
+    *pchar_code = char_code;
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap10_get_info( TT_CMap       cmap,
+                      TT_CMapInfo  *cmap_info )
+  {
+    FT_Byte*  p = cmap->data + 8;
+
+
+    cmap_info->format   = 10;
+    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+
+    return SFNT_Err_Ok;
+  }
+
+
+  FT_DEFINE_TT_CMAP(tt_cmap10_class_rec,
+      sizeof ( TT_CMapRec ),
+
+      (FT_CMap_InitFunc)     tt_cmap_init,
+      (FT_CMap_DoneFunc)     NULL,
+      (FT_CMap_CharIndexFunc)tt_cmap10_char_index,
+      (FT_CMap_CharNextFunc) tt_cmap10_char_next,
+
+      NULL, NULL, NULL, NULL, NULL
+    ,
+    10,
+    (TT_CMap_ValidateFunc)   tt_cmap10_validate,
+    (TT_CMap_Info_GetFunc)   tt_cmap10_get_info
+  )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_10 */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          FORMAT 12                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TABLE OVERVIEW                                                        */
+  /* --------------                                                        */
+  /*                                                                       */
+  /*   NAME        OFFSET     TYPE       DESCRIPTION                       */
+  /*                                                                       */
+  /*   format      0          USHORT     must be 12                        */
+  /*   reserved    2          USHORT     reserved                          */
+  /*   length      4          ULONG      length in bytes                   */
+  /*   language    8          ULONG      Mac language code                 */
+  /*   count       12         ULONG      number of groups                  */
+  /*               16                                                      */
+  /*                                                                       */
+  /* This header is followed by `count' groups of the following format:    */
+  /*                                                                       */
+  /*   start       0          ULONG      first charcode                    */
+  /*   end         4          ULONG      last charcode                     */
+  /*   startId     8          ULONG      start glyph ID for the group      */
+  /*                                                                       */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_12
+
+  typedef struct  TT_CMap12Rec_
+  {
+    TT_CMapRec  cmap;
+    FT_Bool     valid;
+    FT_ULong    cur_charcode;
+    FT_UInt     cur_gindex;
+    FT_ULong    cur_group;
+    FT_ULong    num_groups;
+
+  } TT_CMap12Rec, *TT_CMap12;
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap12_init( TT_CMap12  cmap,
+                  FT_Byte*   table )
+  {
+    cmap->cmap.data  = table;
+
+    table           += 12;
+    cmap->num_groups = FT_PEEK_ULONG( table );
+
+    cmap->valid      = 0;
+
+    return SFNT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap12_validate( FT_Byte*      table,
+                      FT_Validator  valid )
+  {
+    FT_Byte*   p;
+    FT_ULong   length;
+    FT_ULong   num_groups;
+
+
+    if ( table + 16 > valid->limit )
+      FT_INVALID_TOO_SHORT;
+
+    p      = table + 4;
+    length = TT_NEXT_ULONG( p );
+
+    p          = table + 12;
+    num_groups = TT_NEXT_ULONG( p );
+
+    if ( length > (FT_ULong)( valid->limit - table ) ||
+         length < 16 + 12 * num_groups               )
+      FT_INVALID_TOO_SHORT;
+
+    /* check groups, they must be in increasing order */
+    {
+      FT_ULong  n, start, end, start_id, last = 0;
+
+
+      for ( n = 0; n < num_groups; n++ )
+      {
+        start    = TT_NEXT_ULONG( p );
+        end      = TT_NEXT_ULONG( p );
+        start_id = TT_NEXT_ULONG( p );
+
+        if ( start > end )
+          FT_INVALID_DATA;
+
+        if ( n > 0 && start <= last )
+          FT_INVALID_DATA;
+
+        if ( valid->level >= FT_VALIDATE_TIGHT )
+        {
+          if ( start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) )
+            FT_INVALID_GLYPH_ID;
+        }
+
+        last = end;
+      }
+    }
+
+    return SFNT_Err_Ok;
+  }
+
+
+  /* search the index of the charcode next to cmap->cur_charcode */
+  /* cmap->cur_group should be set up properly by caller         */
+  /*                                                             */
+  static void
+  tt_cmap12_next( TT_CMap12  cmap )
+  {
+    FT_Byte*  p;
+    FT_ULong  start, end, start_id, char_code;
+    FT_ULong  n;
+    FT_UInt   gindex;
+
+
+    if ( cmap->cur_charcode >= 0xFFFFFFFFUL )
+      goto Fail;
+
+    char_code = cmap->cur_charcode + 1;
+
+    n = cmap->cur_group;
+
+    for ( n = cmap->cur_group; n < cmap->num_groups; n++ )
+    {
+      p        = cmap->cmap.data + 16 + 12 * n;
+      start    = TT_NEXT_ULONG( p );
+      end      = TT_NEXT_ULONG( p );
+      start_id = TT_PEEK_ULONG( p );
+
+      if ( char_code < start )
+        char_code = start;
+
+      for ( ; char_code <= end; char_code++ )
+      {
+        gindex = (FT_UInt)( start_id + char_code - start );
+
+        if ( gindex )
+        {
+          cmap->cur_charcode = char_code;;
+          cmap->cur_gindex   = gindex;
+          cmap->cur_group    = n;
+
+          return;
+        }
+      }
+    }
+
+  Fail:
+    cmap->valid = 0;
+  }
+
+
+  static FT_UInt
+  tt_cmap12_char_map_binary( TT_CMap     cmap,
+                             FT_UInt32*  pchar_code,
+                             FT_Bool     next )
+  {
+    FT_UInt    gindex     = 0;
+    FT_Byte*   p          = cmap->data + 12;
+    FT_UInt32  num_groups = TT_PEEK_ULONG( p );
+    FT_UInt32  char_code  = *pchar_code;
+    FT_UInt32  start, end, start_id;
+    FT_UInt32  max, min, mid;
+
+
+    if ( !num_groups )
+      return 0;
+
+    /* make compiler happy */
+    mid = num_groups;
+    end = 0xFFFFFFFFUL;
+
+    if ( next )
+      char_code++;
+
+    min = 0;
+    max = num_groups;
+
+    /* binary search */
+    while ( min < max )
+    {
+      mid = ( min + max ) >> 1;
+      p   = cmap->data + 16 + 12 * mid;
+
+      start = TT_NEXT_ULONG( p );
+      end   = TT_NEXT_ULONG( p );
+
+      if ( char_code < start )
+        max = mid;
+      else if ( char_code > end )
+        min = mid + 1;
+      else
+      {
+        start_id = TT_PEEK_ULONG( p );
+        gindex = (FT_UInt)( start_id + char_code - start );
+
+        break;
+      }
+    }
+
+    if ( next )
+    {
+      TT_CMap12  cmap12 = (TT_CMap12)cmap;
+
+
+      /* if `char_code' is not in any group, then `mid' is */
+      /* the group nearest to `char_code'                  */
+      /*                                                   */
+
+      if ( char_code > end )
+      {
+        mid++;
+        if ( mid == num_groups )
+          return 0;
+      }
+
+      cmap12->valid        = 1;
+      cmap12->cur_charcode = char_code;
+      cmap12->cur_group    = mid;
+
+      if ( !gindex )
+      {
+        tt_cmap12_next( cmap12 );
+
+        if ( cmap12->valid )
+          gindex = cmap12->cur_gindex;
+      }
+      else
+        cmap12->cur_gindex = gindex;
+
+      if ( gindex )
+        *pchar_code = cmap12->cur_charcode;
+    }
+
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap12_char_index( TT_CMap    cmap,
+                        FT_UInt32  char_code )
+  {
+    return tt_cmap12_char_map_binary( cmap, &char_code, 0 );
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap12_char_next( TT_CMap     cmap,
+                       FT_UInt32  *pchar_code )
+  {
+    TT_CMap12  cmap12 = (TT_CMap12)cmap;
+    FT_ULong   gindex;
+
+
+    if ( cmap12->cur_charcode >= 0xFFFFFFFFUL )
+      return 0;
+
+    /* no need to search */
+    if ( cmap12->valid && cmap12->cur_charcode == *pchar_code )
+    {
+      tt_cmap12_next( cmap12 );
+      if ( cmap12->valid )
+      {
+        gindex = cmap12->cur_gindex;
+
+        /* XXX: check cur_charcode overflow is expected */
+        if ( gindex )
+          *pchar_code = (FT_UInt32)cmap12->cur_charcode;
+      }
+      else
+        gindex = 0;
+    }
+    else
+      gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 );
+
+    /* XXX: check gindex overflow is expected */
+    return (FT_UInt32)gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap12_get_info( TT_CMap       cmap,
+                      TT_CMapInfo  *cmap_info )
+  {
+    FT_Byte*  p = cmap->data + 8;
+
+
+    cmap_info->format   = 12;
+    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+
+    return SFNT_Err_Ok;
+  }
+
+
+  FT_DEFINE_TT_CMAP(tt_cmap12_class_rec,
+      sizeof ( TT_CMap12Rec ),
+
+      (FT_CMap_InitFunc)     tt_cmap12_init,
+      (FT_CMap_DoneFunc)     NULL,
+      (FT_CMap_CharIndexFunc)tt_cmap12_char_index,
+      (FT_CMap_CharNextFunc) tt_cmap12_char_next,
+
+      NULL, NULL, NULL, NULL, NULL
+    ,
+    12,
+    (TT_CMap_ValidateFunc)   tt_cmap12_validate,
+    (TT_CMap_Info_GetFunc)   tt_cmap12_get_info
+  )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_12 */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                          FORMAT 13                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TABLE OVERVIEW                                                        */
+  /* --------------                                                        */
+  /*                                                                       */
+  /*   NAME        OFFSET     TYPE       DESCRIPTION                       */
+  /*                                                                       */
+  /*   format      0          USHORT     must be 13                        */
+  /*   reserved    2          USHORT     reserved                          */
+  /*   length      4          ULONG      length in bytes                   */
+  /*   language    8          ULONG      Mac language code                 */
+  /*   count       12         ULONG      number of groups                  */
+  /*               16                                                      */
+  /*                                                                       */
+  /* This header is followed by `count' groups of the following format:    */
+  /*                                                                       */
+  /*   start       0          ULONG      first charcode                    */
+  /*   end         4          ULONG      last charcode                     */
+  /*   glyphId     8          ULONG      glyph ID for the whole group      */
+  /*                                                                       */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_13
+
+  typedef struct  TT_CMap13Rec_
+  {
+    TT_CMapRec  cmap;
+    FT_Bool     valid;
+    FT_ULong    cur_charcode;
+    FT_UInt     cur_gindex;
+    FT_ULong    cur_group;
+    FT_ULong    num_groups;
+
+  } TT_CMap13Rec, *TT_CMap13;
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap13_init( TT_CMap13  cmap,
+                  FT_Byte*   table )
+  {
+    cmap->cmap.data  = table;
+
+    table           += 12;
+    cmap->num_groups = FT_PEEK_ULONG( table );
+
+    cmap->valid      = 0;
+
+    return SFNT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap13_validate( FT_Byte*      table,
+                      FT_Validator  valid )
+  {
+    FT_Byte*   p;
+    FT_ULong   length;
+    FT_ULong   num_groups;
+
+
+    if ( table + 16 > valid->limit )
+      FT_INVALID_TOO_SHORT;
+
+    p      = table + 4;
+    length = TT_NEXT_ULONG( p );
+
+    p          = table + 12;
+    num_groups = TT_NEXT_ULONG( p );
+
+    if ( length > (FT_ULong)( valid->limit - table ) ||
+         length < 16 + 12 * num_groups               )
+      FT_INVALID_TOO_SHORT;
+
+    /* check groups, they must be in increasing order */
+    {
+      FT_ULong  n, start, end, glyph_id, last = 0;
+
+
+      for ( n = 0; n < num_groups; n++ )
+      {
+        start    = TT_NEXT_ULONG( p );
+        end      = TT_NEXT_ULONG( p );
+        glyph_id = TT_NEXT_ULONG( p );
+
+        if ( start > end )
+          FT_INVALID_DATA;
+
+        if ( n > 0 && start <= last )
+          FT_INVALID_DATA;
+
+        if ( valid->level >= FT_VALIDATE_TIGHT )
+        {
+          if ( glyph_id >= TT_VALID_GLYPH_COUNT( valid ) )
+            FT_INVALID_GLYPH_ID;
+        }
+
+        last = end;
+      }
+    }
+
+    return SFNT_Err_Ok;
+  }
+
+
+  /* search the index of the charcode next to cmap->cur_charcode */
+  /* cmap->cur_group should be set up properly by caller         */
+  /*                                                             */
+  static void
+  tt_cmap13_next( TT_CMap13  cmap )
+  {
+    FT_Byte*  p;
+    FT_ULong  start, end, glyph_id, char_code;
+    FT_ULong  n;
+    FT_UInt   gindex;
+
+
+    if ( cmap->cur_charcode >= 0xFFFFFFFFUL )
+      goto Fail;
+
+    char_code = cmap->cur_charcode + 1;
+
+    n = cmap->cur_group;
+
+    for ( n = cmap->cur_group; n < cmap->num_groups; n++ )
+    {
+      p        = cmap->cmap.data + 16 + 12 * n;
+      start    = TT_NEXT_ULONG( p );
+      end      = TT_NEXT_ULONG( p );
+      glyph_id = TT_PEEK_ULONG( p );
+
+      if ( char_code < start )
+        char_code = start;
+
+      if ( char_code <= end )
+      {
+        gindex = (FT_UInt)glyph_id;
+
+        if ( gindex )
+        {
+          cmap->cur_charcode = char_code;;
+          cmap->cur_gindex   = gindex;
+          cmap->cur_group    = n;
+
+          return;
+        }
+      }
+    }
+
+  Fail:
+    cmap->valid = 0;
+  }
+
+
+  static FT_UInt
+  tt_cmap13_char_map_binary( TT_CMap     cmap,
+                             FT_UInt32*  pchar_code,
+                             FT_Bool     next )
+  {
+    FT_UInt    gindex     = 0;
+    FT_Byte*   p          = cmap->data + 12;
+    FT_UInt32  num_groups = TT_PEEK_ULONG( p );
+    FT_UInt32  char_code  = *pchar_code;
+    FT_UInt32  start, end;
+    FT_UInt32  max, min, mid;
+
+
+    if ( !num_groups )
+      return 0;
+
+    /* make compiler happy */
+    mid = num_groups;
+    end = 0xFFFFFFFFUL;
+
+    if ( next )
+      char_code++;
+
+    min = 0;
+    max = num_groups;
+
+    /* binary search */
+    while ( min < max )
+    {
+      mid = ( min + max ) >> 1;
+      p   = cmap->data + 16 + 12 * mid;
+
+      start = TT_NEXT_ULONG( p );
+      end   = TT_NEXT_ULONG( p );
+
+      if ( char_code < start )
+        max = mid;
+      else if ( char_code > end )
+        min = mid + 1;
+      else
+      {
+        gindex = (FT_UInt)TT_PEEK_ULONG( p );
+
+        break;
+      }
+    }
+
+    if ( next )
+    {
+      TT_CMap13  cmap13 = (TT_CMap13)cmap;
+
+
+      /* if `char_code' is not in any group, then `mid' is */
+      /* the group nearest to `char_code'                  */
+      /*                                                   */
+
+      if ( char_code > end )
+      {
+        mid++;
+        if ( mid == num_groups )
+          return 0;
+      }
+
+      cmap13->valid        = 1;
+      cmap13->cur_charcode = char_code;
+      cmap13->cur_group    = mid;
+
+      if ( !gindex )
+      {
+        tt_cmap13_next( cmap13 );
+
+        if ( cmap13->valid )
+          gindex = cmap13->cur_gindex;
+      }
+      else
+        cmap13->cur_gindex = gindex;
+
+      if ( gindex )
+        *pchar_code = cmap13->cur_charcode;
+    }
+
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap13_char_index( TT_CMap    cmap,
+                        FT_UInt32  char_code )
+  {
+    return tt_cmap13_char_map_binary( cmap, &char_code, 0 );
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap13_char_next( TT_CMap     cmap,
+                       FT_UInt32  *pchar_code )
+  {
+    TT_CMap13  cmap13 = (TT_CMap13)cmap;
+    FT_UInt    gindex;
+
+
+    if ( cmap13->cur_charcode >= 0xFFFFFFFFUL )
+      return 0;
+
+    /* no need to search */
+    if ( cmap13->valid && cmap13->cur_charcode == *pchar_code )
+    {
+      tt_cmap13_next( cmap13 );
+      if ( cmap13->valid )
+      {
+        gindex = cmap13->cur_gindex;
+        if ( gindex )
+          *pchar_code = cmap13->cur_charcode;
+      }
+      else
+        gindex = 0;
+    }
+    else
+      gindex = tt_cmap13_char_map_binary( cmap, pchar_code, 1 );
+
+    return gindex;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap13_get_info( TT_CMap       cmap,
+                      TT_CMapInfo  *cmap_info )
+  {
+    FT_Byte*  p = cmap->data + 8;
+
+
+    cmap_info->format   = 13;
+    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
+
+    return SFNT_Err_Ok;
+  }
+
+
+  FT_DEFINE_TT_CMAP(tt_cmap13_class_rec,
+      sizeof ( TT_CMap13Rec ),
+
+      (FT_CMap_InitFunc)     tt_cmap13_init,
+      (FT_CMap_DoneFunc)     NULL,
+      (FT_CMap_CharIndexFunc)tt_cmap13_char_index,
+      (FT_CMap_CharNextFunc) tt_cmap13_char_next,
+
+      NULL, NULL, NULL, NULL, NULL
+    ,
+    13,
+    (TT_CMap_ValidateFunc)   tt_cmap13_validate,
+    (TT_CMap_Info_GetFunc)   tt_cmap13_get_info
+  )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_13 */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                           FORMAT 14                           *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TABLE OVERVIEW                                                        */
+  /* --------------                                                        */
+  /*                                                                       */
+  /*   NAME         OFFSET  TYPE    DESCRIPTION                            */
+  /*                                                                       */
+  /*   format         0     USHORT  must be 14                             */
+  /*   length         2     ULONG   table length in bytes                  */
+  /*   numSelector    6     ULONG   number of variation sel. records       */
+  /*                                                                       */
+  /* Followed by numSelector records, each of which looks like             */
+  /*                                                                       */
+  /*   varSelector    0     UINT24  Unicode codepoint of sel.              */
+  /*   defaultOff     3     ULONG   offset to a default UVS table          */
+  /*                                describing any variants to be found in */
+  /*                                the normal Unicode subtable.           */
+  /*   nonDefOff      7     ULONG   offset to a non-default UVS table      */
+  /*                                describing any variants not in the     */
+  /*                                standard cmap, with GIDs here          */
+  /* (either offset may be 0 NULL)                                         */
+  /*                                                                       */
+  /* Selectors are sorted by code point.                                   */
+  /*                                                                       */
+  /* A default Unicode Variation Selector (UVS) subtable is just a list of */
+  /* ranges of code points which are to be found in the standard cmap.  No */
+  /* glyph IDs (GIDs) here.                                                */
+  /*                                                                       */
+  /*   numRanges      0     ULONG   number of ranges following             */
+  /*                                                                       */
+  /* A range looks like                                                    */
+  /*                                                                       */
+  /*   uniStart       0     UINT24  code point of the first character in   */
+  /*                                this range                             */
+  /*   additionalCnt  3     UBYTE   count of additional characters in this */
+  /*                                range (zero means a range of a single  */
+  /*                                character)                             */
+  /*                                                                       */
+  /* Ranges are sorted by `uniStart'.                                      */
+  /*                                                                       */
+  /* A non-default Unicode Variation Selector (UVS) subtable is a list of  */
+  /* mappings from codepoint to GID.                                       */
+  /*                                                                       */
+  /*   numMappings    0     ULONG   number of mappings                     */
+  /*                                                                       */
+  /* A range looks like                                                    */
+  /*                                                                       */
+  /*   uniStart       0     UINT24  code point of the first character in   */
+  /*                                this range                             */
+  /*   GID            3     USHORT  and its GID                            */
+  /*                                                                       */
+  /* Ranges are sorted by `uniStart'.                                      */
+
+#ifdef TT_CONFIG_CMAP_FORMAT_14
+
+  typedef struct  TT_CMap14Rec_
+  {
+    TT_CMapRec  cmap;
+    FT_ULong    num_selectors;
+
+    /* This array is used to store the results of various
+     * cmap 14 query functions.  The data is overwritten
+     * on each call to these functions.
+     */
+    FT_UInt32   max_results;
+    FT_UInt32*  results;
+    FT_Memory   memory;
+
+  } TT_CMap14Rec, *TT_CMap14;
+
+
+  FT_CALLBACK_DEF( void )
+  tt_cmap14_done( TT_CMap14  cmap )
+  {
+    FT_Memory  memory = cmap->memory;
+
+
+    cmap->max_results = 0;
+    if ( memory != NULL && cmap->results != NULL )
+      FT_FREE( cmap->results );
+  }
+
+
+  static FT_Error
+  tt_cmap14_ensure( TT_CMap14  cmap,
+                    FT_UInt32  num_results,
+                    FT_Memory  memory )
+  {
+    FT_UInt32 old_max = cmap->max_results;
+    FT_Error  error   = SFNT_Err_Ok;
+
+
+    if ( num_results > cmap->max_results )
+    {
+       cmap->memory = memory;
+
+       if ( FT_QRENEW_ARRAY( cmap->results, old_max, num_results ) )
+         return error;
+
+       cmap->max_results = num_results;
+    }
+
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap14_init( TT_CMap14  cmap,
+                  FT_Byte*   table )
+  {
+    cmap->cmap.data = table;
+
+    table               += 6;
+    cmap->num_selectors = FT_PEEK_ULONG( table );
+    cmap->max_results   = 0;
+    cmap->results       = NULL;
+
+    return SFNT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap14_validate( FT_Byte*      table,
+                      FT_Validator  valid )
+  {
+    FT_Byte*  p             = table + 2;
+    FT_ULong  length        = TT_NEXT_ULONG( p );
+    FT_ULong  num_selectors = TT_NEXT_ULONG( p );
+
+
+    if ( length > (FT_ULong)( valid->limit - table ) ||
+         length < 10 + 11 * num_selectors            )
+      FT_INVALID_TOO_SHORT;
+
+    /* check selectors, they must be in increasing order */
+    {
+      /* we start lastVarSel at 1 because a variant selector value of 0
+       * isn't valid.
+       */
+      FT_ULong  n, lastVarSel = 1;
+
+
+      for ( n = 0; n < num_selectors; n++ )
+      {
+        FT_ULong  varSel    = TT_NEXT_UINT24( p );
+        FT_ULong  defOff    = TT_NEXT_ULONG( p );
+        FT_ULong  nondefOff = TT_NEXT_ULONG( p );
+
+
+        if ( defOff >= length || nondefOff >= length )
+          FT_INVALID_TOO_SHORT;
+
+        if ( varSel < lastVarSel )
+          FT_INVALID_DATA;
+
+        lastVarSel = varSel + 1;
+
+        /* check the default table (these glyphs should be reached     */
+        /* through the normal Unicode cmap, no GIDs, just check order) */
+        if ( defOff != 0 )
+        {
+          FT_Byte*  defp      = table + defOff;
+          FT_ULong  numRanges = TT_NEXT_ULONG( defp );
+          FT_ULong  i;
+          FT_ULong  lastBase  = 0;
+
+
+          if ( defp + numRanges * 4 > valid->limit )
+            FT_INVALID_TOO_SHORT;
+
+          for ( i = 0; i < numRanges; ++i )
+          {
+            FT_ULong  base = TT_NEXT_UINT24( defp );
+            FT_ULong  cnt  = FT_NEXT_BYTE( defp );
+
+
+            if ( base + cnt >= 0x110000UL )              /* end of Unicode */
+              FT_INVALID_DATA;
+
+            if ( base < lastBase )
+              FT_INVALID_DATA;
+
+            lastBase = base + cnt + 1U;
+          }
+        }
+
+        /* and the non-default table (these glyphs are specified here) */
+        if ( nondefOff != 0 )
+        {
+          FT_Byte*  ndp         = table + nondefOff;
+          FT_ULong  numMappings = TT_NEXT_ULONG( ndp );
+          FT_ULong  i, lastUni = 0;
+
+
+          if ( numMappings * 4 > (FT_ULong)( valid->limit - ndp ) )
+            FT_INVALID_TOO_SHORT;
+
+          for ( i = 0; i < numMappings; ++i )
+          {
+            FT_ULong  uni = TT_NEXT_UINT24( ndp );
+            FT_ULong  gid = TT_NEXT_USHORT( ndp );
+
+
+            if ( uni >= 0x110000UL )                     /* end of Unicode */
+              FT_INVALID_DATA;
+
+            if ( uni < lastUni )
+              FT_INVALID_DATA;
+
+            lastUni = uni + 1U;
+
+            if ( valid->level >= FT_VALIDATE_TIGHT    &&
+                 gid >= TT_VALID_GLYPH_COUNT( valid ) )
+              FT_INVALID_GLYPH_ID;
+          }
+        }
+      }
+    }
+
+    return SFNT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap14_char_index( TT_CMap    cmap,
+                        FT_UInt32  char_code )
+  {
+    FT_UNUSED( cmap );
+    FT_UNUSED( char_code );
+
+    /* This can't happen */
+    return 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 )
+  tt_cmap14_char_next( TT_CMap     cmap,
+                       FT_UInt32  *pchar_code )
+  {
+    FT_UNUSED( cmap );
+
+    /* This can't happen */
+    *pchar_code = 0;
+    return 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap14_get_info( TT_CMap       cmap,
+                      TT_CMapInfo  *cmap_info )
+  {
+    FT_UNUSED( cmap );
+
+    cmap_info->format   = 14;
+    /* subtable 14 does not define a language field */
+    cmap_info->language = 0xFFFFFFFFUL;
+
+    return SFNT_Err_Ok;
+  }
+
+
+  static FT_UInt
+  tt_cmap14_char_map_def_binary( FT_Byte    *base,
+                                 FT_UInt32   char_code )
+  {
+    FT_UInt32  numRanges = TT_PEEK_ULONG( base );
+    FT_UInt32  max, min;
+
+
+    min = 0;
+    max = numRanges;
+
+    base += 4;
+
+    /* binary search */
+    while ( min < max )
+    {
+      FT_UInt32  mid   = ( min + max ) >> 1;
+      FT_Byte*   p     = base + 4 * mid;
+      FT_ULong   start = TT_NEXT_UINT24( p );
+      FT_UInt    cnt   = FT_NEXT_BYTE( p );
+
+
+      if ( char_code < start )
+        max = mid;
+      else if ( char_code > start+cnt )
+        min = mid + 1;
+      else
+        return TRUE;
+    }
+
+    return FALSE;
+  }
+
+
+  static FT_UInt
+  tt_cmap14_char_map_nondef_binary( FT_Byte    *base,
+                                    FT_UInt32   char_code )
+  {
+    FT_UInt32  numMappings = TT_PEEK_ULONG( base );
+    FT_UInt32  max, min;
+
+
+    min = 0;
+    max = numMappings;
+
+    base += 4;
+
+    /* binary search */
+    while ( min < max )
+    {
+      FT_UInt32  mid = ( min + max ) >> 1;
+      FT_Byte*   p   = base + 5 * mid;
+      FT_UInt32  uni = (FT_UInt32)TT_NEXT_UINT24( p );
+
+
+      if ( char_code < uni )
+        max = mid;
+      else if ( char_code > uni )
+        min = mid + 1;
+      else
+        return TT_PEEK_USHORT( p );
+    }
+
+    return 0;
+  }
+
+
+  static FT_Byte*
+  tt_cmap14_find_variant( FT_Byte    *base,
+                          FT_UInt32   variantCode )
+  {
+    FT_UInt32  numVar = TT_PEEK_ULONG( base );
+    FT_UInt32  max, min;
+
+
+    min = 0;
+    max = numVar;
+
+    base += 4;
+
+    /* binary search */
+    while ( min < max )
+    {
+      FT_UInt32  mid    = ( min + max ) >> 1;
+      FT_Byte*   p      = base + 11 * mid;
+      FT_ULong   varSel = TT_NEXT_UINT24( p );
+
+
+      if ( variantCode < varSel )
+        max = mid;
+      else if ( variantCode > varSel )
+        min = mid + 1;
+      else
+        return p;
+    }
+
+    return NULL;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt )
+  tt_cmap14_char_var_index( TT_CMap    cmap,
+                            TT_CMap    ucmap,
+                            FT_UInt32  charcode,
+                            FT_UInt32  variantSelector)
+  {
+    FT_Byte*  p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );
+    FT_ULong  defOff;
+    FT_ULong  nondefOff;
+
+
+    if ( !p )
+      return 0;
+
+    defOff    = TT_NEXT_ULONG( p );
+    nondefOff = TT_PEEK_ULONG( p );
+
+    if ( defOff != 0                                                    &&
+         tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )
+    {
+      /* This is the default variant of this charcode.  GID not stored */
+      /* here; stored in the normal Unicode charmap instead.           */
+      return ucmap->cmap.clazz->char_index( &ucmap->cmap, charcode );
+    }
+
+    if ( nondefOff != 0 )
+      return tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
+                                               charcode );
+
+    return 0;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Int )
+  tt_cmap14_char_var_isdefault( TT_CMap    cmap,
+                                FT_UInt32  charcode,
+                                FT_UInt32  variantSelector )
+  {
+    FT_Byte*  p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );
+    FT_ULong  defOff;
+    FT_ULong  nondefOff;
+
+
+    if ( !p )
+      return -1;
+
+    defOff    = TT_NEXT_ULONG( p );
+    nondefOff = TT_NEXT_ULONG( p );
+
+    if ( defOff != 0                                                    &&
+         tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )
+      return 1;
+
+    if ( nondefOff != 0                                            &&
+         tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
+                                           charcode ) != 0         )
+      return 0;
+
+    return -1;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32* )
+  tt_cmap14_variants( TT_CMap    cmap,
+                      FT_Memory  memory )
+  {
+    TT_CMap14   cmap14 = (TT_CMap14)cmap;
+    FT_UInt32   count  = cmap14->num_selectors;
+    FT_Byte*    p      = cmap->data + 10;
+    FT_UInt32*  result;
+    FT_UInt32   i;
+
+
+    if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )
+      return NULL;
+
+    result = cmap14->results;
+    for ( i = 0; i < count; ++i )
+    {
+      result[i] = (FT_UInt32)TT_NEXT_UINT24( p );
+      p        += 8;
+    }
+    result[i] = 0;
+
+    return result;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 * )
+  tt_cmap14_char_variants( TT_CMap    cmap,
+                           FT_Memory  memory,
+                           FT_UInt32  charCode )
+  {
+    TT_CMap14   cmap14 = (TT_CMap14)  cmap;
+    FT_UInt32   count  = cmap14->num_selectors;
+    FT_Byte*    p      = cmap->data + 10;
+    FT_UInt32*  q;
+
+
+    if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )
+      return NULL;
+
+    for ( q = cmap14->results; count > 0; --count )
+    {
+      FT_UInt32  varSel    = TT_NEXT_UINT24( p );
+      FT_ULong   defOff    = TT_NEXT_ULONG( p );
+      FT_ULong   nondefOff = TT_NEXT_ULONG( p );
+
+
+      if ( ( defOff != 0                                               &&
+             tt_cmap14_char_map_def_binary( cmap->data + defOff,
+                                            charCode )                 ) ||
+           ( nondefOff != 0                                            &&
+             tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
+                                               charCode ) != 0         ) )
+      {
+        q[0] = varSel;
+        q++;
+      }
+    }
+    q[0] = 0;
+
+    return cmap14->results;
+  }
+
+
+  static FT_UInt
+  tt_cmap14_def_char_count( FT_Byte  *p )
+  {
+    FT_UInt32  numRanges = (FT_UInt32)TT_NEXT_ULONG( p );
+    FT_UInt    tot       = 0;
+
+
+    p += 3;  /* point to the first `cnt' field */
+    for ( ; numRanges > 0; numRanges-- )
+    {
+      tot += 1 + p[0];
+      p   += 4;
+    }
+
+    return tot;
+  }
+
+
+  static FT_UInt32*
+  tt_cmap14_get_def_chars( TT_CMap     cmap,
+                           FT_Byte*    p,
+                           FT_Memory   memory )
+  {
+    TT_CMap14   cmap14 = (TT_CMap14) cmap;
+    FT_UInt32   numRanges;
+    FT_UInt     cnt;
+    FT_UInt32*  q;
+
+
+    cnt       = tt_cmap14_def_char_count( p );
+    numRanges = (FT_UInt32)TT_NEXT_ULONG( p );
+
+    if ( tt_cmap14_ensure( cmap14, ( cnt + 1 ), memory ) )
+      return NULL;
+
+    for ( q = cmap14->results; numRanges > 0; --numRanges )
+    {
+      FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p );
+
+
+      cnt = FT_NEXT_BYTE( p ) + 1;
+      do
+      {
+        q[0]  = uni;
+        uni  += 1;
+        q    += 1;
+      } while ( --cnt != 0 );
+    }
+    q[0] = 0;
+
+    return cmap14->results;
+  }
+
+
+  static FT_UInt32*
+  tt_cmap14_get_nondef_chars( TT_CMap     cmap,
+                              FT_Byte    *p,
+                              FT_Memory   memory )
+  {
+    TT_CMap14   cmap14 = (TT_CMap14) cmap;
+    FT_UInt32   numMappings;
+    FT_UInt     i;
+    FT_UInt32  *ret;
+
+
+    numMappings = (FT_UInt32)TT_NEXT_ULONG( p );
+
+    if ( tt_cmap14_ensure( cmap14, ( numMappings + 1 ), memory ) )
+      return NULL;
+
+    ret = cmap14->results;
+    for ( i = 0; i < numMappings; ++i )
+    {
+      ret[i] = (FT_UInt32)TT_NEXT_UINT24( p );
+      p += 2;
+    }
+    ret[i] = 0;
+
+    return ret;
+  }
+
+
+  FT_CALLBACK_DEF( FT_UInt32 * )
+  tt_cmap14_variant_chars( TT_CMap    cmap,
+                           FT_Memory  memory,
+                           FT_UInt32  variantSelector )
+  {
+    FT_Byte    *p  = tt_cmap14_find_variant( cmap->data + 6,
+                                             variantSelector );
+    FT_UInt32  *ret;
+    FT_Int      i;
+    FT_ULong    defOff;
+    FT_ULong    nondefOff;
+
+
+    if ( !p )
+      return NULL;
+
+    defOff    = TT_NEXT_ULONG( p );
+    nondefOff = TT_NEXT_ULONG( p );
+
+    if ( defOff == 0 && nondefOff == 0 )
+      return NULL;
+
+    if ( defOff == 0 )
+      return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff,
+                                         memory );
+    else if ( nondefOff == 0 )
+      return tt_cmap14_get_def_chars( cmap, cmap->data + defOff,
+                                      memory );
+    else
+    {
+      /* Both a default and a non-default glyph set?  That's probably not */
+      /* good font design, but the spec allows for it...                  */
+      TT_CMap14  cmap14 = (TT_CMap14) cmap;
+      FT_UInt32  numRanges;
+      FT_UInt32  numMappings;
+      FT_UInt32  duni;
+      FT_UInt32  dcnt;
+      FT_UInt32  nuni;
+      FT_Byte*   dp;
+      FT_UInt    di, ni, k;
+
+
+      p  = cmap->data + nondefOff;
+      dp = cmap->data + defOff;
+
+      numMappings = (FT_UInt32)TT_NEXT_ULONG( p );
+      dcnt        = tt_cmap14_def_char_count( dp );
+      numRanges   = (FT_UInt32)TT_NEXT_ULONG( dp );
+
+      if ( numMappings == 0 )
+        return tt_cmap14_get_def_chars( cmap, cmap->data + defOff,
+                                        memory );
+      if ( dcnt == 0 )
+        return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff,
+                                           memory );
+
+      if ( tt_cmap14_ensure( cmap14, ( dcnt + numMappings + 1 ), memory ) )
+        return NULL;
+
+      ret  = cmap14->results;
+      duni = (FT_UInt32)TT_NEXT_UINT24( dp );
+      dcnt = FT_NEXT_BYTE( dp );
+      di   = 1;
+      nuni = (FT_UInt32)TT_NEXT_UINT24( p );
+      p   += 2;
+      ni   = 1;
+      i    = 0;
+
+      for ( ;; )
+      {
+        if ( nuni > duni + dcnt )
+        {
+          for ( k = 0; k <= dcnt; ++k )
+            ret[i++] = duni + k;
+
+          ++di;
+
+          if ( di > numRanges )
+            break;
+
+          duni = (FT_UInt32)TT_NEXT_UINT24( dp );
+          dcnt = FT_NEXT_BYTE( dp );
+        }
+        else
+        {
+          if ( nuni < duni )
+            ret[i++] = nuni;
+          /* If it is within the default range then ignore it -- */
+          /* that should not have happened                       */
+          ++ni;
+          if ( ni > numMappings )
+            break;
+
+          nuni = (FT_UInt32)TT_NEXT_UINT24( p );
+          p += 2;
+        }
+      }
+
+      if ( ni <= numMappings )
+      {
+        /* If we get here then we have run out of all default ranges.   */
+        /* We have read one non-default mapping which we haven't stored */
+        /* and there may be others that need to be read.                */
+        ret[i++] = nuni;
+        while ( ni < numMappings )
+        {
+          ret[i++] = (FT_UInt32)TT_NEXT_UINT24( p );
+          p += 2;
+          ++ni;
+        }
+      }
+      else if ( di <= numRanges )
+      {
+        /* If we get here then we have run out of all non-default     */
+        /* mappings.  We have read one default range which we haven't */
+        /* stored and there may be others that need to be read.       */
+        for ( k = 0; k <= dcnt; ++k )
+          ret[i++] = duni + k;
+
+        while ( di < numRanges )
+        {
+          duni = (FT_UInt32)TT_NEXT_UINT24( dp );
+          dcnt = FT_NEXT_BYTE( dp );
+
+          for ( k = 0; k <= dcnt; ++k )
+            ret[i++] = duni + k;
+          ++di;
+        }
+      }
+
+      ret[i] = 0;
+
+      return ret;
+    }
+  }
+
+
+  FT_DEFINE_TT_CMAP(tt_cmap14_class_rec,
+      sizeof ( TT_CMap14Rec ),
+
+      (FT_CMap_InitFunc)     tt_cmap14_init,
+      (FT_CMap_DoneFunc)     tt_cmap14_done,
+      (FT_CMap_CharIndexFunc)tt_cmap14_char_index,
+      (FT_CMap_CharNextFunc) tt_cmap14_char_next,
+
+      /* Format 14 extension functions */
+      (FT_CMap_CharVarIndexFunc)    tt_cmap14_char_var_index,
+      (FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault,
+      (FT_CMap_VariantListFunc)     tt_cmap14_variants,
+      (FT_CMap_CharVariantListFunc) tt_cmap14_char_variants,
+      (FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars
+    ,
+    14,
+    (TT_CMap_ValidateFunc)tt_cmap14_validate,
+    (TT_CMap_Info_GetFunc)tt_cmap14_get_info
+  )
+
+#endif /* TT_CONFIG_CMAP_FORMAT_14 */
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+  static const TT_CMap_Class  tt_cmap_classes[] =
+  {
+#define TTCMAPCITEM(a) &a,
+#include "ttcmapc.h"
+    NULL,
+  };
+
+#else /*FT_CONFIG_OPTION_PIC*/
+
+  void FT_Destroy_Class_tt_cmap_classes(FT_Library library, TT_CMap_Class* clazz)
+  {
+    FT_Memory memory = library->memory;
+    if ( clazz )
+      FT_FREE( clazz );
+  }
+
+  FT_Error FT_Create_Class_tt_cmap_classes(FT_Library library, TT_CMap_Class** output_class)
+  {
+    TT_CMap_Class*  clazz;
+    TT_CMap_ClassRec* recs;
+    FT_Error          error;
+    FT_Memory memory = library->memory;
+    int i = 0;
+
+#define TTCMAPCITEM(a) i++;
+#include "ttcmapc.h"
+
+    /* allocate enough space for both the pointers +terminator and the class instances */
+    if ( FT_ALLOC( clazz, sizeof(*clazz)*(i+1)+sizeof(TT_CMap_ClassRec)*i ) )
+      return error;
+
+    /* the location of the class instances follows the array of pointers */
+    recs = (TT_CMap_ClassRec*) (((char*)clazz)+(sizeof(*clazz)*(i+1)));
+    i=0;
+
+#undef TTCMAPCITEM
+#define TTCMAPCITEM(a)           \
+    FT_Init_Class_##a(&recs[i]); \
+    clazz[i] = &recs[i];         \
+    i++;
+#include "ttcmapc.h"
+
+    clazz[i] = NULL;
+
+    *output_class = clazz;
+    return SFNT_Err_Ok;
+  }
+
+#endif /*FT_CONFIG_OPTION_PIC*/
+
+
+  /* parse the `cmap' table and build the corresponding TT_CMap objects */
+  /* in the current face                                                */
+  /*                                                                    */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_build_cmaps( TT_Face  face )
+  {
+    FT_Byte*           table = face->cmap_table;
+    FT_Byte*           limit = table + face->cmap_size;
+    FT_UInt volatile   num_cmaps;
+    FT_Byte* volatile  p     = table;
+    FT_Library         library = FT_FACE_LIBRARY( face );
+
+    FT_UNUSED( library );
+
+
+    if ( !p || p + 4 > limit )
+      return SFNT_Err_Invalid_Table;
+
+    /* only recognize format 0 */
+    if ( TT_NEXT_USHORT( p ) != 0 )
+    {
+      p -= 2;
+      FT_ERROR(( "tt_face_build_cmaps:"
+                 " unsupported `cmap' table format = %d\n",
+                 TT_PEEK_USHORT( p ) ));
+      return SFNT_Err_Invalid_Table;
+    }
+
+    num_cmaps = TT_NEXT_USHORT( p );
+#ifdef FT_MAX_CHARMAP_CACHEABLE
+    if ( num_cmaps > FT_MAX_CHARMAP_CACHEABLE )
+      FT_ERROR(( "tt_face_build_cmaps: too many cmap subtables(%d) "
+                 "subtable#%d and later are loaded but cannot be searched\n",
+                 num_cmaps, FT_MAX_CHARMAP_CACHEABLE + 1 ));
+#endif
+
+    for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- )
+    {
+      FT_CharMapRec  charmap;
+      FT_UInt32      offset;
+
+
+      charmap.platform_id = TT_NEXT_USHORT( p );
+      charmap.encoding_id = TT_NEXT_USHORT( p );
+      charmap.face        = FT_FACE( face );
+      charmap.encoding    = FT_ENCODING_NONE;  /* will be filled later */
+      offset              = TT_NEXT_ULONG( p );
+
+      if ( offset && offset <= face->cmap_size - 2 )
+      {
+        FT_Byte* volatile              cmap   = table + offset;
+        volatile FT_UInt               format = TT_PEEK_USHORT( cmap );
+        const TT_CMap_Class* volatile  pclazz = FT_TT_CMAP_CLASSES_GET;
+        TT_CMap_Class volatile         clazz;
+
+
+        for ( ; *pclazz; pclazz++ )
+        {
+          clazz = *pclazz;
+          if ( clazz->format == format )
+          {
+            volatile TT_ValidatorRec  valid;
+            volatile FT_Error         error = SFNT_Err_Ok;
+
+
+            ft_validator_init( FT_VALIDATOR( &valid ), cmap, limit,
+                               FT_VALIDATE_DEFAULT );
+
+            valid.num_glyphs = (FT_UInt)face->max_profile.numGlyphs;
+
+            if ( ft_setjmp(
+              *((ft_jmp_buf*)&FT_VALIDATOR( &valid )->jump_buffer) ) == 0 )
+            {
+              /* validate this cmap sub-table */
+              error = clazz->validate( cmap, FT_VALIDATOR( &valid ) );
+            }
+
+            if ( valid.validator.error == 0 )
+            {
+              FT_CMap  ttcmap;
+
+
+              /* It might make sense to store the single variation selector */
+              /* cmap somewhere special.  But it would have to be in the    */
+              /* public FT_FaceRec, and we can't change that.               */
+
+              if ( !FT_CMap_New( (FT_CMap_Class)clazz,
+                                 cmap, &charmap, &ttcmap ) )
+              {
+                /* it is simpler to directly set `flags' than adding */
+                /* a parameter to FT_CMap_New                        */
+                ((TT_CMap)ttcmap)->flags = (FT_Int)error;
+              }
+            }
+            else
+            {
+              FT_TRACE0(( "tt_face_build_cmaps:"
+                          " broken cmap sub-table ignored\n" ));
+            }
+            break;
+          }
+        }
+
+        if ( *pclazz == NULL )
+        {
+          FT_TRACE0(( "tt_face_build_cmaps:"
+                      " unsupported cmap sub-table ignored\n" ));
+        }
+      }
+    }
+
+    return SFNT_Err_Ok;
+  }
+
+
+  FT_LOCAL( FT_Error )
+  tt_get_cmap_info( FT_CharMap    charmap,
+                    TT_CMapInfo  *cmap_info )
+  {
+    FT_CMap        cmap  = (FT_CMap)charmap;
+    TT_CMap_Class  clazz = (TT_CMap_Class)cmap->clazz;
+
+
+    return clazz->get_cmap_info( charmap, cmap_info );
+  }
+
+
+/* END */
diff --git a/src/sfnt/ttcmap.h b/src/sfnt/ttcmap.h
new file mode 100644 (file)
index 0000000..94f7978
--- /dev/null
@@ -0,0 +1,125 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttcmap.h                                                               */
+/*                                                                         */
+/*    TrueType character mapping table (cmap) support (specification).     */
+/*                                                                         */
+/*  Copyright 2002, 2003, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTCMAP_H__
+#define __TTCMAP_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_TRUETYPE_TYPES_H
+#include FT_INTERNAL_VALIDATE_H
+#include FT_SERVICE_TT_CMAP_H
+
+FT_BEGIN_HEADER
+
+
+#define TT_CMAP_FLAG_UNSORTED     1
+#define TT_CMAP_FLAG_OVERLAPPING  2
+
+  typedef struct  TT_CMapRec_
+  {
+    FT_CMapRec  cmap;
+    FT_Byte*    data;           /* pointer to in-memory cmap table */
+    FT_Int      flags;          /* for format 4 only               */
+
+  } TT_CMapRec, *TT_CMap;
+
+  typedef const struct TT_CMap_ClassRec_*  TT_CMap_Class;
+
+
+  typedef FT_Error
+  (*TT_CMap_ValidateFunc)( FT_Byte*      data,
+                           FT_Validator  valid );
+
+  typedef struct  TT_CMap_ClassRec_
+  {
+    FT_CMap_ClassRec      clazz;
+    FT_UInt               format;
+    TT_CMap_ValidateFunc  validate;
+    TT_CMap_Info_GetFunc  get_cmap_info;
+
+  } TT_CMap_ClassRec;
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_TT_CMAP(class_, size_, init_, done_, char_index_,          \
+    char_next_, char_var_index_, char_var_default_, variant_list_,           \
+    charvariant_list_,variantchar_list_,                                     \
+    format_, validate_, get_cmap_info_)                                      \
+  FT_CALLBACK_TABLE_DEF                                                      \
+  const TT_CMap_ClassRec class_ =                                            \
+  {                                                                          \
+    {size_, init_, done_, char_index_,                                       \
+     char_next_, char_var_index_, char_var_default_, variant_list_,          \
+     charvariant_list_, variantchar_list_},                                  \
+    format_, validate_, get_cmap_info_                                       \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_TT_CMAP(class_, size_, init_, done_, char_index_,          \
+    char_next_, char_var_index_, char_var_default_, variant_list_,           \
+    charvariant_list_,variantchar_list_,                                     \
+    format_, validate_, get_cmap_info_)                                      \
+  void                                                                       \
+  FT_Init_Class_##class_( TT_CMap_ClassRec*  clazz )                         \
+  {                                                                          \
+    clazz->clazz.size = size_;                                               \
+    clazz->clazz.init = init_;                                               \
+    clazz->clazz.done = done_;                                               \
+    clazz->clazz.char_index = char_index_;                                   \
+    clazz->clazz.char_next = char_next_;                                     \
+    clazz->clazz.char_var_index = char_var_index_;                           \
+    clazz->clazz.char_var_default = char_var_default_;                       \
+    clazz->clazz.variant_list = variant_list_;                               \
+    clazz->clazz.charvariant_list = charvariant_list_;                       \
+    clazz->clazz.variantchar_list = variantchar_list_;                       \
+    clazz->format = format_;                                                 \
+    clazz->validate = validate_;                                             \
+    clazz->get_cmap_info = get_cmap_info_;                                   \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+  typedef struct  TT_ValidatorRec_
+  {
+    FT_ValidatorRec  validator;
+    FT_UInt          num_glyphs;
+
+  } TT_ValidatorRec, *TT_Validator;
+
+
+#define TT_VALIDATOR( x )          ((TT_Validator)( x ))
+#define TT_VALID_GLYPH_COUNT( x )  TT_VALIDATOR( x )->num_glyphs
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_build_cmaps( TT_Face  face );
+
+  /* used in tt-cmaps service */
+  FT_LOCAL( FT_Error )
+  tt_get_cmap_info( FT_CharMap    charmap,
+                    TT_CMapInfo  *cmap_info );
+
+
+FT_END_HEADER
+
+#endif /* __TTCMAP_H__ */
+
+
+/* END */
diff --git a/src/sfnt/ttcmapc.h b/src/sfnt/ttcmapc.h
new file mode 100644 (file)
index 0000000..4c9c6a5
--- /dev/null
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttcmapc.h                                                              */
+/*                                                                         */
+/*    TT CMAP classes definitions (specification only).                    */
+/*                                                                         */
+/*  Copyright 2009 by                                                      */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifdef TT_CONFIG_CMAP_FORMAT_0
+    TTCMAPCITEM(tt_cmap0_class_rec)
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_2
+    TTCMAPCITEM(tt_cmap2_class_rec)
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_4
+    TTCMAPCITEM(tt_cmap4_class_rec)
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_6
+    TTCMAPCITEM(tt_cmap6_class_rec)
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_8
+    TTCMAPCITEM(tt_cmap8_class_rec)
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_10
+    TTCMAPCITEM(tt_cmap10_class_rec)
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_12
+    TTCMAPCITEM(tt_cmap12_class_rec)
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_13
+    TTCMAPCITEM(tt_cmap13_class_rec)
+#endif
+
+#ifdef TT_CONFIG_CMAP_FORMAT_14
+    TTCMAPCITEM(tt_cmap14_class_rec)
+#endif
+
+  /* END */
diff --git a/src/sfnt/ttkern.c b/src/sfnt/ttkern.c
new file mode 100644 (file)
index 0000000..4688898
--- /dev/null
@@ -0,0 +1,306 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttkern.c                                                               */
+/*                                                                         */
+/*    Load the basic TrueType kerning table.  This doesn't handle          */
+/*    kerning data within the GPOS table at the moment.                    */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_TRUETYPE_TAGS_H
+#include "ttkern.h"
+
+#include "sferrors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttkern
+
+
+#undef  TT_KERN_INDEX
+#define TT_KERN_INDEX( g1, g2 )  ( ( (FT_ULong)(g1) << 16 ) | (g2) )
+
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_kern( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error   error;
+    FT_ULong   table_size;
+    FT_Byte*   p;
+    FT_Byte*   p_limit;
+    FT_UInt    nn, num_tables;
+    FT_UInt32  avail = 0, ordered = 0;
+
+
+    /* the kern table is optional; exit silently if it is missing */
+    error = face->goto_table( face, TTAG_kern, stream, &table_size );
+    if ( error )
+      goto Exit;
+
+    if ( table_size < 4 )  /* the case of a malformed table */
+    {
+      FT_ERROR(( "tt_face_load_kern:"
+                 " kerning table is too small - ignored\n" ));
+      error = SFNT_Err_Table_Missing;
+      goto Exit;
+    }
+
+    if ( FT_FRAME_EXTRACT( table_size, face->kern_table ) )
+    {
+      FT_ERROR(( "tt_face_load_kern:"
+                 " could not extract kerning table\n" ));
+      goto Exit;
+    }
+
+    face->kern_table_size = table_size;
+
+    p       = face->kern_table;
+    p_limit = p + table_size;
+
+    p         += 2; /* skip version */
+    num_tables = FT_NEXT_USHORT( p );
+
+    if ( num_tables > 32 ) /* we only support up to 32 sub-tables */
+      num_tables = 32;
+
+    for ( nn = 0; nn < num_tables; nn++ )
+    {
+      FT_UInt    num_pairs, length, coverage;
+      FT_Byte*   p_next;
+      FT_UInt32  mask = (FT_UInt32)1UL << nn;
+
+
+      if ( p + 6 > p_limit )
+        break;
+
+      p_next = p;
+
+      p += 2; /* skip version */
+      length   = FT_NEXT_USHORT( p );
+      coverage = FT_NEXT_USHORT( p );
+
+      if ( length <= 6 )
+        break;
+
+      p_next += length;
+
+      if ( p_next > p_limit )  /* handle broken table */
+        p_next = p_limit;
+
+      /* only use horizontal kerning tables */
+      if ( ( coverage & ~8 ) != 0x0001 ||
+           p + 8 > p_limit             )
+        goto NextTable;
+
+      num_pairs = FT_NEXT_USHORT( p );
+      p        += 6;
+
+      if ( ( p_next - p ) < 6 * (int)num_pairs ) /* handle broken count */
+        num_pairs = (FT_UInt)( ( p_next - p ) / 6 );
+
+      avail |= mask;
+
+      /*
+       *  Now check whether the pairs in this table are ordered.
+       *  We then can use binary search.
+       */
+      if ( num_pairs > 0 )
+      {
+        FT_ULong  count;
+        FT_ULong  old_pair;
+
+
+        old_pair = FT_NEXT_ULONG( p );
+        p       += 2;
+
+        for ( count = num_pairs - 1; count > 0; count-- )
+        {
+          FT_UInt32  cur_pair;
+
+
+          cur_pair = FT_NEXT_ULONG( p );
+          if ( cur_pair <= old_pair )
+            break;
+
+          p += 2;
+          old_pair = cur_pair;
+        }
+
+        if ( count == 0 )
+          ordered |= mask;
+      }
+
+    NextTable:
+      p = p_next;
+    }
+
+    face->num_kern_tables = nn;
+    face->kern_avail_bits = avail;
+    face->kern_order_bits = ordered;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  tt_face_done_kern( TT_Face  face )
+  {
+    FT_Stream  stream = face->root.stream;
+
+
+    FT_FRAME_RELEASE( face->kern_table );
+    face->kern_table_size = 0;
+    face->num_kern_tables = 0;
+    face->kern_avail_bits = 0;
+    face->kern_order_bits = 0;
+  }
+
+
+  FT_LOCAL_DEF( FT_Int )
+  tt_face_get_kerning( TT_Face  face,
+                       FT_UInt  left_glyph,
+                       FT_UInt  right_glyph )
+  {
+    FT_Int    result = 0;
+    FT_UInt   count, mask = 1;
+    FT_Byte*  p       = face->kern_table;
+    FT_Byte*  p_limit = p + face->kern_table_size;
+
+
+    p   += 4;
+    mask = 0x0001;
+
+    for ( count = face->num_kern_tables;
+          count > 0 && p + 6 <= p_limit;
+          count--, mask <<= 1 )
+    {
+      FT_Byte* base     = p;
+      FT_Byte* next     = base;
+      FT_UInt  version  = FT_NEXT_USHORT( p );
+      FT_UInt  length   = FT_NEXT_USHORT( p );
+      FT_UInt  coverage = FT_NEXT_USHORT( p );
+      FT_UInt  num_pairs;
+      FT_Int   value    = 0;
+
+      FT_UNUSED( version );
+
+
+      next = base + length;
+
+      if ( next > p_limit )  /* handle broken table */
+        next = p_limit;
+
+      if ( ( face->kern_avail_bits & mask ) == 0 )
+        goto NextTable;
+
+      if ( p + 8 > next )
+        goto NextTable;
+
+      num_pairs = FT_NEXT_USHORT( p );
+      p        += 6;
+
+      if ( ( next - p ) < 6 * (int)num_pairs )  /* handle broken count  */
+        num_pairs = (FT_UInt)( ( next - p ) / 6 );
+
+      switch ( coverage >> 8 )
+      {
+      case 0:
+        {
+          FT_ULong  key0 = TT_KERN_INDEX( left_glyph, right_glyph );
+
+
+          if ( face->kern_order_bits & mask )   /* binary search */
+          {
+            FT_UInt   min = 0;
+            FT_UInt   max = num_pairs;
+
+
+            while ( min < max )
+            {
+              FT_UInt   mid = ( min + max ) >> 1;
+              FT_Byte*  q   = p + 6 * mid;
+              FT_ULong  key;
+
+
+              key = FT_NEXT_ULONG( q );
+
+              if ( key == key0 )
+              {
+                value = FT_PEEK_SHORT( q );
+                goto Found;
+              }
+              if ( key < key0 )
+                min = mid + 1;
+              else
+                max = mid;
+            }
+          }
+          else /* linear search */
+          {
+            FT_UInt  count2;
+
+
+            for ( count2 = num_pairs; count2 > 0; count2-- )
+            {
+              FT_ULong  key = FT_NEXT_ULONG( p );
+
+
+              if ( key == key0 )
+              {
+                value = FT_PEEK_SHORT( p );
+                goto Found;
+              }
+              p += 2;
+            }
+          }
+        }
+        break;
+
+       /*
+        *  We don't support format 2 because we haven't seen a single font
+        *  using it in real life...
+        */
+
+      default:
+        ;
+      }
+
+      goto NextTable;
+
+    Found:
+      if ( coverage & 8 ) /* override or add */
+        result = value;
+      else
+        result += value;
+
+    NextTable:
+      p = next;
+    }
+
+    return result;
+  }
+
+#undef TT_KERN_INDEX
+
+/* END */
diff --git a/src/sfnt/ttkern.h b/src/sfnt/ttkern.h
new file mode 100644 (file)
index 0000000..df1da9b
--- /dev/null
@@ -0,0 +1,52 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttkern.h                                                               */
+/*                                                                         */
+/*    Load the basic TrueType kerning table.  This doesn't handle          */
+/*    kerning data within the GPOS table at the moment.                    */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2005, 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTKERN_H__
+#define __TTKERN_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_TRUETYPE_TYPES_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error  )
+  tt_face_load_kern( TT_Face    face,
+                     FT_Stream  stream );
+
+  FT_LOCAL( void )
+  tt_face_done_kern( TT_Face  face );
+
+  FT_LOCAL( FT_Int )
+  tt_face_get_kerning( TT_Face     face,
+                       FT_UInt     left_glyph,
+                       FT_UInt     right_glyph );
+
+#define TT_FACE_HAS_KERNING( face )  ( (face)->kern_avail_bits != 0 )
+
+
+FT_END_HEADER
+
+#endif /* __TTKERN_H__ */
+
+
+/* END */
diff --git a/src/sfnt/ttload.c b/src/sfnt/ttload.c
new file mode 100644 (file)
index 0000000..5fb9aea
--- /dev/null
@@ -0,0 +1,1267 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttload.c                                                               */
+/*                                                                         */
+/*    Load the basic TrueType tables, i.e., tables that can be either in   */
+/*    TTF or OTF fonts (body).                                             */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_TRUETYPE_TAGS_H
+#include "ttload.h"
+
+#include "sferrors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttload
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_lookup_table                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Looks for a TrueType table by name.                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A face object handle.                                      */
+  /*                                                                       */
+  /*    tag  :: The searched tag.                                          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A pointer to the table directory entry.  0 if not found.           */
+  /*                                                                       */
+  FT_LOCAL_DEF( TT_Table  )
+  tt_face_lookup_table( TT_Face   face,
+                        FT_ULong  tag  )
+  {
+    TT_Table  entry;
+    TT_Table  limit;
+#ifdef FT_DEBUG_LEVEL_TRACE
+    FT_Bool   zero_length = FALSE;
+#endif
+
+
+    FT_TRACE4(( "tt_face_lookup_table: %08p, `%c%c%c%c' -- ",
+                face,
+                (FT_Char)( tag >> 24 ),
+                (FT_Char)( tag >> 16 ),
+                (FT_Char)( tag >> 8  ),
+                (FT_Char)( tag       ) ));
+
+    entry = face->dir_tables;
+    limit = entry + face->num_tables;
+
+    for ( ; entry < limit; entry++ )
+    {
+      /* For compatibility with Windows, we consider    */
+      /* zero-length tables the same as missing tables. */
+      if ( entry->Tag == tag )
+      {
+        if ( entry->Length != 0 )
+        {
+          FT_TRACE4(( "found table.\n" ));
+          return entry;
+        }
+#ifdef FT_DEBUG_LEVEL_TRACE
+        zero_length = TRUE;
+#endif
+      }
+    }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+    if ( zero_length )
+      FT_TRACE4(( "ignoring empty table\n" ));
+    else
+      FT_TRACE4(( "could not find table\n" ));
+#endif
+
+    return NULL;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_goto_table                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Looks for a TrueType table by name, then seek a stream to it.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A face object handle.                                    */
+  /*                                                                       */
+  /*    tag    :: The searched tag.                                        */
+  /*                                                                       */
+  /*    stream :: The stream to seek when the table is found.              */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    length :: The length of the table if found, undefined otherwise.   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_goto_table( TT_Face    face,
+                      FT_ULong   tag,
+                      FT_Stream  stream,
+                      FT_ULong*  length )
+  {
+    TT_Table  table;
+    FT_Error  error;
+
+
+    table = tt_face_lookup_table( face, tag );
+    if ( table )
+    {
+      if ( length )
+        *length = table->Length;
+
+      if ( FT_STREAM_SEEK( table->Offset ) )
+        goto Exit;
+    }
+    else
+      error = SFNT_Err_Table_Missing;
+
+  Exit:
+    return error;
+  }
+
+
+  /* Here, we                                                         */
+  /*                                                                  */
+  /* - check that `num_tables' is valid (and adjust it if necessary)  */
+  /*                                                                  */
+  /* - look for a `head' table, check its size, and parse it to check */
+  /*   whether its `magic' field is correctly set                     */
+  /*                                                                  */
+  /* - errors (except errors returned by stream handling)             */
+  /*                                                                  */
+  /*     SFNT_Err_Unknown_File_Format:                                */
+  /*       no table is defined in directory, it is not sfnt-wrapped   */
+  /*       data                                                       */
+  /*     SFNT_Err_Table_Missing:                                      */
+  /*       table directory is valid, but essential tables             */
+  /*       (head/bhed/SING) are missing                               */
+  /*                                                                  */
+  static FT_Error
+  check_table_dir( SFNT_Header  sfnt,
+                   FT_Stream    stream )
+  {
+    FT_Error   error;
+    FT_UShort  nn, valid_entries = 0;
+    FT_UInt    has_head = 0, has_sing = 0, has_meta = 0;
+    FT_ULong   offset = sfnt->offset + 12;
+
+    static const FT_Frame_Field  table_dir_entry_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_TableRec
+
+      FT_FRAME_START( 16 ),
+        FT_FRAME_ULONG( Tag ),
+        FT_FRAME_ULONG( CheckSum ),
+        FT_FRAME_ULONG( Offset ),
+        FT_FRAME_ULONG( Length ),
+      FT_FRAME_END
+    };
+
+
+    if ( FT_STREAM_SEEK( offset ) )
+      goto Exit;
+
+    for ( nn = 0; nn < sfnt->num_tables; nn++ )
+    {
+      TT_TableRec  table;
+
+
+      if ( FT_STREAM_READ_FIELDS( table_dir_entry_fields, &table ) )
+      {
+        nn--;
+        FT_TRACE2(( "check_table_dir:"
+                    " can read only %d table%s in font (instead of %d)\n",
+                    nn, nn == 1 ? "" : "s", sfnt->num_tables ));
+        sfnt->num_tables = nn;
+        break;
+      }
+
+      /* we ignore invalid tables */
+      if ( table.Offset + table.Length > stream->size )
+      {
+        FT_TRACE2(( "check_table_dir: table entry %d invalid\n", nn ));
+        continue;
+      }
+      else
+        valid_entries++;
+
+      if ( table.Tag == TTAG_head || table.Tag == TTAG_bhed )
+      {
+        FT_UInt32  magic;
+
+
+#ifndef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+        if ( table.Tag == TTAG_head )
+#endif
+          has_head = 1;
+
+        /*
+         * The table length should be 0x36, but certain font tools make it
+         * 0x38, so we will just check that it is greater.
+         *
+         * Note that according to the specification, the table must be
+         * padded to 32-bit lengths, but this doesn't apply to the value of
+         * its `Length' field!
+         *
+         */
+        if ( table.Length < 0x36 )
+        {
+          FT_TRACE2(( "check_table_dir: `head' table too small\n" ));
+          error = SFNT_Err_Table_Missing;
+          goto Exit;
+        }
+
+        if ( FT_STREAM_SEEK( table.Offset + 12 ) ||
+             FT_READ_ULONG( magic )              )
+          goto Exit;
+
+        if ( magic != 0x5F0F3CF5UL )
+        {
+          FT_TRACE2(( "check_table_dir:"
+                      " no magic number found in `head' table\n"));
+          error = SFNT_Err_Table_Missing;
+          goto Exit;
+        }
+
+        if ( FT_STREAM_SEEK( offset + ( nn + 1 ) * 16 ) )
+          goto Exit;
+      }
+      else if ( table.Tag == TTAG_SING )
+        has_sing = 1;
+      else if ( table.Tag == TTAG_META )
+        has_meta = 1;
+    }
+
+    sfnt->num_tables = valid_entries;
+
+    if ( sfnt->num_tables == 0 )
+    {
+      FT_TRACE2(( "check_table_dir: no tables found\n" ));
+      error = SFNT_Err_Unknown_File_Format;
+      goto Exit;
+    }
+
+    /* if `sing' and `meta' tables are present, there is no `head' table */
+    if ( has_head || ( has_sing && has_meta ) )
+    {
+      error = SFNT_Err_Ok;
+      goto Exit;
+    }
+    else
+    {
+      FT_TRACE2(( "check_table_dir:" ));
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+      FT_TRACE2(( " neither `head', `bhed', nor `sing' table found\n" ));
+#else
+      FT_TRACE2(( " neither `head' nor `sing' table found\n" ));
+#endif
+      error = SFNT_Err_Table_Missing;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_font_dir                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the header of a SFNT font file.                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face       :: A handle to the target face object.                  */
+  /*                                                                       */
+  /*    stream     :: The input stream.                                    */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    sfnt       :: The SFNT header.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The stream cursor must be at the beginning of the font directory.  */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_font_dir( TT_Face    face,
+                         FT_Stream  stream )
+  {
+    SFNT_HeaderRec  sfnt;
+    FT_Error        error;
+    FT_Memory       memory = stream->memory;
+    TT_TableRec*    entry;
+    FT_Int          nn;
+
+    static const FT_Frame_Field  offset_table_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  SFNT_HeaderRec
+
+      FT_FRAME_START( 8 ),
+        FT_FRAME_USHORT( num_tables ),
+        FT_FRAME_USHORT( search_range ),
+        FT_FRAME_USHORT( entry_selector ),
+        FT_FRAME_USHORT( range_shift ),
+      FT_FRAME_END
+    };
+
+
+    FT_TRACE2(( "tt_face_load_font_dir: %08p\n", face ));
+
+    /* read the offset table */
+
+    sfnt.offset = FT_STREAM_POS();
+
+    if ( FT_READ_ULONG( sfnt.format_tag )                    ||
+         FT_STREAM_READ_FIELDS( offset_table_fields, &sfnt ) )
+      goto Exit;
+
+    /* many fonts don't have these fields set correctly */
+#if 0
+    if ( sfnt.search_range != 1 << ( sfnt.entry_selector + 4 )        ||
+         sfnt.search_range + sfnt.range_shift != sfnt.num_tables << 4 )
+      return SFNT_Err_Unknown_File_Format;
+#endif
+
+    /* load the table directory */
+
+    FT_TRACE2(( "-- Number of tables: %10u\n",    sfnt.num_tables ));
+    FT_TRACE2(( "-- Format version:   0x%08lx\n", sfnt.format_tag ));
+
+    /* check first */
+    error = check_table_dir( &sfnt, stream );
+    if ( error )
+    {
+      FT_TRACE2(( "tt_face_load_font_dir:"
+                  " invalid table directory for TrueType\n" ));
+
+      goto Exit;
+    }
+
+    face->num_tables = sfnt.num_tables;
+    face->format_tag = sfnt.format_tag;
+
+    if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) )
+      goto Exit;
+
+    if ( FT_STREAM_SEEK( sfnt.offset + 12 )       ||
+         FT_FRAME_ENTER( face->num_tables * 16L ) )
+      goto Exit;
+
+    entry = face->dir_tables;
+
+    FT_TRACE2(( "\n"
+                "  tag    offset    length   checksum\n"
+                "  ----------------------------------\n" ));
+
+    for ( nn = 0; nn < sfnt.num_tables; nn++ )
+    {
+      entry->Tag      = FT_GET_TAG4();
+      entry->CheckSum = FT_GET_ULONG();
+      entry->Offset   = FT_GET_LONG();
+      entry->Length   = FT_GET_LONG();
+
+      /* ignore invalid tables */
+      if ( entry->Offset + entry->Length > stream->size )
+        continue;
+      else
+      {
+        FT_TRACE2(( "  %c%c%c%c  %08lx  %08lx  %08lx\n",
+                    (FT_Char)( entry->Tag >> 24 ),
+                    (FT_Char)( entry->Tag >> 16 ),
+                    (FT_Char)( entry->Tag >> 8  ),
+                    (FT_Char)( entry->Tag       ),
+                    entry->Offset,
+                    entry->Length,
+                    entry->CheckSum ));
+        entry++;
+      }
+    }
+
+    FT_FRAME_EXIT();
+
+    FT_TRACE2(( "table directory loaded\n\n" ));
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_any                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads any font table into client memory.                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: The face object to look for.                             */
+  /*                                                                       */
+  /*    tag    :: The tag of table to load.  Use the value 0 if you want   */
+  /*              to access the whole font file, else set this parameter   */
+  /*              to a valid TrueType table tag that you can forge with    */
+  /*              the MAKE_TT_TAG macro.                                   */
+  /*                                                                       */
+  /*    offset :: The starting offset in the table (or the file if         */
+  /*              tag == 0).                                               */
+  /*                                                                       */
+  /*    length :: The address of the decision variable:                    */
+  /*                                                                       */
+  /*                If length == NULL:                                     */
+  /*                  Loads the whole table.  Returns an error if          */
+  /*                  `offset' == 0!                                       */
+  /*                                                                       */
+  /*                If *length == 0:                                       */
+  /*                  Exits immediately; returning the length of the given */
+  /*                  table or of the font file, depending on the value of */
+  /*                  `tag'.                                               */
+  /*                                                                       */
+  /*                If *length != 0:                                       */
+  /*                  Loads the next `length' bytes of table or font,      */
+  /*                  starting at offset `offset' (in table or font too).  */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    buffer :: The address of target buffer.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_any( TT_Face    face,
+                    FT_ULong   tag,
+                    FT_Long    offset,
+                    FT_Byte*   buffer,
+                    FT_ULong*  length )
+  {
+    FT_Error   error;
+    FT_Stream  stream;
+    TT_Table   table;
+    FT_ULong   size;
+
+
+    if ( tag != 0 )
+    {
+      /* look for tag in font directory */
+      table = tt_face_lookup_table( face, tag );
+      if ( !table )
+      {
+        error = SFNT_Err_Table_Missing;
+        goto Exit;
+      }
+
+      offset += table->Offset;
+      size    = table->Length;
+    }
+    else
+      /* tag == 0 -- the user wants to access the font file directly */
+      size = face->root.stream->size;
+
+    if ( length && *length == 0 )
+    {
+      *length = size;
+
+      return SFNT_Err_Ok;
+    }
+
+    if ( length )
+      size = *length;
+
+    stream = face->root.stream;
+    /* the `if' is syntactic sugar for picky compilers */
+    if ( FT_STREAM_READ_AT( offset, buffer, size ) )
+      goto Exit;
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_generic_header                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the TrueType table `head' or `bhed'.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  static FT_Error
+  tt_face_load_generic_header( TT_Face    face,
+                               FT_Stream  stream,
+                               FT_ULong   tag )
+  {
+    FT_Error    error;
+    TT_Header*  header;
+
+    static const FT_Frame_Field  header_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_Header
+
+      FT_FRAME_START( 54 ),
+        FT_FRAME_ULONG ( Table_Version ),
+        FT_FRAME_ULONG ( Font_Revision ),
+        FT_FRAME_LONG  ( CheckSum_Adjust ),
+        FT_FRAME_LONG  ( Magic_Number ),
+        FT_FRAME_USHORT( Flags ),
+        FT_FRAME_USHORT( Units_Per_EM ),
+        FT_FRAME_LONG  ( Created[0] ),
+        FT_FRAME_LONG  ( Created[1] ),
+        FT_FRAME_LONG  ( Modified[0] ),
+        FT_FRAME_LONG  ( Modified[1] ),
+        FT_FRAME_SHORT ( xMin ),
+        FT_FRAME_SHORT ( yMin ),
+        FT_FRAME_SHORT ( xMax ),
+        FT_FRAME_SHORT ( yMax ),
+        FT_FRAME_USHORT( Mac_Style ),
+        FT_FRAME_USHORT( Lowest_Rec_PPEM ),
+        FT_FRAME_SHORT ( Font_Direction ),
+        FT_FRAME_SHORT ( Index_To_Loc_Format ),
+        FT_FRAME_SHORT ( Glyph_Data_Format ),
+      FT_FRAME_END
+    };
+
+
+    error = face->goto_table( face, tag, stream, 0 );
+    if ( error )
+      goto Exit;
+
+    header = &face->header;
+
+    if ( FT_STREAM_READ_FIELDS( header_fields, header ) )
+      goto Exit;
+
+    FT_TRACE3(( "Units per EM: %4u\n", header->Units_Per_EM ));
+    FT_TRACE3(( "IndexToLoc:   %4d\n", header->Index_To_Loc_Format ));
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_head( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    return tt_face_load_generic_header( face, stream, TTAG_head );
+  }
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_bhed( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    return tt_face_load_generic_header( face, stream, TTAG_bhed );
+  }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_max_profile                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the maximum profile into a face object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_maxp( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error        error;
+    TT_MaxProfile*  maxProfile = &face->max_profile;
+
+    const FT_Frame_Field  maxp_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_MaxProfile
+
+      FT_FRAME_START( 6 ),
+        FT_FRAME_LONG  ( version ),
+        FT_FRAME_USHORT( numGlyphs ),
+      FT_FRAME_END
+    };
+
+    const FT_Frame_Field  maxp_fields_extra[] =
+    {
+      FT_FRAME_START( 26 ),
+        FT_FRAME_USHORT( maxPoints ),
+        FT_FRAME_USHORT( maxContours ),
+        FT_FRAME_USHORT( maxCompositePoints ),
+        FT_FRAME_USHORT( maxCompositeContours ),
+        FT_FRAME_USHORT( maxZones ),
+        FT_FRAME_USHORT( maxTwilightPoints ),
+        FT_FRAME_USHORT( maxStorage ),
+        FT_FRAME_USHORT( maxFunctionDefs ),
+        FT_FRAME_USHORT( maxInstructionDefs ),
+        FT_FRAME_USHORT( maxStackElements ),
+        FT_FRAME_USHORT( maxSizeOfInstructions ),
+        FT_FRAME_USHORT( maxComponentElements ),
+        FT_FRAME_USHORT( maxComponentDepth ),
+      FT_FRAME_END
+    };
+
+
+    error = face->goto_table( face, TTAG_maxp, stream, 0 );
+    if ( error )
+      goto Exit;
+
+    if ( FT_STREAM_READ_FIELDS( maxp_fields, maxProfile ) )
+      goto Exit;
+
+    maxProfile->maxPoints             = 0;
+    maxProfile->maxContours           = 0;
+    maxProfile->maxCompositePoints    = 0;
+    maxProfile->maxCompositeContours  = 0;
+    maxProfile->maxZones              = 0;
+    maxProfile->maxTwilightPoints     = 0;
+    maxProfile->maxStorage            = 0;
+    maxProfile->maxFunctionDefs       = 0;
+    maxProfile->maxInstructionDefs    = 0;
+    maxProfile->maxStackElements      = 0;
+    maxProfile->maxSizeOfInstructions = 0;
+    maxProfile->maxComponentElements  = 0;
+    maxProfile->maxComponentDepth     = 0;
+
+    if ( maxProfile->version >= 0x10000L )
+    {
+      if ( FT_STREAM_READ_FIELDS( maxp_fields_extra, maxProfile ) )
+        goto Exit;
+
+      /* XXX: an adjustment that is necessary to load certain */
+      /*      broken fonts like `Keystrokes MT' :-(           */
+      /*                                                      */
+      /*   We allocate 64 function entries by default when    */
+      /*   the maxFunctionDefs value is smaller.              */
+
+      if ( maxProfile->maxFunctionDefs < 64 )
+        maxProfile->maxFunctionDefs = 64;
+
+      /* we add 4 phantom points later */
+      if ( maxProfile->maxTwilightPoints > ( 0xFFFFU - 4 ) )
+      {
+        FT_TRACE0(( "tt_face_load_maxp:"
+                    " too much twilight points in `maxp' table;\n"
+                    "                  "
+                    " some glyphs might be rendered incorrectly\n" ));
+
+        maxProfile->maxTwilightPoints = 0xFFFFU - 4;
+      }
+
+      /* we arbitrarily limit recursion to avoid stack exhaustion */
+      if ( maxProfile->maxComponentDepth > 100 )
+      {
+        FT_TRACE0(( "tt_face_load_maxp:"
+                    " abnormally large component depth (%d) set to 100\n",
+                    maxProfile->maxComponentDepth ));
+        maxProfile->maxComponentDepth = 100;
+      }
+    }
+
+    FT_TRACE3(( "numGlyphs: %u\n", maxProfile->numGlyphs ));
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_names                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the name records.                                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_name( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error      error;
+    FT_Memory     memory = stream->memory;
+    FT_ULong      table_pos, table_len;
+    FT_ULong      storage_start, storage_limit;
+    FT_UInt       count;
+    TT_NameTable  table;
+
+    static const FT_Frame_Field  name_table_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_NameTableRec
+
+      FT_FRAME_START( 6 ),
+        FT_FRAME_USHORT( format ),
+        FT_FRAME_USHORT( numNameRecords ),
+        FT_FRAME_USHORT( storageOffset ),
+      FT_FRAME_END
+    };
+
+    static const FT_Frame_Field  name_record_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_NameEntryRec
+
+      /* no FT_FRAME_START */
+        FT_FRAME_USHORT( platformID ),
+        FT_FRAME_USHORT( encodingID ),
+        FT_FRAME_USHORT( languageID ),
+        FT_FRAME_USHORT( nameID ),
+        FT_FRAME_USHORT( stringLength ),
+        FT_FRAME_USHORT( stringOffset ),
+      FT_FRAME_END
+    };
+
+
+    table         = &face->name_table;
+    table->stream = stream;
+
+    error = face->goto_table( face, TTAG_name, stream, &table_len );
+    if ( error )
+      goto Exit;
+
+    table_pos = FT_STREAM_POS();
+
+
+    if ( FT_STREAM_READ_FIELDS( name_table_fields, table ) )
+      goto Exit;
+
+    /* Some popular Asian fonts have an invalid `storageOffset' value   */
+    /* (it should be at least "6 + 12*num_names").  However, the string */
+    /* offsets, computed as "storageOffset + entry->stringOffset", are  */
+    /* valid pointers within the name table...                          */
+    /*                                                                  */
+    /* We thus can't check `storageOffset' right now.                   */
+    /*                                                                  */
+    storage_start = table_pos + 6 + 12*table->numNameRecords;
+    storage_limit = table_pos + table_len;
+
+    if ( storage_start > storage_limit )
+    {
+      FT_ERROR(( "tt_face_load_name: invalid `name' table\n" ));
+      error = SFNT_Err_Name_Table_Missing;
+      goto Exit;
+    }
+
+    /* Allocate the array of name records. */
+    count                 = table->numNameRecords;
+    table->numNameRecords = 0;
+
+    if ( FT_NEW_ARRAY( table->names, count ) ||
+         FT_FRAME_ENTER( count * 12 )        )
+      goto Exit;
+
+    /* Load the name records and determine how much storage is needed */
+    /* to hold the strings themselves.                                */
+    {
+      TT_NameEntryRec*  entry = table->names;
+
+
+      for ( ; count > 0; count-- )
+      {
+        if ( FT_STREAM_READ_FIELDS( name_record_fields, entry ) )
+          continue;
+
+        /* check that the name is not empty */
+        if ( entry->stringLength == 0 )
+          continue;
+
+        /* check that the name string is within the table */
+        entry->stringOffset += table_pos + table->storageOffset;
+        if ( entry->stringOffset                       < storage_start ||
+             entry->stringOffset + entry->stringLength > storage_limit )
+        {
+          /* invalid entry - ignore it */
+          entry->stringOffset = 0;
+          entry->stringLength = 0;
+          continue;
+        }
+
+        entry++;
+      }
+
+      table->numNameRecords = (FT_UInt)( entry - table->names );
+    }
+
+    FT_FRAME_EXIT();
+
+    /* everything went well, update face->num_names */
+    face->num_names = (FT_UShort) table->numNameRecords;
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_free_names                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Frees the name records.                                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the target face object.                        */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  tt_face_free_name( TT_Face  face )
+  {
+    FT_Memory     memory = face->root.driver->root.memory;
+    TT_NameTable  table  = &face->name_table;
+    TT_NameEntry  entry  = table->names;
+    FT_UInt       count  = table->numNameRecords;
+
+
+    if ( table->names )
+    {
+      for ( ; count > 0; count--, entry++ )
+      {
+        FT_FREE( entry->string );
+        entry->stringLength = 0;
+      }
+
+      /* free strings table */
+      FT_FREE( table->names );
+    }
+
+    table->numNameRecords = 0;
+    table->format         = 0;
+    table->storageOffset  = 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_cmap                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the cmap directory in a face object.  The cmaps themselves   */
+  /*    are loaded on demand in the `ttcmap.c' module.                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: A handle to the input stream.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_cmap( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error  error;
+
+
+    error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size );
+    if ( error )
+      goto Exit;
+
+    if ( FT_FRAME_EXTRACT( face->cmap_size, face->cmap_table ) )
+      face->cmap_size = 0;
+
+  Exit:
+    return error;
+  }
+
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_os2                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the OS2 table.                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: A handle to the input stream.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_os2( TT_Face    face,
+                    FT_Stream  stream )
+  {
+    FT_Error  error;
+    TT_OS2*   os2;
+
+    const FT_Frame_Field  os2_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_OS2
+
+      FT_FRAME_START( 78 ),
+        FT_FRAME_USHORT( version ),
+        FT_FRAME_SHORT ( xAvgCharWidth ),
+        FT_FRAME_USHORT( usWeightClass ),
+        FT_FRAME_USHORT( usWidthClass ),
+        FT_FRAME_SHORT ( fsType ),
+        FT_FRAME_SHORT ( ySubscriptXSize ),
+        FT_FRAME_SHORT ( ySubscriptYSize ),
+        FT_FRAME_SHORT ( ySubscriptXOffset ),
+        FT_FRAME_SHORT ( ySubscriptYOffset ),
+        FT_FRAME_SHORT ( ySuperscriptXSize ),
+        FT_FRAME_SHORT ( ySuperscriptYSize ),
+        FT_FRAME_SHORT ( ySuperscriptXOffset ),
+        FT_FRAME_SHORT ( ySuperscriptYOffset ),
+        FT_FRAME_SHORT ( yStrikeoutSize ),
+        FT_FRAME_SHORT ( yStrikeoutPosition ),
+        FT_FRAME_SHORT ( sFamilyClass ),
+        FT_FRAME_BYTE  ( panose[0] ),
+        FT_FRAME_BYTE  ( panose[1] ),
+        FT_FRAME_BYTE  ( panose[2] ),
+        FT_FRAME_BYTE  ( panose[3] ),
+        FT_FRAME_BYTE  ( panose[4] ),
+        FT_FRAME_BYTE  ( panose[5] ),
+        FT_FRAME_BYTE  ( panose[6] ),
+        FT_FRAME_BYTE  ( panose[7] ),
+        FT_FRAME_BYTE  ( panose[8] ),
+        FT_FRAME_BYTE  ( panose[9] ),
+        FT_FRAME_ULONG ( ulUnicodeRange1 ),
+        FT_FRAME_ULONG ( ulUnicodeRange2 ),
+        FT_FRAME_ULONG ( ulUnicodeRange3 ),
+        FT_FRAME_ULONG ( ulUnicodeRange4 ),
+        FT_FRAME_BYTE  ( achVendID[0] ),
+        FT_FRAME_BYTE  ( achVendID[1] ),
+        FT_FRAME_BYTE  ( achVendID[2] ),
+        FT_FRAME_BYTE  ( achVendID[3] ),
+
+        FT_FRAME_USHORT( fsSelection ),
+        FT_FRAME_USHORT( usFirstCharIndex ),
+        FT_FRAME_USHORT( usLastCharIndex ),
+        FT_FRAME_SHORT ( sTypoAscender ),
+        FT_FRAME_SHORT ( sTypoDescender ),
+        FT_FRAME_SHORT ( sTypoLineGap ),
+        FT_FRAME_USHORT( usWinAscent ),
+        FT_FRAME_USHORT( usWinDescent ),
+      FT_FRAME_END
+    };
+
+    const FT_Frame_Field  os2_fields_extra[] =
+    {
+      FT_FRAME_START( 8 ),
+        FT_FRAME_ULONG( ulCodePageRange1 ),
+        FT_FRAME_ULONG( ulCodePageRange2 ),
+      FT_FRAME_END
+    };
+
+    const FT_Frame_Field  os2_fields_extra2[] =
+    {
+      FT_FRAME_START( 10 ),
+        FT_FRAME_SHORT ( sxHeight ),
+        FT_FRAME_SHORT ( sCapHeight ),
+        FT_FRAME_USHORT( usDefaultChar ),
+        FT_FRAME_USHORT( usBreakChar ),
+        FT_FRAME_USHORT( usMaxContext ),
+      FT_FRAME_END
+    };
+
+
+    /* We now support old Mac fonts where the OS/2 table doesn't  */
+    /* exist.  Simply put, we set the `version' field to 0xFFFF   */
+    /* and test this value each time we need to access the table. */
+    error = face->goto_table( face, TTAG_OS2, stream, 0 );
+    if ( error )
+      goto Exit;
+
+    os2 = &face->os2;
+
+    if ( FT_STREAM_READ_FIELDS( os2_fields, os2 ) )
+      goto Exit;
+
+    os2->ulCodePageRange1 = 0;
+    os2->ulCodePageRange2 = 0;
+    os2->sxHeight         = 0;
+    os2->sCapHeight       = 0;
+    os2->usDefaultChar    = 0;
+    os2->usBreakChar      = 0;
+    os2->usMaxContext     = 0;
+
+    if ( os2->version >= 0x0001 )
+    {
+      /* only version 1 tables */
+      if ( FT_STREAM_READ_FIELDS( os2_fields_extra, os2 ) )
+        goto Exit;
+
+      if ( os2->version >= 0x0002 )
+      {
+        /* only version 2 tables */
+        if ( FT_STREAM_READ_FIELDS( os2_fields_extra2, os2 ) )
+          goto Exit;
+      }
+    }
+
+    FT_TRACE3(( "sTypoAscender:  %4d\n",   os2->sTypoAscender ));
+    FT_TRACE3(( "sTypoDescender: %4d\n",   os2->sTypoDescender ));
+    FT_TRACE3(( "usWinAscent:    %4u\n",   os2->usWinAscent ));
+    FT_TRACE3(( "usWinDescent:   %4u\n",   os2->usWinDescent ));
+    FT_TRACE3(( "fsSelection:    0x%2x\n", os2->fsSelection ));
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_postscript                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the Postscript table.                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: A handle to the input stream.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_post( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error        error;
+    TT_Postscript*  post = &face->postscript;
+
+    static const FT_Frame_Field  post_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_Postscript
+
+      FT_FRAME_START( 32 ),
+        FT_FRAME_ULONG( FormatType ),
+        FT_FRAME_ULONG( italicAngle ),
+        FT_FRAME_SHORT( underlinePosition ),
+        FT_FRAME_SHORT( underlineThickness ),
+        FT_FRAME_ULONG( isFixedPitch ),
+        FT_FRAME_ULONG( minMemType42 ),
+        FT_FRAME_ULONG( maxMemType42 ),
+        FT_FRAME_ULONG( minMemType1 ),
+        FT_FRAME_ULONG( maxMemType1 ),
+      FT_FRAME_END
+    };
+
+
+    error = face->goto_table( face, TTAG_post, stream, 0 );
+    if ( error )
+      return error;
+
+    if ( FT_STREAM_READ_FIELDS( post_fields, post ) )
+      return error;
+
+    /* we don't load the glyph names, we do that in another */
+    /* module (ttpost).                                     */
+
+    FT_TRACE3(( "FormatType:   0x%x\n", post->FormatType ));
+    FT_TRACE3(( "isFixedPitch:   %s\n", post->isFixedPitch
+                                        ? "  yes" : "   no" ));
+
+    return SFNT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_pclt                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the PCL 5 Table.                                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: A handle to the input stream.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_pclt( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    static const FT_Frame_Field  pclt_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_PCLT
+
+      FT_FRAME_START( 54 ),
+        FT_FRAME_ULONG ( Version ),
+        FT_FRAME_ULONG ( FontNumber ),
+        FT_FRAME_USHORT( Pitch ),
+        FT_FRAME_USHORT( xHeight ),
+        FT_FRAME_USHORT( Style ),
+        FT_FRAME_USHORT( TypeFamily ),
+        FT_FRAME_USHORT( CapHeight ),
+        FT_FRAME_BYTES ( TypeFace, 16 ),
+        FT_FRAME_BYTES ( CharacterComplement, 8 ),
+        FT_FRAME_BYTES ( FileName, 6 ),
+        FT_FRAME_CHAR  ( StrokeWeight ),
+        FT_FRAME_CHAR  ( WidthType ),
+        FT_FRAME_BYTE  ( SerifStyle ),
+        FT_FRAME_BYTE  ( Reserved ),
+      FT_FRAME_END
+    };
+
+    FT_Error  error;
+    TT_PCLT*  pclt = &face->pclt;
+
+
+    /* optional table */
+    error = face->goto_table( face, TTAG_PCLT, stream, 0 );
+    if ( error )
+      goto Exit;
+
+    if ( FT_STREAM_READ_FIELDS( pclt_fields, pclt ) )
+      goto Exit;
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_gasp                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the `gasp' table into a face object.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_gasp( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error   error;
+    FT_Memory  memory = stream->memory;
+
+    FT_UInt        j,num_ranges;
+    TT_GaspRange   gaspranges = NULL;
+
+
+    /* the gasp table is optional */
+    error = face->goto_table( face, TTAG_gasp, stream, 0 );
+    if ( error )
+      goto Exit;
+
+    if ( FT_FRAME_ENTER( 4L ) )
+      goto Exit;
+
+    face->gasp.version   = FT_GET_USHORT();
+    face->gasp.numRanges = FT_GET_USHORT();
+
+    FT_FRAME_EXIT();
+
+    /* only support versions 0 and 1 of the table */
+    if ( face->gasp.version >= 2 )
+    {
+      face->gasp.numRanges = 0;
+      error = SFNT_Err_Invalid_Table;
+      goto Exit;
+    }
+
+    num_ranges = face->gasp.numRanges;
+    FT_TRACE3(( "numRanges: %u\n", num_ranges ));
+
+    if ( FT_QNEW_ARRAY( gaspranges, num_ranges ) ||
+         FT_FRAME_ENTER( num_ranges * 4L )      )
+      goto Exit;
+
+    face->gasp.gaspRanges = gaspranges;
+
+    for ( j = 0; j < num_ranges; j++ )
+    {
+      gaspranges[j].maxPPEM  = FT_GET_USHORT();
+      gaspranges[j].gaspFlag = FT_GET_USHORT();
+
+      FT_TRACE3(( "gaspRange %d: rangeMaxPPEM %5d, rangeGaspBehavior 0x%x\n",
+                  j,
+                  gaspranges[j].maxPPEM,
+                  gaspranges[j].gaspFlag ));
+    }
+
+    FT_FRAME_EXIT();
+
+  Exit:
+    return error;
+  }
+
+
+/* END */
diff --git a/src/sfnt/ttload.h b/src/sfnt/ttload.h
new file mode 100644 (file)
index 0000000..49a1aee
--- /dev/null
@@ -0,0 +1,112 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttload.h                                                               */
+/*                                                                         */
+/*    Load the basic TrueType tables, i.e., tables that can be either in   */
+/*    TTF or OTF fonts (specification).                                    */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2005, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTLOAD_H__
+#define __TTLOAD_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_TRUETYPE_TYPES_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( TT_Table  )
+  tt_face_lookup_table( TT_Face   face,
+                        FT_ULong  tag );
+
+  FT_LOCAL( FT_Error )
+  tt_face_goto_table( TT_Face    face,
+                      FT_ULong   tag,
+                      FT_Stream  stream,
+                      FT_ULong*  length );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_font_dir( TT_Face    face,
+                         FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_any( TT_Face    face,
+                    FT_ULong   tag,
+                    FT_Long    offset,
+                    FT_Byte*   buffer,
+                    FT_ULong*  length );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_head( TT_Face    face,
+                     FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_cmap( TT_Face    face,
+                     FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_maxp( TT_Face    face,
+                     FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_name( TT_Face    face,
+                     FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_os2( TT_Face    face,
+                    FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_post( TT_Face    face,
+                     FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_pclt( TT_Face    face,
+                     FT_Stream  stream );
+
+  FT_LOCAL( void )
+  tt_face_free_name( TT_Face  face );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_gasp( TT_Face    face,
+                     FT_Stream  stream );
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_bhed( TT_Face    face,
+                     FT_Stream  stream );
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+FT_END_HEADER
+
+#endif /* __TTLOAD_H__ */
+
+
+/* END */
diff --git a/src/sfnt/ttmtx.c b/src/sfnt/ttmtx.c
new file mode 100644 (file)
index 0000000..73ac8b2
--- /dev/null
@@ -0,0 +1,468 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttmtx.c                                                                */
+/*                                                                         */
+/*    Load the metrics tables common to TTF and OTF fonts (body).          */
+/*                                                                         */
+/*  Copyright 2006-2009, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_TRUETYPE_TAGS_H
+#include "ttmtx.h"
+
+#include "sferrors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttmtx
+
+
+  /*
+   *  Unfortunately, we can't enable our memory optimizations if
+   *  FT_CONFIG_OPTION_OLD_INTERNALS is defined.  This is because at least
+   *  one rogue client (libXfont in the X.Org XServer) is directly accessing
+   *  the metrics.
+   */
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_hmtx                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the `hmtx' or `vmtx' table into a face object.                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face     :: A handle to the target face object.                    */
+  /*                                                                       */
+  /*    stream   :: The input stream.                                      */
+  /*                                                                       */
+  /*    vertical :: A boolean flag.  If set, load `vmtx'.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_hmtx( TT_Face    face,
+                     FT_Stream  stream,
+                     FT_Bool    vertical )
+  {
+    FT_Error   error;
+    FT_ULong   tag, table_size;
+    FT_ULong*  ptable_offset;
+    FT_ULong*  ptable_size;
+
+
+    if ( vertical )
+    {
+      tag           = TTAG_vmtx;
+      ptable_offset = &face->vert_metrics_offset;
+      ptable_size   = &face->vert_metrics_size;
+    }
+    else
+    {
+      tag           = TTAG_hmtx;
+      ptable_offset = &face->horz_metrics_offset;
+      ptable_size   = &face->horz_metrics_size;
+    }
+
+    error = face->goto_table( face, tag, stream, &table_size );
+    if ( error )
+      goto Fail;
+
+    *ptable_size   = table_size;
+    *ptable_offset = FT_STREAM_POS();
+
+  Fail:
+    return error;
+  }
+
+#else /* !FT_CONFIG_OPTION_OLD_INTERNALS */
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_hmtx( TT_Face    face,
+                     FT_Stream  stream,
+                     FT_Bool    vertical )
+  {
+    FT_Error   error;
+    FT_Memory  memory = stream->memory;
+
+    FT_ULong   table_len;
+    FT_Long    num_shorts, num_longs, num_shorts_checked;
+
+    TT_LongMetrics*    longs;
+    TT_ShortMetrics**  shorts;
+    FT_Byte*           p;
+
+
+    if ( vertical )
+    {
+      void*   lm = &face->vertical.long_metrics;
+      void**  sm = &face->vertical.short_metrics;
+
+
+      error = face->goto_table( face, TTAG_vmtx, stream, &table_len );
+      if ( error )
+        goto Fail;
+
+      num_longs = face->vertical.number_Of_VMetrics;
+      if ( (FT_ULong)num_longs > table_len / 4 )
+        num_longs = (FT_Long)( table_len / 4 );
+
+      face->vertical.number_Of_VMetrics = 0;
+
+      longs  = (TT_LongMetrics*)lm;
+      shorts = (TT_ShortMetrics**)sm;
+    }
+    else
+    {
+      void*   lm = &face->horizontal.long_metrics;
+      void**  sm = &face->horizontal.short_metrics;
+
+
+      error = face->goto_table( face, TTAG_hmtx, stream, &table_len );
+      if ( error )
+        goto Fail;
+
+      num_longs = face->horizontal.number_Of_HMetrics;
+      if ( (FT_ULong)num_longs > table_len / 4 )
+        num_longs = (FT_Long)( table_len / 4 );
+
+      face->horizontal.number_Of_HMetrics = 0;
+
+      longs  = (TT_LongMetrics*)lm;
+      shorts = (TT_ShortMetrics**)sm;
+    }
+
+    /* never trust derived values */
+
+    num_shorts         = face->max_profile.numGlyphs - num_longs;
+    num_shorts_checked = ( table_len - num_longs * 4L ) / 2;
+
+    if ( num_shorts < 0 )
+    {
+      FT_TRACE0(( "tt_face_load_hmtx:"
+                  " %cmtx has more metrics than glyphs.\n",
+                  vertical ? 'v' : 'h' ));
+
+      /* Adobe simply ignores this problem.  So we shall do the same. */
+#if 0
+      error = vertical ? SFNT_Err_Invalid_Vert_Metrics
+                       : SFNT_Err_Invalid_Horiz_Metrics;
+      goto Exit;
+#else
+      num_shorts = 0;
+#endif
+    }
+
+    if ( FT_QNEW_ARRAY( *longs,  num_longs  ) ||
+         FT_QNEW_ARRAY( *shorts, num_shorts ) )
+      goto Fail;
+
+    if ( FT_FRAME_ENTER( table_len ) )
+      goto Fail;
+
+    p = stream->cursor;
+
+    {
+      TT_LongMetrics  cur   = *longs;
+      TT_LongMetrics  limit = cur + num_longs;
+
+
+      for ( ; cur < limit; cur++ )
+      {
+        cur->advance = FT_NEXT_USHORT( p );
+        cur->bearing = FT_NEXT_SHORT( p );
+      }
+    }
+
+    /* do we have an inconsistent number of metric values? */
+    {
+      TT_ShortMetrics*  cur   = *shorts;
+      TT_ShortMetrics*  limit = cur +
+                                FT_MIN( num_shorts, num_shorts_checked );
+
+
+      for ( ; cur < limit; cur++ )
+        *cur = FT_NEXT_SHORT( p );
+
+      /* We fill up the missing left side bearings with the     */
+      /* last valid value.  Since this will occur for buggy CJK */
+      /* fonts usually only, nothing serious will happen.       */
+      if ( num_shorts > num_shorts_checked && num_shorts_checked > 0 )
+      {
+        FT_Short  val = (*shorts)[num_shorts_checked - 1];
+
+
+        limit = *shorts + num_shorts;
+        for ( ; cur < limit; cur++ )
+          *cur = val;
+      }
+    }
+
+    FT_FRAME_EXIT();
+
+    if ( vertical )
+      face->vertical.number_Of_VMetrics = (FT_UShort)num_longs;
+    else
+      face->horizontal.number_Of_HMetrics = (FT_UShort)num_longs;
+
+  Fail:
+    return error;
+  }
+
+#endif /* !FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_hhea                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the `hhea' or 'vhea' table into a face object.                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face     :: A handle to the target face object.                    */
+  /*                                                                       */
+  /*    stream   :: The input stream.                                      */
+  /*                                                                       */
+  /*    vertical :: A boolean flag.  If set, load `vhea'.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_hhea( TT_Face    face,
+                     FT_Stream  stream,
+                     FT_Bool    vertical )
+  {
+    FT_Error        error;
+    TT_HoriHeader*  header;
+
+    const FT_Frame_Field  metrics_header_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_HoriHeader
+
+      FT_FRAME_START( 36 ),
+        FT_FRAME_ULONG ( Version ),
+        FT_FRAME_SHORT ( Ascender ),
+        FT_FRAME_SHORT ( Descender ),
+        FT_FRAME_SHORT ( Line_Gap ),
+        FT_FRAME_USHORT( advance_Width_Max ),
+        FT_FRAME_SHORT ( min_Left_Side_Bearing ),
+        FT_FRAME_SHORT ( min_Right_Side_Bearing ),
+        FT_FRAME_SHORT ( xMax_Extent ),
+        FT_FRAME_SHORT ( caret_Slope_Rise ),
+        FT_FRAME_SHORT ( caret_Slope_Run ),
+        FT_FRAME_SHORT ( caret_Offset ),
+        FT_FRAME_SHORT ( Reserved[0] ),
+        FT_FRAME_SHORT ( Reserved[1] ),
+        FT_FRAME_SHORT ( Reserved[2] ),
+        FT_FRAME_SHORT ( Reserved[3] ),
+        FT_FRAME_SHORT ( metric_Data_Format ),
+        FT_FRAME_USHORT( number_Of_HMetrics ),
+      FT_FRAME_END
+    };
+
+
+    if ( vertical )
+    {
+      void  *v = &face->vertical;
+
+
+      error = face->goto_table( face, TTAG_vhea, stream, 0 );
+      if ( error )
+        goto Fail;
+
+      header = (TT_HoriHeader*)v;
+    }
+    else
+    {
+      error = face->goto_table( face, TTAG_hhea, stream, 0 );
+      if ( error )
+        goto Fail;
+
+      header = &face->horizontal;
+    }
+
+    if ( FT_STREAM_READ_FIELDS( metrics_header_fields, header ) )
+      goto Fail;
+
+    FT_TRACE3(( "Ascender:          %5d\n", header->Ascender ));
+    FT_TRACE3(( "Descender:         %5d\n", header->Descender ));
+    FT_TRACE3(( "number_Of_Metrics: %5u\n", header->number_Of_HMetrics ));
+
+    header->long_metrics  = NULL;
+    header->short_metrics = NULL;
+
+  Fail:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_get_metrics                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Returns the horizontal or vertical metrics in font units for a     */
+  /*    given glyph.  The metrics are the left side bearing (resp. top     */
+  /*    side bearing) and advance width (resp. advance height).            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    header  :: A pointer to either the horizontal or vertical metrics  */
+  /*               structure.                                              */
+  /*                                                                       */
+  /*    idx     :: The glyph index.                                        */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    bearing :: The bearing, either left side or top side.              */
+  /*                                                                       */
+  /*    advance :: The advance width resp. advance height.                 */
+  /*                                                                       */
+#ifndef FT_CONFIG_OPTION_OLD_INTERNALS
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_get_metrics( TT_Face     face,
+                       FT_Bool     vertical,
+                       FT_UInt     gindex,
+                       FT_Short   *abearing,
+                       FT_UShort  *aadvance )
+  {
+    FT_Error        error;
+    FT_Stream       stream = face->root.stream;
+    TT_HoriHeader*  header;
+    FT_ULong        table_pos, table_size, table_end;
+    FT_UShort       k;
+
+
+    if ( vertical )
+    {
+      void*  v = &face->vertical;
+
+
+      header     = (TT_HoriHeader*)v;
+      table_pos  = face->vert_metrics_offset;
+      table_size = face->vert_metrics_size;
+    }
+    else
+    {
+      header     = &face->horizontal;
+      table_pos  = face->horz_metrics_offset;
+      table_size = face->horz_metrics_size;
+    }
+
+    table_end = table_pos + table_size;
+
+    k = header->number_Of_HMetrics;
+
+    if ( k > 0 )
+    {
+      if ( gindex < (FT_UInt)k )
+      {
+        table_pos += 4 * gindex;
+        if ( table_pos + 4 > table_end )
+          goto NoData;
+
+        if ( FT_STREAM_SEEK( table_pos ) ||
+             FT_READ_USHORT( *aadvance ) ||
+             FT_READ_SHORT( *abearing )  )
+          goto NoData;
+      }
+      else
+      {
+        table_pos += 4 * ( k - 1 );
+        if ( table_pos + 4 > table_end )
+          goto NoData;
+
+        if ( FT_STREAM_SEEK( table_pos ) ||
+             FT_READ_USHORT( *aadvance ) )
+          goto NoData;
+
+        table_pos += 4 + 2 * ( gindex - k );
+        if ( table_pos + 2 > table_end )
+          *abearing = 0;
+        else
+        {
+          if ( !FT_STREAM_SEEK( table_pos ) )
+            (void)FT_READ_SHORT( *abearing );
+        }
+      }
+    }
+    else
+    {
+    NoData:
+      *abearing = 0;
+      *aadvance = 0;
+    }
+
+    return SFNT_Err_Ok;
+  }
+
+#else /* !FT_CONFIG_OPTION_OLD_INTERNALS */
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_get_metrics( TT_Face     face,
+                       FT_Bool     vertical,
+                       FT_UInt     gindex,
+                       FT_Short*   abearing,
+                       FT_UShort*  aadvance )
+  {
+    void*           v = &face->vertical;
+    void*           h = &face->horizontal;
+    TT_HoriHeader*  header = vertical ? (TT_HoriHeader*)v
+                                      : (TT_HoriHeader*)h;
+    TT_LongMetrics  longs_m;
+    FT_UShort       k = header->number_Of_HMetrics;
+
+
+    if ( k == 0                                         ||
+         !header->long_metrics                          ||
+         gindex >= (FT_UInt)face->max_profile.numGlyphs )
+    {
+      *abearing = *aadvance = 0;
+      return SFNT_Err_Ok;
+    }
+
+    if ( gindex < (FT_UInt)k )
+    {
+      longs_m   = (TT_LongMetrics)header->long_metrics + gindex;
+      *abearing = longs_m->bearing;
+      *aadvance = longs_m->advance;
+    }
+    else
+    {
+      *abearing = ((TT_ShortMetrics*)header->short_metrics)[gindex - k];
+      *aadvance = ((TT_LongMetrics)header->long_metrics)[k - 1].advance;
+    }
+
+    return SFNT_Err_Ok;
+  }
+
+#endif /* !FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+/* END */
diff --git a/src/sfnt/ttmtx.h b/src/sfnt/ttmtx.h
new file mode 100644 (file)
index 0000000..8b91a11
--- /dev/null
@@ -0,0 +1,55 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttmtx.h                                                                */
+/*                                                                         */
+/*    Load the metrics tables common to TTF and OTF fonts (specification). */
+/*                                                                         */
+/*  Copyright 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTMTX_H__
+#define __TTMTX_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_TRUETYPE_TYPES_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_hhea( TT_Face    face,
+                     FT_Stream  stream,
+                     FT_Bool    vertical );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_hmtx( TT_Face    face,
+                     FT_Stream  stream,
+                     FT_Bool    vertical );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_get_metrics( TT_Face     face,
+                       FT_Bool     vertical,
+                       FT_UInt     gindex,
+                       FT_Short*   abearing,
+                       FT_UShort*  aadvance );
+
+FT_END_HEADER
+
+#endif /* __TTMTX_H__ */
+
+
+/* END */
diff --git a/src/sfnt/ttpost.c b/src/sfnt/ttpost.c
new file mode 100644 (file)
index 0000000..6f4bb1d
--- /dev/null
@@ -0,0 +1,563 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttpost.c                                                               */
+/*                                                                         */
+/*    Postcript name table processing for TrueType and OpenType fonts      */
+/*    (body).                                                              */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2006, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The post table is not completely loaded by the core engine.  This     */
+  /* file loads the missing PS glyph names and implements an API to access */
+  /* them.                                                                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_TRUETYPE_TAGS_H
+#include "ttpost.h"
+
+#include "sferrors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttpost
+
+
+  /* If this configuration macro is defined, we rely on the `PSNames' */
+  /* module to grab the glyph names.                                  */
+
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+
+#include FT_SERVICE_POSTSCRIPT_CMAPS_H
+
+#define MAC_NAME( x )  ( (FT_String*)psnames->macintosh_name( x ) )
+
+
+#else /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
+
+   /* Otherwise, we ignore the `PSNames' module, and provide our own  */
+   /* table of Mac names.  Thus, it is possible to build a version of */
+   /* FreeType without the Type 1 driver & PSNames module.            */
+
+#define MAC_NAME( x )  ( (FT_String*)tt_post_default_names[x] )
+
+  /* the 258 default Mac PS glyph names */
+
+  static const FT_String* const  tt_post_default_names[258] =
+  {
+    /*   0 */
+    ".notdef", ".null", "CR", "space", "exclam",
+    "quotedbl", "numbersign", "dollar", "percent", "ampersand",
+    /*  10 */
+    "quotesingle", "parenleft", "parenright", "asterisk", "plus",
+    "comma", "hyphen", "period", "slash", "zero",
+    /*  20 */
+    "one", "two", "three", "four", "five",
+    "six", "seven", "eight", "nine", "colon",
+    /*  30 */
+    "semicolon", "less", "equal", "greater", "question",
+    "at", "A", "B", "C", "D",
+    /*  40 */
+    "E", "F", "G", "H", "I",
+    "J", "K", "L", "M", "N",
+    /*  50 */
+    "O", "P", "Q", "R", "S",
+    "T", "U", "V", "W", "X",
+    /*  60 */
+    "Y", "Z", "bracketleft", "backslash", "bracketright",
+    "asciicircum", "underscore", "grave", "a", "b",
+    /*  70 */
+    "c", "d", "e", "f", "g",
+    "h", "i", "j", "k", "l",
+    /*  80 */
+    "m", "n", "o", "p", "q",
+    "r", "s", "t", "u", "v",
+    /*  90 */
+    "w", "x", "y", "z", "braceleft",
+    "bar", "braceright", "asciitilde", "Adieresis", "Aring",
+    /* 100 */
+    "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis",
+    "aacute", "agrave", "acircumflex", "adieresis", "atilde",
+    /* 110 */
+    "aring", "ccedilla", "eacute", "egrave", "ecircumflex",
+    "edieresis", "iacute", "igrave", "icircumflex", "idieresis",
+    /* 120 */
+    "ntilde", "oacute", "ograve", "ocircumflex", "odieresis",
+    "otilde", "uacute", "ugrave", "ucircumflex", "udieresis",
+    /* 130 */
+    "dagger", "degree", "cent", "sterling", "section",
+    "bullet", "paragraph", "germandbls", "registered", "copyright",
+    /* 140 */
+    "trademark", "acute", "dieresis", "notequal", "AE",
+    "Oslash", "infinity", "plusminus", "lessequal", "greaterequal",
+    /* 150 */
+    "yen", "mu", "partialdiff", "summation", "product",
+    "pi", "integral", "ordfeminine", "ordmasculine", "Omega",
+    /* 160 */
+    "ae", "oslash", "questiondown", "exclamdown", "logicalnot",
+    "radical", "florin", "approxequal", "Delta", "guillemotleft",
+    /* 170 */
+    "guillemotright", "ellipsis", "nbspace", "Agrave", "Atilde",
+    "Otilde", "OE", "oe", "endash", "emdash",
+    /* 180 */
+    "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide",
+    "lozenge", "ydieresis", "Ydieresis", "fraction", "currency",
+    /* 190 */
+    "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl",
+    "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex",
+    /* 200 */
+    "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute",
+    "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex",
+    /* 210 */
+    "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave",
+    "dotlessi", "circumflex", "tilde", "macron", "breve",
+    /* 220 */
+    "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek",
+    "caron", "Lslash", "lslash", "Scaron", "scaron",
+    /* 230 */
+    "Zcaron", "zcaron", "brokenbar", "Eth", "eth",
+    "Yacute", "yacute", "Thorn", "thorn", "minus",
+    /* 240 */
+    "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf",
+    "onequarter", "threequarters", "franc", "Gbreve", "gbreve",
+    /* 250 */
+    "Idot", "Scedilla", "scedilla", "Cacute", "cacute",
+    "Ccaron", "ccaron", "dmacron",
+  };
+
+
+#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
+
+  static FT_Error
+  load_format_20( TT_Face    face,
+                  FT_Stream  stream,
+                  FT_Long    post_limit )
+  {
+    FT_Memory   memory = stream->memory;
+    FT_Error    error;
+
+    FT_Int      num_glyphs;
+    FT_UShort   num_names;
+
+    FT_UShort*  glyph_indices = 0;
+    FT_Char**   name_strings  = 0;
+
+
+    if ( FT_READ_USHORT( num_glyphs ) )
+      goto Exit;
+
+    /* UNDOCUMENTED!  The number of glyphs in this table can be smaller */
+    /* than the value in the maxp table (cf. cyberbit.ttf).             */
+
+    /* There already exist fonts which have more than 32768 glyph names */
+    /* in this table, so the test for this threshold has been dropped.  */
+
+    if ( num_glyphs > face->max_profile.numGlyphs )
+    {
+      error = SFNT_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    /* load the indices */
+    {
+      FT_Int  n;
+
+
+      if ( FT_NEW_ARRAY ( glyph_indices, num_glyphs ) ||
+           FT_FRAME_ENTER( num_glyphs * 2L )          )
+        goto Fail;
+
+      for ( n = 0; n < num_glyphs; n++ )
+        glyph_indices[n] = FT_GET_USHORT();
+
+      FT_FRAME_EXIT();
+    }
+
+    /* compute number of names stored in table */
+    {
+      FT_Int  n;
+
+
+      num_names = 0;
+
+      for ( n = 0; n < num_glyphs; n++ )
+      {
+        FT_Int  idx;
+
+
+        idx = glyph_indices[n];
+        if ( idx >= 258 )
+        {
+          idx -= 257;
+          if ( idx > num_names )
+            num_names = (FT_UShort)idx;
+        }
+      }
+    }
+
+    /* now load the name strings */
+    {
+      FT_UShort  n;
+
+
+      if ( FT_NEW_ARRAY( name_strings, num_names ) )
+        goto Fail;
+
+      for ( n = 0; n < num_names; n++ )
+      {
+        FT_UInt  len;
+
+
+        if ( FT_STREAM_POS() >= post_limit )
+          break;
+        else
+        {
+          FT_TRACE6(( "load_format_20: %d byte left in post table\n",
+                      post_limit - FT_STREAM_POS() ));
+
+          if ( FT_READ_BYTE( len ) )
+            goto Fail1;
+        }
+
+        if ( (FT_Int)len > post_limit                   ||
+             FT_STREAM_POS() > post_limit - (FT_Int)len )
+        {
+          FT_ERROR(( "load_format_20:"
+                     " exceeding string length (%d),"
+                     " truncating at end of post table (%d byte left)\n",
+                     len, post_limit - FT_STREAM_POS() ));
+          len = FT_MAX( 0, post_limit - FT_STREAM_POS() );
+        }
+
+        if ( FT_NEW_ARRAY( name_strings[n], len + 1 ) ||
+             FT_STREAM_READ( name_strings[n], len   ) )
+          goto Fail1;
+
+        name_strings[n][len] = '\0';
+      }
+
+      if ( n < num_names )
+      {
+        FT_ERROR(( "load_format_20:"
+                   " all entries in post table are already parsed,"
+                   " using NULL names for gid %d - %d\n",
+                    n, num_names - 1 ));
+        for ( ; n < num_names; n++ )
+          if ( FT_NEW_ARRAY( name_strings[n], 1 ) )
+            goto Fail1;
+          else
+            name_strings[n][0] = '\0';
+      }
+    }
+
+    /* all right, set table fields and exit successfully */
+    {
+      TT_Post_20  table = &face->postscript_names.names.format_20;
+
+
+      table->num_glyphs    = (FT_UShort)num_glyphs;
+      table->num_names     = (FT_UShort)num_names;
+      table->glyph_indices = glyph_indices;
+      table->glyph_names   = name_strings;
+    }
+    return SFNT_Err_Ok;
+
+  Fail1:
+    {
+      FT_UShort  n;
+
+
+      for ( n = 0; n < num_names; n++ )
+        FT_FREE( name_strings[n] );
+    }
+
+  Fail:
+    FT_FREE( name_strings );
+    FT_FREE( glyph_indices );
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  load_format_25( TT_Face    face,
+                  FT_Stream  stream,
+                  FT_Long    post_limit )
+  {
+    FT_Memory  memory = stream->memory;
+    FT_Error   error;
+
+    FT_Int     num_glyphs;
+    FT_Char*   offset_table = 0;
+
+    FT_UNUSED( post_limit );
+
+
+    /* UNDOCUMENTED!  This value appears only in the Apple TT specs. */
+    if ( FT_READ_USHORT( num_glyphs ) )
+      goto Exit;
+
+    /* check the number of glyphs */
+    if ( num_glyphs > face->max_profile.numGlyphs || num_glyphs > 258 )
+    {
+      error = SFNT_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    if ( FT_NEW_ARRAY( offset_table, num_glyphs )   ||
+         FT_STREAM_READ( offset_table, num_glyphs ) )
+      goto Fail;
+
+    /* now check the offset table */
+    {
+      FT_Int  n;
+
+
+      for ( n = 0; n < num_glyphs; n++ )
+      {
+        FT_Long  idx = (FT_Long)n + offset_table[n];
+
+
+        if ( idx < 0 || idx > num_glyphs )
+        {
+          error = SFNT_Err_Invalid_File_Format;
+          goto Fail;
+        }
+      }
+    }
+
+    /* OK, set table fields and exit successfully */
+    {
+      TT_Post_25  table = &face->postscript_names.names.format_25;
+
+
+      table->num_glyphs = (FT_UShort)num_glyphs;
+      table->offsets    = offset_table;
+    }
+
+    return SFNT_Err_Ok;
+
+  Fail:
+    FT_FREE( offset_table );
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  load_post_names( TT_Face  face )
+  {
+    FT_Stream  stream;
+    FT_Error   error;
+    FT_Fixed   format;
+    FT_ULong   post_len;
+    FT_Long    post_limit;
+
+
+    /* get a stream for the face's resource */
+    stream = face->root.stream;
+
+    /* seek to the beginning of the PS names table */
+    error = face->goto_table( face, TTAG_post, stream, &post_len );
+    if ( error )
+      goto Exit;
+
+    post_limit = FT_STREAM_POS() + post_len;
+
+    format = face->postscript.FormatType;
+
+    /* go to beginning of subtable */
+    if ( FT_STREAM_SKIP( 32 ) )
+      goto Exit;
+
+    /* now read postscript table */
+    if ( format == 0x00020000L )
+      error = load_format_20( face, stream, post_limit );
+    else if ( format == 0x00028000L )
+      error = load_format_25( face, stream, post_limit );
+    else
+      error = SFNT_Err_Invalid_File_Format;
+
+    face->postscript_names.loaded = 1;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  tt_face_free_ps_names( TT_Face  face )
+  {
+    FT_Memory      memory = face->root.memory;
+    TT_Post_Names  names  = &face->postscript_names;
+    FT_Fixed       format;
+
+
+    if ( names->loaded )
+    {
+      format = face->postscript.FormatType;
+
+      if ( format == 0x00020000L )
+      {
+        TT_Post_20  table = &names->names.format_20;
+        FT_UShort   n;
+
+
+        FT_FREE( table->glyph_indices );
+        table->num_glyphs = 0;
+
+        for ( n = 0; n < table->num_names; n++ )
+          FT_FREE( table->glyph_names[n] );
+
+        FT_FREE( table->glyph_names );
+        table->num_names = 0;
+      }
+      else if ( format == 0x00028000L )
+      {
+        TT_Post_25  table = &names->names.format_25;
+
+
+        FT_FREE( table->offsets );
+        table->num_glyphs = 0;
+      }
+    }
+    names->loaded = 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_get_ps_name                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the PostScript glyph name of a glyph.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the parent face.                             */
+  /*                                                                       */
+  /*    idx    :: The glyph index.                                         */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    PSname :: The address of a string pointer.  Will be NULL in case   */
+  /*              of error, otherwise it is a pointer to the glyph name.   */
+  /*                                                                       */
+  /*              You must not modify the returned string!                 */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_get_ps_name( TT_Face      face,
+                       FT_UInt      idx,
+                       FT_String**  PSname )
+  {
+    FT_Error       error;
+    TT_Post_Names  names;
+    FT_Fixed       format;
+
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+    FT_Service_PsCMaps  psnames;
+#endif
+
+
+    if ( !face )
+      return SFNT_Err_Invalid_Face_Handle;
+
+    if ( idx >= (FT_UInt)face->max_profile.numGlyphs )
+      return SFNT_Err_Invalid_Glyph_Index;
+
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+    psnames = (FT_Service_PsCMaps)face->psnames;
+    if ( !psnames )
+      return SFNT_Err_Unimplemented_Feature;
+#endif
+
+    names = &face->postscript_names;
+
+    /* `.notdef' by default */
+    *PSname = MAC_NAME( 0 );
+
+    format = face->postscript.FormatType;
+
+    if ( format == 0x00010000L )
+    {
+      if ( idx < 258 )                    /* paranoid checking */
+        *PSname = MAC_NAME( idx );
+    }
+    else if ( format == 0x00020000L )
+    {
+      TT_Post_20  table = &names->names.format_20;
+
+
+      if ( !names->loaded )
+      {
+        error = load_post_names( face );
+        if ( error )
+          goto End;
+      }
+
+      if ( idx < (FT_UInt)table->num_glyphs )
+      {
+        FT_UShort  name_index = table->glyph_indices[idx];
+
+
+        if ( name_index < 258 )
+          *PSname = MAC_NAME( name_index );
+        else
+          *PSname = (FT_String*)table->glyph_names[name_index - 258];
+      }
+    }
+    else if ( format == 0x00028000L )
+    {
+      TT_Post_25  table = &names->names.format_25;
+
+
+      if ( !names->loaded )
+      {
+        error = load_post_names( face );
+        if ( error )
+          goto End;
+      }
+
+      if ( idx < (FT_UInt)table->num_glyphs )    /* paranoid checking */
+      {
+        idx    += table->offsets[idx];
+        *PSname = MAC_NAME( idx );
+      }
+    }
+
+    /* nothing to do for format == 0x00030000L */
+
+  End:
+    return SFNT_Err_Ok;
+  }
+
+
+/* END */
diff --git a/src/sfnt/ttpost.h b/src/sfnt/ttpost.h
new file mode 100644 (file)
index 0000000..6f06d75
--- /dev/null
@@ -0,0 +1,46 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttpost.h                                                               */
+/*                                                                         */
+/*    Postcript name table processing for TrueType and OpenType fonts      */
+/*    (specification).                                                     */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTPOST_H__
+#define __TTPOST_H__
+
+
+#include <ft2build.h>
+#include FT_CONFIG_CONFIG_H
+#include FT_INTERNAL_TRUETYPE_TYPES_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_get_ps_name( TT_Face      face,
+                       FT_UInt      idx,
+                       FT_String**  PSname );
+
+  FT_LOCAL( void )
+  tt_face_free_ps_names( TT_Face  face );
+
+
+FT_END_HEADER
+
+#endif /* __TTPOST_H__ */
+
+
+/* END */
diff --git a/src/sfnt/ttsbit.c b/src/sfnt/ttsbit.c
new file mode 100644 (file)
index 0000000..283ba7e
--- /dev/null
@@ -0,0 +1,1508 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttsbit.c                                                               */
+/*                                                                         */
+/*    TrueType and OpenType embedded bitmap support (body).                */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_TRUETYPE_TAGS_H
+
+  /*
+   *  Alas, the memory-optimized sbit loader can't be used when implementing
+   *  the `old internals' hack
+   */
+#ifndef FT_CONFIG_OPTION_OLD_INTERNALS
+
+#include "ttsbit0.c"
+
+#else /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_TRUETYPE_TAGS_H
+#include "ttsbit.h"
+
+#include "sferrors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttsbit
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    blit_sbit                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Blits a bitmap from an input stream into a given target.  Supports */
+  /*    x and y offsets as well as byte padded lines.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    target      :: The target bitmap/pixmap.                           */
+  /*                                                                       */
+  /*    source      :: The input packed bitmap data.                       */
+  /*                                                                       */
+  /*    line_bits   :: The number of bits per line.                        */
+  /*                                                                       */
+  /*    byte_padded :: A flag which is true if lines are byte-padded.      */
+  /*                                                                       */
+  /*    x_offset    :: The horizontal offset.                              */
+  /*                                                                       */
+  /*    y_offset    :: The vertical offset.                                */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    IMPORTANT: The x and y offsets are relative to the top corner of   */
+  /*               the target bitmap (unlike the normal TrueType           */
+  /*               convention).  A positive y offset indicates a downwards */
+  /*               direction!                                              */
+  /*                                                                       */
+  static void
+  blit_sbit( FT_Bitmap*  target,
+             FT_Byte*    source,
+             FT_Int      line_bits,
+             FT_Bool     byte_padded,
+             FT_Int      x_offset,
+             FT_Int      y_offset,
+             FT_Int      source_height )
+  {
+    FT_Byte*   line_buff;
+    FT_Int     line_incr;
+    FT_Int     height;
+
+    FT_UShort  acc;
+    FT_UInt    loaded;
+
+
+    /* first of all, compute starting write position */
+    line_incr = target->pitch;
+    line_buff = target->buffer;
+
+    if ( line_incr < 0 )
+      line_buff -= line_incr * ( target->rows - 1 );
+
+    line_buff += ( x_offset >> 3 ) + y_offset * line_incr;
+
+    /***********************************************************************/
+    /*                                                                     */
+    /* We use the extra-classic `accumulator' trick to extract the bits    */
+    /* from the source byte stream.                                        */
+    /*                                                                     */
+    /* Namely, the variable `acc' is a 16-bit accumulator containing the   */
+    /* last `loaded' bits from the input stream.  The bits are shifted to  */
+    /* the upmost position in `acc'.                                       */
+    /*                                                                     */
+    /***********************************************************************/
+
+    acc    = 0;  /* clear accumulator   */
+    loaded = 0;  /* no bits were loaded */
+
+    for ( height = source_height; height > 0; height-- )
+    {
+      FT_Byte*  cur   = line_buff;        /* current write cursor          */
+      FT_Int    count = line_bits;        /* # of bits to extract per line */
+      FT_Byte   shift = (FT_Byte)( x_offset & 7 ); /* current write shift  */
+      FT_Byte   space = (FT_Byte)( 8 - shift );
+
+
+      /* first of all, read individual source bytes */
+      if ( count >= 8 )
+      {
+        count -= 8;
+        {
+          do
+          {
+            FT_Byte  val;
+
+
+            /* ensure that there are at least 8 bits in the accumulator */
+            if ( loaded < 8 )
+            {
+              acc    |= (FT_UShort)((FT_UShort)*source++ << ( 8 - loaded ));
+              loaded += 8;
+            }
+
+            /* now write one byte */
+            val = (FT_Byte)( acc >> 8 );
+            if ( shift )
+            {
+              cur[0] |= (FT_Byte)( val >> shift );
+              cur[1] |= (FT_Byte)( val << space );
+            }
+            else
+              cur[0] |= val;
+
+            cur++;
+            acc   <<= 8;  /* remove bits from accumulator */
+            loaded -= 8;
+            count  -= 8;
+
+          } while ( count >= 0 );
+        }
+
+        /* restore `count' to correct value */
+        count += 8;
+      }
+
+      /* now write remaining bits (count < 8) */
+      if ( count > 0 )
+      {
+        FT_Byte  val;
+
+
+        /* ensure that there are at least `count' bits in the accumulator */
+        if ( (FT_Int)loaded < count )
+        {
+          acc    |= (FT_UShort)((FT_UShort)*source++ << ( 8 - loaded ));
+          loaded += 8;
+        }
+
+        /* now write remaining bits */
+        val     = (FT_Byte)( ( (FT_Byte)( acc >> 8 ) ) & ~( 0xFF >> count ) );
+        cur[0] |= (FT_Byte)( val >> shift );
+
+        if ( count > space )
+          cur[1] |= (FT_Byte)( val << space );
+
+        acc   <<= count;
+        loaded -= count;
+      }
+
+      /* now, skip to next line */
+      if ( byte_padded )
+      {
+        acc    = 0;
+        loaded = 0;   /* clear accumulator on byte-padded lines */
+      }
+
+      line_buff += line_incr;
+    }
+  }
+
+
+  static const FT_Frame_Field  sbit_metrics_fields[] =
+  {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_SBit_MetricsRec
+
+    FT_FRAME_START( 8 ),
+      FT_FRAME_BYTE( height ),
+      FT_FRAME_BYTE( width ),
+
+      FT_FRAME_CHAR( horiBearingX ),
+      FT_FRAME_CHAR( horiBearingY ),
+      FT_FRAME_BYTE( horiAdvance ),
+
+      FT_FRAME_CHAR( vertBearingX ),
+      FT_FRAME_CHAR( vertBearingY ),
+      FT_FRAME_BYTE( vertAdvance ),
+    FT_FRAME_END
+  };
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Load_SBit_Const_Metrics                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the metrics for `EBLC' index tables format 2 and 5.          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    range  :: The target range.                                        */
+  /*                                                                       */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  static FT_Error
+  Load_SBit_Const_Metrics( TT_SBit_Range  range,
+                           FT_Stream      stream )
+  {
+    FT_Error  error;
+
+
+    if ( FT_READ_ULONG( range->image_size ) )
+      return error;
+
+    return FT_STREAM_READ_FIELDS( sbit_metrics_fields, &range->metrics );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Load_SBit_Range_Codes                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the range codes for `EBLC' index tables format 4 and 5.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    range        :: The target range.                                  */
+  /*                                                                       */
+  /*    stream       :: The input stream.                                  */
+  /*                                                                       */
+  /*    load_offsets :: A flag whether to load the glyph offset table.     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  static FT_Error
+  Load_SBit_Range_Codes( TT_SBit_Range  range,
+                         FT_Stream      stream,
+                         FT_Bool        load_offsets )
+  {
+    FT_Error   error;
+    FT_ULong   count, n, size;
+    FT_Memory  memory = stream->memory;
+
+
+    if ( FT_READ_ULONG( count ) )
+      goto Exit;
+
+    range->num_glyphs = count;
+
+    /* Allocate glyph offsets table if needed */
+    if ( load_offsets )
+    {
+      if ( FT_NEW_ARRAY( range->glyph_offsets, count ) )
+        goto Exit;
+
+      size = count * 4L;
+    }
+    else
+      size = count * 2L;
+
+    /* Allocate glyph codes table and access frame */
+    if ( FT_NEW_ARRAY ( range->glyph_codes, count ) ||
+         FT_FRAME_ENTER( size )                     )
+      goto Exit;
+
+    for ( n = 0; n < count; n++ )
+    {
+      range->glyph_codes[n] = FT_GET_USHORT();
+
+      if ( load_offsets )
+        range->glyph_offsets[n] = (FT_ULong)range->image_offset +
+                                  FT_GET_USHORT();
+    }
+
+    FT_FRAME_EXIT();
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Load_SBit_Range                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads a given `EBLC' index/range table.                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    range  :: The target range.                                        */
+  /*                                                                       */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  static FT_Error
+  Load_SBit_Range( TT_SBit_Range  range,
+                   FT_Stream      stream )
+  {
+    FT_Error   error;
+    FT_Memory  memory = stream->memory;
+
+
+    switch( range->index_format )
+    {
+    case 1:   /* variable metrics with 4-byte offsets */
+    case 3:   /* variable metrics with 2-byte offsets */
+      {
+        FT_ULong  num_glyphs, n;
+        FT_Int    size_elem;
+        FT_Bool   large = FT_BOOL( range->index_format == 1 );
+
+
+
+        if ( range->last_glyph < range->first_glyph )
+        {
+          error = SFNT_Err_Invalid_File_Format;
+          goto Exit;
+        }
+
+        num_glyphs        = range->last_glyph - range->first_glyph + 1L;
+        range->num_glyphs = num_glyphs;
+        num_glyphs++;                       /* XXX: BEWARE - see spec */
+
+        size_elem = large ? 4 : 2;
+
+        if ( FT_NEW_ARRAY( range->glyph_offsets, num_glyphs ) ||
+             FT_FRAME_ENTER( num_glyphs * size_elem )         )
+          goto Exit;
+
+        for ( n = 0; n < num_glyphs; n++ )
+          range->glyph_offsets[n] = (FT_ULong)( range->image_offset +
+                                                ( large ? FT_GET_ULONG()
+                                                        : FT_GET_USHORT() ) );
+        FT_FRAME_EXIT();
+      }
+      break;
+
+    case 2:   /* all glyphs have identical metrics */
+      error = Load_SBit_Const_Metrics( range, stream );
+      break;
+
+    case 4:
+      error = Load_SBit_Range_Codes( range, stream, 1 );
+      break;
+
+    case 5:
+      error = Load_SBit_Const_Metrics( range, stream );
+      if ( !error )
+        error = Load_SBit_Range_Codes( range, stream, 0 );
+      break;
+
+    default:
+      error = SFNT_Err_Invalid_File_Format;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_eblc                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads the table of embedded bitmap sizes for this face.            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: The target face object.                                  */
+  /*                                                                       */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_eblc( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error   error  = SFNT_Err_Ok;
+    FT_Memory  memory = stream->memory;
+    FT_Fixed   version;
+    FT_ULong   num_strikes;
+    FT_ULong   table_base;
+
+    static const FT_Frame_Field  sbit_line_metrics_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_SBit_LineMetricsRec
+
+      /* no FT_FRAME_START */
+        FT_FRAME_CHAR( ascender ),
+        FT_FRAME_CHAR( descender ),
+        FT_FRAME_BYTE( max_width ),
+
+        FT_FRAME_CHAR( caret_slope_numerator ),
+        FT_FRAME_CHAR( caret_slope_denominator ),
+        FT_FRAME_CHAR( caret_offset ),
+
+        FT_FRAME_CHAR( min_origin_SB ),
+        FT_FRAME_CHAR( min_advance_SB ),
+        FT_FRAME_CHAR( max_before_BL ),
+        FT_FRAME_CHAR( min_after_BL ),
+        FT_FRAME_CHAR( pads[0] ),
+        FT_FRAME_CHAR( pads[1] ),
+      FT_FRAME_END
+    };
+
+    static const FT_Frame_Field  strike_start_fields[] =
+    {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_SBit_StrikeRec
+
+      /* no FT_FRAME_START */
+        FT_FRAME_ULONG( ranges_offset ),
+        FT_FRAME_SKIP_LONG,
+        FT_FRAME_ULONG( num_ranges ),
+        FT_FRAME_ULONG( color_ref ),
+      FT_FRAME_END
+    };
+
+    static const FT_Frame_Field  strike_end_fields[] =
+    {
+      /* no FT_FRAME_START */
+        FT_FRAME_USHORT( start_glyph ),
+        FT_FRAME_USHORT( end_glyph ),
+        FT_FRAME_BYTE  ( x_ppem ),
+        FT_FRAME_BYTE  ( y_ppem ),
+        FT_FRAME_BYTE  ( bit_depth ),
+        FT_FRAME_CHAR  ( flags ),
+      FT_FRAME_END
+    };
+
+
+    face->num_sbit_strikes = 0;
+
+    /* this table is optional */
+    error = face->goto_table( face, TTAG_EBLC, stream, 0 );
+    if ( error )
+      error = face->goto_table( face, TTAG_bloc, stream, 0 );
+    if ( error )
+      goto Exit;
+
+    table_base = FT_STREAM_POS();
+    if ( FT_FRAME_ENTER( 8L ) )
+      goto Exit;
+
+    version     = FT_GET_LONG();
+    num_strikes = FT_GET_ULONG();
+
+    FT_FRAME_EXIT();
+
+    /* check version number and strike count */
+    if ( version     != 0x00020000L ||
+         num_strikes >= 0x10000L    )
+    {
+      FT_ERROR(( "tt_face_load_sbit_strikes: invalid table version\n" ));
+      error = SFNT_Err_Invalid_File_Format;
+
+      goto Exit;
+    }
+
+    /* allocate the strikes table */
+    if ( FT_NEW_ARRAY( face->sbit_strikes, num_strikes ) )
+      goto Exit;
+
+    face->num_sbit_strikes = num_strikes;
+
+    /* now read each strike table separately */
+    {
+      TT_SBit_Strike  strike = face->sbit_strikes;
+      FT_ULong        count  = num_strikes;
+
+
+      if ( FT_FRAME_ENTER( 48L * num_strikes ) )
+        goto Exit;
+
+      while ( count > 0 )
+      {
+        if ( FT_STREAM_READ_FIELDS( strike_start_fields, strike )             ||
+             FT_STREAM_READ_FIELDS( sbit_line_metrics_fields, &strike->hori ) ||
+             FT_STREAM_READ_FIELDS( sbit_line_metrics_fields, &strike->vert ) ||
+             FT_STREAM_READ_FIELDS( strike_end_fields, strike )               )
+          break;
+
+        count--;
+        strike++;
+      }
+
+      FT_FRAME_EXIT();
+    }
+
+    /* allocate the index ranges for each strike table */
+    {
+      TT_SBit_Strike  strike = face->sbit_strikes;
+      FT_ULong        count  = num_strikes;
+
+
+      while ( count > 0 )
+      {
+        TT_SBit_Range  range;
+        FT_ULong       count2 = strike->num_ranges;
+
+
+        /* read each range */
+        if ( FT_STREAM_SEEK( table_base + strike->ranges_offset ) ||
+             FT_FRAME_ENTER( strike->num_ranges * 8L )            )
+          goto Exit;
+
+        if ( FT_NEW_ARRAY( strike->sbit_ranges, strike->num_ranges ) )
+          goto Exit;
+
+        range = strike->sbit_ranges;
+        while ( count2 > 0 )
+        {
+          range->first_glyph  = FT_GET_USHORT();
+          range->last_glyph   = FT_GET_USHORT();
+          range->table_offset = table_base + strike->ranges_offset +
+                                  FT_GET_ULONG();
+          count2--;
+          range++;
+        }
+
+        FT_FRAME_EXIT();
+
+        /* Now, read each index table */
+        count2 = strike->num_ranges;
+        range  = strike->sbit_ranges;
+        while ( count2 > 0 )
+        {
+          /* Read the header */
+          if ( FT_STREAM_SEEK( range->table_offset ) ||
+               FT_FRAME_ENTER( 8L )                  )
+            goto Exit;
+
+          range->index_format = FT_GET_USHORT();
+          range->image_format = FT_GET_USHORT();
+          range->image_offset = FT_GET_ULONG();
+
+          FT_FRAME_EXIT();
+
+          error = Load_SBit_Range( range, stream );
+          if ( error )
+            goto Exit;
+
+          count2--;
+          range++;
+        }
+
+        count--;
+        strike++;
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_free_eblc                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Releases the embedded bitmap tables.                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: The target face object.                                    */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  tt_face_free_eblc( TT_Face  face )
+  {
+    FT_Memory       memory       = face->root.memory;
+    TT_SBit_Strike  strike       = face->sbit_strikes;
+    TT_SBit_Strike  strike_limit = strike + face->num_sbit_strikes;
+
+
+    if ( strike )
+    {
+      for ( ; strike < strike_limit; strike++ )
+      {
+        TT_SBit_Range  range       = strike->sbit_ranges;
+        TT_SBit_Range  range_limit = range + strike->num_ranges;
+
+
+        if ( range )
+        {
+          for ( ; range < range_limit; range++ )
+          {
+            /* release the glyph offsets and codes tables */
+            /* where appropriate                          */
+            FT_FREE( range->glyph_offsets );
+            FT_FREE( range->glyph_codes );
+          }
+        }
+        FT_FREE( strike->sbit_ranges );
+        strike->num_ranges = 0;
+      }
+      FT_FREE( face->sbit_strikes );
+    }
+    face->num_sbit_strikes = 0;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_set_sbit_strike( TT_Face          face,
+                           FT_Size_Request  req,
+                           FT_ULong*        astrike_index )
+  {
+    return FT_Match_Size( (FT_Face)face, req, 0, astrike_index );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_strike_metrics( TT_Face           face,
+                               FT_ULong          strike_index,
+                               FT_Size_Metrics*  metrics )
+  {
+    TT_SBit_Strike  strike;
+
+
+    if ( strike_index >= face->num_sbit_strikes )
+      return SFNT_Err_Invalid_Argument;
+
+    strike = face->sbit_strikes + strike_index;
+
+    metrics->x_ppem = strike->x_ppem;
+    metrics->y_ppem = strike->y_ppem;
+
+    metrics->ascender  = strike->hori.ascender << 6;
+    metrics->descender = strike->hori.descender << 6;
+
+    /* XXX: Is this correct? */
+    metrics->max_advance = ( strike->hori.min_origin_SB  +
+                             strike->hori.max_width      +
+                             strike->hori.min_advance_SB ) << 6;
+
+    metrics->height = metrics->ascender - metrics->descender;
+
+    return SFNT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    find_sbit_range                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Scans a given strike's ranges and return, for a given glyph        */
+  /*    index, the corresponding sbit range, and `EBDT' offset.            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    glyph_index   :: The glyph index.                                  */
+  /*                                                                       */
+  /*    strike        :: The source/current sbit strike.                   */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    arange        :: The sbit range containing the glyph index.        */
+  /*                                                                       */
+  /*    aglyph_offset :: The offset of the glyph data in `EBDT' table.     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means the glyph index was found.           */
+  /*                                                                       */
+  static FT_Error
+  find_sbit_range( FT_UInt          glyph_index,
+                   TT_SBit_Strike   strike,
+                   TT_SBit_Range   *arange,
+                   FT_ULong        *aglyph_offset )
+  {
+    TT_SBit_RangeRec  *range, *range_limit;
+
+
+    /* check whether the glyph index is within this strike's */
+    /* glyph range                                           */
+    if ( glyph_index < (FT_UInt)strike->start_glyph ||
+         glyph_index > (FT_UInt)strike->end_glyph   )
+      goto Fail;
+
+    /* scan all ranges in strike */
+    range       = strike->sbit_ranges;
+    range_limit = range + strike->num_ranges;
+    if ( !range )
+      goto Fail;
+
+    for ( ; range < range_limit; range++ )
+    {
+      if ( glyph_index >= (FT_UInt)range->first_glyph &&
+           glyph_index <= (FT_UInt)range->last_glyph  )
+      {
+        FT_UShort  delta = (FT_UShort)( glyph_index - range->first_glyph );
+
+
+        switch ( range->index_format )
+        {
+        case 1:
+        case 3:
+          *aglyph_offset = range->glyph_offsets[delta];
+          break;
+
+        case 2:
+          *aglyph_offset = range->image_offset +
+                           range->image_size * delta;
+          break;
+
+        case 4:
+        case 5:
+          {
+            FT_ULong  n;
+
+
+            for ( n = 0; n < range->num_glyphs; n++ )
+            {
+              if ( (FT_UInt)range->glyph_codes[n] == glyph_index )
+              {
+                if ( range->index_format == 4 )
+                  *aglyph_offset = range->glyph_offsets[n];
+                else
+                  *aglyph_offset = range->image_offset +
+                                   n * range->image_size;
+                goto Found;
+              }
+            }
+          }
+
+        /* fall-through */
+        default:
+          goto Fail;
+        }
+
+      Found:
+        /* return successfully! */
+        *arange  = range;
+        return SFNT_Err_Ok;
+      }
+    }
+
+  Fail:
+    *arange        = 0;
+    *aglyph_offset = 0;
+
+    return SFNT_Err_Invalid_Argument;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_find_sbit_image                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Checks whether an embedded bitmap (an `sbit') exists for a given   */
+  /*    glyph, at a given strike.                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face          :: The target face object.                           */
+  /*                                                                       */
+  /*    glyph_index   :: The glyph index.                                  */
+  /*                                                                       */
+  /*    strike_index  :: The current strike index.                         */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    arange        :: The SBit range containing the glyph index.        */
+  /*                                                                       */
+  /*    astrike       :: The SBit strike containing the glyph index.       */
+  /*                                                                       */
+  /*    aglyph_offset :: The offset of the glyph data in `EBDT' table.     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.  Returns                    */
+  /*    SFNT_Err_Invalid_Argument if no sbit exists for the requested      */
+  /*    glyph.                                                             */
+  /*                                                                       */
+  FT_LOCAL( FT_Error )
+  tt_find_sbit_image( TT_Face          face,
+                      FT_UInt          glyph_index,
+                      FT_ULong         strike_index,
+                      TT_SBit_Range   *arange,
+                      TT_SBit_Strike  *astrike,
+                      FT_ULong        *aglyph_offset )
+  {
+    FT_Error        error;
+    TT_SBit_Strike  strike;
+
+
+    if ( !face->sbit_strikes                        ||
+         ( face->num_sbit_strikes <= strike_index ) )
+      goto Fail;
+
+    strike = &face->sbit_strikes[strike_index];
+
+    error = find_sbit_range( glyph_index, strike,
+                             arange, aglyph_offset );
+    if ( error )
+      goto Fail;
+
+    *astrike = strike;
+
+    return SFNT_Err_Ok;
+
+  Fail:
+    /* no embedded bitmap for this glyph in face */
+    *arange        = 0;
+    *astrike       = 0;
+    *aglyph_offset = 0;
+
+    return SFNT_Err_Invalid_Argument;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_load_sbit_metrics                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Gets the big metrics for a given SBit.                             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream      :: The input stream.                                   */
+  /*                                                                       */
+  /*    range       :: The SBit range containing the glyph.                */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    big_metrics :: A big SBit metrics structure for the glyph.         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The stream cursor must be positioned at the glyph's offset within  */
+  /*    the `EBDT' table before the call.                                  */
+  /*                                                                       */
+  /*    If the image format uses variable metrics, the stream cursor is    */
+  /*    positioned just after the metrics header in the `EBDT' table on    */
+  /*    function exit.                                                     */
+  /*                                                                       */
+  FT_LOCAL( FT_Error )
+  tt_load_sbit_metrics( FT_Stream        stream,
+                        TT_SBit_Range    range,
+                        TT_SBit_Metrics  metrics )
+  {
+    FT_Error  error = SFNT_Err_Ok;
+
+
+    switch ( range->image_format )
+    {
+    case 1:
+    case 2:
+    case 8:
+      /* variable small metrics */
+      {
+        TT_SBit_SmallMetricsRec  smetrics;
+
+        static const FT_Frame_Field  sbit_small_metrics_fields[] =
+        {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  TT_SBit_SmallMetricsRec
+
+          FT_FRAME_START( 5 ),
+            FT_FRAME_BYTE( height ),
+            FT_FRAME_BYTE( width ),
+            FT_FRAME_CHAR( bearingX ),
+            FT_FRAME_CHAR( bearingY ),
+            FT_FRAME_BYTE( advance ),
+          FT_FRAME_END
+        };
+
+
+        /* read small metrics */
+        if ( FT_STREAM_READ_FIELDS( sbit_small_metrics_fields, &smetrics ) )
+          goto Exit;
+
+        /* convert it to a big metrics */
+        metrics->height       = smetrics.height;
+        metrics->width        = smetrics.width;
+        metrics->horiBearingX = smetrics.bearingX;
+        metrics->horiBearingY = smetrics.bearingY;
+        metrics->horiAdvance  = smetrics.advance;
+
+        /* these metrics are made up at a higher level when */
+        /* needed.                                          */
+        metrics->vertBearingX = 0;
+        metrics->vertBearingY = 0;
+        metrics->vertAdvance  = 0;
+      }
+      break;
+
+    case 6:
+    case 7:
+    case 9:
+      /* variable big metrics */
+      if ( FT_STREAM_READ_FIELDS( sbit_metrics_fields, metrics ) )
+        goto Exit;
+      break;
+
+    case 5:
+    default:  /* constant metrics */
+      if ( range->index_format == 2 || range->index_format == 5 )
+        *metrics = range->metrics;
+      else
+        return SFNT_Err_Invalid_File_Format;
+   }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    crop_bitmap                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Crops a bitmap to its tightest bounding box, and adjusts its       */
+  /*    metrics.                                                           */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    map     :: The bitmap.                                             */
+  /*                                                                       */
+  /*    metrics :: The corresponding metrics structure.                    */
+  /*                                                                       */
+  static void
+  crop_bitmap( FT_Bitmap*       map,
+               TT_SBit_Metrics  metrics )
+  {
+    /***********************************************************************/
+    /*                                                                     */
+    /* In this situation, some bounding boxes of embedded bitmaps are too  */
+    /* large.  We need to crop it to a reasonable size.                    */
+    /*                                                                     */
+    /*      ---------                                                      */
+    /*      |       |                -----                                 */
+    /*      |  ***  |                |***|                                 */
+    /*      |   *   |                | * |                                 */
+    /*      |   *   |    ------>     | * |                                 */
+    /*      |   *   |                | * |                                 */
+    /*      |   *   |                | * |                                 */
+    /*      |  ***  |                |***|                                 */
+    /*      ---------                -----                                 */
+    /*                                                                     */
+    /***********************************************************************/
+
+    FT_Int    rows, count;
+    FT_Long   line_len;
+    FT_Byte*  line;
+
+
+    /***********************************************************************/
+    /*                                                                     */
+    /* first of all, check the top-most lines of the bitmap, and remove    */
+    /* them if they're empty.                                              */
+    /*                                                                     */
+    {
+      line     = (FT_Byte*)map->buffer;
+      rows     = map->rows;
+      line_len = map->pitch;
+
+
+      for ( count = 0; count < rows; count++ )
+      {
+        FT_Byte*  cur   = line;
+        FT_Byte*  limit = line + line_len;
+
+
+        for ( ; cur < limit; cur++ )
+          if ( cur[0] )
+            goto Found_Top;
+
+        /* the current line was empty - skip to next one */
+        line  = limit;
+      }
+
+    Found_Top:
+      /* check that we have at least one filled line */
+      if ( count >= rows )
+        goto Empty_Bitmap;
+
+      /* now, crop the empty upper lines */
+      if ( count > 0 )
+      {
+        line = (FT_Byte*)map->buffer;
+
+        FT_MEM_MOVE( line, line + count * line_len,
+                     ( rows - count ) * line_len );
+
+        metrics->height       = (FT_Byte)( metrics->height - count );
+        metrics->horiBearingY = (FT_Char)( metrics->horiBearingY - count );
+        metrics->vertBearingY = (FT_Char)( metrics->vertBearingY - count );
+
+        map->rows -= count;
+        rows      -= count;
+      }
+    }
+
+    /***********************************************************************/
+    /*                                                                     */
+    /* second, crop the lower lines                                        */
+    /*                                                                     */
+    {
+      line = (FT_Byte*)map->buffer + ( rows - 1 ) * line_len;
+
+      for ( count = 0; count < rows; count++ )
+      {
+        FT_Byte*  cur   = line;
+        FT_Byte*  limit = line + line_len;
+
+
+        for ( ; cur < limit; cur++ )
+          if ( cur[0] )
+            goto Found_Bottom;
+
+        /* the current line was empty - skip to previous one */
+        line -= line_len;
+      }
+
+    Found_Bottom:
+      if ( count > 0 )
+      {
+        metrics->height  = (FT_Byte)( metrics->height - count );
+        rows            -= count;
+        map->rows       -= count;
+      }
+    }
+
+    /***********************************************************************/
+    /*                                                                     */
+    /* third, get rid of the space on the left side of the glyph           */
+    /*                                                                     */
+    do
+    {
+      FT_Byte*  limit;
+
+
+      line  = (FT_Byte*)map->buffer;
+      limit = line + rows * line_len;
+
+      for ( ; line < limit; line += line_len )
+        if ( line[0] & 0x80 )
+          goto Found_Left;
+
+      /* shift the whole glyph one pixel to the left */
+      line  = (FT_Byte*)map->buffer;
+      limit = line + rows * line_len;
+
+      for ( ; line < limit; line += line_len )
+      {
+        FT_Int    n, width = map->width;
+        FT_Byte   old;
+        FT_Byte*  cur = line;
+
+
+        old = (FT_Byte)(cur[0] << 1);
+        for ( n = 8; n < width; n += 8 )
+        {
+          FT_Byte  val;
+
+
+          val    = cur[1];
+          cur[0] = (FT_Byte)( old | ( val >> 7 ) );
+          old    = (FT_Byte)( val << 1 );
+          cur++;
+        }
+        cur[0] = old;
+      }
+
+      map->width--;
+      metrics->horiBearingX++;
+      metrics->vertBearingX++;
+      metrics->width--;
+
+    } while ( map->width > 0 );
+
+  Found_Left:
+
+    /***********************************************************************/
+    /*                                                                     */
+    /* finally, crop the bitmap width to get rid of the space on the right */
+    /* side of the glyph.                                                  */
+    /*                                                                     */
+    do
+    {
+      FT_Int    right = map->width - 1;
+      FT_Byte*  limit;
+      FT_Byte   mask;
+
+
+      line  = (FT_Byte*)map->buffer + ( right >> 3 );
+      limit = line + rows * line_len;
+      mask  = (FT_Byte)( 0x80 >> ( right & 7 ) );
+
+      for ( ; line < limit; line += line_len )
+        if ( line[0] & mask )
+          goto Found_Right;
+
+      /* crop the whole glyph to the right */
+      map->width--;
+      metrics->width--;
+
+    } while ( map->width > 0 );
+
+  Found_Right:
+    /* all right, the bitmap was cropped */
+    return;
+
+  Empty_Bitmap:
+    map->width      = 0;
+    map->rows       = 0;
+    map->pitch      = 0;
+    map->pixel_mode = FT_PIXEL_MODE_MONO;
+  }
+
+
+  static FT_Error
+  Load_SBit_Single( FT_Bitmap*       map,
+                    FT_Int           x_offset,
+                    FT_Int           y_offset,
+                    FT_Int           pix_bits,
+                    FT_UShort        image_format,
+                    TT_SBit_Metrics  metrics,
+                    FT_Stream        stream )
+  {
+    FT_Error  error;
+
+
+    /* check that the source bitmap fits into the target pixmap */
+    if ( x_offset < 0 || x_offset + metrics->width  > map->width ||
+         y_offset < 0 || y_offset + metrics->height > map->rows  )
+    {
+      error = SFNT_Err_Invalid_Argument;
+
+      goto Exit;
+    }
+
+    {
+      FT_Int   glyph_width  = metrics->width;
+      FT_Int   glyph_height = metrics->height;
+      FT_Int   glyph_size;
+      FT_Int   line_bits    = pix_bits * glyph_width;
+      FT_Bool  pad_bytes    = 0;
+
+
+      /* compute size of glyph image */
+      switch ( image_format )
+      {
+      case 1:  /* byte-padded formats */
+      case 6:
+        {
+          FT_Int  line_length;
+
+
+          switch ( pix_bits )
+          {
+          case 1:
+            line_length = ( glyph_width + 7 ) >> 3;
+            break;
+          case 2:
+            line_length = ( glyph_width + 3 ) >> 2;
+            break;
+          case 4:
+            line_length = ( glyph_width + 1 ) >> 1;
+            break;
+          default:
+            line_length =   glyph_width;
+          }
+
+          glyph_size = glyph_height * line_length;
+          pad_bytes  = 1;
+        }
+        break;
+
+      case 2:
+      case 5:
+      case 7:
+        line_bits  =   glyph_width  * pix_bits;
+        glyph_size = ( glyph_height * line_bits + 7 ) >> 3;
+        break;
+
+      default:  /* invalid format */
+        return SFNT_Err_Invalid_File_Format;
+      }
+
+      /* Now read data and draw glyph into target pixmap       */
+      if ( FT_FRAME_ENTER( glyph_size ) )
+        goto Exit;
+
+      /* don't forget to multiply `x_offset' by `map->pix_bits' as */
+      /* the sbit blitter doesn't make a difference between pixmap */
+      /* depths.                                                   */
+      blit_sbit( map, (FT_Byte*)stream->cursor, line_bits, pad_bytes,
+                 x_offset * pix_bits, y_offset, metrics->height );
+
+      FT_FRAME_EXIT();
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  Load_SBit_Image( TT_SBit_Strike   strike,
+                   TT_SBit_Range    range,
+                   FT_ULong         ebdt_pos,
+                   FT_ULong         glyph_offset,
+                   FT_GlyphSlot     slot,
+                   FT_Int           x_offset,
+                   FT_Int           y_offset,
+                   FT_Stream        stream,
+                   TT_SBit_Metrics  metrics,
+                   FT_Int           depth )
+  {
+    FT_Memory   memory = stream->memory;
+    FT_Bitmap*  map    = &slot->bitmap;
+    FT_Error    error;
+
+
+    /* place stream at beginning of glyph data and read metrics */
+    if ( FT_STREAM_SEEK( ebdt_pos + glyph_offset ) )
+      goto Exit;
+
+    error = tt_load_sbit_metrics( stream, range, metrics );
+    if ( error )
+      goto Exit;
+
+    /* This function is recursive.  At the top-level call, we  */
+    /* compute the dimensions of the higher-level glyph to     */
+    /* allocate the final pixmap buffer.                       */
+    if ( depth == 0 )
+    {
+      FT_Long  size;
+
+
+      map->width = metrics->width;
+      map->rows  = metrics->height;
+
+      switch ( strike->bit_depth )
+      {
+      case 1:
+        map->pixel_mode = FT_PIXEL_MODE_MONO;
+        map->pitch      = ( map->width + 7 ) >> 3;
+        break;
+
+      case 2:
+        map->pixel_mode = FT_PIXEL_MODE_GRAY2;
+        map->pitch      = ( map->width + 3 ) >> 2;
+        break;
+
+      case 4:
+        map->pixel_mode = FT_PIXEL_MODE_GRAY4;
+        map->pitch      = ( map->width + 1 ) >> 1;
+        break;
+
+      case 8:
+        map->pixel_mode = FT_PIXEL_MODE_GRAY;
+        map->pitch      = map->width;
+        break;
+
+      default:
+        return SFNT_Err_Invalid_File_Format;
+      }
+
+      size = map->rows * map->pitch;
+
+      /* check that there is no empty image */
+      if ( size == 0 )
+        goto Exit;     /* exit successfully! */
+
+      error = ft_glyphslot_alloc_bitmap( slot, size );
+      if (error)
+        goto Exit;
+    }
+
+    switch ( range->image_format )
+    {
+    case 1:  /* single sbit image - load it */
+    case 2:
+    case 5:
+    case 6:
+    case 7:
+      return Load_SBit_Single( map, x_offset, y_offset, strike->bit_depth,
+                               range->image_format, metrics, stream );
+
+    case 8:  /* compound format */
+      if ( FT_STREAM_SKIP( 1L ) )
+      {
+        error = SFNT_Err_Invalid_Stream_Skip;
+        goto Exit;
+      }
+      /* fallthrough */
+
+    case 9:
+      break;
+
+    default: /* invalid image format */
+      return SFNT_Err_Invalid_File_Format;
+    }
+
+    /* All right, we have a compound format.  First of all, read */
+    /* the array of elements.                                    */
+    {
+      TT_SBit_Component  components = NULL;
+      TT_SBit_Component  comp;
+      FT_UShort          num_components, count;
+
+
+      if ( FT_READ_USHORT( num_components )           ||
+           FT_NEW_ARRAY( components, num_components ) )
+        goto Exit;
+
+      count = num_components;
+
+      if ( FT_FRAME_ENTER( 4L * num_components ) )
+        goto Fail_Memory;
+
+      for ( comp = components; count > 0; count--, comp++ )
+      {
+        comp->glyph_code = FT_GET_USHORT();
+        comp->x_offset   = FT_GET_CHAR();
+        comp->y_offset   = FT_GET_CHAR();
+      }
+
+      FT_FRAME_EXIT();
+
+      /* Now recursively load each element glyph */
+      count = num_components;
+      comp  = components;
+      for ( ; count > 0; count--, comp++ )
+      {
+        TT_SBit_Range       elem_range;
+        TT_SBit_MetricsRec  elem_metrics;
+        FT_ULong            elem_offset;
+
+
+        /* find the range for this element */
+        error = find_sbit_range( comp->glyph_code,
+                                 strike,
+                                 &elem_range,
+                                 &elem_offset );
+        if ( error )
+          goto Fail_Memory;
+
+        /* now load the element, recursively */
+        error = Load_SBit_Image( strike,
+                                 elem_range,
+                                 ebdt_pos,
+                                 elem_offset,
+                                 slot,
+                                 x_offset + comp->x_offset,
+                                 y_offset + comp->y_offset,
+                                 stream,
+                                 &elem_metrics,
+                                 depth + 1 );
+        if ( error )
+          goto Fail_Memory;
+      }
+
+    Fail_Memory:
+      FT_FREE( components );
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_sbit_image                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads a given glyph sbit image from the font resource.  This also  */
+  /*    returns its metrics.                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face         :: The target face object.                            */
+  /*                                                                       */
+  /*    strike_index :: The current strike index.                          */
+  /*                                                                       */
+  /*    glyph_index  :: The current glyph index.                           */
+  /*                                                                       */
+  /*    load_flags   :: The glyph load flags (the code checks for the flag */
+  /*                    FT_LOAD_CROP_BITMAP).                              */
+  /*                                                                       */
+  /*    stream       :: The input stream.                                  */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    map          :: The target pixmap.                                 */
+  /*                                                                       */
+  /*    metrics      :: A big sbit metrics structure for the glyph image.  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.  Returns an error if no     */
+  /*    glyph sbit exists for the index.                                   */
+  /*                                                                       */
+  /*  <Note>                                                               */
+  /*    The `map.buffer' field is always freed before the glyph is loaded. */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_sbit_image( TT_Face              face,
+                           FT_ULong             strike_index,
+                           FT_UInt              glyph_index,
+                           FT_UInt              load_flags,
+                           FT_Stream            stream,
+                           FT_Bitmap           *map,
+                           TT_SBit_MetricsRec  *metrics )
+  {
+    FT_Error        error;
+    FT_ULong        ebdt_pos, glyph_offset;
+
+    TT_SBit_Strike  strike;
+    TT_SBit_Range   range;
+
+
+    /* Check whether there is a glyph sbit for the current index */
+    error = tt_find_sbit_image( face, glyph_index, strike_index,
+                                &range, &strike, &glyph_offset );
+    if ( error )
+      goto Exit;
+
+    /* now, find the location of the `EBDT' table in */
+    /* the font file                                 */
+    error = face->goto_table( face, TTAG_EBDT, stream, 0 );
+    if ( error )
+      error = face->goto_table( face, TTAG_bdat, stream, 0 );
+    if ( error )
+      goto Exit;
+
+    ebdt_pos = FT_STREAM_POS();
+
+    error = Load_SBit_Image( strike, range, ebdt_pos, glyph_offset,
+                             face->root.glyph, 0, 0, stream, metrics, 0 );
+    if ( error )
+      goto Exit;
+
+    /* setup vertical metrics if needed */
+    if ( strike->flags & 1 )
+    {
+      /* in case of a horizontal strike only */
+      FT_Int  advance;
+
+
+      advance = strike->hori.ascender - strike->hori.descender;
+
+      /* some heuristic values */
+
+      metrics->vertBearingX = (FT_Char)(-metrics->width / 2 );
+      metrics->vertBearingY = (FT_Char)( ( advance - metrics->height ) / 2 );
+      metrics->vertAdvance  = (FT_Char)( advance * 12 / 10 );
+    }
+
+    /* Crop the bitmap now, unless specified otherwise */
+    if ( load_flags & FT_LOAD_CROP_BITMAP )
+      crop_bitmap( map, metrics );
+
+  Exit:
+    return error;
+  }
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+
+/* END */
diff --git a/src/sfnt/ttsbit.h b/src/sfnt/ttsbit.h
new file mode 100644 (file)
index 0000000..7ea2af1
--- /dev/null
@@ -0,0 +1,79 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttsbit.h                                                               */
+/*                                                                         */
+/*    TrueType and OpenType embedded bitmap support (specification).       */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTSBIT_H__
+#define __TTSBIT_H__
+
+
+#include <ft2build.h>
+#include "ttload.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_eblc( TT_Face    face,
+                     FT_Stream  stream );
+
+  FT_LOCAL( void )
+  tt_face_free_eblc( TT_Face  face );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_set_sbit_strike( TT_Face          face,
+                           FT_Size_Request  req,
+                           FT_ULong*        astrike_index );
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_strike_metrics( TT_Face           face,
+                               FT_ULong          strike_index,
+                               FT_Size_Metrics*  metrics );
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+  FT_LOCAL( FT_Error )
+  tt_find_sbit_image( TT_Face          face,
+                      FT_UInt          glyph_index,
+                      FT_ULong         strike_index,
+                      TT_SBit_Range   *arange,
+                      TT_SBit_Strike  *astrike,
+                      FT_ULong        *aglyph_offset );
+
+  FT_LOCAL( FT_Error )
+  tt_load_sbit_metrics( FT_Stream        stream,
+                        TT_SBit_Range    range,
+                        TT_SBit_Metrics  metrics );
+
+#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_sbit_image( TT_Face              face,
+                           FT_ULong             strike_index,
+                           FT_UInt              glyph_index,
+                           FT_UInt              load_flags,
+                           FT_Stream            stream,
+                           FT_Bitmap           *map,
+                           TT_SBit_MetricsRec  *metrics );
+
+
+FT_END_HEADER
+
+#endif /* __TTSBIT_H__ */
+
+
+/* END */
diff --git a/src/sfnt/ttsbit0.c b/src/sfnt/ttsbit0.c
new file mode 100644 (file)
index 0000000..38bcf21
--- /dev/null
@@ -0,0 +1,1011 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttsbit0.c                                                              */
+/*                                                                         */
+/*    TrueType and OpenType embedded bitmap support (body).                */
+/*    This is a heap-optimized version.                                    */
+/*                                                                         */
+/*  Copyright 2005, 2006, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+/* This file is included by ttsbit.c */
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_TRUETYPE_TAGS_H
+#include "ttsbit.h"
+
+#include "sferrors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttsbit
+
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_eblc( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error  error = SFNT_Err_Ok;
+    FT_Fixed  version;
+    FT_ULong  num_strikes, table_size;
+    FT_Byte*  p;
+    FT_Byte*  p_limit;
+    FT_UInt   count;
+
+
+    face->sbit_num_strikes = 0;
+
+    /* this table is optional */
+    error = face->goto_table( face, TTAG_EBLC, stream, &table_size );
+    if ( error )
+      error = face->goto_table( face, TTAG_bloc, stream, &table_size );
+    if ( error )
+      goto Exit;
+
+    if ( table_size < 8 )
+    {
+      FT_ERROR(( "tt_face_load_sbit_strikes: table too short\n" ));
+      error = SFNT_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    if ( FT_FRAME_EXTRACT( table_size, face->sbit_table ) )
+      goto Exit;
+
+    face->sbit_table_size = table_size;
+
+    p       = face->sbit_table;
+    p_limit = p + table_size;
+
+    version     = FT_NEXT_ULONG( p );
+    num_strikes = FT_NEXT_ULONG( p );
+
+    if ( version != 0x00020000UL || num_strikes >= 0x10000UL )
+    {
+      FT_ERROR(( "tt_face_load_sbit_strikes: invalid table version\n" ));
+      error = SFNT_Err_Invalid_File_Format;
+      goto Fail;
+    }
+
+    /*
+     *  Count the number of strikes available in the table.  We are a bit
+     *  paranoid there and don't trust the data.
+     */
+    count = (FT_UInt)num_strikes;
+    if ( 8 + 48UL * count > table_size )
+      count = (FT_UInt)( ( p_limit - p ) / 48 );
+
+    face->sbit_num_strikes = count;
+
+    FT_TRACE3(( "sbit_num_strikes: %u\n", count ));
+  Exit:
+    return error;
+
+  Fail:
+    FT_FRAME_RELEASE( face->sbit_table );
+    face->sbit_table_size = 0;
+    goto Exit;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  tt_face_free_eblc( TT_Face  face )
+  {
+    FT_Stream  stream = face->root.stream;
+
+
+    FT_FRAME_RELEASE( face->sbit_table );
+    face->sbit_table_size  = 0;
+    face->sbit_num_strikes = 0;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_set_sbit_strike( TT_Face          face,
+                           FT_Size_Request  req,
+                           FT_ULong*        astrike_index )
+  {
+    return FT_Match_Size( (FT_Face)face, req, 0, astrike_index );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_strike_metrics( TT_Face           face,
+                               FT_ULong          strike_index,
+                               FT_Size_Metrics*  metrics )
+  {
+    FT_Byte*  strike;
+
+
+    if ( strike_index >= (FT_ULong)face->sbit_num_strikes )
+      return SFNT_Err_Invalid_Argument;
+
+    strike = face->sbit_table + 8 + strike_index * 48;
+
+    metrics->x_ppem = (FT_UShort)strike[44];
+    metrics->y_ppem = (FT_UShort)strike[45];
+
+    metrics->ascender  = (FT_Char)strike[16] << 6;  /* hori.ascender  */
+    metrics->descender = (FT_Char)strike[17] << 6;  /* hori.descender */
+    metrics->height    = metrics->ascender - metrics->descender;
+
+    /* XXX: Is this correct? */
+    metrics->max_advance = ( (FT_Char)strike[22] + /* min_origin_SB  */
+                                      strike[18] + /* max_width      */
+                             (FT_Char)strike[23]   /* min_advance_SB */
+                                                 ) << 6;
+
+    return SFNT_Err_Ok;
+  }
+
+
+  typedef struct  TT_SBitDecoderRec_
+  {
+    TT_Face          face;
+    FT_Stream        stream;
+    FT_Bitmap*       bitmap;
+    TT_SBit_Metrics  metrics;
+    FT_Bool          metrics_loaded;
+    FT_Bool          bitmap_allocated;
+    FT_Byte          bit_depth;
+
+    FT_ULong         ebdt_start;
+    FT_ULong         ebdt_size;
+
+    FT_ULong         strike_index_array;
+    FT_ULong         strike_index_count;
+    FT_Byte*         eblc_base;
+    FT_Byte*         eblc_limit;
+
+  } TT_SBitDecoderRec, *TT_SBitDecoder;
+
+
+  static FT_Error
+  tt_sbit_decoder_init( TT_SBitDecoder       decoder,
+                        TT_Face              face,
+                        FT_ULong             strike_index,
+                        TT_SBit_MetricsRec*  metrics )
+  {
+    FT_Error   error;
+    FT_Stream  stream = face->root.stream;
+    FT_ULong   ebdt_size;
+
+
+    error = face->goto_table( face, TTAG_EBDT, stream, &ebdt_size );
+    if ( error )
+      error = face->goto_table( face, TTAG_bdat, stream, &ebdt_size );
+    if ( error )
+      goto Exit;
+
+    decoder->face    = face;
+    decoder->stream  = stream;
+    decoder->bitmap  = &face->root.glyph->bitmap;
+    decoder->metrics = metrics;
+
+    decoder->metrics_loaded   = 0;
+    decoder->bitmap_allocated = 0;
+
+    decoder->ebdt_start = FT_STREAM_POS();
+    decoder->ebdt_size  = ebdt_size;
+
+    decoder->eblc_base  = face->sbit_table;
+    decoder->eblc_limit = face->sbit_table + face->sbit_table_size;
+
+    /* now find the strike corresponding to the index */
+    {
+      FT_Byte*  p;
+
+
+      if ( 8 + 48 * strike_index + 3 * 4 + 34 + 1 > face->sbit_table_size )
+      {
+        error = SFNT_Err_Invalid_File_Format;
+        goto Exit;
+      }
+
+      p = decoder->eblc_base + 8 + 48 * strike_index;
+
+      decoder->strike_index_array = FT_NEXT_ULONG( p );
+      p                          += 4;
+      decoder->strike_index_count = FT_NEXT_ULONG( p );
+      p                          += 34;
+      decoder->bit_depth          = *p;
+
+      if ( decoder->strike_index_array > face->sbit_table_size             ||
+           decoder->strike_index_array + 8 * decoder->strike_index_count >
+             face->sbit_table_size                                         )
+        error = SFNT_Err_Invalid_File_Format;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static void
+  tt_sbit_decoder_done( TT_SBitDecoder  decoder )
+  {
+    FT_UNUSED( decoder );
+  }
+
+
+  static FT_Error
+  tt_sbit_decoder_alloc_bitmap( TT_SBitDecoder  decoder )
+  {
+    FT_Error    error = SFNT_Err_Ok;
+    FT_UInt     width, height;
+    FT_Bitmap*  map = decoder->bitmap;
+    FT_Long     size;
+
+
+    if ( !decoder->metrics_loaded )
+    {
+      error = SFNT_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    width  = decoder->metrics->width;
+    height = decoder->metrics->height;
+
+    map->width = (int)width;
+    map->rows  = (int)height;
+
+    switch ( decoder->bit_depth )
+    {
+    case 1:
+      map->pixel_mode = FT_PIXEL_MODE_MONO;
+      map->pitch      = ( map->width + 7 ) >> 3;
+      break;
+
+    case 2:
+      map->pixel_mode = FT_PIXEL_MODE_GRAY2;
+      map->pitch      = ( map->width + 3 ) >> 2;
+      break;
+
+    case 4:
+      map->pixel_mode = FT_PIXEL_MODE_GRAY4;
+      map->pitch      = ( map->width + 1 ) >> 1;
+      break;
+
+    case 8:
+      map->pixel_mode = FT_PIXEL_MODE_GRAY;
+      map->pitch      = map->width;
+      break;
+
+    default:
+      error = SFNT_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    size = map->rows * map->pitch;
+
+    /* check that there is no empty image */
+    if ( size == 0 )
+      goto Exit;     /* exit successfully! */
+
+    error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size );
+    if ( error )
+      goto Exit;
+
+    decoder->bitmap_allocated = 1;
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  tt_sbit_decoder_load_metrics( TT_SBitDecoder  decoder,
+                                FT_Byte*       *pp,
+                                FT_Byte*        limit,
+                                FT_Bool         big )
+  {
+    FT_Byte*         p       = *pp;
+    TT_SBit_Metrics  metrics = decoder->metrics;
+
+
+    if ( p + 5 > limit )
+      goto Fail;
+
+    metrics->height       = p[0];
+    metrics->width        = p[1];
+    metrics->horiBearingX = (FT_Char)p[2];
+    metrics->horiBearingY = (FT_Char)p[3];
+    metrics->horiAdvance  = p[4];
+
+    p += 5;
+    if ( big )
+    {
+      if ( p + 3 > limit )
+        goto Fail;
+
+      metrics->vertBearingX = (FT_Char)p[0];
+      metrics->vertBearingY = (FT_Char)p[1];
+      metrics->vertAdvance  = p[2];
+
+      p += 3;
+    }
+
+    decoder->metrics_loaded = 1;
+    *pp = p;
+    return SFNT_Err_Ok;
+
+  Fail:
+    return SFNT_Err_Invalid_Argument;
+  }
+
+
+  /* forward declaration */
+  static FT_Error
+  tt_sbit_decoder_load_image( TT_SBitDecoder  decoder,
+                              FT_UInt         glyph_index,
+                              FT_Int          x_pos,
+                              FT_Int          y_pos );
+
+  typedef FT_Error  (*TT_SBitDecoder_LoadFunc)( TT_SBitDecoder  decoder,
+                                                FT_Byte*        p,
+                                                FT_Byte*        plimit,
+                                                FT_Int          x_pos,
+                                                FT_Int          y_pos );
+
+
+  static FT_Error
+  tt_sbit_decoder_load_byte_aligned( TT_SBitDecoder  decoder,
+                                     FT_Byte*        p,
+                                     FT_Byte*        limit,
+                                     FT_Int          x_pos,
+                                     FT_Int          y_pos )
+  {
+    FT_Error    error = SFNT_Err_Ok;
+    FT_Byte*    line;
+    FT_Int      bit_height, bit_width, pitch, width, height, h;
+    FT_Bitmap*  bitmap;
+
+
+    if ( !decoder->bitmap_allocated )
+    {
+      error = tt_sbit_decoder_alloc_bitmap( decoder );
+      if ( error )
+        goto Exit;
+    }
+
+    /* check that we can write the glyph into the bitmap */
+    bitmap     = decoder->bitmap;
+    bit_width  = bitmap->width;
+    bit_height = bitmap->rows;
+    pitch      = bitmap->pitch;
+    line       = bitmap->buffer;
+
+    width  = decoder->metrics->width;
+    height = decoder->metrics->height;
+
+    if ( x_pos < 0 || x_pos + width > bit_width   ||
+         y_pos < 0 || y_pos + height > bit_height )
+    {
+      error = SFNT_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    if ( p + ( ( width + 7 ) >> 3 ) * height > limit )
+    {
+      error = SFNT_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    /* now do the blit */
+    line  += y_pos * pitch + ( x_pos >> 3 );
+    x_pos &= 7;
+
+    if ( x_pos == 0 )  /* the easy one */
+    {
+      for ( h = height; h > 0; h--, line += pitch )
+      {
+        FT_Byte*  write = line;
+        FT_Int    w;
+
+
+        for ( w = width; w >= 8; w -= 8 )
+        {
+          write[0] = (FT_Byte)( write[0] | *p++ );
+          write   += 1;
+        }
+
+        if ( w > 0 )
+          write[0] = (FT_Byte)( write[0] | ( *p++ & ( 0xFF00U >> w ) ) );
+      }
+    }
+    else  /* x_pos > 0 */
+    {
+      for ( h = height; h > 0; h--, line += pitch )
+      {
+        FT_Byte*  write = line;
+        FT_Int    w;
+        FT_UInt   wval = 0;
+
+
+        for ( w = width; w >= 8; w -= 8 )
+        {
+          wval      = (FT_UInt)( wval | *p++ );
+          write[0]  = (FT_Byte)( write[0] | ( wval >> x_pos ) );
+          write    += 1;
+          wval    <<= 8;
+        }
+
+        if ( w > 0 )
+          wval = (FT_UInt)( wval | ( *p++ & ( 0xFF00U >> w ) ) );
+
+        /* all bits read and there are `x_pos + w' bits to be written */
+
+        write[0] = (FT_Byte)( write[0] | ( wval >> x_pos ) );
+
+        if ( x_pos + w > 8 )
+        {
+          write++;
+          wval   <<= 8;
+          write[0] = (FT_Byte)( write[0] | ( wval >> x_pos ) );
+        }
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*
+   * Load a bit-aligned bitmap (with pointer `p') into a line-aligned bitmap
+   * (with pointer `write').  In the example below, the width is 3 pixel,
+   * and `x_pos' is 1 pixel.
+   *
+   *       p                               p+1
+   *     |                               |                               |
+   *     | 7   6   5   4   3   2   1   0 | 7   6   5   4   3   2   1   0 |...
+   *     |                               |                               |
+   *       +-------+   +-------+   +-------+ ...
+   *           .           .           .
+   *           .           .           .
+   *           v           .           .
+   *       +-------+       .           .
+   * |                               | .
+   * | 7   6   5   4   3   2   1   0 | .
+   * |                               | .
+   *   write               .           .
+   *                       .           .
+   *                       v           .
+   *                   +-------+       .
+   *             |                               |
+   *             | 7   6   5   4   3   2   1   0 |
+   *             |                               |
+   *               write+1             .
+   *                                   .
+   *                                   v
+   *                               +-------+
+   *                         |                               |
+   *                         | 7   6   5   4   3   2   1   0 |
+   *                         |                               |
+   *                           write+2
+   *
+   */
+
+  static FT_Error
+  tt_sbit_decoder_load_bit_aligned( TT_SBitDecoder  decoder,
+                                    FT_Byte*        p,
+                                    FT_Byte*        limit,
+                                    FT_Int          x_pos,
+                                    FT_Int          y_pos )
+  {
+    FT_Error    error = SFNT_Err_Ok;
+    FT_Byte*    line;
+    FT_Int      bit_height, bit_width, pitch, width, height, h, nbits;
+    FT_Bitmap*  bitmap;
+    FT_UShort   rval;
+
+
+    if ( !decoder->bitmap_allocated )
+    {
+      error = tt_sbit_decoder_alloc_bitmap( decoder );
+      if ( error )
+        goto Exit;
+    }
+
+    /* check that we can write the glyph into the bitmap */
+    bitmap     = decoder->bitmap;
+    bit_width  = bitmap->width;
+    bit_height = bitmap->rows;
+    pitch      = bitmap->pitch;
+    line       = bitmap->buffer;
+
+    width  = decoder->metrics->width;
+    height = decoder->metrics->height;
+
+    if ( x_pos < 0 || x_pos + width  > bit_width  ||
+         y_pos < 0 || y_pos + height > bit_height )
+    {
+      error = SFNT_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    if ( p + ( ( width * height + 7 ) >> 3 ) > limit )
+    {
+      error = SFNT_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    /* now do the blit */
+
+    /* adjust `line' to point to the first byte of the bitmap */
+    line  += y_pos * pitch + ( x_pos >> 3 );
+    x_pos &= 7;
+
+    /* the higher byte of `rval' is used as a buffer */
+    rval  = 0;
+    nbits = 0;
+
+    for ( h = height; h > 0; h--, line += pitch )
+    {
+      FT_Byte*  write = line;
+      FT_Int    w     = width;
+
+
+      /* handle initial byte (in target bitmap) specially if necessary */
+      if ( x_pos )
+      {
+        w = ( width < 8 - x_pos ) ? width : 8 - x_pos;
+
+        if ( h == height )
+        {
+          rval  = *p++;
+          nbits = x_pos;
+        }
+        else if ( nbits < w )
+        {
+          if ( p < limit )
+            rval |= *p++;
+          nbits += 8 - w;
+        }
+        else
+        {
+          rval  >>= 8;
+          nbits  -= w;
+        }
+
+        *write++ |= ( ( rval >> nbits ) & 0xFF ) &
+                    ( ~( 0xFF << w ) << ( 8 - w - x_pos ) );
+        rval    <<= 8;
+
+        w = width - w;
+      }
+
+      /* handle medial bytes */
+      for ( ; w >= 8; w -= 8 )
+      {
+        rval     |= *p++;
+        *write++ |= ( rval >> nbits ) & 0xFF;
+
+        rval <<= 8;
+      }
+
+      /* handle final byte if necessary */
+      if ( w > 0 )
+      {
+        if ( nbits < w )
+        {
+          if ( p < limit )
+            rval |= *p++;
+          *write |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w );
+          nbits  += 8 - w;
+
+          rval <<= 8;
+        }
+        else
+        {
+          *write |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w );
+          nbits  -= w;
+        }
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  tt_sbit_decoder_load_compound( TT_SBitDecoder  decoder,
+                                 FT_Byte*        p,
+                                 FT_Byte*        limit,
+                                 FT_Int          x_pos,
+                                 FT_Int          y_pos )
+  {
+    FT_Error  error = SFNT_Err_Ok;
+    FT_UInt   num_components, nn;
+
+    FT_Char  horiBearingX = decoder->metrics->horiBearingX;
+    FT_Char  horiBearingY = decoder->metrics->horiBearingY;
+    FT_Byte  horiAdvance  = decoder->metrics->horiAdvance;
+    FT_Char  vertBearingX = decoder->metrics->vertBearingX;
+    FT_Char  vertBearingY = decoder->metrics->vertBearingY;
+    FT_Byte  vertAdvance  = decoder->metrics->vertAdvance;
+
+
+    if ( p + 2 > limit )
+      goto Fail;
+
+    num_components = FT_NEXT_USHORT( p );
+    if ( p + 4 * num_components > limit )
+      goto Fail;
+
+    if ( !decoder->bitmap_allocated )
+    {
+      error = tt_sbit_decoder_alloc_bitmap( decoder );
+      if ( error )
+        goto Exit;
+    }
+
+    for ( nn = 0; nn < num_components; nn++ )
+    {
+      FT_UInt  gindex = FT_NEXT_USHORT( p );
+      FT_Byte  dx     = FT_NEXT_BYTE( p );
+      FT_Byte  dy     = FT_NEXT_BYTE( p );
+
+
+      /* NB: a recursive call */
+      error = tt_sbit_decoder_load_image( decoder, gindex,
+                                          x_pos + dx, y_pos + dy );
+      if ( error )
+        break;
+    }
+
+    decoder->metrics->horiBearingX = horiBearingX;
+    decoder->metrics->horiBearingY = horiBearingY;
+    decoder->metrics->horiAdvance  = horiAdvance;
+    decoder->metrics->vertBearingX = vertBearingX;
+    decoder->metrics->vertBearingY = vertBearingY;
+    decoder->metrics->vertAdvance  = vertAdvance;
+    decoder->metrics->width        = (FT_UInt)decoder->bitmap->width;
+    decoder->metrics->height       = (FT_UInt)decoder->bitmap->rows;
+
+  Exit:
+    return error;
+
+  Fail:
+    error = SFNT_Err_Invalid_File_Format;
+    goto Exit;
+  }
+
+
+  static FT_Error
+  tt_sbit_decoder_load_bitmap( TT_SBitDecoder  decoder,
+                               FT_UInt         glyph_format,
+                               FT_ULong        glyph_start,
+                               FT_ULong        glyph_size,
+                               FT_Int          x_pos,
+                               FT_Int          y_pos )
+  {
+    FT_Error   error;
+    FT_Stream  stream = decoder->stream;
+    FT_Byte*   p;
+    FT_Byte*   p_limit;
+    FT_Byte*   data;
+
+
+    /* seek into the EBDT table now */
+    if ( glyph_start + glyph_size > decoder->ebdt_size )
+    {
+      error = SFNT_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    if ( FT_STREAM_SEEK( decoder->ebdt_start + glyph_start ) ||
+         FT_FRAME_EXTRACT( glyph_size, data )                )
+      goto Exit;
+
+    p       = data;
+    p_limit = p + glyph_size;
+
+    /* read the data, depending on the glyph format */
+    switch ( glyph_format )
+    {
+    case 1:
+    case 2:
+    case 8:
+      error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 0 );
+      break;
+
+    case 6:
+    case 7:
+    case 9:
+      error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 );
+      break;
+
+    default:
+      error = SFNT_Err_Ok;
+    }
+
+    if ( error )
+      goto Fail;
+
+    {
+      TT_SBitDecoder_LoadFunc  loader;
+
+
+      switch ( glyph_format )
+      {
+      case 1:
+      case 6:
+        loader = tt_sbit_decoder_load_byte_aligned;
+        break;
+
+      case 2:
+      case 5:
+      case 7:
+        loader = tt_sbit_decoder_load_bit_aligned;
+        break;
+
+      case 8:
+        if ( p + 1 > p_limit )
+          goto Fail;
+
+        p += 1;  /* skip padding */
+        /* fall-through */
+
+      case 9:
+        loader = tt_sbit_decoder_load_compound;
+        break;
+
+      default:
+        goto Fail;
+      }
+
+      error = loader( decoder, p, p_limit, x_pos, y_pos );
+    }
+
+  Fail:
+    FT_FRAME_RELEASE( data );
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  tt_sbit_decoder_load_image( TT_SBitDecoder  decoder,
+                              FT_UInt         glyph_index,
+                              FT_Int          x_pos,
+                              FT_Int          y_pos )
+  {
+    /*
+     *  First, we find the correct strike range that applies to this
+     *  glyph index.
+     */
+
+    FT_Byte*  p          = decoder->eblc_base + decoder->strike_index_array;
+    FT_Byte*  p_limit    = decoder->eblc_limit;
+    FT_ULong  num_ranges = decoder->strike_index_count;
+    FT_UInt   start, end, index_format, image_format;
+    FT_ULong  image_start = 0, image_end = 0, image_offset;
+
+
+    for ( ; num_ranges > 0; num_ranges-- )
+    {
+      start = FT_NEXT_USHORT( p );
+      end   = FT_NEXT_USHORT( p );
+
+      if ( glyph_index >= start && glyph_index <= end )
+        goto FoundRange;
+
+      p += 4;  /* ignore index offset */
+    }
+    goto NoBitmap;
+
+  FoundRange:
+    image_offset = FT_NEXT_ULONG( p );
+
+    /* overflow check */
+    if ( decoder->eblc_base + decoder->strike_index_array + image_offset <
+           decoder->eblc_base )
+      goto Failure;
+
+    p = decoder->eblc_base + decoder->strike_index_array + image_offset;
+    if ( p + 8 > p_limit )
+      goto NoBitmap;
+
+    /* now find the glyph's location and extend within the ebdt table */
+    index_format = FT_NEXT_USHORT( p );
+    image_format = FT_NEXT_USHORT( p );
+    image_offset = FT_NEXT_ULONG ( p );
+
+    switch ( index_format )
+    {
+    case 1: /* 4-byte offsets relative to `image_offset' */
+      {
+        p += 4 * ( glyph_index - start );
+        if ( p + 8 > p_limit )
+          goto NoBitmap;
+
+        image_start = FT_NEXT_ULONG( p );
+        image_end   = FT_NEXT_ULONG( p );
+
+        if ( image_start == image_end )  /* missing glyph */
+          goto NoBitmap;
+      }
+      break;
+
+    case 2: /* big metrics, constant image size */
+      {
+        FT_ULong  image_size;
+
+
+        if ( p + 12 > p_limit )
+          goto NoBitmap;
+
+        image_size = FT_NEXT_ULONG( p );
+
+        if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) )
+          goto NoBitmap;
+
+        image_start = image_size * ( glyph_index - start );
+        image_end   = image_start + image_size;
+      }
+      break;
+
+    case 3: /* 2-byte offsets relative to 'image_offset' */
+      {
+        p += 2 * ( glyph_index - start );
+        if ( p + 4 > p_limit )
+          goto NoBitmap;
+
+        image_start = FT_NEXT_USHORT( p );
+        image_end   = FT_NEXT_USHORT( p );
+
+        if ( image_start == image_end )  /* missing glyph */
+          goto NoBitmap;
+      }
+      break;
+
+    case 4: /* sparse glyph array with (glyph,offset) pairs */
+      {
+        FT_ULong  mm, num_glyphs;
+
+
+        if ( p + 4 > p_limit )
+          goto NoBitmap;
+
+        num_glyphs = FT_NEXT_ULONG( p );
+
+        /* overflow check */
+        if ( p + ( num_glyphs + 1 ) * 4 < p )
+          goto Failure;
+
+        if ( p + ( num_glyphs + 1 ) * 4 > p_limit )
+          goto NoBitmap;
+
+        for ( mm = 0; mm < num_glyphs; mm++ )
+        {
+          FT_UInt  gindex = FT_NEXT_USHORT( p );
+
+
+          if ( gindex == glyph_index )
+          {
+            image_start = FT_NEXT_USHORT( p );
+            p          += 2;
+            image_end   = FT_PEEK_USHORT( p );
+            break;
+          }
+          p += 2;
+        }
+
+        if ( mm >= num_glyphs )
+          goto NoBitmap;
+      }
+      break;
+
+    case 5: /* constant metrics with sparse glyph codes */
+      {
+        FT_ULong  image_size, mm, num_glyphs;
+
+
+        if ( p + 16 > p_limit )
+          goto NoBitmap;
+
+        image_size = FT_NEXT_ULONG( p );
+
+        if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) )
+          goto NoBitmap;
+
+        num_glyphs = FT_NEXT_ULONG( p );
+
+        /* overflow check */
+        if ( p + 2 * num_glyphs < p )
+          goto Failure;
+
+        if ( p + 2 * num_glyphs > p_limit )
+          goto NoBitmap;
+
+        for ( mm = 0; mm < num_glyphs; mm++ )
+        {
+          FT_UInt  gindex = FT_NEXT_USHORT( p );
+
+
+          if ( gindex == glyph_index )
+            break;
+        }
+
+        if ( mm >= num_glyphs )
+          goto NoBitmap;
+
+        image_start = image_size * mm;
+        image_end   = image_start + image_size;
+      }
+      break;
+
+    default:
+      goto NoBitmap;
+    }
+
+    if ( image_start > image_end )
+      goto NoBitmap;
+
+    image_end  -= image_start;
+    image_start = image_offset + image_start;
+
+    return tt_sbit_decoder_load_bitmap( decoder,
+                                        image_format,
+                                        image_start,
+                                        image_end,
+                                        x_pos,
+                                        y_pos );
+
+  Failure:
+    return SFNT_Err_Invalid_Table;
+
+  NoBitmap:
+    return SFNT_Err_Invalid_Argument;
+  }
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_sbit_image( TT_Face              face,
+                           FT_ULong             strike_index,
+                           FT_UInt              glyph_index,
+                           FT_UInt              load_flags,
+                           FT_Stream            stream,
+                           FT_Bitmap           *map,
+                           TT_SBit_MetricsRec  *metrics )
+  {
+    TT_SBitDecoderRec  decoder[1];
+    FT_Error           error;
+
+    FT_UNUSED( load_flags );
+    FT_UNUSED( stream );
+    FT_UNUSED( map );
+
+
+    error = tt_sbit_decoder_init( decoder, face, strike_index, metrics );
+    if ( !error )
+    {
+      error = tt_sbit_decoder_load_image( decoder, glyph_index, 0, 0 );
+      tt_sbit_decoder_done( decoder );
+    }
+
+    return error;
+  }
+
+/* EOF */
diff --git a/src/smooth/Jamfile b/src/smooth/Jamfile
new file mode 100644 (file)
index 0000000..a8496aa
--- /dev/null
@@ -0,0 +1,29 @@
+# FreeType 2 src/smooth Jamfile
+#
+# Copyright 2001 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) smooth ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = ftgrays ftsmooth ftspic ;
+  }
+  else
+  {
+    _sources = smooth ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/smooth Jamfile
diff --git a/src/smooth/ftgrays.c b/src/smooth/ftgrays.c
new file mode 100644 (file)
index 0000000..4c0eea5
--- /dev/null
@@ -0,0 +1,2066 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgrays.c                                                              */
+/*                                                                         */
+/*    A new `perfect' anti-aliasing renderer (body).                       */
+/*                                                                         */
+/*  Copyright 2000-2003, 2005-2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file can be compiled without the rest of the FreeType engine, by */
+  /* defining the _STANDALONE_ macro when compiling it.  You also need to  */
+  /* put the files `ftgrays.h' and `ftimage.h' into the current            */
+  /* compilation directory.  Typically, you could do something like        */
+  /*                                                                       */
+  /* - copy `src/smooth/ftgrays.c' (this file) to your current directory   */
+  /*                                                                       */
+  /* - copy `include/freetype/ftimage.h' and `src/smooth/ftgrays.h' to the */
+  /*   same directory                                                      */
+  /*                                                                       */
+  /* - compile `ftgrays' with the _STANDALONE_ macro defined, as in        */
+  /*                                                                       */
+  /*     cc -c -D_STANDALONE_ ftgrays.c                                    */
+  /*                                                                       */
+  /* The renderer can be initialized with a call to                        */
+  /* `ft_gray_raster.raster_new'; an anti-aliased bitmap can be generated  */
+  /* with a call to `ft_gray_raster.raster_render'.                        */
+  /*                                                                       */
+  /* See the comments and documentation in the file `ftimage.h' for more   */
+  /* details on how the raster works.                                      */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This is a new anti-aliasing scan-converter for FreeType 2.  The       */
+  /* algorithm used here is _very_ different from the one in the standard  */
+  /* `ftraster' module.  Actually, `ftgrays' computes the _exact_          */
+  /* coverage of the outline on each pixel cell.                           */
+  /*                                                                       */
+  /* It is based on ideas that I initially found in Raph Levien's          */
+  /* excellent LibArt graphics library (see http://www.levien.com/libart   */
+  /* for more information, though the web pages do not tell anything       */
+  /* about the renderer; you'll have to dive into the source code to       */
+  /* understand how it works).                                             */
+  /*                                                                       */
+  /* Note, however, that this is a _very_ different implementation         */
+  /* compared to Raph's.  Coverage information is stored in a very         */
+  /* different way, and I don't use sorted vector paths.  Also, it doesn't */
+  /* use floating point values.                                            */
+  /*                                                                       */
+  /* This renderer has the following advantages:                           */
+  /*                                                                       */
+  /* - It doesn't need an intermediate bitmap.  Instead, one can supply a  */
+  /*   callback function that will be called by the renderer to draw gray  */
+  /*   spans on any target surface.  You can thus do direct composition on */
+  /*   any kind of bitmap, provided that you give the renderer the right   */
+  /*   callback.                                                           */
+  /*                                                                       */
+  /* - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on   */
+  /*   each pixel cell.                                                    */
+  /*                                                                       */
+  /* - It performs a single pass on the outline (the `standard' FT2        */
+  /*   renderer makes two passes).                                         */
+  /*                                                                       */
+  /* - It can easily be modified to render to _any_ number of gray levels  */
+  /*   cheaply.                                                            */
+  /*                                                                       */
+  /* - For small (< 20) pixel sizes, it is faster than the standard        */
+  /*   renderer.                                                           */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_smooth
+
+
+#ifdef _STANDALONE_
+
+
+  /* define this to dump debugging information */
+/* #define FT_DEBUG_LEVEL_TRACE */
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+#include <stdio.h>
+#include <stdarg.h>
+#endif
+
+#include <stddef.h>
+#include <string.h>
+#include <setjmp.h>
+#include <limits.h>
+#define FT_UINT_MAX  UINT_MAX
+#define FT_INT_MAX   INT_MAX
+
+#define ft_memset   memset
+
+#define ft_setjmp   setjmp
+#define ft_longjmp  longjmp
+#define ft_jmp_buf  jmp_buf
+
+typedef ptrdiff_t  FT_PtrDist;
+
+
+#define ErrRaster_Invalid_Mode      -2
+#define ErrRaster_Invalid_Outline   -1
+#define ErrRaster_Invalid_Argument  -3
+#define ErrRaster_Memory_Overflow   -4
+
+#define FT_BEGIN_HEADER
+#define FT_END_HEADER
+
+#include "ftimage.h"
+#include "ftgrays.h"
+
+
+  /* This macro is used to indicate that a function parameter is unused. */
+  /* Its purpose is simply to reduce compiler warnings.  Note also that  */
+  /* simply defining it as `(void)x' doesn't avoid warnings with certain */
+  /* ANSI compilers (e.g. LCC).                                          */
+#define FT_UNUSED( x )  (x) = (x)
+
+
+  /* we only use level 5 & 7 tracing messages; cf. ftdebug.h */
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+  void
+  FT_Message( const char*  fmt,
+              ... )
+  {
+    va_list  ap;
+
+
+    va_start( ap, fmt );
+    vfprintf( stderr, fmt, ap );
+    va_end( ap );
+  }
+
+  /* we don't handle tracing levels in stand-alone mode; */
+#ifndef FT_TRACE5
+#define FT_TRACE5( varformat )  FT_Message varformat
+#endif
+#ifndef FT_TRACE7
+#define FT_TRACE7( varformat )  FT_Message varformat
+#endif
+#ifndef FT_ERROR
+#define FT_ERROR( varformat )   FT_Message varformat
+#endif
+
+#else /* !FT_DEBUG_LEVEL_TRACE */
+
+#define FT_TRACE5( x )  do { } while ( 0 )     /* nothing */
+#define FT_TRACE7( x )  do { } while ( 0 )     /* nothing */
+#define FT_ERROR( x )   do { } while ( 0 )     /* nothing */
+
+#endif /* !FT_DEBUG_LEVEL_TRACE */
+
+
+#define FT_DEFINE_OUTLINE_FUNCS( class_,               \
+                                 move_to_, line_to_,   \
+                                 conic_to_, cubic_to_, \
+                                 shift_, delta_ )      \
+          static const FT_Outline_Funcs class_ =       \
+          {                                            \
+            move_to_,                                  \
+            line_to_,                                  \
+            conic_to_,                                 \
+            cubic_to_,                                 \
+            shift_,                                    \
+            delta_                                     \
+         };
+
+#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_,            \
+                                raster_new_, raster_reset_,       \
+                                raster_set_mode_, raster_render_, \
+                                raster_done_ )                    \
+          const FT_Raster_Funcs class_ =                          \
+          {                                                       \
+            glyph_format_,                                        \
+            raster_new_,                                          \
+            raster_reset_,                                        \
+            raster_set_mode_,                                     \
+            raster_render_,                                       \
+            raster_done_                                          \
+         };
+
+#else /* !_STANDALONE_ */
+
+
+#include <ft2build.h>
+#include "ftgrays.h"
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_OUTLINE_H
+
+#include "ftsmerrs.h"
+
+#include "ftspic.h"
+
+#define ErrRaster_Invalid_Mode      Smooth_Err_Cannot_Render_Glyph
+#define ErrRaster_Invalid_Outline   Smooth_Err_Invalid_Outline
+#define ErrRaster_Memory_Overflow   Smooth_Err_Out_Of_Memory
+#define ErrRaster_Invalid_Argument  Smooth_Err_Invalid_Argument
+
+#endif /* !_STANDALONE_ */
+
+#ifndef FT_MEM_SET
+#define FT_MEM_SET( d, s, c )  ft_memset( d, s, c )
+#endif
+
+#ifndef FT_MEM_ZERO
+#define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )
+#endif
+
+  /* as usual, for the speed hungry :-) */
+
+#undef RAS_ARG
+#undef RAS_ARG_
+#undef RAS_VAR
+#undef RAS_VAR_
+
+#ifndef FT_STATIC_RASTER
+
+#define RAS_ARG   gray_PWorker  worker
+#define RAS_ARG_  gray_PWorker  worker,
+
+#define RAS_VAR   worker
+#define RAS_VAR_  worker,
+
+#else /* FT_STATIC_RASTER */
+
+#define RAS_ARG   /* empty */
+#define RAS_ARG_  /* empty */
+#define RAS_VAR   /* empty */
+#define RAS_VAR_  /* empty */
+
+#endif /* FT_STATIC_RASTER */
+
+
+  /* must be at least 6 bits! */
+#define PIXEL_BITS  8
+
+#undef FLOOR
+#undef CEILING
+#undef TRUNC
+#undef SCALED
+
+#define ONE_PIXEL       ( 1L << PIXEL_BITS )
+#define PIXEL_MASK      ( -1L << PIXEL_BITS )
+#define TRUNC( x )      ( (TCoord)( (x) >> PIXEL_BITS ) )
+#define SUBPIXELS( x )  ( (TPos)(x) << PIXEL_BITS )
+#define FLOOR( x )      ( (x) & -ONE_PIXEL )
+#define CEILING( x )    ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL )
+#define ROUND( x )      ( ( (x) + ONE_PIXEL / 2 ) & -ONE_PIXEL )
+
+#if PIXEL_BITS >= 6
+#define UPSCALE( x )    ( (x) << ( PIXEL_BITS - 6 ) )
+#define DOWNSCALE( x )  ( (x) >> ( PIXEL_BITS - 6 ) )
+#else
+#define UPSCALE( x )    ( (x) >> ( 6 - PIXEL_BITS ) )
+#define DOWNSCALE( x )  ( (x) << ( 6 - PIXEL_BITS ) )
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*   TYPE DEFINITIONS                                                    */
+  /*                                                                       */
+
+  /* don't change the following types to FT_Int or FT_Pos, since we might */
+  /* need to define them to "float" or "double" when experimenting with   */
+  /* new algorithms                                                       */
+
+  typedef long  TCoord;   /* integer scanline/pixel coordinate */
+  typedef long  TPos;     /* sub-pixel coordinate              */
+
+  /* determine the type used to store cell areas.  This normally takes at */
+  /* least PIXEL_BITS*2 + 1 bits.  On 16-bit systems, we need to use      */
+  /* `long' instead of `int', otherwise bad things happen                 */
+
+#if PIXEL_BITS <= 7
+
+  typedef int  TArea;
+
+#else /* PIXEL_BITS >= 8 */
+
+  /* approximately determine the size of integers using an ANSI-C header */
+#if FT_UINT_MAX == 0xFFFFU
+  typedef long  TArea;
+#else
+  typedef int   TArea;
+#endif
+
+#endif /* PIXEL_BITS >= 8 */
+
+
+  /* maximal number of gray spans in a call to the span callback */
+#define FT_MAX_GRAY_SPANS  32
+
+
+  typedef struct TCell_*  PCell;
+
+  typedef struct  TCell_
+  {
+    TPos    x;     /* same with gray_TWorker.ex    */
+    TCoord  cover; /* same with gray_TWorker.cover */
+    TArea   area;
+    PCell   next;
+
+  } TCell;
+
+
+  typedef struct  gray_TWorker_
+  {
+    TCoord  ex, ey;
+    TPos    min_ex, max_ex;
+    TPos    min_ey, max_ey;
+    TPos    count_ex, count_ey;
+
+    TArea   area;
+    TCoord  cover;
+    int     invalid;
+
+    PCell       cells;
+    FT_PtrDist  max_cells;
+    FT_PtrDist  num_cells;
+
+    TCoord  cx, cy;
+    TPos    x,  y;
+
+    TPos    last_ey;
+
+    FT_Vector   bez_stack[32 * 3 + 1];
+    int         lev_stack[32];
+
+    FT_Outline  outline;
+    FT_Bitmap   target;
+    FT_BBox     clip_box;
+
+    FT_Span     gray_spans[FT_MAX_GRAY_SPANS];
+    int         num_gray_spans;
+
+    FT_Raster_Span_Func  render_span;
+    void*                render_span_data;
+    int                  span_y;
+
+    int  band_size;
+    int  band_shoot;
+
+    ft_jmp_buf  jump_buffer;
+
+    void*       buffer;
+    long        buffer_size;
+
+    PCell*     ycells;
+    TPos       ycount;
+
+  } gray_TWorker, *gray_PWorker;
+
+
+#ifndef FT_STATIC_RASTER
+#define ras  (*worker)
+#else
+  static gray_TWorker  ras;
+#endif
+
+
+  typedef struct gray_TRaster_
+  {
+    void*         buffer;
+    long          buffer_size;
+    int           band_size;
+    void*         memory;
+    gray_PWorker  worker;
+
+  } gray_TRaster, *gray_PRaster;
+
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Initialize the cells table.                                           */
+  /*                                                                       */
+  static void
+  gray_init_cells( RAS_ARG_ void*  buffer,
+                   long            byte_size )
+  {
+    ras.buffer      = buffer;
+    ras.buffer_size = byte_size;
+
+    ras.ycells      = (PCell*) buffer;
+    ras.cells       = NULL;
+    ras.max_cells   = 0;
+    ras.num_cells   = 0;
+    ras.area        = 0;
+    ras.cover       = 0;
+    ras.invalid     = 1;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Compute the outline bounding box.                                     */
+  /*                                                                       */
+  static void
+  gray_compute_cbox( RAS_ARG )
+  {
+    FT_Outline*  outline = &ras.outline;
+    FT_Vector*   vec     = outline->points;
+    FT_Vector*   limit   = vec + outline->n_points;
+
+
+    if ( outline->n_points <= 0 )
+    {
+      ras.min_ex = ras.max_ex = 0;
+      ras.min_ey = ras.max_ey = 0;
+      return;
+    }
+
+    ras.min_ex = ras.max_ex = vec->x;
+    ras.min_ey = ras.max_ey = vec->y;
+
+    vec++;
+
+    for ( ; vec < limit; vec++ )
+    {
+      TPos  x = vec->x;
+      TPos  y = vec->y;
+
+
+      if ( x < ras.min_ex ) ras.min_ex = x;
+      if ( x > ras.max_ex ) ras.max_ex = x;
+      if ( y < ras.min_ey ) ras.min_ey = y;
+      if ( y > ras.max_ey ) ras.max_ey = y;
+    }
+
+    /* truncate the bounding box to integer pixels */
+    ras.min_ex = ras.min_ex >> 6;
+    ras.min_ey = ras.min_ey >> 6;
+    ras.max_ex = ( ras.max_ex + 63 ) >> 6;
+    ras.max_ey = ( ras.max_ey + 63 ) >> 6;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Record the current cell in the table.                                 */
+  /*                                                                       */
+  static PCell
+  gray_find_cell( RAS_ARG )
+  {
+    PCell  *pcell, cell;
+    TPos    x = ras.ex;
+
+
+    if ( x > ras.count_ex )
+      x = ras.count_ex;
+
+    pcell = &ras.ycells[ras.ey];
+    for (;;)
+    {
+      cell = *pcell;
+      if ( cell == NULL || cell->x > x )
+        break;
+
+      if ( cell->x == x )
+        goto Exit;
+
+      pcell = &cell->next;
+    }
+
+    if ( ras.num_cells >= ras.max_cells )
+      ft_longjmp( ras.jump_buffer, 1 );
+
+    cell        = ras.cells + ras.num_cells++;
+    cell->x     = x;
+    cell->area  = 0;
+    cell->cover = 0;
+
+    cell->next  = *pcell;
+    *pcell      = cell;
+
+  Exit:
+    return cell;
+  }
+
+
+  static void
+  gray_record_cell( RAS_ARG )
+  {
+    if ( !ras.invalid && ( ras.area | ras.cover ) )
+    {
+      PCell  cell = gray_find_cell( RAS_VAR );
+
+
+      cell->area  += ras.area;
+      cell->cover += ras.cover;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Set the current cell to a new position.                               */
+  /*                                                                       */
+  static void
+  gray_set_cell( RAS_ARG_ TCoord  ex,
+                          TCoord  ey )
+  {
+    /* Move the cell pointer to a new position.  We set the `invalid'      */
+    /* flag to indicate that the cell isn't part of those we're interested */
+    /* in during the render phase.  This means that:                       */
+    /*                                                                     */
+    /* . the new vertical position must be within min_ey..max_ey-1.        */
+    /* . the new horizontal position must be strictly less than max_ex     */
+    /*                                                                     */
+    /* Note that if a cell is to the left of the clipping region, it is    */
+    /* actually set to the (min_ex-1) horizontal position.                 */
+
+    /* All cells that are on the left of the clipping region go to the */
+    /* min_ex - 1 horizontal position.                                 */
+    ey -= ras.min_ey;
+
+    if ( ex > ras.max_ex )
+      ex = ras.max_ex;
+
+    ex -= ras.min_ex;
+    if ( ex < 0 )
+      ex = -1;
+
+    /* are we moving to a different cell ? */
+    if ( ex != ras.ex || ey != ras.ey )
+    {
+      /* record the current one if it is valid */
+      if ( !ras.invalid )
+        gray_record_cell( RAS_VAR );
+
+      ras.area  = 0;
+      ras.cover = 0;
+    }
+
+    ras.ex      = ex;
+    ras.ey      = ey;
+    ras.invalid = ( (unsigned)ey >= (unsigned)ras.count_ey ||
+                              ex >= ras.count_ex           );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Start a new contour at a given cell.                                  */
+  /*                                                                       */
+  static void
+  gray_start_cell( RAS_ARG_ TCoord  ex,
+                            TCoord  ey )
+  {
+    if ( ex > ras.max_ex )
+      ex = (TCoord)( ras.max_ex );
+
+    if ( ex < ras.min_ex )
+      ex = (TCoord)( ras.min_ex - 1 );
+
+    ras.area    = 0;
+    ras.cover   = 0;
+    ras.ex      = ex - ras.min_ex;
+    ras.ey      = ey - ras.min_ey;
+    ras.last_ey = SUBPIXELS( ey );
+    ras.invalid = 0;
+
+    gray_set_cell( RAS_VAR_ ex, ey );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Render a scanline as one or more cells.                               */
+  /*                                                                       */
+  static void
+  gray_render_scanline( RAS_ARG_ TCoord  ey,
+                                 TPos    x1,
+                                 TCoord  y1,
+                                 TPos    x2,
+                                 TCoord  y2 )
+  {
+    TCoord  ex1, ex2, fx1, fx2, delta, mod, lift, rem;
+    long    p, first, dx;
+    int     incr;
+
+
+    dx = x2 - x1;
+
+    ex1 = TRUNC( x1 );
+    ex2 = TRUNC( x2 );
+    fx1 = (TCoord)( x1 - SUBPIXELS( ex1 ) );
+    fx2 = (TCoord)( x2 - SUBPIXELS( ex2 ) );
+
+    /* trivial case.  Happens often */
+    if ( y1 == y2 )
+    {
+      gray_set_cell( RAS_VAR_ ex2, ey );
+      return;
+    }
+
+    /* everything is located in a single cell.  That is easy! */
+    /*                                                        */
+    if ( ex1 == ex2 )
+    {
+      delta      = y2 - y1;
+      ras.area  += (TArea)(( fx1 + fx2 ) * delta);
+      ras.cover += delta;
+      return;
+    }
+
+    /* ok, we'll have to render a run of adjacent cells on the same */
+    /* scanline...                                                  */
+    /*                                                              */
+    p     = ( ONE_PIXEL - fx1 ) * ( y2 - y1 );
+    first = ONE_PIXEL;
+    incr  = 1;
+
+    if ( dx < 0 )
+    {
+      p     = fx1 * ( y2 - y1 );
+      first = 0;
+      incr  = -1;
+      dx    = -dx;
+    }
+
+    delta = (TCoord)( p / dx );
+    mod   = (TCoord)( p % dx );
+    if ( mod < 0 )
+    {
+      delta--;
+      mod += (TCoord)dx;
+    }
+
+    ras.area  += (TArea)(( fx1 + first ) * delta);
+    ras.cover += delta;
+
+    ex1 += incr;
+    gray_set_cell( RAS_VAR_ ex1, ey );
+    y1  += delta;
+
+    if ( ex1 != ex2 )
+    {
+      p    = ONE_PIXEL * ( y2 - y1 + delta );
+      lift = (TCoord)( p / dx );
+      rem  = (TCoord)( p % dx );
+      if ( rem < 0 )
+      {
+        lift--;
+        rem += (TCoord)dx;
+      }
+
+      mod -= (int)dx;
+
+      while ( ex1 != ex2 )
+      {
+        delta = lift;
+        mod  += rem;
+        if ( mod >= 0 )
+        {
+          mod -= (TCoord)dx;
+          delta++;
+        }
+
+        ras.area  += (TArea)(ONE_PIXEL * delta);
+        ras.cover += delta;
+        y1        += delta;
+        ex1       += incr;
+        gray_set_cell( RAS_VAR_ ex1, ey );
+      }
+    }
+
+    delta      = y2 - y1;
+    ras.area  += (TArea)(( fx2 + ONE_PIXEL - first ) * delta);
+    ras.cover += delta;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Render a given line as a series of scanlines.                         */
+  /*                                                                       */
+  static void
+  gray_render_line( RAS_ARG_ TPos  to_x,
+                             TPos  to_y )
+  {
+    TCoord  ey1, ey2, fy1, fy2, mod;
+    TPos    dx, dy, x, x2;
+    long    p, first;
+    int     delta, rem, lift, incr;
+
+
+    ey1 = TRUNC( ras.last_ey );
+    ey2 = TRUNC( to_y );     /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */
+    fy1 = (TCoord)( ras.y - ras.last_ey );
+    fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) );
+
+    dx = to_x - ras.x;
+    dy = to_y - ras.y;
+
+    /* XXX: we should do something about the trivial case where dx == 0, */
+    /*      as it happens very often!                                    */
+
+    /* perform vertical clipping */
+    {
+      TCoord  min, max;
+
+
+      min = ey1;
+      max = ey2;
+      if ( ey1 > ey2 )
+      {
+        min = ey2;
+        max = ey1;
+      }
+      if ( min >= ras.max_ey || max < ras.min_ey )
+        goto End;
+    }
+
+    /* everything is on a single scanline */
+    if ( ey1 == ey2 )
+    {
+      gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, to_x, fy2 );
+      goto End;
+    }
+
+    /* vertical line - avoid calling gray_render_scanline */
+    incr = 1;
+
+    if ( dx == 0 )
+    {
+      TCoord  ex     = TRUNC( ras.x );
+      TCoord  two_fx = (TCoord)( ( ras.x - SUBPIXELS( ex ) ) << 1 );
+      TArea   area;
+
+
+      first = ONE_PIXEL;
+      if ( dy < 0 )
+      {
+        first = 0;
+        incr  = -1;
+      }
+
+      delta      = (int)( first - fy1 );
+      ras.area  += (TArea)two_fx * delta;
+      ras.cover += delta;
+      ey1       += incr;
+
+      gray_set_cell( RAS_VAR_ ex, ey1 );
+
+      delta = (int)( first + first - ONE_PIXEL );
+      area  = (TArea)two_fx * delta;
+      while ( ey1 != ey2 )
+      {
+        ras.area  += area;
+        ras.cover += delta;
+        ey1       += incr;
+
+        gray_set_cell( RAS_VAR_ ex, ey1 );
+      }
+
+      delta      = (int)( fy2 - ONE_PIXEL + first );
+      ras.area  += (TArea)two_fx * delta;
+      ras.cover += delta;
+
+      goto End;
+    }
+
+    /* ok, we have to render several scanlines */
+    p     = ( ONE_PIXEL - fy1 ) * dx;
+    first = ONE_PIXEL;
+    incr  = 1;
+
+    if ( dy < 0 )
+    {
+      p     = fy1 * dx;
+      first = 0;
+      incr  = -1;
+      dy    = -dy;
+    }
+
+    delta = (int)( p / dy );
+    mod   = (int)( p % dy );
+    if ( mod < 0 )
+    {
+      delta--;
+      mod += (TCoord)dy;
+    }
+
+    x = ras.x + delta;
+    gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, (TCoord)first );
+
+    ey1 += incr;
+    gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );
+
+    if ( ey1 != ey2 )
+    {
+      p     = ONE_PIXEL * dx;
+      lift  = (int)( p / dy );
+      rem   = (int)( p % dy );
+      if ( rem < 0 )
+      {
+        lift--;
+        rem += (int)dy;
+      }
+      mod -= (int)dy;
+
+      while ( ey1 != ey2 )
+      {
+        delta = lift;
+        mod  += rem;
+        if ( mod >= 0 )
+        {
+          mod -= (int)dy;
+          delta++;
+        }
+
+        x2 = x + delta;
+        gray_render_scanline( RAS_VAR_ ey1, x,
+                                       (TCoord)( ONE_PIXEL - first ), x2,
+                                       (TCoord)first );
+        x = x2;
+
+        ey1 += incr;
+        gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );
+      }
+    }
+
+    gray_render_scanline( RAS_VAR_ ey1, x,
+                                   (TCoord)( ONE_PIXEL - first ), to_x,
+                                   fy2 );
+
+  End:
+    ras.x       = to_x;
+    ras.y       = to_y;
+    ras.last_ey = SUBPIXELS( ey2 );
+  }
+
+
+  static void
+  gray_split_conic( FT_Vector*  base )
+  {
+    TPos  a, b;
+
+
+    base[4].x = base[2].x;
+    b = base[1].x;
+    a = base[3].x = ( base[2].x + b ) / 2;
+    b = base[1].x = ( base[0].x + b ) / 2;
+    base[2].x = ( a + b ) / 2;
+
+    base[4].y = base[2].y;
+    b = base[1].y;
+    a = base[3].y = ( base[2].y + b ) / 2;
+    b = base[1].y = ( base[0].y + b ) / 2;
+    base[2].y = ( a + b ) / 2;
+  }
+
+
+  static void
+  gray_render_conic( RAS_ARG_ const FT_Vector*  control,
+                              const FT_Vector*  to )
+  {
+    TPos        dx, dy;
+    TPos        min, max, y;
+    int         top, level;
+    int*        levels;
+    FT_Vector*  arc;
+
+
+    levels = ras.lev_stack;
+
+    arc      = ras.bez_stack;
+    arc[0].x = UPSCALE( to->x );
+    arc[0].y = UPSCALE( to->y );
+    arc[1].x = UPSCALE( control->x );
+    arc[1].y = UPSCALE( control->y );
+    arc[2].x = ras.x;
+    arc[2].y = ras.y;
+    top      = 0;
+
+    dx = FT_ABS( arc[2].x + arc[0].x - 2 * arc[1].x );
+    dy = FT_ABS( arc[2].y + arc[0].y - 2 * arc[1].y );
+    if ( dx < dy )
+      dx = dy;
+
+    if ( dx < ONE_PIXEL / 4 )
+      goto Draw;
+
+    /* short-cut the arc that crosses the current band */
+    min = max = arc[0].y;
+
+    y = arc[1].y;
+    if ( y < min ) min = y;
+    if ( y > max ) max = y;
+
+    y = arc[2].y;
+    if ( y < min ) min = y;
+    if ( y > max ) max = y;
+
+    if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey )
+      goto Draw;
+
+    level = 0;
+    do
+    {
+      dx >>= 2;
+      level++;
+    } while ( dx > ONE_PIXEL / 4 );
+
+    levels[0] = level;
+
+    do
+    {
+      level = levels[top];
+      if ( level > 0 )
+      {
+        gray_split_conic( arc );
+        arc += 2;
+        top++;
+        levels[top] = levels[top - 1] = level - 1;
+        continue;
+      }
+
+    Draw:
+      gray_render_line( RAS_VAR_ arc[0].x, arc[0].y );
+      top--;
+      arc -= 2;
+
+    } while ( top >= 0 );
+  }
+
+
+  static void
+  gray_split_cubic( FT_Vector*  base )
+  {
+    TPos  a, b, c, d;
+
+
+    base[6].x = base[3].x;
+    c = base[1].x;
+    d = base[2].x;
+    base[1].x = a = ( base[0].x + c ) / 2;
+    base[5].x = b = ( base[3].x + d ) / 2;
+    c = ( c + d ) / 2;
+    base[2].x = a = ( a + c ) / 2;
+    base[4].x = b = ( b + c ) / 2;
+    base[3].x = ( a + b ) / 2;
+
+    base[6].y = base[3].y;
+    c = base[1].y;
+    d = base[2].y;
+    base[1].y = a = ( base[0].y + c ) / 2;
+    base[5].y = b = ( base[3].y + d ) / 2;
+    c = ( c + d ) / 2;
+    base[2].y = a = ( a + c ) / 2;
+    base[4].y = b = ( b + c ) / 2;
+    base[3].y = ( a + b ) / 2;
+  }
+
+
+  static void
+  gray_render_cubic( RAS_ARG_ const FT_Vector*  control1,
+                              const FT_Vector*  control2,
+                              const FT_Vector*  to )
+  {
+    FT_Vector*  arc;
+    TPos        min, max, y;
+
+
+    arc      = ras.bez_stack;
+    arc[0].x = UPSCALE( to->x );
+    arc[0].y = UPSCALE( to->y );
+    arc[1].x = UPSCALE( control2->x );
+    arc[1].y = UPSCALE( control2->y );
+    arc[2].x = UPSCALE( control1->x );
+    arc[2].y = UPSCALE( control1->y );
+    arc[3].x = ras.x;
+    arc[3].y = ras.y;
+
+    /* Short-cut the arc that crosses the current band. */
+    min = max = arc[0].y;
+
+    y = arc[1].y;
+    if ( y < min )
+      min = y;
+    if ( y > max )
+      max = y;
+
+    y = arc[2].y;
+    if ( y < min )
+      min = y;
+    if ( y > max )
+      max = y;
+
+    y = arc[3].y;
+    if ( y < min )
+      min = y;
+    if ( y > max )
+      max = y;
+
+    if ( TRUNC( min ) >= ras.max_ey || TRUNC( max ) < ras.min_ey )
+      goto Draw;
+
+    for (;;)
+    {
+      /* Decide whether to split or draw. See `Rapid Termination          */
+      /* Evaluation for Recursive Subdivision of Bezier Curves' by Thomas */
+      /* F. Hain, at                                                      */
+      /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camera-ready%20CISST02%202.pdf */
+
+      {
+        TPos  dx, dy, dx_, dy_;
+        TPos  dx1, dy1, dx2, dy2;
+        TPos  L, s, s_limit;
+
+
+        /* dx and dy are x and y components of the P0-P3 chord vector. */
+        dx = arc[3].x - arc[0].x;
+        dy = arc[3].y - arc[0].y;
+
+        /* L is an (under)estimate of the Euclidean distance P0-P3.       */
+        /*                                                                */
+        /* If dx >= dy, then r = sqrt(dx^2 + dy^2) can be overestimated   */
+        /* with least maximum error by                                    */
+        /*                                                                */
+        /*   r_upperbound = dx + (sqrt(2) - 1) * dy  ,                    */
+        /*                                                                */
+        /* where sqrt(2) - 1 can be (over)estimated by 107/256, giving an */
+        /* error of no more than 8.4%.                                    */
+        /*                                                                */
+        /* Similarly, some elementary calculus shows that r can be        */
+        /* underestimated with least maximum error by                     */
+        /*                                                                */
+        /*   r_lowerbound = sqrt(2 + sqrt(2)) / 2 * dx                    */
+        /*                  + sqrt(2 - sqrt(2)) / 2 * dy  .               */
+        /*                                                                */
+        /* 236/256 and 97/256 are (under)estimates of the two algebraic   */
+        /* numbers, giving an error of no more than 8.1%.                 */
+
+        dx_ = FT_ABS( dx );
+        dy_ = FT_ABS( dy );
+
+        /* This is the same as                     */
+        /*                                         */
+        /*   L = ( 236 * FT_MAX( dx_, dy_ )        */
+        /*       + 97 * FT_MIN( dx_, dy_ ) ) >> 8; */
+        L = ( dx_ > dy_ ? 236 * dx_ +  97 * dy_
+                        :  97 * dx_ + 236 * dy_ ) >> 8;
+
+        /* Avoid possible arithmetic overflow below by splitting. */
+        if ( L > 32767 )
+          goto Split;
+
+        /* Max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1). */
+        s_limit = L * (TPos)( ONE_PIXEL / 6 );
+
+        /* s is L * the perpendicular distance from P1 to the line P0-P3. */
+        dx1 = arc[1].x - arc[0].x;
+        dy1 = arc[1].y - arc[0].y;
+        s = FT_ABS( dy * dx1 - dx * dy1 );
+
+        if ( s > s_limit )
+          goto Split;
+
+        /* s is L * the perpendicular distance from P2 to the line P0-P3. */
+        dx2 = arc[2].x - arc[0].x;
+        dy2 = arc[2].y - arc[0].y;
+        s = FT_ABS( dy * dx2 - dx * dy2 );
+
+        if ( s > s_limit )
+          goto Split;
+
+        /* If P1 or P2 is outside P0-P3, split the curve. */
+        if ( dy * dy1 + dx * dx1 < 0                                     ||
+             dy * dy2 + dx * dx2 < 0                                     ||
+             dy * (arc[3].y - arc[1].y) + dx * (arc[3].x - arc[1].x) < 0 ||
+             dy * (arc[3].y - arc[2].y) + dx * (arc[3].x - arc[2].x) < 0 )
+          goto Split;
+
+        /* No reason to split. */
+        goto Draw;
+      }
+
+    Split:
+      gray_split_cubic( arc );
+      arc += 3;
+      continue;
+
+    Draw:
+      gray_render_line( RAS_VAR_ arc[0].x, arc[0].y );
+
+      if ( arc == ras.bez_stack )
+        return;
+
+      arc -= 3;
+    }
+  }
+
+
+  static int
+  gray_move_to( const FT_Vector*  to,
+                gray_PWorker      worker )
+  {
+    TPos  x, y;
+
+
+    /* record current cell, if any */
+    gray_record_cell( RAS_VAR );
+
+    /* start to a new position */
+    x = UPSCALE( to->x );
+    y = UPSCALE( to->y );
+
+    gray_start_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) );
+
+    worker->x = x;
+    worker->y = y;
+    return 0;
+  }
+
+
+  static int
+  gray_line_to( const FT_Vector*  to,
+                gray_PWorker      worker )
+  {
+    gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) );
+    return 0;
+  }
+
+
+  static int
+  gray_conic_to( const FT_Vector*  control,
+                 const FT_Vector*  to,
+                 gray_PWorker      worker )
+  {
+    gray_render_conic( RAS_VAR_ control, to );
+    return 0;
+  }
+
+
+  static int
+  gray_cubic_to( const FT_Vector*  control1,
+                 const FT_Vector*  control2,
+                 const FT_Vector*  to,
+                 gray_PWorker      worker )
+  {
+    gray_render_cubic( RAS_VAR_ control1, control2, to );
+    return 0;
+  }
+
+
+  static void
+  gray_render_span( int             y,
+                    int             count,
+                    const FT_Span*  spans,
+                    gray_PWorker    worker )
+  {
+    unsigned char*  p;
+    FT_Bitmap*      map = &worker->target;
+
+
+    /* first of all, compute the scanline offset */
+    p = (unsigned char*)map->buffer - y * map->pitch;
+    if ( map->pitch >= 0 )
+      p += (unsigned)( ( map->rows - 1 ) * map->pitch );
+
+    for ( ; count > 0; count--, spans++ )
+    {
+      unsigned char  coverage = spans->coverage;
+
+
+      if ( coverage )
+      {
+        /* For small-spans it is faster to do it by ourselves than
+         * calling `memset'.  This is mainly due to the cost of the
+         * function call.
+         */
+        if ( spans->len >= 8 )
+          FT_MEM_SET( p + spans->x, (unsigned char)coverage, spans->len );
+        else
+        {
+          unsigned char*  q = p + spans->x;
+
+
+          switch ( spans->len )
+          {
+          case 7: *q++ = (unsigned char)coverage;
+          case 6: *q++ = (unsigned char)coverage;
+          case 5: *q++ = (unsigned char)coverage;
+          case 4: *q++ = (unsigned char)coverage;
+          case 3: *q++ = (unsigned char)coverage;
+          case 2: *q++ = (unsigned char)coverage;
+          case 1: *q   = (unsigned char)coverage;
+          default:
+            ;
+          }
+        }
+      }
+    }
+  }
+
+
+  static void
+  gray_hline( RAS_ARG_ TCoord  x,
+                       TCoord  y,
+                       TPos    area,
+                       TCoord  acount )
+  {
+    FT_Span*  span;
+    int       count;
+    int       coverage;
+
+
+    /* compute the coverage line's coverage, depending on the    */
+    /* outline fill rule                                         */
+    /*                                                           */
+    /* the coverage percentage is area/(PIXEL_BITS*PIXEL_BITS*2) */
+    /*                                                           */
+    coverage = (int)( area >> ( PIXEL_BITS * 2 + 1 - 8 ) );
+                                                    /* use range 0..256 */
+    if ( coverage < 0 )
+      coverage = -coverage;
+
+    if ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL )
+    {
+      coverage &= 511;
+
+      if ( coverage > 256 )
+        coverage = 512 - coverage;
+      else if ( coverage == 256 )
+        coverage = 255;
+    }
+    else
+    {
+      /* normal non-zero winding rule */
+      if ( coverage >= 256 )
+        coverage = 255;
+    }
+
+    y += (TCoord)ras.min_ey;
+    x += (TCoord)ras.min_ex;
+
+    /* FT_Span.x is a 16-bit short, so limit our coordinates appropriately */
+    if ( x >= 32767 )
+      x = 32767;
+
+    /* FT_Span.y is an integer, so limit our coordinates appropriately */
+    if ( y >= FT_INT_MAX )
+      y = FT_INT_MAX;
+
+    if ( coverage )
+    {
+      /* see whether we can add this span to the current list */
+      count = ras.num_gray_spans;
+      span  = ras.gray_spans + count - 1;
+      if ( count > 0                          &&
+           ras.span_y == y                    &&
+           (int)span->x + span->len == (int)x &&
+           span->coverage == coverage         )
+      {
+        span->len = (unsigned short)( span->len + acount );
+        return;
+      }
+
+      if ( ras.span_y != y || count >= FT_MAX_GRAY_SPANS )
+      {
+        if ( ras.render_span && count > 0 )
+          ras.render_span( ras.span_y, count, ras.gray_spans,
+                           ras.render_span_data );
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+        if ( count > 0 )
+        {
+          int  n;
+
+
+          FT_TRACE7(( "y = %3d ", ras.span_y ));
+          span = ras.gray_spans;
+          for ( n = 0; n < count; n++, span++ )
+            FT_TRACE7(( "[%d..%d]:%02x ",
+                        span->x, span->x + span->len - 1, span->coverage ));
+          FT_TRACE7(( "\n" ));
+        }
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+        ras.num_gray_spans = 0;
+        ras.span_y         = (int)y;
+
+        count = 0;
+        span  = ras.gray_spans;
+      }
+      else
+        span++;
+
+      /* add a gray span to the current list */
+      span->x        = (short)x;
+      span->len      = (unsigned short)acount;
+      span->coverage = (unsigned char)coverage;
+
+      ras.num_gray_spans++;
+    }
+  }
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+  /* to be called while in the debugger --                                */
+  /* this function causes a compiler warning since it is unused otherwise */
+  static void
+  gray_dump_cells( RAS_ARG )
+  {
+    int  yindex;
+
+
+    for ( yindex = 0; yindex < ras.ycount; yindex++ )
+    {
+      PCell  cell;
+
+
+      printf( "%3d:", yindex );
+
+      for ( cell = ras.ycells[yindex]; cell != NULL; cell = cell->next )
+        printf( " (%3ld, c:%4ld, a:%6d)", cell->x, cell->cover, cell->area );
+      printf( "\n" );
+    }
+  }
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+  static void
+  gray_sweep( RAS_ARG_ const FT_Bitmap*  target )
+  {
+    int  yindex;
+
+    FT_UNUSED( target );
+
+
+    if ( ras.num_cells == 0 )
+      return;
+
+    ras.num_gray_spans = 0;
+
+    FT_TRACE7(( "gray_sweep: start\n" ));
+
+    for ( yindex = 0; yindex < ras.ycount; yindex++ )
+    {
+      PCell   cell  = ras.ycells[yindex];
+      TCoord  cover = 0;
+      TCoord  x     = 0;
+
+
+      for ( ; cell != NULL; cell = cell->next )
+      {
+        TPos  area;
+
+
+        if ( cell->x > x && cover != 0 )
+          gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ),
+                      cell->x - x );
+
+        cover += cell->cover;
+        area   = cover * ( ONE_PIXEL * 2 ) - cell->area;
+
+        if ( area != 0 && cell->x >= 0 )
+          gray_hline( RAS_VAR_ cell->x, yindex, area, 1 );
+
+        x = cell->x + 1;
+      }
+
+      if ( cover != 0 )
+        gray_hline( RAS_VAR_ x, yindex, cover * ( ONE_PIXEL * 2 ),
+                    ras.count_ex - x );
+    }
+
+    if ( ras.render_span && ras.num_gray_spans > 0 )
+      ras.render_span( ras.span_y, ras.num_gray_spans,
+                       ras.gray_spans, ras.render_span_data );
+
+    FT_TRACE7(( "gray_sweep: end\n" ));
+  }
+
+
+#ifdef _STANDALONE_
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  The following function should only compile in stand-alone mode,      */
+  /*  i.e., when building this component without the rest of FreeType.     */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Outline_Decompose                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Walk over an outline's structure to decompose it into individual   */
+  /*    segments and Bézier arcs.  This function is also able to emit      */
+  /*    `move to' and `close to' operations to indicate the start and end  */
+  /*    of new contours in the outline.                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    outline        :: A pointer to the source target.                  */
+  /*                                                                       */
+  /*    func_interface :: A table of `emitters', i.e., function pointers   */
+  /*                      called during decomposition to indicate path     */
+  /*                      operations.                                      */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    user           :: A typeless pointer which is passed to each       */
+  /*                      emitter during the decomposition.  It can be     */
+  /*                      used to store the state during the               */
+  /*                      decomposition.                                   */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Error code.  0 means success.                                      */
+  /*                                                                       */
+  static int
+  FT_Outline_Decompose( const FT_Outline*        outline,
+                        const FT_Outline_Funcs*  func_interface,
+                        void*                    user )
+  {
+#undef SCALED
+#define SCALED( x )  ( ( (x) << shift ) - delta )
+
+    FT_Vector   v_last;
+    FT_Vector   v_control;
+    FT_Vector   v_start;
+
+    FT_Vector*  point;
+    FT_Vector*  limit;
+    char*       tags;
+
+    int         error;
+
+    int   n;         /* index of contour in outline     */
+    int   first;     /* index of first point in contour */
+    char  tag;       /* current point's state           */
+
+    int   shift;
+    TPos  delta;
+
+
+    if ( !outline || !func_interface )
+      return ErrRaster_Invalid_Argument;
+
+    shift = func_interface->shift;
+    delta = func_interface->delta;
+    first = 0;
+
+    for ( n = 0; n < outline->n_contours; n++ )
+    {
+      int  last;  /* index of last point in contour */
+
+
+      FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n ));
+
+      last  = outline->contours[n];
+      if ( last < 0 )
+        goto Invalid_Outline;
+      limit = outline->points + last;
+
+      v_start   = outline->points[first];
+      v_start.x = SCALED( v_start.x );
+      v_start.y = SCALED( v_start.y );
+
+      v_last   = outline->points[last];
+      v_last.x = SCALED( v_last.x );
+      v_last.y = SCALED( v_last.y );
+
+      v_control = v_start;
+
+      point = outline->points + first;
+      tags  = outline->tags   + first;
+      tag   = FT_CURVE_TAG( tags[0] );
+
+      /* A contour cannot start with a cubic control point! */
+      if ( tag == FT_CURVE_TAG_CUBIC )
+        goto Invalid_Outline;
+
+      /* check first point to determine origin */
+      if ( tag == FT_CURVE_TAG_CONIC )
+      {
+        /* first point is conic control.  Yes, this happens. */
+        if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )
+        {
+          /* start at last point if it is on the curve */
+          v_start = v_last;
+          limit--;
+        }
+        else
+        {
+          /* if both first and last points are conic,         */
+          /* start at their middle and record its position    */
+          /* for closure                                      */
+          v_start.x = ( v_start.x + v_last.x ) / 2;
+          v_start.y = ( v_start.y + v_last.y ) / 2;
+
+          v_last = v_start;
+        }
+        point--;
+        tags--;
+      }
+
+      FT_TRACE5(( "  move to (%.2f, %.2f)\n",
+                  v_start.x / 64.0, v_start.y / 64.0 ));
+      error = func_interface->move_to( &v_start, user );
+      if ( error )
+        goto Exit;
+
+      while ( point < limit )
+      {
+        point++;
+        tags++;
+
+        tag = FT_CURVE_TAG( tags[0] );
+        switch ( tag )
+        {
+        case FT_CURVE_TAG_ON:  /* emit a single line_to */
+          {
+            FT_Vector  vec;
+
+
+            vec.x = SCALED( point->x );
+            vec.y = SCALED( point->y );
+
+            FT_TRACE5(( "  line to (%.2f, %.2f)\n",
+                        vec.x / 64.0, vec.y / 64.0 ));
+            error = func_interface->line_to( &vec, user );
+            if ( error )
+              goto Exit;
+            continue;
+          }
+
+        case FT_CURVE_TAG_CONIC:  /* consume conic arcs */
+          v_control.x = SCALED( point->x );
+          v_control.y = SCALED( point->y );
+
+        Do_Conic:
+          if ( point < limit )
+          {
+            FT_Vector  vec;
+            FT_Vector  v_middle;
+
+
+            point++;
+            tags++;
+            tag = FT_CURVE_TAG( tags[0] );
+
+            vec.x = SCALED( point->x );
+            vec.y = SCALED( point->y );
+
+            if ( tag == FT_CURVE_TAG_ON )
+            {
+              FT_TRACE5(( "  conic to (%.2f, %.2f)"
+                          " with control (%.2f, %.2f)\n",
+                          vec.x / 64.0, vec.y / 64.0,
+                          v_control.x / 64.0, v_control.y / 64.0 ));
+              error = func_interface->conic_to( &v_control, &vec, user );
+              if ( error )
+                goto Exit;
+              continue;
+            }
+
+            if ( tag != FT_CURVE_TAG_CONIC )
+              goto Invalid_Outline;
+
+            v_middle.x = ( v_control.x + vec.x ) / 2;
+            v_middle.y = ( v_control.y + vec.y ) / 2;
+
+            FT_TRACE5(( "  conic to (%.2f, %.2f)"
+                        " with control (%.2f, %.2f)\n",
+                        v_middle.x / 64.0, v_middle.y / 64.0,
+                        v_control.x / 64.0, v_control.y / 64.0 ));
+            error = func_interface->conic_to( &v_control, &v_middle, user );
+            if ( error )
+              goto Exit;
+
+            v_control = vec;
+            goto Do_Conic;
+          }
+
+          FT_TRACE5(( "  conic to (%.2f, %.2f)"
+                      " with control (%.2f, %.2f)\n",
+                      v_start.x / 64.0, v_start.y / 64.0,
+                      v_control.x / 64.0, v_control.y / 64.0 ));
+          error = func_interface->conic_to( &v_control, &v_start, user );
+          goto Close;
+
+        default:  /* FT_CURVE_TAG_CUBIC */
+          {
+            FT_Vector  vec1, vec2;
+
+
+            if ( point + 1 > limit                             ||
+                 FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
+              goto Invalid_Outline;
+
+            point += 2;
+            tags  += 2;
+
+            vec1.x = SCALED( point[-2].x );
+            vec1.y = SCALED( point[-2].y );
+
+            vec2.x = SCALED( point[-1].x );
+            vec2.y = SCALED( point[-1].y );
+
+            if ( point <= limit )
+            {
+              FT_Vector  vec;
+
+
+              vec.x = SCALED( point->x );
+              vec.y = SCALED( point->y );
+
+              FT_TRACE5(( "  cubic to (%.2f, %.2f)"
+                          " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
+                          vec.x / 64.0, vec.y / 64.0,
+                          vec1.x / 64.0, vec1.y / 64.0,
+                          vec2.x / 64.0, vec2.y / 64.0 ));
+              error = func_interface->cubic_to( &vec1, &vec2, &vec, user );
+              if ( error )
+                goto Exit;
+              continue;
+            }
+
+            FT_TRACE5(( "  cubic to (%.2f, %.2f)"
+                        " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
+                        v_start.x / 64.0, v_start.y / 64.0,
+                        vec1.x / 64.0, vec1.y / 64.0,
+                        vec2.x / 64.0, vec2.y / 64.0 ));
+            error = func_interface->cubic_to( &vec1, &vec2, &v_start, user );
+            goto Close;
+          }
+        }
+      }
+
+      /* close the contour with a line segment */
+      FT_TRACE5(( "  line to (%.2f, %.2f)\n",
+                  v_start.x / 64.0, v_start.y / 64.0 ));
+      error = func_interface->line_to( &v_start, user );
+
+   Close:
+      if ( error )
+        goto Exit;
+
+      first = last + 1;
+    }
+
+    FT_TRACE5(( "FT_Outline_Decompose: Done\n", n ));
+    return 0;
+
+  Exit:
+    FT_TRACE5(( "FT_Outline_Decompose: Error %d\n", error ));
+    return error;
+
+  Invalid_Outline:
+    return ErrRaster_Invalid_Outline;
+  }
+
+#endif /* _STANDALONE_ */
+
+
+  typedef struct  gray_TBand_
+  {
+    TPos  min, max;
+
+  } gray_TBand;
+
+    FT_DEFINE_OUTLINE_FUNCS(func_interface,
+      (FT_Outline_MoveTo_Func) gray_move_to,
+      (FT_Outline_LineTo_Func) gray_line_to,
+      (FT_Outline_ConicTo_Func)gray_conic_to,
+      (FT_Outline_CubicTo_Func)gray_cubic_to,
+      0,
+      0
+    )
+
+  static int
+  gray_convert_glyph_inner( RAS_ARG )
+  {
+
+    volatile int  error = 0;
+
+#ifdef FT_CONFIG_OPTION_PIC
+      FT_Outline_Funcs func_interface;
+      Init_Class_func_interface(&func_interface);
+#endif
+
+    if ( ft_setjmp( ras.jump_buffer ) == 0 )
+    {
+      error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras );
+      gray_record_cell( RAS_VAR );
+    }
+    else
+      error = ErrRaster_Memory_Overflow;
+
+    return error;
+  }
+
+
+  static int
+  gray_convert_glyph( RAS_ARG )
+  {
+    gray_TBand            bands[40];
+    gray_TBand* volatile  band;
+    int volatile          n, num_bands;
+    TPos volatile         min, max, max_y;
+    FT_BBox*              clip;
+
+
+    /* Set up state in the raster object */
+    gray_compute_cbox( RAS_VAR );
+
+    /* clip to target bitmap, exit if nothing to do */
+    clip = &ras.clip_box;
+
+    if ( ras.max_ex <= clip->xMin || ras.min_ex >= clip->xMax ||
+         ras.max_ey <= clip->yMin || ras.min_ey >= clip->yMax )
+      return 0;
+
+    if ( ras.min_ex < clip->xMin ) ras.min_ex = clip->xMin;
+    if ( ras.min_ey < clip->yMin ) ras.min_ey = clip->yMin;
+
+    if ( ras.max_ex > clip->xMax ) ras.max_ex = clip->xMax;
+    if ( ras.max_ey > clip->yMax ) ras.max_ey = clip->yMax;
+
+    ras.count_ex = ras.max_ex - ras.min_ex;
+    ras.count_ey = ras.max_ey - ras.min_ey;
+
+    /* set up vertical bands */
+    num_bands = (int)( ( ras.max_ey - ras.min_ey ) / ras.band_size );
+    if ( num_bands == 0 )
+      num_bands = 1;
+    if ( num_bands >= 39 )
+      num_bands = 39;
+
+    ras.band_shoot = 0;
+
+    min   = ras.min_ey;
+    max_y = ras.max_ey;
+
+    for ( n = 0; n < num_bands; n++, min = max )
+    {
+      max = min + ras.band_size;
+      if ( n == num_bands - 1 || max > max_y )
+        max = max_y;
+
+      bands[0].min = min;
+      bands[0].max = max;
+      band         = bands;
+
+      while ( band >= bands )
+      {
+        TPos  bottom, top, middle;
+        int   error;
+
+        {
+          PCell  cells_max;
+          int    yindex;
+          long   cell_start, cell_end, cell_mod;
+
+
+          ras.ycells = (PCell*)ras.buffer;
+          ras.ycount = band->max - band->min;
+
+          cell_start = sizeof ( PCell ) * ras.ycount;
+          cell_mod   = cell_start % sizeof ( TCell );
+          if ( cell_mod > 0 )
+            cell_start += sizeof ( TCell ) - cell_mod;
+
+          cell_end  = ras.buffer_size;
+          cell_end -= cell_end % sizeof ( TCell );
+
+          cells_max = (PCell)( (char*)ras.buffer + cell_end );
+          ras.cells = (PCell)( (char*)ras.buffer + cell_start );
+          if ( ras.cells >= cells_max )
+            goto ReduceBands;
+
+          ras.max_cells = cells_max - ras.cells;
+          if ( ras.max_cells < 2 )
+            goto ReduceBands;
+
+          for ( yindex = 0; yindex < ras.ycount; yindex++ )
+            ras.ycells[yindex] = NULL;
+        }
+
+        ras.num_cells = 0;
+        ras.invalid   = 1;
+        ras.min_ey    = band->min;
+        ras.max_ey    = band->max;
+        ras.count_ey  = band->max - band->min;
+
+        error = gray_convert_glyph_inner( RAS_VAR );
+
+        if ( !error )
+        {
+          gray_sweep( RAS_VAR_ &ras.target );
+          band--;
+          continue;
+        }
+        else if ( error != ErrRaster_Memory_Overflow )
+          return 1;
+
+      ReduceBands:
+        /* render pool overflow; we will reduce the render band by half */
+        bottom = band->min;
+        top    = band->max;
+        middle = bottom + ( ( top - bottom ) >> 1 );
+
+        /* This is too complex for a single scanline; there must */
+        /* be some problems.                                     */
+        if ( middle == bottom )
+        {
+#ifdef FT_DEBUG_LEVEL_TRACE
+          FT_TRACE7(( "gray_convert_glyph: rotten glyph\n" ));
+#endif
+          return 1;
+        }
+
+        if ( bottom-top >= ras.band_size )
+          ras.band_shoot++;
+
+        band[1].min = bottom;
+        band[1].max = middle;
+        band[0].min = middle;
+        band[0].max = top;
+        band++;
+      }
+    }
+
+    if ( ras.band_shoot > 8 && ras.band_size > 16 )
+      ras.band_size = ras.band_size / 2;
+
+    return 0;
+  }
+
+
+  static int
+  gray_raster_render( gray_PRaster             raster,
+                      const FT_Raster_Params*  params )
+  {
+    const FT_Outline*  outline    = (const FT_Outline*)params->source;
+    const FT_Bitmap*   target_map = params->target;
+    gray_PWorker       worker;
+
+
+    if ( !raster || !raster->buffer || !raster->buffer_size )
+      return ErrRaster_Invalid_Argument;
+
+    if ( !outline )
+      return ErrRaster_Invalid_Outline;
+
+    /* return immediately if the outline is empty */
+    if ( outline->n_points == 0 || outline->n_contours <= 0 )
+      return 0;
+
+    if ( !outline->contours || !outline->points )
+      return ErrRaster_Invalid_Outline;
+
+    if ( outline->n_points !=
+           outline->contours[outline->n_contours - 1] + 1 )
+      return ErrRaster_Invalid_Outline;
+
+    worker = raster->worker;
+
+    /* if direct mode is not set, we must have a target bitmap */
+    if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) )
+    {
+      if ( !target_map )
+        return ErrRaster_Invalid_Argument;
+
+      /* nothing to do */
+      if ( !target_map->width || !target_map->rows )
+        return 0;
+
+      if ( !target_map->buffer )
+        return ErrRaster_Invalid_Argument;
+    }
+
+    /* this version does not support monochrome rendering */
+    if ( !( params->flags & FT_RASTER_FLAG_AA ) )
+      return ErrRaster_Invalid_Mode;
+
+    /* compute clipping box */
+    if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) )
+    {
+      /* compute clip box from target pixmap */
+      ras.clip_box.xMin = 0;
+      ras.clip_box.yMin = 0;
+      ras.clip_box.xMax = target_map->width;
+      ras.clip_box.yMax = target_map->rows;
+    }
+    else if ( params->flags & FT_RASTER_FLAG_CLIP )
+      ras.clip_box = params->clip_box;
+    else
+    {
+      ras.clip_box.xMin = -32768L;
+      ras.clip_box.yMin = -32768L;
+      ras.clip_box.xMax =  32767L;
+      ras.clip_box.yMax =  32767L;
+    }
+
+    gray_init_cells( RAS_VAR_ raster->buffer, raster->buffer_size );
+
+    ras.outline        = *outline;
+    ras.num_cells      = 0;
+    ras.invalid        = 1;
+    ras.band_size      = raster->band_size;
+    ras.num_gray_spans = 0;
+
+    if ( params->flags & FT_RASTER_FLAG_DIRECT )
+    {
+      ras.render_span      = (FT_Raster_Span_Func)params->gray_spans;
+      ras.render_span_data = params->user;
+    }
+    else
+    {
+      ras.target           = *target_map;
+      ras.render_span      = (FT_Raster_Span_Func)gray_render_span;
+      ras.render_span_data = &ras;
+    }
+
+    return gray_convert_glyph( RAS_VAR );
+  }
+
+
+  /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/
+  /****                         a static object.                   *****/
+
+#ifdef _STANDALONE_
+
+  static int
+  gray_raster_new( void*       memory,
+                   FT_Raster*  araster )
+  {
+    static gray_TRaster  the_raster;
+
+    FT_UNUSED( memory );
+
+
+    *araster = (FT_Raster)&the_raster;
+    FT_MEM_ZERO( &the_raster, sizeof ( the_raster ) );
+
+    return 0;
+  }
+
+
+  static void
+  gray_raster_done( FT_Raster  raster )
+  {
+    /* nothing */
+    FT_UNUSED( raster );
+  }
+
+#else /* !_STANDALONE_ */
+
+  static int
+  gray_raster_new( FT_Memory   memory,
+                   FT_Raster*  araster )
+  {
+    FT_Error      error;
+    gray_PRaster  raster = NULL;
+
+
+    *araster = 0;
+    if ( !FT_ALLOC( raster, sizeof ( gray_TRaster ) ) )
+    {
+      raster->memory = memory;
+      *araster       = (FT_Raster)raster;
+    }
+
+    return error;
+  }
+
+
+  static void
+  gray_raster_done( FT_Raster  raster )
+  {
+    FT_Memory  memory = (FT_Memory)((gray_PRaster)raster)->memory;
+
+
+    FT_FREE( raster );
+  }
+
+#endif /* !_STANDALONE_ */
+
+
+  static void
+  gray_raster_reset( FT_Raster  raster,
+                     char*      pool_base,
+                     long       pool_size )
+  {
+    gray_PRaster  rast = (gray_PRaster)raster;
+
+
+    if ( raster )
+    {
+      if ( pool_base && pool_size >= (long)sizeof ( gray_TWorker ) + 2048 )
+      {
+        gray_PWorker  worker = (gray_PWorker)pool_base;
+
+
+        rast->worker      = worker;
+        rast->buffer      = pool_base +
+                              ( ( sizeof ( gray_TWorker ) +
+                                  sizeof ( TCell ) - 1 )  &
+                                ~( sizeof ( TCell ) - 1 ) );
+        rast->buffer_size = (long)( ( pool_base + pool_size ) -
+                                    (char*)rast->buffer ) &
+                                      ~( sizeof ( TCell ) - 1 );
+        rast->band_size   = (int)( rast->buffer_size /
+                                     ( sizeof ( TCell ) * 8 ) );
+      }
+      else
+      {
+        rast->buffer      = NULL;
+        rast->buffer_size = 0;
+        rast->worker      = NULL;
+      }
+    }
+  }
+
+
+  FT_DEFINE_RASTER_FUNCS(ft_grays_raster,
+    FT_GLYPH_FORMAT_OUTLINE,
+
+    (FT_Raster_New_Func)     gray_raster_new,
+    (FT_Raster_Reset_Func)   gray_raster_reset,
+    (FT_Raster_Set_Mode_Func)0,
+    (FT_Raster_Render_Func)  gray_raster_render,
+    (FT_Raster_Done_Func)    gray_raster_done
+  )
+
+
+/* END */
+
+
+/* Local Variables: */
+/* coding: utf-8    */
+/* End:             */
diff --git a/src/smooth/ftgrays.h b/src/smooth/ftgrays.h
new file mode 100644 (file)
index 0000000..f20f55f
--- /dev/null
@@ -0,0 +1,58 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftgrays.h                                                              */
+/*                                                                         */
+/*    FreeType smooth renderer declaration                                 */
+/*                                                                         */
+/*  Copyright 1996-2001 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTGRAYS_H__
+#define __FTGRAYS_H__
+
+#ifdef __cplusplus
+  extern "C" {
+#endif
+
+
+#ifdef _STANDALONE_
+#include "ftimage.h"
+#else
+#include <ft2build.h>
+#include FT_CONFIG_CONFIG_H /* for FT_CONFIG_OPTION_PIC */
+#include FT_IMAGE_H
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* To make ftgrays.h independent from configuration files we check       */
+  /* whether FT_EXPORT_VAR has been defined already.                       */
+  /*                                                                       */
+  /* On some systems and compilers (Win32 mostly), an extra keyword is     */
+  /* necessary to compile the library as a DLL.                            */
+  /*                                                                       */
+#ifndef FT_EXPORT_VAR
+#define FT_EXPORT_VAR( x )  extern  x
+#endif
+
+  FT_EXPORT_VAR( const FT_Raster_Funcs )  ft_grays_raster;
+
+
+#ifdef __cplusplus
+  }
+#endif
+
+#endif /* __FTGRAYS_H__ */
+
+
+/* END */
diff --git a/src/smooth/ftsmerrs.h b/src/smooth/ftsmerrs.h
new file mode 100644 (file)
index 0000000..413d2f1
--- /dev/null
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsmerrs.h                                                             */
+/*                                                                         */
+/*    smooth renderer error codes (specification only).                    */
+/*                                                                         */
+/*  Copyright 2001, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the smooth renderer error enumeration     */
+  /* constants.                                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __FTSMERRS_H__
+#define __FTSMERRS_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  Smooth_Err_
+#define FT_ERR_BASE    FT_Mod_Err_Smooth
+
+#include FT_ERRORS_H
+
+#endif /* __FTSMERRS_H__ */
+
+
+/* END */
diff --git a/src/smooth/ftsmooth.c b/src/smooth/ftsmooth.c
new file mode 100644 (file)
index 0000000..00499cc
--- /dev/null
@@ -0,0 +1,504 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsmooth.c                                                             */
+/*                                                                         */
+/*    Anti-aliasing renderer interface (body).                             */
+/*                                                                         */
+/*  Copyright 2000-2006, 2009-2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_OUTLINE_H
+#include "ftsmooth.h"
+#include "ftgrays.h"
+#include "ftspic.h"
+
+#include "ftsmerrs.h"
+
+
+  /* initialize renderer -- init its raster */
+  static FT_Error
+  ft_smooth_init( FT_Renderer  render )
+  {
+    FT_Library  library = FT_MODULE_LIBRARY( render );
+
+
+    render->clazz->raster_class->raster_reset( render->raster,
+                                               library->raster_pool,
+                                               library->raster_pool_size );
+
+    return 0;
+  }
+
+
+  /* sets render-specific mode */
+  static FT_Error
+  ft_smooth_set_mode( FT_Renderer  render,
+                      FT_ULong     mode_tag,
+                      FT_Pointer   data )
+  {
+    /* we simply pass it to the raster */
+    return render->clazz->raster_class->raster_set_mode( render->raster,
+                                                         mode_tag,
+                                                         data );
+  }
+
+  /* transform a given glyph image */
+  static FT_Error
+  ft_smooth_transform( FT_Renderer       render,
+                       FT_GlyphSlot      slot,
+                       const FT_Matrix*  matrix,
+                       const FT_Vector*  delta )
+  {
+    FT_Error  error = Smooth_Err_Ok;
+
+
+    if ( slot->format != render->glyph_format )
+    {
+      error = Smooth_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    if ( matrix )
+      FT_Outline_Transform( &slot->outline, matrix );
+
+    if ( delta )
+      FT_Outline_Translate( &slot->outline, delta->x, delta->y );
+
+  Exit:
+    return error;
+  }
+
+
+  /* return the glyph's control box */
+  static void
+  ft_smooth_get_cbox( FT_Renderer   render,
+                      FT_GlyphSlot  slot,
+                      FT_BBox*      cbox )
+  {
+    FT_MEM_ZERO( cbox, sizeof ( *cbox ) );
+
+    if ( slot->format == render->glyph_format )
+      FT_Outline_Get_CBox( &slot->outline, cbox );
+  }
+
+
+  /* convert a slot's glyph image into a bitmap */
+  static FT_Error
+  ft_smooth_render_generic( FT_Renderer       render,
+                            FT_GlyphSlot      slot,
+                            FT_Render_Mode    mode,
+                            const FT_Vector*  origin,
+                            FT_Render_Mode    required_mode )
+  {
+    FT_Error     error;
+    FT_Outline*  outline = NULL;
+    FT_BBox      cbox;
+    FT_Pos       width, height, pitch;
+#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+    FT_Pos       height_org, width_org;
+#endif
+    FT_Bitmap*   bitmap;
+    FT_Memory    memory;
+    FT_Int       hmul = mode == FT_RENDER_MODE_LCD;
+    FT_Int       vmul = mode == FT_RENDER_MODE_LCD_V;
+    FT_Pos       x_shift, y_shift, x_left, y_top;
+
+    FT_Raster_Params  params;
+
+
+    /* check glyph image format */
+    if ( slot->format != render->glyph_format )
+    {
+      error = Smooth_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    /* check mode */
+    if ( mode != required_mode )
+      return Smooth_Err_Cannot_Render_Glyph;
+
+    outline = &slot->outline;
+
+    /* translate the outline to the new origin if needed */
+    if ( origin )
+      FT_Outline_Translate( outline, origin->x, origin->y );
+
+    /* compute the control box, and grid fit it */
+    FT_Outline_Get_CBox( outline, &cbox );
+
+    cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
+    cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
+    cbox.xMax = FT_PIX_CEIL( cbox.xMax );
+    cbox.yMax = FT_PIX_CEIL( cbox.yMax );
+
+    if ( cbox.xMin < 0 && cbox.xMax > FT_INT_MAX + cbox.xMin )
+    {
+      FT_ERROR(( "ft_smooth_render_generic: glyph too large:"
+                 " xMin = %d, xMax = %d\n",
+                 cbox.xMin >> 6, cbox.xMax >> 6 ));
+      return Smooth_Err_Raster_Overflow;
+    }
+    else
+      width  = ( cbox.xMax - cbox.xMin ) >> 6;
+
+    if ( cbox.yMin < 0 && cbox.yMax > FT_INT_MAX + cbox.yMin )
+    {
+      FT_ERROR(( "ft_smooth_render_generic: glyph too large:"
+                 " yMin = %d, yMax = %d\n",
+                 cbox.yMin >> 6, cbox.yMax >> 6 ));
+      return Smooth_Err_Raster_Overflow;
+    }
+    else
+      height = ( cbox.yMax - cbox.yMin ) >> 6;
+
+    bitmap = &slot->bitmap;
+    memory = render->root.memory;
+
+#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+    width_org  = width;
+    height_org = height;
+#endif
+
+    /* release old bitmap buffer */
+    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+    {
+      FT_FREE( bitmap->buffer );
+      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+    }
+
+    /* allocate new one */
+    pitch = width;
+    if ( hmul )
+    {
+      width = width * 3;
+      pitch = FT_PAD_CEIL( width, 4 );
+    }
+
+    if ( vmul )
+      height *= 3;
+
+    x_shift = (FT_Int) cbox.xMin;
+    y_shift = (FT_Int) cbox.yMin;
+    x_left  = (FT_Int)( cbox.xMin >> 6 );
+    y_top   = (FT_Int)( cbox.yMax >> 6 );
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+    if ( slot->library->lcd_filter_func )
+    {
+      FT_Int  extra = slot->library->lcd_extra;
+
+
+      if ( hmul )
+      {
+        x_shift -= 64 * ( extra >> 1 );
+        width   += 3 * extra;
+        pitch    = FT_PAD_CEIL( width, 4 );
+        x_left  -= extra >> 1;
+      }
+
+      if ( vmul )
+      {
+        y_shift -= 64 * ( extra >> 1 );
+        height  += 3 * extra;
+        y_top   += extra >> 1;
+      }
+    }
+
+#endif
+
+#if FT_UINT_MAX > 0xFFFFU
+
+    /* Required check is ( pitch * height < FT_ULONG_MAX ),     */
+    /* but we care realistic cases only. Always pitch <= width. */
+    if ( width > 0x7FFF || height > 0x7FFF )
+    {
+      FT_ERROR(( "ft_smooth_render_generic: glyph too large: %u x %u\n",
+                 width, height ));
+      return Smooth_Err_Raster_Overflow;
+    }
+
+#endif
+
+    bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
+    bitmap->num_grays  = 256;
+    bitmap->width      = width;
+    bitmap->rows       = height;
+    bitmap->pitch      = pitch;
+
+    /* translate outline to render it into the bitmap */
+    FT_Outline_Translate( outline, -x_shift, -y_shift );
+
+    if ( FT_ALLOC( bitmap->buffer, (FT_ULong)pitch * height ) )
+      goto Exit;
+
+    slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
+
+    /* set up parameters */
+    params.target = bitmap;
+    params.source = outline;
+    params.flags  = FT_RASTER_FLAG_AA;
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+    /* implode outline if needed */
+    {
+      FT_Vector*  points     = outline->points;
+      FT_Vector*  points_end = points + outline->n_points;
+      FT_Vector*  vec;
+
+
+      if ( hmul )
+        for ( vec = points; vec < points_end; vec++ )
+          vec->x *= 3;
+
+      if ( vmul )
+        for ( vec = points; vec < points_end; vec++ )
+          vec->y *= 3;
+    }
+
+    /* render outline into the bitmap */
+    error = render->raster_render( render->raster, &params );
+
+    /* deflate outline if needed */
+    {
+      FT_Vector*  points     = outline->points;
+      FT_Vector*  points_end = points + outline->n_points;
+      FT_Vector*  vec;
+
+
+      if ( hmul )
+        for ( vec = points; vec < points_end; vec++ )
+          vec->x /= 3;
+
+      if ( vmul )
+        for ( vec = points; vec < points_end; vec++ )
+          vec->y /= 3;
+    }
+
+    if ( slot->library->lcd_filter_func )
+      slot->library->lcd_filter_func( bitmap, mode, slot->library );
+
+#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
+    /* render outline into bitmap */
+    error = render->raster_render( render->raster, &params );
+
+    /* expand it horizontally */
+    if ( hmul )
+    {
+      FT_Byte*  line = bitmap->buffer;
+      FT_UInt   hh;
+
+
+      for ( hh = height_org; hh > 0; hh--, line += pitch )
+      {
+        FT_UInt   xx;
+        FT_Byte*  end = line + width;
+
+
+        for ( xx = width_org; xx > 0; xx-- )
+        {
+          FT_UInt  pixel = line[xx-1];
+
+
+          end[-3] = (FT_Byte)pixel;
+          end[-2] = (FT_Byte)pixel;
+          end[-1] = (FT_Byte)pixel;
+          end    -= 3;
+        }
+      }
+    }
+
+    /* expand it vertically */
+    if ( vmul )
+    {
+      FT_Byte*  read  = bitmap->buffer + ( height - height_org ) * pitch;
+      FT_Byte*  write = bitmap->buffer;
+      FT_UInt   hh;
+
+
+      for ( hh = height_org; hh > 0; hh-- )
+      {
+        ft_memcpy( write, read, pitch );
+        write += pitch;
+
+        ft_memcpy( write, read, pitch );
+        write += pitch;
+
+        ft_memcpy( write, read, pitch );
+        write += pitch;
+        read  += pitch;
+      }
+    }
+
+#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
+    FT_Outline_Translate( outline, x_shift, y_shift );
+
+    /*
+     * XXX: on 16bit system, we return an error for huge bitmap
+     * to prevent an overflow.
+     */
+    if ( x_left > FT_INT_MAX || y_top > FT_INT_MAX )
+      return Smooth_Err_Invalid_Pixel_Size;
+
+    if ( error )
+      goto Exit;
+
+    slot->format      = FT_GLYPH_FORMAT_BITMAP;
+    slot->bitmap_left = (FT_Int)x_left;
+    slot->bitmap_top  = (FT_Int)y_top;
+
+  Exit:
+    if ( outline && origin )
+      FT_Outline_Translate( outline, -origin->x, -origin->y );
+
+    return error;
+  }
+
+
+  /* convert a slot's glyph image into a bitmap */
+  static FT_Error
+  ft_smooth_render( FT_Renderer       render,
+                    FT_GlyphSlot      slot,
+                    FT_Render_Mode    mode,
+                    const FT_Vector*  origin )
+  {
+    if ( mode == FT_RENDER_MODE_LIGHT )
+      mode = FT_RENDER_MODE_NORMAL;
+
+    return ft_smooth_render_generic( render, slot, mode, origin,
+                                     FT_RENDER_MODE_NORMAL );
+  }
+
+
+  /* convert a slot's glyph image into a horizontal LCD bitmap */
+  static FT_Error
+  ft_smooth_render_lcd( FT_Renderer       render,
+                        FT_GlyphSlot      slot,
+                        FT_Render_Mode    mode,
+                        const FT_Vector*  origin )
+  {
+    FT_Error  error;
+
+    error = ft_smooth_render_generic( render, slot, mode, origin,
+                                      FT_RENDER_MODE_LCD );
+    if ( !error )
+      slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD;
+
+    return error;
+  }
+
+
+  /* convert a slot's glyph image into a vertical LCD bitmap */
+  static FT_Error
+  ft_smooth_render_lcd_v( FT_Renderer       render,
+                          FT_GlyphSlot      slot,
+                          FT_Render_Mode    mode,
+                          const FT_Vector*  origin )
+  {
+    FT_Error  error;
+
+    error = ft_smooth_render_generic( render, slot, mode, origin,
+                                      FT_RENDER_MODE_LCD_V );
+    if ( !error )
+      slot->bitmap.pixel_mode = FT_PIXEL_MODE_LCD_V;
+
+    return error;
+  }
+
+
+  FT_DEFINE_RENDERER( ft_smooth_renderer_class,
+
+      FT_MODULE_RENDERER,
+      sizeof ( FT_RendererRec ),
+
+      "smooth",
+      0x10000L,
+      0x20000L,
+
+      0,    /* module specific interface */
+
+      (FT_Module_Constructor)ft_smooth_init,
+      (FT_Module_Destructor) 0,
+      (FT_Module_Requester)  0
+    ,
+
+    FT_GLYPH_FORMAT_OUTLINE,
+
+    (FT_Renderer_RenderFunc)   ft_smooth_render,
+    (FT_Renderer_TransformFunc)ft_smooth_transform,
+    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,
+    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,
+
+    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET
+  )
+
+
+  FT_DEFINE_RENDERER( ft_smooth_lcd_renderer_class,
+
+      FT_MODULE_RENDERER,
+      sizeof ( FT_RendererRec ),
+
+      "smooth-lcd",
+      0x10000L,
+      0x20000L,
+
+      0,    /* module specific interface */
+
+      (FT_Module_Constructor)ft_smooth_init,
+      (FT_Module_Destructor) 0,
+      (FT_Module_Requester)  0
+    ,
+
+    FT_GLYPH_FORMAT_OUTLINE,
+
+    (FT_Renderer_RenderFunc)   ft_smooth_render_lcd,
+    (FT_Renderer_TransformFunc)ft_smooth_transform,
+    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,
+    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,
+
+    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET
+  )
+
+  FT_DEFINE_RENDERER( ft_smooth_lcdv_renderer_class,
+
+      FT_MODULE_RENDERER,
+      sizeof ( FT_RendererRec ),
+
+      "smooth-lcdv",
+      0x10000L,
+      0x20000L,
+
+      0,    /* module specific interface */
+
+      (FT_Module_Constructor)ft_smooth_init,
+      (FT_Module_Destructor) 0,
+      (FT_Module_Requester)  0
+    ,
+
+    FT_GLYPH_FORMAT_OUTLINE,
+
+    (FT_Renderer_RenderFunc)   ft_smooth_render_lcd_v,
+    (FT_Renderer_TransformFunc)ft_smooth_transform,
+    (FT_Renderer_GetCBoxFunc)  ft_smooth_get_cbox,
+    (FT_Renderer_SetModeFunc)  ft_smooth_set_mode,
+
+    (FT_Raster_Funcs*)    &FT_GRAYS_RASTER_GET
+  )
+
+
+/* END */
diff --git a/src/smooth/ftsmooth.h b/src/smooth/ftsmooth.h
new file mode 100644 (file)
index 0000000..3708790
--- /dev/null
@@ -0,0 +1,49 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftsmooth.h                                                             */
+/*                                                                         */
+/*    Anti-aliasing renderer interface (specification).                    */
+/*                                                                         */
+/*  Copyright 1996-2001 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTSMOOTH_H__
+#define __FTSMOOTH_H__
+
+
+#include <ft2build.h>
+#include FT_RENDER_H
+
+
+FT_BEGIN_HEADER
+
+
+#ifndef FT_CONFIG_OPTION_NO_STD_RASTER
+  FT_DECLARE_RENDERER( ft_std_renderer_class )
+#endif
+
+#ifndef FT_CONFIG_OPTION_NO_SMOOTH_RASTER
+  FT_DECLARE_RENDERER( ft_smooth_renderer_class )
+
+  FT_DECLARE_RENDERER( ft_smooth_lcd_renderer_class )
+
+  FT_DECLARE_RENDERER( ft_smooth_lcd_v_renderer_class )
+#endif
+
+
+
+FT_END_HEADER
+
+#endif /* __FTSMOOTH_H__ */
+
+
+/* END */
diff --git a/src/smooth/ftspic.c b/src/smooth/ftspic.c
new file mode 100644 (file)
index 0000000..601bcf9
--- /dev/null
@@ -0,0 +1,107 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftspic.c                                                               */
+/*                                                                         */
+/*    The FreeType position independent code services for smooth module.   */
+/*                                                                         */
+/*  Copyright 2009, 2010 by                                                */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_INTERNAL_OBJECTS_H
+#include "ftspic.h"
+#include "ftsmerrs.h"
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* forward declaration of PIC init functions from ftgrays.c */
+  void
+  FT_Init_Class_ft_grays_raster( FT_Raster_Funcs*  funcs );
+
+  void
+  ft_smooth_renderer_class_pic_free( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Memory  memory = library->memory;
+
+
+    if ( pic_container->smooth )
+    {
+      SmoothPIC*  container = (SmoothPIC*)pic_container->smooth;
+
+
+      if ( --container->ref_count )
+        return;
+      FT_FREE( container );
+      pic_container->smooth = NULL;
+    }
+  }
+
+
+  FT_Error
+  ft_smooth_renderer_class_pic_init( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Error           error         = Smooth_Err_Ok;
+    SmoothPIC*         container;
+    FT_Memory          memory        = library->memory;
+
+
+    /* since this function also serve smooth_lcd and smooth_lcdv renderers,
+       it implements reference counting */
+    if ( pic_container->smooth )
+    {
+      ((SmoothPIC*)pic_container->smooth)->ref_count++;
+      return error;
+    }
+
+    /* allocate pointer, clear and set global container pointer */
+    if ( FT_ALLOC ( container, sizeof ( *container ) ) )
+      return error;
+    FT_MEM_SET( container, 0, sizeof ( *container ) );
+    pic_container->smooth = container;
+    container->ref_count = 1;
+
+    /* initialize pointer table - this is how the module usually expects this data */
+    FT_Init_Class_ft_grays_raster( &container->ft_grays_raster );
+/*Exit:*/
+    if ( error )
+      ft_smooth_renderer_class_pic_free( library );
+    return error;
+  }
+
+  /* re-route these init and free functions to the above functions */
+  FT_Error ft_smooth_lcd_renderer_class_pic_init( FT_Library  library )
+  {
+    return ft_smooth_renderer_class_pic_init( library );
+  }
+
+  void ft_smooth_lcd_renderer_class_pic_free( FT_Library  library )
+  {
+    ft_smooth_renderer_class_pic_free( library );
+  }
+
+  FT_Error ft_smooth_lcdv_renderer_class_pic_init( FT_Library  library )
+  {
+    return ft_smooth_renderer_class_pic_init( library );
+  }
+
+  void ft_smooth_lcdv_renderer_class_pic_free( FT_Library  library )
+  {
+    ft_smooth_renderer_class_pic_free( library );
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/src/smooth/ftspic.h b/src/smooth/ftspic.h
new file mode 100644 (file)
index 0000000..4686f5e
--- /dev/null
@@ -0,0 +1,69 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftspic.h                                                               */
+/*                                                                         */
+/*    The FreeType position independent code services for smooth module.   */
+/*                                                                         */
+/*  Copyright 2009 by                                                      */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __FTSPIC_H__
+#define __FTSPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#include FT_INTERNAL_PIC_H
+
+#ifndef FT_CONFIG_OPTION_PIC
+#define FT_GRAYS_RASTER_GET        ft_grays_raster
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+  typedef struct SmoothPIC_
+  {
+    int ref_count;
+    FT_Raster_Funcs ft_grays_raster;
+  } SmoothPIC;
+
+#define GET_PIC(lib)               ((SmoothPIC*)((lib)->pic_container.smooth))
+#define FT_GRAYS_RASTER_GET        (GET_PIC(library)->ft_grays_raster)
+
+  /* see ftspic.c for the implementation */
+  void
+  ft_smooth_renderer_class_pic_free( FT_Library  library );
+
+  void
+  ft_smooth_lcd_renderer_class_pic_free( FT_Library  library );
+
+  void
+  ft_smooth_lcdv_renderer_class_pic_free( FT_Library  library );
+
+  FT_Error
+  ft_smooth_renderer_class_pic_init( FT_Library  library );
+
+  FT_Error
+  ft_smooth_lcd_renderer_class_pic_init( FT_Library  library );
+
+  FT_Error
+  ft_smooth_lcdv_renderer_class_pic_init( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __FTSPIC_H__ */
+
+
+/* END */
diff --git a/src/smooth/module.mk b/src/smooth/module.mk
new file mode 100644 (file)
index 0000000..47f6c04
--- /dev/null
@@ -0,0 +1,27 @@
+#
+# FreeType 2 smooth renderer module definition
+#
+
+
+# Copyright 1996-2000, 2006 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.
+
+
+FTMODULE_H_COMMANDS += SMOOTH_RENDERER
+
+define SMOOTH_RENDERER
+$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_renderer_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)smooth    $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer$(ECHO_DRIVER_DONE)
+$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_lcd_renderer_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)smooth    $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for LCDs$(ECHO_DRIVER_DONE)
+$(OPEN_DRIVER) FT_Renderer_Class, ft_smooth_lcdv_renderer_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)smooth    $(ECHO_DRIVER_DESC)anti-aliased bitmap renderer for vertical LCDs$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/src/smooth/rules.mk b/src/smooth/rules.mk
new file mode 100644 (file)
index 0000000..88d0aa5
--- /dev/null
@@ -0,0 +1,70 @@
+#
+# FreeType 2 smooth renderer module build rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003, 2011 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.
+
+
+# smooth driver directory
+#
+SMOOTH_DIR := $(SRC_DIR)/smooth
+
+# compilation flags for the driver
+#
+SMOOTH_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(SMOOTH_DIR))
+
+
+# smooth driver sources (i.e., C files)
+#
+SMOOTH_DRV_SRC := $(SMOOTH_DIR)/ftgrays.c  \
+                  $(SMOOTH_DIR)/ftsmooth.c \
+                  $(SMOOTH_DIR)/ftspic.c
+
+
+# smooth driver headers
+#
+SMOOTH_DRV_H := $(SMOOTH_DRV_SRC:%c=%h)  \
+                $(SMOOTH_DIR)/ftsmerrs.h
+
+
+# smooth driver object(s)
+#
+#   SMOOTH_DRV_OBJ_M is used during `multi' builds.
+#   SMOOTH_DRV_OBJ_S is used during `single' builds.
+#
+SMOOTH_DRV_OBJ_M := $(SMOOTH_DRV_SRC:$(SMOOTH_DIR)/%.c=$(OBJ_DIR)/%.$O)
+SMOOTH_DRV_OBJ_S := $(OBJ_DIR)/smooth.$O
+
+# smooth driver source file for single build
+#
+SMOOTH_DRV_SRC_S := $(SMOOTH_DIR)/smooth.c
+
+
+# smooth driver - single object
+#
+$(SMOOTH_DRV_OBJ_S): $(SMOOTH_DRV_SRC_S) $(SMOOTH_DRV_SRC) \
+                     $(FREETYPE_H) $(SMOOTH_DRV_H)
+       $(SMOOTH_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(SMOOTH_DRV_SRC_S))
+
+
+# smooth driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(SMOOTH_DIR)/%.c $(FREETYPE_H) $(SMOOTH_DRV_H)
+       $(SMOOTH_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(SMOOTH_DRV_OBJ_S)
+DRV_OBJS_M += $(SMOOTH_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/smooth/smooth.c b/src/smooth/smooth.c
new file mode 100644 (file)
index 0000000..a8ac51f
--- /dev/null
@@ -0,0 +1,27 @@
+/***************************************************************************/
+/*                                                                         */
+/*  smooth.c                                                               */
+/*                                                                         */
+/*    FreeType anti-aliasing rasterer module component (body only).        */
+/*                                                                         */
+/*  Copyright 1996-2001 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include <ft2build.h>
+#include "ftspic.c"
+#include "ftgrays.c"
+#include "ftsmooth.c"
+
+
+/* END */
diff --git a/src/tools/Jamfile b/src/tools/Jamfile
new file mode 100644 (file)
index 0000000..475161e
--- /dev/null
@@ -0,0 +1,5 @@
+# Jamfile for src/tools
+#
+SubDir FT2_TOP src tools ;
+
+Main  apinames : apinames.c ;
diff --git a/src/tools/apinames.c b/src/tools/apinames.c
new file mode 100644 (file)
index 0000000..3dc6559
--- /dev/null
@@ -0,0 +1,450 @@
+/*
+ * This little program is used to parse the FreeType headers and
+ * find the declaration of all public APIs.  This is easy, because
+ * they all look like the following:
+ *
+ *   FT_EXPORT( return_type )
+ *   function_name( function arguments );
+ *
+ * You must pass the list of header files as arguments.  Wildcards are
+ * accepted if you are using GCC for compilation (and probably by
+ * other compilers too).
+ *
+ * Author: David Turner, 2005, 2006, 2008-2012
+ *
+ * This code is explicitly placed into the public domain.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#define  PROGRAM_NAME     "apinames"
+#define  PROGRAM_VERSION  "0.1"
+
+#define  LINEBUFF_SIZE  1024
+
+typedef enum  OutputFormat_
+{
+  OUTPUT_LIST = 0,      /* output the list of names, one per line             */
+  OUTPUT_WINDOWS_DEF,   /* output a Windows .DEF file for Visual C++ or Mingw */
+  OUTPUT_BORLAND_DEF,   /* output a Windows .DEF file for Borland C++         */
+  OUTPUT_WATCOM_LBC     /* output a Watcom Linker Command File                */
+
+} OutputFormat;
+
+
+static void
+panic( const char*  message )
+{
+  fprintf( stderr, "PANIC: %s\n", message );
+  exit(2);
+}
+
+
+typedef struct  NameRec_
+{
+  char*         name;
+  unsigned int  hash;
+
+} NameRec, *Name;
+
+static Name  the_names;
+static int   num_names;
+static int   max_names;
+
+static void
+names_add( const char*  name,
+           const char*  end )
+{
+  unsigned int  h;
+  int           nn, len;
+  Name          nm;
+
+  if ( end <= name )
+    return;
+
+  /* compute hash value */
+  len = (int)(end - name);
+  h   = 0;
+  for ( nn = 0; nn < len; nn++ )
+    h = h*33 + name[nn];
+
+  /* check for an pre-existing name */
+  for ( nn = 0; nn < num_names; nn++ )
+  {
+    nm = the_names + nn;
+
+    if ( (int)nm->hash                 == h &&
+         memcmp( name, nm->name, len ) == 0 &&
+         nm->name[len]                 == 0 )
+      return;
+  }
+
+  /* add new name */
+  if ( num_names >= max_names )
+  {
+    max_names += (max_names >> 1) + 4;
+    the_names  = (NameRec*)realloc( the_names,
+                                    sizeof ( the_names[0] ) * max_names );
+    if ( the_names == NULL )
+      panic( "not enough memory" );
+  }
+  nm = &the_names[num_names++];
+
+  nm->hash = h;
+  nm->name = (char*)malloc( len+1 );
+  if ( nm->name == NULL )
+    panic( "not enough memory" );
+
+  memcpy( nm->name, name, len );
+  nm->name[len] = 0;
+}
+
+
+static int
+name_compare( const void*  name1,
+              const void*  name2 )
+{
+  Name  n1 = (Name)name1;
+  Name  n2 = (Name)name2;
+
+  return strcmp( n1->name, n2->name );
+}
+
+static void
+names_sort( void )
+{
+  qsort( the_names, (size_t)num_names,
+         sizeof ( the_names[0] ), name_compare );
+}
+
+
+static void
+names_dump( FILE*         out,
+            OutputFormat  format,
+            const char*   dll_name )
+{
+  int  nn;
+
+
+  switch ( format )
+  {
+    case OUTPUT_WINDOWS_DEF:
+      if ( dll_name )
+        fprintf( out, "LIBRARY %s\n", dll_name );
+
+      fprintf( out, "DESCRIPTION  FreeType 2 DLL\n" );
+      fprintf( out, "EXPORTS\n" );
+      for ( nn = 0; nn < num_names; nn++ )
+        fprintf( out, "  %s\n", the_names[nn].name );
+      break;
+
+    case OUTPUT_BORLAND_DEF:
+      if ( dll_name )
+        fprintf( out, "LIBRARY %s\n", dll_name );
+
+      fprintf( out, "DESCRIPTION  FreeType 2 DLL\n" );
+      fprintf( out, "EXPORTS\n" );
+      for ( nn = 0; nn < num_names; nn++ )
+        fprintf( out, "  _%s\n", the_names[nn].name );
+      break;
+
+    case OUTPUT_WATCOM_LBC:
+      {
+        /* we must omit the .dll suffix from the library name */
+        char         temp[512];
+        const char*  dot;
+
+
+        if ( dll_name == NULL )
+        {
+          fprintf( stderr,
+                   "you must provide a DLL name with the -d option!\n" );
+          exit( 4 );
+        }
+
+        dot = strchr( dll_name, '.' );
+        if ( dot != NULL )
+        {
+          int  len = dot - dll_name;
+
+
+          if ( len > (int)( sizeof ( temp ) - 1 ) )
+            len = sizeof ( temp ) - 1;
+
+          memcpy( temp, dll_name, len );
+          temp[len] = 0;
+
+          dll_name = (const char*)temp;
+        }
+
+        for ( nn = 0; nn < num_names; nn++ )
+          fprintf( out, "++_%s.%s.%s\n", the_names[nn].name, dll_name,
+                        the_names[nn].name );
+      }
+      break;
+
+    default:  /* LIST */
+      for ( nn = 0; nn < num_names; nn++ )
+        fprintf( out, "%s\n", the_names[nn].name );
+  }
+}
+
+
+
+
+/* states of the line parser */
+
+typedef enum  State_
+{
+  STATE_START = 0,  /* waiting for FT_EXPORT keyword and return type */
+  STATE_TYPE        /* type was read, waiting for function name      */
+
+} State;
+
+static int
+read_header_file( FILE*  file, int  verbose )
+{
+  static char  buff[LINEBUFF_SIZE + 1];
+  State        state = STATE_START;
+
+  while ( !feof( file ) )
+  {
+    char*  p;
+
+    if ( !fgets( buff, LINEBUFF_SIZE, file ) )
+      break;
+
+    p = buff;
+
+    while ( *p && (*p == ' ' || *p == '\\') )  /* skip leading whitespace */
+      p++;
+
+    if ( *p == '\n' || *p == '\r' )  /* skip empty lines */
+      continue;
+
+    switch ( state )
+    {
+      case STATE_START:
+        {
+          if ( memcmp( p, "FT_EXPORT(", 10 ) != 0 )
+            break;
+
+          p += 10;
+          for (;;)
+          {
+            if ( *p == 0 || *p == '\n' || *p == '\r' )
+              goto NextLine;
+
+            if ( *p == ')' )
+            {
+              p++;
+              break;
+            }
+
+            p++;
+          }
+
+          state = STATE_TYPE;
+
+         /* sometimes, the name is just after the FT_EXPORT(...), so
+          * skip whitespace, and fall-through if we find an alphanumeric
+          * character
+          */
+          while ( *p == ' ' || *p == '\t' )
+            p++;
+
+          if ( !isalpha(*p) )
+            break;
+        }
+        /* fall-through */
+
+      case STATE_TYPE:
+        {
+          char*   name = p;
+
+          while ( isalnum(*p) || *p == '_' )
+            p++;
+
+          if ( p > name )
+          {
+            if ( verbose )
+              fprintf( stderr, ">>> %.*s\n", (int)(p - name), name );
+
+            names_add( name, p );
+          }
+
+          state = STATE_START;
+        }
+        break;
+
+      default:
+        ;
+    }
+
+  NextLine:
+    ;
+  }
+
+  return 0;
+}
+
+
+static void
+usage( void )
+{
+  static const char* const  format =
+   "%s %s: extract FreeType API names from header files\n\n"
+   "this program is used to extract the list of public FreeType API\n"
+   "functions. It receives the list of header files as argument and\n"
+   "generates a sorted list of unique identifiers\n\n"
+
+   "usage: %s header1 [options] [header2 ...]\n\n"
+
+   "options:   -      : parse the content of stdin, ignore arguments\n"
+   "           -v     : verbose mode, output sent to standard error\n"
+   "           -oFILE : write output to FILE instead of standard output\n"
+   "           -dNAME : indicate DLL file name, 'freetype.dll' by default\n"
+   "           -w     : output .DEF file for Visual C++ and Mingw\n"
+   "           -wB    : output .DEF file for Borland C++\n"
+   "           -wW    : output Watcom Linker Response File\n"
+   "\n";
+
+  fprintf( stderr,
+           format,
+           PROGRAM_NAME,
+           PROGRAM_VERSION,
+           PROGRAM_NAME
+           );
+  exit(1);
+}
+
+
+int  main( int argc, const char* const*  argv )
+{
+  int           from_stdin = 0;
+  int           verbose = 0;
+  OutputFormat  format = OUTPUT_LIST;  /* the default */
+  FILE*         out    = stdout;
+  const char*   library_name = NULL;
+
+  if ( argc < 2 )
+    usage();
+
+  /* '-' used as a single argument means read source file from stdin */
+  while ( argc > 1 && argv[1][0] == '-' )
+  {
+    const char*  arg = argv[1];
+
+    switch ( arg[1] )
+    {
+      case 'v':
+        verbose = 1;
+        break;
+
+      case 'o':
+        if ( arg[2] == 0 )
+        {
+          if ( argc < 2 )
+            usage();
+
+          arg = argv[2];
+          argv++;
+          argc--;
+        }
+        else
+          arg += 2;
+
+        out = fopen( arg, "wt" );
+        if ( out == NULL )
+        {
+          fprintf( stderr, "could not open '%s' for writing\n", argv[2] );
+          exit(3);
+        }
+        break;
+
+      case 'd':
+        if ( arg[2] == 0 )
+        {
+          if ( argc < 2 )
+            usage();
+
+          arg = argv[2];
+          argv++;
+          argc--;
+        }
+        else
+          arg += 2;
+
+        library_name = arg;
+        break;
+
+      case 'w':
+        format = OUTPUT_WINDOWS_DEF;
+        switch ( arg[2] )
+        {
+          case 'B':
+            format = OUTPUT_BORLAND_DEF;
+            break;
+
+          case 'W':
+            format = OUTPUT_WATCOM_LBC;
+            break;
+
+          case 0:
+            break;
+
+          default:
+            usage();
+        }
+        break;
+
+      case 0:
+        from_stdin = 1;
+        break;
+
+      default:
+        usage();
+    }
+
+    argc--;
+    argv++;
+  }
+
+  if ( from_stdin )
+  {
+    read_header_file( stdin, verbose );
+  }
+  else
+  {
+    for ( --argc, argv++; argc > 0; argc--, argv++ )
+    {
+      FILE*  file = fopen( argv[0], "rb" );
+
+      if ( file == NULL )
+        fprintf( stderr, "unable to open '%s'\n", argv[0] );
+      else
+      {
+        if ( verbose )
+          fprintf( stderr, "opening '%s'\n", argv[0] );
+
+        read_header_file( file, verbose );
+        fclose( file );
+      }
+    }
+  }
+
+  if ( num_names == 0 )
+    panic( "could not find exported functions !!\n" );
+
+  names_sort();
+  names_dump( out, format, library_name );
+
+  if ( out != stdout )
+    fclose( out );
+
+  return 0;
+}
diff --git a/src/tools/chktrcmp.py b/src/tools/chktrcmp.py
new file mode 100755 (executable)
index 0000000..d0f342e
--- /dev/null
@@ -0,0 +1,114 @@
+#!/usr/bin/env python
+#
+# Check trace components in FreeType 2 source.
+# Author: suzuki toshiya, 2009
+#
+# This code is explicitly into the public domain.
+
+
+import sys
+import os
+import re
+
+SRC_FILE_LIST   = []
+USED_COMPONENT  = {}
+KNOWN_COMPONENT = {}
+
+SRC_FILE_DIRS   = [ "src" ]
+TRACE_DEF_FILES = [ "include/freetype/internal/fttrace.h" ]
+
+
+# --------------------------------------------------------------
+# Parse command line options
+#
+
+for i in range( 1, len( sys.argv ) ):
+  if sys.argv[i].startswith( "--help" ):
+    print "Usage: %s [option]" % sys.argv[0]
+    print "Search used-but-defined and defined-but-not-used trace_XXX macros"
+    print ""
+    print "  --help:"
+    print "        Show this help"
+    print ""
+    print "  --src-dirs=dir1:dir2:..."
+    print "        Specify the directories of C source files to be checked"
+    print "        Default is %s" % ":".join( SRC_FILE_DIRS )
+    print ""
+    print "  --def-files=file1:file2:..."
+    print "        Specify the header files including FT_TRACE_DEF()"
+    print "        Default is %s" % ":".join( TRACE_DEF_FILES )
+    print ""
+    exit(0)
+  if sys.argv[i].startswith( "--src-dirs=" ):
+    SRC_FILE_DIRS = sys.argv[i].replace( "--src-dirs=", "", 1 ).split( ":" )
+  elif sys.argv[i].startswith( "--def-files=" ):
+    TRACE_DEF_FILES = sys.argv[i].replace( "--def-files=", "", 1 ).split( ":" )
+
+
+# --------------------------------------------------------------
+# Scan C source and header files using trace macros.
+#
+
+c_pathname_pat = re.compile( '^.*\.[ch]$', re.IGNORECASE )
+trace_use_pat  = re.compile( '^[ \t]*#define[ \t]+FT_COMPONENT[ \t]+trace_' )
+
+for d in SRC_FILE_DIRS:
+  for ( p, dlst, flst ) in os.walk( d ):
+    for f in flst:
+      if c_pathname_pat.match( f ) != None:
+        src_pathname = os.path.join( p, f )
+
+        line_num = 0
+        for src_line in open( src_pathname, 'r' ):
+          line_num = line_num + 1
+          src_line = src_line.strip()
+          if trace_use_pat.match( src_line ) != None:
+            component_name = trace_use_pat.sub( '', src_line )
+            if component_name in USED_COMPONENT:
+              USED_COMPONENT[component_name].append( "%s:%d" % ( src_pathname, line_num ) )
+            else:
+              USED_COMPONENT[component_name] = [ "%s:%d" % ( src_pathname, line_num ) ]
+
+
+# --------------------------------------------------------------
+# Scan header file(s) defining trace macros.
+#
+
+trace_def_pat_opn = re.compile( '^.*FT_TRACE_DEF[ \t]*\([ \t]*' )
+trace_def_pat_cls = re.compile( '[ \t\)].*$' )
+
+for f in TRACE_DEF_FILES:
+  line_num = 0
+  for hdr_line in open( f, 'r' ):
+    line_num = line_num + 1
+    hdr_line = hdr_line.strip()
+    if trace_def_pat_opn.match( hdr_line ) != None:
+      component_name = trace_def_pat_opn.sub( '', hdr_line )
+      component_name = trace_def_pat_cls.sub( '', component_name )
+      if component_name in KNOWN_COMPONENT:
+        print "trace component %s is defined twice, see %s and fttrace.h:%d" % \
+          ( component_name, KNOWN_COMPONENT[component_name], line_num )
+      else:
+        KNOWN_COMPONENT[component_name] = "%s:%d" % \
+          ( os.path.basename( f ), line_num )
+
+
+# --------------------------------------------------------------
+# Compare the used and defined trace macros.
+#
+
+print "# Trace component used in the implementations but not defined in fttrace.h."
+cmpnt = USED_COMPONENT.keys()
+cmpnt.sort()
+for c in cmpnt:
+  if c not in KNOWN_COMPONENT:
+    print "Trace component %s (used in %s) is not defined." % ( c, ", ".join( USED_COMPONENT[c] ) )
+
+print "# Trace component is defined but not used in the implementations."
+cmpnt = KNOWN_COMPONENT.keys()
+cmpnt.sort()
+for c in cmpnt:
+  if c not in USED_COMPONENT:
+    if c != "any":
+      print "Trace component %s (defined in %s) is not used." % ( c, KNOWN_COMPONENT[c] )
+
diff --git a/src/tools/cordic.py b/src/tools/cordic.py
new file mode 100644 (file)
index 0000000..3f80c5f
--- /dev/null
@@ -0,0 +1,79 @@
+# compute arctangent table for CORDIC computations in fttrigon.c
+import sys, math
+
+#units  = 64*65536.0   # don't change !!
+units  = 256
+scale  = units/math.pi
+shrink = 1.0
+comma  = ""
+
+def calc_val( x ):
+    global units, shrink
+    angle  = math.atan(x)
+    shrink = shrink * math.cos(angle)
+    return angle/math.pi * units
+
+def  print_val( n, x ):
+    global comma
+
+    lo  = int(x)
+    hi  = lo + 1
+    alo = math.atan(lo)
+    ahi = math.atan(hi)
+    ax  = math.atan(2.0**n)
+
+    errlo = abs( alo - ax )
+    errhi = abs( ahi - ax )
+
+    if ( errlo < errhi ):
+      hi = lo
+
+    sys.stdout.write( comma + repr( int(hi) ) )
+    comma = ", "
+
+
+print ""
+print "table of arctan( 1/2^n ) for PI = " + repr(units/65536.0) + " units"
+
+# compute range of "i"
+r = [-1]
+r = r + range(32)
+
+for n in r:
+
+    if n >= 0:
+        x = 1.0/(2.0**n)    # tangent value
+    else:
+        x = 2.0**(-n)
+
+    angle  = math.atan(x)    # arctangent
+    angle2 = angle*scale     # arctangent in FT_Angle units
+
+    # determine which integer value for angle gives the best tangent
+    lo  = int(angle2)
+    hi  = lo + 1
+    tlo = math.tan(lo/scale)
+    thi = math.tan(hi/scale)
+
+    errlo = abs( tlo - x )
+    errhi = abs( thi - x )
+
+    angle2 = hi
+    if errlo < errhi:
+        angle2 = lo
+
+    if angle2 <= 0:
+        break
+
+    sys.stdout.write( comma + repr( int(angle2) ) )
+    comma = ", "
+
+    shrink = shrink * math.cos( angle2/scale)
+
+
+print
+print "shrink factor    = " + repr( shrink )
+print "shrink factor 2  = " + repr( shrink * (2.0**32) )
+print "expansion factor = " + repr(1/shrink)
+print ""
+
diff --git a/src/tools/docmaker/.gitignore b/src/tools/docmaker/.gitignore
new file mode 100644 (file)
index 0000000..0d20b64
--- /dev/null
@@ -0,0 +1 @@
+*.pyc
diff --git a/src/tools/docmaker/content.py b/src/tools/docmaker/content.py
new file mode 100644 (file)
index 0000000..b398955
--- /dev/null
@@ -0,0 +1,584 @@
+#  Content (c) 2002, 2004, 2006, 2007, 2008, 2009
+#    David Turner <david@freetype.org>
+#
+#  This file contains routines used to parse the content of documentation
+#  comment blocks and build more structured objects out of them.
+#
+
+from sources import *
+from utils import *
+import string, re
+
+
+# this regular expression is used to detect code sequences. these
+# are simply code fragments embedded in '{' and '}' like in:
+#
+#  {
+#    x = y + z;
+#    if ( zookoo == 2 )
+#    {
+#      foobar();
+#    }
+#  }
+#
+# note that indentation of the starting and ending accolades must be
+# exactly the same. the code sequence can contain accolades at greater
+# indentation
+#
+re_code_start = re.compile( r"(\s*){\s*$" )
+re_code_end   = re.compile( r"(\s*)}\s*$" )
+
+
+# this regular expression is used to isolate identifiers from
+# other text
+#
+re_identifier = re.compile( r'(\w*)' )
+
+
+# we collect macros ending in `_H'; while outputting the object data, we use
+# this info together with the object's file location to emit the appropriate
+# header file macro and name before the object itself
+#
+re_header_macro = re.compile( r'^#define\s{1,}(\w{1,}_H)\s{1,}<(.*)>' )
+
+
+#############################################################################
+#
+# The DocCode class is used to store source code lines.
+#
+#   'self.lines' contains a set of source code lines that will be dumped as
+#   HTML in a <PRE> tag.
+#
+#   The object is filled line by line by the parser; it strips the leading
+#   "margin" space from each input line before storing it in 'self.lines'.
+#
+class  DocCode:
+
+    def  __init__( self, margin, lines ):
+        self.lines = []
+        self.words = None
+
+        # remove margin spaces
+        for l in lines:
+            if string.strip( l[:margin] ) == "":
+                l = l[margin:]
+            self.lines.append( l )
+
+    def  dump( self, prefix = "", width = 60 ):
+        lines = self.dump_lines( 0, width )
+        for l in lines:
+            print prefix + l
+
+    def  dump_lines( self, margin = 0, width = 60 ):
+        result = []
+        for l in self.lines:
+            result.append( " " * margin + l )
+        return result
+
+
+
+#############################################################################
+#
+# The DocPara class is used to store "normal" text paragraph.
+#
+#   'self.words' contains the list of words that make up the paragraph
+#
+class  DocPara:
+
+    def  __init__( self, lines ):
+        self.lines = None
+        self.words = []
+        for l in lines:
+            l = string.strip( l )
+            self.words.extend( string.split( l ) )
+
+    def  dump( self, prefix = "", width = 60 ):
+        lines = self.dump_lines( 0, width )
+        for l in lines:
+            print prefix + l
+
+    def  dump_lines( self, margin = 0, width = 60 ):
+        cur    = ""  # current line
+        col    = 0   # current width
+        result = []
+
+        for word in self.words:
+            ln = len( word )
+            if col > 0:
+                ln = ln + 1
+
+            if col + ln > width:
+                result.append( " " * margin + cur )
+                cur = word
+                col = len( word )
+            else:
+                if col > 0:
+                    cur = cur + " "
+                cur = cur + word
+                col = col + ln
+
+        if col > 0:
+            result.append( " " * margin + cur )
+
+        return result
+
+
+
+#############################################################################
+#
+#  The DocField class is used to store a list containing either DocPara or
+#  DocCode objects. Each DocField also has an optional "name" which is used
+#  when the object corresponds to a field or value definition
+#
+class  DocField:
+
+    def  __init__( self, name, lines ):
+        self.name  = name  # can be None for normal paragraphs/sources
+        self.items = []    # list of items
+
+        mode_none  = 0     # start parsing mode
+        mode_code  = 1     # parsing code sequences
+        mode_para  = 3     # parsing normal paragraph
+
+        margin     = -1    # current code sequence indentation
+        cur_lines  = []
+
+        # now analyze the markup lines to see if they contain paragraphs,
+        # code sequences or fields definitions
+        #
+        start = 0
+        mode  = mode_none
+
+        for l in lines:
+            # are we parsing a code sequence ?
+            if mode == mode_code:
+                m = re_code_end.match( l )
+                if m and len( m.group( 1 ) ) <= margin:
+                    # that's it, we finished the code sequence
+                    code = DocCode( 0, cur_lines )
+                    self.items.append( code )
+                    margin    = -1
+                    cur_lines = []
+                    mode      = mode_none
+                else:
+                    # nope, continue the code sequence
+                    cur_lines.append( l[margin:] )
+            else:
+                # start of code sequence ?
+                m = re_code_start.match( l )
+                if m:
+                    # save current lines
+                    if cur_lines:
+                        para = DocPara( cur_lines )
+                        self.items.append( para )
+                        cur_lines = []
+
+                    # switch to code extraction mode
+                    margin = len( m.group( 1 ) )
+                    mode   = mode_code
+                else:
+                    if not string.split( l ) and cur_lines:
+                        # if the line is empty, we end the current paragraph,
+                        # if any
+                        para = DocPara( cur_lines )
+                        self.items.append( para )
+                        cur_lines = []
+                    else:
+                        # otherwise, simply add the line to the current
+                        # paragraph
+                        cur_lines.append( l )
+
+        if mode == mode_code:
+            # unexpected end of code sequence
+            code = DocCode( margin, cur_lines )
+            self.items.append( code )
+        elif cur_lines:
+            para = DocPara( cur_lines )
+            self.items.append( para )
+
+    def  dump( self, prefix = "" ):
+        if self.field:
+            print prefix + self.field + " ::"
+            prefix = prefix + "----"
+
+        first = 1
+        for p in self.items:
+            if not first:
+                print ""
+            p.dump( prefix )
+            first = 0
+
+    def  dump_lines( self, margin = 0, width = 60 ):
+        result = []
+        nl     = None
+
+        for p in self.items:
+            if nl:
+                result.append( "" )
+
+            result.extend( p.dump_lines( margin, width ) )
+            nl = 1
+
+        return result
+
+
+
+# this regular expression is used to detect field definitions
+#
+re_field = re.compile( r"\s*(\w*|\w(\w|\.)*\w)\s*::" )
+
+
+
+class  DocMarkup:
+
+    def  __init__( self, tag, lines ):
+        self.tag    = string.lower( tag )
+        self.fields = []
+
+        cur_lines = []
+        field     = None
+        mode      = 0
+
+        for l in lines:
+            m = re_field.match( l )
+            if m:
+                # we detected the start of a new field definition
+
+                # first, save the current one
+                if cur_lines:
+                    f = DocField( field, cur_lines )
+                    self.fields.append( f )
+                    cur_lines = []
+                    field     = None
+
+                field     = m.group( 1 )   # record field name
+                ln        = len( m.group( 0 ) )
+                l         = " " * ln + l[ln:]
+                cur_lines = [l]
+            else:
+                cur_lines.append( l )
+
+        if field or cur_lines:
+            f = DocField( field, cur_lines )
+            self.fields.append( f )
+
+    def  get_name( self ):
+        try:
+            return self.fields[0].items[0].words[0]
+        except:
+            return None
+
+    def  get_start( self ):
+        try:
+            result = ""
+            for word in self.fields[0].items[0].words:
+                result = result + " " + word
+            return result[1:]
+        except:
+            return "ERROR"
+
+    def  dump( self, margin ):
+        print " " * margin + "<" + self.tag + ">"
+        for f in self.fields:
+            f.dump( "  " )
+        print " " * margin + "</" + self.tag + ">"
+
+
+
+class  DocChapter:
+
+    def  __init__( self, block ):
+        self.block    = block
+        self.sections = []
+        if block:
+            self.name  = block.name
+            self.title = block.get_markup_words( "title" )
+            self.order = block.get_markup_words( "sections" )
+        else:
+            self.name  = "Other"
+            self.title = string.split( "Miscellaneous" )
+            self.order = []
+
+
+
+class  DocSection:
+
+    def  __init__( self, name = "Other" ):
+        self.name        = name
+        self.blocks      = {}
+        self.block_names = []  # ordered block names in section
+        self.defs        = []
+        self.abstract    = ""
+        self.description = ""
+        self.order       = []
+        self.title       = "ERROR"
+        self.chapter     = None
+
+    def  add_def( self, block ):
+        self.defs.append( block )
+
+    def  add_block( self, block ):
+        self.block_names.append( block.name )
+        self.blocks[block.name] = block
+
+    def  process( self ):
+        # look up one block that contains a valid section description
+        for block in self.defs:
+            title = block.get_markup_text( "title" )
+            if title:
+                self.title       = title
+                self.abstract    = block.get_markup_words( "abstract" )
+                self.description = block.get_markup_items( "description" )
+                self.order       = block.get_markup_words( "order" )
+                return
+
+    def  reorder( self ):
+        self.block_names = sort_order_list( self.block_names, self.order )
+
+
+
+class  ContentProcessor:
+
+    def  __init__( self ):
+        """initialize a block content processor"""
+        self.reset()
+
+        self.sections = {}    # dictionary of documentation sections
+        self.section  = None  # current documentation section
+
+        self.chapters = []    # list of chapters
+
+        self.headers  = {}    # dictionary of header macros
+
+    def  set_section( self, section_name ):
+        """set current section during parsing"""
+        if not self.sections.has_key( section_name ):
+            section = DocSection( section_name )
+            self.sections[section_name] = section
+            self.section                = section
+        else:
+            self.section = self.sections[section_name]
+
+    def  add_chapter( self, block ):
+        chapter = DocChapter( block )
+        self.chapters.append( chapter )
+
+
+    def  reset( self ):
+        """reset the content processor for a new block"""
+        self.markups      = []
+        self.markup       = None
+        self.markup_lines = []
+
+    def  add_markup( self ):
+        """add a new markup section"""
+        if self.markup and self.markup_lines:
+
+            # get rid of last line of markup if it's empty
+            marks = self.markup_lines
+            if len( marks ) > 0 and not string.strip( marks[-1] ):
+                self.markup_lines = marks[:-1]
+
+            m = DocMarkup( self.markup, self.markup_lines )
+
+            self.markups.append( m )
+
+            self.markup       = None
+            self.markup_lines = []
+
+    def  process_content( self, content ):
+        """process a block content and return a list of DocMarkup objects
+           corresponding to it"""
+        markup       = None
+        markup_lines = []
+        first        = 1
+
+        for line in content:
+            found = None
+            for t in re_markup_tags:
+                m = t.match( line )
+                if m:
+                    found  = string.lower( m.group( 1 ) )
+                    prefix = len( m.group( 0 ) )
+                    line   = " " * prefix + line[prefix:]   # remove markup from line
+                    break
+
+            # is it the start of a new markup section ?
+            if found:
+                first = 0
+                self.add_markup()  # add current markup content
+                self.markup = found
+                if len( string.strip( line ) ) > 0:
+                    self.markup_lines.append( line )
+            elif first == 0:
+                self.markup_lines.append( line )
+
+        self.add_markup()
+
+        return self.markups
+
+    def  parse_sources( self, source_processor ):
+        blocks = source_processor.blocks
+        count  = len( blocks )
+
+        for n in range( count ):
+            source = blocks[n]
+            if source.content:
+                # this is a documentation comment, we need to catch
+                # all following normal blocks in the "follow" list
+                #
+                follow = []
+                m = n + 1
+                while m < count and not blocks[m].content:
+                    follow.append( blocks[m] )
+                    m = m + 1
+
+                doc_block = DocBlock( source, follow, self )
+
+    def  finish( self ):
+        # process all sections to extract their abstract, description
+        # and ordered list of items
+        #
+        for sec in self.sections.values():
+            sec.process()
+
+        # process chapters to check that all sections are correctly
+        # listed there
+        for chap in self.chapters:
+            for sec in chap.order:
+                if self.sections.has_key( sec ):
+                    section = self.sections[sec]
+                    section.chapter = chap
+                    section.reorder()
+                    chap.sections.append( section )
+                else:
+                    sys.stderr.write( "WARNING: chapter '" +          \
+                        chap.name + "' in " + chap.block.location() + \
+                        " lists unknown section '" + sec + "'\n" )
+
+        # check that all sections are in a chapter
+        #
+        others = []
+        for sec in self.sections.values():
+            if not sec.chapter:
+                others.append( sec )
+
+        # create a new special chapter for all remaining sections
+        # when necessary
+        #
+        if others:
+            chap = DocChapter( None )
+            chap.sections = others
+            self.chapters.append( chap )
+
+
+
+class  DocBlock:
+
+    def  __init__( self, source, follow, processor ):
+        processor.reset()
+
+        self.source  = source
+        self.code    = []
+        self.type    = "ERRTYPE"
+        self.name    = "ERRNAME"
+        self.section = processor.section
+        self.markups = processor.process_content( source.content )
+
+        # compute block type from first markup tag
+        try:
+            self.type = self.markups[0].tag
+        except:
+            pass
+
+        # compute block name from first markup paragraph
+        try:
+            markup = self.markups[0]
+            para   = markup.fields[0].items[0]
+            name   = para.words[0]
+            m = re_identifier.match( name )
+            if m:
+                name = m.group( 1 )
+            self.name = name
+        except:
+            pass
+
+        if self.type == "section":
+            # detect new section starts
+            processor.set_section( self.name )
+            processor.section.add_def( self )
+        elif self.type == "chapter":
+            # detect new chapter
+            processor.add_chapter( self )
+        else:
+            processor.section.add_block( self )
+
+        # now, compute the source lines relevant to this documentation
+        # block. We keep normal comments in for obvious reasons (??)
+        source = []
+        for b in follow:
+            if b.format:
+                break
+            for l in b.lines:
+                # collect header macro definitions
+                m = re_header_macro.match( l )
+                if m:
+                    processor.headers[m.group( 2 )] = m.group( 1 );
+
+                # we use "/* */" as a separator
+                if re_source_sep.match( l ):
+                    break
+                source.append( l )
+
+        # now strip the leading and trailing empty lines from the sources
+        start = 0
+        end   = len( source ) - 1
+
+        while start < end and not string.strip( source[start] ):
+            start = start + 1
+
+        while start < end and not string.strip( source[end] ):
+            end = end - 1
+
+        if start == end and not string.strip( source[start] ):
+            self.code = []
+        else:
+            self.code = source[start:end + 1]
+
+    def  location( self ):
+        return self.source.location()
+
+    def  get_markup( self, tag_name ):
+        """return the DocMarkup corresponding to a given tag in a block"""
+        for m in self.markups:
+            if m.tag == string.lower( tag_name ):
+                return m
+        return None
+
+    def  get_markup_name( self, tag_name ):
+        """return the name of a given primary markup in a block"""
+        try:
+            m = self.get_markup( tag_name )
+            return m.get_name()
+        except:
+            return None
+
+    def  get_markup_words( self, tag_name ):
+        try:
+            m = self.get_markup( tag_name )
+            return m.fields[0].items[0].words
+        except:
+            return []
+
+    def  get_markup_text( self, tag_name ):
+        result = self.get_markup_words( tag_name )
+        return string.join( result )
+
+    def  get_markup_items( self, tag_name ):
+        try:
+            m = self.get_markup( tag_name )
+            return m.fields[0].items
+        except:
+            return None
+
+# eof
diff --git a/src/tools/docmaker/docbeauty.py b/src/tools/docmaker/docbeauty.py
new file mode 100644 (file)
index 0000000..3ddf4a9
--- /dev/null
@@ -0,0 +1,113 @@
+#!/usr/bin/env python
+#
+#  DocBeauty (c) 2003, 2004, 2008 David Turner <david@freetype.org>
+#
+# This program is used to beautify the documentation comments used
+# in the FreeType 2 public headers.
+#
+
+from sources import *
+from content import *
+from utils   import *
+
+import utils
+
+import sys, os, time, string, getopt
+
+
+content_processor = ContentProcessor()
+
+
+def  beautify_block( block ):
+    if block.content:
+        content_processor.reset()
+
+        markups = content_processor.process_content( block.content )
+        text    = []
+        first   = 1
+
+        for markup in markups:
+            text.extend( markup.beautify( first ) )
+            first = 0
+
+        # now beautify the documentation "borders" themselves
+        lines = [" /*************************************************************************"]
+        for l in text:
+            lines.append( "  *" + l )
+        lines.append( "  */" )
+
+        block.lines = lines
+
+
+def  usage():
+    print "\nDocBeauty 0.1 Usage information\n"
+    print "  docbeauty [options] file1 [file2 ...]\n"
+    print "using the following options:\n"
+    print "  -h : print this page"
+    print "  -b : backup original files with the 'orig' extension"
+    print ""
+    print "  --backup : same as -b"
+
+
+def  main( argv ):
+    """main program loop"""
+
+    global output_dir
+
+    try:
+        opts, args = getopt.getopt( sys.argv[1:], \
+                                    "hb",         \
+                                    ["help", "backup"] )
+    except getopt.GetoptError:
+        usage()
+        sys.exit( 2 )
+
+    if args == []:
+        usage()
+        sys.exit( 1 )
+
+    # process options
+    #
+    output_dir = None
+    do_backup  = None
+
+    for opt in opts:
+        if opt[0] in ( "-h", "--help" ):
+            usage()
+            sys.exit( 0 )
+
+        if opt[0] in ( "-b", "--backup" ):
+            do_backup = 1
+
+    # create context and processor
+    source_processor = SourceProcessor()
+
+    # retrieve the list of files to process
+    file_list = make_file_list( args )
+    for filename in file_list:
+        source_processor.parse_file( filename )
+
+        for block in source_processor.blocks:
+            beautify_block( block )
+
+        new_name = filename + ".new"
+        ok       = None
+
+        try:
+            file = open( new_name, "wt" )
+            for block in source_processor.blocks:
+                for line in block.lines:
+                    file.write( line )
+                    file.write( "\n" )
+            file.close()
+        except:
+            ok = 0
+
+
+# if called from the command line
+#
+if __name__ == '__main__':
+    main( sys.argv )
+
+
+# eof
diff --git a/src/tools/docmaker/docmaker.py b/src/tools/docmaker/docmaker.py
new file mode 100644 (file)
index 0000000..1d9de9f
--- /dev/null
@@ -0,0 +1,106 @@
+#!/usr/bin/env python
+#
+#  DocMaker (c) 2002, 2004, 2008 David Turner <david@freetype.org>
+#
+# This program is a re-write of the original DocMaker took used
+# to generate the API Reference of the FreeType font engine
+# by converting in-source comments into structured HTML.
+#
+# This new version is capable of outputting XML data, as well
+# as accepts more liberal formatting options.
+#
+# It also uses regular expression matching and substitution
+# to speed things significantly.
+#
+
+from sources   import *
+from content   import *
+from utils     import *
+from formatter import *
+from tohtml    import *
+
+import utils
+
+import sys, os, time, string, glob, getopt
+
+
+def  usage():
+    print "\nDocMaker Usage information\n"
+    print "  docmaker [options] file1 [file2 ...]\n"
+    print "using the following options:\n"
+    print "  -h : print this page"
+    print "  -t : set project title, as in '-t \"My Project\"'"
+    print "  -o : set output directory, as in '-o mydir'"
+    print "  -p : set documentation prefix, as in '-p ft2'"
+    print ""
+    print "  --title  : same as -t, as in '--title=\"My Project\"'"
+    print "  --output : same as -o, as in '--output=mydir'"
+    print "  --prefix : same as -p, as in '--prefix=ft2'"
+
+
+def  main( argv ):
+    """main program loop"""
+
+    global output_dir
+
+    try:
+        opts, args = getopt.getopt( sys.argv[1:], \
+                                    "ht:o:p:",    \
+                                    ["help", "title=", "output=", "prefix="] )
+    except getopt.GetoptError:
+        usage()
+        sys.exit( 2 )
+
+    if args == []:
+        usage()
+        sys.exit( 1 )
+
+    # process options
+    #
+    project_title  = "Project"
+    project_prefix = None
+    output_dir     = None
+
+    for opt in opts:
+        if opt[0] in ( "-h", "--help" ):
+            usage()
+            sys.exit( 0 )
+
+        if opt[0] in ( "-t", "--title" ):
+            project_title = opt[1]
+
+        if opt[0] in ( "-o", "--output" ):
+            utils.output_dir = opt[1]
+
+        if opt[0] in ( "-p", "--prefix" ):
+            project_prefix = opt[1]
+
+    check_output()
+
+    # create context and processor
+    source_processor  = SourceProcessor()
+    content_processor = ContentProcessor()
+
+    # retrieve the list of files to process
+    file_list = make_file_list( args )
+    for filename in file_list:
+        source_processor.parse_file( filename )
+        content_processor.parse_sources( source_processor )
+
+    # process sections
+    content_processor.finish()
+
+    formatter = HtmlFormatter( content_processor, project_title, project_prefix )
+
+    formatter.toc_dump()
+    formatter.index_dump()
+    formatter.section_dump_all()
+
+
+# if called from the command line
+#
+if __name__ == '__main__':
+    main( sys.argv )
+
+
+# eof
diff --git a/src/tools/docmaker/formatter.py b/src/tools/docmaker/formatter.py
new file mode 100644 (file)
index 0000000..f62ce67
--- /dev/null
@@ -0,0 +1,188 @@
+#  Formatter (c) 2002, 2004, 2007, 2008 David Turner <david@freetype.org>
+#
+
+from sources import *
+from content import *
+from utils   import *
+
+# This is the base Formatter class.  Its purpose is to convert
+# a content processor's data into specific documents (i.e., table of
+# contents, global index, and individual API reference indices).
+#
+# You need to sub-class it to output anything sensible.  For example,
+# the file tohtml.py contains the definition of the HtmlFormatter sub-class
+# used to output -- you guessed it -- HTML.
+#
+
+class  Formatter:
+
+    def  __init__( self, processor ):
+        self.processor   = processor
+        self.identifiers = {}
+        self.chapters    = processor.chapters
+        self.sections    = processor.sections.values()
+        self.block_index = []
+
+        # store all blocks in a dictionary
+        self.blocks = []
+        for section in self.sections:
+            for block in section.blocks.values():
+                self.add_identifier( block.name, block )
+
+                # add enumeration values to the index, since this is useful
+                for markup in block.markups:
+                    if markup.tag == 'values':
+                        for field in markup.fields:
+                            self.add_identifier( field.name, block )
+
+        self.block_index = self.identifiers.keys()
+        self.block_index.sort( index_sort )
+
+    def  add_identifier( self, name, block ):
+        if self.identifiers.has_key( name ):
+            # duplicate name!
+            sys.stderr.write(                                           \
+               "WARNING: duplicate definition for '" + name + "' in " + \
+               block.location() + ", previous definition in " +         \
+               self.identifiers[name].location() + "\n" )
+        else:
+            self.identifiers[name] = block
+
+    #
+    #  Formatting the table of contents
+    #
+    def  toc_enter( self ):
+        pass
+
+    def  toc_chapter_enter( self, chapter ):
+        pass
+
+    def  toc_section_enter( self, section ):
+        pass
+
+    def  toc_section_exit( self, section ):
+        pass
+
+    def  toc_chapter_exit( self, chapter ):
+        pass
+
+    def  toc_index( self, index_filename ):
+        pass
+
+    def  toc_exit( self ):
+        pass
+
+    def  toc_dump( self, toc_filename = None, index_filename = None ):
+        output = None
+        if toc_filename:
+            output = open_output( toc_filename )
+
+        self.toc_enter()
+
+        for chap in self.processor.chapters:
+
+            self.toc_chapter_enter( chap )
+
+            for section in chap.sections:
+                self.toc_section_enter( section )
+                self.toc_section_exit( section )
+
+            self.toc_chapter_exit( chap )
+
+        self.toc_index( index_filename )
+
+        self.toc_exit()
+
+        if output:
+            close_output( output )
+
+    #
+    #  Formatting the index
+    #
+    def  index_enter( self ):
+        pass
+
+    def  index_name_enter( self, name ):
+        pass
+
+    def  index_name_exit( self, name ):
+        pass
+
+    def  index_exit( self ):
+        pass
+
+    def  index_dump( self, index_filename = None ):
+        output = None
+        if index_filename:
+            output = open_output( index_filename )
+
+        self.index_enter()
+
+        for name in self.block_index:
+            self.index_name_enter( name )
+            self.index_name_exit( name )
+
+        self.index_exit()
+
+        if output:
+            close_output( output )
+
+    #
+    #  Formatting a section
+    #
+    def  section_enter( self, section ):
+        pass
+
+    def  block_enter( self, block ):
+        pass
+
+    def  markup_enter( self, markup, block = None ):
+        pass
+
+    def  field_enter( self, field, markup = None, block = None ):
+        pass
+
+    def  field_exit( self, field, markup = None, block = None ):
+        pass
+
+    def  markup_exit( self, markup, block = None ):
+        pass
+
+    def  block_exit( self, block ):
+        pass
+
+    def  section_exit( self, section ):
+        pass
+
+    def  section_dump( self, section, section_filename = None ):
+        output = None
+        if section_filename:
+            output = open_output( section_filename )
+
+        self.section_enter( section )
+
+        for name in section.block_names:
+            block = self.identifiers[name]
+            self.block_enter( block )
+
+            for markup in block.markups[1:]:   # always ignore first markup!
+                self.markup_enter( markup, block )
+
+                for field in markup.fields:
+                    self.field_enter( field, markup, block )
+                    self.field_exit( field, markup, block )
+
+                self.markup_exit( markup, block )
+
+            self.block_exit( block )
+
+        self.section_exit( section )
+
+        if output:
+            close_output( output )
+
+    def  section_dump_all( self ):
+        for section in self.sections:
+            self.section_dump( section )
+
+# eof
diff --git a/src/tools/docmaker/sources.py b/src/tools/docmaker/sources.py
new file mode 100644 (file)
index 0000000..7b68c07
--- /dev/null
@@ -0,0 +1,347 @@
+#  Sources (c) 2002, 2003, 2004, 2006, 2007, 2008, 2009
+#    David Turner <david@freetype.org>
+#
+#
+# this file contains definitions of classes needed to decompose
+# C sources files into a series of multi-line "blocks". There are
+# two kinds of blocks:
+#
+#   - normal blocks, which contain source code or ordinary comments
+#
+#   - documentation blocks, which have restricted formatting, and
+#     whose text always start with a documentation markup tag like
+#     "<Function>", "<Type>", etc..
+#
+# the routines used to process the content of documentation blocks
+# are not contained here, but in "content.py"
+#
+# the classes and methods found here only deal with text parsing
+# and basic documentation block extraction
+#
+
+import fileinput, re, sys, os, string
+
+
+
+################################################################
+##
+##  BLOCK FORMAT PATTERN
+##
+##   A simple class containing compiled regular expressions used
+##   to detect potential documentation format block comments within
+##   C source code
+##
+##   note that the 'column' pattern must contain a group that will
+##   be used to "unbox" the content of documentation comment blocks
+##
+class  SourceBlockFormat:
+
+    def  __init__( self, id, start, column, end ):
+        """create a block pattern, used to recognize special documentation blocks"""
+        self.id     = id
+        self.start  = re.compile( start, re.VERBOSE )
+        self.column = re.compile( column, re.VERBOSE )
+        self.end    = re.compile( end, re.VERBOSE )
+
+
+
+#
+# format 1 documentation comment blocks look like the following:
+#
+#    /************************************/
+#    /*                                  */
+#    /*                                  */
+#    /*                                  */
+#    /************************************/
+#
+# we define a few regular expressions here to detect them
+#
+
+start = r'''
+  \s*      # any number of whitespace
+  /\*{2,}/ # followed by '/' and at least two asterisks then '/'
+  \s*$     # probably followed by whitespace
+'''
+
+column = r'''
+  \s*      # any number of whitespace
+  /\*{1}   # followed by '/' and precisely one asterisk
+  ([^*].*) # followed by anything (group 1)
+  \*{1}/   # followed by one asterisk and a '/'
+  \s*$     # probably followed by whitespace
+'''
+
+re_source_block_format1 = SourceBlockFormat( 1, start, column, start )
+
+
+#
+# format 2 documentation comment blocks look like the following:
+#
+#    /************************************ (at least 2 asterisks)
+#     *
+#     *
+#     *
+#     *
+#     **/       (1 or more asterisks at the end)
+#
+# we define a few regular expressions here to detect them
+#
+start = r'''
+  \s*     # any number of whitespace
+  /\*{2,} # followed by '/' and at least two asterisks
+  \s*$    # probably followed by whitespace
+'''
+
+column = r'''
+  \s*        # any number of whitespace
+  \*{1}(?!/) # followed by precisely one asterisk not followed by `/'
+  (.*)       # then anything (group1)
+'''
+
+end = r'''
+  \s*  # any number of whitespace
+  \*+/ # followed by at least one asterisk, then '/'
+'''
+
+re_source_block_format2 = SourceBlockFormat( 2, start, column, end )
+
+
+#
+# the list of supported documentation block formats, we could add new ones
+# relatively easily
+#
+re_source_block_formats = [re_source_block_format1, re_source_block_format2]
+
+
+#
+# the following regular expressions corresponds to markup tags
+# within the documentation comment blocks. they're equivalent
+# despite their different syntax
+#
+# notice how each markup tag _must_ begin a new line
+#
+re_markup_tag1 = re.compile( r'''\s*<(\w*)>''' )  # <xxxx> format
+re_markup_tag2 = re.compile( r'''\s*@(\w*):''' )  # @xxxx: format
+
+#
+# the list of supported markup tags, we could add new ones relatively
+# easily
+#
+re_markup_tags = [re_markup_tag1, re_markup_tag2]
+
+#
+# used to detect a cross-reference, after markup tags have been stripped
+#
+re_crossref = re.compile( r'@(\w*)(.*)' )
+
+#
+# used to detect italic and bold styles in paragraph text
+#
+re_italic = re.compile( r"_(\w(\w|')*)_(.*)" )     #  _italic_
+re_bold   = re.compile( r"\*(\w(\w|')*)\*(.*)" )   #  *bold*
+
+#
+# used to detect the end of commented source lines
+#
+re_source_sep = re.compile( r'\s*/\*\s*\*/' )
+
+#
+# used to perform cross-reference within source output
+#
+re_source_crossref = re.compile( r'(\W*)(\w*)' )
+
+#
+# a list of reserved source keywords
+#
+re_source_keywords = re.compile( '''\\b ( typedef   |
+                                          struct    |
+                                          enum      |
+                                          union     |
+                                          const     |
+                                          char      |
+                                          int       |
+                                          short     |
+                                          long      |
+                                          void      |
+                                          signed    |
+                                          unsigned  |
+                                          \#include |
+                                          \#define  |
+                                          \#undef   |
+                                          \#if      |
+                                          \#ifdef   |
+                                          \#ifndef  |
+                                          \#else    |
+                                          \#endif   ) \\b''', re.VERBOSE )
+
+
+################################################################
+##
+##  SOURCE BLOCK CLASS
+##
+##   A SourceProcessor is in charge of reading a C source file
+##   and decomposing it into a series of different "SourceBlocks".
+##   each one of these blocks can be made of the following data:
+##
+##   - A documentation comment block that starts with "/**" and
+##     whose exact format will be discussed later
+##
+##   - normal sources lines, including comments
+##
+##   the important fields in a text block are the following ones:
+##
+##     self.lines   : a list of text lines for the corresponding block
+##
+##     self.content : for documentation comment blocks only, this is the
+##                    block content that has been "unboxed" from its
+##                    decoration. This is None for all other blocks
+##                    (i.e. sources or ordinary comments with no starting
+##                     markup tag)
+##
+class  SourceBlock:
+
+    def  __init__( self, processor, filename, lineno, lines ):
+        self.processor = processor
+        self.filename  = filename
+        self.lineno    = lineno
+        self.lines     = lines[:]
+        self.format    = processor.format
+        self.content   = []
+
+        if self.format == None:
+            return
+
+        words = []
+
+        # extract comment lines
+        lines = []
+
+        for line0 in self.lines:
+            m = self.format.column.match( line0 )
+            if m:
+                lines.append( m.group( 1 ) )
+
+        # now, look for a markup tag
+        for l in lines:
+            l = string.strip( l )
+            if len( l ) > 0:
+                for tag in re_markup_tags:
+                    if tag.match( l ):
+                        self.content = lines
+                        return
+
+    def  location( self ):
+        return "(" + self.filename + ":" + repr( self.lineno ) + ")"
+
+    # debugging only - not used in normal operations
+    def  dump( self ):
+        if self.content:
+            print "{{{content start---"
+            for l in self.content:
+                print l
+            print "---content end}}}"
+            return
+
+        fmt = ""
+        if self.format:
+            fmt = repr( self.format.id ) + " "
+
+        for line in self.lines:
+            print line
+
+
+
+################################################################
+##
+##  SOURCE PROCESSOR CLASS
+##
+##   The SourceProcessor is in charge of reading a C source file
+##   and decomposing it into a series of different "SourceBlock"
+##   objects.
+##
+##   each one of these blocks can be made of the following data:
+##
+##   - A documentation comment block that starts with "/**" and
+##     whose exact format will be discussed later
+##
+##   - normal sources lines, include comments
+##
+##
+class  SourceProcessor:
+
+    def  __init__( self ):
+        """initialize a source processor"""
+        self.blocks   = []
+        self.filename = None
+        self.format   = None
+        self.lines    = []
+
+    def  reset( self ):
+        """reset a block processor, clean all its blocks"""
+        self.blocks = []
+        self.format = None
+
+    def  parse_file( self, filename ):
+        """parse a C source file, and add its blocks to the processor's list"""
+        self.reset()
+
+        self.filename = filename
+
+        fileinput.close()
+        self.format = None
+        self.lineno = 0
+        self.lines  = []
+
+        for line in fileinput.input( filename ):
+            # strip trailing newlines, important on Windows machines!
+            if line[-1] == '\012':
+                line = line[0:-1]
+
+            if self.format == None:
+                self.process_normal_line( line )
+            else:
+                if self.format.end.match( line ):
+                    # that's a normal block end, add it to 'lines' and
+                    # create a new block
+                    self.lines.append( line )
+                    self.add_block_lines()
+                elif self.format.column.match( line ):
+                    # that's a normal column line, add it to 'lines'
+                    self.lines.append( line )
+                else:
+                    # humm.. this is an unexpected block end,
+                    # create a new block, but don't process the line
+                    self.add_block_lines()
+
+                    # we need to process the line again
+                    self.process_normal_line( line )
+
+        # record the last lines
+        self.add_block_lines()
+
+    def  process_normal_line( self, line ):
+        """process a normal line and check whether it is the start of a new block"""
+        for f in re_source_block_formats:
+            if f.start.match( line ):
+                self.add_block_lines()
+                self.format = f
+                self.lineno = fileinput.filelineno()
+
+        self.lines.append( line )
+
+    def  add_block_lines( self ):
+        """add the current accumulated lines and create a new block"""
+        if self.lines != []:
+            block = SourceBlock( self, self.filename, self.lineno, self.lines )
+
+            self.blocks.append( block )
+            self.format = None
+            self.lines  = []
+
+    # debugging only, not used in normal operations
+    def  dump( self ):
+        """print all blocks in a processor"""
+        for b in self.blocks:
+            b.dump()
+
+# eof
diff --git a/src/tools/docmaker/tohtml.py b/src/tools/docmaker/tohtml.py
new file mode 100644 (file)
index 0000000..fffa120
--- /dev/null
@@ -0,0 +1,593 @@
+#  ToHTML (c) 2002, 2003, 2005, 2006, 2007, 2008
+#    David Turner <david@freetype.org>
+
+from sources import *
+from content import *
+from formatter import *
+
+import time
+
+
+# The following defines the HTML header used by all generated pages.
+html_header_1 = """\
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+"http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>\
+"""
+
+html_header_2 = """\
+ API Reference</title>
+<style type="text/css">
+  body { font-family: Verdana, Geneva, Arial, Helvetica, serif;
+         color: #000000;
+         background: #FFFFFF; }
+
+  p { text-align: justify; }
+  h1 { text-align: center; }
+  li { text-align: justify; }
+  td { padding: 0 0.5em 0 0.5em; }
+  td.left { padding: 0 0.5em 0 0.5em;
+            text-align: left; }
+
+  a:link { color: #0000EF; }
+  a:visited { color: #51188E; }
+  a:hover { color: #FF0000; }
+
+  span.keyword { font-family: monospace;
+                 text-align: left;
+                 white-space: pre;
+                 color: darkblue; }
+
+  pre.colored { color: blue; }
+
+  ul.empty { list-style-type: none; }
+</style>
+</head>
+<body>
+"""
+
+html_header_3 = """
+<table align=center><tr><td><font size=-1>[<a href="\
+"""
+
+html_header_3i = """
+<table align=center><tr><td width="100%"></td>
+<td><font size=-1>[<a href="\
+"""
+
+html_header_4 = """\
+">Index</a>]</font></td>
+<td width="100%"></td>
+<td><font size=-1>[<a href="\
+"""
+
+html_header_5 = """\
+">TOC</a>]</font></td></tr></table>
+<center><h1>\
+"""
+
+html_header_5t = """\
+">Index</a>]</font></td>
+<td width="100%"></td></tr></table>
+<center><h1>\
+"""
+
+html_header_6 = """\
+ API Reference</h1></center>
+"""
+
+
+# The HTML footer used by all generated pages.
+html_footer = """\
+</body>
+</html>\
+"""
+
+# The header and footer used for each section.
+section_title_header = "<center><h1>"
+section_title_footer = "</h1></center>"
+
+# The header and footer used for code segments.
+code_header = '<pre class="colored">'
+code_footer = '</pre>'
+
+# Paragraph header and footer.
+para_header = "<p>"
+para_footer = "</p>"
+
+# Block header and footer.
+block_header        = '<table align=center width="75%"><tr><td>'
+block_footer_start  = """\
+</td></tr></table>
+<hr width="75%">
+<table align=center width="75%"><tr><td><font size=-2>[<a href="\
+"""
+block_footer_middle = """\
+">Index</a>]</font></td>
+<td width="100%"></td>
+<td><font size=-2>[<a href="\
+"""
+block_footer_end    = """\
+">TOC</a>]</font></td></tr></table>
+"""
+
+# Description header/footer.
+description_header = '<table align=center width="87%"><tr><td>'
+description_footer = "</td></tr></table><br>"
+
+# Marker header/inter/footer combination.
+marker_header = '<table align=center width="87%" cellpadding=5><tr bgcolor="#EEEEFF"><td><em><b>'
+marker_inter  = "</b></em></td></tr><tr><td>"
+marker_footer = "</td></tr></table>"
+
+# Header location header/footer.
+header_location_header = '<table align=center width="87%"><tr><td>'
+header_location_footer = "</td></tr></table><br>"
+
+# Source code extracts header/footer.
+source_header = '<table align=center width="87%"><tr bgcolor="#D6E8FF"><td><pre>\n'
+source_footer = "\n</pre></table><br>"
+
+# Chapter header/inter/footer.
+chapter_header = '<br><table align=center width="75%"><tr><td><h2>'
+chapter_inter  = '</h2><ul class="empty"><li>'
+chapter_footer = '</li></ul></td></tr></table>'
+
+# Index footer.
+index_footer_start = """\
+<hr>
+<table><tr><td width="100%"></td>
+<td><font size=-2>[<a href="\
+"""
+index_footer_end = """\
+">TOC</a>]</font></td></tr></table>
+"""
+
+# TOC footer.
+toc_footer_start = """\
+<hr>
+<table><tr><td><font size=-2>[<a href="\
+"""
+toc_footer_end = """\
+">Index</a>]</font></td>
+<td width="100%"></td>
+</tr></table>
+"""
+
+
+# source language keyword coloration/styling
+keyword_prefix = '<span class="keyword">'
+keyword_suffix = '</span>'
+
+section_synopsis_header = '<h2>Synopsis</h2>'
+section_synopsis_footer = ''
+
+
+# Translate a single line of source to HTML.  This will convert
+# a "<" into "&lt.", ">" into "&gt.", etc.
+def  html_quote( line ):
+    result = string.replace( line, "&", "&amp;" )
+    result = string.replace( result, "<", "&lt;" )
+    result = string.replace( result, ">", "&gt;" )
+    return result
+
+
+# same as 'html_quote', but ignores left and right brackets
+def  html_quote0( line ):
+    return string.replace( line, "&", "&amp;" )
+
+
+def  dump_html_code( lines, prefix = "" ):
+    # clean the last empty lines
+    l = len( self.lines )
+    while l > 0 and string.strip( self.lines[l - 1] ) == "":
+        l = l - 1
+
+    # The code footer should be directly appended to the last code
+    # line to avoid an additional blank line.
+    print prefix + code_header,
+    for line in self.lines[0 : l + 1]:
+        print '\n' + prefix + html_quote( line ),
+    print prefix + code_footer,
+
+
+
+class  HtmlFormatter( Formatter ):
+
+    def  __init__( self, processor, project_title, file_prefix ):
+        Formatter.__init__( self, processor )
+
+        global html_header_1, html_header_2, html_header_3
+        global html_header_4, html_header_5, html_footer
+
+        if file_prefix:
+            file_prefix = file_prefix + "-"
+        else:
+            file_prefix = ""
+
+        self.headers           = processor.headers
+        self.project_title     = project_title
+        self.file_prefix       = file_prefix
+        self.html_header       = html_header_1 + project_title +              \
+                                 html_header_2 +                              \
+                                 html_header_3 + file_prefix + "index.html" + \
+                                 html_header_4 + file_prefix + "toc.html" +   \
+                                 html_header_5 + project_title +              \
+                                 html_header_6
+
+        self.html_index_header = html_header_1 + project_title +             \
+                                 html_header_2 +                             \
+                                 html_header_3i + file_prefix + "toc.html" + \
+                                 html_header_5 + project_title +             \
+                                 html_header_6
+
+        self.html_toc_header   = html_header_1 + project_title +              \
+                                 html_header_2 +                              \
+                                 html_header_3 + file_prefix + "index.html" + \
+                                 html_header_5t + project_title +             \
+                                 html_header_6
+
+        self.html_footer       = "<center><font size=""-2"">generated on " +     \
+                                 time.asctime( time.localtime( time.time() ) ) + \
+                                 "</font></center>" + html_footer
+
+        self.columns = 3
+
+    def  make_section_url( self, section ):
+        return self.file_prefix + section.name + ".html"
+
+    def  make_block_url( self, block ):
+        return self.make_section_url( block.section ) + "#" + block.name
+
+    def  make_html_words( self, words ):
+        """ convert a series of simple words into some HTML text """
+        line = ""
+        if words:
+            line = html_quote( words[0] )
+            for w in words[1:]:
+                line = line + " " + html_quote( w )
+
+        return line
+
+    def  make_html_word( self, word ):
+        """analyze a simple word to detect cross-references and styling"""
+        # look for cross-references
+        m = re_crossref.match( word )
+        if m:
+            try:
+                name = m.group( 1 )
+                rest = m.group( 2 )
+                block = self.identifiers[name]
+                url   = self.make_block_url( block )
+                return '<a href="' + url + '">' + name + '</a>' + rest
+            except:
+                # we detected a cross-reference to an unknown item
+                sys.stderr.write( \
+                   "WARNING: undefined cross reference '" + name + "'.\n" )
+                return '?' + name + '?' + rest
+
+        # look for italics and bolds
+        m = re_italic.match( word )
+        if m:
+            name = m.group( 1 )
+            rest = m.group( 3 )
+            return '<i>' + name + '</i>' + rest
+
+        m = re_bold.match( word )
+        if m:
+            name = m.group( 1 )
+            rest = m.group( 3 )
+            return '<b>' + name + '</b>' + rest
+
+        return html_quote( word )
+
+    def  make_html_para( self, words ):
+        """ convert words of a paragraph into tagged HTML text, handle xrefs """
+        line = ""
+        if words:
+            line = self.make_html_word( words[0] )
+            for word in words[1:]:
+                line = line + " " + self.make_html_word( word )
+            # convert `...' quotations into real left and right single quotes
+            line = re.sub( r"(^|\W)`(.*?)'(\W|$)",  \
+                           r'\1&lsquo;\2&rsquo;\3', \
+                           line )
+            # convert tilde into non-breakable space
+            line = string.replace( line, "~", "&nbsp;" )
+
+        return para_header + line + para_footer
+
+    def  make_html_code( self, lines ):
+        """ convert a code sequence to HTML """
+        line = code_header + '\n'
+        for l in lines:
+            line = line + html_quote( l ) + '\n'
+
+        return line + code_footer
+
+    def  make_html_items( self, items ):
+        """ convert a field's content into some valid HTML """
+        lines = []
+        for item in items:
+            if item.lines:
+                lines.append( self.make_html_code( item.lines ) )
+            else:
+                lines.append( self.make_html_para( item.words ) )
+
+        return string.join( lines, '\n' )
+
+    def  print_html_items( self, items ):
+        print self.make_html_items( items )
+
+    def  print_html_field( self, field ):
+        if field.name:
+            print "<table><tr valign=top><td><b>" + field.name + "</b></td><td>"
+
+        print self.make_html_items( field.items )
+
+        if field.name:
+            print "</td></tr></table>"
+
+    def  html_source_quote( self, line, block_name = None ):
+        result = ""
+        while line:
+            m = re_source_crossref.match( line )
+            if m:
+                name   = m.group( 2 )
+                prefix = html_quote( m.group( 1 ) )
+                length = len( m.group( 0 ) )
+
+                if name == block_name:
+                    # this is the current block name, if any
+                    result = result + prefix + '<b>' + name + '</b>'
+                elif re_source_keywords.match( name ):
+                    # this is a C keyword
+                    result = result + prefix + keyword_prefix + name + keyword_suffix
+                elif self.identifiers.has_key( name ):
+                    # this is a known identifier
+                    block = self.identifiers[name]
+                    result = result + prefix + '<a href="' + \
+                             self.make_block_url( block ) + '">' + name + '</a>'
+                else:
+                    result = result + html_quote( line[:length] )
+
+                line = line[length:]
+            else:
+                result = result + html_quote( line )
+                line   = []
+
+        return result
+
+    def  print_html_field_list( self, fields ):
+        print "<p></p>"
+        print "<table cellpadding=3 border=0>"
+        for field in fields:
+            if len( field.name ) > 22:
+              print "<tr valign=top><td colspan=0><b>" + field.name + "</b></td></tr>"
+              print "<tr valign=top><td></td><td>"
+            else:
+              print "<tr valign=top><td><b>" + field.name + "</b></td><td>"
+
+            self.print_html_items( field.items )
+            print "</td></tr>"
+        print "</table>"
+
+    def  print_html_markup( self, markup ):
+        table_fields = []
+        for field in markup.fields:
+            if field.name:
+                # we begin a new series of field or value definitions, we
+                # will record them in the 'table_fields' list before outputting
+                # all of them as a single table
+                #
+                table_fields.append( field )
+            else:
+                if table_fields:
+                    self.print_html_field_list( table_fields )
+                    table_fields = []
+
+                self.print_html_items( field.items )
+
+        if table_fields:
+            self.print_html_field_list( table_fields )
+
+    #
+    #  Formatting the index
+    #
+    def  index_enter( self ):
+        print self.html_index_header
+        self.index_items = {}
+
+    def  index_name_enter( self, name ):
+        block = self.identifiers[name]
+        url   = self.make_block_url( block )
+        self.index_items[name] = url
+
+    def  index_exit( self ):
+        # block_index already contains the sorted list of index names
+        count = len( self.block_index )
+        rows  = ( count + self.columns - 1 ) / self.columns
+
+        print "<table align=center border=0 cellpadding=0 cellspacing=0>"
+        for r in range( rows ):
+            line = "<tr>"
+            for c in range( self.columns ):
+                i = r + c * rows
+                if i < count:
+                    bname = self.block_index[r + c * rows]
+                    url   = self.index_items[bname]
+                    line = line + '<td><a href="' + url + '">' + bname + '</a></td>'
+                else:
+                    line = line + '<td></td>'
+            line = line + "</tr>"
+            print line
+
+        print "</table>"
+
+        print index_footer_start +            \
+              self.file_prefix + "toc.html" + \
+              index_footer_end
+
+        print self.html_footer
+
+        self.index_items = {}
+
+    def  index_dump( self, index_filename = None ):
+        if index_filename == None:
+            index_filename = self.file_prefix + "index.html"
+
+        Formatter.index_dump( self, index_filename )
+
+    #
+    #  Formatting the table of content
+    #
+    def  toc_enter( self ):
+        print self.html_toc_header
+        print "<center><h1>Table of Contents</h1></center>"
+
+    def  toc_chapter_enter( self, chapter ):
+        print  chapter_header + string.join( chapter.title ) + chapter_inter
+        print "<table cellpadding=5>"
+
+    def  toc_section_enter( self, section ):
+        print '<tr valign=top><td class="left">'
+        print '<a href="' + self.make_section_url( section ) + '">' + \
+               section.title + '</a></td><td>'
+
+        print self.make_html_para( section.abstract )
+
+    def  toc_section_exit( self, section ):
+        print "</td></tr>"
+
+    def  toc_chapter_exit( self, chapter ):
+        print "</table>"
+        print chapter_footer
+
+    def  toc_index( self, index_filename ):
+        print chapter_header +                                      \
+              '<a href="' + index_filename + '">Global Index</a>' + \
+              chapter_inter + chapter_footer
+
+    def  toc_exit( self ):
+        print toc_footer_start +                \
+              self.file_prefix + "index.html" + \
+              toc_footer_end
+
+        print self.html_footer
+
+    def  toc_dump( self, toc_filename = None, index_filename = None ):
+        if toc_filename == None:
+            toc_filename = self.file_prefix + "toc.html"
+
+        if index_filename == None:
+            index_filename = self.file_prefix + "index.html"
+
+        Formatter.toc_dump( self, toc_filename, index_filename )
+
+    #
+    #  Formatting sections
+    #
+    def  section_enter( self, section ):
+        print self.html_header
+
+        print section_title_header
+        print section.title
+        print section_title_footer
+
+        maxwidth = 0
+        for b in section.blocks.values():
+            if len( b.name ) > maxwidth:
+                maxwidth = len( b.name )
+
+        width = 70  # XXX magic number
+        if maxwidth <> 0:
+            # print section synopsis
+            print section_synopsis_header
+            print "<table align=center cellspacing=5 cellpadding=0 border=0>"
+
+            columns = width / maxwidth
+            if columns < 1:
+                columns = 1
+
+            count = len( section.block_names )
+            rows  = ( count + columns - 1 ) / columns
+
+            for r in range( rows ):
+                line = "<tr>"
+                for c in range( columns ):
+                    i = r + c * rows
+                    line = line + '<td></td><td>'
+                    if i < count:
+                        name = section.block_names[i]
+                        line = line + '<a href="#' + name + '">' + name + '</a>'
+
+                    line = line + '</td>'
+                line = line + "</tr>"
+                print line
+
+            print "</table><br><br>"
+            print section_synopsis_footer
+
+        print description_header
+        print self.make_html_items( section.description )
+        print description_footer
+
+    def  block_enter( self, block ):
+        print block_header
+
+        # place html anchor if needed
+        if block.name:
+            print '<h4><a name="' + block.name + '">' + block.name + '</a></h4>'
+
+        # dump the block C source lines now
+        if block.code:
+            header = ''
+            for f in self.headers.keys():
+                if block.source.filename.find( f ) >= 0:
+                    header = self.headers[f] + ' (' + f + ')'
+                    break;
+                
+#           if not header:
+#               sys.stderr.write( \
+#                 'WARNING: No header macro for ' + block.source.filename + '.\n' )
+
+            if header:
+                print header_location_header
+                print 'Defined in ' + header + '.'
+                print header_location_footer
+
+            print source_header
+            for l in block.code:
+                print self.html_source_quote( l, block.name )
+            print source_footer
+
+    def  markup_enter( self, markup, block ):
+        if markup.tag == "description":
+            print description_header
+        else:
+            print marker_header + markup.tag + marker_inter
+
+        self.print_html_markup( markup )
+
+    def  markup_exit( self, markup, block ):
+        if markup.tag == "description":
+            print description_footer
+        else:
+            print marker_footer
+
+    def  block_exit( self, block ):
+        print block_footer_start + self.file_prefix + "index.html" + \
+              block_footer_middle + self.file_prefix + "toc.html" +  \
+              block_footer_end
+
+    def  section_exit( self, section ):
+        print html_footer
+
+    def  section_dump_all( self ):
+        for section in self.sections:
+            self.section_dump( section, self.file_prefix + section.name + '.html' )
+
+# eof
diff --git a/src/tools/docmaker/utils.py b/src/tools/docmaker/utils.py
new file mode 100644 (file)
index 0000000..1d96658
--- /dev/null
@@ -0,0 +1,132 @@
+#  Utils (c) 2002, 2004, 2007, 2008  David Turner <david@freetype.org>
+#
+
+import string, sys, os, glob
+
+# current output directory
+#
+output_dir = None
+
+
+# This function is used to sort the index.  It is a simple lexicographical
+# sort, except that it places capital letters before lowercase ones.
+#
+def  index_sort( s1, s2 ):
+    if not s1:
+        return -1
+
+    if not s2:
+        return 1
+
+    l1 = len( s1 )
+    l2 = len( s2 )
+    m1 = string.lower( s1 )
+    m2 = string.lower( s2 )
+
+    for i in range( l1 ):
+        if i >= l2 or m1[i] > m2[i]:
+            return 1
+
+        if m1[i] < m2[i]:
+            return -1
+
+        if s1[i] < s2[i]:
+            return -1
+
+        if s1[i] > s2[i]:
+            return 1
+
+    if l2 > l1:
+        return -1
+
+    return 0
+
+
+# Sort input_list, placing the elements of order_list in front.
+#
+def  sort_order_list( input_list, order_list ):
+    new_list = order_list[:]
+    for id in input_list:
+        if not id in order_list:
+            new_list.append( id )
+    return new_list
+
+
+# Open the standard output to a given project documentation file.  Use
+# "output_dir" to determine the filename location if necessary and save the
+# old stdout in a tuple that is returned by this function.
+#
+def  open_output( filename ):
+    global output_dir
+
+    if output_dir and output_dir != "":
+        filename = output_dir + os.sep + filename
+
+    old_stdout = sys.stdout
+    new_file   = open( filename, "w" )
+    sys.stdout = new_file
+
+    return ( new_file, old_stdout )
+
+
+# Close the output that was returned by "close_output".
+#
+def  close_output( output ):
+    output[0].close()
+    sys.stdout = output[1]
+
+
+# Check output directory.
+#
+def  check_output():
+    global output_dir
+    if output_dir:
+        if output_dir != "":
+            if not os.path.isdir( output_dir ):
+                sys.stderr.write( "argument" + " '" + output_dir + "' " + \
+                                  "is not a valid directory" )
+                sys.exit( 2 )
+        else:
+            output_dir = None
+
+
+def  file_exists( pathname ):
+    """checks that a given file exists"""
+    result = 1
+    try:
+        file = open( pathname, "r" )
+        file.close()
+    except:
+        result = None
+        sys.stderr.write( pathname + " couldn't be accessed\n" )
+
+    return result
+
+
+def  make_file_list( args = None ):
+    """builds a list of input files from command-line arguments"""
+    file_list = []
+    # sys.stderr.write( repr( sys.argv[1 :] ) + '\n' )
+
+    if not args:
+        args = sys.argv[1 :]
+
+    for pathname in args:
+        if string.find( pathname, '*' ) >= 0:
+            newpath = glob.glob( pathname )
+            newpath.sort()  # sort files -- this is important because
+                            # of the order of files
+        else:
+            newpath = [pathname]
+
+        file_list.extend( newpath )
+
+    if len( file_list ) == 0:
+        file_list = None
+    else:
+        # now filter the file list to remove non-existing ones
+        file_list = filter( file_exists, file_list )
+
+    return file_list
+
+# eof
diff --git a/src/tools/ftrandom/Makefile b/src/tools/ftrandom/Makefile
new file mode 100644 (file)
index 0000000..2e61929
--- /dev/null
@@ -0,0 +1,35 @@
+# TOP_DIR and OBJ_DIR should be set by the user to the right directories,
+# if necessary.
+
+TOP_DIR ?= ../../..
+OBJ_DIR ?= $(TOP_DIR)/objs
+
+
+# The setup below is for gcc on a Unix-like platform.
+
+SRC_DIR = $(TOP_DIR)/src/tools/ftrandom
+
+CC = gcc
+WFLAGS = -Wmissing-prototypes \
+         -Wunused \
+         -Wimplicit \
+         -Wreturn-type \
+         -Wparentheses \
+         -pedantic \
+         -Wformat \
+         -Wchar-subscripts \
+         -Wsequence-point
+CFLAGS = $(WFLAGS) \
+         -g \
+         -I $(TOP_DIR)/include
+LIBS = -lm \
+       -L $(OBJ_DIR) \
+       -lfreetype \
+       -lz
+
+all: $(OBJ_DIR)/ftrandom
+
+$(OBJ_DIR)/ftrandom: $(SRC_DIR)/ftrandom.c $(OBJ_DIR)/libfreetype.a
+       $(CC) -o $(OBJ_DIR)/ftrandom $(CFLAGS) $(SRC_DIR)/ftrandom.c $(LIBS)
+
+# EOF
diff --git a/src/tools/ftrandom/README b/src/tools/ftrandom/README
new file mode 100644 (file)
index 0000000..c093f15
--- /dev/null
@@ -0,0 +1,48 @@
+ftrandom
+--------
+
+This program expects a set of directories containing good fonts, and a set
+of extensions of fonts to be tested.  It will randomly pick a font, copy it,
+introduce and error and then test it.
+
+The FreeType tests are quite basic:
+
+  For each erroneous font it
+    forks off a new tester;
+    initializes the library;
+    opens each font in the file;
+    loads each glyph;
+      (optionally reviewing the contours of the glyph)
+      (optionally rasterizing)
+    closes the face.
+
+If the tester exits with a signal, or takes longer than 20 seconds then
+ftrandom saves the erroneous font and continues.  If the tester exits
+normally or with an error, then the superstructure removes the test font and
+continues.
+
+Arguments are:
+
+  --all                    Test every font in the directory(ies) no matter
+                           what its extension (some CID-keyed fonts have no
+                           extension).
+  --check-outlines         Call FT_Outline_Decompose on each glyph.
+  --dir <dir>              Append <dir> to the list of directories to search
+                           for good fonts.
+  --error-count <cnt>      Introduce <cnt> single-byte errors into the
+                           erroneous fonts.
+  --error-fraction <frac>  Multiply the file size of the font by <frac> and
+                           introduce that many errors into the erroneous
+                           font file.
+  --ext <ext>              Add <ext> to the set of font types tested.  Known
+                           extensions are `ttf', `otf', `ttc', `cid', `pfb',
+                           `pfa', `bdf', `pcf', `pfr', `fon', `otb', and
+                           `cff'.
+  --help                   Print out this list of options.
+  --nohints                Specify FT_LOAD_NO_HINTING when loading glyphs.
+  --rasterize              Call FT_Render_Glyph as well as loading it.
+  --result <dir>           This is the directory in which test files are
+                           placed.
+  --test <file>            Run a single test on a pre-generated testcase. 
+                           Done in the current process so it can be debugged
+                           more easily.
diff --git a/src/tools/ftrandom/ftrandom.c b/src/tools/ftrandom/ftrandom.c
new file mode 100644 (file)
index 0000000..4daac0d
--- /dev/null
@@ -0,0 +1,659 @@
+/* Copyright (C) 2005, 2007, 2008 by George Williams */
+/*
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+
+ * The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
+ * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/* modified by Werner Lemberg <wl@gnu.org>       */
+/* This file is now part of the FreeType library */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <math.h>
+#include <signal.h>
+#include <time.h>
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_OUTLINE_H
+
+#define true     1
+#define false    0
+#define forever  for (;;)
+
+
+  static int    check_outlines = false;
+  static int    nohints        = false;
+  static int    rasterize      = false;
+  static char*  results_dir    = "results";
+
+#define GOOD_FONTS_DIR  "/home/wl/freetype-testfonts"
+
+  static char*  default_dir_list[] =
+  {
+    GOOD_FONTS_DIR,
+    NULL
+  };
+
+  static char*  default_ext_list[] =
+  {
+    "ttf",
+    "otf",
+    "ttc",
+    "cid",
+    "pfb",
+    "pfa",
+    "bdf",
+    "pcf",
+    "pfr",
+    "fon",
+    "otb",
+    "cff",
+    NULL
+  };
+
+  static int  error_count    = 1;
+  static int  error_fraction = 0;
+
+  static FT_F26Dot6  font_size = 12 * 64;
+
+  static struct fontlist
+  {
+    char*         name;
+    int           len;
+    unsigned int  isbinary: 1;
+    unsigned int  isascii: 1;
+    unsigned int  ishex: 1;
+
+  } *fontlist;
+
+  static int  fcnt;
+
+
+  static int
+  FT_MoveTo( const FT_Vector  *to,
+             void             *user )
+  {
+    return 0;
+  }
+
+
+  static int
+  FT_LineTo( const FT_Vector  *to,
+             void             *user )
+  {
+    return 0;
+  }
+
+
+  static int
+  FT_ConicTo( const FT_Vector  *_cp,
+              const FT_Vector  *to,
+              void             *user )
+  {
+    return 0;
+  }
+
+
+  static int
+  FT_CubicTo( const FT_Vector  *cp1,
+              const FT_Vector  *cp2,
+              const FT_Vector  *to,
+              void             *user )
+  {
+    return 0;
+  }
+
+
+  static FT_Outline_Funcs outlinefuncs =
+  {
+    FT_MoveTo,
+    FT_LineTo,
+    FT_ConicTo,
+    FT_CubicTo,
+    0, 0          /* No shift, no delta */
+  };
+
+
+  static void
+  TestFace( FT_Face  face )
+  {
+    int  gid;
+    int  load_flags = FT_LOAD_DEFAULT;
+
+
+    if ( check_outlines         &&
+         FT_IS_SCALABLE( face ) )
+      load_flags = FT_LOAD_NO_BITMAP;
+
+    if ( nohints )
+      load_flags |= FT_LOAD_NO_HINTING;
+
+    FT_Set_Char_Size( face, 0, font_size, 72, 72 );
+
+    for ( gid = 0; gid < face->num_glyphs; ++gid )
+    {
+      if ( check_outlines         &&
+           FT_IS_SCALABLE( face ) )
+      {
+        if ( !FT_Load_Glyph( face, gid, load_flags ) )
+          FT_Outline_Decompose( &face->glyph->outline, &outlinefuncs, NULL );
+      }
+      else
+        FT_Load_Glyph( face, gid, load_flags );
+
+      if ( rasterize )
+        FT_Render_Glyph( face->glyph, ft_render_mode_normal );
+    }
+
+    FT_Done_Face( face );
+  }
+
+
+  static void
+  ExecuteTest( char*  testfont )
+  {
+    FT_Library  context;
+    FT_Face     face;
+    int         i, num;
+
+
+    if ( FT_Init_FreeType( &context ) )
+    {
+      fprintf( stderr, "Can't initialize FreeType.\n" );
+      exit( 1 );
+    }
+
+    if ( FT_New_Face( context, testfont, 0, &face ) )
+    {
+      /* The font is erroneous, so if this fails that's ok. */
+      exit( 0 );
+    }
+
+    if ( face->num_faces == 1 )
+      TestFace( face );
+    else
+    {
+      num = face->num_faces;
+      FT_Done_Face( face );
+
+      for ( i = 0; i < num; ++i )
+      {
+        if ( !FT_New_Face( context, testfont, i, &face ) )
+          TestFace( face );
+      }
+    }
+
+    exit( 0 );
+  }
+
+
+  static int
+  extmatch( char*   filename,
+            char**  extensions )
+  {
+    int    i;
+    char*  pt;
+
+
+    if ( extensions == NULL )
+      return true;
+
+    pt = strrchr( filename, '.' );
+    if ( pt == NULL )
+      return false;
+    if ( pt < strrchr( filename, '/' ) )
+      return false;
+
+    for ( i = 0; extensions[i] != NULL; ++i )
+      if ( strcasecmp( pt + 1, extensions[i] ) == 0 ||
+           strcasecmp( pt,     extensions[i] ) == 0 )
+        return true;
+
+    return false;
+  }
+
+
+  static void
+  figurefiletype( struct fontlist*  item )
+  {
+    FILE*  foo;
+
+
+    item->isbinary = item->isascii = item->ishex = false;
+
+    foo = fopen( item->name, "rb" );
+    if ( foo != NULL )
+    {
+      /* Try to guess the file type from the first few characters... */
+      int  ch1 = getc( foo );
+      int  ch2 = getc( foo );
+      int  ch3 = getc( foo );
+      int  ch4 = getc( foo );
+
+
+      fclose( foo );
+
+      if ( ( ch1 == 0   && ch2 == 1   && ch3 == 0   && ch4 == 0   ) ||
+           ( ch1 == 'O' && ch2 == 'T' && ch3 == 'T' && ch4 == 'O' ) ||
+           ( ch1 == 't' && ch2 == 'r' && ch3 == 'u' && ch4 == 'e' ) ||
+           ( ch1 == 't' && ch2 == 't' && ch3 == 'c' && ch4 == 'f' ) )
+      {
+        /* ttf, otf, ttc files */
+        item->isbinary = true;
+      }
+      else if ( ch1 == 0x80 && ch2 == '\01' )
+      {
+        /* PFB header */
+        item->isbinary = true;
+      }
+      else if ( ch1 == '%' && ch2 == '!' )
+      {
+        /* Random PostScript */
+        if ( strstr( item->name, ".pfa" ) != NULL ||
+             strstr( item->name, ".PFA" ) != NULL )
+          item->ishex = true;
+        else
+          item->isascii = true;
+      }
+      else if ( ch1 == 1 && ch2 == 0 && ch3 == 4 )
+      {
+        /* Bare CFF */
+        item->isbinary = true;
+      }
+      else if ( ch1 == 'S' && ch2 == 'T' && ch3 == 'A' && ch4 == 'R' )
+      {
+        /* BDF */
+        item->ishex = true;
+      }
+      else if ( ch1 == 'P' && ch2 == 'F' && ch3 == 'R' && ch4 == '0' )
+      {
+        /* PFR */
+        item->isbinary = true;
+      }
+      else if ( ( ch1 == '\1' && ch2 == 'f' && ch3 == 'c' && ch4 == 'p' ) ||
+                ( ch1 == 'M'  && ch2 == 'Z' )                             )
+      {
+        /* Windows FON */
+        item->isbinary = true;
+      }
+      else
+      {
+        fprintf( stderr,
+                 "Can't recognize file type of `%s', assuming binary\n",
+                 item->name );
+        item->isbinary = true;
+      }
+    }
+    else
+    {
+      fprintf( stderr, "Can't open `%s' for typing the file.\n",
+               item->name );
+      item->isbinary = true;
+    }
+  }
+
+
+  static void
+  FindFonts( char**  fontdirs,
+             char**  extensions )
+  {
+    DIR*            examples;
+    struct dirent*  ent;
+
+    int             i, max;
+    char            buffer[1025];
+    struct stat     statb;
+
+
+    max  = 0;
+    fcnt = 0;
+
+    for ( i = 0; fontdirs[i] != NULL; ++i )
+    {
+      examples = opendir( fontdirs[i] );
+      if ( examples == NULL )
+      {
+        fprintf( stderr,
+                 "Can't open example font directory `%s'\n",
+                 fontdirs[i] );
+        exit( 1 );
+      }
+
+      while ( ( ent = readdir( examples ) ) != NULL )
+      {
+        snprintf( buffer, sizeof ( buffer ),
+                  "%s/%s", fontdirs[i], ent->d_name );
+        if ( stat( buffer, &statb ) == -1 || S_ISDIR( statb.st_mode ) )
+          continue;
+        if ( extensions == NULL || extmatch( buffer, extensions ) )
+        {
+          if ( fcnt >= max )
+          {
+            max += 100;
+            fontlist = realloc( fontlist, max * sizeof ( struct fontlist ) );
+            if ( fontlist == NULL )
+            {
+              fprintf( stderr, "Can't allocate memory\n" );
+              exit( 1 );
+            }
+          }
+
+          fontlist[fcnt].name = strdup( buffer );
+          fontlist[fcnt].len  = statb.st_size;
+
+          figurefiletype( &fontlist[fcnt] );
+          ++fcnt;
+        }
+      }
+
+      closedir( examples );
+    }
+
+    if ( fcnt == 0 )
+    {
+      fprintf( stderr, "Can't find matching font files.\n" );
+      exit( 1 );
+    }
+
+    fontlist[fcnt].name = NULL;
+  }
+
+
+  static int
+  getErrorCnt( struct fontlist*  item )
+  {
+    if ( error_count == 0 && error_fraction == 0 )
+      return 0;
+
+    return error_count + ceil( error_fraction * item->len );
+  }
+
+
+  static int
+  getRandom( int  low,
+             int  high )
+  {
+    if ( low - high < 0x10000L )
+      return low + ( ( random() >> 8 ) % ( high + 1 - low ) );
+
+    return low + ( random() % ( high + 1 - low ) );
+  }
+
+
+  static int
+  copyfont( struct fontlist*  item,
+            char*             newfont )
+  {
+    static char  buffer[8096];
+    FILE         *good, *new;
+    int          len;
+    int          i, err_cnt;
+
+
+    good = fopen( item->name, "r" );
+    if ( good == NULL )
+    {
+      fprintf( stderr, "Can't open `%s'\n", item->name );
+      return false;
+    }
+
+    new = fopen( newfont, "w+" );
+    if ( new == NULL )
+    {
+      fprintf( stderr, "Can't create temporary output file `%s'\n",
+               newfont );
+      exit( 1 );
+    }
+
+    while ( ( len = fread( buffer, 1, sizeof ( buffer ), good ) ) > 0 )
+      fwrite( buffer, 1, len, new );
+
+    fclose( good );
+
+    err_cnt = getErrorCnt( item );
+    for ( i = 0; i < err_cnt; ++i )
+    {
+      fseek( new, getRandom( 0, item->len - 1 ), SEEK_SET );
+
+      if ( item->isbinary )
+        putc( getRandom( 0, 0xff ), new );
+      else if ( item->isascii )
+        putc( getRandom( 0x20, 0x7e ), new );
+      else
+      {
+        int  hex = getRandom( 0, 15 );
+
+
+        if ( hex < 10 )
+          hex += '0';
+        else
+          hex += 'A' - 10;
+
+        putc( hex, new );
+      }
+    }
+
+    if ( ferror( new ) )
+    {
+      fclose( new );
+      unlink( newfont );
+      return false;
+    }
+
+    fclose( new );
+
+    return true;
+  }
+
+
+  static int  child_pid;
+
+  static void
+  abort_test( int  sig )
+  {
+    /* If a time-out happens, then kill the child */
+    kill( child_pid, SIGFPE );
+    write( 2, "Timeout... ", 11 );
+  }
+
+
+  static void
+  do_test( void )
+  {
+    int         i        = getRandom( 0, fcnt - 1 );
+    static int  test_num = 0;
+    char        buffer[1024];
+
+
+    sprintf( buffer, "%s/test%d", results_dir, test_num++ );
+
+    if ( copyfont ( &fontlist[i], buffer ) )
+    {
+      signal( SIGALRM, abort_test );
+      /* Anything that takes more than 20 seconds */
+      /* to parse and/or rasterize is an error.   */
+      alarm( 20 );
+      if ( ( child_pid = fork() ) == 0 )
+        ExecuteTest( buffer );
+      else if ( child_pid != -1 )
+      {
+        int  status;
+
+
+        waitpid( child_pid, &status, 0 );
+        alarm( 0 );
+        if ( WIFSIGNALED ( status ) )
+          printf( "Error found in file `%s'\n", buffer );
+        else
+          unlink( buffer );
+      }
+      else
+      {
+        fprintf( stderr, "Can't fork test case.\n" );
+        exit( 1 );
+      }
+      alarm( 0 );
+    }
+  }
+
+
+  static void
+  usage( FILE*  out,
+         char*  name )
+  {
+    fprintf( out, "%s [options] -- Generate random erroneous fonts\n"
+                  "  and attempt to parse them with FreeType.\n\n", name );
+
+    fprintf( out, "  --all                    All non-directory files are assumed to be fonts.\n" );
+    fprintf( out, "  --check-outlines         Make sure we can parse the outlines of each glyph.\n" );
+    fprintf( out, "  --dir <path>             Append <path> to list of font search directories.\n" );
+    fprintf( out, "  --error-count <cnt>      Introduce <cnt> single byte errors into each font.\n" );
+    fprintf( out, "  --error-fraction <frac>  Introduce <frac>*filesize single byte errors\n"
+                  "                           into each font.\n" );
+    fprintf( out, "  --ext <ext>              Add <ext> to list of extensions indicating fonts.\n" );
+    fprintf( out, "  --help                   Print this.\n" );
+    fprintf( out, "  --nohints                Turn off hinting.\n" );
+    fprintf( out, "  --rasterize              Attempt to rasterize each glyph.\n" );
+    fprintf( out, "  --results <dir>          Directory in which to place the test fonts.\n" );
+    fprintf( out, "  --size <float>           Use the given font size for the tests.\n" );
+    fprintf( out, "  --test <file>            Run a single test on an already existing file.\n" );
+  }
+
+
+  int
+  main( int     argc,
+        char**  argv )
+  {
+    char    **dirs, **exts;
+    char    *pt, *end;
+    int     dcnt = 0, ecnt = 0, rset = false, allexts = false;
+    int     i;
+    time_t  now;
+    char*   testfile = NULL;
+
+
+    dirs = calloc( argc + 1, sizeof ( char ** ) );
+    exts = calloc( argc + 1, sizeof ( char ** ) );
+
+    for ( i = 1; i < argc; ++i )
+    {
+      pt = argv[i];
+      if ( pt[0] == '-' && pt[1] == '-' )
+        ++pt;
+
+      if ( strcmp( pt, "-all" ) == 0 )
+        allexts = true;
+      else if ( strcmp( pt, "-check-outlines" ) == 0 )
+        check_outlines = true;
+      else if ( strcmp( pt, "-dir" ) == 0 )
+        dirs[dcnt++] = argv[++i];
+      else if ( strcmp( pt, "-error-count" ) == 0 )
+      {
+        if ( !rset )
+          error_fraction = 0;
+        rset = true;
+        error_count = strtol( argv[++i], &end, 10 );
+        if ( *end != '\0' )
+        {
+          fprintf( stderr, "Bad value for error-count: %s\n", argv[i] );
+          exit( 1 );
+        }
+      }
+      else if ( strcmp( pt, "-error-fraction" ) == 0 )
+      {
+        if ( !rset )
+          error_count = 0;
+        rset = true;
+        error_fraction = strtod( argv[++i], &end );
+        if ( *end != '\0' )
+        {
+          fprintf( stderr, "Bad value for error-fraction: %s\n", argv[i] );
+          exit( 1 );
+        }
+      }
+      else if ( strcmp( pt, "-ext" ) == 0 )
+        exts[ecnt++] = argv[++i];
+      else if ( strcmp( pt, "-help" ) == 0 )
+      {
+        usage( stdout, argv[0] );
+        exit( 0 );
+      }
+      else if ( strcmp( pt, "-nohints" ) == 0 )
+        nohints = true;
+      else if ( strcmp( pt, "-rasterize" ) == 0 )
+        rasterize = true;
+      else if ( strcmp( pt, "-results" ) == 0 )
+        results_dir = argv[++i];
+      else if ( strcmp( pt, "-size" ) == 0 )
+      {
+        font_size = (FT_F26Dot6)( strtod( argv[++i], &end ) * 64 );
+        if ( *end != '\0' || font_size < 64 )
+        {
+          fprintf( stderr, "Bad value for size: %s\n", argv[i] );
+          exit( 1 );
+        }
+      }
+      else if ( strcmp( pt, "-test" ) == 0 )
+        testfile = argv[++i];
+      else
+      {
+        usage( stderr, argv[0] );
+        exit( 1 );
+      }
+    }
+
+    if ( allexts )
+      exts = NULL;
+    else if ( ecnt == 0 )
+      exts = default_ext_list;
+
+    if ( dcnt == 0 )
+      dirs = default_dir_list;
+
+    if ( testfile != NULL )
+      ExecuteTest( testfile );         /* This should never return */
+
+    time( &now );
+    srandom( now );
+
+    FindFonts( dirs, exts );
+    mkdir( results_dir, 0755 );
+
+    forever
+      do_test();
+
+    return 0;
+  }
+
+
+/* EOF */
diff --git a/src/tools/glnames.py b/src/tools/glnames.py
new file mode 100644 (file)
index 0000000..8810bf5
--- /dev/null
@@ -0,0 +1,5487 @@
+#!/usr/bin/env python
+#
+
+#
+# FreeType 2 glyph name builder
+#
+
+
+# Copyright 1996-2000, 2003, 2005, 2007, 2008, 2011 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.
+
+
+"""\
+
+usage: %s <output-file>
+
+  This python script generates the glyph names tables defined in the
+  `psnames' module.
+
+  Its single argument is the name of the header file to be created.
+"""
+
+
+import sys, string, struct, re, os.path
+
+
+# This table lists the glyphs according to the Macintosh specification.
+# It is used by the TrueType Postscript names table.
+#
+# See
+#
+#   http://fonts.apple.com/TTRefMan/RM06/Chap6post.html
+#
+# for the official list.
+#
+mac_standard_names = \
+[
+  # 0
+  ".notdef", ".null", "nonmarkingreturn", "space", "exclam",
+  "quotedbl", "numbersign", "dollar", "percent", "ampersand",
+
+  # 10
+  "quotesingle", "parenleft", "parenright", "asterisk", "plus",
+  "comma", "hyphen", "period", "slash", "zero",
+
+  # 20
+  "one", "two", "three", "four", "five",
+  "six", "seven", "eight", "nine", "colon",
+
+  # 30
+  "semicolon", "less", "equal", "greater", "question",
+  "at", "A", "B", "C", "D",
+
+  # 40
+  "E", "F", "G", "H", "I",
+  "J", "K", "L", "M", "N",
+
+  # 50
+  "O", "P", "Q", "R", "S",
+  "T", "U", "V", "W", "X",
+
+  # 60
+  "Y", "Z", "bracketleft", "backslash", "bracketright",
+  "asciicircum", "underscore", "grave", "a", "b",
+
+  # 70
+  "c", "d", "e", "f", "g",
+  "h", "i", "j", "k", "l",
+
+  # 80
+  "m", "n", "o", "p", "q",
+  "r", "s", "t", "u", "v",
+
+  # 90
+  "w", "x", "y", "z", "braceleft",
+  "bar", "braceright", "asciitilde", "Adieresis", "Aring",
+
+  # 100
+  "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis",
+  "aacute", "agrave", "acircumflex", "adieresis", "atilde",
+
+  # 110
+  "aring", "ccedilla", "eacute", "egrave", "ecircumflex",
+  "edieresis", "iacute", "igrave", "icircumflex", "idieresis",
+
+  # 120
+  "ntilde", "oacute", "ograve", "ocircumflex", "odieresis",
+  "otilde", "uacute", "ugrave", "ucircumflex", "udieresis",
+
+  # 130
+  "dagger", "degree", "cent", "sterling", "section",
+  "bullet", "paragraph", "germandbls", "registered", "copyright",
+
+  # 140
+  "trademark", "acute", "dieresis", "notequal", "AE",
+  "Oslash", "infinity", "plusminus", "lessequal", "greaterequal",
+
+  # 150
+  "yen", "mu", "partialdiff", "summation", "product",
+  "pi", "integral", "ordfeminine", "ordmasculine", "Omega",
+
+  # 160
+  "ae", "oslash", "questiondown", "exclamdown", "logicalnot",
+  "radical", "florin", "approxequal", "Delta", "guillemotleft",
+
+  # 170
+  "guillemotright", "ellipsis", "nonbreakingspace", "Agrave", "Atilde",
+  "Otilde", "OE", "oe", "endash", "emdash",
+
+  # 180
+  "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide",
+  "lozenge", "ydieresis", "Ydieresis", "fraction", "currency",
+
+  # 190
+  "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl",
+  "periodcentered", "quotesinglbase", "quotedblbase", "perthousand",
+    "Acircumflex",
+
+  # 200
+  "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute",
+  "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex",
+
+  # 210
+  "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave",
+  "dotlessi", "circumflex", "tilde", "macron", "breve",
+
+  # 220
+  "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek",
+  "caron", "Lslash", "lslash", "Scaron", "scaron",
+
+  # 230
+  "Zcaron", "zcaron", "brokenbar", "Eth", "eth",
+  "Yacute", "yacute", "Thorn", "thorn", "minus",
+
+  # 240
+  "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf",
+  "onequarter", "threequarters", "franc", "Gbreve", "gbreve",
+
+  # 250
+  "Idotaccent", "Scedilla", "scedilla", "Cacute", "cacute",
+  "Ccaron", "ccaron", "dcroat"
+]
+
+
+# The list of standard `SID' glyph names.  For the official list,
+# see Annex A of document at
+#
+#   http://partners.adobe.com/public/developer/en/font/5176.CFF.pdf  .
+#
+sid_standard_names = \
+[
+  # 0
+  ".notdef", "space", "exclam", "quotedbl", "numbersign",
+  "dollar", "percent", "ampersand", "quoteright", "parenleft",
+
+  # 10
+  "parenright", "asterisk", "plus", "comma", "hyphen",
+  "period", "slash", "zero", "one", "two",
+
+  # 20
+  "three", "four", "five", "six", "seven",
+  "eight", "nine", "colon", "semicolon", "less",
+
+  # 30
+  "equal", "greater", "question", "at", "A",
+  "B", "C", "D", "E", "F",
+
+  # 40
+  "G", "H", "I", "J", "K",
+  "L", "M", "N", "O", "P",
+
+  # 50
+  "Q", "R", "S", "T", "U",
+  "V", "W", "X", "Y", "Z",
+
+  # 60
+  "bracketleft", "backslash", "bracketright", "asciicircum", "underscore",
+  "quoteleft", "a", "b", "c", "d",
+
+  # 70
+  "e", "f", "g", "h", "i",
+  "j", "k", "l", "m", "n",
+
+  # 80
+  "o", "p", "q", "r", "s",
+  "t", "u", "v", "w", "x",
+
+  # 90
+  "y", "z", "braceleft", "bar", "braceright",
+  "asciitilde", "exclamdown", "cent", "sterling", "fraction",
+
+  # 100
+  "yen", "florin", "section", "currency", "quotesingle",
+  "quotedblleft", "guillemotleft", "guilsinglleft", "guilsinglright", "fi",
+
+  # 110
+  "fl", "endash", "dagger", "daggerdbl", "periodcentered",
+  "paragraph", "bullet", "quotesinglbase", "quotedblbase", "quotedblright",
+
+  # 120
+  "guillemotright", "ellipsis", "perthousand", "questiondown", "grave",
+  "acute", "circumflex", "tilde", "macron", "breve",
+
+  # 130
+  "dotaccent", "dieresis", "ring", "cedilla", "hungarumlaut",
+  "ogonek", "caron", "emdash", "AE", "ordfeminine",
+
+  # 140
+  "Lslash", "Oslash", "OE", "ordmasculine", "ae",
+  "dotlessi", "lslash", "oslash", "oe", "germandbls",
+
+  # 150
+  "onesuperior", "logicalnot", "mu", "trademark", "Eth",
+  "onehalf", "plusminus", "Thorn", "onequarter", "divide",
+
+  # 160
+  "brokenbar", "degree", "thorn", "threequarters", "twosuperior",
+  "registered", "minus", "eth", "multiply", "threesuperior",
+
+  # 170
+  "copyright", "Aacute", "Acircumflex", "Adieresis", "Agrave",
+  "Aring", "Atilde", "Ccedilla", "Eacute", "Ecircumflex",
+
+  # 180
+  "Edieresis", "Egrave", "Iacute", "Icircumflex", "Idieresis",
+  "Igrave", "Ntilde", "Oacute", "Ocircumflex", "Odieresis",
+
+  # 190
+  "Ograve", "Otilde", "Scaron", "Uacute", "Ucircumflex",
+  "Udieresis", "Ugrave", "Yacute", "Ydieresis", "Zcaron",
+
+  # 200
+  "aacute", "acircumflex", "adieresis", "agrave", "aring",
+  "atilde", "ccedilla", "eacute", "ecircumflex", "edieresis",
+
+  # 210
+  "egrave", "iacute", "icircumflex", "idieresis", "igrave",
+  "ntilde", "oacute", "ocircumflex", "odieresis", "ograve",
+
+  # 220
+  "otilde", "scaron", "uacute", "ucircumflex", "udieresis",
+  "ugrave", "yacute", "ydieresis", "zcaron", "exclamsmall",
+
+  # 230
+  "Hungarumlautsmall", "dollaroldstyle", "dollarsuperior", "ampersandsmall",
+    "Acutesmall",
+  "parenleftsuperior", "parenrightsuperior", "twodotenleader",
+    "onedotenleader", "zerooldstyle",
+
+  # 240
+  "oneoldstyle", "twooldstyle", "threeoldstyle", "fouroldstyle",
+    "fiveoldstyle",
+  "sixoldstyle", "sevenoldstyle", "eightoldstyle", "nineoldstyle",
+    "commasuperior",
+
+  # 250
+  "threequartersemdash", "periodsuperior", "questionsmall", "asuperior",
+    "bsuperior",
+  "centsuperior", "dsuperior", "esuperior", "isuperior", "lsuperior",
+
+  # 260
+  "msuperior", "nsuperior", "osuperior", "rsuperior", "ssuperior",
+  "tsuperior", "ff", "ffi", "ffl", "parenleftinferior",
+
+  # 270
+  "parenrightinferior", "Circumflexsmall", "hyphensuperior", "Gravesmall",
+    "Asmall",
+  "Bsmall", "Csmall", "Dsmall", "Esmall", "Fsmall",
+
+  # 280
+  "Gsmall", "Hsmall", "Ismall", "Jsmall", "Ksmall",
+  "Lsmall", "Msmall", "Nsmall", "Osmall", "Psmall",
+
+  # 290
+  "Qsmall", "Rsmall", "Ssmall", "Tsmall", "Usmall",
+  "Vsmall", "Wsmall", "Xsmall", "Ysmall", "Zsmall",
+
+  # 300
+  "colonmonetary", "onefitted", "rupiah", "Tildesmall", "exclamdownsmall",
+  "centoldstyle", "Lslashsmall", "Scaronsmall", "Zcaronsmall",
+    "Dieresissmall",
+
+  # 310
+  "Brevesmall", "Caronsmall", "Dotaccentsmall", "Macronsmall", "figuredash",
+  "hypheninferior", "Ogoneksmall", "Ringsmall", "Cedillasmall",
+    "questiondownsmall",
+
+  # 320
+  "oneeighth", "threeeighths", "fiveeighths", "seveneighths", "onethird",
+  "twothirds", "zerosuperior", "foursuperior", "fivesuperior",
+    "sixsuperior",
+
+  # 330
+  "sevensuperior", "eightsuperior", "ninesuperior", "zeroinferior",
+    "oneinferior",
+  "twoinferior", "threeinferior", "fourinferior", "fiveinferior",
+    "sixinferior",
+
+  # 340
+  "seveninferior", "eightinferior", "nineinferior", "centinferior",
+    "dollarinferior",
+  "periodinferior", "commainferior", "Agravesmall", "Aacutesmall",
+    "Acircumflexsmall",
+
+  # 350
+  "Atildesmall", "Adieresissmall", "Aringsmall", "AEsmall", "Ccedillasmall",
+  "Egravesmall", "Eacutesmall", "Ecircumflexsmall", "Edieresissmall",
+    "Igravesmall",
+
+  # 360
+  "Iacutesmall", "Icircumflexsmall", "Idieresissmall", "Ethsmall",
+    "Ntildesmall",
+  "Ogravesmall", "Oacutesmall", "Ocircumflexsmall", "Otildesmall",
+    "Odieresissmall",
+
+  # 370
+  "OEsmall", "Oslashsmall", "Ugravesmall", "Uacutesmall",
+    "Ucircumflexsmall",
+  "Udieresissmall", "Yacutesmall", "Thornsmall", "Ydieresissmall",
+    "001.000",
+
+  # 380
+  "001.001", "001.002", "001.003", "Black", "Bold",
+  "Book", "Light", "Medium", "Regular", "Roman",
+
+  # 390
+  "Semibold"
+]
+
+
+# This table maps character codes of the Adobe Standard Type 1
+# encoding to glyph indices in the sid_standard_names table.
+#
+t1_standard_encoding = \
+[
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   1,   2,   3,   4,   5,   6,   7,   8,
+    9,  10,  11,  12,  13,  14,  15,  16,  17,  18,
+
+   19,  20,  21,  22,  23,  24,  25,  26,  27,  28,
+   29,  30,  31,  32,  33,  34,  35,  36,  37,  38,
+   39,  40,  41,  42,  43,  44,  45,  46,  47,  48,
+   49,  50,  51,  52,  53,  54,  55,  56,  57,  58,
+   59,  60,  61,  62,  63,  64,  65,  66,  67,  68,
+
+   69,  70,  71,  72,  73,  74,  75,  76,  77,  78,
+   79,  80,  81,  82,  83,  84,  85,  86,  87,  88,
+   89,  90,  91,  92,  93,  94,  95,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,  96,  97,  98,  99, 100, 101, 102, 103, 104,
+  105, 106, 107, 108, 109, 110,   0, 111, 112, 113,
+  114,   0, 115, 116, 117, 118, 119, 120, 121, 122,
+    0, 123,   0, 124, 125, 126, 127, 128, 129, 130,
+
+  131,   0, 132, 133,   0, 134, 135, 136, 137,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0, 138,   0, 139,   0,   0,
+    0,   0, 140, 141, 142, 143,   0,   0,   0,   0,
+    0, 144,   0,   0,   0, 145,   0,   0, 146, 147,
+
+  148, 149,   0,   0,   0,   0
+]
+
+
+# This table maps character codes of the Adobe Expert Type 1
+# encoding to glyph indices in the sid_standard_names table.
+#
+t1_expert_encoding = \
+[
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   1, 229, 230,   0, 231, 232, 233, 234,
+  235, 236, 237, 238,  13,  14,  15,  99, 239, 240,
+
+  241, 242, 243, 244, 245, 246, 247, 248,  27,  28,
+  249, 250, 251, 252,   0, 253, 254, 255, 256, 257,
+    0,   0,   0, 258,   0,   0, 259, 260, 261, 262,
+    0,   0, 263, 264, 265,   0, 266, 109, 110, 267,
+  268, 269,   0, 270, 271, 272, 273, 274, 275, 276,
+
+  277, 278, 279, 280, 281, 282, 283, 284, 285, 286,
+  287, 288, 289, 290, 291, 292, 293, 294, 295, 296,
+  297, 298, 299, 300, 301, 302, 303,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+
+    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+    0, 304, 305, 306,   0,   0, 307, 308, 309, 310,
+  311,   0, 312,   0,   0, 313,   0,   0, 314, 315,
+    0,   0, 316, 317, 318,   0,   0,   0, 158, 155,
+  163, 319, 320, 321, 322, 323, 324, 325,   0,   0,
+
+  326, 150, 164, 169, 327, 328, 329, 330, 331, 332,
+  333, 334, 335, 336, 337, 338, 339, 340, 341, 342,
+  343, 344, 345, 346, 347, 348, 349, 350, 351, 352,
+  353, 354, 355, 356, 357, 358, 359, 360, 361, 362,
+  363, 364, 365, 366, 367, 368, 369, 370, 371, 372,
+
+  373, 374, 375, 376, 377, 378
+]
+
+
+# This data has been taken literally from the files `glyphlist.txt'
+# and `zapfdingbats.txt' version 2.0, Sept 2002.  It is available from
+#
+#   http://sourceforge.net/adobe/aglfn/
+#
+adobe_glyph_list = """\
+A;0041
+AE;00C6
+AEacute;01FC
+AEmacron;01E2
+AEsmall;F7E6
+Aacute;00C1
+Aacutesmall;F7E1
+Abreve;0102
+Abreveacute;1EAE
+Abrevecyrillic;04D0
+Abrevedotbelow;1EB6
+Abrevegrave;1EB0
+Abrevehookabove;1EB2
+Abrevetilde;1EB4
+Acaron;01CD
+Acircle;24B6
+Acircumflex;00C2
+Acircumflexacute;1EA4
+Acircumflexdotbelow;1EAC
+Acircumflexgrave;1EA6
+Acircumflexhookabove;1EA8
+Acircumflexsmall;F7E2
+Acircumflextilde;1EAA
+Acute;F6C9
+Acutesmall;F7B4
+Acyrillic;0410
+Adblgrave;0200
+Adieresis;00C4
+Adieresiscyrillic;04D2
+Adieresismacron;01DE
+Adieresissmall;F7E4
+Adotbelow;1EA0
+Adotmacron;01E0
+Agrave;00C0
+Agravesmall;F7E0
+Ahookabove;1EA2
+Aiecyrillic;04D4
+Ainvertedbreve;0202
+Alpha;0391
+Alphatonos;0386
+Amacron;0100
+Amonospace;FF21
+Aogonek;0104
+Aring;00C5
+Aringacute;01FA
+Aringbelow;1E00
+Aringsmall;F7E5
+Asmall;F761
+Atilde;00C3
+Atildesmall;F7E3
+Aybarmenian;0531
+B;0042
+Bcircle;24B7
+Bdotaccent;1E02
+Bdotbelow;1E04
+Becyrillic;0411
+Benarmenian;0532
+Beta;0392
+Bhook;0181
+Blinebelow;1E06
+Bmonospace;FF22
+Brevesmall;F6F4
+Bsmall;F762
+Btopbar;0182
+C;0043
+Caarmenian;053E
+Cacute;0106
+Caron;F6CA
+Caronsmall;F6F5
+Ccaron;010C
+Ccedilla;00C7
+Ccedillaacute;1E08
+Ccedillasmall;F7E7
+Ccircle;24B8
+Ccircumflex;0108
+Cdot;010A
+Cdotaccent;010A
+Cedillasmall;F7B8
+Chaarmenian;0549
+Cheabkhasiancyrillic;04BC
+Checyrillic;0427
+Chedescenderabkhasiancyrillic;04BE
+Chedescendercyrillic;04B6
+Chedieresiscyrillic;04F4
+Cheharmenian;0543
+Chekhakassiancyrillic;04CB
+Cheverticalstrokecyrillic;04B8
+Chi;03A7
+Chook;0187
+Circumflexsmall;F6F6
+Cmonospace;FF23
+Coarmenian;0551
+Csmall;F763
+D;0044
+DZ;01F1
+DZcaron;01C4
+Daarmenian;0534
+Dafrican;0189
+Dcaron;010E
+Dcedilla;1E10
+Dcircle;24B9
+Dcircumflexbelow;1E12
+Dcroat;0110
+Ddotaccent;1E0A
+Ddotbelow;1E0C
+Decyrillic;0414
+Deicoptic;03EE
+Delta;2206
+Deltagreek;0394
+Dhook;018A
+Dieresis;F6CB
+DieresisAcute;F6CC
+DieresisGrave;F6CD
+Dieresissmall;F7A8
+Digammagreek;03DC
+Djecyrillic;0402
+Dlinebelow;1E0E
+Dmonospace;FF24
+Dotaccentsmall;F6F7
+Dslash;0110
+Dsmall;F764
+Dtopbar;018B
+Dz;01F2
+Dzcaron;01C5
+Dzeabkhasiancyrillic;04E0
+Dzecyrillic;0405
+Dzhecyrillic;040F
+E;0045
+Eacute;00C9
+Eacutesmall;F7E9
+Ebreve;0114
+Ecaron;011A
+Ecedillabreve;1E1C
+Echarmenian;0535
+Ecircle;24BA
+Ecircumflex;00CA
+Ecircumflexacute;1EBE
+Ecircumflexbelow;1E18
+Ecircumflexdotbelow;1EC6
+Ecircumflexgrave;1EC0
+Ecircumflexhookabove;1EC2
+Ecircumflexsmall;F7EA
+Ecircumflextilde;1EC4
+Ecyrillic;0404
+Edblgrave;0204
+Edieresis;00CB
+Edieresissmall;F7EB
+Edot;0116
+Edotaccent;0116
+Edotbelow;1EB8
+Efcyrillic;0424
+Egrave;00C8
+Egravesmall;F7E8
+Eharmenian;0537
+Ehookabove;1EBA
+Eightroman;2167
+Einvertedbreve;0206
+Eiotifiedcyrillic;0464
+Elcyrillic;041B
+Elevenroman;216A
+Emacron;0112
+Emacronacute;1E16
+Emacrongrave;1E14
+Emcyrillic;041C
+Emonospace;FF25
+Encyrillic;041D
+Endescendercyrillic;04A2
+Eng;014A
+Enghecyrillic;04A4
+Enhookcyrillic;04C7
+Eogonek;0118
+Eopen;0190
+Epsilon;0395
+Epsilontonos;0388
+Ercyrillic;0420
+Ereversed;018E
+Ereversedcyrillic;042D
+Escyrillic;0421
+Esdescendercyrillic;04AA
+Esh;01A9
+Esmall;F765
+Eta;0397
+Etarmenian;0538
+Etatonos;0389
+Eth;00D0
+Ethsmall;F7F0
+Etilde;1EBC
+Etildebelow;1E1A
+Euro;20AC
+Ezh;01B7
+Ezhcaron;01EE
+Ezhreversed;01B8
+F;0046
+Fcircle;24BB
+Fdotaccent;1E1E
+Feharmenian;0556
+Feicoptic;03E4
+Fhook;0191
+Fitacyrillic;0472
+Fiveroman;2164
+Fmonospace;FF26
+Fourroman;2163
+Fsmall;F766
+G;0047
+GBsquare;3387
+Gacute;01F4
+Gamma;0393
+Gammaafrican;0194
+Gangiacoptic;03EA
+Gbreve;011E
+Gcaron;01E6
+Gcedilla;0122
+Gcircle;24BC
+Gcircumflex;011C
+Gcommaaccent;0122
+Gdot;0120
+Gdotaccent;0120
+Gecyrillic;0413
+Ghadarmenian;0542
+Ghemiddlehookcyrillic;0494
+Ghestrokecyrillic;0492
+Gheupturncyrillic;0490
+Ghook;0193
+Gimarmenian;0533
+Gjecyrillic;0403
+Gmacron;1E20
+Gmonospace;FF27
+Grave;F6CE
+Gravesmall;F760
+Gsmall;F767
+Gsmallhook;029B
+Gstroke;01E4
+H;0048
+H18533;25CF
+H18543;25AA
+H18551;25AB
+H22073;25A1
+HPsquare;33CB
+Haabkhasiancyrillic;04A8
+Hadescendercyrillic;04B2
+Hardsigncyrillic;042A
+Hbar;0126
+Hbrevebelow;1E2A
+Hcedilla;1E28
+Hcircle;24BD
+Hcircumflex;0124
+Hdieresis;1E26
+Hdotaccent;1E22
+Hdotbelow;1E24
+Hmonospace;FF28
+Hoarmenian;0540
+Horicoptic;03E8
+Hsmall;F768
+Hungarumlaut;F6CF
+Hungarumlautsmall;F6F8
+Hzsquare;3390
+I;0049
+IAcyrillic;042F
+IJ;0132
+IUcyrillic;042E
+Iacute;00CD
+Iacutesmall;F7ED
+Ibreve;012C
+Icaron;01CF
+Icircle;24BE
+Icircumflex;00CE
+Icircumflexsmall;F7EE
+Icyrillic;0406
+Idblgrave;0208
+Idieresis;00CF
+Idieresisacute;1E2E
+Idieresiscyrillic;04E4
+Idieresissmall;F7EF
+Idot;0130
+Idotaccent;0130
+Idotbelow;1ECA
+Iebrevecyrillic;04D6
+Iecyrillic;0415
+Ifraktur;2111
+Igrave;00CC
+Igravesmall;F7EC
+Ihookabove;1EC8
+Iicyrillic;0418
+Iinvertedbreve;020A
+Iishortcyrillic;0419
+Imacron;012A
+Imacroncyrillic;04E2
+Imonospace;FF29
+Iniarmenian;053B
+Iocyrillic;0401
+Iogonek;012E
+Iota;0399
+Iotaafrican;0196
+Iotadieresis;03AA
+Iotatonos;038A
+Ismall;F769
+Istroke;0197
+Itilde;0128
+Itildebelow;1E2C
+Izhitsacyrillic;0474
+Izhitsadblgravecyrillic;0476
+J;004A
+Jaarmenian;0541
+Jcircle;24BF
+Jcircumflex;0134
+Jecyrillic;0408
+Jheharmenian;054B
+Jmonospace;FF2A
+Jsmall;F76A
+K;004B
+KBsquare;3385
+KKsquare;33CD
+Kabashkircyrillic;04A0
+Kacute;1E30
+Kacyrillic;041A
+Kadescendercyrillic;049A
+Kahookcyrillic;04C3
+Kappa;039A
+Kastrokecyrillic;049E
+Kaverticalstrokecyrillic;049C
+Kcaron;01E8
+Kcedilla;0136
+Kcircle;24C0
+Kcommaaccent;0136
+Kdotbelow;1E32
+Keharmenian;0554
+Kenarmenian;053F
+Khacyrillic;0425
+Kheicoptic;03E6
+Khook;0198
+Kjecyrillic;040C
+Klinebelow;1E34
+Kmonospace;FF2B
+Koppacyrillic;0480
+Koppagreek;03DE
+Ksicyrillic;046E
+Ksmall;F76B
+L;004C
+LJ;01C7
+LL;F6BF
+Lacute;0139
+Lambda;039B
+Lcaron;013D
+Lcedilla;013B
+Lcircle;24C1
+Lcircumflexbelow;1E3C
+Lcommaaccent;013B
+Ldot;013F
+Ldotaccent;013F
+Ldotbelow;1E36
+Ldotbelowmacron;1E38
+Liwnarmenian;053C
+Lj;01C8
+Ljecyrillic;0409
+Llinebelow;1E3A
+Lmonospace;FF2C
+Lslash;0141
+Lslashsmall;F6F9
+Lsmall;F76C
+M;004D
+MBsquare;3386
+Macron;F6D0
+Macronsmall;F7AF
+Macute;1E3E
+Mcircle;24C2
+Mdotaccent;1E40
+Mdotbelow;1E42
+Menarmenian;0544
+Mmonospace;FF2D
+Msmall;F76D
+Mturned;019C
+Mu;039C
+N;004E
+NJ;01CA
+Nacute;0143
+Ncaron;0147
+Ncedilla;0145
+Ncircle;24C3
+Ncircumflexbelow;1E4A
+Ncommaaccent;0145
+Ndotaccent;1E44
+Ndotbelow;1E46
+Nhookleft;019D
+Nineroman;2168
+Nj;01CB
+Njecyrillic;040A
+Nlinebelow;1E48
+Nmonospace;FF2E
+Nowarmenian;0546
+Nsmall;F76E
+Ntilde;00D1
+Ntildesmall;F7F1
+Nu;039D
+O;004F
+OE;0152
+OEsmall;F6FA
+Oacute;00D3
+Oacutesmall;F7F3
+Obarredcyrillic;04E8
+Obarreddieresiscyrillic;04EA
+Obreve;014E
+Ocaron;01D1
+Ocenteredtilde;019F
+Ocircle;24C4
+Ocircumflex;00D4
+Ocircumflexacute;1ED0
+Ocircumflexdotbelow;1ED8
+Ocircumflexgrave;1ED2
+Ocircumflexhookabove;1ED4
+Ocircumflexsmall;F7F4
+Ocircumflextilde;1ED6
+Ocyrillic;041E
+Odblacute;0150
+Odblgrave;020C
+Odieresis;00D6
+Odieresiscyrillic;04E6
+Odieresissmall;F7F6
+Odotbelow;1ECC
+Ogoneksmall;F6FB
+Ograve;00D2
+Ogravesmall;F7F2
+Oharmenian;0555
+Ohm;2126
+Ohookabove;1ECE
+Ohorn;01A0
+Ohornacute;1EDA
+Ohorndotbelow;1EE2
+Ohorngrave;1EDC
+Ohornhookabove;1EDE
+Ohorntilde;1EE0
+Ohungarumlaut;0150
+Oi;01A2
+Oinvertedbreve;020E
+Omacron;014C
+Omacronacute;1E52
+Omacrongrave;1E50
+Omega;2126
+Omegacyrillic;0460
+Omegagreek;03A9
+Omegaroundcyrillic;047A
+Omegatitlocyrillic;047C
+Omegatonos;038F
+Omicron;039F
+Omicrontonos;038C
+Omonospace;FF2F
+Oneroman;2160
+Oogonek;01EA
+Oogonekmacron;01EC
+Oopen;0186
+Oslash;00D8
+Oslashacute;01FE
+Oslashsmall;F7F8
+Osmall;F76F
+Ostrokeacute;01FE
+Otcyrillic;047E
+Otilde;00D5
+Otildeacute;1E4C
+Otildedieresis;1E4E
+Otildesmall;F7F5
+P;0050
+Pacute;1E54
+Pcircle;24C5
+Pdotaccent;1E56
+Pecyrillic;041F
+Peharmenian;054A
+Pemiddlehookcyrillic;04A6
+Phi;03A6
+Phook;01A4
+Pi;03A0
+Piwrarmenian;0553
+Pmonospace;FF30
+Psi;03A8
+Psicyrillic;0470
+Psmall;F770
+Q;0051
+Qcircle;24C6
+Qmonospace;FF31
+Qsmall;F771
+R;0052
+Raarmenian;054C
+Racute;0154
+Rcaron;0158
+Rcedilla;0156
+Rcircle;24C7
+Rcommaaccent;0156
+Rdblgrave;0210
+Rdotaccent;1E58
+Rdotbelow;1E5A
+Rdotbelowmacron;1E5C
+Reharmenian;0550
+Rfraktur;211C
+Rho;03A1
+Ringsmall;F6FC
+Rinvertedbreve;0212
+Rlinebelow;1E5E
+Rmonospace;FF32
+Rsmall;F772
+Rsmallinverted;0281
+Rsmallinvertedsuperior;02B6
+S;0053
+SF010000;250C
+SF020000;2514
+SF030000;2510
+SF040000;2518
+SF050000;253C
+SF060000;252C
+SF070000;2534
+SF080000;251C
+SF090000;2524
+SF100000;2500
+SF110000;2502
+SF190000;2561
+SF200000;2562
+SF210000;2556
+SF220000;2555
+SF230000;2563
+SF240000;2551
+SF250000;2557
+SF260000;255D
+SF270000;255C
+SF280000;255B
+SF360000;255E
+SF370000;255F
+SF380000;255A
+SF390000;2554
+SF400000;2569
+SF410000;2566
+SF420000;2560
+SF430000;2550
+SF440000;256C
+SF450000;2567
+SF460000;2568
+SF470000;2564
+SF480000;2565
+SF490000;2559
+SF500000;2558
+SF510000;2552
+SF520000;2553
+SF530000;256B
+SF540000;256A
+Sacute;015A
+Sacutedotaccent;1E64
+Sampigreek;03E0
+Scaron;0160
+Scarondotaccent;1E66
+Scaronsmall;F6FD
+Scedilla;015E
+Schwa;018F
+Schwacyrillic;04D8
+Schwadieresiscyrillic;04DA
+Scircle;24C8
+Scircumflex;015C
+Scommaaccent;0218
+Sdotaccent;1E60
+Sdotbelow;1E62
+Sdotbelowdotaccent;1E68
+Seharmenian;054D
+Sevenroman;2166
+Shaarmenian;0547
+Shacyrillic;0428
+Shchacyrillic;0429
+Sheicoptic;03E2
+Shhacyrillic;04BA
+Shimacoptic;03EC
+Sigma;03A3
+Sixroman;2165
+Smonospace;FF33
+Softsigncyrillic;042C
+Ssmall;F773
+Stigmagreek;03DA
+T;0054
+Tau;03A4
+Tbar;0166
+Tcaron;0164
+Tcedilla;0162
+Tcircle;24C9
+Tcircumflexbelow;1E70
+Tcommaaccent;0162
+Tdotaccent;1E6A
+Tdotbelow;1E6C
+Tecyrillic;0422
+Tedescendercyrillic;04AC
+Tenroman;2169
+Tetsecyrillic;04B4
+Theta;0398
+Thook;01AC
+Thorn;00DE
+Thornsmall;F7FE
+Threeroman;2162
+Tildesmall;F6FE
+Tiwnarmenian;054F
+Tlinebelow;1E6E
+Tmonospace;FF34
+Toarmenian;0539
+Tonefive;01BC
+Tonesix;0184
+Tonetwo;01A7
+Tretroflexhook;01AE
+Tsecyrillic;0426
+Tshecyrillic;040B
+Tsmall;F774
+Twelveroman;216B
+Tworoman;2161
+U;0055
+Uacute;00DA
+Uacutesmall;F7FA
+Ubreve;016C
+Ucaron;01D3
+Ucircle;24CA
+Ucircumflex;00DB
+Ucircumflexbelow;1E76
+Ucircumflexsmall;F7FB
+Ucyrillic;0423
+Udblacute;0170
+Udblgrave;0214
+Udieresis;00DC
+Udieresisacute;01D7
+Udieresisbelow;1E72
+Udieresiscaron;01D9
+Udieresiscyrillic;04F0
+Udieresisgrave;01DB
+Udieresismacron;01D5
+Udieresissmall;F7FC
+Udotbelow;1EE4
+Ugrave;00D9
+Ugravesmall;F7F9
+Uhookabove;1EE6
+Uhorn;01AF
+Uhornacute;1EE8
+Uhorndotbelow;1EF0
+Uhorngrave;1EEA
+Uhornhookabove;1EEC
+Uhorntilde;1EEE
+Uhungarumlaut;0170
+Uhungarumlautcyrillic;04F2
+Uinvertedbreve;0216
+Ukcyrillic;0478
+Umacron;016A
+Umacroncyrillic;04EE
+Umacrondieresis;1E7A
+Umonospace;FF35
+Uogonek;0172
+Upsilon;03A5
+Upsilon1;03D2
+Upsilonacutehooksymbolgreek;03D3
+Upsilonafrican;01B1
+Upsilondieresis;03AB
+Upsilondieresishooksymbolgreek;03D4
+Upsilonhooksymbol;03D2
+Upsilontonos;038E
+Uring;016E
+Ushortcyrillic;040E
+Usmall;F775
+Ustraightcyrillic;04AE
+Ustraightstrokecyrillic;04B0
+Utilde;0168
+Utildeacute;1E78
+Utildebelow;1E74
+V;0056
+Vcircle;24CB
+Vdotbelow;1E7E
+Vecyrillic;0412
+Vewarmenian;054E
+Vhook;01B2
+Vmonospace;FF36
+Voarmenian;0548
+Vsmall;F776
+Vtilde;1E7C
+W;0057
+Wacute;1E82
+Wcircle;24CC
+Wcircumflex;0174
+Wdieresis;1E84
+Wdotaccent;1E86
+Wdotbelow;1E88
+Wgrave;1E80
+Wmonospace;FF37
+Wsmall;F777
+X;0058
+Xcircle;24CD
+Xdieresis;1E8C
+Xdotaccent;1E8A
+Xeharmenian;053D
+Xi;039E
+Xmonospace;FF38
+Xsmall;F778
+Y;0059
+Yacute;00DD
+Yacutesmall;F7FD
+Yatcyrillic;0462
+Ycircle;24CE
+Ycircumflex;0176
+Ydieresis;0178
+Ydieresissmall;F7FF
+Ydotaccent;1E8E
+Ydotbelow;1EF4
+Yericyrillic;042B
+Yerudieresiscyrillic;04F8
+Ygrave;1EF2
+Yhook;01B3
+Yhookabove;1EF6
+Yiarmenian;0545
+Yicyrillic;0407
+Yiwnarmenian;0552
+Ymonospace;FF39
+Ysmall;F779
+Ytilde;1EF8
+Yusbigcyrillic;046A
+Yusbigiotifiedcyrillic;046C
+Yuslittlecyrillic;0466
+Yuslittleiotifiedcyrillic;0468
+Z;005A
+Zaarmenian;0536
+Zacute;0179
+Zcaron;017D
+Zcaronsmall;F6FF
+Zcircle;24CF
+Zcircumflex;1E90
+Zdot;017B
+Zdotaccent;017B
+Zdotbelow;1E92
+Zecyrillic;0417
+Zedescendercyrillic;0498
+Zedieresiscyrillic;04DE
+Zeta;0396
+Zhearmenian;053A
+Zhebrevecyrillic;04C1
+Zhecyrillic;0416
+Zhedescendercyrillic;0496
+Zhedieresiscyrillic;04DC
+Zlinebelow;1E94
+Zmonospace;FF3A
+Zsmall;F77A
+Zstroke;01B5
+a;0061
+aabengali;0986
+aacute;00E1
+aadeva;0906
+aagujarati;0A86
+aagurmukhi;0A06
+aamatragurmukhi;0A3E
+aarusquare;3303
+aavowelsignbengali;09BE
+aavowelsigndeva;093E
+aavowelsigngujarati;0ABE
+abbreviationmarkarmenian;055F
+abbreviationsigndeva;0970
+abengali;0985
+abopomofo;311A
+abreve;0103
+abreveacute;1EAF
+abrevecyrillic;04D1
+abrevedotbelow;1EB7
+abrevegrave;1EB1
+abrevehookabove;1EB3
+abrevetilde;1EB5
+acaron;01CE
+acircle;24D0
+acircumflex;00E2
+acircumflexacute;1EA5
+acircumflexdotbelow;1EAD
+acircumflexgrave;1EA7
+acircumflexhookabove;1EA9
+acircumflextilde;1EAB
+acute;00B4
+acutebelowcmb;0317
+acutecmb;0301
+acutecomb;0301
+acutedeva;0954
+acutelowmod;02CF
+acutetonecmb;0341
+acyrillic;0430
+adblgrave;0201
+addakgurmukhi;0A71
+adeva;0905
+adieresis;00E4
+adieresiscyrillic;04D3
+adieresismacron;01DF
+adotbelow;1EA1
+adotmacron;01E1
+ae;00E6
+aeacute;01FD
+aekorean;3150
+aemacron;01E3
+afii00208;2015
+afii08941;20A4
+afii10017;0410
+afii10018;0411
+afii10019;0412
+afii10020;0413
+afii10021;0414
+afii10022;0415
+afii10023;0401
+afii10024;0416
+afii10025;0417
+afii10026;0418
+afii10027;0419
+afii10028;041A
+afii10029;041B
+afii10030;041C
+afii10031;041D
+afii10032;041E
+afii10033;041F
+afii10034;0420
+afii10035;0421
+afii10036;0422
+afii10037;0423
+afii10038;0424
+afii10039;0425
+afii10040;0426
+afii10041;0427
+afii10042;0428
+afii10043;0429
+afii10044;042A
+afii10045;042B
+afii10046;042C
+afii10047;042D
+afii10048;042E
+afii10049;042F
+afii10050;0490
+afii10051;0402
+afii10052;0403
+afii10053;0404
+afii10054;0405
+afii10055;0406
+afii10056;0407
+afii10057;0408
+afii10058;0409
+afii10059;040A
+afii10060;040B
+afii10061;040C
+afii10062;040E
+afii10063;F6C4
+afii10064;F6C5
+afii10065;0430
+afii10066;0431
+afii10067;0432
+afii10068;0433
+afii10069;0434
+afii10070;0435
+afii10071;0451
+afii10072;0436
+afii10073;0437
+afii10074;0438
+afii10075;0439
+afii10076;043A
+afii10077;043B
+afii10078;043C
+afii10079;043D
+afii10080;043E
+afii10081;043F
+afii10082;0440
+afii10083;0441
+afii10084;0442
+afii10085;0443
+afii10086;0444
+afii10087;0445
+afii10088;0446
+afii10089;0447
+afii10090;0448
+afii10091;0449
+afii10092;044A
+afii10093;044B
+afii10094;044C
+afii10095;044D
+afii10096;044E
+afii10097;044F
+afii10098;0491
+afii10099;0452
+afii10100;0453
+afii10101;0454
+afii10102;0455
+afii10103;0456
+afii10104;0457
+afii10105;0458
+afii10106;0459
+afii10107;045A
+afii10108;045B
+afii10109;045C
+afii10110;045E
+afii10145;040F
+afii10146;0462
+afii10147;0472
+afii10148;0474
+afii10192;F6C6
+afii10193;045F
+afii10194;0463
+afii10195;0473
+afii10196;0475
+afii10831;F6C7
+afii10832;F6C8
+afii10846;04D9
+afii299;200E
+afii300;200F
+afii301;200D
+afii57381;066A
+afii57388;060C
+afii57392;0660
+afii57393;0661
+afii57394;0662
+afii57395;0663
+afii57396;0664
+afii57397;0665
+afii57398;0666
+afii57399;0667
+afii57400;0668
+afii57401;0669
+afii57403;061B
+afii57407;061F
+afii57409;0621
+afii57410;0622
+afii57411;0623
+afii57412;0624
+afii57413;0625
+afii57414;0626
+afii57415;0627
+afii57416;0628
+afii57417;0629
+afii57418;062A
+afii57419;062B
+afii57420;062C
+afii57421;062D
+afii57422;062E
+afii57423;062F
+afii57424;0630
+afii57425;0631
+afii57426;0632
+afii57427;0633
+afii57428;0634
+afii57429;0635
+afii57430;0636
+afii57431;0637
+afii57432;0638
+afii57433;0639
+afii57434;063A
+afii57440;0640
+afii57441;0641
+afii57442;0642
+afii57443;0643
+afii57444;0644
+afii57445;0645
+afii57446;0646
+afii57448;0648
+afii57449;0649
+afii57450;064A
+afii57451;064B
+afii57452;064C
+afii57453;064D
+afii57454;064E
+afii57455;064F
+afii57456;0650
+afii57457;0651
+afii57458;0652
+afii57470;0647
+afii57505;06A4
+afii57506;067E
+afii57507;0686
+afii57508;0698
+afii57509;06AF
+afii57511;0679
+afii57512;0688
+afii57513;0691
+afii57514;06BA
+afii57519;06D2
+afii57534;06D5
+afii57636;20AA
+afii57645;05BE
+afii57658;05C3
+afii57664;05D0
+afii57665;05D1
+afii57666;05D2
+afii57667;05D3
+afii57668;05D4
+afii57669;05D5
+afii57670;05D6
+afii57671;05D7
+afii57672;05D8
+afii57673;05D9
+afii57674;05DA
+afii57675;05DB
+afii57676;05DC
+afii57677;05DD
+afii57678;05DE
+afii57679;05DF
+afii57680;05E0
+afii57681;05E1
+afii57682;05E2
+afii57683;05E3
+afii57684;05E4
+afii57685;05E5
+afii57686;05E6
+afii57687;05E7
+afii57688;05E8
+afii57689;05E9
+afii57690;05EA
+afii57694;FB2A
+afii57695;FB2B
+afii57700;FB4B
+afii57705;FB1F
+afii57716;05F0
+afii57717;05F1
+afii57718;05F2
+afii57723;FB35
+afii57793;05B4
+afii57794;05B5
+afii57795;05B6
+afii57796;05BB
+afii57797;05B8
+afii57798;05B7
+afii57799;05B0
+afii57800;05B2
+afii57801;05B1
+afii57802;05B3
+afii57803;05C2
+afii57804;05C1
+afii57806;05B9
+afii57807;05BC
+afii57839;05BD
+afii57841;05BF
+afii57842;05C0
+afii57929;02BC
+afii61248;2105
+afii61289;2113
+afii61352;2116
+afii61573;202C
+afii61574;202D
+afii61575;202E
+afii61664;200C
+afii63167;066D
+afii64937;02BD
+agrave;00E0
+agujarati;0A85
+agurmukhi;0A05
+ahiragana;3042
+ahookabove;1EA3
+aibengali;0990
+aibopomofo;311E
+aideva;0910
+aiecyrillic;04D5
+aigujarati;0A90
+aigurmukhi;0A10
+aimatragurmukhi;0A48
+ainarabic;0639
+ainfinalarabic;FECA
+aininitialarabic;FECB
+ainmedialarabic;FECC
+ainvertedbreve;0203
+aivowelsignbengali;09C8
+aivowelsigndeva;0948
+aivowelsigngujarati;0AC8
+akatakana;30A2
+akatakanahalfwidth;FF71
+akorean;314F
+alef;05D0
+alefarabic;0627
+alefdageshhebrew;FB30
+aleffinalarabic;FE8E
+alefhamzaabovearabic;0623
+alefhamzaabovefinalarabic;FE84
+alefhamzabelowarabic;0625
+alefhamzabelowfinalarabic;FE88
+alefhebrew;05D0
+aleflamedhebrew;FB4F
+alefmaddaabovearabic;0622
+alefmaddaabovefinalarabic;FE82
+alefmaksuraarabic;0649
+alefmaksurafinalarabic;FEF0
+alefmaksurainitialarabic;FEF3
+alefmaksuramedialarabic;FEF4
+alefpatahhebrew;FB2E
+alefqamatshebrew;FB2F
+aleph;2135
+allequal;224C
+alpha;03B1
+alphatonos;03AC
+amacron;0101
+amonospace;FF41
+ampersand;0026
+ampersandmonospace;FF06
+ampersandsmall;F726
+amsquare;33C2
+anbopomofo;3122
+angbopomofo;3124
+angkhankhuthai;0E5A
+angle;2220
+anglebracketleft;3008
+anglebracketleftvertical;FE3F
+anglebracketright;3009
+anglebracketrightvertical;FE40
+angleleft;2329
+angleright;232A
+angstrom;212B
+anoteleia;0387
+anudattadeva;0952
+anusvarabengali;0982
+anusvaradeva;0902
+anusvaragujarati;0A82
+aogonek;0105
+apaatosquare;3300
+aparen;249C
+apostrophearmenian;055A
+apostrophemod;02BC
+apple;F8FF
+approaches;2250
+approxequal;2248
+approxequalorimage;2252
+approximatelyequal;2245
+araeaekorean;318E
+araeakorean;318D
+arc;2312
+arighthalfring;1E9A
+aring;00E5
+aringacute;01FB
+aringbelow;1E01
+arrowboth;2194
+arrowdashdown;21E3
+arrowdashleft;21E0
+arrowdashright;21E2
+arrowdashup;21E1
+arrowdblboth;21D4
+arrowdbldown;21D3
+arrowdblleft;21D0
+arrowdblright;21D2
+arrowdblup;21D1
+arrowdown;2193
+arrowdownleft;2199
+arrowdownright;2198
+arrowdownwhite;21E9
+arrowheaddownmod;02C5
+arrowheadleftmod;02C2
+arrowheadrightmod;02C3
+arrowheadupmod;02C4
+arrowhorizex;F8E7
+arrowleft;2190
+arrowleftdbl;21D0
+arrowleftdblstroke;21CD
+arrowleftoverright;21C6
+arrowleftwhite;21E6
+arrowright;2192
+arrowrightdblstroke;21CF
+arrowrightheavy;279E
+arrowrightoverleft;21C4
+arrowrightwhite;21E8
+arrowtableft;21E4
+arrowtabright;21E5
+arrowup;2191
+arrowupdn;2195
+arrowupdnbse;21A8
+arrowupdownbase;21A8
+arrowupleft;2196
+arrowupleftofdown;21C5
+arrowupright;2197
+arrowupwhite;21E7
+arrowvertex;F8E6
+asciicircum;005E
+asciicircummonospace;FF3E
+asciitilde;007E
+asciitildemonospace;FF5E
+ascript;0251
+ascriptturned;0252
+asmallhiragana;3041
+asmallkatakana;30A1
+asmallkatakanahalfwidth;FF67
+asterisk;002A
+asteriskaltonearabic;066D
+asteriskarabic;066D
+asteriskmath;2217
+asteriskmonospace;FF0A
+asterisksmall;FE61
+asterism;2042
+asuperior;F6E9
+asymptoticallyequal;2243
+at;0040
+atilde;00E3
+atmonospace;FF20
+atsmall;FE6B
+aturned;0250
+aubengali;0994
+aubopomofo;3120
+audeva;0914
+augujarati;0A94
+augurmukhi;0A14
+aulengthmarkbengali;09D7
+aumatragurmukhi;0A4C
+auvowelsignbengali;09CC
+auvowelsigndeva;094C
+auvowelsigngujarati;0ACC
+avagrahadeva;093D
+aybarmenian;0561
+ayin;05E2
+ayinaltonehebrew;FB20
+ayinhebrew;05E2
+b;0062
+babengali;09AC
+backslash;005C
+backslashmonospace;FF3C
+badeva;092C
+bagujarati;0AAC
+bagurmukhi;0A2C
+bahiragana;3070
+bahtthai;0E3F
+bakatakana;30D0
+bar;007C
+barmonospace;FF5C
+bbopomofo;3105
+bcircle;24D1
+bdotaccent;1E03
+bdotbelow;1E05
+beamedsixteenthnotes;266C
+because;2235
+becyrillic;0431
+beharabic;0628
+behfinalarabic;FE90
+behinitialarabic;FE91
+behiragana;3079
+behmedialarabic;FE92
+behmeeminitialarabic;FC9F
+behmeemisolatedarabic;FC08
+behnoonfinalarabic;FC6D
+bekatakana;30D9
+benarmenian;0562
+bet;05D1
+beta;03B2
+betasymbolgreek;03D0
+betdagesh;FB31
+betdageshhebrew;FB31
+bethebrew;05D1
+betrafehebrew;FB4C
+bhabengali;09AD
+bhadeva;092D
+bhagujarati;0AAD
+bhagurmukhi;0A2D
+bhook;0253
+bihiragana;3073
+bikatakana;30D3
+bilabialclick;0298
+bindigurmukhi;0A02
+birusquare;3331
+blackcircle;25CF
+blackdiamond;25C6
+blackdownpointingtriangle;25BC
+blackleftpointingpointer;25C4
+blackleftpointingtriangle;25C0
+blacklenticularbracketleft;3010
+blacklenticularbracketleftvertical;FE3B
+blacklenticularbracketright;3011
+blacklenticularbracketrightvertical;FE3C
+blacklowerlefttriangle;25E3
+blacklowerrighttriangle;25E2
+blackrectangle;25AC
+blackrightpointingpointer;25BA
+blackrightpointingtriangle;25B6
+blacksmallsquare;25AA
+blacksmilingface;263B
+blacksquare;25A0
+blackstar;2605
+blackupperlefttriangle;25E4
+blackupperrighttriangle;25E5
+blackuppointingsmalltriangle;25B4
+blackuppointingtriangle;25B2
+blank;2423
+blinebelow;1E07
+block;2588
+bmonospace;FF42
+bobaimaithai;0E1A
+bohiragana;307C
+bokatakana;30DC
+bparen;249D
+bqsquare;33C3
+braceex;F8F4
+braceleft;007B
+braceleftbt;F8F3
+braceleftmid;F8F2
+braceleftmonospace;FF5B
+braceleftsmall;FE5B
+bracelefttp;F8F1
+braceleftvertical;FE37
+braceright;007D
+bracerightbt;F8FE
+bracerightmid;F8FD
+bracerightmonospace;FF5D
+bracerightsmall;FE5C
+bracerighttp;F8FC
+bracerightvertical;FE38
+bracketleft;005B
+bracketleftbt;F8F0
+bracketleftex;F8EF
+bracketleftmonospace;FF3B
+bracketlefttp;F8EE
+bracketright;005D
+bracketrightbt;F8FB
+bracketrightex;F8FA
+bracketrightmonospace;FF3D
+bracketrighttp;F8F9
+breve;02D8
+brevebelowcmb;032E
+brevecmb;0306
+breveinvertedbelowcmb;032F
+breveinvertedcmb;0311
+breveinverteddoublecmb;0361
+bridgebelowcmb;032A
+bridgeinvertedbelowcmb;033A
+brokenbar;00A6
+bstroke;0180
+bsuperior;F6EA
+btopbar;0183
+buhiragana;3076
+bukatakana;30D6
+bullet;2022
+bulletinverse;25D8
+bulletoperator;2219
+bullseye;25CE
+c;0063
+caarmenian;056E
+cabengali;099A
+cacute;0107
+cadeva;091A
+cagujarati;0A9A
+cagurmukhi;0A1A
+calsquare;3388
+candrabindubengali;0981
+candrabinducmb;0310
+candrabindudeva;0901
+candrabindugujarati;0A81
+capslock;21EA
+careof;2105
+caron;02C7
+caronbelowcmb;032C
+caroncmb;030C
+carriagereturn;21B5
+cbopomofo;3118
+ccaron;010D
+ccedilla;00E7
+ccedillaacute;1E09
+ccircle;24D2
+ccircumflex;0109
+ccurl;0255
+cdot;010B
+cdotaccent;010B
+cdsquare;33C5
+cedilla;00B8
+cedillacmb;0327
+cent;00A2
+centigrade;2103
+centinferior;F6DF
+centmonospace;FFE0
+centoldstyle;F7A2
+centsuperior;F6E0
+chaarmenian;0579
+chabengali;099B
+chadeva;091B
+chagujarati;0A9B
+chagurmukhi;0A1B
+chbopomofo;3114
+cheabkhasiancyrillic;04BD
+checkmark;2713
+checyrillic;0447
+chedescenderabkhasiancyrillic;04BF
+chedescendercyrillic;04B7
+chedieresiscyrillic;04F5
+cheharmenian;0573
+chekhakassiancyrillic;04CC
+cheverticalstrokecyrillic;04B9
+chi;03C7
+chieuchacirclekorean;3277
+chieuchaparenkorean;3217
+chieuchcirclekorean;3269
+chieuchkorean;314A
+chieuchparenkorean;3209
+chochangthai;0E0A
+chochanthai;0E08
+chochingthai;0E09
+chochoethai;0E0C
+chook;0188
+cieucacirclekorean;3276
+cieucaparenkorean;3216
+cieuccirclekorean;3268
+cieuckorean;3148
+cieucparenkorean;3208
+cieucuparenkorean;321C
+circle;25CB
+circlemultiply;2297
+circleot;2299
+circleplus;2295
+circlepostalmark;3036
+circlewithlefthalfblack;25D0
+circlewithrighthalfblack;25D1
+circumflex;02C6
+circumflexbelowcmb;032D
+circumflexcmb;0302
+clear;2327
+clickalveolar;01C2
+clickdental;01C0
+clicklateral;01C1
+clickretroflex;01C3
+club;2663
+clubsuitblack;2663
+clubsuitwhite;2667
+cmcubedsquare;33A4
+cmonospace;FF43
+cmsquaredsquare;33A0
+coarmenian;0581
+colon;003A
+colonmonetary;20A1
+colonmonospace;FF1A
+colonsign;20A1
+colonsmall;FE55
+colontriangularhalfmod;02D1
+colontriangularmod;02D0
+comma;002C
+commaabovecmb;0313
+commaaboverightcmb;0315
+commaaccent;F6C3
+commaarabic;060C
+commaarmenian;055D
+commainferior;F6E1
+commamonospace;FF0C
+commareversedabovecmb;0314
+commareversedmod;02BD
+commasmall;FE50
+commasuperior;F6E2
+commaturnedabovecmb;0312
+commaturnedmod;02BB
+compass;263C
+congruent;2245
+contourintegral;222E
+control;2303
+controlACK;0006
+controlBEL;0007
+controlBS;0008
+controlCAN;0018
+controlCR;000D
+controlDC1;0011
+controlDC2;0012
+controlDC3;0013
+controlDC4;0014
+controlDEL;007F
+controlDLE;0010
+controlEM;0019
+controlENQ;0005
+controlEOT;0004
+controlESC;001B
+controlETB;0017
+controlETX;0003
+controlFF;000C
+controlFS;001C
+controlGS;001D
+controlHT;0009
+controlLF;000A
+controlNAK;0015
+controlRS;001E
+controlSI;000F
+controlSO;000E
+controlSOT;0002
+controlSTX;0001
+controlSUB;001A
+controlSYN;0016
+controlUS;001F
+controlVT;000B
+copyright;00A9
+copyrightsans;F8E9
+copyrightserif;F6D9
+cornerbracketleft;300C
+cornerbracketlefthalfwidth;FF62
+cornerbracketleftvertical;FE41
+cornerbracketright;300D
+cornerbracketrighthalfwidth;FF63
+cornerbracketrightvertical;FE42
+corporationsquare;337F
+cosquare;33C7
+coverkgsquare;33C6
+cparen;249E
+cruzeiro;20A2
+cstretched;0297
+curlyand;22CF
+curlyor;22CE
+currency;00A4
+cyrBreve;F6D1
+cyrFlex;F6D2
+cyrbreve;F6D4
+cyrflex;F6D5
+d;0064
+daarmenian;0564
+dabengali;09A6
+dadarabic;0636
+dadeva;0926
+dadfinalarabic;FEBE
+dadinitialarabic;FEBF
+dadmedialarabic;FEC0
+dagesh;05BC
+dageshhebrew;05BC
+dagger;2020
+daggerdbl;2021
+dagujarati;0AA6
+dagurmukhi;0A26
+dahiragana;3060
+dakatakana;30C0
+dalarabic;062F
+dalet;05D3
+daletdagesh;FB33
+daletdageshhebrew;FB33
+dalethatafpatah;05D3 05B2
+dalethatafpatahhebrew;05D3 05B2
+dalethatafsegol;05D3 05B1
+dalethatafsegolhebrew;05D3 05B1
+dalethebrew;05D3
+dalethiriq;05D3 05B4
+dalethiriqhebrew;05D3 05B4
+daletholam;05D3 05B9
+daletholamhebrew;05D3 05B9
+daletpatah;05D3 05B7
+daletpatahhebrew;05D3 05B7
+daletqamats;05D3 05B8
+daletqamatshebrew;05D3 05B8
+daletqubuts;05D3 05BB
+daletqubutshebrew;05D3 05BB
+daletsegol;05D3 05B6
+daletsegolhebrew;05D3 05B6
+daletsheva;05D3 05B0
+daletshevahebrew;05D3 05B0
+dalettsere;05D3 05B5
+dalettserehebrew;05D3 05B5
+dalfinalarabic;FEAA
+dammaarabic;064F
+dammalowarabic;064F
+dammatanaltonearabic;064C
+dammatanarabic;064C
+danda;0964
+dargahebrew;05A7
+dargalefthebrew;05A7
+dasiapneumatacyrilliccmb;0485
+dblGrave;F6D3
+dblanglebracketleft;300A
+dblanglebracketleftvertical;FE3D
+dblanglebracketright;300B
+dblanglebracketrightvertical;FE3E
+dblarchinvertedbelowcmb;032B
+dblarrowleft;21D4
+dblarrowright;21D2
+dbldanda;0965
+dblgrave;F6D6
+dblgravecmb;030F
+dblintegral;222C
+dbllowline;2017
+dbllowlinecmb;0333
+dbloverlinecmb;033F
+dblprimemod;02BA
+dblverticalbar;2016
+dblverticallineabovecmb;030E
+dbopomofo;3109
+dbsquare;33C8
+dcaron;010F
+dcedilla;1E11
+dcircle;24D3
+dcircumflexbelow;1E13
+dcroat;0111
+ddabengali;09A1
+ddadeva;0921
+ddagujarati;0AA1
+ddagurmukhi;0A21
+ddalarabic;0688
+ddalfinalarabic;FB89
+dddhadeva;095C
+ddhabengali;09A2
+ddhadeva;0922
+ddhagujarati;0AA2
+ddhagurmukhi;0A22
+ddotaccent;1E0B
+ddotbelow;1E0D
+decimalseparatorarabic;066B
+decimalseparatorpersian;066B
+decyrillic;0434
+degree;00B0
+dehihebrew;05AD
+dehiragana;3067
+deicoptic;03EF
+dekatakana;30C7
+deleteleft;232B
+deleteright;2326
+delta;03B4
+deltaturned;018D
+denominatorminusonenumeratorbengali;09F8
+dezh;02A4
+dhabengali;09A7
+dhadeva;0927
+dhagujarati;0AA7
+dhagurmukhi;0A27
+dhook;0257
+dialytikatonos;0385
+dialytikatonoscmb;0344
+diamond;2666
+diamondsuitwhite;2662
+dieresis;00A8
+dieresisacute;F6D7
+dieresisbelowcmb;0324
+dieresiscmb;0308
+dieresisgrave;F6D8
+dieresistonos;0385
+dihiragana;3062
+dikatakana;30C2
+dittomark;3003
+divide;00F7
+divides;2223
+divisionslash;2215
+djecyrillic;0452
+dkshade;2593
+dlinebelow;1E0F
+dlsquare;3397
+dmacron;0111
+dmonospace;FF44
+dnblock;2584
+dochadathai;0E0E
+dodekthai;0E14
+dohiragana;3069
+dokatakana;30C9
+dollar;0024
+dollarinferior;F6E3
+dollarmonospace;FF04
+dollaroldstyle;F724
+dollarsmall;FE69
+dollarsuperior;F6E4
+dong;20AB
+dorusquare;3326
+dotaccent;02D9
+dotaccentcmb;0307
+dotbelowcmb;0323
+dotbelowcomb;0323
+dotkatakana;30FB
+dotlessi;0131
+dotlessj;F6BE
+dotlessjstrokehook;0284
+dotmath;22C5
+dottedcircle;25CC
+doubleyodpatah;FB1F
+doubleyodpatahhebrew;FB1F
+downtackbelowcmb;031E
+downtackmod;02D5
+dparen;249F
+dsuperior;F6EB
+dtail;0256
+dtopbar;018C
+duhiragana;3065
+dukatakana;30C5
+dz;01F3
+dzaltone;02A3
+dzcaron;01C6
+dzcurl;02A5
+dzeabkhasiancyrillic;04E1
+dzecyrillic;0455
+dzhecyrillic;045F
+e;0065
+eacute;00E9
+earth;2641
+ebengali;098F
+ebopomofo;311C
+ebreve;0115
+ecandradeva;090D
+ecandragujarati;0A8D
+ecandravowelsigndeva;0945
+ecandravowelsigngujarati;0AC5
+ecaron;011B
+ecedillabreve;1E1D
+echarmenian;0565
+echyiwnarmenian;0587
+ecircle;24D4
+ecircumflex;00EA
+ecircumflexacute;1EBF
+ecircumflexbelow;1E19
+ecircumflexdotbelow;1EC7
+ecircumflexgrave;1EC1
+ecircumflexhookabove;1EC3
+ecircumflextilde;1EC5
+ecyrillic;0454
+edblgrave;0205
+edeva;090F
+edieresis;00EB
+edot;0117
+edotaccent;0117
+edotbelow;1EB9
+eegurmukhi;0A0F
+eematragurmukhi;0A47
+efcyrillic;0444
+egrave;00E8
+egujarati;0A8F
+eharmenian;0567
+ehbopomofo;311D
+ehiragana;3048
+ehookabove;1EBB
+eibopomofo;311F
+eight;0038
+eightarabic;0668
+eightbengali;09EE
+eightcircle;2467
+eightcircleinversesansserif;2791
+eightdeva;096E
+eighteencircle;2471
+eighteenparen;2485
+eighteenperiod;2499
+eightgujarati;0AEE
+eightgurmukhi;0A6E
+eighthackarabic;0668
+eighthangzhou;3028
+eighthnotebeamed;266B
+eightideographicparen;3227
+eightinferior;2088
+eightmonospace;FF18
+eightoldstyle;F738
+eightparen;247B
+eightperiod;248F
+eightpersian;06F8
+eightroman;2177
+eightsuperior;2078
+eightthai;0E58
+einvertedbreve;0207
+eiotifiedcyrillic;0465
+ekatakana;30A8
+ekatakanahalfwidth;FF74
+ekonkargurmukhi;0A74
+ekorean;3154
+elcyrillic;043B
+element;2208
+elevencircle;246A
+elevenparen;247E
+elevenperiod;2492
+elevenroman;217A
+ellipsis;2026
+ellipsisvertical;22EE
+emacron;0113
+emacronacute;1E17
+emacrongrave;1E15
+emcyrillic;043C
+emdash;2014
+emdashvertical;FE31
+emonospace;FF45
+emphasismarkarmenian;055B
+emptyset;2205
+enbopomofo;3123
+encyrillic;043D
+endash;2013
+endashvertical;FE32
+endescendercyrillic;04A3
+eng;014B
+engbopomofo;3125
+enghecyrillic;04A5
+enhookcyrillic;04C8
+enspace;2002
+eogonek;0119
+eokorean;3153
+eopen;025B
+eopenclosed;029A
+eopenreversed;025C
+eopenreversedclosed;025E
+eopenreversedhook;025D
+eparen;24A0
+epsilon;03B5
+epsilontonos;03AD
+equal;003D
+equalmonospace;FF1D
+equalsmall;FE66
+equalsuperior;207C
+equivalence;2261
+erbopomofo;3126
+ercyrillic;0440
+ereversed;0258
+ereversedcyrillic;044D
+escyrillic;0441
+esdescendercyrillic;04AB
+esh;0283
+eshcurl;0286
+eshortdeva;090E
+eshortvowelsigndeva;0946
+eshreversedloop;01AA
+eshsquatreversed;0285
+esmallhiragana;3047
+esmallkatakana;30A7
+esmallkatakanahalfwidth;FF6A
+estimated;212E
+esuperior;F6EC
+eta;03B7
+etarmenian;0568
+etatonos;03AE
+eth;00F0
+etilde;1EBD
+etildebelow;1E1B
+etnahtafoukhhebrew;0591
+etnahtafoukhlefthebrew;0591
+etnahtahebrew;0591
+etnahtalefthebrew;0591
+eturned;01DD
+eukorean;3161
+euro;20AC
+evowelsignbengali;09C7
+evowelsigndeva;0947
+evowelsigngujarati;0AC7
+exclam;0021
+exclamarmenian;055C
+exclamdbl;203C
+exclamdown;00A1
+exclamdownsmall;F7A1
+exclammonospace;FF01
+exclamsmall;F721
+existential;2203
+ezh;0292
+ezhcaron;01EF
+ezhcurl;0293
+ezhreversed;01B9
+ezhtail;01BA
+f;0066
+fadeva;095E
+fagurmukhi;0A5E
+fahrenheit;2109
+fathaarabic;064E
+fathalowarabic;064E
+fathatanarabic;064B
+fbopomofo;3108
+fcircle;24D5
+fdotaccent;1E1F
+feharabic;0641
+feharmenian;0586
+fehfinalarabic;FED2
+fehinitialarabic;FED3
+fehmedialarabic;FED4
+feicoptic;03E5
+female;2640
+ff;FB00
+ffi;FB03
+ffl;FB04
+fi;FB01
+fifteencircle;246E
+fifteenparen;2482
+fifteenperiod;2496
+figuredash;2012
+filledbox;25A0
+filledrect;25AC
+finalkaf;05DA
+finalkafdagesh;FB3A
+finalkafdageshhebrew;FB3A
+finalkafhebrew;05DA
+finalkafqamats;05DA 05B8
+finalkafqamatshebrew;05DA 05B8
+finalkafsheva;05DA 05B0
+finalkafshevahebrew;05DA 05B0
+finalmem;05DD
+finalmemhebrew;05DD
+finalnun;05DF
+finalnunhebrew;05DF
+finalpe;05E3
+finalpehebrew;05E3
+finaltsadi;05E5
+finaltsadihebrew;05E5
+firsttonechinese;02C9
+fisheye;25C9
+fitacyrillic;0473
+five;0035
+fivearabic;0665
+fivebengali;09EB
+fivecircle;2464
+fivecircleinversesansserif;278E
+fivedeva;096B
+fiveeighths;215D
+fivegujarati;0AEB
+fivegurmukhi;0A6B
+fivehackarabic;0665
+fivehangzhou;3025
+fiveideographicparen;3224
+fiveinferior;2085
+fivemonospace;FF15
+fiveoldstyle;F735
+fiveparen;2478
+fiveperiod;248C
+fivepersian;06F5
+fiveroman;2174
+fivesuperior;2075
+fivethai;0E55
+fl;FB02
+florin;0192
+fmonospace;FF46
+fmsquare;3399
+fofanthai;0E1F
+fofathai;0E1D
+fongmanthai;0E4F
+forall;2200
+four;0034
+fourarabic;0664
+fourbengali;09EA
+fourcircle;2463
+fourcircleinversesansserif;278D
+fourdeva;096A
+fourgujarati;0AEA
+fourgurmukhi;0A6A
+fourhackarabic;0664
+fourhangzhou;3024
+fourideographicparen;3223
+fourinferior;2084
+fourmonospace;FF14
+fournumeratorbengali;09F7
+fouroldstyle;F734
+fourparen;2477
+fourperiod;248B
+fourpersian;06F4
+fourroman;2173
+foursuperior;2074
+fourteencircle;246D
+fourteenparen;2481
+fourteenperiod;2495
+fourthai;0E54
+fourthtonechinese;02CB
+fparen;24A1
+fraction;2044
+franc;20A3
+g;0067
+gabengali;0997
+gacute;01F5
+gadeva;0917
+gafarabic;06AF
+gaffinalarabic;FB93
+gafinitialarabic;FB94
+gafmedialarabic;FB95
+gagujarati;0A97
+gagurmukhi;0A17
+gahiragana;304C
+gakatakana;30AC
+gamma;03B3
+gammalatinsmall;0263
+gammasuperior;02E0
+gangiacoptic;03EB
+gbopomofo;310D
+gbreve;011F
+gcaron;01E7
+gcedilla;0123
+gcircle;24D6
+gcircumflex;011D
+gcommaaccent;0123
+gdot;0121
+gdotaccent;0121
+gecyrillic;0433
+gehiragana;3052
+gekatakana;30B2
+geometricallyequal;2251
+gereshaccenthebrew;059C
+gereshhebrew;05F3
+gereshmuqdamhebrew;059D
+germandbls;00DF
+gershayimaccenthebrew;059E
+gershayimhebrew;05F4
+getamark;3013
+ghabengali;0998
+ghadarmenian;0572
+ghadeva;0918
+ghagujarati;0A98
+ghagurmukhi;0A18
+ghainarabic;063A
+ghainfinalarabic;FECE
+ghaininitialarabic;FECF
+ghainmedialarabic;FED0
+ghemiddlehookcyrillic;0495
+ghestrokecyrillic;0493
+gheupturncyrillic;0491
+ghhadeva;095A
+ghhagurmukhi;0A5A
+ghook;0260
+ghzsquare;3393
+gihiragana;304E
+gikatakana;30AE
+gimarmenian;0563
+gimel;05D2
+gimeldagesh;FB32
+gimeldageshhebrew;FB32
+gimelhebrew;05D2
+gjecyrillic;0453
+glottalinvertedstroke;01BE
+glottalstop;0294
+glottalstopinverted;0296
+glottalstopmod;02C0
+glottalstopreversed;0295
+glottalstopreversedmod;02C1
+glottalstopreversedsuperior;02E4
+glottalstopstroke;02A1
+glottalstopstrokereversed;02A2
+gmacron;1E21
+gmonospace;FF47
+gohiragana;3054
+gokatakana;30B4
+gparen;24A2
+gpasquare;33AC
+gradient;2207
+grave;0060
+gravebelowcmb;0316
+gravecmb;0300
+gravecomb;0300
+gravedeva;0953
+gravelowmod;02CE
+gravemonospace;FF40
+gravetonecmb;0340
+greater;003E
+greaterequal;2265
+greaterequalorless;22DB
+greatermonospace;FF1E
+greaterorequivalent;2273
+greaterorless;2277
+greateroverequal;2267
+greatersmall;FE65
+gscript;0261
+gstroke;01E5
+guhiragana;3050
+guillemotleft;00AB
+guillemotright;00BB
+guilsinglleft;2039
+guilsinglright;203A
+gukatakana;30B0
+guramusquare;3318
+gysquare;33C9
+h;0068
+haabkhasiancyrillic;04A9
+haaltonearabic;06C1
+habengali;09B9
+hadescendercyrillic;04B3
+hadeva;0939
+hagujarati;0AB9
+hagurmukhi;0A39
+haharabic;062D
+hahfinalarabic;FEA2
+hahinitialarabic;FEA3
+hahiragana;306F
+hahmedialarabic;FEA4
+haitusquare;332A
+hakatakana;30CF
+hakatakanahalfwidth;FF8A
+halantgurmukhi;0A4D
+hamzaarabic;0621
+hamzadammaarabic;0621 064F
+hamzadammatanarabic;0621 064C
+hamzafathaarabic;0621 064E
+hamzafathatanarabic;0621 064B
+hamzalowarabic;0621
+hamzalowkasraarabic;0621 0650
+hamzalowkasratanarabic;0621 064D
+hamzasukunarabic;0621 0652
+hangulfiller;3164
+hardsigncyrillic;044A
+harpoonleftbarbup;21BC
+harpoonrightbarbup;21C0
+hasquare;33CA
+hatafpatah;05B2
+hatafpatah16;05B2
+hatafpatah23;05B2
+hatafpatah2f;05B2
+hatafpatahhebrew;05B2
+hatafpatahnarrowhebrew;05B2
+hatafpatahquarterhebrew;05B2
+hatafpatahwidehebrew;05B2
+hatafqamats;05B3
+hatafqamats1b;05B3
+hatafqamats28;05B3
+hatafqamats34;05B3
+hatafqamatshebrew;05B3
+hatafqamatsnarrowhebrew;05B3
+hatafqamatsquarterhebrew;05B3
+hatafqamatswidehebrew;05B3
+hatafsegol;05B1
+hatafsegol17;05B1
+hatafsegol24;05B1
+hatafsegol30;05B1
+hatafsegolhebrew;05B1
+hatafsegolnarrowhebrew;05B1
+hatafsegolquarterhebrew;05B1
+hatafsegolwidehebrew;05B1
+hbar;0127
+hbopomofo;310F
+hbrevebelow;1E2B
+hcedilla;1E29
+hcircle;24D7
+hcircumflex;0125
+hdieresis;1E27
+hdotaccent;1E23
+hdotbelow;1E25
+he;05D4
+heart;2665
+heartsuitblack;2665
+heartsuitwhite;2661
+hedagesh;FB34
+hedageshhebrew;FB34
+hehaltonearabic;06C1
+heharabic;0647
+hehebrew;05D4
+hehfinalaltonearabic;FBA7
+hehfinalalttwoarabic;FEEA
+hehfinalarabic;FEEA
+hehhamzaabovefinalarabic;FBA5
+hehhamzaaboveisolatedarabic;FBA4
+hehinitialaltonearabic;FBA8
+hehinitialarabic;FEEB
+hehiragana;3078
+hehmedialaltonearabic;FBA9
+hehmedialarabic;FEEC
+heiseierasquare;337B
+hekatakana;30D8
+hekatakanahalfwidth;FF8D
+hekutaarusquare;3336
+henghook;0267
+herutusquare;3339
+het;05D7
+hethebrew;05D7
+hhook;0266
+hhooksuperior;02B1
+hieuhacirclekorean;327B
+hieuhaparenkorean;321B
+hieuhcirclekorean;326D
+hieuhkorean;314E
+hieuhparenkorean;320D
+hihiragana;3072
+hikatakana;30D2
+hikatakanahalfwidth;FF8B
+hiriq;05B4
+hiriq14;05B4
+hiriq21;05B4
+hiriq2d;05B4
+hiriqhebrew;05B4
+hiriqnarrowhebrew;05B4
+hiriqquarterhebrew;05B4
+hiriqwidehebrew;05B4
+hlinebelow;1E96
+hmonospace;FF48
+hoarmenian;0570
+hohipthai;0E2B
+hohiragana;307B
+hokatakana;30DB
+hokatakanahalfwidth;FF8E
+holam;05B9
+holam19;05B9
+holam26;05B9
+holam32;05B9
+holamhebrew;05B9
+holamnarrowhebrew;05B9
+holamquarterhebrew;05B9
+holamwidehebrew;05B9
+honokhukthai;0E2E
+hookabovecomb;0309
+hookcmb;0309
+hookpalatalizedbelowcmb;0321
+hookretroflexbelowcmb;0322
+hoonsquare;3342
+horicoptic;03E9
+horizontalbar;2015
+horncmb;031B
+hotsprings;2668
+house;2302
+hparen;24A3
+hsuperior;02B0
+hturned;0265
+huhiragana;3075
+huiitosquare;3333
+hukatakana;30D5
+hukatakanahalfwidth;FF8C
+hungarumlaut;02DD
+hungarumlautcmb;030B
+hv;0195
+hyphen;002D
+hypheninferior;F6E5
+hyphenmonospace;FF0D
+hyphensmall;FE63
+hyphensuperior;F6E6
+hyphentwo;2010
+i;0069
+iacute;00ED
+iacyrillic;044F
+ibengali;0987
+ibopomofo;3127
+ibreve;012D
+icaron;01D0
+icircle;24D8
+icircumflex;00EE
+icyrillic;0456
+idblgrave;0209
+ideographearthcircle;328F
+ideographfirecircle;328B
+ideographicallianceparen;323F
+ideographiccallparen;323A
+ideographiccentrecircle;32A5
+ideographicclose;3006
+ideographiccomma;3001
+ideographiccommaleft;FF64
+ideographiccongratulationparen;3237
+ideographiccorrectcircle;32A3
+ideographicearthparen;322F
+ideographicenterpriseparen;323D
+ideographicexcellentcircle;329D
+ideographicfestivalparen;3240
+ideographicfinancialcircle;3296
+ideographicfinancialparen;3236
+ideographicfireparen;322B
+ideographichaveparen;3232
+ideographichighcircle;32A4
+ideographiciterationmark;3005
+ideographiclaborcircle;3298
+ideographiclaborparen;3238
+ideographicleftcircle;32A7
+ideographiclowcircle;32A6
+ideographicmedicinecircle;32A9
+ideographicmetalparen;322E
+ideographicmoonparen;322A
+ideographicnameparen;3234
+ideographicperiod;3002
+ideographicprintcircle;329E
+ideographicreachparen;3243
+ideographicrepresentparen;3239
+ideographicresourceparen;323E
+ideographicrightcircle;32A8
+ideographicsecretcircle;3299
+ideographicselfparen;3242
+ideographicsocietyparen;3233
+ideographicspace;3000
+ideographicspecialparen;3235
+ideographicstockparen;3231
+ideographicstudyparen;323B
+ideographicsunparen;3230
+ideographicsuperviseparen;323C
+ideographicwaterparen;322C
+ideographicwoodparen;322D
+ideographiczero;3007
+ideographmetalcircle;328E
+ideographmooncircle;328A
+ideographnamecircle;3294
+ideographsuncircle;3290
+ideographwatercircle;328C
+ideographwoodcircle;328D
+ideva;0907
+idieresis;00EF
+idieresisacute;1E2F
+idieresiscyrillic;04E5
+idotbelow;1ECB
+iebrevecyrillic;04D7
+iecyrillic;0435
+ieungacirclekorean;3275
+ieungaparenkorean;3215
+ieungcirclekorean;3267
+ieungkorean;3147
+ieungparenkorean;3207
+igrave;00EC
+igujarati;0A87
+igurmukhi;0A07
+ihiragana;3044
+ihookabove;1EC9
+iibengali;0988
+iicyrillic;0438
+iideva;0908
+iigujarati;0A88
+iigurmukhi;0A08
+iimatragurmukhi;0A40
+iinvertedbreve;020B
+iishortcyrillic;0439
+iivowelsignbengali;09C0
+iivowelsigndeva;0940
+iivowelsigngujarati;0AC0
+ij;0133
+ikatakana;30A4
+ikatakanahalfwidth;FF72
+ikorean;3163
+ilde;02DC
+iluyhebrew;05AC
+imacron;012B
+imacroncyrillic;04E3
+imageorapproximatelyequal;2253
+imatragurmukhi;0A3F
+imonospace;FF49
+increment;2206
+infinity;221E
+iniarmenian;056B
+integral;222B
+integralbottom;2321
+integralbt;2321
+integralex;F8F5
+integraltop;2320
+integraltp;2320
+intersection;2229
+intisquare;3305
+invbullet;25D8
+invcircle;25D9
+invsmileface;263B
+iocyrillic;0451
+iogonek;012F
+iota;03B9
+iotadieresis;03CA
+iotadieresistonos;0390
+iotalatin;0269
+iotatonos;03AF
+iparen;24A4
+irigurmukhi;0A72
+ismallhiragana;3043
+ismallkatakana;30A3
+ismallkatakanahalfwidth;FF68
+issharbengali;09FA
+istroke;0268
+isuperior;F6ED
+iterationhiragana;309D
+iterationkatakana;30FD
+itilde;0129
+itildebelow;1E2D
+iubopomofo;3129
+iucyrillic;044E
+ivowelsignbengali;09BF
+ivowelsigndeva;093F
+ivowelsigngujarati;0ABF
+izhitsacyrillic;0475
+izhitsadblgravecyrillic;0477
+j;006A
+jaarmenian;0571
+jabengali;099C
+jadeva;091C
+jagujarati;0A9C
+jagurmukhi;0A1C
+jbopomofo;3110
+jcaron;01F0
+jcircle;24D9
+jcircumflex;0135
+jcrossedtail;029D
+jdotlessstroke;025F
+jecyrillic;0458
+jeemarabic;062C
+jeemfinalarabic;FE9E
+jeeminitialarabic;FE9F
+jeemmedialarabic;FEA0
+jeharabic;0698
+jehfinalarabic;FB8B
+jhabengali;099D
+jhadeva;091D
+jhagujarati;0A9D
+jhagurmukhi;0A1D
+jheharmenian;057B
+jis;3004
+jmonospace;FF4A
+jparen;24A5
+jsuperior;02B2
+k;006B
+kabashkircyrillic;04A1
+kabengali;0995
+kacute;1E31
+kacyrillic;043A
+kadescendercyrillic;049B
+kadeva;0915
+kaf;05DB
+kafarabic;0643
+kafdagesh;FB3B
+kafdageshhebrew;FB3B
+kaffinalarabic;FEDA
+kafhebrew;05DB
+kafinitialarabic;FEDB
+kafmedialarabic;FEDC
+kafrafehebrew;FB4D
+kagujarati;0A95
+kagurmukhi;0A15
+kahiragana;304B
+kahookcyrillic;04C4
+kakatakana;30AB
+kakatakanahalfwidth;FF76
+kappa;03BA
+kappasymbolgreek;03F0
+kapyeounmieumkorean;3171
+kapyeounphieuphkorean;3184
+kapyeounpieupkorean;3178
+kapyeounssangpieupkorean;3179
+karoriisquare;330D
+kashidaautoarabic;0640
+kashidaautonosidebearingarabic;0640
+kasmallkatakana;30F5
+kasquare;3384
+kasraarabic;0650
+kasratanarabic;064D
+kastrokecyrillic;049F
+katahiraprolongmarkhalfwidth;FF70
+kaverticalstrokecyrillic;049D
+kbopomofo;310E
+kcalsquare;3389
+kcaron;01E9
+kcedilla;0137
+kcircle;24DA
+kcommaaccent;0137
+kdotbelow;1E33
+keharmenian;0584
+kehiragana;3051
+kekatakana;30B1
+kekatakanahalfwidth;FF79
+kenarmenian;056F
+kesmallkatakana;30F6
+kgreenlandic;0138
+khabengali;0996
+khacyrillic;0445
+khadeva;0916
+khagujarati;0A96
+khagurmukhi;0A16
+khaharabic;062E
+khahfinalarabic;FEA6
+khahinitialarabic;FEA7
+khahmedialarabic;FEA8
+kheicoptic;03E7
+khhadeva;0959
+khhagurmukhi;0A59
+khieukhacirclekorean;3278
+khieukhaparenkorean;3218
+khieukhcirclekorean;326A
+khieukhkorean;314B
+khieukhparenkorean;320A
+khokhaithai;0E02
+khokhonthai;0E05
+khokhuatthai;0E03
+khokhwaithai;0E04
+khomutthai;0E5B
+khook;0199
+khorakhangthai;0E06
+khzsquare;3391
+kihiragana;304D
+kikatakana;30AD
+kikatakanahalfwidth;FF77
+kiroguramusquare;3315
+kiromeetorusquare;3316
+kirosquare;3314
+kiyeokacirclekorean;326E
+kiyeokaparenkorean;320E
+kiyeokcirclekorean;3260
+kiyeokkorean;3131
+kiyeokparenkorean;3200
+kiyeoksioskorean;3133
+kjecyrillic;045C
+klinebelow;1E35
+klsquare;3398
+kmcubedsquare;33A6
+kmonospace;FF4B
+kmsquaredsquare;33A2
+kohiragana;3053
+kohmsquare;33C0
+kokaithai;0E01
+kokatakana;30B3
+kokatakanahalfwidth;FF7A
+kooposquare;331E
+koppacyrillic;0481
+koreanstandardsymbol;327F
+koroniscmb;0343
+kparen;24A6
+kpasquare;33AA
+ksicyrillic;046F
+ktsquare;33CF
+kturned;029E
+kuhiragana;304F
+kukatakana;30AF
+kukatakanahalfwidth;FF78
+kvsquare;33B8
+kwsquare;33BE
+l;006C
+labengali;09B2
+lacute;013A
+ladeva;0932
+lagujarati;0AB2
+lagurmukhi;0A32
+lakkhangyaothai;0E45
+lamaleffinalarabic;FEFC
+lamalefhamzaabovefinalarabic;FEF8
+lamalefhamzaaboveisolatedarabic;FEF7
+lamalefhamzabelowfinalarabic;FEFA
+lamalefhamzabelowisolatedarabic;FEF9
+lamalefisolatedarabic;FEFB
+lamalefmaddaabovefinalarabic;FEF6
+lamalefmaddaaboveisolatedarabic;FEF5
+lamarabic;0644
+lambda;03BB
+lambdastroke;019B
+lamed;05DC
+lameddagesh;FB3C
+lameddageshhebrew;FB3C
+lamedhebrew;05DC
+lamedholam;05DC 05B9
+lamedholamdagesh;05DC 05B9 05BC
+lamedholamdageshhebrew;05DC 05B9 05BC
+lamedholamhebrew;05DC 05B9
+lamfinalarabic;FEDE
+lamhahinitialarabic;FCCA
+laminitialarabic;FEDF
+lamjeeminitialarabic;FCC9
+lamkhahinitialarabic;FCCB
+lamlamhehisolatedarabic;FDF2
+lammedialarabic;FEE0
+lammeemhahinitialarabic;FD88
+lammeeminitialarabic;FCCC
+lammeemjeeminitialarabic;FEDF FEE4 FEA0
+lammeemkhahinitialarabic;FEDF FEE4 FEA8
+largecircle;25EF
+lbar;019A
+lbelt;026C
+lbopomofo;310C
+lcaron;013E
+lcedilla;013C
+lcircle;24DB
+lcircumflexbelow;1E3D
+lcommaaccent;013C
+ldot;0140
+ldotaccent;0140
+ldotbelow;1E37
+ldotbelowmacron;1E39
+leftangleabovecmb;031A
+lefttackbelowcmb;0318
+less;003C
+lessequal;2264
+lessequalorgreater;22DA
+lessmonospace;FF1C
+lessorequivalent;2272
+lessorgreater;2276
+lessoverequal;2266
+lesssmall;FE64
+lezh;026E
+lfblock;258C
+lhookretroflex;026D
+lira;20A4
+liwnarmenian;056C
+lj;01C9
+ljecyrillic;0459
+ll;F6C0
+lladeva;0933
+llagujarati;0AB3
+llinebelow;1E3B
+llladeva;0934
+llvocalicbengali;09E1
+llvocalicdeva;0961
+llvocalicvowelsignbengali;09E3
+llvocalicvowelsigndeva;0963
+lmiddletilde;026B
+lmonospace;FF4C
+lmsquare;33D0
+lochulathai;0E2C
+logicaland;2227
+logicalnot;00AC
+logicalnotreversed;2310
+logicalor;2228
+lolingthai;0E25
+longs;017F
+lowlinecenterline;FE4E
+lowlinecmb;0332
+lowlinedashed;FE4D
+lozenge;25CA
+lparen;24A7
+lslash;0142
+lsquare;2113
+lsuperior;F6EE
+ltshade;2591
+luthai;0E26
+lvocalicbengali;098C
+lvocalicdeva;090C
+lvocalicvowelsignbengali;09E2
+lvocalicvowelsigndeva;0962
+lxsquare;33D3
+m;006D
+mabengali;09AE
+macron;00AF
+macronbelowcmb;0331
+macroncmb;0304
+macronlowmod;02CD
+macronmonospace;FFE3
+macute;1E3F
+madeva;092E
+magujarati;0AAE
+magurmukhi;0A2E
+mahapakhhebrew;05A4
+mahapakhlefthebrew;05A4
+mahiragana;307E
+maichattawalowleftthai;F895
+maichattawalowrightthai;F894
+maichattawathai;0E4B
+maichattawaupperleftthai;F893
+maieklowleftthai;F88C
+maieklowrightthai;F88B
+maiekthai;0E48
+maiekupperleftthai;F88A
+maihanakatleftthai;F884
+maihanakatthai;0E31
+maitaikhuleftthai;F889
+maitaikhuthai;0E47
+maitholowleftthai;F88F
+maitholowrightthai;F88E
+maithothai;0E49
+maithoupperleftthai;F88D
+maitrilowleftthai;F892
+maitrilowrightthai;F891
+maitrithai;0E4A
+maitriupperleftthai;F890
+maiyamokthai;0E46
+makatakana;30DE
+makatakanahalfwidth;FF8F
+male;2642
+mansyonsquare;3347
+maqafhebrew;05BE
+mars;2642
+masoracirclehebrew;05AF
+masquare;3383
+mbopomofo;3107
+mbsquare;33D4
+mcircle;24DC
+mcubedsquare;33A5
+mdotaccent;1E41
+mdotbelow;1E43
+meemarabic;0645
+meemfinalarabic;FEE2
+meeminitialarabic;FEE3
+meemmedialarabic;FEE4
+meemmeeminitialarabic;FCD1
+meemmeemisolatedarabic;FC48
+meetorusquare;334D
+mehiragana;3081
+meizierasquare;337E
+mekatakana;30E1
+mekatakanahalfwidth;FF92
+mem;05DE
+memdagesh;FB3E
+memdageshhebrew;FB3E
+memhebrew;05DE
+menarmenian;0574
+merkhahebrew;05A5
+merkhakefulahebrew;05A6
+merkhakefulalefthebrew;05A6
+merkhalefthebrew;05A5
+mhook;0271
+mhzsquare;3392
+middledotkatakanahalfwidth;FF65
+middot;00B7
+mieumacirclekorean;3272
+mieumaparenkorean;3212
+mieumcirclekorean;3264
+mieumkorean;3141
+mieumpansioskorean;3170
+mieumparenkorean;3204
+mieumpieupkorean;316E
+mieumsioskorean;316F
+mihiragana;307F
+mikatakana;30DF
+mikatakanahalfwidth;FF90
+minus;2212
+minusbelowcmb;0320
+minuscircle;2296
+minusmod;02D7
+minusplus;2213
+minute;2032
+miribaarusquare;334A
+mirisquare;3349
+mlonglegturned;0270
+mlsquare;3396
+mmcubedsquare;33A3
+mmonospace;FF4D
+mmsquaredsquare;339F
+mohiragana;3082
+mohmsquare;33C1
+mokatakana;30E2
+mokatakanahalfwidth;FF93
+molsquare;33D6
+momathai;0E21
+moverssquare;33A7
+moverssquaredsquare;33A8
+mparen;24A8
+mpasquare;33AB
+mssquare;33B3
+msuperior;F6EF
+mturned;026F
+mu;00B5
+mu1;00B5
+muasquare;3382
+muchgreater;226B
+muchless;226A
+mufsquare;338C
+mugreek;03BC
+mugsquare;338D
+muhiragana;3080
+mukatakana;30E0
+mukatakanahalfwidth;FF91
+mulsquare;3395
+multiply;00D7
+mumsquare;339B
+munahhebrew;05A3
+munahlefthebrew;05A3
+musicalnote;266A
+musicalnotedbl;266B
+musicflatsign;266D
+musicsharpsign;266F
+mussquare;33B2
+muvsquare;33B6
+muwsquare;33BC
+mvmegasquare;33B9
+mvsquare;33B7
+mwmegasquare;33BF
+mwsquare;33BD
+n;006E
+nabengali;09A8
+nabla;2207
+nacute;0144
+nadeva;0928
+nagujarati;0AA8
+nagurmukhi;0A28
+nahiragana;306A
+nakatakana;30CA
+nakatakanahalfwidth;FF85
+napostrophe;0149
+nasquare;3381
+nbopomofo;310B
+nbspace;00A0
+ncaron;0148
+ncedilla;0146
+ncircle;24DD
+ncircumflexbelow;1E4B
+ncommaaccent;0146
+ndotaccent;1E45
+ndotbelow;1E47
+nehiragana;306D
+nekatakana;30CD
+nekatakanahalfwidth;FF88
+newsheqelsign;20AA
+nfsquare;338B
+ngabengali;0999
+ngadeva;0919
+ngagujarati;0A99
+ngagurmukhi;0A19
+ngonguthai;0E07
+nhiragana;3093
+nhookleft;0272
+nhookretroflex;0273
+nieunacirclekorean;326F
+nieunaparenkorean;320F
+nieuncieuckorean;3135
+nieuncirclekorean;3261
+nieunhieuhkorean;3136
+nieunkorean;3134
+nieunpansioskorean;3168
+nieunparenkorean;3201
+nieunsioskorean;3167
+nieuntikeutkorean;3166
+nihiragana;306B
+nikatakana;30CB
+nikatakanahalfwidth;FF86
+nikhahitleftthai;F899
+nikhahitthai;0E4D
+nine;0039
+ninearabic;0669
+ninebengali;09EF
+ninecircle;2468
+ninecircleinversesansserif;2792
+ninedeva;096F
+ninegujarati;0AEF
+ninegurmukhi;0A6F
+ninehackarabic;0669
+ninehangzhou;3029
+nineideographicparen;3228
+nineinferior;2089
+ninemonospace;FF19
+nineoldstyle;F739
+nineparen;247C
+nineperiod;2490
+ninepersian;06F9
+nineroman;2178
+ninesuperior;2079
+nineteencircle;2472
+nineteenparen;2486
+nineteenperiod;249A
+ninethai;0E59
+nj;01CC
+njecyrillic;045A
+nkatakana;30F3
+nkatakanahalfwidth;FF9D
+nlegrightlong;019E
+nlinebelow;1E49
+nmonospace;FF4E
+nmsquare;339A
+nnabengali;09A3
+nnadeva;0923
+nnagujarati;0AA3
+nnagurmukhi;0A23
+nnnadeva;0929
+nohiragana;306E
+nokatakana;30CE
+nokatakanahalfwidth;FF89
+nonbreakingspace;00A0
+nonenthai;0E13
+nonuthai;0E19
+noonarabic;0646
+noonfinalarabic;FEE6
+noonghunnaarabic;06BA
+noonghunnafinalarabic;FB9F
+noonhehinitialarabic;FEE7 FEEC
+nooninitialarabic;FEE7
+noonjeeminitialarabic;FCD2
+noonjeemisolatedarabic;FC4B
+noonmedialarabic;FEE8
+noonmeeminitialarabic;FCD5
+noonmeemisolatedarabic;FC4E
+noonnoonfinalarabic;FC8D
+notcontains;220C
+notelement;2209
+notelementof;2209
+notequal;2260
+notgreater;226F
+notgreaternorequal;2271
+notgreaternorless;2279
+notidentical;2262
+notless;226E
+notlessnorequal;2270
+notparallel;2226
+notprecedes;2280
+notsubset;2284
+notsucceeds;2281
+notsuperset;2285
+nowarmenian;0576
+nparen;24A9
+nssquare;33B1
+nsuperior;207F
+ntilde;00F1
+nu;03BD
+nuhiragana;306C
+nukatakana;30CC
+nukatakanahalfwidth;FF87
+nuktabengali;09BC
+nuktadeva;093C
+nuktagujarati;0ABC
+nuktagurmukhi;0A3C
+numbersign;0023
+numbersignmonospace;FF03
+numbersignsmall;FE5F
+numeralsigngreek;0374
+numeralsignlowergreek;0375
+numero;2116
+nun;05E0
+nundagesh;FB40
+nundageshhebrew;FB40
+nunhebrew;05E0
+nvsquare;33B5
+nwsquare;33BB
+nyabengali;099E
+nyadeva;091E
+nyagujarati;0A9E
+nyagurmukhi;0A1E
+o;006F
+oacute;00F3
+oangthai;0E2D
+obarred;0275
+obarredcyrillic;04E9
+obarreddieresiscyrillic;04EB
+obengali;0993
+obopomofo;311B
+obreve;014F
+ocandradeva;0911
+ocandragujarati;0A91
+ocandravowelsigndeva;0949
+ocandravowelsigngujarati;0AC9
+ocaron;01D2
+ocircle;24DE
+ocircumflex;00F4
+ocircumflexacute;1ED1
+ocircumflexdotbelow;1ED9
+ocircumflexgrave;1ED3
+ocircumflexhookabove;1ED5
+ocircumflextilde;1ED7
+ocyrillic;043E
+odblacute;0151
+odblgrave;020D
+odeva;0913
+odieresis;00F6
+odieresiscyrillic;04E7
+odotbelow;1ECD
+oe;0153
+oekorean;315A
+ogonek;02DB
+ogonekcmb;0328
+ograve;00F2
+ogujarati;0A93
+oharmenian;0585
+ohiragana;304A
+ohookabove;1ECF
+ohorn;01A1
+ohornacute;1EDB
+ohorndotbelow;1EE3
+ohorngrave;1EDD
+ohornhookabove;1EDF
+ohorntilde;1EE1
+ohungarumlaut;0151
+oi;01A3
+oinvertedbreve;020F
+okatakana;30AA
+okatakanahalfwidth;FF75
+okorean;3157
+olehebrew;05AB
+omacron;014D
+omacronacute;1E53
+omacrongrave;1E51
+omdeva;0950
+omega;03C9
+omega1;03D6
+omegacyrillic;0461
+omegalatinclosed;0277
+omegaroundcyrillic;047B
+omegatitlocyrillic;047D
+omegatonos;03CE
+omgujarati;0AD0
+omicron;03BF
+omicrontonos;03CC
+omonospace;FF4F
+one;0031
+onearabic;0661
+onebengali;09E7
+onecircle;2460
+onecircleinversesansserif;278A
+onedeva;0967
+onedotenleader;2024
+oneeighth;215B
+onefitted;F6DC
+onegujarati;0AE7
+onegurmukhi;0A67
+onehackarabic;0661
+onehalf;00BD
+onehangzhou;3021
+oneideographicparen;3220
+oneinferior;2081
+onemonospace;FF11
+onenumeratorbengali;09F4
+oneoldstyle;F731
+oneparen;2474
+oneperiod;2488
+onepersian;06F1
+onequarter;00BC
+oneroman;2170
+onesuperior;00B9
+onethai;0E51
+onethird;2153
+oogonek;01EB
+oogonekmacron;01ED
+oogurmukhi;0A13
+oomatragurmukhi;0A4B
+oopen;0254
+oparen;24AA
+openbullet;25E6
+option;2325
+ordfeminine;00AA
+ordmasculine;00BA
+orthogonal;221F
+oshortdeva;0912
+oshortvowelsigndeva;094A
+oslash;00F8
+oslashacute;01FF
+osmallhiragana;3049
+osmallkatakana;30A9
+osmallkatakanahalfwidth;FF6B
+ostrokeacute;01FF
+osuperior;F6F0
+otcyrillic;047F
+otilde;00F5
+otildeacute;1E4D
+otildedieresis;1E4F
+oubopomofo;3121
+overline;203E
+overlinecenterline;FE4A
+overlinecmb;0305
+overlinedashed;FE49
+overlinedblwavy;FE4C
+overlinewavy;FE4B
+overscore;00AF
+ovowelsignbengali;09CB
+ovowelsigndeva;094B
+ovowelsigngujarati;0ACB
+p;0070
+paampssquare;3380
+paasentosquare;332B
+pabengali;09AA
+pacute;1E55
+padeva;092A
+pagedown;21DF
+pageup;21DE
+pagujarati;0AAA
+pagurmukhi;0A2A
+pahiragana;3071
+paiyannoithai;0E2F
+pakatakana;30D1
+palatalizationcyrilliccmb;0484
+palochkacyrillic;04C0
+pansioskorean;317F
+paragraph;00B6
+parallel;2225
+parenleft;0028
+parenleftaltonearabic;FD3E
+parenleftbt;F8ED
+parenleftex;F8EC
+parenleftinferior;208D
+parenleftmonospace;FF08
+parenleftsmall;FE59
+parenleftsuperior;207D
+parenlefttp;F8EB
+parenleftvertical;FE35
+parenright;0029
+parenrightaltonearabic;FD3F
+parenrightbt;F8F8
+parenrightex;F8F7
+parenrightinferior;208E
+parenrightmonospace;FF09
+parenrightsmall;FE5A
+parenrightsuperior;207E
+parenrighttp;F8F6
+parenrightvertical;FE36
+partialdiff;2202
+paseqhebrew;05C0
+pashtahebrew;0599
+pasquare;33A9
+patah;05B7
+patah11;05B7
+patah1d;05B7
+patah2a;05B7
+patahhebrew;05B7
+patahnarrowhebrew;05B7
+patahquarterhebrew;05B7
+patahwidehebrew;05B7
+pazerhebrew;05A1
+pbopomofo;3106
+pcircle;24DF
+pdotaccent;1E57
+pe;05E4
+pecyrillic;043F
+pedagesh;FB44
+pedageshhebrew;FB44
+peezisquare;333B
+pefinaldageshhebrew;FB43
+peharabic;067E
+peharmenian;057A
+pehebrew;05E4
+pehfinalarabic;FB57
+pehinitialarabic;FB58
+pehiragana;307A
+pehmedialarabic;FB59
+pekatakana;30DA
+pemiddlehookcyrillic;04A7
+perafehebrew;FB4E
+percent;0025
+percentarabic;066A
+percentmonospace;FF05
+percentsmall;FE6A
+period;002E
+periodarmenian;0589
+periodcentered;00B7
+periodhalfwidth;FF61
+periodinferior;F6E7
+periodmonospace;FF0E
+periodsmall;FE52
+periodsuperior;F6E8
+perispomenigreekcmb;0342
+perpendicular;22A5
+perthousand;2030
+peseta;20A7
+pfsquare;338A
+phabengali;09AB
+phadeva;092B
+phagujarati;0AAB
+phagurmukhi;0A2B
+phi;03C6
+phi1;03D5
+phieuphacirclekorean;327A
+phieuphaparenkorean;321A
+phieuphcirclekorean;326C
+phieuphkorean;314D
+phieuphparenkorean;320C
+philatin;0278
+phinthuthai;0E3A
+phisymbolgreek;03D5
+phook;01A5
+phophanthai;0E1E
+phophungthai;0E1C
+phosamphaothai;0E20
+pi;03C0
+pieupacirclekorean;3273
+pieupaparenkorean;3213
+pieupcieuckorean;3176
+pieupcirclekorean;3265
+pieupkiyeokkorean;3172
+pieupkorean;3142
+pieupparenkorean;3205
+pieupsioskiyeokkorean;3174
+pieupsioskorean;3144
+pieupsiostikeutkorean;3175
+pieupthieuthkorean;3177
+pieuptikeutkorean;3173
+pihiragana;3074
+pikatakana;30D4
+pisymbolgreek;03D6
+piwrarmenian;0583
+plus;002B
+plusbelowcmb;031F
+pluscircle;2295
+plusminus;00B1
+plusmod;02D6
+plusmonospace;FF0B
+plussmall;FE62
+plussuperior;207A
+pmonospace;FF50
+pmsquare;33D8
+pohiragana;307D
+pointingindexdownwhite;261F
+pointingindexleftwhite;261C
+pointingindexrightwhite;261E
+pointingindexupwhite;261D
+pokatakana;30DD
+poplathai;0E1B
+postalmark;3012
+postalmarkface;3020
+pparen;24AB
+precedes;227A
+prescription;211E
+primemod;02B9
+primereversed;2035
+product;220F
+projective;2305
+prolongedkana;30FC
+propellor;2318
+propersubset;2282
+propersuperset;2283
+proportion;2237
+proportional;221D
+psi;03C8
+psicyrillic;0471
+psilipneumatacyrilliccmb;0486
+pssquare;33B0
+puhiragana;3077
+pukatakana;30D7
+pvsquare;33B4
+pwsquare;33BA
+q;0071
+qadeva;0958
+qadmahebrew;05A8
+qafarabic;0642
+qaffinalarabic;FED6
+qafinitialarabic;FED7
+qafmedialarabic;FED8
+qamats;05B8
+qamats10;05B8
+qamats1a;05B8
+qamats1c;05B8
+qamats27;05B8
+qamats29;05B8
+qamats33;05B8
+qamatsde;05B8
+qamatshebrew;05B8
+qamatsnarrowhebrew;05B8
+qamatsqatanhebrew;05B8
+qamatsqatannarrowhebrew;05B8
+qamatsqatanquarterhebrew;05B8
+qamatsqatanwidehebrew;05B8
+qamatsquarterhebrew;05B8
+qamatswidehebrew;05B8
+qarneyparahebrew;059F
+qbopomofo;3111
+qcircle;24E0
+qhook;02A0
+qmonospace;FF51
+qof;05E7
+qofdagesh;FB47
+qofdageshhebrew;FB47
+qofhatafpatah;05E7 05B2
+qofhatafpatahhebrew;05E7 05B2
+qofhatafsegol;05E7 05B1
+qofhatafsegolhebrew;05E7 05B1
+qofhebrew;05E7
+qofhiriq;05E7 05B4
+qofhiriqhebrew;05E7 05B4
+qofholam;05E7 05B9
+qofholamhebrew;05E7 05B9
+qofpatah;05E7 05B7
+qofpatahhebrew;05E7 05B7
+qofqamats;05E7 05B8
+qofqamatshebrew;05E7 05B8
+qofqubuts;05E7 05BB
+qofqubutshebrew;05E7 05BB
+qofsegol;05E7 05B6
+qofsegolhebrew;05E7 05B6
+qofsheva;05E7 05B0
+qofshevahebrew;05E7 05B0
+qoftsere;05E7 05B5
+qoftserehebrew;05E7 05B5
+qparen;24AC
+quarternote;2669
+qubuts;05BB
+qubuts18;05BB
+qubuts25;05BB
+qubuts31;05BB
+qubutshebrew;05BB
+qubutsnarrowhebrew;05BB
+qubutsquarterhebrew;05BB
+qubutswidehebrew;05BB
+question;003F
+questionarabic;061F
+questionarmenian;055E
+questiondown;00BF
+questiondownsmall;F7BF
+questiongreek;037E
+questionmonospace;FF1F
+questionsmall;F73F
+quotedbl;0022
+quotedblbase;201E
+quotedblleft;201C
+quotedblmonospace;FF02
+quotedblprime;301E
+quotedblprimereversed;301D
+quotedblright;201D
+quoteleft;2018
+quoteleftreversed;201B
+quotereversed;201B
+quoteright;2019
+quoterightn;0149
+quotesinglbase;201A
+quotesingle;0027
+quotesinglemonospace;FF07
+r;0072
+raarmenian;057C
+rabengali;09B0
+racute;0155
+radeva;0930
+radical;221A
+radicalex;F8E5
+radoverssquare;33AE
+radoverssquaredsquare;33AF
+radsquare;33AD
+rafe;05BF
+rafehebrew;05BF
+ragujarati;0AB0
+ragurmukhi;0A30
+rahiragana;3089
+rakatakana;30E9
+rakatakanahalfwidth;FF97
+ralowerdiagonalbengali;09F1
+ramiddlediagonalbengali;09F0
+ramshorn;0264
+ratio;2236
+rbopomofo;3116
+rcaron;0159
+rcedilla;0157
+rcircle;24E1
+rcommaaccent;0157
+rdblgrave;0211
+rdotaccent;1E59
+rdotbelow;1E5B
+rdotbelowmacron;1E5D
+referencemark;203B
+reflexsubset;2286
+reflexsuperset;2287
+registered;00AE
+registersans;F8E8
+registerserif;F6DA
+reharabic;0631
+reharmenian;0580
+rehfinalarabic;FEAE
+rehiragana;308C
+rehyehaleflamarabic;0631 FEF3 FE8E 0644
+rekatakana;30EC
+rekatakanahalfwidth;FF9A
+resh;05E8
+reshdageshhebrew;FB48
+reshhatafpatah;05E8 05B2
+reshhatafpatahhebrew;05E8 05B2
+reshhatafsegol;05E8 05B1
+reshhatafsegolhebrew;05E8 05B1
+reshhebrew;05E8
+reshhiriq;05E8 05B4
+reshhiriqhebrew;05E8 05B4
+reshholam;05E8 05B9
+reshholamhebrew;05E8 05B9
+reshpatah;05E8 05B7
+reshpatahhebrew;05E8 05B7
+reshqamats;05E8 05B8
+reshqamatshebrew;05E8 05B8
+reshqubuts;05E8 05BB
+reshqubutshebrew;05E8 05BB
+reshsegol;05E8 05B6
+reshsegolhebrew;05E8 05B6
+reshsheva;05E8 05B0
+reshshevahebrew;05E8 05B0
+reshtsere;05E8 05B5
+reshtserehebrew;05E8 05B5
+reversedtilde;223D
+reviahebrew;0597
+reviamugrashhebrew;0597
+revlogicalnot;2310
+rfishhook;027E
+rfishhookreversed;027F
+rhabengali;09DD
+rhadeva;095D
+rho;03C1
+rhook;027D
+rhookturned;027B
+rhookturnedsuperior;02B5
+rhosymbolgreek;03F1
+rhotichookmod;02DE
+rieulacirclekorean;3271
+rieulaparenkorean;3211
+rieulcirclekorean;3263
+rieulhieuhkorean;3140
+rieulkiyeokkorean;313A
+rieulkiyeoksioskorean;3169
+rieulkorean;3139
+rieulmieumkorean;313B
+rieulpansioskorean;316C
+rieulparenkorean;3203
+rieulphieuphkorean;313F
+rieulpieupkorean;313C
+rieulpieupsioskorean;316B
+rieulsioskorean;313D
+rieulthieuthkorean;313E
+rieultikeutkorean;316A
+rieulyeorinhieuhkorean;316D
+rightangle;221F
+righttackbelowcmb;0319
+righttriangle;22BF
+rihiragana;308A
+rikatakana;30EA
+rikatakanahalfwidth;FF98
+ring;02DA
+ringbelowcmb;0325
+ringcmb;030A
+ringhalfleft;02BF
+ringhalfleftarmenian;0559
+ringhalfleftbelowcmb;031C
+ringhalfleftcentered;02D3
+ringhalfright;02BE
+ringhalfrightbelowcmb;0339
+ringhalfrightcentered;02D2
+rinvertedbreve;0213
+rittorusquare;3351
+rlinebelow;1E5F
+rlongleg;027C
+rlonglegturned;027A
+rmonospace;FF52
+rohiragana;308D
+rokatakana;30ED
+rokatakanahalfwidth;FF9B
+roruathai;0E23
+rparen;24AD
+rrabengali;09DC
+rradeva;0931
+rragurmukhi;0A5C
+rreharabic;0691
+rrehfinalarabic;FB8D
+rrvocalicbengali;09E0
+rrvocalicdeva;0960
+rrvocalicgujarati;0AE0
+rrvocalicvowelsignbengali;09C4
+rrvocalicvowelsigndeva;0944
+rrvocalicvowelsigngujarati;0AC4
+rsuperior;F6F1
+rtblock;2590
+rturned;0279
+rturnedsuperior;02B4
+ruhiragana;308B
+rukatakana;30EB
+rukatakanahalfwidth;FF99
+rupeemarkbengali;09F2
+rupeesignbengali;09F3
+rupiah;F6DD
+ruthai;0E24
+rvocalicbengali;098B
+rvocalicdeva;090B
+rvocalicgujarati;0A8B
+rvocalicvowelsignbengali;09C3
+rvocalicvowelsigndeva;0943
+rvocalicvowelsigngujarati;0AC3
+s;0073
+sabengali;09B8
+sacute;015B
+sacutedotaccent;1E65
+sadarabic;0635
+sadeva;0938
+sadfinalarabic;FEBA
+sadinitialarabic;FEBB
+sadmedialarabic;FEBC
+sagujarati;0AB8
+sagurmukhi;0A38
+sahiragana;3055
+sakatakana;30B5
+sakatakanahalfwidth;FF7B
+sallallahoualayhewasallamarabic;FDFA
+samekh;05E1
+samekhdagesh;FB41
+samekhdageshhebrew;FB41
+samekhhebrew;05E1
+saraaathai;0E32
+saraaethai;0E41
+saraaimaimalaithai;0E44
+saraaimaimuanthai;0E43
+saraamthai;0E33
+saraathai;0E30
+saraethai;0E40
+saraiileftthai;F886
+saraiithai;0E35
+saraileftthai;F885
+saraithai;0E34
+saraothai;0E42
+saraueeleftthai;F888
+saraueethai;0E37
+saraueleftthai;F887
+sarauethai;0E36
+sarauthai;0E38
+sarauuthai;0E39
+sbopomofo;3119
+scaron;0161
+scarondotaccent;1E67
+scedilla;015F
+schwa;0259
+schwacyrillic;04D9
+schwadieresiscyrillic;04DB
+schwahook;025A
+scircle;24E2
+scircumflex;015D
+scommaaccent;0219
+sdotaccent;1E61
+sdotbelow;1E63
+sdotbelowdotaccent;1E69
+seagullbelowcmb;033C
+second;2033
+secondtonechinese;02CA
+section;00A7
+seenarabic;0633
+seenfinalarabic;FEB2
+seeninitialarabic;FEB3
+seenmedialarabic;FEB4
+segol;05B6
+segol13;05B6
+segol1f;05B6
+segol2c;05B6
+segolhebrew;05B6
+segolnarrowhebrew;05B6
+segolquarterhebrew;05B6
+segoltahebrew;0592
+segolwidehebrew;05B6
+seharmenian;057D
+sehiragana;305B
+sekatakana;30BB
+sekatakanahalfwidth;FF7E
+semicolon;003B
+semicolonarabic;061B
+semicolonmonospace;FF1B
+semicolonsmall;FE54
+semivoicedmarkkana;309C
+semivoicedmarkkanahalfwidth;FF9F
+sentisquare;3322
+sentosquare;3323
+seven;0037
+sevenarabic;0667
+sevenbengali;09ED
+sevencircle;2466
+sevencircleinversesansserif;2790
+sevendeva;096D
+seveneighths;215E
+sevengujarati;0AED
+sevengurmukhi;0A6D
+sevenhackarabic;0667
+sevenhangzhou;3027
+sevenideographicparen;3226
+seveninferior;2087
+sevenmonospace;FF17
+sevenoldstyle;F737
+sevenparen;247A
+sevenperiod;248E
+sevenpersian;06F7
+sevenroman;2176
+sevensuperior;2077
+seventeencircle;2470
+seventeenparen;2484
+seventeenperiod;2498
+seventhai;0E57
+sfthyphen;00AD
+shaarmenian;0577
+shabengali;09B6
+shacyrillic;0448
+shaddaarabic;0651
+shaddadammaarabic;FC61
+shaddadammatanarabic;FC5E
+shaddafathaarabic;FC60
+shaddafathatanarabic;0651 064B
+shaddakasraarabic;FC62
+shaddakasratanarabic;FC5F
+shade;2592
+shadedark;2593
+shadelight;2591
+shademedium;2592
+shadeva;0936
+shagujarati;0AB6
+shagurmukhi;0A36
+shalshelethebrew;0593
+shbopomofo;3115
+shchacyrillic;0449
+sheenarabic;0634
+sheenfinalarabic;FEB6
+sheeninitialarabic;FEB7
+sheenmedialarabic;FEB8
+sheicoptic;03E3
+sheqel;20AA
+sheqelhebrew;20AA
+sheva;05B0
+sheva115;05B0
+sheva15;05B0
+sheva22;05B0
+sheva2e;05B0
+shevahebrew;05B0
+shevanarrowhebrew;05B0
+shevaquarterhebrew;05B0
+shevawidehebrew;05B0
+shhacyrillic;04BB
+shimacoptic;03ED
+shin;05E9
+shindagesh;FB49
+shindageshhebrew;FB49
+shindageshshindot;FB2C
+shindageshshindothebrew;FB2C
+shindageshsindot;FB2D
+shindageshsindothebrew;FB2D
+shindothebrew;05C1
+shinhebrew;05E9
+shinshindot;FB2A
+shinshindothebrew;FB2A
+shinsindot;FB2B
+shinsindothebrew;FB2B
+shook;0282
+sigma;03C3
+sigma1;03C2
+sigmafinal;03C2
+sigmalunatesymbolgreek;03F2
+sihiragana;3057
+sikatakana;30B7
+sikatakanahalfwidth;FF7C
+siluqhebrew;05BD
+siluqlefthebrew;05BD
+similar;223C
+sindothebrew;05C2
+siosacirclekorean;3274
+siosaparenkorean;3214
+sioscieuckorean;317E
+sioscirclekorean;3266
+sioskiyeokkorean;317A
+sioskorean;3145
+siosnieunkorean;317B
+siosparenkorean;3206
+siospieupkorean;317D
+siostikeutkorean;317C
+six;0036
+sixarabic;0666
+sixbengali;09EC
+sixcircle;2465
+sixcircleinversesansserif;278F
+sixdeva;096C
+sixgujarati;0AEC
+sixgurmukhi;0A6C
+sixhackarabic;0666
+sixhangzhou;3026
+sixideographicparen;3225
+sixinferior;2086
+sixmonospace;FF16
+sixoldstyle;F736
+sixparen;2479
+sixperiod;248D
+sixpersian;06F6
+sixroman;2175
+sixsuperior;2076
+sixteencircle;246F
+sixteencurrencydenominatorbengali;09F9
+sixteenparen;2483
+sixteenperiod;2497
+sixthai;0E56
+slash;002F
+slashmonospace;FF0F
+slong;017F
+slongdotaccent;1E9B
+smileface;263A
+smonospace;FF53
+sofpasuqhebrew;05C3
+softhyphen;00AD
+softsigncyrillic;044C
+sohiragana;305D
+sokatakana;30BD
+sokatakanahalfwidth;FF7F
+soliduslongoverlaycmb;0338
+solidusshortoverlaycmb;0337
+sorusithai;0E29
+sosalathai;0E28
+sosothai;0E0B
+sosuathai;0E2A
+space;0020
+spacehackarabic;0020
+spade;2660
+spadesuitblack;2660
+spadesuitwhite;2664
+sparen;24AE
+squarebelowcmb;033B
+squarecc;33C4
+squarecm;339D
+squarediagonalcrosshatchfill;25A9
+squarehorizontalfill;25A4
+squarekg;338F
+squarekm;339E
+squarekmcapital;33CE
+squareln;33D1
+squarelog;33D2
+squaremg;338E
+squaremil;33D5
+squaremm;339C
+squaremsquared;33A1
+squareorthogonalcrosshatchfill;25A6
+squareupperlefttolowerrightfill;25A7
+squareupperrighttolowerleftfill;25A8
+squareverticalfill;25A5
+squarewhitewithsmallblack;25A3
+srsquare;33DB
+ssabengali;09B7
+ssadeva;0937
+ssagujarati;0AB7
+ssangcieuckorean;3149
+ssanghieuhkorean;3185
+ssangieungkorean;3180
+ssangkiyeokkorean;3132
+ssangnieunkorean;3165
+ssangpieupkorean;3143
+ssangsioskorean;3146
+ssangtikeutkorean;3138
+ssuperior;F6F2
+sterling;00A3
+sterlingmonospace;FFE1
+strokelongoverlaycmb;0336
+strokeshortoverlaycmb;0335
+subset;2282
+subsetnotequal;228A
+subsetorequal;2286
+succeeds;227B
+suchthat;220B
+suhiragana;3059
+sukatakana;30B9
+sukatakanahalfwidth;FF7D
+sukunarabic;0652
+summation;2211
+sun;263C
+superset;2283
+supersetnotequal;228B
+supersetorequal;2287
+svsquare;33DC
+syouwaerasquare;337C
+t;0074
+tabengali;09A4
+tackdown;22A4
+tackleft;22A3
+tadeva;0924
+tagujarati;0AA4
+tagurmukhi;0A24
+taharabic;0637
+tahfinalarabic;FEC2
+tahinitialarabic;FEC3
+tahiragana;305F
+tahmedialarabic;FEC4
+taisyouerasquare;337D
+takatakana;30BF
+takatakanahalfwidth;FF80
+tatweelarabic;0640
+tau;03C4
+tav;05EA
+tavdages;FB4A
+tavdagesh;FB4A
+tavdageshhebrew;FB4A
+tavhebrew;05EA
+tbar;0167
+tbopomofo;310A
+tcaron;0165
+tccurl;02A8
+tcedilla;0163
+tcheharabic;0686
+tchehfinalarabic;FB7B
+tchehinitialarabic;FB7C
+tchehmedialarabic;FB7D
+tchehmeeminitialarabic;FB7C FEE4
+tcircle;24E3
+tcircumflexbelow;1E71
+tcommaaccent;0163
+tdieresis;1E97
+tdotaccent;1E6B
+tdotbelow;1E6D
+tecyrillic;0442
+tedescendercyrillic;04AD
+teharabic;062A
+tehfinalarabic;FE96
+tehhahinitialarabic;FCA2
+tehhahisolatedarabic;FC0C
+tehinitialarabic;FE97
+tehiragana;3066
+tehjeeminitialarabic;FCA1
+tehjeemisolatedarabic;FC0B
+tehmarbutaarabic;0629
+tehmarbutafinalarabic;FE94
+tehmedialarabic;FE98
+tehmeeminitialarabic;FCA4
+tehmeemisolatedarabic;FC0E
+tehnoonfinalarabic;FC73
+tekatakana;30C6
+tekatakanahalfwidth;FF83
+telephone;2121
+telephoneblack;260E
+telishagedolahebrew;05A0
+telishaqetanahebrew;05A9
+tencircle;2469
+tenideographicparen;3229
+tenparen;247D
+tenperiod;2491
+tenroman;2179
+tesh;02A7
+tet;05D8
+tetdagesh;FB38
+tetdageshhebrew;FB38
+tethebrew;05D8
+tetsecyrillic;04B5
+tevirhebrew;059B
+tevirlefthebrew;059B
+thabengali;09A5
+thadeva;0925
+thagujarati;0AA5
+thagurmukhi;0A25
+thalarabic;0630
+thalfinalarabic;FEAC
+thanthakhatlowleftthai;F898
+thanthakhatlowrightthai;F897
+thanthakhatthai;0E4C
+thanthakhatupperleftthai;F896
+theharabic;062B
+thehfinalarabic;FE9A
+thehinitialarabic;FE9B
+thehmedialarabic;FE9C
+thereexists;2203
+therefore;2234
+theta;03B8
+theta1;03D1
+thetasymbolgreek;03D1
+thieuthacirclekorean;3279
+thieuthaparenkorean;3219
+thieuthcirclekorean;326B
+thieuthkorean;314C
+thieuthparenkorean;320B
+thirteencircle;246C
+thirteenparen;2480
+thirteenperiod;2494
+thonangmonthothai;0E11
+thook;01AD
+thophuthaothai;0E12
+thorn;00FE
+thothahanthai;0E17
+thothanthai;0E10
+thothongthai;0E18
+thothungthai;0E16
+thousandcyrillic;0482
+thousandsseparatorarabic;066C
+thousandsseparatorpersian;066C
+three;0033
+threearabic;0663
+threebengali;09E9
+threecircle;2462
+threecircleinversesansserif;278C
+threedeva;0969
+threeeighths;215C
+threegujarati;0AE9
+threegurmukhi;0A69
+threehackarabic;0663
+threehangzhou;3023
+threeideographicparen;3222
+threeinferior;2083
+threemonospace;FF13
+threenumeratorbengali;09F6
+threeoldstyle;F733
+threeparen;2476
+threeperiod;248A
+threepersian;06F3
+threequarters;00BE
+threequartersemdash;F6DE
+threeroman;2172
+threesuperior;00B3
+threethai;0E53
+thzsquare;3394
+tihiragana;3061
+tikatakana;30C1
+tikatakanahalfwidth;FF81
+tikeutacirclekorean;3270
+tikeutaparenkorean;3210
+tikeutcirclekorean;3262
+tikeutkorean;3137
+tikeutparenkorean;3202
+tilde;02DC
+tildebelowcmb;0330
+tildecmb;0303
+tildecomb;0303
+tildedoublecmb;0360
+tildeoperator;223C
+tildeoverlaycmb;0334
+tildeverticalcmb;033E
+timescircle;2297
+tipehahebrew;0596
+tipehalefthebrew;0596
+tippigurmukhi;0A70
+titlocyrilliccmb;0483
+tiwnarmenian;057F
+tlinebelow;1E6F
+tmonospace;FF54
+toarmenian;0569
+tohiragana;3068
+tokatakana;30C8
+tokatakanahalfwidth;FF84
+tonebarextrahighmod;02E5
+tonebarextralowmod;02E9
+tonebarhighmod;02E6
+tonebarlowmod;02E8
+tonebarmidmod;02E7
+tonefive;01BD
+tonesix;0185
+tonetwo;01A8
+tonos;0384
+tonsquare;3327
+topatakthai;0E0F
+tortoiseshellbracketleft;3014
+tortoiseshellbracketleftsmall;FE5D
+tortoiseshellbracketleftvertical;FE39
+tortoiseshellbracketright;3015
+tortoiseshellbracketrightsmall;FE5E
+tortoiseshellbracketrightvertical;FE3A
+totaothai;0E15
+tpalatalhook;01AB
+tparen;24AF
+trademark;2122
+trademarksans;F8EA
+trademarkserif;F6DB
+tretroflexhook;0288
+triagdn;25BC
+triaglf;25C4
+triagrt;25BA
+triagup;25B2
+ts;02A6
+tsadi;05E6
+tsadidagesh;FB46
+tsadidageshhebrew;FB46
+tsadihebrew;05E6
+tsecyrillic;0446
+tsere;05B5
+tsere12;05B5
+tsere1e;05B5
+tsere2b;05B5
+tserehebrew;05B5
+tserenarrowhebrew;05B5
+tserequarterhebrew;05B5
+tserewidehebrew;05B5
+tshecyrillic;045B
+tsuperior;F6F3
+ttabengali;099F
+ttadeva;091F
+ttagujarati;0A9F
+ttagurmukhi;0A1F
+tteharabic;0679
+ttehfinalarabic;FB67
+ttehinitialarabic;FB68
+ttehmedialarabic;FB69
+tthabengali;09A0
+tthadeva;0920
+tthagujarati;0AA0
+tthagurmukhi;0A20
+tturned;0287
+tuhiragana;3064
+tukatakana;30C4
+tukatakanahalfwidth;FF82
+tusmallhiragana;3063
+tusmallkatakana;30C3
+tusmallkatakanahalfwidth;FF6F
+twelvecircle;246B
+twelveparen;247F
+twelveperiod;2493
+twelveroman;217B
+twentycircle;2473
+twentyhangzhou;5344
+twentyparen;2487
+twentyperiod;249B
+two;0032
+twoarabic;0662
+twobengali;09E8
+twocircle;2461
+twocircleinversesansserif;278B
+twodeva;0968
+twodotenleader;2025
+twodotleader;2025
+twodotleadervertical;FE30
+twogujarati;0AE8
+twogurmukhi;0A68
+twohackarabic;0662
+twohangzhou;3022
+twoideographicparen;3221
+twoinferior;2082
+twomonospace;FF12
+twonumeratorbengali;09F5
+twooldstyle;F732
+twoparen;2475
+twoperiod;2489
+twopersian;06F2
+tworoman;2171
+twostroke;01BB
+twosuperior;00B2
+twothai;0E52
+twothirds;2154
+u;0075
+uacute;00FA
+ubar;0289
+ubengali;0989
+ubopomofo;3128
+ubreve;016D
+ucaron;01D4
+ucircle;24E4
+ucircumflex;00FB
+ucircumflexbelow;1E77
+ucyrillic;0443
+udattadeva;0951
+udblacute;0171
+udblgrave;0215
+udeva;0909
+udieresis;00FC
+udieresisacute;01D8
+udieresisbelow;1E73
+udieresiscaron;01DA
+udieresiscyrillic;04F1
+udieresisgrave;01DC
+udieresismacron;01D6
+udotbelow;1EE5
+ugrave;00F9
+ugujarati;0A89
+ugurmukhi;0A09
+uhiragana;3046
+uhookabove;1EE7
+uhorn;01B0
+uhornacute;1EE9
+uhorndotbelow;1EF1
+uhorngrave;1EEB
+uhornhookabove;1EED
+uhorntilde;1EEF
+uhungarumlaut;0171
+uhungarumlautcyrillic;04F3
+uinvertedbreve;0217
+ukatakana;30A6
+ukatakanahalfwidth;FF73
+ukcyrillic;0479
+ukorean;315C
+umacron;016B
+umacroncyrillic;04EF
+umacrondieresis;1E7B
+umatragurmukhi;0A41
+umonospace;FF55
+underscore;005F
+underscoredbl;2017
+underscoremonospace;FF3F
+underscorevertical;FE33
+underscorewavy;FE4F
+union;222A
+universal;2200
+uogonek;0173
+uparen;24B0
+upblock;2580
+upperdothebrew;05C4
+upsilon;03C5
+upsilondieresis;03CB
+upsilondieresistonos;03B0
+upsilonlatin;028A
+upsilontonos;03CD
+uptackbelowcmb;031D
+uptackmod;02D4
+uragurmukhi;0A73
+uring;016F
+ushortcyrillic;045E
+usmallhiragana;3045
+usmallkatakana;30A5
+usmallkatakanahalfwidth;FF69
+ustraightcyrillic;04AF
+ustraightstrokecyrillic;04B1
+utilde;0169
+utildeacute;1E79
+utildebelow;1E75
+uubengali;098A
+uudeva;090A
+uugujarati;0A8A
+uugurmukhi;0A0A
+uumatragurmukhi;0A42
+uuvowelsignbengali;09C2
+uuvowelsigndeva;0942
+uuvowelsigngujarati;0AC2
+uvowelsignbengali;09C1
+uvowelsigndeva;0941
+uvowelsigngujarati;0AC1
+v;0076
+vadeva;0935
+vagujarati;0AB5
+vagurmukhi;0A35
+vakatakana;30F7
+vav;05D5
+vavdagesh;FB35
+vavdagesh65;FB35
+vavdageshhebrew;FB35
+vavhebrew;05D5
+vavholam;FB4B
+vavholamhebrew;FB4B
+vavvavhebrew;05F0
+vavyodhebrew;05F1
+vcircle;24E5
+vdotbelow;1E7F
+vecyrillic;0432
+veharabic;06A4
+vehfinalarabic;FB6B
+vehinitialarabic;FB6C
+vehmedialarabic;FB6D
+vekatakana;30F9
+venus;2640
+verticalbar;007C
+verticallineabovecmb;030D
+verticallinebelowcmb;0329
+verticallinelowmod;02CC
+verticallinemod;02C8
+vewarmenian;057E
+vhook;028B
+vikatakana;30F8
+viramabengali;09CD
+viramadeva;094D
+viramagujarati;0ACD
+visargabengali;0983
+visargadeva;0903
+visargagujarati;0A83
+vmonospace;FF56
+voarmenian;0578
+voicediterationhiragana;309E
+voicediterationkatakana;30FE
+voicedmarkkana;309B
+voicedmarkkanahalfwidth;FF9E
+vokatakana;30FA
+vparen;24B1
+vtilde;1E7D
+vturned;028C
+vuhiragana;3094
+vukatakana;30F4
+w;0077
+wacute;1E83
+waekorean;3159
+wahiragana;308F
+wakatakana;30EF
+wakatakanahalfwidth;FF9C
+wakorean;3158
+wasmallhiragana;308E
+wasmallkatakana;30EE
+wattosquare;3357
+wavedash;301C
+wavyunderscorevertical;FE34
+wawarabic;0648
+wawfinalarabic;FEEE
+wawhamzaabovearabic;0624
+wawhamzaabovefinalarabic;FE86
+wbsquare;33DD
+wcircle;24E6
+wcircumflex;0175
+wdieresis;1E85
+wdotaccent;1E87
+wdotbelow;1E89
+wehiragana;3091
+weierstrass;2118
+wekatakana;30F1
+wekorean;315E
+weokorean;315D
+wgrave;1E81
+whitebullet;25E6
+whitecircle;25CB
+whitecircleinverse;25D9
+whitecornerbracketleft;300E
+whitecornerbracketleftvertical;FE43
+whitecornerbracketright;300F
+whitecornerbracketrightvertical;FE44
+whitediamond;25C7
+whitediamondcontainingblacksmalldiamond;25C8
+whitedownpointingsmalltriangle;25BF
+whitedownpointingtriangle;25BD
+whiteleftpointingsmalltriangle;25C3
+whiteleftpointingtriangle;25C1
+whitelenticularbracketleft;3016
+whitelenticularbracketright;3017
+whiterightpointingsmalltriangle;25B9
+whiterightpointingtriangle;25B7
+whitesmallsquare;25AB
+whitesmilingface;263A
+whitesquare;25A1
+whitestar;2606
+whitetelephone;260F
+whitetortoiseshellbracketleft;3018
+whitetortoiseshellbracketright;3019
+whiteuppointingsmalltriangle;25B5
+whiteuppointingtriangle;25B3
+wihiragana;3090
+wikatakana;30F0
+wikorean;315F
+wmonospace;FF57
+wohiragana;3092
+wokatakana;30F2
+wokatakanahalfwidth;FF66
+won;20A9
+wonmonospace;FFE6
+wowaenthai;0E27
+wparen;24B2
+wring;1E98
+wsuperior;02B7
+wturned;028D
+wynn;01BF
+x;0078
+xabovecmb;033D
+xbopomofo;3112
+xcircle;24E7
+xdieresis;1E8D
+xdotaccent;1E8B
+xeharmenian;056D
+xi;03BE
+xmonospace;FF58
+xparen;24B3
+xsuperior;02E3
+y;0079
+yaadosquare;334E
+yabengali;09AF
+yacute;00FD
+yadeva;092F
+yaekorean;3152
+yagujarati;0AAF
+yagurmukhi;0A2F
+yahiragana;3084
+yakatakana;30E4
+yakatakanahalfwidth;FF94
+yakorean;3151
+yamakkanthai;0E4E
+yasmallhiragana;3083
+yasmallkatakana;30E3
+yasmallkatakanahalfwidth;FF6C
+yatcyrillic;0463
+ycircle;24E8
+ycircumflex;0177
+ydieresis;00FF
+ydotaccent;1E8F
+ydotbelow;1EF5
+yeharabic;064A
+yehbarreearabic;06D2
+yehbarreefinalarabic;FBAF
+yehfinalarabic;FEF2
+yehhamzaabovearabic;0626
+yehhamzaabovefinalarabic;FE8A
+yehhamzaaboveinitialarabic;FE8B
+yehhamzaabovemedialarabic;FE8C
+yehinitialarabic;FEF3
+yehmedialarabic;FEF4
+yehmeeminitialarabic;FCDD
+yehmeemisolatedarabic;FC58
+yehnoonfinalarabic;FC94
+yehthreedotsbelowarabic;06D1
+yekorean;3156
+yen;00A5
+yenmonospace;FFE5
+yeokorean;3155
+yeorinhieuhkorean;3186
+yerahbenyomohebrew;05AA
+yerahbenyomolefthebrew;05AA
+yericyrillic;044B
+yerudieresiscyrillic;04F9
+yesieungkorean;3181
+yesieungpansioskorean;3183
+yesieungsioskorean;3182
+yetivhebrew;059A
+ygrave;1EF3
+yhook;01B4
+yhookabove;1EF7
+yiarmenian;0575
+yicyrillic;0457
+yikorean;3162
+yinyang;262F
+yiwnarmenian;0582
+ymonospace;FF59
+yod;05D9
+yoddagesh;FB39
+yoddageshhebrew;FB39
+yodhebrew;05D9
+yodyodhebrew;05F2
+yodyodpatahhebrew;FB1F
+yohiragana;3088
+yoikorean;3189
+yokatakana;30E8
+yokatakanahalfwidth;FF96
+yokorean;315B
+yosmallhiragana;3087
+yosmallkatakana;30E7
+yosmallkatakanahalfwidth;FF6E
+yotgreek;03F3
+yoyaekorean;3188
+yoyakorean;3187
+yoyakthai;0E22
+yoyingthai;0E0D
+yparen;24B4
+ypogegrammeni;037A
+ypogegrammenigreekcmb;0345
+yr;01A6
+yring;1E99
+ysuperior;02B8
+ytilde;1EF9
+yturned;028E
+yuhiragana;3086
+yuikorean;318C
+yukatakana;30E6
+yukatakanahalfwidth;FF95
+yukorean;3160
+yusbigcyrillic;046B
+yusbigiotifiedcyrillic;046D
+yuslittlecyrillic;0467
+yuslittleiotifiedcyrillic;0469
+yusmallhiragana;3085
+yusmallkatakana;30E5
+yusmallkatakanahalfwidth;FF6D
+yuyekorean;318B
+yuyeokorean;318A
+yyabengali;09DF
+yyadeva;095F
+z;007A
+zaarmenian;0566
+zacute;017A
+zadeva;095B
+zagurmukhi;0A5B
+zaharabic;0638
+zahfinalarabic;FEC6
+zahinitialarabic;FEC7
+zahiragana;3056
+zahmedialarabic;FEC8
+zainarabic;0632
+zainfinalarabic;FEB0
+zakatakana;30B6
+zaqefgadolhebrew;0595
+zaqefqatanhebrew;0594
+zarqahebrew;0598
+zayin;05D6
+zayindagesh;FB36
+zayindageshhebrew;FB36
+zayinhebrew;05D6
+zbopomofo;3117
+zcaron;017E
+zcircle;24E9
+zcircumflex;1E91
+zcurl;0291
+zdot;017C
+zdotaccent;017C
+zdotbelow;1E93
+zecyrillic;0437
+zedescendercyrillic;0499
+zedieresiscyrillic;04DF
+zehiragana;305C
+zekatakana;30BC
+zero;0030
+zeroarabic;0660
+zerobengali;09E6
+zerodeva;0966
+zerogujarati;0AE6
+zerogurmukhi;0A66
+zerohackarabic;0660
+zeroinferior;2080
+zeromonospace;FF10
+zerooldstyle;F730
+zeropersian;06F0
+zerosuperior;2070
+zerothai;0E50
+zerowidthjoiner;FEFF
+zerowidthnonjoiner;200C
+zerowidthspace;200B
+zeta;03B6
+zhbopomofo;3113
+zhearmenian;056A
+zhebrevecyrillic;04C2
+zhecyrillic;0436
+zhedescendercyrillic;0497
+zhedieresiscyrillic;04DD
+zihiragana;3058
+zikatakana;30B8
+zinorhebrew;05AE
+zlinebelow;1E95
+zmonospace;FF5A
+zohiragana;305E
+zokatakana;30BE
+zparen;24B5
+zretroflexhook;0290
+zstroke;01B6
+zuhiragana;305A
+zukatakana;30BA
+a100;275E
+a101;2761
+a102;2762
+a103;2763
+a104;2764
+a105;2710
+a106;2765
+a107;2766
+a108;2767
+a109;2660
+a10;2721
+a110;2665
+a111;2666
+a112;2663
+a117;2709
+a118;2708
+a119;2707
+a11;261B
+a120;2460
+a121;2461
+a122;2462
+a123;2463
+a124;2464
+a125;2465
+a126;2466
+a127;2467
+a128;2468
+a129;2469
+a12;261E
+a130;2776
+a131;2777
+a132;2778
+a133;2779
+a134;277A
+a135;277B
+a136;277C
+a137;277D
+a138;277E
+a139;277F
+a13;270C
+a140;2780
+a141;2781
+a142;2782
+a143;2783
+a144;2784
+a145;2785
+a146;2786
+a147;2787
+a148;2788
+a149;2789
+a14;270D
+a150;278A
+a151;278B
+a152;278C
+a153;278D
+a154;278E
+a155;278F
+a156;2790
+a157;2791
+a158;2792
+a159;2793
+a15;270E
+a160;2794
+a161;2192
+a162;27A3
+a163;2194
+a164;2195
+a165;2799
+a166;279B
+a167;279C
+a168;279D
+a169;279E
+a16;270F
+a170;279F
+a171;27A0
+a172;27A1
+a173;27A2
+a174;27A4
+a175;27A5
+a176;27A6
+a177;27A7
+a178;27A8
+a179;27A9
+a17;2711
+a180;27AB
+a181;27AD
+a182;27AF
+a183;27B2
+a184;27B3
+a185;27B5
+a186;27B8
+a187;27BA
+a188;27BB
+a189;27BC
+a18;2712
+a190;27BD
+a191;27BE
+a192;279A
+a193;27AA
+a194;27B6
+a195;27B9
+a196;2798
+a197;27B4
+a198;27B7
+a199;27AC
+a19;2713
+a1;2701
+a200;27AE
+a201;27B1
+a202;2703
+a203;2750
+a204;2752
+a205;276E
+a206;2770
+a20;2714
+a21;2715
+a22;2716
+a23;2717
+a24;2718
+a25;2719
+a26;271A
+a27;271B
+a28;271C
+a29;2722
+a2;2702
+a30;2723
+a31;2724
+a32;2725
+a33;2726
+a34;2727
+a35;2605
+a36;2729
+a37;272A
+a38;272B
+a39;272C
+a3;2704
+a40;272D
+a41;272E
+a42;272F
+a43;2730
+a44;2731
+a45;2732
+a46;2733
+a47;2734
+a48;2735
+a49;2736
+a4;260E
+a50;2737
+a51;2738
+a52;2739
+a53;273A
+a54;273B
+a55;273C
+a56;273D
+a57;273E
+a58;273F
+a59;2740
+a5;2706
+a60;2741
+a61;2742
+a62;2743
+a63;2744
+a64;2745
+a65;2746
+a66;2747
+a67;2748
+a68;2749
+a69;274A
+a6;271D
+a70;274B
+a71;25CF
+a72;274D
+a73;25A0
+a74;274F
+a75;2751
+a76;25B2
+a77;25BC
+a78;25C6
+a79;2756
+a7;271E
+a81;25D7
+a82;2758
+a83;2759
+a84;275A
+a85;276F
+a86;2771
+a87;2772
+a88;2773
+a89;2768
+a8;271F
+a90;2769
+a91;276C
+a92;276D
+a93;276A
+a94;276B
+a95;2774
+a96;2775
+a97;275B
+a98;275C
+a99;275D
+a9;2720
+"""
+
+
+# string table management
+#
+class StringTable:
+  def __init__( self, name_list, master_table_name ):
+    self.names        = name_list
+    self.master_table = master_table_name
+    self.indices      = {}
+    index             = 0
+
+    for name in name_list:
+      self.indices[name] = index
+      index += len( name ) + 1
+
+    self.total = index
+
+  def dump( self, file ):
+    write = file.write
+    write( "  static const char  " + self.master_table +
+           "[" + repr( self.total ) + "] =\n" )
+    write( "  {\n" )
+
+    line = ""
+    for name in self.names:
+      line += "    '"
+      line += string.join( ( re.findall( ".", name ) ), "','" )
+      line += "', 0,\n"
+
+    write( line + "  };\n\n\n" )
+
+  def dump_sublist( self, file, table_name, macro_name, sublist ):
+    write = file.write
+    write( "#define " + macro_name + "  " + repr( len( sublist ) ) + "\n\n" )
+
+    write( "  /* Values are offsets into the `" +
+           self.master_table + "' table */\n\n" )
+    write( "  static const short  " + table_name +
+           "[" + macro_name + "] =\n" )
+    write( "  {\n" )
+
+    line  = "    "
+    comma = ""
+    col   = 0
+
+    for name in sublist:
+      line += comma
+      line += "%4d" % self.indices[name]
+      col  += 1
+      comma = ","
+      if col == 14:
+        col   = 0
+        comma = ",\n    "
+
+    write( line + "\n  };\n\n\n" )
+
+
+# We now store the Adobe Glyph List in compressed form.  The list is put
+# into a data structure called `trie' (because it has a tree-like
+# appearance).  Consider, for example, that you want to store the
+# following name mapping:
+#
+#   A        => 1
+#   Aacute   => 6
+#   Abalon   => 2
+#   Abstract => 4
+#
+# It is possible to store the entries as follows.
+#
+#   A => 1
+#   |
+#   +-acute => 6
+#   |
+#   +-b
+#     |
+#     +-alon => 2
+#     |
+#     +-stract => 4
+#
+# We see that each node in the trie has:
+#
+# - one or more `letters'
+# - an optional value
+# - zero or more child nodes
+#
+# The first step is to call
+#
+#   root = StringNode( "", 0 )
+#   for word in map.values():
+#     root.add( word, map[word] )
+#
+# which creates a large trie where each node has only one children.
+#
+# Executing
+#
+#   root = root.optimize()
+#
+# optimizes the trie by merging the letters of successive nodes whenever
+# possible.
+#
+# Each node of the trie is stored as follows.
+#
+# - First the node's letter, according to the following scheme.  We
+#   use the fact that in the AGL no name contains character codes > 127.
+#
+#     name         bitsize     description
+#     ----------------------------------------------------------------
+#     notlast            1     Set to 1 if this is not the last letter
+#                              in the word.
+#     ascii              7     The letter's ASCII value.
+#
+# - The letter is followed by a children count and the value of the
+#   current key (if any).  Again we can do some optimization because all
+#   AGL entries are from the BMP; this means that 16 bits are sufficient
+#   to store its Unicode values.  Additionally, no node has more than
+#   127 children.
+#
+#     name         bitsize     description
+#     -----------------------------------------
+#     hasvalue           1     Set to 1 if a 16-bit Unicode value follows.
+#     num_children       7     Number of children.  Can be 0 only if
+#                              `hasvalue' is set to 1.
+#     value             16     Optional Unicode value.
+#
+# - A node is finished by a list of 16bit absolute offsets to the
+#   children, which must be sorted in increasing order of their first
+#   letter.
+#
+# For simplicity, all 16bit quantities are stored in big-endian order.
+#
+# The root node has first letter = 0, and no value.
+#
+class StringNode:
+  def __init__( self, letter, value ):
+    self.letter   = letter
+    self.value    = value
+    self.children = {}
+
+  def __cmp__( self, other ):
+    return ord( self.letter[0] ) - ord( other.letter[0] )
+
+  def add( self, word, value ):
+    if len( word ) == 0:
+      self.value = value
+      return
+
+    letter = word[0]
+    word   = word[1:]
+
+    if self.children.has_key( letter ):
+      child = self.children[letter]
+    else:
+      child = StringNode( letter, 0 )
+      self.children[letter] = child
+
+    child.add( word, value )
+
+  def optimize( self ):
+    # optimize all children first
+    children      = self.children.values()
+    self.children = {}
+
+    for child in children:
+      self.children[child.letter[0]] = child.optimize()
+
+    # don't optimize if there's a value,
+    # if we don't have any child or if we
+    # have more than one child
+    if ( self.value != 0 ) or ( not children ) or len( children ) > 1:
+      return self
+
+    child = children[0]
+
+    self.letter  += child.letter
+    self.value    = child.value
+    self.children = child.children
+
+    return self
+
+  def dump_debug( self, write, margin ):
+    # this is used during debugging
+    line = margin + "+-"
+    if len( self.letter ) == 0:
+      line += "<NOLETTER>"
+    else:
+      line += self.letter
+
+    if self.value:
+      line += " => " + repr( self.value )
+
+    write( line + "\n" )
+
+    if self.children:
+      margin += "| "
+      for child in self.children.values():
+        child.dump_debug( write, margin )
+
+  def locate( self, index ):
+    self.index = index
+    if len( self.letter ) > 0:
+      index += len( self.letter ) + 1
+    else:
+      index += 2
+
+    if self.value != 0:
+      index += 2
+
+    children = self.children.values()
+    children.sort()
+
+    index += 2 * len( children )
+    for child in children:
+      index = child.locate( index )
+
+    return index
+
+  def store( self, storage ):
+    # write the letters
+    l = len( self.letter )
+    if l == 0:
+      storage += struct.pack( "B", 0 )
+    else:
+      for n in range( l ):
+        val = ord( self.letter[n] )
+        if n < l - 1:
+          val += 128
+        storage += struct.pack( "B", val )
+
+    # write the count
+    children = self.children.values()
+    children.sort()
+
+    count = len( children )
+
+    if self.value != 0:
+      storage += struct.pack( "!BH", count + 128, self.value )
+    else:
+      storage += struct.pack( "B", count )
+
+    for child in children:
+      storage += struct.pack( "!H", child.index )
+
+    for child in children:
+      storage = child.store( storage )
+
+    return storage
+
+
+def adobe_glyph_values():
+  """return the list of glyph names and their unicode values"""
+
+  lines  = string.split( adobe_glyph_list, '\n' )
+  glyphs = []
+  values = []
+
+  for line in lines:
+    if line:
+      fields = string.split( line, ';' )
+#     print fields[1] + ' - ' + fields[0]
+      subfields = string.split( fields[1], ' ' )
+      if len( subfields ) == 1:
+        glyphs.append( fields[0] )
+        values.append( fields[1] )
+
+  return glyphs, values
+
+
+def filter_glyph_names( alist, filter ):
+  """filter `alist' by taking _out_ all glyph names that are in `filter'"""
+
+  count  = 0
+  extras = []
+
+  for name in alist:
+    try:
+      filtered_index = filter.index( name )
+    except:
+      extras.append( name )
+
+  return extras
+
+
+def dump_encoding( file, encoding_name, encoding_list ):
+  """dump a given encoding"""
+
+  write = file.write
+  write( "  /* the following are indices into the SID name table */\n" )
+  write( "  static const unsigned short  " + encoding_name +
+         "[" + repr( len( encoding_list ) ) + "] =\n" )
+  write( "  {\n" )
+
+  line  = "    "
+  comma = ""
+  col   = 0
+  for value in encoding_list:
+    line += comma
+    line += "%3d" % value
+    comma = ","
+    col  += 1
+    if col == 16:
+      col = 0
+      comma = ",\n    "
+
+  write( line + "\n  };\n\n\n" )
+
+
+def dump_array( the_array, write, array_name ):
+  """dumps a given encoding"""
+
+  write( "  static const unsigned char  " + array_name +
+         "[" + repr( len( the_array ) ) + "L] =\n" )
+  write( "  {\n" )
+
+  line  = ""
+  comma = "    "
+  col   = 0
+
+  for value in the_array:
+    line += comma
+    line += "%3d" % ord( value )
+    comma = ","
+    col  += 1
+
+    if col == 16:
+      col   = 0
+      comma = ",\n    "
+
+    if len( line ) > 1024:
+      write( line )
+      line = ""
+
+  write( line + "\n  };\n\n\n" )
+
+
+def main():
+  """main program body"""
+
+  if len( sys.argv ) != 2:
+    print __doc__ % sys.argv[0]
+    sys.exit( 1 )
+
+  file  = open( sys.argv[1], "w\n" )
+  write = file.write
+
+  count_sid = len( sid_standard_names )
+
+  # `mac_extras' contains the list of glyph names in the Macintosh standard
+  # encoding which are not in the SID Standard Names.
+  #
+  mac_extras = filter_glyph_names( mac_standard_names, sid_standard_names )
+
+  # `base_list' contains the names of our final glyph names table.
+  # It consists of the `mac_extras' glyph names, followed by the SID
+  # standard names.
+  #
+  mac_extras_count = len( mac_extras )
+  base_list        = mac_extras + sid_standard_names
+
+  write( "/***************************************************************************/\n" )
+  write( "/*                                                                         */\n" )
+
+  write( "/*  %-71s*/\n" % os.path.basename( sys.argv[1] ) )
+
+  write( "/*                                                                         */\n" )
+  write( "/*    PostScript glyph names.                                              */\n" )
+  write( "/*                                                                         */\n" )
+  write( "/*  Copyright 2005, 2008, 2011 by                                          */\n" )
+  write( "/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */\n" )
+  write( "/*                                                                         */\n" )
+  write( "/*  This file is part of the FreeType project, and may only be used,       */\n" )
+  write( "/*  modified, and distributed under the terms of the FreeType project      */\n" )
+  write( "/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */\n" )
+  write( "/*  this file you indicate that you have read the license and              */\n" )
+  write( "/*  understand and accept it fully.                                        */\n" )
+  write( "/*                                                                         */\n" )
+  write( "/***************************************************************************/\n" )
+  write( "\n" )
+  write( "\n" )
+  write( "  /* This file has been generated automatically -- do not edit! */\n" )
+  write( "\n" )
+  write( "\n" )
+
+  # dump final glyph list (mac extras + sid standard names)
+  #
+  st = StringTable( base_list, "ft_standard_glyph_names" )
+
+  st.dump( file )
+  st.dump_sublist( file, "ft_mac_names",
+                   "FT_NUM_MAC_NAMES", mac_standard_names )
+  st.dump_sublist( file, "ft_sid_names",
+                   "FT_NUM_SID_NAMES", sid_standard_names )
+
+  dump_encoding( file, "t1_standard_encoding", t1_standard_encoding )
+  dump_encoding( file, "t1_expert_encoding", t1_expert_encoding )
+
+  # dump the AGL in its compressed form
+  #
+  agl_glyphs, agl_values = adobe_glyph_values()
+  dict = StringNode( "", 0 )
+
+  for g in range( len( agl_glyphs ) ):
+    dict.add( agl_glyphs[g], eval( "0x" + agl_values[g] ) )
+
+  dict       = dict.optimize()
+  dict_len   = dict.locate( 0 )
+  dict_array = dict.store( "" )
+
+  write( """\
+  /*
+   *  This table is a compressed version of the Adobe Glyph List (AGL),
+   *  optimized for efficient searching.  It has been generated by the
+   *  `glnames.py' python script located in the `src/tools' directory.
+   *
+   *  The lookup function to get the Unicode value for a given string
+   *  is defined below the table.
+   */
+
+#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
+
+""" )
+
+  dump_array( dict_array, write, "ft_adobe_glyph_list" )
+
+  # write the lookup routine now
+  #
+  write( """\
+  /*
+   *  This function searches the compressed table efficiently.
+   */
+  static unsigned long
+  ft_get_adobe_glyph_index( const char*  name,
+                            const char*  limit )
+  {
+    int                   c = 0;
+    int                   count, min, max;
+    const unsigned char*  p = ft_adobe_glyph_list;
+
+
+    if ( name == 0 || name >= limit )
+      goto NotFound;
+
+    c     = *name++;
+    count = p[1];
+    p    += 2;
+
+    min = 0;
+    max = count;
+
+    while ( min < max )
+    {
+      int                   mid = ( min + max ) >> 1;
+      const unsigned char*  q   = p + mid * 2;
+      int                   c2;
+
+
+      q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] );
+
+      c2 = q[0] & 127;
+      if ( c2 == c )
+      {
+        p = q;
+        goto Found;
+      }
+      if ( c2 < c )
+        min = mid + 1;
+      else
+        max = mid;
+    }
+    goto NotFound;
+
+  Found:
+    for (;;)
+    {
+      /* assert (*p & 127) == c */
+
+      if ( name >= limit )
+      {
+        if ( (p[0] & 128) == 0 &&
+             (p[1] & 128) != 0 )
+          return (unsigned long)( ( (int)p[2] << 8 ) | p[3] );
+
+        goto NotFound;
+      }
+      c = *name++;
+      if ( p[0] & 128 )
+      {
+        p++;
+        if ( c != (p[0] & 127) )
+          goto NotFound;
+
+        continue;
+      }
+
+      p++;
+      count = p[0] & 127;
+      if ( p[0] & 128 )
+        p += 2;
+
+      p++;
+
+      for ( ; count > 0; count--, p += 2 )
+      {
+        int                   offset = ( (int)p[0] << 8 ) | p[1];
+        const unsigned char*  q      = ft_adobe_glyph_list + offset;
+
+        if ( c == ( q[0] & 127 ) )
+        {
+          p = q;
+          goto NextIter;
+        }
+      }
+      goto NotFound;
+
+    NextIter:
+      ;
+    }
+
+  NotFound:
+    return 0;
+  }
+
+#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
+
+""" )
+
+  if 0:  # generate unit test, or don't
+    #
+    # now write the unit test to check that everything works OK
+    #
+    write( "#ifdef TEST\n\n" )
+
+    write( "static const char* const  the_names[] = {\n" )
+    for name in agl_glyphs:
+      write( '  "' + name + '",\n' )
+    write( "  0\n};\n" )
+
+    write( "static const unsigned long  the_values[] = {\n" )
+    for val in agl_values:
+      write( '  0x' + val + ',\n' )
+    write( "  0\n};\n" )
+
+    write( """
+#include <stdlib.h>
+#include <stdio.h>
+
+  int
+  main( void )
+  {
+    int                   result = 0;
+    const char* const*    names  = the_names;
+    const unsigned long*  values = the_values;
+
+
+    for ( ; *names; names++, values++ )
+    {
+      const char*    name      = *names;
+      unsigned long  reference = *values;
+      unsigned long  value;
+
+
+      value = ft_get_adobe_glyph_index( name, name + strlen( name ) );
+      if ( value != reference )
+      {
+        result = 1;
+        fprintf( stderr, "name '%s' => %04x instead of %04x\\n",
+                         name, value, reference );
+      }
+    }
+
+    return result;
+  }
+""" )
+
+    write( "#endif /* TEST */\n" )
+
+  write("\n/* END */\n")
+
+
+# Now run the main routine
+#
+main()
+
+
+# END
diff --git a/src/tools/test_afm.c b/src/tools/test_afm.c
new file mode 100644 (file)
index 0000000..f5f9936
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ * gcc -DFT2_BUILD_LIBRARY -I../../include -o test_afm test_afm.c \
+ *     -L../../objs/.libs -lfreetype -lz -static
+ */
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+
+  void dump_fontinfo( AFM_FontInfo  fi )
+  {
+    FT_Int  i;
+
+
+    printf( "This AFM is for %sCID font.\n\n",
+            ( fi->IsCIDFont ) ? "" : "non-" );
+
+    printf( "FontBBox: %.2f %.2f %.2f %.2f\n", fi->FontBBox.xMin / 65536.,
+                                               fi->FontBBox.yMin / 65536.,
+                                               fi->FontBBox.xMax / 65536.,
+                                               fi->FontBBox.yMax / 65536. );
+    printf( "Ascender: %.2f\n", fi->Ascender / 65536. );
+    printf( "Descender: %.2f\n\n", fi->Descender / 65536. );
+
+    if ( fi->NumTrackKern )
+      printf( "There are %d sets of track kernings:\n",
+              fi->NumTrackKern );
+    else
+      printf( "There is no track kerning.\n" );
+
+    for ( i = 0; i < fi->NumTrackKern; i++ )
+    {
+      AFM_TrackKern  tk = fi->TrackKerns + i;
+
+
+      printf( "\t%2d: %5.2f %5.2f %5.2f %5.2f\n", tk->degree,
+                                                  tk->min_ptsize / 65536.,
+                                                  tk->min_kern / 65536.,
+                                                  tk->max_ptsize / 65536.,
+                                                  tk->max_kern / 65536. );
+    }
+
+    printf( "\n" );
+
+    if ( fi->NumKernPair )
+      printf( "There are %d kerning pairs:\n",
+              fi->NumKernPair );
+    else
+      printf( "There is no kerning pair.\n" );
+
+    for ( i = 0; i < fi->NumKernPair; i++ )
+    {
+      AFM_KernPair  kp = fi->KernPairs + i;
+
+
+      printf( "\t%3d + %3d => (%4d, %4d)\n", kp->index1,
+                                             kp->index2,
+                                             kp->x,
+                                             kp->y );
+    }
+
+  }
+
+  int
+  dummy_get_index( const char*  name,
+                   FT_Offset    len,
+                   void*        user_data )
+  {
+    if ( len )
+      return name[0];
+    else
+      return 0;
+  }
+
+  FT_Error
+  parse_afm( FT_Library    library,
+             FT_Stream     stream,
+             AFM_FontInfo  fi )
+  {
+    PSAux_Service  psaux;
+    AFM_ParserRec  parser;
+    FT_Error       error = FT_Err_Ok;
+
+
+    psaux = (PSAux_Service)FT_Get_Module_Interface( library, "psaux" );
+    if ( !psaux || !psaux->afm_parser_funcs )
+      return -1;
+
+    error = FT_Stream_EnterFrame( stream, stream->size );
+    if ( error )
+      return error;
+
+    error = psaux->afm_parser_funcs->init( &parser,
+                                           library->memory,
+                                           stream->cursor,
+                                           stream->limit );
+    if ( error )
+      return error;
+
+    parser.FontInfo = fi;
+    parser.get_index = dummy_get_index;
+
+    error = psaux->afm_parser_funcs->parse( &parser );
+
+    psaux->afm_parser_funcs->done( &parser );
+
+    return error;
+  }
+
+
+  int main( int    argc,
+            char** argv )
+  {
+    FT_Library       library;
+    FT_StreamRec     stream;
+    FT_Error         error = FT_Err_Ok;
+    AFM_FontInfoRec  fi;
+
+
+    if ( argc < 2 )
+      return FT_Err_Invalid_Argument;
+
+    error = FT_Init_FreeType( &library );
+    if ( error )
+      return error;
+
+    FT_ZERO( &stream );
+    error = FT_Stream_Open( &stream, argv[1] );
+    if ( error )
+      goto Exit;
+    stream.memory = library->memory;
+
+    FT_ZERO( &fi );
+    error = parse_afm( library, &stream, &fi );
+
+    if ( !error )
+    {
+      FT_Memory  memory = library->memory;
+
+
+      dump_fontinfo( &fi );
+
+      if ( fi.KernPairs )
+        FT_FREE( fi.KernPairs );
+      if ( fi.TrackKerns )
+        FT_FREE( fi.TrackKerns );
+    }
+    else
+      printf( "parse error\n" );
+
+    FT_Stream_Close( &stream );
+
+  Exit:
+    FT_Done_FreeType( library );
+
+    return error;
+  }
diff --git a/src/tools/test_bbox.c b/src/tools/test_bbox.c
new file mode 100644 (file)
index 0000000..e085c5b
--- /dev/null
@@ -0,0 +1,160 @@
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_BBOX_H
+
+
+#include <time.h>    /* for clock() */
+
+/* SunOS 4.1.* does not define CLOCKS_PER_SEC, so include <sys/param.h> */
+/* to get the HZ macro which is the equivalent.                         */
+#if defined(__sun__) && !defined(SVR4) && !defined(__SVR4)
+#include <sys/param.h>
+#define CLOCKS_PER_SEC HZ
+#endif
+
+  static long
+  get_time( void )
+  {
+    return clock() * 10000L / CLOCKS_PER_SEC;
+  }
+
+
+
+
+  /* test bbox computations */
+
+#define  XSCALE    65536
+#define  XX(x)     ((FT_Pos)(x*XSCALE))
+#define  XVEC(x,y)  { XX(x), XX(y) }
+#define  XVAL(x)   ((x)/(1.0*XSCALE))
+
+  /* dummy outline #1 */
+  static FT_Vector  dummy_vec_1[4] =
+  {
+#if 1
+    XVEC( 408.9111, 535.3164 ),
+    XVEC( 455.8887, 634.396  ),
+    XVEC( -37.8765, 786.2207 ),
+    XVEC( 164.6074, 535.3164 )
+#else
+    { (FT_Int32)0x0198E93DL , (FT_Int32)0x021750FFL },  /* 408.9111, 535.3164 */
+    { (FT_Int32)0x01C7E312L , (FT_Int32)0x027A6560L },  /* 455.8887, 634.3960 */
+    { (FT_Int32)0xFFDA1F9EL , (FT_Int32)0x0312387FL },  /* -37.8765, 786.2207 */
+    { (FT_Int32)0x00A49B7EL , (FT_Int32)0x021750FFL }   /* 164.6074, 535.3164 */
+#endif
+   };
+
+  static char  dummy_tag_1[4] =
+  {
+    FT_CURVE_TAG_ON,
+    FT_CURVE_TAG_CUBIC,
+    FT_CURVE_TAG_CUBIC,
+    FT_CURVE_TAG_ON
+  };
+
+  static short  dummy_contour_1[1] =
+  {
+    3
+  };
+
+  static FT_Outline  dummy_outline_1 =
+  {
+    1,
+    4,
+    dummy_vec_1,
+    dummy_tag_1,
+    dummy_contour_1,
+    0
+  };
+
+
+  /* dummy outline #2 */
+  static FT_Vector  dummy_vec_2[4] =
+  {
+    XVEC( 100.0, 100.0 ),
+    XVEC( 100.0, 200.0 ),
+    XVEC( 200.0, 200.0 ),
+    XVEC( 200.0, 133.0 )
+  };
+
+  static FT_Outline  dummy_outline_2 =
+  {
+    1,
+    4,
+    dummy_vec_2,
+    dummy_tag_1,
+    dummy_contour_1,
+    0
+  };
+
+
+  static void
+  dump_outline( FT_Outline*  outline )
+  {
+    FT_BBox  bbox;
+
+    /* compute and display cbox */
+    FT_Outline_Get_CBox( outline, &bbox );
+    printf( "cbox = [%.2f %.2f %.2f %.2f]\n",
+             XVAL( bbox.xMin ),
+             XVAL( bbox.yMin ),
+             XVAL( bbox.xMax ),
+             XVAL( bbox.yMax ) );
+
+    /* compute and display bbox */
+    FT_Outline_Get_BBox( outline, &bbox );
+    printf( "bbox = [%.2f %.2f %.2f %.2f]\n",
+             XVAL( bbox.xMin ),
+             XVAL( bbox.yMin ),
+             XVAL( bbox.xMax ),
+             XVAL( bbox.yMax ) );
+  }
+
+
+
+  static void
+  profile_outline( FT_Outline*   outline,
+                   long          repeat )
+  {
+    FT_BBox  bbox;
+    long     count;
+    long     time0;
+
+    time0 = get_time();
+    for ( count = repeat; count > 0; count-- )
+      FT_Outline_Get_CBox( outline, &bbox );
+
+    time0 = get_time() - time0;
+    printf( "time = %5.2f cbox = [%.2f %.2f %.2f %.2f]\n",
+             ((double)time0/10000.0),
+             XVAL( bbox.xMin ),
+             XVAL( bbox.yMin ),
+             XVAL( bbox.xMax ),
+             XVAL( bbox.yMax ) );
+
+
+    time0 = get_time();
+    for ( count = repeat; count > 0; count-- )
+      FT_Outline_Get_BBox( outline, &bbox );
+
+    time0 = get_time() - time0;
+    printf( "time = %5.2f bbox = [%.2f %.2f %.2f %.2f]\n",
+             ((double)time0/10000.0),
+             XVAL( bbox.xMin ),
+             XVAL( bbox.yMin ),
+             XVAL( bbox.xMax ),
+             XVAL( bbox.yMax ) );
+  }
+
+#define REPEAT  100000L
+
+  int  main( int  argc, char**  argv )
+  {
+    printf( "outline #1\n" );
+    profile_outline( &dummy_outline_1, REPEAT );
+
+    printf( "outline #2\n" );
+    profile_outline( &dummy_outline_2, REPEAT );
+    return 0;
+  }
+
diff --git a/src/tools/test_trig.c b/src/tools/test_trig.c
new file mode 100644 (file)
index 0000000..8c8a544
--- /dev/null
@@ -0,0 +1,236 @@
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_TRIGONOMETRY_H
+
+#include <math.h>
+#include <stdio.h>
+
+#define  PI   3.14159265358979323846
+#define  SPI  (PI/FT_ANGLE_PI)
+
+/* the precision in 16.16 fixed float points of the checks. Expect */
+/* between 2 and 5 noise LSB bits during operations, due to        */
+/* rounding errors..                                               */
+#define  THRESHOLD  64
+
+  static  error = 0;
+
+  static void
+  test_cos( void )
+  {
+    FT_Fixed  f1, f2;
+    double    d1, d2;
+    int       i;
+
+    for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )
+    {
+      f1 = FT_Cos(i);
+      d1 = f1/65536.0;
+      d2 = cos( i*SPI );
+      f2 = (FT_Fixed)(d2*65536.0);
+
+      if ( abs( f2-f1 ) > THRESHOLD )
+      {
+        error = 1;
+        printf( "FT_Cos[%3d] = %.7f  cos[%3d] = %.7f\n",
+                (i >> 16), f1/65536.0, (i >> 16), d2 );
+      }
+    }
+  }
+
+
+
+  static void
+  test_sin( void )
+  {
+    FT_Fixed  f1, f2;
+    double    d1, d2;
+    int       i;
+
+    for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )
+    {
+      f1 = FT_Sin(i);
+      d1 = f1/65536.0;
+      d2 = sin( i*SPI );
+      f2 = (FT_Fixed)(d2*65536.0);
+
+      if ( abs( f2-f1 ) > THRESHOLD )
+      {
+        error = 1;
+        printf( "FT_Sin[%3d] = %.7f  sin[%3d] = %.7f\n",
+                (i >> 16), f1/65536.0, (i >> 16), d2 );
+      }
+    }
+  }
+
+
+  static void
+  test_tan( void )
+  {
+    FT_Fixed  f1, f2;
+    double    d1, d2;
+    int       i;
+
+    for ( i = 0; i < FT_ANGLE_PI2-0x2000000; i += 0x10000 )
+    {
+      f1 = FT_Tan(i);
+      d1 = f1/65536.0;
+      d2 = tan( i*SPI );
+      f2 = (FT_Fixed)(d2*65536.0);
+
+      if ( abs( f2-f1 ) > THRESHOLD )
+      {
+        error = 1;
+        printf( "FT_Tan[%3d] = %.7f  tan[%3d] = %.7f\n",
+                (i >> 16), f1/65536.0, (i >> 16), d2 );
+      }
+    }
+  }
+
+
+  static void
+  test_atan2( void )
+  {
+    FT_Fixed  c2, s2;
+    double    l, a, c1, s1;
+    int       i, j;
+
+    for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )
+    {
+      l  = 5.0;
+      a  = i*SPI;
+
+      c1 = l * cos(a);
+      s1 = l * sin(a);
+
+      c2 = (FT_Fixed)(c1*65536.0);
+      s2 = (FT_Fixed)(s1*65536.0);
+
+      j  = FT_Atan2( c2, s2 );
+      if ( j < 0 )
+        j += FT_ANGLE_2PI;
+
+      if ( abs( i - j ) > 1 )
+      {
+        printf( "FT_Atan2( %.7f, %.7f ) = %.5f, atan = %.5f\n",
+                c2/65536.0, s2/65536.0, j/65536.0, i/65536.0 );
+      }
+    }
+  }
+
+  static void
+  test_unit( void )
+  {
+    FT_Vector  v;
+    double     a, c1, s1;
+    FT_Fixed   c2, s2;
+    int        i;
+
+    for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )
+    {
+      FT_Vector_Unit( &v, i );
+      a  = ( i*SPI );
+      c1 = cos(a);
+      s1 = sin(a);
+      c2 = (FT_Fixed)(c1*65536.0);
+      s2 = (FT_Fixed)(s1*65536.0);
+
+      if ( abs( v.x-c2 ) > THRESHOLD ||
+           abs( v.y-s2 ) > THRESHOLD )
+      {
+        error = 1;
+        printf( "FT_Vector_Unit[%3d] = ( %.7f, %.7f )  vec = ( %.7f, %.7f )\n",
+                (i >> 16),
+                v.x/65536.0, v.y/65536.0,
+                c1, s1 );
+      }
+    }
+  }
+
+
+  static void
+  test_length( void )
+  {
+    FT_Vector  v;
+    FT_Fixed   l, l2;
+    int        i;
+
+    for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )
+    {
+      l   = (FT_Fixed)(500.0*65536.0);
+      v.x = (FT_Fixed)( l * cos( i*SPI ) );
+      v.y = (FT_Fixed)( l * sin( i*SPI ) );
+      l2  = FT_Vector_Length( &v );
+
+      if ( abs( l2-l ) > THRESHOLD )
+      {
+        error = 1;
+        printf( "FT_Length( %.7f, %.7f ) = %.5f, length = %.5f\n",
+                v.x/65536.0, v.y/65536.0, l2/65536.0, l/65536.0 );
+      }
+    }
+  }
+
+
+  static void
+  test_rotate( void )
+  {
+    FT_Fixed  c2, s2, c4, s4;
+    FT_Vector v;
+    double    l, ra, a, c1, s1, cra, sra, c3, s3;
+    int       i, j, rotate;
+
+    for ( rotate = 0; rotate < FT_ANGLE_2PI; rotate += 0x10000 )
+    {
+      ra  = rotate*SPI;
+      cra = cos( ra );
+      sra = sin( ra );
+
+      for ( i = 0; i < FT_ANGLE_2PI; i += 0x10000 )
+      {
+        l  = 500.0;
+        a  = i*SPI;
+
+        c1 = l * cos(a);
+        s1 = l * sin(a);
+
+        v.x = c2 = (FT_Fixed)(c1*65536.0);
+        v.y = s2 = (FT_Fixed)(s1*65536.0);
+
+        FT_Vector_Rotate( &v, rotate );
+
+        c3 = c1 * cra - s1 * sra;
+        s3 = c1 * sra + s1 * cra;
+
+        c4 = (FT_Fixed)(c3*65536.0);
+        s4 = (FT_Fixed)(s3*65536.0);
+
+        if ( abs( c4 - v.x ) > THRESHOLD ||
+             abs( s4 - v.y ) > THRESHOLD )
+        {
+          error = 1;
+          printf( "FT_Rotate( (%.7f,%.7f), %.5f ) = ( %.7f, %.7f ), rot = ( %.7f, %.7f )\n",
+                  c1, s1, ra,
+                  c2/65536.0, s2/65536.0,
+                  c4/65536.0, s4/65536.0 );
+        }
+      }
+    }
+  }
+
+
+  int main( void )
+  {
+    test_cos();
+    test_sin();
+    test_tan();
+    test_atan2();
+    test_unit();
+    test_length();
+    test_rotate();
+
+    if (!error)
+      printf( "trigonometry test ok !\n" );
+
+    return !error;
+  }
diff --git a/src/truetype/Jamfile b/src/truetype/Jamfile
new file mode 100644 (file)
index 0000000..a8cccfe
--- /dev/null
@@ -0,0 +1,29 @@
+# FreeType 2 src/truetype Jamfile
+#
+# Copyright 2001, 2004 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) truetype ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = ttdriver ttobjs ttpload ttgload ttinterp ttgxvar ttpic ;
+  }
+  else
+  {
+    _sources = truetype ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/truetype Jamfile
diff --git a/src/truetype/module.mk b/src/truetype/module.mk
new file mode 100644 (file)
index 0000000..baee81a
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# FreeType 2 TrueType module definition
+#
+
+
+# Copyright 1996-2000, 2006 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.
+
+
+FTMODULE_H_COMMANDS += TRUETYPE_DRIVER
+
+define TRUETYPE_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, tt_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)truetype  $(ECHO_DRIVER_DESC)Windows/Mac font files with extension *.ttf or *.ttc$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/src/truetype/rules.mk b/src/truetype/rules.mk
new file mode 100644 (file)
index 0000000..507ef16
--- /dev/null
@@ -0,0 +1,73 @@
+#
+# FreeType 2 TrueType driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003, 2004, 2011 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.
+
+
+# TrueType driver directory
+#
+TT_DIR := $(SRC_DIR)/truetype
+
+
+# compilation flags for the driver
+#
+TT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(TT_DIR))
+
+
+# TrueType driver sources (i.e., C files)
+#
+TT_DRV_SRC := $(TT_DIR)/ttdriver.c \
+              $(TT_DIR)/ttgload.c  \
+              $(TT_DIR)/ttgxvar.c  \
+              $(TT_DIR)/ttinterp.c \
+              $(TT_DIR)/ttobjs.c   \
+              $(TT_DIR)/ttpic.c    \
+              $(TT_DIR)/ttpload.c
+
+# TrueType driver headers
+#
+TT_DRV_H := $(TT_DRV_SRC:%.c=%.h) \
+            $(TT_DIR)/tterrors.h
+
+
+# TrueType driver object(s)
+#
+#   TT_DRV_OBJ_M is used during `multi' builds
+#   TT_DRV_OBJ_S is used during `single' builds
+#
+TT_DRV_OBJ_M := $(TT_DRV_SRC:$(TT_DIR)/%.c=$(OBJ_DIR)/%.$O)
+TT_DRV_OBJ_S := $(OBJ_DIR)/truetype.$O
+
+# TrueType driver source file for single build
+#
+TT_DRV_SRC_S := $(TT_DIR)/truetype.c
+
+
+# TrueType driver - single object
+#
+$(TT_DRV_OBJ_S): $(TT_DRV_SRC_S) $(TT_DRV_SRC) $(FREETYPE_H) $(TT_DRV_H)
+       $(TT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(TT_DRV_SRC_S))
+
+
+# driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(TT_DIR)/%.c $(FREETYPE_H) $(TT_DRV_H)
+       $(TT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(TT_DRV_OBJ_S)
+DRV_OBJS_M += $(TT_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/truetype/truetype.c b/src/truetype/truetype.c
new file mode 100644 (file)
index 0000000..4bd1209
--- /dev/null
@@ -0,0 +1,37 @@
+/***************************************************************************/
+/*                                                                         */
+/*  truetype.c                                                             */
+/*                                                                         */
+/*    FreeType TrueType driver component (body only).                      */
+/*                                                                         */
+/*  Copyright 1996-2001, 2004, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include <ft2build.h>
+#include "ttpic.c"
+#include "ttdriver.c"   /* driver interface    */
+#include "ttpload.c"    /* tables loader       */
+#include "ttgload.c"    /* glyph loader        */
+#include "ttobjs.c"     /* object manager      */
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+#include "ttinterp.c"
+#endif
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.c"    /* gx distortable font */
+#endif
+
+
+/* END */
diff --git a/src/truetype/ttdriver.c b/src/truetype/ttdriver.c
new file mode 100644 (file)
index 0000000..3669d45
--- /dev/null
@@ -0,0 +1,502 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttdriver.c                                                             */
+/*                                                                         */
+/*    TrueType font driver implementation (body).                          */
+/*                                                                         */
+/*  Copyright 1996-2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_SFNT_H
+#include FT_SERVICE_XFREE86_NAME_H
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include FT_MULTIPLE_MASTERS_H
+#include FT_SERVICE_MULTIPLE_MASTERS_H
+#endif
+
+#include FT_SERVICE_TRUETYPE_ENGINE_H
+#include FT_SERVICE_TRUETYPE_GLYF_H
+
+#include "ttdriver.h"
+#include "ttgload.h"
+#include "ttpload.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.h"
+#endif
+
+#include "tterrors.h"
+
+#include "ttpic.h"
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttdriver
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                          F A C E S                              ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#undef  PAIR_TAG
+#define PAIR_TAG( left, right )  ( ( (FT_ULong)left << 16 ) | \
+                                     (FT_ULong)right        )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_get_kerning                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A driver method used to return the kerning vector between two      */
+  /*    glyphs of the same face.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face        :: A handle to the source face object.                 */
+  /*                                                                       */
+  /*    left_glyph  :: The index of the left glyph in the kern pair.       */
+  /*                                                                       */
+  /*    right_glyph :: The index of the right glyph in the kern pair.      */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    kerning     :: The kerning vector.  This is in font units for      */
+  /*                   scalable formats, and in pixels for fixed-sizes     */
+  /*                   formats.                                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only horizontal layouts (left-to-right & right-to-left) are        */
+  /*    supported by this function.  Other layouts, or more sophisticated  */
+  /*    kernings, are out of scope of this method (the basic driver        */
+  /*    interface is meant to be simple).                                  */
+  /*                                                                       */
+  /*    They can be implemented by format-specific interfaces.             */
+  /*                                                                       */
+  static FT_Error
+  tt_get_kerning( FT_Face     ttface,          /* TT_Face */
+                  FT_UInt     left_glyph,
+                  FT_UInt     right_glyph,
+                  FT_Vector*  kerning )
+  {
+    TT_Face       face = (TT_Face)ttface;
+    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
+
+
+    kerning->x = 0;
+    kerning->y = 0;
+
+    if ( sfnt )
+      kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );
+
+    return 0;
+  }
+
+
+#undef PAIR_TAG
+
+
+  static FT_Error
+  tt_get_advances( FT_Face    ttface,
+                   FT_UInt    start,
+                   FT_UInt    count,
+                   FT_Int32   flags,
+                   FT_Fixed  *advances )
+  {
+    FT_UInt  nn;
+    TT_Face  face  = (TT_Face) ttface;
+
+
+    /* XXX: TODO: check for sbits */
+
+    if ( flags & FT_LOAD_VERTICAL_LAYOUT )
+    {
+      for ( nn = 0; nn < count; nn++ )
+      {
+        FT_Short   tsb;
+        FT_UShort  ah;
+
+
+        TT_Get_VMetrics( face, start + nn, &tsb, &ah );
+        advances[nn] = ah;
+      }
+    }
+    else
+    {
+      for ( nn = 0; nn < count; nn++ )
+      {
+        FT_Short   lsb;
+        FT_UShort  aw;
+
+
+        TT_Get_HMetrics( face, start + nn, &lsb, &aw );
+        advances[nn] = aw;
+      }
+    }
+
+    return TT_Err_Ok;
+  }
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                           S I Z E S                             ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+  static FT_Error
+  tt_size_select( FT_Size   size,
+                  FT_ULong  strike_index )
+  {
+    TT_Face   ttface = (TT_Face)size->face;
+    TT_Size   ttsize = (TT_Size)size;
+    FT_Error  error  = TT_Err_Ok;
+
+
+    ttsize->strike_index = strike_index;
+
+    if ( FT_IS_SCALABLE( size->face ) )
+    {
+      /* use the scaled metrics, even when tt_size_reset fails */
+      FT_Select_Metrics( size->face, strike_index );
+
+      tt_size_reset( ttsize );
+    }
+    else
+    {
+      SFNT_Service      sfnt    = (SFNT_Service) ttface->sfnt;
+      FT_Size_Metrics*  metrics = &size->metrics;
+
+
+      error = sfnt->load_strike_metrics( ttface, strike_index, metrics );
+      if ( error )
+        ttsize->strike_index = 0xFFFFFFFFUL;
+    }
+
+    return error;
+  }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+  static FT_Error
+  tt_size_request( FT_Size          size,
+                   FT_Size_Request  req )
+  {
+    TT_Size   ttsize = (TT_Size)size;
+    FT_Error  error  = TT_Err_Ok;
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+    if ( FT_HAS_FIXED_SIZES( size->face ) )
+    {
+      TT_Face       ttface = (TT_Face)size->face;
+      SFNT_Service  sfnt   = (SFNT_Service) ttface->sfnt;
+      FT_ULong      strike_index;
+
+
+      error = sfnt->set_sbit_strike( ttface, req, &strike_index );
+
+      if ( error )
+        ttsize->strike_index = 0xFFFFFFFFUL;
+      else
+        return tt_size_select( size, strike_index );
+    }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+    FT_Request_Metrics( size->face, req );
+
+    if ( FT_IS_SCALABLE( size->face ) )
+    {
+      error = tt_size_reset( ttsize );
+      ttsize->root.metrics = ttsize->metrics;
+    }
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_glyph_load                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A driver method used to load a glyph within a given glyph slot.    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    slot        :: A handle to the target slot object where the glyph  */
+  /*                   will be loaded.                                     */
+  /*                                                                       */
+  /*    size        :: A handle to the source face size at which the glyph */
+  /*                   must be scaled, loaded, etc.                        */
+  /*                                                                       */
+  /*    glyph_index :: The index of the glyph in the font file.            */
+  /*                                                                       */
+  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
+  /*                   FT_LOAD_XXX constants can be used to control the    */
+  /*                   glyph loading process (e.g., whether the outline    */
+  /*                   should be scaled, whether to load bitmaps or not,   */
+  /*                   whether to hint the outline, etc).                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  static FT_Error
+  tt_glyph_load( FT_GlyphSlot  ttslot,      /* TT_GlyphSlot */
+                 FT_Size       ttsize,      /* TT_Size      */
+                 FT_UInt       glyph_index,
+                 FT_Int32      load_flags )
+  {
+    TT_GlyphSlot  slot = (TT_GlyphSlot)ttslot;
+    TT_Size       size = (TT_Size)ttsize;
+    FT_Face       face = ttslot->face;
+    FT_Error      error;
+
+
+    if ( !slot )
+      return TT_Err_Invalid_Slot_Handle;
+
+    if ( !size )
+      return TT_Err_Invalid_Size_Handle;
+
+    if ( !face )
+      return TT_Err_Invalid_Argument;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    if ( glyph_index >= (FT_UInt)face->num_glyphs &&
+         !face->internal->incremental_interface   )
+#else
+    if ( glyph_index >= (FT_UInt)face->num_glyphs )
+#endif
+      return TT_Err_Invalid_Argument;
+
+    if ( load_flags & FT_LOAD_NO_HINTING )
+    {
+      /* both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT   */
+      /* are necessary to disable hinting for tricky fonts */
+
+      if ( FT_IS_TRICKY( face ) )
+        load_flags &= ~FT_LOAD_NO_HINTING;
+
+      if ( load_flags & FT_LOAD_NO_AUTOHINT )
+        load_flags |= FT_LOAD_NO_HINTING;
+    }
+
+    if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) )
+    {
+      load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE;
+
+      if ( !FT_IS_TRICKY( face ) )
+        load_flags |= FT_LOAD_NO_HINTING;
+    }
+
+    /* now load the glyph outline if necessary */
+    error = TT_Load_Glyph( size, slot, glyph_index, load_flags );
+
+    /* force drop-out mode to 2 - irrelevant now */
+    /* slot->outline.dropout_mode = 2; */
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /****                D R I V E R  I N T E R F A C E                   ****/
+  /****                                                                 ****/
+  /****                                                                 ****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+  FT_DEFINE_SERVICE_MULTIMASTERSREC(tt_service_gx_multi_masters,
+    (FT_Get_MM_Func)        NULL,
+    (FT_Set_MM_Design_Func) NULL,
+    (FT_Set_MM_Blend_Func)  TT_Set_MM_Blend,
+    (FT_Get_MM_Var_Func)    TT_Get_MM_Var,
+    (FT_Set_Var_Design_Func)TT_Set_Var_Design
+  )
+#endif
+
+  static const FT_Service_TrueTypeEngineRec  tt_service_truetype_engine =
+  {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    FT_TRUETYPE_ENGINE_TYPE_UNPATENTED
+#else
+    FT_TRUETYPE_ENGINE_TYPE_PATENTED
+#endif
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+    FT_TRUETYPE_ENGINE_TYPE_NONE
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+  };
+
+  FT_DEFINE_SERVICE_TTGLYFREC(tt_service_truetype_glyf,
+    (TT_Glyf_GetLocationFunc)tt_face_get_location
+  )
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+  FT_DEFINE_SERVICEDESCREC4(tt_services,
+    FT_SERVICE_ID_XF86_NAME,       FT_XF86_FORMAT_TRUETYPE,
+    FT_SERVICE_ID_MULTI_MASTERS,   &FT_TT_SERVICE_GX_MULTI_MASTERS_GET,
+    FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,
+    FT_SERVICE_ID_TT_GLYF,         &FT_TT_SERVICE_TRUETYPE_GLYF_GET
+  )
+#else
+  FT_DEFINE_SERVICEDESCREC3(tt_services,
+    FT_SERVICE_ID_XF86_NAME,       FT_XF86_FORMAT_TRUETYPE,
+    FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine,
+    FT_SERVICE_ID_TT_GLYF,         &FT_TT_SERVICE_TRUETYPE_GLYF_GET
+  )
+#endif
+
+  FT_CALLBACK_DEF( FT_Module_Interface )
+  tt_get_interface( FT_Module    driver,    /* TT_Driver */
+                    const char*  tt_interface )
+  {
+    FT_Library           library;
+    FT_Module_Interface  result;
+    FT_Module            sfntd;
+    SFNT_Service         sfnt;
+
+
+    /* FT_TT_SERVICES_GET derefers `library' in PIC mode */
+#ifdef FT_CONFIG_OPTION_PIC
+    if ( !driver )
+      return NULL;
+    library = driver->library;
+    if ( !library )
+      return NULL;
+#endif
+
+    result = ft_service_list_lookup( FT_TT_SERVICES_GET, tt_interface );
+    if ( result != NULL )
+      return result;
+
+#ifndef FT_CONFIG_OPTION_PIC
+    if ( !driver )
+      return NULL;
+    library = driver->library;
+    if ( !library )
+      return NULL;
+#endif
+
+    /* only return the default interface from the SFNT module */
+    sfntd = FT_Get_Module( library, "sfnt" );
+    if ( sfntd )
+    {
+      sfnt = (SFNT_Service)( sfntd->clazz->module_interface );
+      if ( sfnt )
+        return sfnt->get_interface( driver, tt_interface );
+    }
+
+    return 0;
+  }
+
+
+  /* The FT_DriverInterface structure is defined in ftdriver.h. */
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+#define TT_HINTER_FLAG   FT_MODULE_DRIVER_HAS_HINTER
+#else
+#define TT_HINTER_FLAG   0
+#endif
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+#define TT_SIZE_SELECT    tt_size_select
+#else
+#define TT_SIZE_SELECT    0
+#endif
+
+  FT_DEFINE_DRIVER( tt_driver_class,
+
+      FT_MODULE_FONT_DRIVER     |
+      FT_MODULE_DRIVER_SCALABLE |
+      TT_HINTER_FLAG,
+
+      sizeof ( TT_DriverRec ),
+
+      "truetype",      /* driver name                           */
+      0x10000L,        /* driver version == 1.0                 */
+      0x20000L,        /* driver requires FreeType 2.0 or above */
+
+      (void*)0,        /* driver specific interface */
+
+      tt_driver_init,
+      tt_driver_done,
+      tt_get_interface,
+
+    sizeof ( TT_FaceRec ),
+    sizeof ( TT_SizeRec ),
+    sizeof ( FT_GlyphSlotRec ),
+
+    tt_face_init,
+    tt_face_done,
+    tt_size_init,
+    tt_size_done,
+    tt_slot_init,
+    0,                       /* FT_Slot_DoneFunc */
+
+    ft_stub_set_char_sizes,  /* FT_CONFIG_OPTION_OLD_INTERNALS */
+    ft_stub_set_pixel_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */
+
+    tt_glyph_load,
+
+    tt_get_kerning,
+    0,                       /* FT_Face_AttachFunc */
+    tt_get_advances,
+
+    tt_size_request,
+    TT_SIZE_SELECT
+  )
+
+
+/* END */
diff --git a/src/truetype/ttdriver.h b/src/truetype/ttdriver.h
new file mode 100644 (file)
index 0000000..aae00f2
--- /dev/null
@@ -0,0 +1,38 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttdriver.h                                                             */
+/*                                                                         */
+/*    High-level TrueType driver interface (specification).                */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTDRIVER_H__
+#define __TTDRIVER_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DRIVER_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_DECLARE_DRIVER( tt_driver_class )
+
+
+FT_END_HEADER
+
+#endif /* __TTDRIVER_H__ */
+
+
+/* END */
diff --git a/src/truetype/tterrors.h b/src/truetype/tterrors.h
new file mode 100644 (file)
index 0000000..78d138f
--- /dev/null
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/*                                                                         */
+/*  tterrors.h                                                             */
+/*                                                                         */
+/*    TrueType error codes (specification only).                           */
+/*                                                                         */
+/*  Copyright 2001, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the TrueType error enumeration            */
+  /* constants.                                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __TTERRORS_H__
+#define __TTERRORS_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  TT_Err_
+#define FT_ERR_BASE    FT_Mod_Err_TrueType
+
+#include FT_ERRORS_H
+
+#endif /* __TTERRORS_H__ */
+
+/* END */
diff --git a/src/truetype/ttgload.c b/src/truetype/ttgload.c
new file mode 100644 (file)
index 0000000..ce8c888
--- /dev/null
@@ -0,0 +1,2111 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttgload.c                                                              */
+/*                                                                         */
+/*    TrueType Glyph Loader (body).                                        */
+/*                                                                         */
+/*  Copyright 1996-2012                                                    */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_CALC_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_SFNT_H
+#include FT_TRUETYPE_TAGS_H
+#include FT_OUTLINE_H
+
+#include "ttgload.h"
+#include "ttpload.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.h"
+#endif
+
+#include "tterrors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttgload
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Composite glyph flags.                                                */
+  /*                                                                       */
+#define ARGS_ARE_WORDS             0x0001
+#define ARGS_ARE_XY_VALUES         0x0002
+#define ROUND_XY_TO_GRID           0x0004
+#define WE_HAVE_A_SCALE            0x0008
+/* reserved                        0x0010 */
+#define MORE_COMPONENTS            0x0020
+#define WE_HAVE_AN_XY_SCALE        0x0040
+#define WE_HAVE_A_2X2              0x0080
+#define WE_HAVE_INSTR              0x0100
+#define USE_MY_METRICS             0x0200
+#define OVERLAP_COMPOUND           0x0400
+#define SCALED_COMPONENT_OFFSET    0x0800
+#define UNSCALED_COMPONENT_OFFSET  0x1000
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Return the horizontal metrics in font units for a given glyph.        */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  TT_Get_HMetrics( TT_Face     face,
+                   FT_UInt     idx,
+                   FT_Short*   lsb,
+                   FT_UShort*  aw )
+  {
+    ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, idx, lsb, aw );
+
+    FT_TRACE5(( "  advance width (font units): %d\n", *aw ));
+    FT_TRACE5(( "  left side bearing (font units): %d\n", *lsb ));
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Return the vertical metrics in font units for a given glyph.          */
+  /* Greg Hitchcock from Microsoft told us that if there were no `vmtx'    */
+  /* table, typoAscender/Descender from the `OS/2' table would be used     */
+  /* instead, and if there were no `OS/2' table, use ascender/descender    */
+  /* from the `hhea' table.  But that is not what Microsoft's rasterizer   */
+  /* apparently does: It uses the ppem value as the advance height, and    */
+  /* sets the top side bearing to be zero.                                 */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  TT_Get_VMetrics( TT_Face     face,
+                   FT_UInt     idx,
+                   FT_Short*   tsb,
+                   FT_UShort*  ah )
+  {
+    if ( face->vertical_info )
+      ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, idx, tsb, ah );
+
+#if 1             /* Empirically determined, at variance with what MS said */
+
+    else
+    {
+      *tsb = 0;
+      *ah  = face->root.units_per_EM;
+    }
+
+#else      /* This is what MS said to do.  It isn't what they do, however. */
+
+    else if ( face->os2.version != 0xFFFFU )
+    {
+      *tsb = face->os2.sTypoAscender;
+      *ah  = face->os2.sTypoAscender - face->os2.sTypoDescender;
+    }
+    else
+    {
+      *tsb = face->horizontal.Ascender;
+      *ah  = face->horizontal.Ascender - face->horizontal.Descender;
+    }
+
+#endif
+
+    FT_TRACE5(( "  advance height (font units): %d\n", *ah ));
+    FT_TRACE5(( "  top side bearing (font units): %d\n", *tsb ));
+  }
+
+
+  static void
+  tt_get_metrics( TT_Loader  loader,
+                  FT_UInt    glyph_index )
+  {
+    TT_Face  face = (TT_Face)loader->face;
+
+    FT_Short   left_bearing = 0, top_bearing = 0;
+    FT_UShort  advance_width = 0, advance_height = 0;
+
+
+    TT_Get_HMetrics( face, glyph_index,
+                     &left_bearing,
+                     &advance_width );
+    TT_Get_VMetrics( face, glyph_index,
+                     &top_bearing,
+                     &advance_height );
+
+    loader->left_bearing = left_bearing;
+    loader->advance      = advance_width;
+    loader->top_bearing  = top_bearing;
+    loader->vadvance     = advance_height;
+
+    if ( !loader->linear_def )
+    {
+      loader->linear_def = 1;
+      loader->linear     = advance_width;
+    }
+  }
+
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+  static void
+  tt_get_metrics_incr_overrides( TT_Loader  loader,
+                                 FT_UInt    glyph_index )
+  {
+    TT_Face  face = (TT_Face)loader->face;
+
+    FT_Short   left_bearing = 0, top_bearing = 0;
+    FT_UShort  advance_width = 0, advance_height = 0;
+
+
+    /* If this is an incrementally loaded font check whether there are */
+    /* overriding metrics for this glyph.                              */
+    if ( face->root.internal->incremental_interface                           &&
+         face->root.internal->incremental_interface->funcs->get_glyph_metrics )
+    {
+      FT_Incremental_MetricsRec  metrics;
+      FT_Error                   error;
+
+
+      metrics.bearing_x = loader->left_bearing;
+      metrics.bearing_y = 0;
+      metrics.advance   = loader->advance;
+      metrics.advance_v = 0;
+
+      error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
+                face->root.internal->incremental_interface->object,
+                glyph_index, FALSE, &metrics );
+      if ( error )
+        goto Exit;
+
+      left_bearing  = (FT_Short)metrics.bearing_x;
+      advance_width = (FT_UShort)metrics.advance;
+
+#if 0
+
+      /* GWW: Do I do the same for vertical metrics? */
+      metrics.bearing_x = 0;
+      metrics.bearing_y = loader->top_bearing;
+      metrics.advance   = loader->vadvance;
+
+      error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
+                face->root.internal->incremental_interface->object,
+                glyph_index, TRUE, &metrics );
+      if ( error )
+        goto Exit;
+
+      top_bearing    = (FT_Short)metrics.bearing_y;
+      advance_height = (FT_UShort)metrics.advance;
+
+#endif /* 0 */
+
+      loader->left_bearing = left_bearing;
+      loader->advance      = advance_width;
+      loader->top_bearing  = top_bearing;
+      loader->vadvance     = advance_height;
+
+      if ( !loader->linear_def )
+      {
+        loader->linear_def = 1;
+        loader->linear     = advance_width;
+      }
+    }
+
+  Exit:
+    return;
+  }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Translates an array of coordinates.                                   */
+  /*                                                                       */
+  static void
+  translate_array( FT_UInt     n,
+                   FT_Vector*  coords,
+                   FT_Pos      delta_x,
+                   FT_Pos      delta_y )
+  {
+    FT_UInt  k;
+
+
+    if ( delta_x )
+      for ( k = 0; k < n; k++ )
+        coords[k].x += delta_x;
+
+    if ( delta_y )
+      for ( k = 0; k < n; k++ )
+        coords[k].y += delta_y;
+  }
+
+
+#undef  IS_HINTED
+#define IS_HINTED( flags )  ( ( flags & FT_LOAD_NO_HINTING ) == 0 )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The following functions are used by default with TrueType fonts.      */
+  /* However, they can be replaced by alternatives if we need to support   */
+  /* TrueType-compressed formats (like MicroType) in the future.           */
+  /*                                                                       */
+  /*************************************************************************/
+
+  FT_CALLBACK_DEF( FT_Error )
+  TT_Access_Glyph_Frame( TT_Loader  loader,
+                         FT_UInt    glyph_index,
+                         FT_ULong   offset,
+                         FT_UInt    byte_count )
+  {
+    FT_Error   error;
+    FT_Stream  stream = loader->stream;
+
+    /* for non-debug mode */
+    FT_UNUSED( glyph_index );
+
+
+    FT_TRACE4(( "Glyph %ld\n", glyph_index ));
+
+    /* the following line sets the `error' variable through macros! */
+    if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( byte_count ) )
+      return error;
+
+    loader->cursor = stream->cursor;
+    loader->limit  = stream->limit;
+
+    return TT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  TT_Forget_Glyph_Frame( TT_Loader  loader )
+  {
+    FT_Stream  stream = loader->stream;
+
+
+    FT_FRAME_EXIT();
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  TT_Load_Glyph_Header( TT_Loader  loader )
+  {
+    FT_Byte*  p     = loader->cursor;
+    FT_Byte*  limit = loader->limit;
+
+
+    if ( p + 10 > limit )
+      return TT_Err_Invalid_Outline;
+
+    loader->n_contours = FT_NEXT_SHORT( p );
+
+    loader->bbox.xMin = FT_NEXT_SHORT( p );
+    loader->bbox.yMin = FT_NEXT_SHORT( p );
+    loader->bbox.xMax = FT_NEXT_SHORT( p );
+    loader->bbox.yMax = FT_NEXT_SHORT( p );
+
+    FT_TRACE5(( "  # of contours: %d\n", loader->n_contours ));
+    FT_TRACE5(( "  xMin: %4d  xMax: %4d\n", loader->bbox.xMin,
+                                            loader->bbox.xMax ));
+    FT_TRACE5(( "  yMin: %4d  yMax: %4d\n", loader->bbox.yMin,
+                                            loader->bbox.yMax ));
+    loader->cursor = p;
+
+    return TT_Err_Ok;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  TT_Load_Simple_Glyph( TT_Loader  load )
+  {
+    FT_Error        error;
+    FT_Byte*        p          = load->cursor;
+    FT_Byte*        limit      = load->limit;
+    FT_GlyphLoader  gloader    = load->gloader;
+    FT_Int          n_contours = load->n_contours;
+    FT_Outline*     outline;
+    TT_Face         face       = (TT_Face)load->face;
+    FT_UShort       n_ins;
+    FT_Int          n_points;
+
+    FT_Byte         *flag, *flag_limit;
+    FT_Byte         c, count;
+    FT_Vector       *vec, *vec_limit;
+    FT_Pos          x;
+    FT_Short        *cont, *cont_limit, prev_cont;
+    FT_Int          xy_size = 0;
+
+
+    /* check that we can add the contours to the glyph */
+    error = FT_GLYPHLOADER_CHECK_POINTS( gloader, 0, n_contours );
+    if ( error )
+      goto Fail;
+
+    /* reading the contours' endpoints & number of points */
+    cont       = gloader->current.outline.contours;
+    cont_limit = cont + n_contours;
+
+    /* check space for contours array + instructions count */
+    if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit )
+      goto Invalid_Outline;
+
+    prev_cont = FT_NEXT_SHORT( p );
+
+    if ( n_contours > 0 )
+      cont[0] = prev_cont;
+
+    if ( prev_cont < 0 )
+      goto Invalid_Outline;
+
+    for ( cont++; cont < cont_limit; cont++ )
+    {
+      cont[0] = FT_NEXT_SHORT( p );
+      if ( cont[0] <= prev_cont )
+      {
+        /* unordered contours: this is invalid */
+        goto Invalid_Outline;
+      }
+      prev_cont = cont[0];
+    }
+
+    n_points = 0;
+    if ( n_contours > 0 )
+    {
+      n_points = cont[-1] + 1;
+      if ( n_points < 0 )
+        goto Invalid_Outline;
+    }
+
+    /* note that we will add four phantom points later */
+    error = FT_GLYPHLOADER_CHECK_POINTS( gloader, n_points + 4, 0 );
+    if ( error )
+      goto Fail;
+
+    /* reading the bytecode instructions */
+    load->glyph->control_len  = 0;
+    load->glyph->control_data = 0;
+
+    if ( p + 2 > limit )
+      goto Invalid_Outline;
+
+    n_ins = FT_NEXT_USHORT( p );
+
+    FT_TRACE5(( "  Instructions size: %u\n", n_ins ));
+
+    if ( n_ins > face->max_profile.maxSizeOfInstructions )
+    {
+      FT_TRACE0(( "TT_Load_Simple_Glyph: too many instructions (%d)\n",
+                  n_ins ));
+      error = TT_Err_Too_Many_Hints;
+      goto Fail;
+    }
+
+    if ( ( limit - p ) < n_ins )
+    {
+      FT_TRACE0(( "TT_Load_Simple_Glyph: instruction count mismatch\n" ));
+      error = TT_Err_Too_Many_Hints;
+      goto Fail;
+    }
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    if ( IS_HINTED( load->load_flags ) )
+    {
+      load->glyph->control_len  = n_ins;
+      load->glyph->control_data = load->exec->glyphIns;
+
+      FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins );
+    }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+    p += n_ins;
+
+    outline = &gloader->current.outline;
+
+    /* reading the point tags */
+    flag       = (FT_Byte*)outline->tags;
+    flag_limit = flag + n_points;
+
+    FT_ASSERT( flag != NULL );
+
+    while ( flag < flag_limit )
+    {
+      if ( p + 1 > limit )
+        goto Invalid_Outline;
+
+      *flag++ = c = FT_NEXT_BYTE( p );
+      if ( c & 8 )
+      {
+        if ( p + 1 > limit )
+          goto Invalid_Outline;
+
+        count = FT_NEXT_BYTE( p );
+        if ( flag + (FT_Int)count > flag_limit )
+          goto Invalid_Outline;
+
+        for ( ; count > 0; count-- )
+          *flag++ = c;
+      }
+    }
+
+    /* reading the X coordinates */
+
+    vec       = outline->points;
+    vec_limit = vec + n_points;
+    flag      = (FT_Byte*)outline->tags;
+    x         = 0;
+
+    if ( p + xy_size > limit )
+      goto Invalid_Outline;
+
+    for ( ; vec < vec_limit; vec++, flag++ )
+    {
+      FT_Pos   y = 0;
+      FT_Byte  f = *flag;
+
+
+      if ( f & 2 )
+      {
+        if ( p + 1 > limit )
+          goto Invalid_Outline;
+
+        y = (FT_Pos)FT_NEXT_BYTE( p );
+        if ( ( f & 16 ) == 0 )
+          y = -y;
+      }
+      else if ( ( f & 16 ) == 0 )
+      {
+        if ( p + 2 > limit )
+          goto Invalid_Outline;
+
+        y = (FT_Pos)FT_NEXT_SHORT( p );
+      }
+
+      x     += y;
+      vec->x = x;
+      /* the cast is for stupid compilers */
+      *flag  = (FT_Byte)( f & ~( 2 | 16 ) );
+    }
+
+    /* reading the Y coordinates */
+
+    vec       = gloader->current.outline.points;
+    vec_limit = vec + n_points;
+    flag      = (FT_Byte*)outline->tags;
+    x         = 0;
+
+    for ( ; vec < vec_limit; vec++, flag++ )
+    {
+      FT_Pos   y = 0;
+      FT_Byte  f = *flag;
+
+
+      if ( f & 4 )
+      {
+        if ( p + 1 > limit )
+          goto Invalid_Outline;
+
+        y = (FT_Pos)FT_NEXT_BYTE( p );
+        if ( ( f & 32 ) == 0 )
+          y = -y;
+      }
+      else if ( ( f & 32 ) == 0 )
+      {
+        if ( p + 2 > limit )
+          goto Invalid_Outline;
+
+        y = (FT_Pos)FT_NEXT_SHORT( p );
+      }
+
+      x     += y;
+      vec->y = x;
+      /* the cast is for stupid compilers */
+      *flag  = (FT_Byte)( f & FT_CURVE_TAG_ON );
+    }
+
+    outline->n_points   = (FT_UShort)n_points;
+    outline->n_contours = (FT_Short) n_contours;
+
+    load->cursor = p;
+
+  Fail:
+    return error;
+
+  Invalid_Outline:
+    error = TT_Err_Invalid_Outline;
+    goto Fail;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  TT_Load_Composite_Glyph( TT_Loader  loader )
+  {
+    FT_Error        error;
+    FT_Byte*        p       = loader->cursor;
+    FT_Byte*        limit   = loader->limit;
+    FT_GlyphLoader  gloader = loader->gloader;
+    FT_SubGlyph     subglyph;
+    FT_UInt         num_subglyphs;
+
+
+    num_subglyphs = 0;
+
+    do
+    {
+      FT_Fixed  xx, xy, yy, yx;
+      FT_UInt   count;
+
+
+      /* check that we can load a new subglyph */
+      error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs + 1 );
+      if ( error )
+        goto Fail;
+
+      /* check space */
+      if ( p + 4 > limit )
+        goto Invalid_Composite;
+
+      subglyph = gloader->current.subglyphs + num_subglyphs;
+
+      subglyph->arg1 = subglyph->arg2 = 0;
+
+      subglyph->flags = FT_NEXT_USHORT( p );
+      subglyph->index = FT_NEXT_USHORT( p );
+
+      /* check space */
+      count = 2;
+      if ( subglyph->flags & ARGS_ARE_WORDS )
+        count += 2;
+      if ( subglyph->flags & WE_HAVE_A_SCALE )
+        count += 2;
+      else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE )
+        count += 4;
+      else if ( subglyph->flags & WE_HAVE_A_2X2 )
+        count += 8;
+
+      if ( p + count > limit )
+        goto Invalid_Composite;
+
+      /* read arguments */
+      if ( subglyph->flags & ARGS_ARE_WORDS )
+      {
+        subglyph->arg1 = FT_NEXT_SHORT( p );
+        subglyph->arg2 = FT_NEXT_SHORT( p );
+      }
+      else
+      {
+        subglyph->arg1 = FT_NEXT_CHAR( p );
+        subglyph->arg2 = FT_NEXT_CHAR( p );
+      }
+
+      /* read transform */
+      xx = yy = 0x10000L;
+      xy = yx = 0;
+
+      if ( subglyph->flags & WE_HAVE_A_SCALE )
+      {
+        xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+        yy = xx;
+      }
+      else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE )
+      {
+        xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+        yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+      }
+      else if ( subglyph->flags & WE_HAVE_A_2X2 )
+      {
+        xx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+        yx = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+        xy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+        yy = (FT_Fixed)FT_NEXT_SHORT( p ) << 2;
+      }
+
+      subglyph->transform.xx = xx;
+      subglyph->transform.xy = xy;
+      subglyph->transform.yx = yx;
+      subglyph->transform.yy = yy;
+
+      num_subglyphs++;
+
+    } while ( subglyph->flags & MORE_COMPONENTS );
+
+    gloader->current.num_subglyphs = num_subglyphs;
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    {
+      FT_Stream  stream = loader->stream;
+
+
+      /* we must undo the FT_FRAME_ENTER in order to point */
+      /* to the composite instructions, if we find some.   */
+      /* We will process them later.                       */
+      /*                                                   */
+      loader->ins_pos = (FT_ULong)( FT_STREAM_POS() +
+                                    p - limit );
+    }
+
+#endif
+
+    loader->cursor = p;
+
+  Fail:
+    return error;
+
+  Invalid_Composite:
+    error = TT_Err_Invalid_Composite;
+    goto Fail;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  TT_Init_Glyph_Loading( TT_Face  face )
+  {
+    face->access_glyph_frame   = TT_Access_Glyph_Frame;
+    face->read_glyph_header    = TT_Load_Glyph_Header;
+    face->read_simple_glyph    = TT_Load_Simple_Glyph;
+    face->read_composite_glyph = TT_Load_Composite_Glyph;
+    face->forget_glyph_frame   = TT_Forget_Glyph_Frame;
+  }
+
+
+  static void
+  tt_prepare_zone( TT_GlyphZone  zone,
+                   FT_GlyphLoad  load,
+                   FT_UInt       start_point,
+                   FT_UInt       start_contour )
+  {
+    zone->n_points    = (FT_UShort)( load->outline.n_points - start_point );
+    zone->n_contours  = (FT_Short) ( load->outline.n_contours -
+                                       start_contour );
+    zone->org         = load->extra_points + start_point;
+    zone->cur         = load->outline.points + start_point;
+    zone->orus        = load->extra_points2 + start_point;
+    zone->tags        = (FT_Byte*)load->outline.tags + start_point;
+    zone->contours    = (FT_UShort*)load->outline.contours + start_contour;
+    zone->first_point = (FT_UShort)start_point;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Hint_Glyph                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Hint the glyph using the zone prepared by the caller.  Note that   */
+  /*    the zone is supposed to include four phantom points.               */
+  /*                                                                       */
+  static FT_Error
+  TT_Hint_Glyph( TT_Loader  loader,
+                 FT_Bool    is_composite )
+  {
+    TT_GlyphZone  zone = &loader->zone;
+    FT_Pos        origin;
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+    FT_UInt       n_ins;
+#else
+    FT_UNUSED( is_composite );
+#endif
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+    if ( loader->glyph->control_len > 0xFFFFL )
+    {
+      FT_TRACE1(( "TT_Hint_Glyph: too long instructions " ));
+      FT_TRACE1(( "(0x%lx byte) is truncated\n",
+                 loader->glyph->control_len ));
+    }
+    n_ins = (FT_UInt)( loader->glyph->control_len );
+#endif
+
+    origin = zone->cur[zone->n_points - 4].x;
+    origin = FT_PIX_ROUND( origin ) - origin;
+    if ( origin )
+      translate_array( zone->n_points, zone->cur, origin, 0 );
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+    /* save original point position in org */
+    if ( n_ins > 0 )
+      FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points );
+
+    /* Reset graphics state. */
+    loader->exec->GS = ((TT_Size)loader->size)->GS;
+
+    /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */
+    /*      completely refer to the (already) hinted subglyphs.     */
+    if ( is_composite )
+    {
+      loader->exec->metrics.x_scale = 1 << 16;
+      loader->exec->metrics.y_scale = 1 << 16;
+
+      FT_ARRAY_COPY( zone->orus, zone->cur, zone->n_points );
+    }
+    else
+    {
+      loader->exec->metrics.x_scale =
+        ((TT_Size)loader->size)->metrics.x_scale;
+      loader->exec->metrics.y_scale =
+        ((TT_Size)loader->size)->metrics.y_scale;
+    }
+#endif
+
+    /* round pp2 and pp4 */
+    zone->cur[zone->n_points - 3].x =
+      FT_PIX_ROUND( zone->cur[zone->n_points - 3].x );
+    zone->cur[zone->n_points - 1].y =
+      FT_PIX_ROUND( zone->cur[zone->n_points - 1].y );
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    if ( n_ins > 0 )
+    {
+      FT_Bool   debug;
+      FT_Error  error;
+
+      FT_GlyphLoader  gloader         = loader->gloader;
+      FT_Outline      current_outline = gloader->current.outline;
+
+
+      error = TT_Set_CodeRange( loader->exec, tt_coderange_glyph,
+                                loader->exec->glyphIns, n_ins );
+      if ( error )
+        return error;
+
+      loader->exec->is_composite = is_composite;
+      loader->exec->pts          = *zone;
+
+      debug = FT_BOOL( !( loader->load_flags & FT_LOAD_NO_SCALE ) &&
+                       ((TT_Size)loader->size)->debug             );
+
+      error = TT_Run_Context( loader->exec, debug );
+      if ( error && loader->exec->pedantic_hinting )
+        return error;
+
+      /* store drop-out mode in bits 5-7; set bit 2 also as a marker */
+      current_outline.tags[0] |=
+        ( loader->exec->GS.scan_type << 5 ) | FT_CURVE_TAG_HAS_SCANMODE;
+    }
+
+#endif
+
+    /* save glyph phantom points */
+    if ( !loader->preserve_pps )
+    {
+      loader->pp1 = zone->cur[zone->n_points - 4];
+      loader->pp2 = zone->cur[zone->n_points - 3];
+      loader->pp3 = zone->cur[zone->n_points - 2];
+      loader->pp4 = zone->cur[zone->n_points - 1];
+    }
+
+    return TT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Process_Simple_Glyph                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Once a simple glyph has been loaded, it needs to be processed.     */
+  /*    Usually, this means scaling and hinting through bytecode           */
+  /*    interpretation.                                                    */
+  /*                                                                       */
+  static FT_Error
+  TT_Process_Simple_Glyph( TT_Loader  loader )
+  {
+    FT_GlyphLoader  gloader = loader->gloader;
+    FT_Error        error   = TT_Err_Ok;
+    FT_Outline*     outline;
+    FT_Int          n_points;
+
+
+    outline  = &gloader->current.outline;
+    n_points = outline->n_points;
+
+    /* set phantom points */
+
+    outline->points[n_points    ] = loader->pp1;
+    outline->points[n_points + 1] = loader->pp2;
+    outline->points[n_points + 2] = loader->pp3;
+    outline->points[n_points + 3] = loader->pp4;
+
+    outline->tags[n_points    ] = 0;
+    outline->tags[n_points + 1] = 0;
+    outline->tags[n_points + 2] = 0;
+    outline->tags[n_points + 3] = 0;
+
+    n_points += 4;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+    if ( ((TT_Face)loader->face)->doblend )
+    {
+      /* Deltas apply to the unscaled data. */
+      FT_Vector*  deltas;
+      FT_Memory   memory = loader->face->memory;
+      FT_Int      i;
+
+
+      error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face),
+                                        loader->glyph_index,
+                                        &deltas,
+                                        n_points );
+      if ( error )
+        return error;
+
+      for ( i = 0; i < n_points; ++i )
+      {
+        outline->points[i].x += deltas[i].x;
+        outline->points[i].y += deltas[i].y;
+      }
+
+      FT_FREE( deltas );
+    }
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
+    if ( IS_HINTED( loader->load_flags ) )
+    {
+      tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 );
+
+      FT_ARRAY_COPY( loader->zone.orus, loader->zone.cur,
+                     loader->zone.n_points + 4 );
+    }
+
+    /* scale the glyph */
+    if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+    {
+      FT_Vector*  vec     = outline->points;
+      FT_Vector*  limit   = outline->points + n_points;
+      FT_Fixed    x_scale = ((TT_Size)loader->size)->metrics.x_scale;
+      FT_Fixed    y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+
+
+      for ( ; vec < limit; vec++ )
+      {
+        vec->x = FT_MulFix( vec->x, x_scale );
+        vec->y = FT_MulFix( vec->y, y_scale );
+      }
+
+      loader->pp1 = outline->points[n_points - 4];
+      loader->pp2 = outline->points[n_points - 3];
+      loader->pp3 = outline->points[n_points - 2];
+      loader->pp4 = outline->points[n_points - 1];
+    }
+
+    if ( IS_HINTED( loader->load_flags ) )
+    {
+      loader->zone.n_points += 4;
+
+      error = TT_Hint_Glyph( loader, 0 );
+    }
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Process_Composite_Component                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Once a composite component has been loaded, it needs to be         */
+  /*    processed.  Usually, this means transforming and translating.      */
+  /*                                                                       */
+  static FT_Error
+  TT_Process_Composite_Component( TT_Loader    loader,
+                                  FT_SubGlyph  subglyph,
+                                  FT_UInt      start_point,
+                                  FT_UInt      num_base_points )
+  {
+    FT_GlyphLoader  gloader    = loader->gloader;
+    FT_Vector*      base_vec   = gloader->base.outline.points;
+    FT_UInt         num_points = gloader->base.outline.n_points;
+    FT_Bool         have_scale;
+    FT_Pos          x, y;
+
+
+    have_scale = FT_BOOL( subglyph->flags & ( WE_HAVE_A_SCALE     |
+                                              WE_HAVE_AN_XY_SCALE |
+                                              WE_HAVE_A_2X2       ) );
+
+    /* perform the transform required for this subglyph */
+    if ( have_scale )
+    {
+      FT_UInt  i;
+
+
+      for ( i = num_base_points; i < num_points; i++ )
+        FT_Vector_Transform( base_vec + i, &subglyph->transform );
+    }
+
+    /* get offset */
+    if ( !( subglyph->flags & ARGS_ARE_XY_VALUES ) )
+    {
+      FT_UInt     k = subglyph->arg1;
+      FT_UInt     l = subglyph->arg2;
+      FT_Vector*  p1;
+      FT_Vector*  p2;
+
+
+      /* match l-th point of the newly loaded component to the k-th point */
+      /* of the previously loaded components.                             */
+
+      /* change to the point numbers used by our outline */
+      k += start_point;
+      l += num_base_points;
+      if ( k >= num_base_points ||
+           l >= num_points      )
+        return TT_Err_Invalid_Composite;
+
+      p1 = gloader->base.outline.points + k;
+      p2 = gloader->base.outline.points + l;
+
+      x = p1->x - p2->x;
+      y = p1->y - p2->y;
+    }
+    else
+    {
+      x = subglyph->arg1;
+      y = subglyph->arg2;
+
+      if ( !x && !y )
+        return TT_Err_Ok;
+
+  /* Use a default value dependent on                                     */
+  /* TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED.  This is useful for old TT */
+  /* fonts which don't set the xxx_COMPONENT_OFFSET bit.                  */
+
+      if ( have_scale &&
+#ifdef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
+           !( subglyph->flags & UNSCALED_COMPONENT_OFFSET ) )
+#else
+            ( subglyph->flags & SCALED_COMPONENT_OFFSET ) )
+#endif
+      {
+
+#if 0
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This algorithm is what Apple documents.  But it doesn't work.         */
+  /*                                                                       */
+        int  a = subglyph->transform.xx > 0 ?  subglyph->transform.xx
+                                            : -subglyph->transform.xx;
+        int  b = subglyph->transform.yx > 0 ?  subglyph->transform.yx
+                                            : -subglyph->transform.yx;
+        int  c = subglyph->transform.xy > 0 ?  subglyph->transform.xy
+                                            : -subglyph->transform.xy;
+        int  d = subglyph->transform.yy > 0 ? subglyph->transform.yy
+                                            : -subglyph->transform.yy;
+        int  m = a > b ? a : b;
+        int  n = c > d ? c : d;
+
+
+        if ( a - b <= 33 && a - b >= -33 )
+          m *= 2;
+        if ( c - d <= 33 && c - d >= -33 )
+          n *= 2;
+        x = FT_MulFix( x, m );
+        y = FT_MulFix( y, n );
+
+#else /* 0 */
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This algorithm is a guess and works much better than the above.       */
+  /*                                                                       */
+        FT_Fixed  mac_xscale = FT_SqrtFixed(
+                                 (FT_Int32)FT_MulFix( subglyph->transform.xx,
+                                                      subglyph->transform.xx ) +
+                                 (FT_Int32)FT_MulFix( subglyph->transform.xy,
+                                                      subglyph->transform.xy ) );
+        FT_Fixed  mac_yscale = FT_SqrtFixed(
+                                 (FT_Int32)FT_MulFix( subglyph->transform.yy,
+                                                      subglyph->transform.yy ) +
+                                 (FT_Int32)FT_MulFix( subglyph->transform.yx,
+                                                      subglyph->transform.yx ) );
+
+
+        x = FT_MulFix( x, mac_xscale );
+        y = FT_MulFix( y, mac_yscale );
+
+#endif /* 0 */
+
+      }
+
+      if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) )
+      {
+        FT_Fixed  x_scale = ((TT_Size)loader->size)->metrics.x_scale;
+        FT_Fixed  y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+
+
+        x = FT_MulFix( x, x_scale );
+        y = FT_MulFix( y, y_scale );
+
+        if ( subglyph->flags & ROUND_XY_TO_GRID )
+        {
+          x = FT_PIX_ROUND( x );
+          y = FT_PIX_ROUND( y );
+        }
+      }
+    }
+
+    if ( x || y )
+      translate_array( num_points - num_base_points,
+                       base_vec + num_base_points,
+                       x, y );
+
+    return TT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Process_Composite_Glyph                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    This is slightly different from TT_Process_Simple_Glyph, in that   */
+  /*    its sole purpose is to hint the glyph.  Thus this function is      */
+  /*    only available when bytecode interpreter is enabled.               */
+  /*                                                                       */
+  static FT_Error
+  TT_Process_Composite_Glyph( TT_Loader  loader,
+                              FT_UInt    start_point,
+                              FT_UInt    start_contour )
+  {
+    FT_Error     error;
+    FT_Outline*  outline;
+    FT_UInt      i;
+
+
+    outline = &loader->gloader->base.outline;
+
+    /* make room for phantom points */
+    error = FT_GLYPHLOADER_CHECK_POINTS( loader->gloader,
+                                         outline->n_points + 4,
+                                         0 );
+    if ( error )
+      return error;
+
+    outline->points[outline->n_points    ] = loader->pp1;
+    outline->points[outline->n_points + 1] = loader->pp2;
+    outline->points[outline->n_points + 2] = loader->pp3;
+    outline->points[outline->n_points + 3] = loader->pp4;
+
+    outline->tags[outline->n_points    ] = 0;
+    outline->tags[outline->n_points + 1] = 0;
+    outline->tags[outline->n_points + 2] = 0;
+    outline->tags[outline->n_points + 3] = 0;
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    {
+      FT_Stream  stream = loader->stream;
+      FT_UShort  n_ins, max_ins;
+      FT_ULong   tmp;
+
+
+      /* TT_Load_Composite_Glyph only gives us the offset of instructions */
+      /* so we read them here                                             */
+      if ( FT_STREAM_SEEK( loader->ins_pos ) ||
+           FT_READ_USHORT( n_ins )           )
+        return error;
+
+      FT_TRACE5(( "  Instructions size = %d\n", n_ins ));
+
+      /* check it */
+      max_ins = ((TT_Face)loader->face)->max_profile.maxSizeOfInstructions;
+      if ( n_ins > max_ins )
+      {
+        /* acroread ignores this field, so we only do a rough safety check */
+        if ( (FT_Int)n_ins > loader->byte_len )
+        {
+          FT_TRACE1(( "TT_Process_Composite_Glyph: "
+                      "too many instructions (%d) for glyph with length %d\n",
+                      n_ins, loader->byte_len ));
+          return TT_Err_Too_Many_Hints;
+        }
+
+        tmp = loader->exec->glyphSize;
+        error = Update_Max( loader->exec->memory,
+                            &tmp,
+                            sizeof ( FT_Byte ),
+                            (void*)&loader->exec->glyphIns,
+                            n_ins );
+        loader->exec->glyphSize = (FT_UShort)tmp;
+        if ( error )
+          return error;
+      }
+      else if ( n_ins == 0 )
+        return TT_Err_Ok;
+
+      if ( FT_STREAM_READ( loader->exec->glyphIns, n_ins ) )
+        return error;
+
+      loader->glyph->control_data = loader->exec->glyphIns;
+      loader->glyph->control_len  = n_ins;
+    }
+
+#endif
+
+    tt_prepare_zone( &loader->zone, &loader->gloader->base,
+                     start_point, start_contour );
+
+    /* Some points are likely touched during execution of  */
+    /* instructions on components.  So let's untouch them. */
+    for ( i = start_point; i < loader->zone.n_points; i++ )
+      loader->zone.tags[i] &= ~FT_CURVE_TAG_TOUCH_BOTH;
+
+    loader->zone.n_points += 4;
+
+    return TT_Hint_Glyph( loader, 1 );
+  }
+
+
+  /* Calculate the four phantom points.                     */
+  /* The first two stand for horizontal origin and advance. */
+  /* The last two stand for vertical origin and advance.    */
+#define TT_LOADER_SET_PP( loader )                                          \
+          do {                                                              \
+            (loader)->pp1.x = (loader)->bbox.xMin - (loader)->left_bearing; \
+            (loader)->pp1.y = 0;                                            \
+            (loader)->pp2.x = (loader)->pp1.x + (loader)->advance;          \
+            (loader)->pp2.y = 0;                                            \
+            (loader)->pp3.x = 0;                                            \
+            (loader)->pp3.y = (loader)->top_bearing + (loader)->bbox.yMax;  \
+            (loader)->pp4.x = 0;                                            \
+            (loader)->pp4.y = (loader)->pp3.y - (loader)->vadvance;         \
+          } while ( 0 )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    load_truetype_glyph                                                */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Loads a given truetype glyph.  Handles composites and uses a       */
+  /*    TT_Loader object.                                                  */
+  /*                                                                       */
+  static FT_Error
+  load_truetype_glyph( TT_Loader  loader,
+                       FT_UInt    glyph_index,
+                       FT_UInt    recurse_count,
+                       FT_Bool    header_only )
+  {
+    FT_Error        error        = TT_Err_Ok;
+    FT_Fixed        x_scale, y_scale;
+    FT_ULong        offset;
+    TT_Face         face         = (TT_Face)loader->face;
+    FT_GlyphLoader  gloader      = loader->gloader;
+    FT_Bool         opened_frame = 0;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    FT_Vector*      deltas       = NULL;
+#endif
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    FT_StreamRec    inc_stream;
+    FT_Data         glyph_data;
+    FT_Bool         glyph_data_loaded = 0;
+#endif
+
+
+    /* some fonts have an incorrect value of `maxComponentDepth', */
+    /* thus we allow depth 1 to catch the majority of them        */
+    if ( recurse_count > 1                                   &&
+         recurse_count > face->max_profile.maxComponentDepth )
+    {
+      error = TT_Err_Invalid_Composite;
+      goto Exit;
+    }
+
+    /* check glyph index */
+    if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
+    {
+      error = TT_Err_Invalid_Glyph_Index;
+      goto Exit;
+    }
+
+    loader->glyph_index = glyph_index;
+
+    if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+    {
+      x_scale = ((TT_Size)loader->size)->metrics.x_scale;
+      y_scale = ((TT_Size)loader->size)->metrics.y_scale;
+    }
+    else
+    {
+      x_scale = 0x10000L;
+      y_scale = 0x10000L;
+    }
+
+    tt_get_metrics( loader, glyph_index );
+
+    /* Set `offset' to the start of the glyph relative to the start of */
+    /* the `glyf' table, and `byte_len' to the length of the glyph in  */
+    /* bytes.                                                          */
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+    /* If we are loading glyph data via the incremental interface, set */
+    /* the loader stream to a memory stream reading the data returned  */
+    /* by the interface.                                               */
+    if ( face->root.internal->incremental_interface )
+    {
+      error = face->root.internal->incremental_interface->funcs->get_glyph_data(
+                face->root.internal->incremental_interface->object,
+                glyph_index, &glyph_data );
+      if ( error )
+        goto Exit;
+
+      glyph_data_loaded = 1;
+      offset            = 0;
+      loader->byte_len  = glyph_data.length;
+
+      FT_MEM_ZERO( &inc_stream, sizeof ( inc_stream ) );
+      FT_Stream_OpenMemory( &inc_stream,
+                            glyph_data.pointer, glyph_data.length );
+
+      loader->stream = &inc_stream;
+    }
+    else
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+      offset = tt_face_get_location( face, glyph_index,
+                                     (FT_UInt*)&loader->byte_len );
+
+    if ( loader->byte_len > 0 )
+    {
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+      /* for the incremental interface, `glyf_offset' is always zero */
+      if ( !loader->glyf_offset                        &&
+           !face->root.internal->incremental_interface )
+#else
+      if ( !loader->glyf_offset )
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+      {
+        FT_TRACE2(( "no `glyf' table but non-zero `loca' entry\n" ));
+        error = TT_Err_Invalid_Table;
+        goto Exit;
+      }
+
+      error = face->access_glyph_frame( loader, glyph_index,
+                                        loader->glyf_offset + offset,
+                                        loader->byte_len );
+      if ( error )
+        goto Exit;
+
+      opened_frame = 1;
+
+      /* read glyph header first */
+      error = face->read_glyph_header( loader );
+      if ( error || header_only )
+        goto Exit;
+    }
+
+    if ( loader->byte_len == 0 || loader->n_contours == 0 )
+    {
+      loader->bbox.xMin = 0;
+      loader->bbox.xMax = 0;
+      loader->bbox.yMin = 0;
+      loader->bbox.yMax = 0;
+
+      if ( header_only )
+        goto Exit;
+
+      /* must initialize points before (possibly) overriding */
+      /* glyph metrics from the incremental interface        */
+      TT_LOADER_SET_PP( loader );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+      tt_get_metrics_incr_overrides( loader, glyph_index );
+#endif
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+      if ( ((TT_Face)(loader->face))->doblend )
+      {
+        /* this must be done before scaling */
+        FT_Memory  memory = loader->face->memory;
+
+
+        error = TT_Vary_Get_Glyph_Deltas( (TT_Face)(loader->face),
+                                          glyph_index, &deltas, 4 );
+        if ( error )
+          goto Exit;
+
+        loader->pp1.x += deltas[0].x; loader->pp1.y += deltas[0].y;
+        loader->pp2.x += deltas[1].x; loader->pp2.y += deltas[1].y;
+        loader->pp3.x += deltas[2].x; loader->pp3.y += deltas[2].y;
+        loader->pp4.x += deltas[3].x; loader->pp4.y += deltas[3].y;
+
+        FT_FREE( deltas );
+      }
+
+#endif
+
+      if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+      {
+        loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale );
+        loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale );
+        loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale );
+        loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale );
+      }
+
+      error = TT_Err_Ok;
+      goto Exit;
+    }
+
+    /* must initialize points before (possibly) overriding */
+    /* glyph metrics from the incremental interface        */
+    TT_LOADER_SET_PP( loader );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    tt_get_metrics_incr_overrides( loader, glyph_index );
+#endif
+
+    /***********************************************************************/
+    /***********************************************************************/
+    /***********************************************************************/
+
+    /* if it is a simple glyph, load it */
+
+    if ( loader->n_contours > 0 )
+    {
+      error = face->read_simple_glyph( loader );
+      if ( error )
+        goto Exit;
+
+      /* all data have been read */
+      face->forget_glyph_frame( loader );
+      opened_frame = 0;
+
+      error = TT_Process_Simple_Glyph( loader );
+      if ( error )
+        goto Exit;
+
+      FT_GlyphLoader_Add( gloader );
+    }
+
+    /***********************************************************************/
+    /***********************************************************************/
+    /***********************************************************************/
+
+    /* otherwise, load a composite! */
+    else if ( loader->n_contours == -1 )
+    {
+      FT_UInt   start_point;
+      FT_UInt   start_contour;
+      FT_ULong  ins_pos;  /* position of composite instructions, if any */
+
+
+      start_point   = gloader->base.outline.n_points;
+      start_contour = gloader->base.outline.n_contours;
+
+      /* for each subglyph, read composite header */
+      error = face->read_composite_glyph( loader );
+      if ( error )
+        goto Exit;
+
+      /* store the offset of instructions */
+      ins_pos = loader->ins_pos;
+
+      /* all data we need are read */
+      face->forget_glyph_frame( loader );
+      opened_frame = 0;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+      if ( face->doblend )
+      {
+        FT_Int       i, limit;
+        FT_SubGlyph  subglyph;
+        FT_Memory    memory = face->root.memory;
+
+
+        /* this provides additional offsets */
+        /* for each component's translation */
+
+        if ( ( error = TT_Vary_Get_Glyph_Deltas(
+                         face,
+                         glyph_index,
+                         &deltas,
+                         gloader->current.num_subglyphs + 4 )) != 0 )
+          goto Exit;
+
+        subglyph = gloader->current.subglyphs + gloader->base.num_subglyphs;
+        limit    = gloader->current.num_subglyphs;
+
+        for ( i = 0; i < limit; ++i, ++subglyph )
+        {
+          if ( subglyph->flags & ARGS_ARE_XY_VALUES )
+          {
+            /* XXX: overflow check for subglyph->{arg1,arg2}.   */
+            /* deltas[i].{x,y} must be within signed 16-bit,    */
+            /* but the restriction of summed delta is not clear */
+            subglyph->arg1 += (FT_Int16)deltas[i].x;
+            subglyph->arg2 += (FT_Int16)deltas[i].y;
+          }
+        }
+
+        loader->pp1.x += deltas[i + 0].x; loader->pp1.y += deltas[i + 0].y;
+        loader->pp2.x += deltas[i + 1].x; loader->pp2.y += deltas[i + 1].y;
+        loader->pp3.x += deltas[i + 2].x; loader->pp3.y += deltas[i + 2].y;
+        loader->pp4.x += deltas[i + 3].x; loader->pp4.y += deltas[i + 3].y;
+
+        FT_FREE( deltas );
+      }
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
+      if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+      {
+        loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale );
+        loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale );
+        loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale );
+        loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale );
+      }
+
+      /* if the flag FT_LOAD_NO_RECURSE is set, we return the subglyph */
+      /* `as is' in the glyph slot (the client application will be     */
+      /* responsible for interpreting these data)...                   */
+      if ( loader->load_flags & FT_LOAD_NO_RECURSE )
+      {
+        FT_GlyphLoader_Add( gloader );
+        loader->glyph->format = FT_GLYPH_FORMAT_COMPOSITE;
+
+        goto Exit;
+      }
+
+      /*********************************************************************/
+      /*********************************************************************/
+      /*********************************************************************/
+
+      {
+        FT_UInt      n, num_base_points;
+        FT_SubGlyph  subglyph       = 0;
+
+        FT_UInt      num_points     = start_point;
+        FT_UInt      num_subglyphs  = gloader->current.num_subglyphs;
+        FT_UInt      num_base_subgs = gloader->base.num_subglyphs;
+
+        FT_Stream    old_stream     = loader->stream;
+        FT_Int       old_byte_len   = loader->byte_len;
+
+
+        FT_GlyphLoader_Add( gloader );
+
+        /* read each subglyph independently */
+        for ( n = 0; n < num_subglyphs; n++ )
+        {
+          FT_Vector  pp[4];
+
+
+          /* Each time we call load_truetype_glyph in this loop, the   */
+          /* value of `gloader.base.subglyphs' can change due to table */
+          /* reallocations.  We thus need to recompute the subglyph    */
+          /* pointer on each iteration.                                */
+          subglyph = gloader->base.subglyphs + num_base_subgs + n;
+
+          pp[0] = loader->pp1;
+          pp[1] = loader->pp2;
+          pp[2] = loader->pp3;
+          pp[3] = loader->pp4;
+
+          num_base_points = gloader->base.outline.n_points;
+
+          error = load_truetype_glyph( loader, subglyph->index,
+                                       recurse_count + 1, FALSE );
+          if ( error )
+            goto Exit;
+
+          /* restore subglyph pointer */
+          subglyph = gloader->base.subglyphs + num_base_subgs + n;
+
+          if ( !( subglyph->flags & USE_MY_METRICS ) )
+          {
+            loader->pp1 = pp[0];
+            loader->pp2 = pp[1];
+            loader->pp3 = pp[2];
+            loader->pp4 = pp[3];
+          }
+
+          num_points = gloader->base.outline.n_points;
+
+          if ( num_points == num_base_points )
+            continue;
+
+          /* gloader->base.outline consists of three parts:               */
+          /* 0 -(1)-> start_point -(2)-> num_base_points -(3)-> n_points. */
+          /*                                                              */
+          /* (1): exists from the beginning                               */
+          /* (2): components that have been loaded so far                 */
+          /* (3): the newly loaded component                              */
+          TT_Process_Composite_Component( loader, subglyph, start_point,
+                                          num_base_points );
+        }
+
+        loader->stream   = old_stream;
+        loader->byte_len = old_byte_len;
+
+        /* process the glyph */
+        loader->ins_pos = ins_pos;
+        if ( IS_HINTED( loader->load_flags ) &&
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+             subglyph->flags & WE_HAVE_INSTR &&
+
+#endif
+
+             num_points > start_point )
+          TT_Process_Composite_Glyph( loader, start_point, start_contour );
+
+      }
+    }
+    else
+    {
+      /* invalid composite count (negative but not -1) */
+      error = TT_Err_Invalid_Outline;
+      goto Exit;
+    }
+
+    /***********************************************************************/
+    /***********************************************************************/
+    /***********************************************************************/
+
+  Exit:
+
+    if ( opened_frame )
+      face->forget_glyph_frame( loader );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+    if ( glyph_data_loaded )
+      face->root.internal->incremental_interface->funcs->free_glyph_data(
+        face->root.internal->incremental_interface->object,
+        &glyph_data );
+
+#endif
+
+    return error;
+  }
+
+
+  static FT_Error
+  compute_glyph_metrics( TT_Loader  loader,
+                         FT_UInt    glyph_index )
+  {
+    FT_BBox       bbox;
+    TT_Face       face = (TT_Face)loader->face;
+    FT_Fixed      y_scale;
+    TT_GlyphSlot  glyph = loader->glyph;
+    TT_Size       size = (TT_Size)loader->size;
+
+
+    y_scale = 0x10000L;
+    if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
+      y_scale = size->root.metrics.y_scale;
+
+    if ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE )
+      FT_Outline_Get_CBox( &glyph->outline, &bbox );
+    else
+      bbox = loader->bbox;
+
+    /* get the device-independent horizontal advance; it is scaled later */
+    /* by the base layer.                                                */
+    glyph->linearHoriAdvance = loader->linear;
+
+    glyph->metrics.horiBearingX = bbox.xMin;
+    glyph->metrics.horiBearingY = bbox.yMax;
+    glyph->metrics.horiAdvance  = loader->pp2.x - loader->pp1.x;
+
+    /* adjust advance width to the value contained in the hdmx table */
+    if ( !face->postscript.isFixedPitch  &&
+         IS_HINTED( loader->load_flags ) )
+    {
+      FT_Byte*  widthp;
+
+
+      widthp = tt_face_get_device_metrics( face,
+                                           size->root.metrics.x_ppem,
+                                           glyph_index );
+
+      if ( widthp )
+        glyph->metrics.horiAdvance = *widthp << 6;
+    }
+
+    /* set glyph dimensions */
+    glyph->metrics.width  = bbox.xMax - bbox.xMin;
+    glyph->metrics.height = bbox.yMax - bbox.yMin;
+
+    /* Now take care of vertical metrics.  In the case where there is */
+    /* no vertical information within the font (relatively common),   */
+    /* create some metrics manually                                   */
+    {
+      FT_Pos  top;      /* scaled vertical top side bearing  */
+      FT_Pos  advance;  /* scaled vertical advance height    */
+
+
+      /* Get the unscaled top bearing and advance height. */
+      if ( face->vertical_info                   &&
+           face->vertical.number_Of_VMetrics > 0 )
+      {
+        top = (FT_Short)FT_DivFix( loader->pp3.y - bbox.yMax,
+                                   y_scale );
+
+        if ( loader->pp3.y <= loader->pp4.y )
+          advance = 0;
+        else
+          advance = (FT_UShort)FT_DivFix( loader->pp3.y - loader->pp4.y,
+                                          y_scale );
+      }
+      else
+      {
+        FT_Pos  height;
+
+
+        /* XXX Compute top side bearing and advance height in  */
+        /*     Get_VMetrics instead of here.                   */
+
+        /* NOTE: The OS/2 values are the only `portable' ones, */
+        /*       which is why we use them, if there is an OS/2 */
+        /*       table in the font.  Otherwise, we use the     */
+        /*       values defined in the horizontal header.      */
+
+        height = (FT_Short)FT_DivFix( bbox.yMax - bbox.yMin,
+                                      y_scale );
+        if ( face->os2.version != 0xFFFFU )
+          advance = (FT_Pos)( face->os2.sTypoAscender -
+                              face->os2.sTypoDescender );
+        else
+          advance = (FT_Pos)( face->horizontal.Ascender -
+                              face->horizontal.Descender );
+
+        top = ( advance - height ) / 2;
+      }
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+      {
+        FT_Incremental_InterfaceRec*  incr;
+        FT_Incremental_MetricsRec     metrics;
+        FT_Error                      error;
+
+
+        incr = face->root.internal->incremental_interface;
+
+        /* If this is an incrementally loaded font see if there are */
+        /* overriding metrics for this glyph.                       */
+        if ( incr && incr->funcs->get_glyph_metrics )
+        {
+          metrics.bearing_x = 0;
+          metrics.bearing_y = top;
+          metrics.advance   = advance;
+
+          error = incr->funcs->get_glyph_metrics( incr->object,
+                                                  glyph_index,
+                                                  TRUE,
+                                                  &metrics );
+          if ( error )
+            return error;
+
+          top     = metrics.bearing_y;
+          advance = metrics.advance;
+        }
+      }
+
+      /* GWW: Do vertical metrics get loaded incrementally too? */
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+      glyph->linearVertAdvance = advance;
+
+      /* scale the metrics */
+      if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) )
+      {
+        top     = FT_MulFix( top,     y_scale );
+        advance = FT_MulFix( advance, y_scale );
+      }
+
+      /* XXX: for now, we have no better algorithm for the lsb, but it */
+      /*      should work fine.                                        */
+      /*                                                               */
+      glyph->metrics.vertBearingX = glyph->metrics.horiBearingX -
+                                      glyph->metrics.horiAdvance / 2;
+      glyph->metrics.vertBearingY = top;
+      glyph->metrics.vertAdvance  = advance;
+    }
+
+    return 0;
+  }
+
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+  static FT_Error
+  load_sbit_image( TT_Size       size,
+                   TT_GlyphSlot  glyph,
+                   FT_UInt       glyph_index,
+                   FT_Int32      load_flags )
+  {
+    TT_Face             face;
+    SFNT_Service        sfnt;
+    FT_Stream           stream;
+    FT_Error            error;
+    TT_SBit_MetricsRec  metrics;
+
+
+    face   = (TT_Face)glyph->face;
+    sfnt   = (SFNT_Service)face->sfnt;
+    stream = face->root.stream;
+
+    error = sfnt->load_sbit_image( face,
+                                   size->strike_index,
+                                   glyph_index,
+                                   (FT_Int)load_flags,
+                                   stream,
+                                   &glyph->bitmap,
+                                   &metrics );
+    if ( !error )
+    {
+      glyph->outline.n_points   = 0;
+      glyph->outline.n_contours = 0;
+
+      glyph->metrics.width  = (FT_Pos)metrics.width  << 6;
+      glyph->metrics.height = (FT_Pos)metrics.height << 6;
+
+      glyph->metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6;
+      glyph->metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6;
+      glyph->metrics.horiAdvance  = (FT_Pos)metrics.horiAdvance  << 6;
+
+      glyph->metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6;
+      glyph->metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6;
+      glyph->metrics.vertAdvance  = (FT_Pos)metrics.vertAdvance  << 6;
+
+      glyph->format = FT_GLYPH_FORMAT_BITMAP;
+
+      if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+      {
+        glyph->bitmap_left = metrics.vertBearingX;
+        glyph->bitmap_top  = metrics.vertBearingY;
+      }
+      else
+      {
+        glyph->bitmap_left = metrics.horiBearingX;
+        glyph->bitmap_top  = metrics.horiBearingY;
+      }
+    }
+
+    return error;
+  }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+
+  static FT_Error
+  tt_loader_init( TT_Loader     loader,
+                  TT_Size       size,
+                  TT_GlyphSlot  glyph,
+                  FT_Int32      load_flags,
+                  FT_Bool       glyf_table_only )
+  {
+    TT_Face    face;
+    FT_Stream  stream;
+    FT_Bool    pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
+
+
+    face   = (TT_Face)glyph->face;
+    stream = face->root.stream;
+
+    FT_MEM_ZERO( loader, sizeof ( TT_LoaderRec ) );
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    /* load execution context */
+    if ( IS_HINTED( load_flags ) && !glyf_table_only )
+    {
+      TT_ExecContext  exec;
+      FT_Bool         grayscale;
+
+
+      if ( !size->cvt_ready )
+      {
+        FT_Error  error = tt_size_ready_bytecode( size, pedantic );
+
+
+        if ( error )
+          return error;
+      }
+
+      /* query new execution context */
+      exec = size->debug ? size->context
+                         : ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;
+      if ( !exec )
+        return TT_Err_Could_Not_Find_Context;
+
+      grayscale =
+        FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != FT_RENDER_MODE_MONO );
+
+      TT_Load_Context( exec, face, size );
+
+      /* a change from mono to grayscale rendering (and vice versa) */
+      /* requires a re-execution of the CVT program                 */
+      if ( grayscale != exec->grayscale )
+      {
+        FT_UInt  i;
+
+
+        FT_TRACE4(( "tt_loader_init: grayscale change,"
+                    " re-executing `prep' table\n" ));
+
+        exec->grayscale = grayscale;
+
+        for ( i = 0; i < size->cvt_size; i++ )
+          size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
+        tt_size_run_prep( size, pedantic );
+      }
+
+      /* see whether the cvt program has disabled hinting */
+      if ( exec->GS.instruct_control & 1 )
+        load_flags |= FT_LOAD_NO_HINTING;
+
+      /* load default graphics state -- if needed */
+      if ( exec->GS.instruct_control & 2 )
+        exec->GS = tt_default_graphics_state;
+
+      exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
+      loader->exec = exec;
+      loader->instructions = exec->glyphIns;
+    }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+    /* seek to the beginning of the glyph table -- for Type 42 fonts     */
+    /* the table might be accessed from a Postscript stream or something */
+    /* else...                                                           */
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+    if ( face->root.internal->incremental_interface )
+      loader->glyf_offset = 0;
+    else
+
+#endif
+
+    {
+      FT_Error  error = face->goto_table( face, TTAG_glyf, stream, 0 );
+
+
+      if ( error == TT_Err_Table_Missing )
+        loader->glyf_offset = 0;
+      else if ( error )
+      {
+        FT_ERROR(( "tt_loader_init: could not access glyph table\n" ));
+        return error;
+      }
+      else
+        loader->glyf_offset = FT_STREAM_POS();
+    }
+
+    /* get face's glyph loader */
+    if ( !glyf_table_only )
+    {
+      FT_GlyphLoader  gloader = glyph->internal->loader;
+
+
+      FT_GlyphLoader_Rewind( gloader );
+      loader->gloader = gloader;
+    }
+
+    loader->load_flags = load_flags;
+
+    loader->face   = (FT_Face)face;
+    loader->size   = (FT_Size)size;
+    loader->glyph  = (FT_GlyphSlot)glyph;
+    loader->stream = stream;
+
+    return TT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Load_Glyph                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A function used to load a single glyph within a given glyph slot,  */
+  /*    for a given size.                                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    glyph       :: A handle to a target slot object where the glyph    */
+  /*                   will be loaded.                                     */
+  /*                                                                       */
+  /*    size        :: A handle to the source face size at which the glyph */
+  /*                   must be scaled/loaded.                              */
+  /*                                                                       */
+  /*    glyph_index :: The index of the glyph in the font file.            */
+  /*                                                                       */
+  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
+  /*                   FT_LOAD_XXX constants can be used to control the    */
+  /*                   glyph loading process (e.g., whether the outline    */
+  /*                   should be scaled, whether to load bitmaps or not,   */
+  /*                   whether to hint the outline, etc).                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Load_Glyph( TT_Size       size,
+                 TT_GlyphSlot  glyph,
+                 FT_UInt       glyph_index,
+                 FT_Int32      load_flags )
+  {
+    TT_Face       face;
+    FT_Error      error;
+    TT_LoaderRec  loader;
+
+
+    face   = (TT_Face)glyph->face;
+    error  = TT_Err_Ok;
+
+#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
+
+    /* try to load embedded bitmap if any              */
+    /*                                                 */
+    /* XXX: The convention should be emphasized in     */
+    /*      the documents because it can be confusing. */
+    if ( size->strike_index != 0xFFFFFFFFUL      &&
+         ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
+    {
+      error = load_sbit_image( size, glyph, glyph_index, load_flags );
+      if ( !error )
+      {
+        FT_Face  root = &face->root;
+
+
+        if ( FT_IS_SCALABLE( root ) )
+        {
+          /* for the bbox we need the header only */
+          (void)tt_loader_init( &loader, size, glyph, load_flags, TRUE );
+          (void)load_truetype_glyph( &loader, glyph_index, 0, TRUE );
+          glyph->linearHoriAdvance = loader.linear;
+          glyph->linearVertAdvance = loader.top_bearing + loader.bbox.yMax -
+                                       loader.vadvance;
+        }
+
+        return TT_Err_Ok;
+      }
+    }
+
+#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
+
+    /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */
+    if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid )
+      return TT_Err_Invalid_Size_Handle;
+
+    if ( load_flags & FT_LOAD_SBITS_ONLY )
+      return TT_Err_Invalid_Argument;
+
+    error = tt_loader_init( &loader, size, glyph, load_flags, FALSE );
+    if ( error )
+      return error;
+
+    glyph->format        = FT_GLYPH_FORMAT_OUTLINE;
+    glyph->num_subglyphs = 0;
+    glyph->outline.flags = 0;
+
+    /* main loading loop */
+    error = load_truetype_glyph( &loader, glyph_index, 0, FALSE );
+    if ( !error )
+    {
+      if ( glyph->format == FT_GLYPH_FORMAT_COMPOSITE )
+      {
+        glyph->num_subglyphs = loader.gloader->base.num_subglyphs;
+        glyph->subglyphs     = loader.gloader->base.subglyphs;
+      }
+      else
+      {
+        glyph->outline        = loader.gloader->base.outline;
+        glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS;
+
+        /* Translate array so that (0,0) is the glyph's origin.  Note  */
+        /* that this behaviour is independent on the value of bit 1 of */
+        /* the `flags' field in the `head' table -- at least major     */
+        /* applications like Acroread indicate that.                   */
+        if ( loader.pp1.x )
+          FT_Outline_Translate( &glyph->outline, -loader.pp1.x, 0 );
+      }
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+      if ( IS_HINTED( load_flags ) )
+      {
+        if ( loader.exec->GS.scan_control )
+        {
+          /* convert scan conversion mode to FT_OUTLINE_XXX flags */
+          switch ( loader.exec->GS.scan_type )
+          {
+          case 0: /* simple drop-outs including stubs */
+            glyph->outline.flags |= FT_OUTLINE_INCLUDE_STUBS;
+            break;
+          case 1: /* simple drop-outs excluding stubs */
+            /* nothing; it's the default rendering mode */
+            break;
+          case 4: /* smart drop-outs including stubs */
+            glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS |
+                                    FT_OUTLINE_INCLUDE_STUBS;
+            break;
+          case 5: /* smart drop-outs excluding stubs  */
+            glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS;
+            break;
+
+          default: /* no drop-out control */
+            glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS;
+            break;
+          }
+        }
+        else
+          glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS;
+      }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+      compute_glyph_metrics( &loader, glyph_index );
+    }
+
+    /* Set the `high precision' bit flag.                           */
+    /* This is _critical_ to get correct output for monochrome      */
+    /* TrueType glyphs at all sizes using the bytecode interpreter. */
+    /*                                                              */
+    if ( !( load_flags & FT_LOAD_NO_SCALE ) &&
+         size->root.metrics.y_ppem < 24     )
+      glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
+    return error;
+  }
+
+
+/* END */
diff --git a/src/truetype/ttgload.h b/src/truetype/ttgload.h
new file mode 100644 (file)
index 0000000..05f7588
--- /dev/null
@@ -0,0 +1,61 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttgload.h                                                              */
+/*                                                                         */
+/*    TrueType Glyph Loader (specification).                               */
+/*                                                                         */
+/*  Copyright 1996-2006, 2008, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTGLOAD_H__
+#define __TTGLOAD_H__
+
+
+#include <ft2build.h>
+#include "ttobjs.h"
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+#include "ttinterp.h"
+#endif
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( void )
+  TT_Init_Glyph_Loading( TT_Face  face );
+
+  FT_LOCAL( void )
+  TT_Get_HMetrics( TT_Face     face,
+                   FT_UInt     idx,
+                   FT_Short*   lsb,
+                   FT_UShort*  aw );
+
+  FT_LOCAL( void )
+  TT_Get_VMetrics( TT_Face     face,
+                   FT_UInt     idx,
+                   FT_Short*   tsb,
+                   FT_UShort*  ah );
+
+  FT_LOCAL( FT_Error )
+  TT_Load_Glyph( TT_Size       size,
+                 TT_GlyphSlot  glyph,
+                 FT_UInt       glyph_index,
+                 FT_Int32      load_flags );
+
+
+FT_END_HEADER
+
+#endif /* __TTGLOAD_H__ */
+
+
+/* END */
diff --git a/src/truetype/ttgxvar.c b/src/truetype/ttgxvar.c
new file mode 100644 (file)
index 0000000..69b702f
--- /dev/null
@@ -0,0 +1,1551 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttgxvar.c                                                              */
+/*                                                                         */
+/*    TrueType GX Font Variation loader                                    */
+/*                                                                         */
+/*  Copyright 2004-2011 by                                                 */
+/*  David Turner, Robert Wilhelm, Werner Lemberg, and George Williams.     */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Apple documents the `fvar', `gvar', `cvar', and `avar' tables at      */
+  /*                                                                       */
+  /*   http://developer.apple.com/fonts/TTRefMan/RM06/Chap6[fgca]var.html  */
+  /*                                                                       */
+  /* The documentation for `fvar' is inconsistent.  At one point it says   */
+  /* that `countSizePairs' should be 3, at another point 2.  It should     */
+  /* be 2.                                                                 */
+  /*                                                                       */
+  /* The documentation for `gvar' is not intelligible; `cvar' refers you   */
+  /* to `gvar' and is thus also incomprehensible.                          */
+  /*                                                                       */
+  /* The documentation for `avar' appears correct, but Apple has no fonts  */
+  /* with an `avar' table, so it is hard to test.                          */
+  /*                                                                       */
+  /* Many thanks to John Jenkins (at Apple) in figuring this out.          */
+  /*                                                                       */
+  /*                                                                       */
+  /* Apple's `kern' table has some references to tuple indices, but as     */
+  /* there is no indication where these indices are defined, nor how to    */
+  /* interpolate the kerning values (different tuples have different       */
+  /* classes) this issue is ignored.                                       */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_CONFIG_CONFIG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_SFNT_H
+#include FT_TRUETYPE_TAGS_H
+#include FT_MULTIPLE_MASTERS_H
+
+#include "ttpload.h"
+#include "ttgxvar.h"
+
+#include "tterrors.h"
+
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
+
+#define FT_Stream_FTell( stream )  \
+          ( (stream)->cursor - (stream)->base )
+#define FT_Stream_SeekSet( stream, off ) \
+              ( (stream)->cursor = (stream)->base+(off) )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttgxvar
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       Internal Routines                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro ALL_POINTS is used in `ft_var_readpackedpoints'.  It        */
+  /* indicates that there is a delta for every point without needing to    */
+  /* enumerate all of them.                                                */
+  /*                                                                       */
+#define ALL_POINTS  (FT_UShort*)( -1 )
+
+
+#define GX_PT_POINTS_ARE_WORDS      0x80
+#define GX_PT_POINT_RUN_COUNT_MASK  0x7F
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_var_readpackedpoints                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Read a set of points to which the following deltas will apply.     */
+  /*    Points are packed with a run length encoding.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream    :: The data stream.                                      */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    point_cnt :: The number of points read.  A zero value means that   */
+  /*                 all points in the glyph will be affected, without     */
+  /*                 enumerating them individually.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    An array of FT_UShort containing the affected points or the        */
+  /*    special value ALL_POINTS.                                          */
+  /*                                                                       */
+  static FT_UShort*
+  ft_var_readpackedpoints( FT_Stream  stream,
+                           FT_UInt   *point_cnt )
+  {
+    FT_UShort *points = NULL;
+    FT_Int     n;
+    FT_Int     runcnt;
+    FT_Int     i;
+    FT_Int     j;
+    FT_Int     first;
+    FT_Memory  memory = stream->memory;
+    FT_Error   error  = TT_Err_Ok;
+
+    FT_UNUSED( error );
+
+
+    *point_cnt = n = FT_GET_BYTE();
+    if ( n == 0 )
+      return ALL_POINTS;
+
+    if ( n & GX_PT_POINTS_ARE_WORDS )
+      n = FT_GET_BYTE() | ( ( n & GX_PT_POINT_RUN_COUNT_MASK ) << 8 );
+
+    if ( FT_NEW_ARRAY( points, n ) )
+      return NULL;
+
+    i = 0;
+    while ( i < n )
+    {
+      runcnt = FT_GET_BYTE();
+      if ( runcnt & GX_PT_POINTS_ARE_WORDS )
+      {
+        runcnt = runcnt & GX_PT_POINT_RUN_COUNT_MASK;
+        first  = points[i++] = FT_GET_USHORT();
+
+        if ( runcnt < 1 || i + runcnt >= n )
+          goto Exit;
+
+        /* first point not included in runcount */
+        for ( j = 0; j < runcnt; ++j )
+          points[i++] = (FT_UShort)( first += FT_GET_USHORT() );
+      }
+      else
+      {
+        first = points[i++] = FT_GET_BYTE();
+
+        if ( runcnt < 1 || i + runcnt >= n )
+          goto Exit;
+
+        for ( j = 0; j < runcnt; ++j )
+          points[i++] = (FT_UShort)( first += FT_GET_BYTE() );
+      }
+    }
+
+  Exit:
+    return points;
+  }
+
+
+  enum
+  {
+    GX_DT_DELTAS_ARE_ZERO      = 0x80,
+    GX_DT_DELTAS_ARE_WORDS     = 0x40,
+    GX_DT_DELTA_RUN_COUNT_MASK = 0x3F
+  };
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_var_readpackeddeltas                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Read a set of deltas.  These are packed slightly differently than  */
+  /*    points.  In particular there is no overall count.                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream    :: The data stream.                                      */
+  /*                                                                       */
+  /*    delta_cnt :: The number of to be read.                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    An array of FT_Short containing the deltas for the affected        */
+  /*    points.  (This only gets the deltas for one dimension.  It will    */
+  /*    generally be called twice, once for x, once for y.  When used in   */
+  /*    cvt table, it will only be called once.)                           */
+  /*                                                                       */
+  static FT_Short*
+  ft_var_readpackeddeltas( FT_Stream  stream,
+                           FT_Offset  delta_cnt )
+  {
+    FT_Short  *deltas = NULL;
+    FT_UInt    runcnt;
+    FT_Offset  i;
+    FT_UInt    j;
+    FT_Memory  memory = stream->memory;
+    FT_Error   error  = TT_Err_Ok;
+
+    FT_UNUSED( error );
+
+
+    if ( FT_NEW_ARRAY( deltas, delta_cnt ) )
+      return NULL;
+
+    i = 0;
+    while ( i < delta_cnt )
+    {
+      runcnt = FT_GET_BYTE();
+      if ( runcnt & GX_DT_DELTAS_ARE_ZERO )
+      {
+        /* runcnt zeroes get added */
+        for ( j = 0;
+              j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt;
+              ++j )
+          deltas[i++] = 0;
+      }
+      else if ( runcnt & GX_DT_DELTAS_ARE_WORDS )
+      {
+        /* runcnt shorts from the stack */
+        for ( j = 0;
+              j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt;
+              ++j )
+          deltas[i++] = FT_GET_SHORT();
+      }
+      else
+      {
+        /* runcnt signed bytes from the stack */
+        for ( j = 0;
+              j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) && i < delta_cnt;
+              ++j )
+          deltas[i++] = FT_GET_CHAR();
+      }
+
+      if ( j <= ( runcnt & GX_DT_DELTA_RUN_COUNT_MASK ) )
+      {
+        /* Bad format */
+        FT_FREE( deltas );
+        return NULL;
+      }
+    }
+
+    return deltas;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_var_load_avar                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Parse the `avar' table if present.  It need not be, so we return   */
+  /*    nothing.                                                           */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face :: The font face.                                             */
+  /*                                                                       */
+  static void
+  ft_var_load_avar( TT_Face  face )
+  {
+    FT_Stream       stream = FT_FACE_STREAM(face);
+    FT_Memory       memory = stream->memory;
+    GX_Blend        blend  = face->blend;
+    GX_AVarSegment  segment;
+    FT_Error        error = TT_Err_Ok;
+    FT_ULong        version;
+    FT_Long         axisCount;
+    FT_Int          i, j;
+    FT_ULong        table_len;
+
+    FT_UNUSED( error );
+
+
+    blend->avar_checked = TRUE;
+    if ( (error = face->goto_table( face, TTAG_avar, stream, &table_len )) != 0 )
+      return;
+
+    if ( FT_FRAME_ENTER( table_len ) )
+      return;
+
+    version   = FT_GET_LONG();
+    axisCount = FT_GET_LONG();
+
+    if ( version != 0x00010000L                       ||
+         axisCount != (FT_Long)blend->mmvar->num_axis )
+      goto Exit;
+
+    if ( FT_NEW_ARRAY( blend->avar_segment, axisCount ) )
+      goto Exit;
+
+    segment = &blend->avar_segment[0];
+    for ( i = 0; i < axisCount; ++i, ++segment )
+    {
+      segment->pairCount = FT_GET_USHORT();
+      if ( FT_NEW_ARRAY( segment->correspondence, segment->pairCount ) )
+      {
+        /* Failure.  Free everything we have done so far.  We must do */
+        /* it right now since loading the `avar' table is optional.   */
+
+        for ( j = i - 1; j >= 0; --j )
+          FT_FREE( blend->avar_segment[j].correspondence );
+
+        FT_FREE( blend->avar_segment );
+        blend->avar_segment = NULL;
+        goto Exit;
+      }
+
+      for ( j = 0; j < segment->pairCount; ++j )
+      {
+        segment->correspondence[j].fromCoord =
+          FT_GET_SHORT() << 2;    /* convert to Fixed */
+        segment->correspondence[j].toCoord =
+          FT_GET_SHORT()<<2;    /* convert to Fixed */
+      }
+    }
+
+  Exit:
+    FT_FRAME_EXIT();
+  }
+
+
+  typedef struct  GX_GVar_Head_
+  {
+    FT_Long    version;
+    FT_UShort  axisCount;
+    FT_UShort  globalCoordCount;
+    FT_ULong   offsetToCoord;
+    FT_UShort  glyphCount;
+    FT_UShort  flags;
+    FT_ULong   offsetToData;
+
+  } GX_GVar_Head;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_var_load_gvar                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Parses the `gvar' table if present.  If `fvar' is there, `gvar'    */
+  /*    had better be there too.                                           */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face :: The font face.                                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  static FT_Error
+  ft_var_load_gvar( TT_Face  face )
+  {
+    FT_Stream     stream = FT_FACE_STREAM(face);
+    FT_Memory     memory = stream->memory;
+    GX_Blend      blend  = face->blend;
+    FT_Error      error;
+    FT_UInt       i, j;
+    FT_ULong      table_len;
+    FT_ULong      gvar_start;
+    FT_ULong      offsetToData;
+    GX_GVar_Head  gvar_head;
+
+    static const FT_Frame_Field  gvar_fields[] =
+    {
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  GX_GVar_Head
+
+      FT_FRAME_START( 20 ),
+        FT_FRAME_LONG  ( version ),
+        FT_FRAME_USHORT( axisCount ),
+        FT_FRAME_USHORT( globalCoordCount ),
+        FT_FRAME_ULONG ( offsetToCoord ),
+        FT_FRAME_USHORT( glyphCount ),
+        FT_FRAME_USHORT( flags ),
+        FT_FRAME_ULONG ( offsetToData ),
+      FT_FRAME_END
+    };
+
+    if ( (error = face->goto_table( face, TTAG_gvar, stream, &table_len )) != 0 )
+      goto Exit;
+
+    gvar_start = FT_STREAM_POS( );
+    if ( FT_STREAM_READ_FIELDS( gvar_fields, &gvar_head ) )
+      goto Exit;
+
+    blend->tuplecount  = gvar_head.globalCoordCount;
+    blend->gv_glyphcnt = gvar_head.glyphCount;
+    offsetToData       = gvar_start + gvar_head.offsetToData;
+
+    if ( gvar_head.version   != (FT_Long)0x00010000L              ||
+         gvar_head.axisCount != (FT_UShort)blend->mmvar->num_axis )
+    {
+      error = TT_Err_Invalid_Table;
+      goto Exit;
+    }
+
+    if ( FT_NEW_ARRAY( blend->glyphoffsets, blend->gv_glyphcnt + 1 ) )
+      goto Exit;
+
+    if ( gvar_head.flags & 1 )
+    {
+      /* long offsets (one more offset than glyphs, to mark size of last) */
+      if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 4L ) )
+        goto Exit;
+
+      for ( i = 0; i <= blend->gv_glyphcnt; ++i )
+        blend->glyphoffsets[i] = offsetToData + FT_GET_LONG();
+
+      FT_FRAME_EXIT();
+    }
+    else
+    {
+      /* short offsets (one more offset than glyphs, to mark size of last) */
+      if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 2L ) )
+        goto Exit;
+
+      for ( i = 0; i <= blend->gv_glyphcnt; ++i )
+        blend->glyphoffsets[i] = offsetToData + FT_GET_USHORT() * 2;
+                                              /* XXX: Undocumented: `*2'! */
+
+      FT_FRAME_EXIT();
+    }
+
+    if ( blend->tuplecount != 0 )
+    {
+      if ( FT_NEW_ARRAY( blend->tuplecoords,
+                         gvar_head.axisCount * blend->tuplecount ) )
+        goto Exit;
+
+      if ( FT_STREAM_SEEK( gvar_start + gvar_head.offsetToCoord )       ||
+           FT_FRAME_ENTER( blend->tuplecount * gvar_head.axisCount * 2L )                   )
+        goto Exit;
+
+      for ( i = 0; i < blend->tuplecount; ++i )
+        for ( j = 0 ; j < (FT_UInt)gvar_head.axisCount; ++j )
+          blend->tuplecoords[i * gvar_head.axisCount + j] =
+            FT_GET_SHORT() << 2;                /* convert to FT_Fixed */
+
+      FT_FRAME_EXIT();
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ft_var_apply_tuple                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Figure out whether a given tuple (design) applies to the current   */
+  /*    blend, and if so, what is the scaling factor.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    blend           :: The current blend of the font.                  */
+  /*                                                                       */
+  /*    tupleIndex      :: A flag saying whether this is an intermediate   */
+  /*                       tuple or not.                                   */
+  /*                                                                       */
+  /*    tuple_coords    :: The coordinates of the tuple in normalized axis */
+  /*                       units.                                          */
+  /*                                                                       */
+  /*    im_start_coords :: The initial coordinates where this tuple starts */
+  /*                       to apply (for intermediate coordinates).        */
+  /*                                                                       */
+  /*    im_end_coords   :: The final coordinates after which this tuple no */
+  /*                       longer applies (for intermediate coordinates).  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    An FT_Fixed value containing the scaling factor.                   */
+  /*                                                                       */
+  static FT_Fixed
+  ft_var_apply_tuple( GX_Blend   blend,
+                      FT_UShort  tupleIndex,
+                      FT_Fixed*  tuple_coords,
+                      FT_Fixed*  im_start_coords,
+                      FT_Fixed*  im_end_coords )
+  {
+    FT_UInt   i;
+    FT_Fixed  apply;
+    FT_Fixed  temp;
+
+
+    apply = 0x10000L;
+    for ( i = 0; i < blend->num_axis; ++i )
+    {
+      if ( tuple_coords[i] == 0 )
+        /* It's not clear why (for intermediate tuples) we don't need     */
+        /* to check against start/end -- the documentation says we don't. */
+        /* Similarly, it's unclear why we don't need to scale along the   */
+        /* axis.                                                          */
+        continue;
+
+      else if ( blend->normalizedcoords[i] == 0                           ||
+                ( blend->normalizedcoords[i] < 0 && tuple_coords[i] > 0 ) ||
+                ( blend->normalizedcoords[i] > 0 && tuple_coords[i] < 0 ) )
+      {
+        apply = 0;
+        break;
+      }
+
+      else if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) )
+        /* not an intermediate tuple */
+        apply = FT_MulDiv( apply,
+                           blend->normalizedcoords[i] > 0
+                             ? blend->normalizedcoords[i]
+                             : -blend->normalizedcoords[i],
+                           0x10000L );
+
+      else if ( blend->normalizedcoords[i] <= im_start_coords[i] ||
+                blend->normalizedcoords[i] >= im_end_coords[i]   )
+      {
+        apply = 0;
+        break;
+      }
+
+      else if ( blend->normalizedcoords[i] < tuple_coords[i] )
+      {
+        temp = FT_MulDiv( blend->normalizedcoords[i] - im_start_coords[i],
+                          0x10000L,
+                          tuple_coords[i] - im_start_coords[i]);
+        apply = FT_MulDiv( apply, temp, 0x10000L );
+      }
+
+      else
+      {
+        temp = FT_MulDiv( im_end_coords[i] - blend->normalizedcoords[i],
+                          0x10000L,
+                          im_end_coords[i] - tuple_coords[i] );
+        apply = FT_MulDiv( apply, temp, 0x10000L );
+      }
+    }
+
+    return apply;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****               MULTIPLE MASTERS SERVICE FUNCTIONS              *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  typedef struct  GX_FVar_Head_
+  {
+    FT_Long    version;
+    FT_UShort  offsetToData;
+    FT_UShort  countSizePairs;
+    FT_UShort  axisCount;
+    FT_UShort  axisSize;
+    FT_UShort  instanceCount;
+    FT_UShort  instanceSize;
+
+  } GX_FVar_Head;
+
+
+  typedef struct  fvar_axis_
+  {
+    FT_ULong   axisTag;
+    FT_ULong   minValue;
+    FT_ULong   defaultValue;
+    FT_ULong   maxValue;
+    FT_UShort  flags;
+    FT_UShort  nameID;
+
+  } GX_FVar_Axis;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Get_MM_Var                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Check that the font's `fvar' table is valid, parse it, and return  */
+  /*    those data.                                                        */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face   :: The font face.                                           */
+  /*              TT_Get_MM_Var initializes the blend structure.           */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    master :: The `fvar' data (must be freed by caller).               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Get_MM_Var( TT_Face      face,
+                 FT_MM_Var*  *master )
+  {
+    FT_Stream            stream = face->root.stream;
+    FT_Memory            memory = face->root.memory;
+    FT_ULong             table_len;
+    FT_Error             error  = TT_Err_Ok;
+    FT_ULong             fvar_start;
+    FT_Int               i, j;
+    FT_MM_Var*           mmvar = NULL;
+    FT_Fixed*            next_coords;
+    FT_String*           next_name;
+    FT_Var_Axis*         a;
+    FT_Var_Named_Style*  ns;
+    GX_FVar_Head         fvar_head;
+
+    static const FT_Frame_Field  fvar_fields[] =
+    {
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  GX_FVar_Head
+
+      FT_FRAME_START( 16 ),
+        FT_FRAME_LONG  ( version ),
+        FT_FRAME_USHORT( offsetToData ),
+        FT_FRAME_USHORT( countSizePairs ),
+        FT_FRAME_USHORT( axisCount ),
+        FT_FRAME_USHORT( axisSize ),
+        FT_FRAME_USHORT( instanceCount ),
+        FT_FRAME_USHORT( instanceSize ),
+      FT_FRAME_END
+    };
+
+    static const FT_Frame_Field  fvaraxis_fields[] =
+    {
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  GX_FVar_Axis
+
+      FT_FRAME_START( 20 ),
+        FT_FRAME_ULONG ( axisTag ),
+        FT_FRAME_ULONG ( minValue ),
+        FT_FRAME_ULONG ( defaultValue ),
+        FT_FRAME_ULONG ( maxValue ),
+        FT_FRAME_USHORT( flags ),
+        FT_FRAME_USHORT( nameID ),
+      FT_FRAME_END
+    };
+
+
+    if ( face->blend == NULL )
+    {
+      /* both `fvar' and `gvar' must be present */
+      if ( (error = face->goto_table( face, TTAG_gvar,
+                                      stream, &table_len )) != 0 )
+        goto Exit;
+
+      if ( (error = face->goto_table( face, TTAG_fvar,
+                                      stream, &table_len )) != 0 )
+        goto Exit;
+
+      fvar_start = FT_STREAM_POS( );
+
+      if ( FT_STREAM_READ_FIELDS( fvar_fields, &fvar_head ) )
+        goto Exit;
+
+      if ( fvar_head.version != (FT_Long)0x00010000L                      ||
+           fvar_head.countSizePairs != 2                                  ||
+           fvar_head.axisSize != 20                                       ||
+           /* axisCount limit implied by 16-bit instanceSize */
+           fvar_head.axisCount > 0x3FFE                                   ||
+           fvar_head.instanceSize != 4 + 4 * fvar_head.axisCount          ||
+           /* instanceCount limit implied by limited range of name IDs */
+           fvar_head.instanceCount > 0x7EFF                               ||
+           fvar_head.offsetToData + fvar_head.axisCount * 20U +
+             fvar_head.instanceCount * fvar_head.instanceSize > table_len )
+      {
+        error = TT_Err_Invalid_Table;
+        goto Exit;
+      }
+
+      if ( FT_NEW( face->blend ) )
+        goto Exit;
+
+      /* cannot overflow 32-bit arithmetic because of limits above */
+      face->blend->mmvar_len =
+        sizeof ( FT_MM_Var ) +
+        fvar_head.axisCount * sizeof ( FT_Var_Axis ) +
+        fvar_head.instanceCount * sizeof ( FT_Var_Named_Style ) +
+        fvar_head.instanceCount * fvar_head.axisCount * sizeof ( FT_Fixed ) +
+        5 * fvar_head.axisCount;
+
+      if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) )
+        goto Exit;
+      face->blend->mmvar = mmvar;
+
+      mmvar->num_axis =
+        fvar_head.axisCount;
+      mmvar->num_designs =
+        (FT_UInt)-1;           /* meaningless in this context; each glyph */
+                               /* may have a different number of designs  */
+                               /* (or tuples, as called by Apple)         */
+      mmvar->num_namedstyles =
+        fvar_head.instanceCount;
+      mmvar->axis =
+        (FT_Var_Axis*)&(mmvar[1]);
+      mmvar->namedstyle =
+        (FT_Var_Named_Style*)&(mmvar->axis[fvar_head.axisCount]);
+
+      next_coords =
+        (FT_Fixed*)&(mmvar->namedstyle[fvar_head.instanceCount]);
+      for ( i = 0; i < fvar_head.instanceCount; ++i )
+      {
+        mmvar->namedstyle[i].coords  = next_coords;
+        next_coords                 += fvar_head.axisCount;
+      }
+
+      next_name = (FT_String*)next_coords;
+      for ( i = 0; i < fvar_head.axisCount; ++i )
+      {
+        mmvar->axis[i].name  = next_name;
+        next_name           += 5;
+      }
+
+      if ( FT_STREAM_SEEK( fvar_start + fvar_head.offsetToData ) )
+        goto Exit;
+
+      a = mmvar->axis;
+      for ( i = 0; i < fvar_head.axisCount; ++i )
+      {
+        GX_FVar_Axis  axis_rec;
+
+
+        if ( FT_STREAM_READ_FIELDS( fvaraxis_fields, &axis_rec ) )
+          goto Exit;
+        a->tag     = axis_rec.axisTag;
+        a->minimum = axis_rec.minValue;     /* A Fixed */
+        a->def     = axis_rec.defaultValue; /* A Fixed */
+        a->maximum = axis_rec.maxValue;     /* A Fixed */
+        a->strid   = axis_rec.nameID;
+
+        a->name[0] = (FT_String)(   a->tag >> 24 );
+        a->name[1] = (FT_String)( ( a->tag >> 16 ) & 0xFF );
+        a->name[2] = (FT_String)( ( a->tag >>  8 ) & 0xFF );
+        a->name[3] = (FT_String)( ( a->tag       ) & 0xFF );
+        a->name[4] = 0;
+
+        ++a;
+      }
+
+      ns = mmvar->namedstyle;
+      for ( i = 0; i < fvar_head.instanceCount; ++i, ++ns )
+      {
+        if ( FT_FRAME_ENTER( 4L + 4L * fvar_head.axisCount ) )
+          goto Exit;
+
+        ns->strid       =    FT_GET_USHORT();
+        (void) /* flags = */ FT_GET_USHORT();
+
+        for ( j = 0; j < fvar_head.axisCount; ++j )
+          ns->coords[j] = FT_GET_ULONG();     /* A Fixed */
+
+        FT_FRAME_EXIT();
+      }
+    }
+
+    if ( master != NULL )
+    {
+      FT_UInt  n;
+
+
+      if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) )
+        goto Exit;
+      FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len );
+
+      mmvar->axis =
+        (FT_Var_Axis*)&(mmvar[1]);
+      mmvar->namedstyle =
+        (FT_Var_Named_Style*)&(mmvar->axis[mmvar->num_axis]);
+      next_coords =
+        (FT_Fixed*)&(mmvar->namedstyle[mmvar->num_namedstyles]);
+
+      for ( n = 0; n < mmvar->num_namedstyles; ++n )
+      {
+        mmvar->namedstyle[n].coords  = next_coords;
+        next_coords                 += mmvar->num_axis;
+      }
+
+      a = mmvar->axis;
+      next_name = (FT_String*)next_coords;
+      for ( n = 0; n < mmvar->num_axis; ++n )
+      {
+        a->name = next_name;
+
+        /* standard PostScript names for some standard apple tags */
+        if ( a->tag == TTAG_wght )
+          a->name = (char *)"Weight";
+        else if ( a->tag == TTAG_wdth )
+          a->name = (char *)"Width";
+        else if ( a->tag == TTAG_opsz )
+          a->name = (char *)"OpticalSize";
+        else if ( a->tag == TTAG_slnt )
+          a->name = (char *)"Slant";
+
+        next_name += 5;
+        ++a;
+      }
+
+      *master = mmvar;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Set_MM_Blend                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Set the blend (normalized) coordinates for this instance of the    */
+  /*    font.  Check that the `gvar' table is reasonable and does some     */
+  /*    initial preparation.                                               */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: The font.                                            */
+  /*                  Initialize the blend structure with `gvar' data.     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    num_coords :: Must be the axis count of the font.                  */
+  /*                                                                       */
+  /*    coords     :: An array of num_coords, each between [-1,1].         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Set_MM_Blend( TT_Face    face,
+                   FT_UInt    num_coords,
+                   FT_Fixed*  coords )
+  {
+    FT_Error    error = TT_Err_Ok;
+    GX_Blend    blend;
+    FT_MM_Var*  mmvar;
+    FT_UInt     i;
+    FT_Memory   memory = face->root.memory;
+
+    enum
+    {
+      mcvt_retain,
+      mcvt_modify,
+      mcvt_load
+
+    } manageCvt;
+
+
+    face->doblend = FALSE;
+
+    if ( face->blend == NULL )
+    {
+      if ( (error = TT_Get_MM_Var( face, NULL)) != 0 )
+        goto Exit;
+    }
+
+    blend = face->blend;
+    mmvar = blend->mmvar;
+
+    if ( num_coords != mmvar->num_axis )
+    {
+      error = TT_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    for ( i = 0; i < num_coords; ++i )
+      if ( coords[i] < -0x00010000L || coords[i] > 0x00010000L )
+      {
+        error = TT_Err_Invalid_Argument;
+        goto Exit;
+      }
+
+    if ( blend->glyphoffsets == NULL )
+      if ( (error = ft_var_load_gvar( face )) != 0 )
+        goto Exit;
+
+    if ( blend->normalizedcoords == NULL )
+    {
+      if ( FT_NEW_ARRAY( blend->normalizedcoords, num_coords ) )
+        goto Exit;
+
+      manageCvt = mcvt_modify;
+
+      /* If we have not set the blend coordinates before this, then the  */
+      /* cvt table will still be what we read from the `cvt ' table and  */
+      /* we don't need to reload it.  We may need to change it though... */
+    }
+    else
+    {
+      manageCvt = mcvt_retain;
+      for ( i = 0; i < num_coords; ++i )
+      {
+        if ( blend->normalizedcoords[i] != coords[i] )
+        {
+          manageCvt = mcvt_load;
+          break;
+        }
+      }
+
+      /* If we don't change the blend coords then we don't need to do  */
+      /* anything to the cvt table.  It will be correct.  Otherwise we */
+      /* no longer have the original cvt (it was modified when we set  */
+      /* the blend last time), so we must reload and then modify it.   */
+    }
+
+    blend->num_axis = num_coords;
+    FT_MEM_COPY( blend->normalizedcoords,
+                 coords,
+                 num_coords * sizeof ( FT_Fixed ) );
+
+    face->doblend = TRUE;
+
+    if ( face->cvt != NULL )
+    {
+      switch ( manageCvt )
+      {
+      case mcvt_load:
+        /* The cvt table has been loaded already; every time we change the */
+        /* blend we may need to reload and remodify the cvt table.         */
+        FT_FREE( face->cvt );
+        face->cvt = NULL;
+
+        tt_face_load_cvt( face, face->root.stream );
+        break;
+
+      case mcvt_modify:
+        /* The original cvt table is in memory.  All we need to do is */
+        /* apply the `cvar' table (if any).                           */
+        tt_face_vary_cvt( face, face->root.stream );
+        break;
+
+      case mcvt_retain:
+        /* The cvt table is correct for this set of coordinates. */
+        break;
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Set_Var_Design                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Set the coordinates for the instance, measured in the user         */
+  /*    coordinate system.  Parse the `avar' table (if present) to convert */
+  /*    from user to normalized coordinates.                               */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: The font face.                                       */
+  /*                  Initialize the blend struct with `gvar' data.        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    num_coords :: This must be the axis count of the font.             */
+  /*                                                                       */
+  /*    coords     :: A coordinate array with `num_coords' elements.       */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Set_Var_Design( TT_Face    face,
+                     FT_UInt    num_coords,
+                     FT_Fixed*  coords )
+  {
+    FT_Error        error      = TT_Err_Ok;
+    FT_Fixed*       normalized = NULL;
+    GX_Blend        blend;
+    FT_MM_Var*      mmvar;
+    FT_UInt         i, j;
+    FT_Var_Axis*    a;
+    GX_AVarSegment  av;
+    FT_Memory       memory = face->root.memory;
+
+
+    if ( face->blend == NULL )
+    {
+      if ( (error = TT_Get_MM_Var( face, NULL )) != 0 )
+        goto Exit;
+    }
+
+    blend = face->blend;
+    mmvar = blend->mmvar;
+
+    if ( num_coords != mmvar->num_axis )
+    {
+      error = TT_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    /* Axis normalization is a two stage process.  First we normalize */
+    /* based on the [min,def,max] values for the axis to be [-1,0,1]. */
+    /* Then, if there's an `avar' table, we renormalize this range.   */
+
+    if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) )
+      goto Exit;
+
+    a = mmvar->axis;
+    for ( i = 0; i < mmvar->num_axis; ++i, ++a )
+    {
+      if ( coords[i] > a->maximum || coords[i] < a->minimum )
+      {
+        error = TT_Err_Invalid_Argument;
+        goto Exit;
+      }
+
+      if ( coords[i] < a->def )
+      {
+        normalized[i] = -FT_MulDiv( coords[i] - a->def,
+                                    0x10000L,
+                                    a->minimum - a->def );
+      }
+      else if ( a->maximum == a->def )
+        normalized[i] = 0;
+      else
+      {
+        normalized[i] = FT_MulDiv( coords[i] - a->def,
+                                   0x10000L,
+                                   a->maximum - a->def );
+      }
+    }
+
+    if ( !blend->avar_checked )
+      ft_var_load_avar( face );
+
+    if ( blend->avar_segment != NULL )
+    {
+      av = blend->avar_segment;
+      for ( i = 0; i < mmvar->num_axis; ++i, ++av )
+      {
+        for ( j = 1; j < (FT_UInt)av->pairCount; ++j )
+          if ( normalized[i] < av->correspondence[j].fromCoord )
+          {
+            normalized[i] =
+              FT_MulDiv(
+                FT_MulDiv(
+                  normalized[i] - av->correspondence[j - 1].fromCoord,
+                  0x10000L,
+                  av->correspondence[j].fromCoord -
+                    av->correspondence[j - 1].fromCoord ),
+                av->correspondence[j].toCoord -
+                  av->correspondence[j - 1].toCoord,
+                0x10000L ) +
+              av->correspondence[j - 1].toCoord;
+            break;
+          }
+      }
+    }
+
+    error = TT_Set_MM_Blend( face, num_coords, normalized );
+
+  Exit:
+    FT_FREE( normalized );
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                     GX VAR PARSING ROUTINES                   *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_vary_cvt                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Modify the loaded cvt table according to the `cvar' table and the  */
+  /*    font's blend.                                                      */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: A handle to the input stream.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /*    Most errors are ignored.  It is perfectly valid not to have a      */
+  /*    `cvar' table even if there is a `gvar' and `fvar' table.           */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_vary_cvt( TT_Face    face,
+                    FT_Stream  stream )
+  {
+    FT_Error    error;
+    FT_Memory   memory = stream->memory;
+    FT_ULong    table_start;
+    FT_ULong    table_len;
+    FT_UInt     tupleCount;
+    FT_ULong    offsetToData;
+    FT_ULong    here;
+    FT_UInt     i, j;
+    FT_Fixed*   tuple_coords    = NULL;
+    FT_Fixed*   im_start_coords = NULL;
+    FT_Fixed*   im_end_coords   = NULL;
+    GX_Blend    blend           = face->blend;
+    FT_UInt     point_count;
+    FT_UShort*  localpoints;
+    FT_Short*   deltas;
+
+
+    FT_TRACE2(( "CVAR " ));
+
+    if ( blend == NULL )
+    {
+      FT_TRACE2(( "tt_face_vary_cvt: no blend specified\n" ));
+
+      error = TT_Err_Ok;
+      goto Exit;
+    }
+
+    if ( face->cvt == NULL )
+    {
+      FT_TRACE2(( "tt_face_vary_cvt: no `cvt ' table\n" ));
+
+      error = TT_Err_Ok;
+      goto Exit;
+    }
+
+    error = face->goto_table( face, TTAG_cvar, stream, &table_len );
+    if ( error )
+    {
+      FT_TRACE2(( "is missing\n" ));
+
+      error = TT_Err_Ok;
+      goto Exit;
+    }
+
+    if ( FT_FRAME_ENTER( table_len ) )
+    {
+      error = TT_Err_Ok;
+      goto Exit;
+    }
+
+    table_start = FT_Stream_FTell( stream );
+    if ( FT_GET_LONG() != 0x00010000L )
+    {
+      FT_TRACE2(( "bad table version\n" ));
+
+      error = TT_Err_Ok;
+      goto FExit;
+    }
+
+    if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis )    ||
+         FT_NEW_ARRAY( im_start_coords, blend->num_axis ) ||
+         FT_NEW_ARRAY( im_end_coords, blend->num_axis )   )
+      goto FExit;
+
+    tupleCount   = FT_GET_USHORT();
+    offsetToData = table_start + FT_GET_USHORT();
+
+    /* The documentation implies there are flags packed into the        */
+    /* tuplecount, but John Jenkins says that shared points don't apply */
+    /* to `cvar', and no other flags are defined.                       */
+
+    for ( i = 0; i < ( tupleCount & 0xFFF ); ++i )
+    {
+      FT_UInt   tupleDataSize;
+      FT_UInt   tupleIndex;
+      FT_Fixed  apply;
+
+
+      tupleDataSize = FT_GET_USHORT();
+      tupleIndex    = FT_GET_USHORT();
+
+      /* There is no provision here for a global tuple coordinate section, */
+      /* so John says.  There are no tuple indices, just embedded tuples.  */
+
+      if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )
+      {
+        for ( j = 0; j < blend->num_axis; ++j )
+          tuple_coords[j] = FT_GET_SHORT() << 2; /* convert from        */
+                                                 /* short frac to fixed */
+      }
+      else
+      {
+        /* skip this tuple; it makes no sense */
+
+        if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
+          for ( j = 0; j < 2 * blend->num_axis; ++j )
+            (void)FT_GET_SHORT();
+
+        offsetToData += tupleDataSize;
+        continue;
+      }
+
+      if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
+      {
+        for ( j = 0; j < blend->num_axis; ++j )
+          im_start_coords[j] = FT_GET_SHORT() << 2;
+        for ( j = 0; j < blend->num_axis; ++j )
+          im_end_coords[j] = FT_GET_SHORT() << 2;
+      }
+
+      apply = ft_var_apply_tuple( blend,
+                                  (FT_UShort)tupleIndex,
+                                  tuple_coords,
+                                  im_start_coords,
+                                  im_end_coords );
+      if ( /* tuple isn't active for our blend */
+           apply == 0                                    ||
+           /* global points not allowed,           */
+           /* if they aren't local, makes no sense */
+           !( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) )
+      {
+        offsetToData += tupleDataSize;
+        continue;
+      }
+
+      here = FT_Stream_FTell( stream );
+
+      FT_Stream_SeekSet( stream, offsetToData );
+
+      localpoints = ft_var_readpackedpoints( stream, &point_count );
+      deltas      = ft_var_readpackeddeltas( stream,
+                                             point_count == 0 ? face->cvt_size
+                                                              : point_count );
+      if ( localpoints == NULL || deltas == NULL )
+        /* failure, ignore it */;
+
+      else if ( localpoints == ALL_POINTS )
+      {
+        /* this means that there are deltas for every entry in cvt */
+        for ( j = 0; j < face->cvt_size; ++j )
+          face->cvt[j] = (FT_Short)( face->cvt[j] +
+                                     FT_MulFix( deltas[j], apply ) );
+      }
+
+      else
+      {
+        for ( j = 0; j < point_count; ++j )
+        {
+          int  pindex = localpoints[j];
+
+          face->cvt[pindex] = (FT_Short)( face->cvt[pindex] +
+                                          FT_MulFix( deltas[j], apply ) );
+        }
+      }
+
+      if ( localpoints != ALL_POINTS )
+        FT_FREE( localpoints );
+      FT_FREE( deltas );
+
+      offsetToData += tupleDataSize;
+
+      FT_Stream_SeekSet( stream, here );
+    }
+
+  FExit:
+    FT_FRAME_EXIT();
+
+  Exit:
+    FT_FREE( tuple_coords );
+    FT_FREE( im_start_coords );
+    FT_FREE( im_end_coords );
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Vary_Get_Glyph_Deltas                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the appropriate deltas for the current glyph.                 */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face        :: A handle to the target face object.                 */
+  /*                                                                       */
+  /*    glyph_index :: The index of the glyph being modified.              */
+  /*                                                                       */
+  /*    n_points    :: The number of the points in the glyph, including    */
+  /*                   phantom points.                                     */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    deltas      :: The array of points to change.                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Vary_Get_Glyph_Deltas( TT_Face      face,
+                            FT_UInt      glyph_index,
+                            FT_Vector*  *deltas,
+                            FT_UInt      n_points )
+  {
+    FT_Stream   stream = face->root.stream;
+    FT_Memory   memory = stream->memory;
+    GX_Blend    blend  = face->blend;
+    FT_Vector*  delta_xy = NULL;
+
+    FT_Error    error;
+    FT_ULong    glyph_start;
+    FT_UInt     tupleCount;
+    FT_ULong    offsetToData;
+    FT_ULong    here;
+    FT_UInt     i, j;
+    FT_Fixed*   tuple_coords    = NULL;
+    FT_Fixed*   im_start_coords = NULL;
+    FT_Fixed*   im_end_coords   = NULL;
+    FT_UInt     point_count, spoint_count = 0;
+    FT_UShort*  sharedpoints = NULL;
+    FT_UShort*  localpoints  = NULL;
+    FT_UShort*  points;
+    FT_Short    *deltas_x, *deltas_y;
+
+
+    if ( !face->doblend || blend == NULL )
+      return TT_Err_Invalid_Argument;
+
+    /* to be freed by the caller */
+    if ( FT_NEW_ARRAY( delta_xy, n_points ) )
+      goto Exit;
+    *deltas = delta_xy;
+
+    if ( glyph_index >= blend->gv_glyphcnt      ||
+         blend->glyphoffsets[glyph_index] ==
+           blend->glyphoffsets[glyph_index + 1] )
+      return TT_Err_Ok;               /* no variation data for this glyph */
+
+    if ( FT_STREAM_SEEK( blend->glyphoffsets[glyph_index] )   ||
+         FT_FRAME_ENTER( blend->glyphoffsets[glyph_index + 1] -
+                           blend->glyphoffsets[glyph_index] ) )
+      goto Fail1;
+
+    glyph_start = FT_Stream_FTell( stream );
+
+    /* each set of glyph variation data is formatted similarly to `cvar' */
+    /* (except we get shared points and global tuples)                   */
+
+    if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis )    ||
+         FT_NEW_ARRAY( im_start_coords, blend->num_axis ) ||
+         FT_NEW_ARRAY( im_end_coords, blend->num_axis )   )
+      goto Fail2;
+
+    tupleCount   = FT_GET_USHORT();
+    offsetToData = glyph_start + FT_GET_USHORT();
+
+    if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS )
+    {
+      here = FT_Stream_FTell( stream );
+
+      FT_Stream_SeekSet( stream, offsetToData );
+
+      sharedpoints = ft_var_readpackedpoints( stream, &spoint_count );
+      offsetToData = FT_Stream_FTell( stream );
+
+      FT_Stream_SeekSet( stream, here );
+    }
+
+    for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); ++i )
+    {
+      FT_UInt   tupleDataSize;
+      FT_UInt   tupleIndex;
+      FT_Fixed  apply;
+
+
+      tupleDataSize = FT_GET_USHORT();
+      tupleIndex    = FT_GET_USHORT();
+
+      if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )
+      {
+        for ( j = 0; j < blend->num_axis; ++j )
+          tuple_coords[j] = FT_GET_SHORT() << 2;  /* convert from        */
+                                                  /* short frac to fixed */
+      }
+      else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount )
+      {
+        error = TT_Err_Invalid_Table;
+        goto Fail3;
+      }
+      else
+      {
+        FT_MEM_COPY(
+          tuple_coords,
+          &blend->tuplecoords[(tupleIndex & 0xFFF) * blend->num_axis],
+          blend->num_axis * sizeof ( FT_Fixed ) );
+      }
+
+      if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
+      {
+        for ( j = 0; j < blend->num_axis; ++j )
+          im_start_coords[j] = FT_GET_SHORT() << 2;
+        for ( j = 0; j < blend->num_axis; ++j )
+          im_end_coords[j] = FT_GET_SHORT() << 2;
+      }
+
+      apply = ft_var_apply_tuple( blend,
+                                  (FT_UShort)tupleIndex,
+                                  tuple_coords,
+                                  im_start_coords,
+                                  im_end_coords );
+
+      if ( apply == 0 )              /* tuple isn't active for our blend */
+      {
+        offsetToData += tupleDataSize;
+        continue;
+      }
+
+      here = FT_Stream_FTell( stream );
+
+      if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS )
+      {
+        FT_Stream_SeekSet( stream, offsetToData );
+
+        localpoints = ft_var_readpackedpoints( stream, &point_count );
+        points      = localpoints;
+      }
+      else
+      {
+        points      = sharedpoints;
+        point_count = spoint_count;
+      }
+
+      deltas_x = ft_var_readpackeddeltas( stream,
+                                          point_count == 0 ? n_points
+                                                           : point_count );
+      deltas_y = ft_var_readpackeddeltas( stream,
+                                          point_count == 0 ? n_points
+                                                           : point_count );
+
+      if ( points == NULL || deltas_y == NULL || deltas_x == NULL )
+        ; /* failure, ignore it */
+
+      else if ( points == ALL_POINTS )
+      {
+        /* this means that there are deltas for every point in the glyph */
+        for ( j = 0; j < n_points; ++j )
+        {
+          delta_xy[j].x += FT_MulFix( deltas_x[j], apply );
+          delta_xy[j].y += FT_MulFix( deltas_y[j], apply );
+        }
+      }
+
+      else
+      {
+        for ( j = 0; j < point_count; ++j )
+        {
+          if ( localpoints[j] >= n_points )
+            continue;
+
+          delta_xy[localpoints[j]].x += FT_MulFix( deltas_x[j], apply );
+          delta_xy[localpoints[j]].y += FT_MulFix( deltas_y[j], apply );
+        }
+      }
+
+      if ( localpoints != ALL_POINTS )
+        FT_FREE( localpoints );
+      FT_FREE( deltas_x );
+      FT_FREE( deltas_y );
+
+      offsetToData += tupleDataSize;
+
+      FT_Stream_SeekSet( stream, here );
+    }
+
+  Fail3:
+    FT_FREE( tuple_coords );
+    FT_FREE( im_start_coords );
+    FT_FREE( im_end_coords );
+
+  Fail2:
+    FT_FRAME_EXIT();
+
+  Fail1:
+    if ( error )
+    {
+      FT_FREE( delta_xy );
+      *deltas = NULL;
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_done_blend                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Frees the blend internal data structure.                           */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  tt_done_blend( FT_Memory  memory,
+                 GX_Blend   blend )
+  {
+    if ( blend != NULL )
+    {
+      FT_UInt  i;
+
+
+      FT_FREE( blend->normalizedcoords );
+      FT_FREE( blend->mmvar );
+
+      if ( blend->avar_segment != NULL )
+      {
+        for ( i = 0; i < blend->num_axis; ++i )
+          FT_FREE( blend->avar_segment[i].correspondence );
+        FT_FREE( blend->avar_segment );
+      }
+
+      FT_FREE( blend->tuplecoords );
+      FT_FREE( blend->glyphoffsets );
+      FT_FREE( blend );
+    }
+  }
+
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
+
+/* END */
diff --git a/src/truetype/ttgxvar.h b/src/truetype/ttgxvar.h
new file mode 100644 (file)
index 0000000..82dfc44
--- /dev/null
@@ -0,0 +1,182 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttgxvar.h                                                              */
+/*                                                                         */
+/*    TrueType GX Font Variation loader (specification)                    */
+/*                                                                         */
+/*  Copyright 2004 by                                                      */
+/*  David Turner, Robert Wilhelm, Werner Lemberg and George Williams.      */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTGXVAR_H__
+#define __TTGXVAR_H__
+
+
+#include <ft2build.h>
+#include "ttobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    GX_AVarCorrespondenceRec                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A data structure representing `shortFracCorrespondence' in `avar'  */
+  /*    table according to the specifications from Apple.                  */
+  /*                                                                       */
+  typedef struct  GX_AVarCorrespondenceRec_
+  {
+    FT_Fixed  fromCoord;
+    FT_Fixed  toCoord;
+
+  } GX_AVarCorrespondenceRec_, *GX_AVarCorrespondence;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    GX_AVarRec                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Data from the segment field of `avar' table.                       */
+  /*    There is one of these for each axis.                               */
+  /*                                                                       */
+  typedef struct  GX_AVarSegmentRec_
+  {
+    FT_UShort              pairCount;
+    GX_AVarCorrespondence  correspondence; /* array with pairCount entries */
+
+  } GX_AVarSegmentRec, *GX_AVarSegment;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    GX_BlendRec                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Data for interpolating a font from a distortable font specified    */
+  /*    by the GX *var tables ([fgca]var).                                 */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    num_axis         :: The number of axes along which interpolation   */
+  /*                         may happen                                    */
+  /*                                                                       */
+  /*    normalizedcoords :: A normalized value (between [-1,1]) indicating */
+  /*                        the contribution along each axis to the final  */
+  /*                        interpolated font.                             */
+  /*                                                                       */
+  typedef struct  GX_BlendRec_
+  {
+    FT_UInt         num_axis;
+    FT_Fixed*       normalizedcoords;
+
+    FT_MM_Var*      mmvar;
+    FT_Offset       mmvar_len;
+
+    FT_Bool         avar_checked;
+    GX_AVarSegment  avar_segment;
+
+    FT_UInt         tuplecount;      /* shared tuples in `gvar'           */
+    FT_Fixed*       tuplecoords;     /* tuplecoords[tuplecount][num_axis] */
+
+    FT_UInt         gv_glyphcnt;
+    FT_ULong*       glyphoffsets;
+
+  } GX_BlendRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <enum>                                                                */
+  /*    GX_TupleCountFlags                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Flags used within the `TupleCount' field of the `gvar' table.      */
+  /*                                                                       */
+  typedef enum  GX_TupleCountFlags_
+  {
+    GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000,
+    GX_TC_RESERVED_TUPLE_FLAGS       = 0x7000,
+    GX_TC_TUPLE_COUNT_MASK           = 0x0FFF
+
+  } GX_TupleCountFlags;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <enum>                                                                */
+  /*    GX_TupleIndexFlags                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Flags used within the `TupleIndex' field of the `gvar' and `cvar'  */
+  /*    tables.                                                            */
+  /*                                                                       */
+  typedef enum  GX_TupleIndexFlags_
+  {
+    GX_TI_EMBEDDED_TUPLE_COORD  = 0x8000,
+    GX_TI_INTERMEDIATE_TUPLE    = 0x4000,
+    GX_TI_PRIVATE_POINT_NUMBERS = 0x2000,
+    GX_TI_RESERVED_TUPLE_FLAG   = 0x1000,
+    GX_TI_TUPLE_INDEX_MASK      = 0x0FFF
+
+  } GX_TupleIndexFlags;
+
+
+#define TTAG_wght  FT_MAKE_TAG( 'w', 'g', 'h', 't' )
+#define TTAG_wdth  FT_MAKE_TAG( 'w', 'd', 't', 'h' )
+#define TTAG_opsz  FT_MAKE_TAG( 'o', 'p', 's', 'z' )
+#define TTAG_slnt  FT_MAKE_TAG( 's', 'l', 'n', 't' )
+
+
+  FT_LOCAL( FT_Error )
+  TT_Set_MM_Blend( TT_Face    face,
+                   FT_UInt    num_coords,
+                   FT_Fixed*  coords );
+
+  FT_LOCAL( FT_Error )
+  TT_Set_Var_Design( TT_Face    face,
+                     FT_UInt    num_coords,
+                     FT_Fixed*  coords );
+
+  FT_LOCAL( FT_Error )
+  TT_Get_MM_Var( TT_Face      face,
+                 FT_MM_Var*  *master );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_vary_cvt( TT_Face    face,
+                    FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  TT_Vary_Get_Glyph_Deltas( TT_Face      face,
+                            FT_UInt      glyph_index,
+                            FT_Vector*  *deltas,
+                            FT_UInt      n_points );
+
+
+  FT_LOCAL( void )
+  tt_done_blend( FT_Memory  memory,
+                 GX_Blend   blend );
+
+
+FT_END_HEADER
+
+
+#endif /* __TTGXVAR_H__ */
+
+
+/* END */
diff --git a/src/truetype/ttinterp.c b/src/truetype/ttinterp.c
new file mode 100644 (file)
index 0000000..3acb24a
--- /dev/null
@@ -0,0 +1,8267 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttinterp.c                                                             */
+/*                                                                         */
+/*    TrueType bytecode interpreter (body).                                */
+/*                                                                         */
+/*  Copyright 1996-2012                                                    */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+/* Greg Hitchcock from Microsoft has helped a lot in resolving unclear */
+/* issues; many thanks!                                                */
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_CALC_H
+#include FT_TRIGONOMETRY_H
+#include FT_SYSTEM_H
+
+#include "ttinterp.h"
+
+#include "tterrors.h"
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+
+#define TT_MULFIX           FT_MulFix
+#define TT_MULDIV           FT_MulDiv
+#define TT_MULDIV_NO_ROUND  FT_MulDiv_No_Round
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttinterp
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* In order to detect infinite loops in the code, we set up a counter    */
+  /* within the run loop.  A single stroke of interpretation is now        */
+  /* limited to a maximal number of opcodes defined below.                 */
+  /*                                                                       */
+#define MAX_RUNNABLE_OPCODES  1000000L
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* There are two kinds of implementations:                               */
+  /*                                                                       */
+  /* a. static implementation                                              */
+  /*                                                                       */
+  /*    The current execution context is a static variable, which fields   */
+  /*    are accessed directly by the interpreter during execution.  The    */
+  /*    context is named `cur'.                                            */
+  /*                                                                       */
+  /*    This version is non-reentrant, of course.                          */
+  /*                                                                       */
+  /* b. indirect implementation                                            */
+  /*                                                                       */
+  /*    The current execution context is passed to _each_ function as its  */
+  /*    first argument, and each field is thus accessed indirectly.        */
+  /*                                                                       */
+  /*    This version is fully re-entrant.                                  */
+  /*                                                                       */
+  /* The idea is that an indirect implementation may be slower to execute  */
+  /* on low-end processors that are used in some systems (like 386s or     */
+  /* even 486s).                                                           */
+  /*                                                                       */
+  /* As a consequence, the indirect implementation is now the default, as  */
+  /* its performance costs can be considered negligible in our context.    */
+  /* Note, however, that we kept the same source with macros because:      */
+  /*                                                                       */
+  /* - The code is kept very close in design to the Pascal code used for   */
+  /*   development.                                                        */
+  /*                                                                       */
+  /* - It's much more readable that way!                                   */
+  /*                                                                       */
+  /* - It's still open to experimentation and tuning.                      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER     /* indirect implementation */
+
+#define CUR  (*exc)                             /* see ttobjs.h */
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This macro is used whenever `exec' is unused in a function, to avoid  */
+  /* stupid warnings from pedantic compilers.                              */
+  /*                                                                       */
+#define FT_UNUSED_EXEC  FT_UNUSED( exc )
+
+#else                                           /* static implementation */
+
+#define CUR  cur
+
+#define FT_UNUSED_EXEC  int  __dummy = __dummy
+
+  static
+  TT_ExecContextRec  cur;   /* static exec. context variable */
+
+  /* apparently, we have a _lot_ of direct indexing when accessing  */
+  /* the static `cur', which makes the code bigger (due to all the  */
+  /* four bytes addresses).                                         */
+
+#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The instruction argument stack.                                       */
+  /*                                                                       */
+#define INS_ARG  EXEC_OP_ FT_Long*  args    /* see ttobjs.h for EXEC_OP_ */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This macro is used whenever `args' is unused in a function, to avoid  */
+  /* stupid warnings from pedantic compilers.                              */
+  /*                                                                       */
+#define FT_UNUSED_ARG  FT_UNUSED_EXEC; FT_UNUSED( args )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The following macros hide the use of EXEC_ARG and EXEC_ARG_ to        */
+  /* increase readability of the code.                                     */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#define SKIP_Code() \
+          SkipCode( EXEC_ARG )
+
+#define GET_ShortIns() \
+          GetShortIns( EXEC_ARG )
+
+#define NORMalize( x, y, v ) \
+          Normalize( EXEC_ARG_ x, y, v )
+
+#define SET_SuperRound( scale, flags ) \
+          SetSuperRound( EXEC_ARG_ scale, flags )
+
+#define ROUND_None( d, c ) \
+          Round_None( EXEC_ARG_ d, c )
+
+#define INS_Goto_CodeRange( range, ip ) \
+          Ins_Goto_CodeRange( EXEC_ARG_ range, ip )
+
+#define CUR_Func_move( z, p, d ) \
+          CUR.func_move( EXEC_ARG_ z, p, d )
+
+#define CUR_Func_move_orig( z, p, d ) \
+          CUR.func_move_orig( EXEC_ARG_ z, p, d )
+
+#define CUR_Func_round( d, c ) \
+          CUR.func_round( EXEC_ARG_ d, c )
+
+#define CUR_Func_read_cvt( index ) \
+          CUR.func_read_cvt( EXEC_ARG_ index )
+
+#define CUR_Func_write_cvt( index, val ) \
+          CUR.func_write_cvt( EXEC_ARG_ index, val )
+
+#define CUR_Func_move_cvt( index, val ) \
+          CUR.func_move_cvt( EXEC_ARG_ index, val )
+
+#define CURRENT_Ratio() \
+          Current_Ratio( EXEC_ARG )
+
+#define CURRENT_Ppem() \
+          Current_Ppem( EXEC_ARG )
+
+#define CUR_Ppem() \
+          Cur_PPEM( EXEC_ARG )
+
+#define INS_SxVTL( a, b, c, d ) \
+          Ins_SxVTL( EXEC_ARG_ a, b, c, d )
+
+#define COMPUTE_Funcs() \
+          Compute_Funcs( EXEC_ARG )
+
+#define COMPUTE_Round( a ) \
+          Compute_Round( EXEC_ARG_ a )
+
+#define COMPUTE_Point_Displacement( a, b, c, d ) \
+          Compute_Point_Displacement( EXEC_ARG_ a, b, c, d )
+
+#define MOVE_Zp2_Point( a, b, c, t ) \
+          Move_Zp2_Point( EXEC_ARG_ a, b, c, t )
+
+
+#define CUR_Func_project( v1, v2 )  \
+          CUR.func_project( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y )
+
+#define CUR_Func_dualproj( v1, v2 )  \
+          CUR.func_dualproj( EXEC_ARG_ (v1)->x - (v2)->x, (v1)->y - (v2)->y )
+
+#define CUR_fast_project( v ) \
+          CUR.func_project( EXEC_ARG_ (v)->x, (v)->y )
+
+#define CUR_fast_dualproj( v ) \
+          CUR.func_dualproj( EXEC_ARG_ (v)->x, (v)->y )
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Instruction dispatch function, as used by the interpreter.            */
+  /*                                                                       */
+  typedef void  (*TInstruction_Function)( INS_ARG );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Two simple bounds-checking macros.                                    */
+  /*                                                                       */
+#define BOUNDS( x, n )   ( (FT_UInt)(x)  >= (FT_UInt)(n)  )
+#define BOUNDSL( x, n )  ( (FT_ULong)(x) >= (FT_ULong)(n) )
+
+#undef  SUCCESS
+#define SUCCESS  0
+
+#undef  FAILURE
+#define FAILURE  1
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define GUESS_VECTOR( V )                                         \
+  if ( CUR.face->unpatented_hinting )                             \
+  {                                                               \
+    CUR.GS.V.x = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0x4000 : 0 ); \
+    CUR.GS.V.y = (FT_F2Dot14)( CUR.GS.both_x_axis ? 0 : 0x4000 ); \
+  }
+#else
+#define GUESS_VECTOR( V )
+#endif
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                        CODERANGE FUNCTIONS                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Goto_CodeRange                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Switches to a new code range (updates the code related elements in */
+  /*    `exec', and `IP').                                                 */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    range :: The new execution code range.                             */
+  /*                                                                       */
+  /*    IP    :: The new IP in the new code range.                         */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    exec  :: The target execution context.                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Goto_CodeRange( TT_ExecContext  exec,
+                     FT_Int          range,
+                     FT_Long         IP )
+  {
+    TT_CodeRange*  coderange;
+
+
+    FT_ASSERT( range >= 1 && range <= 3 );
+
+    coderange = &exec->codeRangeTable[range - 1];
+
+    FT_ASSERT( coderange->base != NULL );
+
+    /* NOTE: Because the last instruction of a program may be a CALL */
+    /*       which will return to the first byte *after* the code    */
+    /*       range, we test for IP <= Size instead of IP < Size.     */
+    /*                                                               */
+    FT_ASSERT( (FT_ULong)IP <= coderange->size );
+
+    exec->code     = coderange->base;
+    exec->codeSize = coderange->size;
+    exec->IP       = IP;
+    exec->curRange = range;
+
+    return TT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Set_CodeRange                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Sets a code range.                                                 */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    range  :: The code range index.                                    */
+  /*                                                                       */
+  /*    base   :: The new code base.                                       */
+  /*                                                                       */
+  /*    length :: The range size in bytes.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    exec   :: The target execution context.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Set_CodeRange( TT_ExecContext  exec,
+                    FT_Int          range,
+                    void*           base,
+                    FT_Long         length )
+  {
+    FT_ASSERT( range >= 1 && range <= 3 );
+
+    exec->codeRangeTable[range - 1].base = (FT_Byte*)base;
+    exec->codeRangeTable[range - 1].size = length;
+
+    return TT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Clear_CodeRange                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Clears a code range.                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    range :: The code range index.                                     */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    exec  :: The target execution context.                             */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Does not set the Error variable.                                   */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Clear_CodeRange( TT_ExecContext  exec,
+                      FT_Int          range )
+  {
+    FT_ASSERT( range >= 1 && range <= 3 );
+
+    exec->codeRangeTable[range - 1].base = NULL;
+    exec->codeRangeTable[range - 1].size = 0;
+
+    return TT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                   EXECUTION CONTEXT ROUTINES                          */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Done_Context                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Destroys a given context.                                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    exec   :: A handle to the target execution context.                */
+  /*                                                                       */
+  /*    memory :: A handle to the parent memory object.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only the glyph loader and debugger should call this function.      */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Done_Context( TT_ExecContext  exec )
+  {
+    FT_Memory  memory = exec->memory;
+
+
+    /* points zone */
+    exec->maxPoints   = 0;
+    exec->maxContours = 0;
+
+    /* free stack */
+    FT_FREE( exec->stack );
+    exec->stackSize = 0;
+
+    /* free call stack */
+    FT_FREE( exec->callStack );
+    exec->callSize = 0;
+    exec->callTop  = 0;
+
+    /* free glyph code range */
+    FT_FREE( exec->glyphIns );
+    exec->glyphSize = 0;
+
+    exec->size = NULL;
+    exec->face = NULL;
+
+    FT_FREE( exec );
+
+    return TT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Init_Context                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a context object.                                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory :: A handle to the parent memory object.                    */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    exec   :: A handle to the target execution context.                */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  static FT_Error
+  Init_Context( TT_ExecContext  exec,
+                FT_Memory       memory )
+  {
+    FT_Error  error;
+
+
+    FT_TRACE1(( "Init_Context: new object at 0x%08p\n", exec ));
+
+    exec->memory   = memory;
+    exec->callSize = 32;
+
+    if ( FT_NEW_ARRAY( exec->callStack, exec->callSize ) )
+      goto Fail_Memory;
+
+    /* all values in the context are set to 0 already, but this is */
+    /* here as a remainder                                         */
+    exec->maxPoints   = 0;
+    exec->maxContours = 0;
+
+    exec->stackSize = 0;
+    exec->glyphSize = 0;
+
+    exec->stack     = NULL;
+    exec->glyphIns  = NULL;
+
+    exec->face = NULL;
+    exec->size = NULL;
+
+    return TT_Err_Ok;
+
+  Fail_Memory:
+    FT_ERROR(( "Init_Context: not enough memory for %p\n", exec ));
+    TT_Done_Context( exec );
+
+    return error;
+ }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Update_Max                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Checks the size of a buffer and reallocates it if necessary.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory     :: A handle to the parent memory object.                */
+  /*                                                                       */
+  /*    multiplier :: The size in bytes of each element in the buffer.     */
+  /*                                                                       */
+  /*    new_max    :: The new capacity (size) of the buffer.               */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    size       :: The address of the buffer's current size expressed   */
+  /*                  in elements.                                         */
+  /*                                                                       */
+  /*    buff       :: The address of the buffer base pointer.              */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  Update_Max( FT_Memory  memory,
+              FT_ULong*  size,
+              FT_Long    multiplier,
+              void*      _pbuff,
+              FT_ULong   new_max )
+  {
+    FT_Error  error;
+    void**    pbuff = (void**)_pbuff;
+
+
+    if ( *size < new_max )
+    {
+      if ( FT_REALLOC( *pbuff, *size * multiplier, new_max * multiplier ) )
+        return error;
+      *size = new_max;
+    }
+
+    return TT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Load_Context                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Prepare an execution context for glyph hinting.                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the source face object.                        */
+  /*                                                                       */
+  /*    size :: A handle to the source size object.                        */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    exec :: A handle to the target execution context.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only the glyph loader and debugger should call this function.      */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Load_Context( TT_ExecContext  exec,
+                   TT_Face         face,
+                   TT_Size         size )
+  {
+    FT_Int          i;
+    FT_ULong        tmp;
+    TT_MaxProfile*  maxp;
+    FT_Error        error;
+
+
+    exec->face = face;
+    maxp       = &face->max_profile;
+    exec->size = size;
+
+    if ( size )
+    {
+      exec->numFDefs   = size->num_function_defs;
+      exec->maxFDefs   = size->max_function_defs;
+      exec->numIDefs   = size->num_instruction_defs;
+      exec->maxIDefs   = size->max_instruction_defs;
+      exec->FDefs      = size->function_defs;
+      exec->IDefs      = size->instruction_defs;
+      exec->tt_metrics = size->ttmetrics;
+      exec->metrics    = size->metrics;
+
+      exec->maxFunc    = size->max_func;
+      exec->maxIns     = size->max_ins;
+
+      for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )
+        exec->codeRangeTable[i] = size->codeRangeTable[i];
+
+      /* set graphics state */
+      exec->GS = size->GS;
+
+      exec->cvtSize = size->cvt_size;
+      exec->cvt     = size->cvt;
+
+      exec->storeSize = size->storage_size;
+      exec->storage   = size->storage;
+
+      exec->twilight  = size->twilight;
+
+      /* In case of multi-threading it can happen that the old size object */
+      /* no longer exists, thus we must clear all glyph zone references.   */
+      ft_memset( &exec->zp0, 0, sizeof ( exec->zp0 ) );
+      exec->zp1 = exec->zp0;
+      exec->zp2 = exec->zp0;
+    }
+
+    /* XXX: We reserve a little more elements on the stack to deal safely */
+    /*      with broken fonts like arialbs, courbs, timesbs, etc.         */
+    tmp = exec->stackSize;
+    error = Update_Max( exec->memory,
+                        &tmp,
+                        sizeof ( FT_F26Dot6 ),
+                        (void*)&exec->stack,
+                        maxp->maxStackElements + 32 );
+    exec->stackSize = (FT_UInt)tmp;
+    if ( error )
+      return error;
+
+    tmp = exec->glyphSize;
+    error = Update_Max( exec->memory,
+                        &tmp,
+                        sizeof ( FT_Byte ),
+                        (void*)&exec->glyphIns,
+                        maxp->maxSizeOfInstructions );
+    exec->glyphSize = (FT_UShort)tmp;
+    if ( error )
+      return error;
+
+    exec->pts.n_points   = 0;
+    exec->pts.n_contours = 0;
+
+    exec->zp1 = exec->pts;
+    exec->zp2 = exec->pts;
+    exec->zp0 = exec->pts;
+
+    exec->instruction_trap = FALSE;
+
+    return TT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Save_Context                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Saves the code ranges in a `size' object.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    exec :: A handle to the source execution context.                  */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    size :: A handle to the target size object.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only the glyph loader and debugger should call this function.      */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Save_Context( TT_ExecContext  exec,
+                   TT_Size         size )
+  {
+    FT_Int  i;
+
+
+    /* XXX: Will probably disappear soon with all the code range */
+    /*      management, which is now rather obsolete.            */
+    /*                                                           */
+    size->num_function_defs    = exec->numFDefs;
+    size->num_instruction_defs = exec->numIDefs;
+
+    size->max_func = exec->maxFunc;
+    size->max_ins  = exec->maxIns;
+
+    for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )
+      size->codeRangeTable[i] = exec->codeRangeTable[i];
+
+    return TT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Run_Context                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Executes one or more instructions in the execution context.        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    debug :: A Boolean flag.  If set, the function sets some internal  */
+  /*             variables and returns immediately, otherwise TT_RunIns()  */
+  /*             is called.                                                */
+  /*                                                                       */
+  /*             This is commented out currently.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    exec  :: A handle to the target execution context.                 */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    TrueType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only the glyph loader and debugger should call this function.      */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Run_Context( TT_ExecContext  exec,
+                  FT_Bool         debug )
+  {
+    FT_Error  error;
+
+
+    if ( ( error = TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 ) )
+           != TT_Err_Ok )
+      return error;
+
+    exec->zp0 = exec->pts;
+    exec->zp1 = exec->pts;
+    exec->zp2 = exec->pts;
+
+    exec->GS.gep0 = 1;
+    exec->GS.gep1 = 1;
+    exec->GS.gep2 = 1;
+
+    exec->GS.projVector.x = 0x4000;
+    exec->GS.projVector.y = 0x0000;
+
+    exec->GS.freeVector = exec->GS.projVector;
+    exec->GS.dualVector = exec->GS.projVector;
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    exec->GS.both_x_axis = TRUE;
+#endif
+
+    exec->GS.round_state = 1;
+    exec->GS.loop        = 1;
+
+    /* some glyphs leave something on the stack. so we clean it */
+    /* before a new execution.                                  */
+    exec->top     = 0;
+    exec->callTop = 0;
+
+#if 1
+    FT_UNUSED( debug );
+
+    return exec->face->interpreter( exec );
+#else
+    if ( !debug )
+      return TT_RunIns( exec );
+    else
+      return TT_Err_Ok;
+#endif
+  }
+
+
+  /* The default value for `scan_control' is documented as FALSE in the */
+  /* TrueType specification.  This is confusing since it implies a      */
+  /* Boolean value.  However, this is not the case, thus both the       */
+  /* default values of our `scan_type' and `scan_control' fields (which */
+  /* the documentation's `scan_control' variable is split into) are     */
+  /* zero.                                                              */
+
+  const TT_GraphicsState  tt_default_graphics_state =
+  {
+    0, 0, 0,
+    { 0x4000, 0 },
+    { 0x4000, 0 },
+    { 0x4000, 0 },
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    TRUE,
+#endif
+
+    1, 64, 1,
+    TRUE, 68, 0, 0, 9, 3,
+    0, FALSE, 0, 1, 1, 1
+  };
+
+
+  /* documentation is in ttinterp.h */
+
+  FT_EXPORT_DEF( TT_ExecContext )
+  TT_New_Context( TT_Driver  driver )
+  {
+    TT_ExecContext  exec;
+    FT_Memory       memory;
+
+
+    memory = driver->root.root.memory;
+    exec   = driver->context;
+
+    if ( !driver->context )
+    {
+      FT_Error  error;
+
+
+      /* allocate object */
+      if ( FT_NEW( exec ) )
+        goto Fail;
+
+      /* initialize it; in case of error this deallocates `exec' too */
+      error = Init_Context( exec, memory );
+      if ( error )
+        goto Fail;
+
+      /* store it into the driver */
+      driver->context = exec;
+    }
+
+    return driver->context;
+
+  Fail:
+    return NULL;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Before an opcode is executed, the interpreter verifies that there are */
+  /* enough arguments on the stack, with the help of the `Pop_Push_Count'  */
+  /* table.                                                                */
+  /*                                                                       */
+  /* For each opcode, the first column gives the number of arguments that  */
+  /* are popped from the stack; the second one gives the number of those   */
+  /* that are pushed in result.                                            */
+  /*                                                                       */
+  /* Opcodes which have a varying number of parameters in the data stream  */
+  /* (NPUSHB, NPUSHW) are handled specially; they have a negative value in */
+  /* the `opcode_length' table, and the value in `Pop_Push_Count' is set   */
+  /* to zero.                                                              */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#undef  PACK
+#define PACK( x, y )  ( ( x << 4 ) | y )
+
+
+  static
+  const FT_Byte  Pop_Push_Count[256] =
+  {
+    /* opcodes are gathered in groups of 16 */
+    /* please keep the spaces as they are   */
+
+    /*  SVTCA  y  */  PACK( 0, 0 ),
+    /*  SVTCA  x  */  PACK( 0, 0 ),
+    /*  SPvTCA y  */  PACK( 0, 0 ),
+    /*  SPvTCA x  */  PACK( 0, 0 ),
+    /*  SFvTCA y  */  PACK( 0, 0 ),
+    /*  SFvTCA x  */  PACK( 0, 0 ),
+    /*  SPvTL //  */  PACK( 2, 0 ),
+    /*  SPvTL +   */  PACK( 2, 0 ),
+    /*  SFvTL //  */  PACK( 2, 0 ),
+    /*  SFvTL +   */  PACK( 2, 0 ),
+    /*  SPvFS     */  PACK( 2, 0 ),
+    /*  SFvFS     */  PACK( 2, 0 ),
+    /*  GPV       */  PACK( 0, 2 ),
+    /*  GFV       */  PACK( 0, 2 ),
+    /*  SFvTPv    */  PACK( 0, 0 ),
+    /*  ISECT     */  PACK( 5, 0 ),
+
+    /*  SRP0      */  PACK( 1, 0 ),
+    /*  SRP1      */  PACK( 1, 0 ),
+    /*  SRP2      */  PACK( 1, 0 ),
+    /*  SZP0      */  PACK( 1, 0 ),
+    /*  SZP1      */  PACK( 1, 0 ),
+    /*  SZP2      */  PACK( 1, 0 ),
+    /*  SZPS      */  PACK( 1, 0 ),
+    /*  SLOOP     */  PACK( 1, 0 ),
+    /*  RTG       */  PACK( 0, 0 ),
+    /*  RTHG      */  PACK( 0, 0 ),
+    /*  SMD       */  PACK( 1, 0 ),
+    /*  ELSE      */  PACK( 0, 0 ),
+    /*  JMPR      */  PACK( 1, 0 ),
+    /*  SCvTCi    */  PACK( 1, 0 ),
+    /*  SSwCi     */  PACK( 1, 0 ),
+    /*  SSW       */  PACK( 1, 0 ),
+
+    /*  DUP       */  PACK( 1, 2 ),
+    /*  POP       */  PACK( 1, 0 ),
+    /*  CLEAR     */  PACK( 0, 0 ),
+    /*  SWAP      */  PACK( 2, 2 ),
+    /*  DEPTH     */  PACK( 0, 1 ),
+    /*  CINDEX    */  PACK( 1, 1 ),
+    /*  MINDEX    */  PACK( 1, 0 ),
+    /*  AlignPTS  */  PACK( 2, 0 ),
+    /*  INS_$28   */  PACK( 0, 0 ),
+    /*  UTP       */  PACK( 1, 0 ),
+    /*  LOOPCALL  */  PACK( 2, 0 ),
+    /*  CALL      */  PACK( 1, 0 ),
+    /*  FDEF      */  PACK( 1, 0 ),
+    /*  ENDF      */  PACK( 0, 0 ),
+    /*  MDAP[0]   */  PACK( 1, 0 ),
+    /*  MDAP[1]   */  PACK( 1, 0 ),
+
+    /*  IUP[0]    */  PACK( 0, 0 ),
+    /*  IUP[1]    */  PACK( 0, 0 ),
+    /*  SHP[0]    */  PACK( 0, 0 ),
+    /*  SHP[1]    */  PACK( 0, 0 ),
+    /*  SHC[0]    */  PACK( 1, 0 ),
+    /*  SHC[1]    */  PACK( 1, 0 ),
+    /*  SHZ[0]    */  PACK( 1, 0 ),
+    /*  SHZ[1]    */  PACK( 1, 0 ),
+    /*  SHPIX     */  PACK( 1, 0 ),
+    /*  IP        */  PACK( 0, 0 ),
+    /*  MSIRP[0]  */  PACK( 2, 0 ),
+    /*  MSIRP[1]  */  PACK( 2, 0 ),
+    /*  AlignRP   */  PACK( 0, 0 ),
+    /*  RTDG      */  PACK( 0, 0 ),
+    /*  MIAP[0]   */  PACK( 2, 0 ),
+    /*  MIAP[1]   */  PACK( 2, 0 ),
+
+    /*  NPushB    */  PACK( 0, 0 ),
+    /*  NPushW    */  PACK( 0, 0 ),
+    /*  WS        */  PACK( 2, 0 ),
+    /*  RS        */  PACK( 1, 1 ),
+    /*  WCvtP     */  PACK( 2, 0 ),
+    /*  RCvt      */  PACK( 1, 1 ),
+    /*  GC[0]     */  PACK( 1, 1 ),
+    /*  GC[1]     */  PACK( 1, 1 ),
+    /*  SCFS      */  PACK( 2, 0 ),
+    /*  MD[0]     */  PACK( 2, 1 ),
+    /*  MD[1]     */  PACK( 2, 1 ),
+    /*  MPPEM     */  PACK( 0, 1 ),
+    /*  MPS       */  PACK( 0, 1 ),
+    /*  FlipON    */  PACK( 0, 0 ),
+    /*  FlipOFF   */  PACK( 0, 0 ),
+    /*  DEBUG     */  PACK( 1, 0 ),
+
+    /*  LT        */  PACK( 2, 1 ),
+    /*  LTEQ      */  PACK( 2, 1 ),
+    /*  GT        */  PACK( 2, 1 ),
+    /*  GTEQ      */  PACK( 2, 1 ),
+    /*  EQ        */  PACK( 2, 1 ),
+    /*  NEQ       */  PACK( 2, 1 ),
+    /*  ODD       */  PACK( 1, 1 ),
+    /*  EVEN      */  PACK( 1, 1 ),
+    /*  IF        */  PACK( 1, 0 ),
+    /*  EIF       */  PACK( 0, 0 ),
+    /*  AND       */  PACK( 2, 1 ),
+    /*  OR        */  PACK( 2, 1 ),
+    /*  NOT       */  PACK( 1, 1 ),
+    /*  DeltaP1   */  PACK( 1, 0 ),
+    /*  SDB       */  PACK( 1, 0 ),
+    /*  SDS       */  PACK( 1, 0 ),
+
+    /*  ADD       */  PACK( 2, 1 ),
+    /*  SUB       */  PACK( 2, 1 ),
+    /*  DIV       */  PACK( 2, 1 ),
+    /*  MUL       */  PACK( 2, 1 ),
+    /*  ABS       */  PACK( 1, 1 ),
+    /*  NEG       */  PACK( 1, 1 ),
+    /*  FLOOR     */  PACK( 1, 1 ),
+    /*  CEILING   */  PACK( 1, 1 ),
+    /*  ROUND[0]  */  PACK( 1, 1 ),
+    /*  ROUND[1]  */  PACK( 1, 1 ),
+    /*  ROUND[2]  */  PACK( 1, 1 ),
+    /*  ROUND[3]  */  PACK( 1, 1 ),
+    /*  NROUND[0] */  PACK( 1, 1 ),
+    /*  NROUND[1] */  PACK( 1, 1 ),
+    /*  NROUND[2] */  PACK( 1, 1 ),
+    /*  NROUND[3] */  PACK( 1, 1 ),
+
+    /*  WCvtF     */  PACK( 2, 0 ),
+    /*  DeltaP2   */  PACK( 1, 0 ),
+    /*  DeltaP3   */  PACK( 1, 0 ),
+    /*  DeltaCn[0] */ PACK( 1, 0 ),
+    /*  DeltaCn[1] */ PACK( 1, 0 ),
+    /*  DeltaCn[2] */ PACK( 1, 0 ),
+    /*  SROUND    */  PACK( 1, 0 ),
+    /*  S45Round  */  PACK( 1, 0 ),
+    /*  JROT      */  PACK( 2, 0 ),
+    /*  JROF      */  PACK( 2, 0 ),
+    /*  ROFF      */  PACK( 0, 0 ),
+    /*  INS_$7B   */  PACK( 0, 0 ),
+    /*  RUTG      */  PACK( 0, 0 ),
+    /*  RDTG      */  PACK( 0, 0 ),
+    /*  SANGW     */  PACK( 1, 0 ),
+    /*  AA        */  PACK( 1, 0 ),
+
+    /*  FlipPT    */  PACK( 0, 0 ),
+    /*  FlipRgON  */  PACK( 2, 0 ),
+    /*  FlipRgOFF */  PACK( 2, 0 ),
+    /*  INS_$83   */  PACK( 0, 0 ),
+    /*  INS_$84   */  PACK( 0, 0 ),
+    /*  ScanCTRL  */  PACK( 1, 0 ),
+    /*  SDPVTL[0] */  PACK( 2, 0 ),
+    /*  SDPVTL[1] */  PACK( 2, 0 ),
+    /*  GetINFO   */  PACK( 1, 1 ),
+    /*  IDEF      */  PACK( 1, 0 ),
+    /*  ROLL      */  PACK( 3, 3 ),
+    /*  MAX       */  PACK( 2, 1 ),
+    /*  MIN       */  PACK( 2, 1 ),
+    /*  ScanTYPE  */  PACK( 1, 0 ),
+    /*  InstCTRL  */  PACK( 2, 0 ),
+    /*  INS_$8F   */  PACK( 0, 0 ),
+
+    /*  INS_$90  */   PACK( 0, 0 ),
+    /*  INS_$91  */   PACK( 0, 0 ),
+    /*  INS_$92  */   PACK( 0, 0 ),
+    /*  INS_$93  */   PACK( 0, 0 ),
+    /*  INS_$94  */   PACK( 0, 0 ),
+    /*  INS_$95  */   PACK( 0, 0 ),
+    /*  INS_$96  */   PACK( 0, 0 ),
+    /*  INS_$97  */   PACK( 0, 0 ),
+    /*  INS_$98  */   PACK( 0, 0 ),
+    /*  INS_$99  */   PACK( 0, 0 ),
+    /*  INS_$9A  */   PACK( 0, 0 ),
+    /*  INS_$9B  */   PACK( 0, 0 ),
+    /*  INS_$9C  */   PACK( 0, 0 ),
+    /*  INS_$9D  */   PACK( 0, 0 ),
+    /*  INS_$9E  */   PACK( 0, 0 ),
+    /*  INS_$9F  */   PACK( 0, 0 ),
+
+    /*  INS_$A0  */   PACK( 0, 0 ),
+    /*  INS_$A1  */   PACK( 0, 0 ),
+    /*  INS_$A2  */   PACK( 0, 0 ),
+    /*  INS_$A3  */   PACK( 0, 0 ),
+    /*  INS_$A4  */   PACK( 0, 0 ),
+    /*  INS_$A5  */   PACK( 0, 0 ),
+    /*  INS_$A6  */   PACK( 0, 0 ),
+    /*  INS_$A7  */   PACK( 0, 0 ),
+    /*  INS_$A8  */   PACK( 0, 0 ),
+    /*  INS_$A9  */   PACK( 0, 0 ),
+    /*  INS_$AA  */   PACK( 0, 0 ),
+    /*  INS_$AB  */   PACK( 0, 0 ),
+    /*  INS_$AC  */   PACK( 0, 0 ),
+    /*  INS_$AD  */   PACK( 0, 0 ),
+    /*  INS_$AE  */   PACK( 0, 0 ),
+    /*  INS_$AF  */   PACK( 0, 0 ),
+
+    /*  PushB[0]  */  PACK( 0, 1 ),
+    /*  PushB[1]  */  PACK( 0, 2 ),
+    /*  PushB[2]  */  PACK( 0, 3 ),
+    /*  PushB[3]  */  PACK( 0, 4 ),
+    /*  PushB[4]  */  PACK( 0, 5 ),
+    /*  PushB[5]  */  PACK( 0, 6 ),
+    /*  PushB[6]  */  PACK( 0, 7 ),
+    /*  PushB[7]  */  PACK( 0, 8 ),
+    /*  PushW[0]  */  PACK( 0, 1 ),
+    /*  PushW[1]  */  PACK( 0, 2 ),
+    /*  PushW[2]  */  PACK( 0, 3 ),
+    /*  PushW[3]  */  PACK( 0, 4 ),
+    /*  PushW[4]  */  PACK( 0, 5 ),
+    /*  PushW[5]  */  PACK( 0, 6 ),
+    /*  PushW[6]  */  PACK( 0, 7 ),
+    /*  PushW[7]  */  PACK( 0, 8 ),
+
+    /*  MDRP[00]  */  PACK( 1, 0 ),
+    /*  MDRP[01]  */  PACK( 1, 0 ),
+    /*  MDRP[02]  */  PACK( 1, 0 ),
+    /*  MDRP[03]  */  PACK( 1, 0 ),
+    /*  MDRP[04]  */  PACK( 1, 0 ),
+    /*  MDRP[05]  */  PACK( 1, 0 ),
+    /*  MDRP[06]  */  PACK( 1, 0 ),
+    /*  MDRP[07]  */  PACK( 1, 0 ),
+    /*  MDRP[08]  */  PACK( 1, 0 ),
+    /*  MDRP[09]  */  PACK( 1, 0 ),
+    /*  MDRP[10]  */  PACK( 1, 0 ),
+    /*  MDRP[11]  */  PACK( 1, 0 ),
+    /*  MDRP[12]  */  PACK( 1, 0 ),
+    /*  MDRP[13]  */  PACK( 1, 0 ),
+    /*  MDRP[14]  */  PACK( 1, 0 ),
+    /*  MDRP[15]  */  PACK( 1, 0 ),
+
+    /*  MDRP[16]  */  PACK( 1, 0 ),
+    /*  MDRP[17]  */  PACK( 1, 0 ),
+    /*  MDRP[18]  */  PACK( 1, 0 ),
+    /*  MDRP[19]  */  PACK( 1, 0 ),
+    /*  MDRP[20]  */  PACK( 1, 0 ),
+    /*  MDRP[21]  */  PACK( 1, 0 ),
+    /*  MDRP[22]  */  PACK( 1, 0 ),
+    /*  MDRP[23]  */  PACK( 1, 0 ),
+    /*  MDRP[24]  */  PACK( 1, 0 ),
+    /*  MDRP[25]  */  PACK( 1, 0 ),
+    /*  MDRP[26]  */  PACK( 1, 0 ),
+    /*  MDRP[27]  */  PACK( 1, 0 ),
+    /*  MDRP[28]  */  PACK( 1, 0 ),
+    /*  MDRP[29]  */  PACK( 1, 0 ),
+    /*  MDRP[30]  */  PACK( 1, 0 ),
+    /*  MDRP[31]  */  PACK( 1, 0 ),
+
+    /*  MIRP[00]  */  PACK( 2, 0 ),
+    /*  MIRP[01]  */  PACK( 2, 0 ),
+    /*  MIRP[02]  */  PACK( 2, 0 ),
+    /*  MIRP[03]  */  PACK( 2, 0 ),
+    /*  MIRP[04]  */  PACK( 2, 0 ),
+    /*  MIRP[05]  */  PACK( 2, 0 ),
+    /*  MIRP[06]  */  PACK( 2, 0 ),
+    /*  MIRP[07]  */  PACK( 2, 0 ),
+    /*  MIRP[08]  */  PACK( 2, 0 ),
+    /*  MIRP[09]  */  PACK( 2, 0 ),
+    /*  MIRP[10]  */  PACK( 2, 0 ),
+    /*  MIRP[11]  */  PACK( 2, 0 ),
+    /*  MIRP[12]  */  PACK( 2, 0 ),
+    /*  MIRP[13]  */  PACK( 2, 0 ),
+    /*  MIRP[14]  */  PACK( 2, 0 ),
+    /*  MIRP[15]  */  PACK( 2, 0 ),
+
+    /*  MIRP[16]  */  PACK( 2, 0 ),
+    /*  MIRP[17]  */  PACK( 2, 0 ),
+    /*  MIRP[18]  */  PACK( 2, 0 ),
+    /*  MIRP[19]  */  PACK( 2, 0 ),
+    /*  MIRP[20]  */  PACK( 2, 0 ),
+    /*  MIRP[21]  */  PACK( 2, 0 ),
+    /*  MIRP[22]  */  PACK( 2, 0 ),
+    /*  MIRP[23]  */  PACK( 2, 0 ),
+    /*  MIRP[24]  */  PACK( 2, 0 ),
+    /*  MIRP[25]  */  PACK( 2, 0 ),
+    /*  MIRP[26]  */  PACK( 2, 0 ),
+    /*  MIRP[27]  */  PACK( 2, 0 ),
+    /*  MIRP[28]  */  PACK( 2, 0 ),
+    /*  MIRP[29]  */  PACK( 2, 0 ),
+    /*  MIRP[30]  */  PACK( 2, 0 ),
+    /*  MIRP[31]  */  PACK( 2, 0 )
+  };
+
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+  static
+  const char*  const opcode_name[256] =
+  {
+    "SVTCA y",
+    "SVTCA x",
+    "SPvTCA y",
+    "SPvTCA x",
+    "SFvTCA y",
+    "SFvTCA x",
+    "SPvTL ||",
+    "SPvTL +",
+    "SFvTL ||",
+    "SFvTL +",
+    "SPvFS",
+    "SFvFS",
+    "GPV",
+    "GFV",
+    "SFvTPv",
+    "ISECT",
+
+    "SRP0",
+    "SRP1",
+    "SRP2",
+    "SZP0",
+    "SZP1",
+    "SZP2",
+    "SZPS",
+    "SLOOP",
+    "RTG",
+    "RTHG",
+    "SMD",
+    "ELSE",
+    "JMPR",
+    "SCvTCi",
+    "SSwCi",
+    "SSW",
+
+    "DUP",
+    "POP",
+    "CLEAR",
+    "SWAP",
+    "DEPTH",
+    "CINDEX",
+    "MINDEX",
+    "AlignPTS",
+    "INS_$28",
+    "UTP",
+    "LOOPCALL",
+    "CALL",
+    "FDEF",
+    "ENDF",
+    "MDAP[0]",
+    "MDAP[1]",
+
+    "IUP[0]",
+    "IUP[1]",
+    "SHP[0]",
+    "SHP[1]",
+    "SHC[0]",
+    "SHC[1]",
+    "SHZ[0]",
+    "SHZ[1]",
+    "SHPIX",
+    "IP",
+    "MSIRP[0]",
+    "MSIRP[1]",
+    "AlignRP",
+    "RTDG",
+    "MIAP[0]",
+    "MIAP[1]",
+
+    "NPushB",
+    "NPushW",
+    "WS",
+    "RS",
+    "WCvtP",
+    "RCvt",
+    "GC[0]",
+    "GC[1]",
+    "SCFS",
+    "MD[0]",
+    "MD[1]",
+    "MPPEM",
+    "MPS",
+    "FlipON",
+    "FlipOFF",
+    "DEBUG",
+
+    "LT",
+    "LTEQ",
+    "GT",
+    "GTEQ",
+    "EQ",
+    "NEQ",
+    "ODD",
+    "EVEN",
+    "IF",
+    "EIF",
+    "AND",
+    "OR",
+    "NOT",
+    "DeltaP1",
+    "SDB",
+    "SDS",
+
+    "ADD",
+    "SUB",
+    "DIV",
+    "MUL",
+    "ABS",
+    "NEG",
+    "FLOOR",
+    "CEILING",
+    "ROUND[0]",
+    "ROUND[1]",
+    "ROUND[2]",
+    "ROUND[3]",
+    "NROUND[0]",
+    "NROUND[1]",
+    "NROUND[2]",
+    "NROUND[3]",
+
+    "WCvtF",
+    "DeltaP2",
+    "DeltaP3",
+    "DeltaCn[0]",
+    "DeltaCn[1]",
+    "DeltaCn[2]",
+    "SROUND",
+    "S45Round",
+    "JROT",
+    "JROF",
+    "ROFF",
+    "INS_$7B",
+    "RUTG",
+    "RDTG",
+    "SANGW",
+    "AA",
+
+    "FlipPT",
+    "FlipRgON",
+    "FlipRgOFF",
+    "INS_$83",
+    "INS_$84",
+    "ScanCTRL",
+    "SDVPTL[0]",
+    "SDVPTL[1]",
+    "GetINFO",
+    "IDEF",
+    "ROLL",
+    "MAX",
+    "MIN",
+    "ScanTYPE",
+    "InstCTRL",
+    "INS_$8F",
+
+    "INS_$90",
+    "INS_$91",
+    "INS_$92",
+    "INS_$93",
+    "INS_$94",
+    "INS_$95",
+    "INS_$96",
+    "INS_$97",
+    "INS_$98",
+    "INS_$99",
+    "INS_$9A",
+    "INS_$9B",
+    "INS_$9C",
+    "INS_$9D",
+    "INS_$9E",
+    "INS_$9F",
+
+    "INS_$A0",
+    "INS_$A1",
+    "INS_$A2",
+    "INS_$A3",
+    "INS_$A4",
+    "INS_$A5",
+    "INS_$A6",
+    "INS_$A7",
+    "INS_$A8",
+    "INS_$A9",
+    "INS_$AA",
+    "INS_$AB",
+    "INS_$AC",
+    "INS_$AD",
+    "INS_$AE",
+    "INS_$AF",
+
+    "PushB[0]",
+    "PushB[1]",
+    "PushB[2]",
+    "PushB[3]",
+    "PushB[4]",
+    "PushB[5]",
+    "PushB[6]",
+    "PushB[7]",
+    "PushW[0]",
+    "PushW[1]",
+    "PushW[2]",
+    "PushW[3]",
+    "PushW[4]",
+    "PushW[5]",
+    "PushW[6]",
+    "PushW[7]",
+
+    "MDRP[00]",
+    "MDRP[01]",
+    "MDRP[02]",
+    "MDRP[03]",
+    "MDRP[04]",
+    "MDRP[05]",
+    "MDRP[06]",
+    "MDRP[07]",
+    "MDRP[08]",
+    "MDRP[09]",
+    "MDRP[10]",
+    "MDRP[11]",
+    "MDRP[12]",
+    "MDRP[13]",
+    "MDRP[14]",
+    "MDRP[15]",
+
+    "MDRP[16]",
+    "MDRP[17]",
+    "MDRP[18]",
+    "MDRP[19]",
+    "MDRP[20]",
+    "MDRP[21]",
+    "MDRP[22]",
+    "MDRP[23]",
+    "MDRP[24]",
+    "MDRP[25]",
+    "MDRP[26]",
+    "MDRP[27]",
+    "MDRP[28]",
+    "MDRP[29]",
+    "MDRP[30]",
+    "MDRP[31]",
+
+    "MIRP[00]",
+    "MIRP[01]",
+    "MIRP[02]",
+    "MIRP[03]",
+    "MIRP[04]",
+    "MIRP[05]",
+    "MIRP[06]",
+    "MIRP[07]",
+    "MIRP[08]",
+    "MIRP[09]",
+    "MIRP[10]",
+    "MIRP[11]",
+    "MIRP[12]",
+    "MIRP[13]",
+    "MIRP[14]",
+    "MIRP[15]",
+
+    "MIRP[16]",
+    "MIRP[17]",
+    "MIRP[18]",
+    "MIRP[19]",
+    "MIRP[20]",
+    "MIRP[21]",
+    "MIRP[22]",
+    "MIRP[23]",
+    "MIRP[24]",
+    "MIRP[25]",
+    "MIRP[26]",
+    "MIRP[27]",
+    "MIRP[28]",
+    "MIRP[29]",
+    "MIRP[30]",
+    "MIRP[31]"
+  };
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+
+  static
+  const FT_Char  opcode_length[256] =
+  {
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+
+   -1,-2, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    2, 3, 4, 5,  6, 7, 8, 9,  3, 5, 7, 9, 11,13,15,17,
+
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
+    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1
+  };
+
+#undef PACK
+
+#if 1
+
+  static FT_Int32
+  TT_MulFix14( FT_Int32  a,
+               FT_Int    b )
+  {
+    FT_Int32   sign;
+    FT_UInt32  ah, al, mid, lo, hi;
+
+
+    sign = a ^ b;
+
+    if ( a < 0 )
+      a = -a;
+    if ( b < 0 )
+      b = -b;
+
+    ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU );
+    al = (FT_UInt32)( a & 0xFFFFU );
+
+    lo    = al * b;
+    mid   = ah * b;
+    hi    = mid >> 16;
+    mid   = ( mid << 16 ) + ( 1 << 13 ); /* rounding */
+    lo   += mid;
+    if ( lo < mid )
+      hi += 1;
+
+    mid = ( lo >> 14 ) | ( hi << 18 );
+
+    return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid;
+  }
+
+#else
+
+  /* compute (a*b)/2^14 with maximal accuracy and rounding */
+  static FT_Int32
+  TT_MulFix14( FT_Int32  a,
+               FT_Int    b )
+  {
+    FT_Int32   m, s, hi;
+    FT_UInt32  l, lo;
+
+
+    /* compute ax*bx as 64-bit value */
+    l  = (FT_UInt32)( ( a & 0xFFFFU ) * b );
+    m  = ( a >> 16 ) * b;
+
+    lo = l + (FT_UInt32)( m << 16 );
+    hi = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo < l );
+
+    /* divide the result by 2^14 with rounding */
+    s   = hi >> 31;
+    l   = lo + (FT_UInt32)s;
+    hi += s + ( l < lo );
+    lo  = l;
+
+    l   = lo + 0x2000U;
+    hi += l < lo;
+
+    return ( hi << 18 ) | ( l >> 14 );
+  }
+#endif
+
+
+  /* compute (ax*bx+ay*by)/2^14 with maximal accuracy and rounding */
+  static FT_Int32
+  TT_DotFix14( FT_Int32  ax,
+               FT_Int32  ay,
+               FT_Int    bx,
+               FT_Int    by )
+  {
+    FT_Int32   m, s, hi1, hi2, hi;
+    FT_UInt32  l, lo1, lo2, lo;
+
+
+    /* compute ax*bx as 64-bit value */
+    l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx );
+    m = ( ax >> 16 ) * bx;
+
+    lo1 = l + (FT_UInt32)( m << 16 );
+    hi1 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo1 < l );
+
+    /* compute ay*by as 64-bit value */
+    l = (FT_UInt32)( ( ay & 0xFFFFU ) * by );
+    m = ( ay >> 16 ) * by;
+
+    lo2 = l + (FT_UInt32)( m << 16 );
+    hi2 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo2 < l );
+
+    /* add them */
+    lo = lo1 + lo2;
+    hi = hi1 + hi2 + ( lo < lo1 );
+
+    /* divide the result by 2^14 with rounding */
+    s   = hi >> 31;
+    l   = lo + (FT_UInt32)s;
+    hi += s + ( l < lo );
+    lo  = l;
+
+    l   = lo + 0x2000U;
+    hi += ( l < lo );
+
+    return ( hi << 18 ) | ( l >> 14 );
+  }
+
+
+  /* return length of given vector */
+
+#if 0
+
+  static FT_Int32
+  TT_VecLen( FT_Int32  x,
+             FT_Int32  y )
+  {
+    FT_Int32   m, hi1, hi2, hi;
+    FT_UInt32  l, lo1, lo2, lo;
+
+
+    /* compute x*x as 64-bit value */
+    lo = (FT_UInt32)( x & 0xFFFFU );
+    hi = x >> 16;
+
+    l  = lo * lo;
+    m  = hi * lo;
+    hi = hi * hi;
+
+    lo1 = l + (FT_UInt32)( m << 17 );
+    hi1 = hi + ( m >> 15 ) + ( lo1 < l );
+
+    /* compute y*y as 64-bit value */
+    lo = (FT_UInt32)( y & 0xFFFFU );
+    hi = y >> 16;
+
+    l  = lo * lo;
+    m  = hi * lo;
+    hi = hi * hi;
+
+    lo2 = l + (FT_UInt32)( m << 17 );
+    hi2 = hi + ( m >> 15 ) + ( lo2 < l );
+
+    /* add them to get 'x*x+y*y' as 64-bit value */
+    lo = lo1 + lo2;
+    hi = hi1 + hi2 + ( lo < lo1 );
+
+    /* compute the square root of this value */
+    {
+      FT_UInt32  root, rem, test_div;
+      FT_Int     count;
+
+
+      root = 0;
+
+      {
+        rem   = 0;
+        count = 32;
+        do
+        {
+          rem      = ( rem << 2 ) | ( (FT_UInt32)hi >> 30 );
+          hi       = (  hi << 2 ) | (            lo >> 30 );
+          lo     <<= 2;
+          root   <<= 1;
+          test_div = ( root << 1 ) + 1;
+
+          if ( rem >= test_div )
+          {
+            rem  -= test_div;
+            root += 1;
+          }
+        } while ( --count );
+      }
+
+      return (FT_Int32)root;
+    }
+  }
+
+#else
+
+  /* this version uses FT_Vector_Length which computes the same value */
+  /* much, much faster..                                              */
+  /*                                                                  */
+  static FT_F26Dot6
+  TT_VecLen( FT_F26Dot6  X,
+             FT_F26Dot6  Y )
+  {
+    FT_Vector  v;
+
+
+    v.x = X;
+    v.y = Y;
+
+    return FT_Vector_Length( &v );
+  }
+
+#endif
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Current_Ratio                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Returns the current aspect ratio scaling factor depending on the   */
+  /*    projection vector's state and device resolutions.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The aspect ratio in 16.16 format, always <= 1.0 .                  */
+  /*                                                                       */
+  static FT_Long
+  Current_Ratio( EXEC_OP )
+  {
+    if ( !CUR.tt_metrics.ratio )
+    {
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+      if ( CUR.face->unpatented_hinting )
+      {
+        if ( CUR.GS.both_x_axis )
+          CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio;
+        else
+          CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio;
+      }
+      else
+#endif
+      {
+        if ( CUR.GS.projVector.y == 0 )
+          CUR.tt_metrics.ratio = CUR.tt_metrics.x_ratio;
+
+        else if ( CUR.GS.projVector.x == 0 )
+          CUR.tt_metrics.ratio = CUR.tt_metrics.y_ratio;
+
+        else
+        {
+          FT_Long  x, y;
+
+
+          x = TT_MULDIV( CUR.GS.projVector.x,
+                         CUR.tt_metrics.x_ratio, 0x4000 );
+          y = TT_MULDIV( CUR.GS.projVector.y,
+                         CUR.tt_metrics.y_ratio, 0x4000 );
+          CUR.tt_metrics.ratio = TT_VecLen( x, y );
+        }
+      }
+    }
+    return CUR.tt_metrics.ratio;
+  }
+
+
+  static FT_Long
+  Current_Ppem( EXEC_OP )
+  {
+    return TT_MULFIX( CUR.tt_metrics.ppem, CURRENT_Ratio() );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Functions related to the control value table (CVT).                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  FT_CALLBACK_DEF( FT_F26Dot6 )
+  Read_CVT( EXEC_OP_ FT_ULong  idx )
+  {
+    return CUR.cvt[idx];
+  }
+
+
+  FT_CALLBACK_DEF( FT_F26Dot6 )
+  Read_CVT_Stretched( EXEC_OP_ FT_ULong  idx )
+  {
+    return TT_MULFIX( CUR.cvt[idx], CURRENT_Ratio() );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  Write_CVT( EXEC_OP_ FT_ULong    idx,
+                      FT_F26Dot6  value )
+  {
+    CUR.cvt[idx] = value;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  Write_CVT_Stretched( EXEC_OP_ FT_ULong    idx,
+                                FT_F26Dot6  value )
+  {
+    CUR.cvt[idx] = FT_DivFix( value, CURRENT_Ratio() );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  Move_CVT( EXEC_OP_ FT_ULong    idx,
+                     FT_F26Dot6  value )
+  {
+    CUR.cvt[idx] += value;
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  Move_CVT_Stretched( EXEC_OP_ FT_ULong    idx,
+                               FT_F26Dot6  value )
+  {
+    CUR.cvt[idx] += FT_DivFix( value, CURRENT_Ratio() );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    GetShortIns                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Returns a short integer taken from the instruction stream at       */
+  /*    address IP.                                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Short read at code[IP].                                            */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This one could become a macro.                                     */
+  /*                                                                       */
+  static FT_Short
+  GetShortIns( EXEC_OP )
+  {
+    /* Reading a byte stream so there is no endianess (DaveP) */
+    CUR.IP += 2;
+    return (FT_Short)( ( CUR.code[CUR.IP - 2] << 8 ) +
+                         CUR.code[CUR.IP - 1]      );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Ins_Goto_CodeRange                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Goes to a certain code range in the instruction stream.            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    aRange :: The index of the code range.                             */
+  /*                                                                       */
+  /*    aIP    :: The new IP address in the code range.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    SUCCESS or FAILURE.                                                */
+  /*                                                                       */
+  static FT_Bool
+  Ins_Goto_CodeRange( EXEC_OP_ FT_Int    aRange,
+                               FT_ULong  aIP )
+  {
+    TT_CodeRange*  range;
+
+
+    if ( aRange < 1 || aRange > 3 )
+    {
+      CUR.error = TT_Err_Bad_Argument;
+      return FAILURE;
+    }
+
+    range = &CUR.codeRangeTable[aRange - 1];
+
+    if ( range->base == NULL )     /* invalid coderange */
+    {
+      CUR.error = TT_Err_Invalid_CodeRange;
+      return FAILURE;
+    }
+
+    /* NOTE: Because the last instruction of a program may be a CALL */
+    /*       which will return to the first byte *after* the code    */
+    /*       range, we test for aIP <= Size, instead of aIP < Size.  */
+
+    if ( aIP > range->size )
+    {
+      CUR.error = TT_Err_Code_Overflow;
+      return FAILURE;
+    }
+
+    CUR.code     = range->base;
+    CUR.codeSize = range->size;
+    CUR.IP       = aIP;
+    CUR.curRange = aRange;
+
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Direct_Move                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Moves a point by a given distance along the freedom vector.  The   */
+  /*    point will be `touched'.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    point    :: The index of the point to move.                        */
+  /*                                                                       */
+  /*    distance :: The distance to apply.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    zone     :: The affected glyph zone.                               */
+  /*                                                                       */
+  static void
+  Direct_Move( EXEC_OP_ TT_GlyphZone  zone,
+                        FT_UShort     point,
+                        FT_F26Dot6    distance )
+  {
+    FT_F26Dot6  v;
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    FT_ASSERT( !CUR.face->unpatented_hinting );
+#endif
+
+    v = CUR.GS.freeVector.x;
+
+    if ( v != 0 )
+    {
+      zone->cur[point].x += TT_MULDIV( distance,
+                                       v * 0x10000L,
+                                       CUR.F_dot_P );
+
+      zone->tags[point] |= FT_CURVE_TAG_TOUCH_X;
+    }
+
+    v = CUR.GS.freeVector.y;
+
+    if ( v != 0 )
+    {
+      zone->cur[point].y += TT_MULDIV( distance,
+                                       v * 0x10000L,
+                                       CUR.F_dot_P );
+
+      zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Direct_Move_Orig                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Moves the *original* position of a point by a given distance along */
+  /*    the freedom vector.  Obviously, the point will not be `touched'.   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    point    :: The index of the point to move.                        */
+  /*                                                                       */
+  /*    distance :: The distance to apply.                                 */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    zone     :: The affected glyph zone.                               */
+  /*                                                                       */
+  static void
+  Direct_Move_Orig( EXEC_OP_ TT_GlyphZone  zone,
+                             FT_UShort     point,
+                             FT_F26Dot6    distance )
+  {
+    FT_F26Dot6  v;
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    FT_ASSERT( !CUR.face->unpatented_hinting );
+#endif
+
+    v = CUR.GS.freeVector.x;
+
+    if ( v != 0 )
+      zone->org[point].x += TT_MULDIV( distance,
+                                       v * 0x10000L,
+                                       CUR.F_dot_P );
+
+    v = CUR.GS.freeVector.y;
+
+    if ( v != 0 )
+      zone->org[point].y += TT_MULDIV( distance,
+                                       v * 0x10000L,
+                                       CUR.F_dot_P );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Special versions of Direct_Move()                                     */
+  /*                                                                       */
+  /*   The following versions are used whenever both vectors are both      */
+  /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static void
+  Direct_Move_X( EXEC_OP_ TT_GlyphZone  zone,
+                          FT_UShort     point,
+                          FT_F26Dot6    distance )
+  {
+    FT_UNUSED_EXEC;
+
+    zone->cur[point].x += distance;
+    zone->tags[point]  |= FT_CURVE_TAG_TOUCH_X;
+  }
+
+
+  static void
+  Direct_Move_Y( EXEC_OP_ TT_GlyphZone  zone,
+                          FT_UShort     point,
+                          FT_F26Dot6    distance )
+  {
+    FT_UNUSED_EXEC;
+
+    zone->cur[point].y += distance;
+    zone->tags[point]  |= FT_CURVE_TAG_TOUCH_Y;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Special versions of Direct_Move_Orig()                                */
+  /*                                                                       */
+  /*   The following versions are used whenever both vectors are both      */
+  /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static void
+  Direct_Move_Orig_X( EXEC_OP_ TT_GlyphZone  zone,
+                               FT_UShort     point,
+                               FT_F26Dot6    distance )
+  {
+    FT_UNUSED_EXEC;
+
+    zone->org[point].x += distance;
+  }
+
+
+  static void
+  Direct_Move_Orig_Y( EXEC_OP_ TT_GlyphZone  zone,
+                               FT_UShort     point,
+                               FT_F26Dot6    distance )
+  {
+    FT_UNUSED_EXEC;
+
+    zone->org[point].y += distance;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Round_None                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Does not round, but adds engine compensation.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    distance     :: The distance (not) to round.                       */
+  /*                                                                       */
+  /*    compensation :: The engine compensation.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The compensated distance.                                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The TrueType specification says very few about the relationship    */
+  /*    between rounding and engine compensation.  However, it seems from  */
+  /*    the description of super round that we should add the compensation */
+  /*    before rounding.                                                   */
+  /*                                                                       */
+  static FT_F26Dot6
+  Round_None( EXEC_OP_ FT_F26Dot6  distance,
+                       FT_F26Dot6  compensation )
+  {
+    FT_F26Dot6  val;
+
+    FT_UNUSED_EXEC;
+
+
+    if ( distance >= 0 )
+    {
+      val = distance + compensation;
+      if ( distance && val < 0 )
+        val = 0;
+    }
+    else
+    {
+      val = distance - compensation;
+      if ( val > 0 )
+        val = 0;
+    }
+    return val;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Round_To_Grid                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Rounds value to grid after adding engine compensation.             */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    distance     :: The distance to round.                             */
+  /*                                                                       */
+  /*    compensation :: The engine compensation.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Rounded distance.                                                  */
+  /*                                                                       */
+  static FT_F26Dot6
+  Round_To_Grid( EXEC_OP_ FT_F26Dot6  distance,
+                          FT_F26Dot6  compensation )
+  {
+    FT_F26Dot6  val;
+
+    FT_UNUSED_EXEC;
+
+
+    if ( distance >= 0 )
+    {
+      val = distance + compensation + 32;
+      if ( distance && val > 0 )
+        val &= ~63;
+      else
+        val = 0;
+    }
+    else
+    {
+      val = -FT_PIX_ROUND( compensation - distance );
+      if ( val > 0 )
+        val = 0;
+    }
+
+    return  val;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Round_To_Half_Grid                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Rounds value to half grid after adding engine compensation.        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    distance     :: The distance to round.                             */
+  /*                                                                       */
+  /*    compensation :: The engine compensation.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Rounded distance.                                                  */
+  /*                                                                       */
+  static FT_F26Dot6
+  Round_To_Half_Grid( EXEC_OP_ FT_F26Dot6  distance,
+                               FT_F26Dot6  compensation )
+  {
+    FT_F26Dot6  val;
+
+    FT_UNUSED_EXEC;
+
+
+    if ( distance >= 0 )
+    {
+      val = FT_PIX_FLOOR( distance + compensation ) + 32;
+      if ( distance && val < 0 )
+        val = 0;
+    }
+    else
+    {
+      val = -( FT_PIX_FLOOR( compensation - distance ) + 32 );
+      if ( val > 0 )
+        val = 0;
+    }
+
+    return val;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Round_Down_To_Grid                                                 */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Rounds value down to grid after adding engine compensation.        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    distance     :: The distance to round.                             */
+  /*                                                                       */
+  /*    compensation :: The engine compensation.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Rounded distance.                                                  */
+  /*                                                                       */
+  static FT_F26Dot6
+  Round_Down_To_Grid( EXEC_OP_ FT_F26Dot6  distance,
+                               FT_F26Dot6  compensation )
+  {
+    FT_F26Dot6  val;
+
+    FT_UNUSED_EXEC;
+
+
+    if ( distance >= 0 )
+    {
+      val = distance + compensation;
+      if ( distance && val > 0 )
+        val &= ~63;
+      else
+        val = 0;
+    }
+    else
+    {
+      val = -( ( compensation - distance ) & -64 );
+      if ( val > 0 )
+        val = 0;
+    }
+
+    return val;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Round_Up_To_Grid                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Rounds value up to grid after adding engine compensation.          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    distance     :: The distance to round.                             */
+  /*                                                                       */
+  /*    compensation :: The engine compensation.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Rounded distance.                                                  */
+  /*                                                                       */
+  static FT_F26Dot6
+  Round_Up_To_Grid( EXEC_OP_ FT_F26Dot6  distance,
+                             FT_F26Dot6  compensation )
+  {
+    FT_F26Dot6  val;
+
+    FT_UNUSED_EXEC;
+
+
+    if ( distance >= 0 )
+    {
+      val = distance + compensation + 63;
+      if ( distance && val > 0 )
+        val &= ~63;
+      else
+        val = 0;
+    }
+    else
+    {
+      val = - FT_PIX_CEIL( compensation - distance );
+      if ( val > 0 )
+        val = 0;
+    }
+
+    return val;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Round_To_Double_Grid                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Rounds value to double grid after adding engine compensation.      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    distance     :: The distance to round.                             */
+  /*                                                                       */
+  /*    compensation :: The engine compensation.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Rounded distance.                                                  */
+  /*                                                                       */
+  static FT_F26Dot6
+  Round_To_Double_Grid( EXEC_OP_ FT_F26Dot6  distance,
+                                 FT_F26Dot6  compensation )
+  {
+    FT_F26Dot6 val;
+
+    FT_UNUSED_EXEC;
+
+
+    if ( distance >= 0 )
+    {
+      val = distance + compensation + 16;
+      if ( distance && val > 0 )
+        val &= ~31;
+      else
+        val = 0;
+    }
+    else
+    {
+      val = -FT_PAD_ROUND( compensation - distance, 32 );
+      if ( val > 0 )
+        val = 0;
+    }
+
+    return val;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Round_Super                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Super-rounds value to grid after adding engine compensation.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    distance     :: The distance to round.                             */
+  /*                                                                       */
+  /*    compensation :: The engine compensation.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Rounded distance.                                                  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The TrueType specification says very few about the relationship    */
+  /*    between rounding and engine compensation.  However, it seems from  */
+  /*    the description of super round that we should add the compensation */
+  /*    before rounding.                                                   */
+  /*                                                                       */
+  static FT_F26Dot6
+  Round_Super( EXEC_OP_ FT_F26Dot6  distance,
+                        FT_F26Dot6  compensation )
+  {
+    FT_F26Dot6  val;
+
+
+    if ( distance >= 0 )
+    {
+      val = ( distance - CUR.phase + CUR.threshold + compensation ) &
+              -CUR.period;
+      if ( distance && val < 0 )
+        val = 0;
+      val += CUR.phase;
+    }
+    else
+    {
+      val = -( ( CUR.threshold - CUR.phase - distance + compensation ) &
+               -CUR.period );
+      if ( val > 0 )
+        val = 0;
+      val -= CUR.phase;
+    }
+
+    return val;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Round_Super_45                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Super-rounds value to grid after adding engine compensation.       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    distance     :: The distance to round.                             */
+  /*                                                                       */
+  /*    compensation :: The engine compensation.                           */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Rounded distance.                                                  */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    There is a separate function for Round_Super_45() as we may need   */
+  /*    greater precision.                                                 */
+  /*                                                                       */
+  static FT_F26Dot6
+  Round_Super_45( EXEC_OP_ FT_F26Dot6  distance,
+                           FT_F26Dot6  compensation )
+  {
+    FT_F26Dot6  val;
+
+
+    if ( distance >= 0 )
+    {
+      val = ( ( distance - CUR.phase + CUR.threshold + compensation ) /
+                CUR.period ) * CUR.period;
+      if ( distance && val < 0 )
+        val = 0;
+      val += CUR.phase;
+    }
+    else
+    {
+      val = -( ( ( CUR.threshold - CUR.phase - distance + compensation ) /
+                   CUR.period ) * CUR.period );
+      if ( val > 0 )
+        val = 0;
+      val -= CUR.phase;
+    }
+
+    return val;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Compute_Round                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Sets the rounding mode.                                            */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    round_mode :: The rounding mode to be used.                        */
+  /*                                                                       */
+  static void
+  Compute_Round( EXEC_OP_ FT_Byte  round_mode )
+  {
+    switch ( round_mode )
+    {
+    case TT_Round_Off:
+      CUR.func_round = (TT_Round_Func)Round_None;
+      break;
+
+    case TT_Round_To_Grid:
+      CUR.func_round = (TT_Round_Func)Round_To_Grid;
+      break;
+
+    case TT_Round_Up_To_Grid:
+      CUR.func_round = (TT_Round_Func)Round_Up_To_Grid;
+      break;
+
+    case TT_Round_Down_To_Grid:
+      CUR.func_round = (TT_Round_Func)Round_Down_To_Grid;
+      break;
+
+    case TT_Round_To_Half_Grid:
+      CUR.func_round = (TT_Round_Func)Round_To_Half_Grid;
+      break;
+
+    case TT_Round_To_Double_Grid:
+      CUR.func_round = (TT_Round_Func)Round_To_Double_Grid;
+      break;
+
+    case TT_Round_Super:
+      CUR.func_round = (TT_Round_Func)Round_Super;
+      break;
+
+    case TT_Round_Super_45:
+      CUR.func_round = (TT_Round_Func)Round_Super_45;
+      break;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    SetSuperRound                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Sets Super Round parameters.                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    GridPeriod :: Grid period                                          */
+  /*    selector   :: SROUND opcode                                        */
+  /*                                                                       */
+  static void
+  SetSuperRound( EXEC_OP_ FT_F26Dot6  GridPeriod,
+                          FT_Long     selector )
+  {
+    switch ( (FT_Int)( selector & 0xC0 ) )
+    {
+      case 0:
+        CUR.period = GridPeriod / 2;
+        break;
+
+      case 0x40:
+        CUR.period = GridPeriod;
+        break;
+
+      case 0x80:
+        CUR.period = GridPeriod * 2;
+        break;
+
+      /* This opcode is reserved, but... */
+
+      case 0xC0:
+        CUR.period = GridPeriod;
+        break;
+    }
+
+    switch ( (FT_Int)( selector & 0x30 ) )
+    {
+    case 0:
+      CUR.phase = 0;
+      break;
+
+    case 0x10:
+      CUR.phase = CUR.period / 4;
+      break;
+
+    case 0x20:
+      CUR.phase = CUR.period / 2;
+      break;
+
+    case 0x30:
+      CUR.phase = CUR.period * 3 / 4;
+      break;
+    }
+
+    if ( ( selector & 0x0F ) == 0 )
+      CUR.threshold = CUR.period - 1;
+    else
+      CUR.threshold = ( (FT_Int)( selector & 0x0F ) - 4 ) * CUR.period / 8;
+
+    CUR.period    /= 256;
+    CUR.phase     /= 256;
+    CUR.threshold /= 256;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Project                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Computes the projection of vector given by (v2-v1) along the       */
+  /*    current projection vector.                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    v1 :: First input vector.                                          */
+  /*    v2 :: Second input vector.                                         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The distance in F26dot6 format.                                    */
+  /*                                                                       */
+  static FT_F26Dot6
+  Project( EXEC_OP_ FT_Pos  dx,
+                    FT_Pos  dy )
+  {
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    FT_ASSERT( !CUR.face->unpatented_hinting );
+#endif
+
+    return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy,
+                        CUR.GS.projVector.x,
+                        CUR.GS.projVector.y );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Dual_Project                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Computes the projection of the vector given by (v2-v1) along the   */
+  /*    current dual vector.                                               */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    v1 :: First input vector.                                          */
+  /*    v2 :: Second input vector.                                         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The distance in F26dot6 format.                                    */
+  /*                                                                       */
+  static FT_F26Dot6
+  Dual_Project( EXEC_OP_ FT_Pos  dx,
+                         FT_Pos  dy )
+  {
+    return TT_DotFix14( (FT_UInt32)dx, (FT_UInt32)dy,
+                        CUR.GS.dualVector.x,
+                        CUR.GS.dualVector.y );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Project_x                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Computes the projection of the vector given by (v2-v1) along the   */
+  /*    horizontal axis.                                                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    v1 :: First input vector.                                          */
+  /*    v2 :: Second input vector.                                         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The distance in F26dot6 format.                                    */
+  /*                                                                       */
+  static FT_F26Dot6
+  Project_x( EXEC_OP_ FT_Pos  dx,
+                      FT_Pos  dy )
+  {
+    FT_UNUSED_EXEC;
+    FT_UNUSED( dy );
+
+    return dx;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Project_y                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Computes the projection of the vector given by (v2-v1) along the   */
+  /*    vertical axis.                                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    v1 :: First input vector.                                          */
+  /*    v2 :: Second input vector.                                         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    The distance in F26dot6 format.                                    */
+  /*                                                                       */
+  static FT_F26Dot6
+  Project_y( EXEC_OP_ FT_Pos  dx,
+                      FT_Pos  dy )
+  {
+    FT_UNUSED_EXEC;
+    FT_UNUSED( dx );
+
+    return dy;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Compute_Funcs                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Computes the projection and movement function pointers according   */
+  /*    to the current graphics state.                                     */
+  /*                                                                       */
+  static void
+  Compute_Funcs( EXEC_OP )
+  {
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    if ( CUR.face->unpatented_hinting )
+    {
+      /* If both vectors point rightwards along the x axis, set             */
+      /* `both-x-axis' true, otherwise set it false.  The x values only     */
+      /* need be tested because the vector has been normalised to a unit    */
+      /* vector of length 0x4000 = unity.                                   */
+      CUR.GS.both_x_axis = (FT_Bool)( CUR.GS.projVector.x == 0x4000 &&
+                                      CUR.GS.freeVector.x == 0x4000 );
+
+      /* Throw away projection and freedom vector information */
+      /* because the patents don't allow them to be stored.   */
+      /* The relevant US Patents are 5155805 and 5325479.     */
+      CUR.GS.projVector.x = 0;
+      CUR.GS.projVector.y = 0;
+      CUR.GS.freeVector.x = 0;
+      CUR.GS.freeVector.y = 0;
+
+      if ( CUR.GS.both_x_axis )
+      {
+        CUR.func_project   = Project_x;
+        CUR.func_move      = Direct_Move_X;
+        CUR.func_move_orig = Direct_Move_Orig_X;
+      }
+      else
+      {
+        CUR.func_project   = Project_y;
+        CUR.func_move      = Direct_Move_Y;
+        CUR.func_move_orig = Direct_Move_Orig_Y;
+      }
+
+      if ( CUR.GS.dualVector.x == 0x4000 )
+        CUR.func_dualproj = Project_x;
+      else
+      {
+        if ( CUR.GS.dualVector.y == 0x4000 )
+          CUR.func_dualproj = Project_y;
+        else
+          CUR.func_dualproj = Dual_Project;
+      }
+
+      /* Force recalculation of cached aspect ratio */
+      CUR.tt_metrics.ratio = 0;
+
+      return;
+    }
+#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING */
+
+    if ( CUR.GS.freeVector.x == 0x4000 )
+      CUR.F_dot_P       = CUR.GS.projVector.x * 0x10000L;
+    else
+    {
+      if ( CUR.GS.freeVector.y == 0x4000 )
+        CUR.F_dot_P       = CUR.GS.projVector.y * 0x10000L;
+      else
+        CUR.F_dot_P = (FT_Long)CUR.GS.projVector.x * CUR.GS.freeVector.x * 4 +
+                      (FT_Long)CUR.GS.projVector.y * CUR.GS.freeVector.y * 4;
+    }
+
+    if ( CUR.GS.projVector.x == 0x4000 )
+      CUR.func_project = (TT_Project_Func)Project_x;
+    else
+    {
+      if ( CUR.GS.projVector.y == 0x4000 )
+        CUR.func_project = (TT_Project_Func)Project_y;
+      else
+        CUR.func_project = (TT_Project_Func)Project;
+    }
+
+    if ( CUR.GS.dualVector.x == 0x4000 )
+      CUR.func_dualproj = (TT_Project_Func)Project_x;
+    else
+    {
+      if ( CUR.GS.dualVector.y == 0x4000 )
+        CUR.func_dualproj = (TT_Project_Func)Project_y;
+      else
+        CUR.func_dualproj = (TT_Project_Func)Dual_Project;
+    }
+
+    CUR.func_move      = (TT_Move_Func)Direct_Move;
+    CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig;
+
+    if ( CUR.F_dot_P == 0x40000000L )
+    {
+      if ( CUR.GS.freeVector.x == 0x4000 )
+      {
+        CUR.func_move      = (TT_Move_Func)Direct_Move_X;
+        CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_X;
+      }
+      else
+      {
+        if ( CUR.GS.freeVector.y == 0x4000 )
+        {
+          CUR.func_move      = (TT_Move_Func)Direct_Move_Y;
+          CUR.func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y;
+        }
+      }
+    }
+
+    /* at small sizes, F_dot_P can become too small, resulting   */
+    /* in overflows and `spikes' in a number of glyphs like `w'. */
+
+    if ( FT_ABS( CUR.F_dot_P ) < 0x4000000L )
+      CUR.F_dot_P = 0x40000000L;
+
+    /* Disable cached aspect ratio */
+    CUR.tt_metrics.ratio = 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Normalize                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Norms a vector.                                                    */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    Vx :: The horizontal input vector coordinate.                      */
+  /*    Vy :: The vertical input vector coordinate.                        */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    R  :: The normed unit vector.                                      */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    Returns FAILURE if a vector parameter is zero.                     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    In case Vx and Vy are both zero, Normalize() returns SUCCESS, and  */
+  /*    R is undefined.                                                    */
+  /*                                                                       */
+
+
+  static FT_Bool
+  Normalize( EXEC_OP_ FT_F26Dot6      Vx,
+                      FT_F26Dot6      Vy,
+                      FT_UnitVector*  R )
+  {
+    FT_F26Dot6  W;
+    FT_Bool     S1, S2;
+
+    FT_UNUSED_EXEC;
+
+
+    if ( FT_ABS( Vx ) < 0x10000L && FT_ABS( Vy ) < 0x10000L )
+    {
+      Vx *= 0x100;
+      Vy *= 0x100;
+
+      W = TT_VecLen( Vx, Vy );
+
+      if ( W == 0 )
+      {
+        /* XXX: UNDOCUMENTED! It seems that it is possible to try   */
+        /*      to normalize the vector (0,0).  Return immediately. */
+        return SUCCESS;
+      }
+
+      R->x = (FT_F2Dot14)FT_MulDiv( Vx, 0x4000L, W );
+      R->y = (FT_F2Dot14)FT_MulDiv( Vy, 0x4000L, W );
+
+      return SUCCESS;
+    }
+
+    W = TT_VecLen( Vx, Vy );
+
+    Vx = FT_MulDiv( Vx, 0x4000L, W );
+    Vy = FT_MulDiv( Vy, 0x4000L, W );
+
+    W = Vx * Vx + Vy * Vy;
+
+    /* Now, we want that Sqrt( W ) = 0x4000 */
+    /* Or 0x10000000 <= W < 0x10004000      */
+
+    if ( Vx < 0 )
+    {
+      Vx = -Vx;
+      S1 = TRUE;
+    }
+    else
+      S1 = FALSE;
+
+    if ( Vy < 0 )
+    {
+      Vy = -Vy;
+      S2 = TRUE;
+    }
+    else
+      S2 = FALSE;
+
+    while ( W < 0x10000000L )
+    {
+      /* We need to increase W by a minimal amount */
+      if ( Vx < Vy )
+        Vx++;
+      else
+        Vy++;
+
+      W = Vx * Vx + Vy * Vy;
+    }
+
+    while ( W >= 0x10004000L )
+    {
+      /* We need to decrease W by a minimal amount */
+      if ( Vx < Vy )
+        Vx--;
+      else
+        Vy--;
+
+      W = Vx * Vx + Vy * Vy;
+    }
+
+    /* Note that in various cases, we can only  */
+    /* compute a Sqrt(W) of 0x3FFF, eg. Vx = Vy */
+
+    if ( S1 )
+      Vx = -Vx;
+
+    if ( S2 )
+      Vy = -Vy;
+
+    R->x = (FT_F2Dot14)Vx;   /* Type conversion */
+    R->y = (FT_F2Dot14)Vy;   /* Type conversion */
+
+    return SUCCESS;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Here we start with the implementation of the various opcodes.         */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static FT_Bool
+  Ins_SxVTL( EXEC_OP_ FT_UShort       aIdx1,
+                      FT_UShort       aIdx2,
+                      FT_Int          aOpc,
+                      FT_UnitVector*  Vec )
+  {
+    FT_Long     A, B, C;
+    FT_Vector*  p1;
+    FT_Vector*  p2;
+
+
+    if ( BOUNDS( aIdx1, CUR.zp2.n_points ) ||
+         BOUNDS( aIdx2, CUR.zp1.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      return FAILURE;
+    }
+
+    p1 = CUR.zp1.cur + aIdx2;
+    p2 = CUR.zp2.cur + aIdx1;
+
+    A = p1->x - p2->x;
+    B = p1->y - p2->y;
+
+    /* If p1 == p2, SPVTL and SFVTL behave the same as */
+    /* SPVTCA[X] and SFVTCA[X], respectively.          */
+    /*                                                 */
+    /* Confirmed by Greg Hitchcock.                    */
+
+    if ( A == 0 && B == 0 )
+    {
+      A    = 0x4000;
+      aOpc = 0;
+    }
+
+    if ( ( aOpc & 1 ) != 0 )
+    {
+      C =  B;   /* counter clockwise rotation */
+      B =  A;
+      A = -C;
+    }
+
+    NORMalize( A, B, Vec );
+
+    return SUCCESS;
+  }
+
+
+  /* When not using the big switch statements, the interpreter uses a */
+  /* call table defined later below in this source.  Each opcode must */
+  /* thus have a corresponding function, even trivial ones.           */
+  /*                                                                  */
+  /* They are all defined there.                                      */
+
+#define DO_SVTCA                            \
+  {                                         \
+    FT_Short  A, B;                         \
+                                            \
+                                            \
+    A = (FT_Short)( CUR.opcode & 1 ) << 14; \
+    B = A ^ (FT_Short)0x4000;               \
+                                            \
+    CUR.GS.freeVector.x = A;                \
+    CUR.GS.projVector.x = A;                \
+    CUR.GS.dualVector.x = A;                \
+                                            \
+    CUR.GS.freeVector.y = B;                \
+    CUR.GS.projVector.y = B;                \
+    CUR.GS.dualVector.y = B;                \
+                                            \
+    COMPUTE_Funcs();                        \
+  }
+
+
+#define DO_SPVTCA                           \
+  {                                         \
+    FT_Short  A, B;                         \
+                                            \
+                                            \
+    A = (FT_Short)( CUR.opcode & 1 ) << 14; \
+    B = A ^ (FT_Short)0x4000;               \
+                                            \
+    CUR.GS.projVector.x = A;                \
+    CUR.GS.dualVector.x = A;                \
+                                            \
+    CUR.GS.projVector.y = B;                \
+    CUR.GS.dualVector.y = B;                \
+                                            \
+    GUESS_VECTOR( freeVector );             \
+                                            \
+    COMPUTE_Funcs();                        \
+  }
+
+
+#define DO_SFVTCA                           \
+  {                                         \
+    FT_Short  A, B;                         \
+                                            \
+                                            \
+    A = (FT_Short)( CUR.opcode & 1 ) << 14; \
+    B = A ^ (FT_Short)0x4000;               \
+                                            \
+    CUR.GS.freeVector.x = A;                \
+    CUR.GS.freeVector.y = B;                \
+                                            \
+    GUESS_VECTOR( projVector );             \
+                                            \
+    COMPUTE_Funcs();                        \
+  }
+
+
+#define DO_SPVTL                                      \
+    if ( INS_SxVTL( (FT_UShort)args[1],               \
+                    (FT_UShort)args[0],               \
+                    CUR.opcode,                       \
+                    &CUR.GS.projVector ) == SUCCESS ) \
+    {                                                 \
+      CUR.GS.dualVector = CUR.GS.projVector;          \
+      GUESS_VECTOR( freeVector );                     \
+      COMPUTE_Funcs();                                \
+    }
+
+
+#define DO_SFVTL                                      \
+    if ( INS_SxVTL( (FT_UShort)args[1],               \
+                    (FT_UShort)args[0],               \
+                    CUR.opcode,                       \
+                    &CUR.GS.freeVector ) == SUCCESS ) \
+    {                                                 \
+      GUESS_VECTOR( projVector );                     \
+      COMPUTE_Funcs();                                \
+    }
+
+
+#define DO_SFVTPV                          \
+    GUESS_VECTOR( projVector );            \
+    CUR.GS.freeVector = CUR.GS.projVector; \
+    COMPUTE_Funcs();
+
+
+#define DO_SPVFS                                \
+  {                                             \
+    FT_Short  S;                                \
+    FT_Long   X, Y;                             \
+                                                \
+                                                \
+    /* Only use low 16bits, then sign extend */ \
+    S = (FT_Short)args[1];                      \
+    Y = (FT_Long)S;                             \
+    S = (FT_Short)args[0];                      \
+    X = (FT_Long)S;                             \
+                                                \
+    NORMalize( X, Y, &CUR.GS.projVector );      \
+                                                \
+    CUR.GS.dualVector = CUR.GS.projVector;      \
+    GUESS_VECTOR( freeVector );                 \
+    COMPUTE_Funcs();                            \
+  }
+
+
+#define DO_SFVFS                                \
+  {                                             \
+    FT_Short  S;                                \
+    FT_Long   X, Y;                             \
+                                                \
+                                                \
+    /* Only use low 16bits, then sign extend */ \
+    S = (FT_Short)args[1];                      \
+    Y = (FT_Long)S;                             \
+    S = (FT_Short)args[0];                      \
+    X = S;                                      \
+                                                \
+    NORMalize( X, Y, &CUR.GS.freeVector );      \
+    GUESS_VECTOR( projVector );                 \
+    COMPUTE_Funcs();                            \
+  }
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define DO_GPV                                   \
+    if ( CUR.face->unpatented_hinting )          \
+    {                                            \
+      args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \
+      args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \
+    }                                            \
+    else                                         \
+    {                                            \
+      args[0] = CUR.GS.projVector.x;             \
+      args[1] = CUR.GS.projVector.y;             \
+    }
+#else
+#define DO_GPV                                   \
+    args[0] = CUR.GS.projVector.x;               \
+    args[1] = CUR.GS.projVector.y;
+#endif
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#define DO_GFV                                   \
+    if ( CUR.face->unpatented_hinting )          \
+    {                                            \
+      args[0] = CUR.GS.both_x_axis ? 0x4000 : 0; \
+      args[1] = CUR.GS.both_x_axis ? 0 : 0x4000; \
+    }                                            \
+    else                                         \
+    {                                            \
+      args[0] = CUR.GS.freeVector.x;             \
+      args[1] = CUR.GS.freeVector.y;             \
+    }
+#else
+#define DO_GFV                                   \
+    args[0] = CUR.GS.freeVector.x;               \
+    args[1] = CUR.GS.freeVector.y;
+#endif
+
+
+#define DO_SRP0                      \
+    CUR.GS.rp0 = (FT_UShort)args[0];
+
+
+#define DO_SRP1                      \
+    CUR.GS.rp1 = (FT_UShort)args[0];
+
+
+#define DO_SRP2                      \
+    CUR.GS.rp2 = (FT_UShort)args[0];
+
+
+#define DO_RTHG                                         \
+    CUR.GS.round_state = TT_Round_To_Half_Grid;         \
+    CUR.func_round = (TT_Round_Func)Round_To_Half_Grid;
+
+
+#define DO_RTG                                     \
+    CUR.GS.round_state = TT_Round_To_Grid;         \
+    CUR.func_round = (TT_Round_Func)Round_To_Grid;
+
+
+#define DO_RTDG                                           \
+    CUR.GS.round_state = TT_Round_To_Double_Grid;         \
+    CUR.func_round = (TT_Round_Func)Round_To_Double_Grid;
+
+
+#define DO_RUTG                                       \
+    CUR.GS.round_state = TT_Round_Up_To_Grid;         \
+    CUR.func_round = (TT_Round_Func)Round_Up_To_Grid;
+
+
+#define DO_RDTG                                         \
+    CUR.GS.round_state = TT_Round_Down_To_Grid;         \
+    CUR.func_round = (TT_Round_Func)Round_Down_To_Grid;
+
+
+#define DO_ROFF                                 \
+    CUR.GS.round_state = TT_Round_Off;          \
+    CUR.func_round = (TT_Round_Func)Round_None;
+
+
+#define DO_SROUND                                \
+    SET_SuperRound( 0x4000, args[0] );           \
+    CUR.GS.round_state = TT_Round_Super;         \
+    CUR.func_round = (TT_Round_Func)Round_Super;
+
+
+#define DO_S45ROUND                                 \
+    SET_SuperRound( 0x2D41, args[0] );              \
+    CUR.GS.round_state = TT_Round_Super_45;         \
+    CUR.func_round = (TT_Round_Func)Round_Super_45;
+
+
+#define DO_SLOOP                       \
+    if ( args[0] < 0 )                 \
+      CUR.error = TT_Err_Bad_Argument; \
+    else                               \
+      CUR.GS.loop = args[0];
+
+
+#define DO_SMD                         \
+    CUR.GS.minimum_distance = args[0];
+
+
+#define DO_SCVTCI                                     \
+    CUR.GS.control_value_cutin = (FT_F26Dot6)args[0];
+
+
+#define DO_SSWCI                                     \
+    CUR.GS.single_width_cutin = (FT_F26Dot6)args[0];
+
+
+    /* XXX: UNDOCUMENTED! or bug in the Windows engine?   */
+    /*                                                    */
+    /*      It seems that the value that is read here is  */
+    /*      expressed in 16.16 format rather than in font */
+    /*      units.                                        */
+    /*                                                    */
+#define DO_SSW                                                 \
+    CUR.GS.single_width_value = (FT_F26Dot6)( args[0] >> 10 );
+
+
+#define DO_FLIPON            \
+    CUR.GS.auto_flip = TRUE;
+
+
+#define DO_FLIPOFF            \
+    CUR.GS.auto_flip = FALSE;
+
+
+#define DO_SDB                             \
+    CUR.GS.delta_base = (FT_Short)args[0];
+
+
+#define DO_SDS                              \
+    CUR.GS.delta_shift = (FT_Short)args[0];
+
+
+#define DO_MD  /* nothing */
+
+
+#define DO_MPPEM              \
+    args[0] = CURRENT_Ppem();
+
+
+  /* Note: The pointSize should be irrelevant in a given font program; */
+  /*       we thus decide to return only the ppem.                     */
+#if 0
+
+#define DO_MPS                       \
+    args[0] = CUR.metrics.pointSize;
+
+#else
+
+#define DO_MPS                \
+    args[0] = CURRENT_Ppem();
+
+#endif /* 0 */
+
+
+#define DO_DUP         \
+    args[1] = args[0];
+
+
+#define DO_CLEAR     \
+    CUR.new_top = 0;
+
+
+#define DO_SWAP        \
+  {                    \
+    FT_Long  L;        \
+                       \
+                       \
+    L       = args[0]; \
+    args[0] = args[1]; \
+    args[1] = L;       \
+  }
+
+
+#define DO_DEPTH       \
+    args[0] = CUR.top;
+
+
+#define DO_CINDEX                             \
+  {                                           \
+    FT_Long  L;                               \
+                                              \
+                                              \
+    L = args[0];                              \
+                                              \
+    if ( L <= 0 || L > CUR.args )             \
+    {                                         \
+      if ( CUR.pedantic_hinting )             \
+        CUR.error = TT_Err_Invalid_Reference; \
+      args[0] = 0;                            \
+    }                                         \
+    else                                      \
+      args[0] = CUR.stack[CUR.args - L];      \
+  }
+
+
+#define DO_JROT                                                   \
+    if ( args[1] != 0 )                                           \
+    {                                                             \
+      if ( args[0] == 0 && CUR.args == 0 )                        \
+        CUR.error = TT_Err_Bad_Argument;                          \
+      CUR.IP += args[0];                                          \
+      if ( CUR.IP < 0                                          || \
+           ( CUR.callTop > 0                                 &&   \
+             CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) )  \
+        CUR.error = TT_Err_Bad_Argument;                          \
+      CUR.step_ins = FALSE;                                       \
+    }
+
+
+#define DO_JMPR                                                 \
+    if ( args[0] == 0 && CUR.args == 0 )                        \
+      CUR.error = TT_Err_Bad_Argument;                          \
+    CUR.IP += args[0];                                          \
+    if ( CUR.IP < 0                                          || \
+         ( CUR.callTop > 0                                 &&   \
+           CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) )  \
+      CUR.error = TT_Err_Bad_Argument;                          \
+    CUR.step_ins = FALSE;
+
+
+#define DO_JROF                                                   \
+    if ( args[1] == 0 )                                           \
+    {                                                             \
+      if ( args[0] == 0 && CUR.args == 0 )                        \
+        CUR.error = TT_Err_Bad_Argument;                          \
+      CUR.IP += args[0];                                          \
+      if ( CUR.IP < 0                                          || \
+           ( CUR.callTop > 0                                 &&   \
+             CUR.IP > CUR.callStack[CUR.callTop - 1].Cur_End ) )  \
+        CUR.error = TT_Err_Bad_Argument;                          \
+      CUR.step_ins = FALSE;                                       \
+    }
+
+
+#define DO_LT                        \
+    args[0] = ( args[0] < args[1] );
+
+
+#define DO_LTEQ                       \
+    args[0] = ( args[0] <= args[1] );
+
+
+#define DO_GT                        \
+    args[0] = ( args[0] > args[1] );
+
+
+#define DO_GTEQ                       \
+    args[0] = ( args[0] >= args[1] );
+
+
+#define DO_EQ                         \
+    args[0] = ( args[0] == args[1] );
+
+
+#define DO_NEQ                        \
+    args[0] = ( args[0] != args[1] );
+
+
+#define DO_ODD                                                  \
+    args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 64 );
+
+
+#define DO_EVEN                                                \
+    args[0] = ( ( CUR_Func_round( args[0], 0 ) & 127 ) == 0 );
+
+
+#define DO_AND                        \
+    args[0] = ( args[0] && args[1] );
+
+
+#define DO_OR                         \
+    args[0] = ( args[0] || args[1] );
+
+
+#define DO_NOT          \
+    args[0] = !args[0];
+
+
+#define DO_ADD          \
+    args[0] += args[1];
+
+
+#define DO_SUB          \
+    args[0] -= args[1];
+
+
+#define DO_DIV                                               \
+    if ( args[1] == 0 )                                      \
+      CUR.error = TT_Err_Divide_By_Zero;                     \
+    else                                                     \
+      args[0] = TT_MULDIV_NO_ROUND( args[0], 64L, args[1] );
+
+
+#define DO_MUL                                    \
+    args[0] = TT_MULDIV( args[0], args[1], 64L );
+
+
+#define DO_ABS                   \
+    args[0] = FT_ABS( args[0] );
+
+
+#define DO_NEG          \
+    args[0] = -args[0];
+
+
+#define DO_FLOOR    \
+    args[0] = FT_PIX_FLOOR( args[0] );
+
+
+#define DO_CEILING                    \
+    args[0] = FT_PIX_CEIL( args[0] );
+
+
+#define DO_RS                           \
+   {                                    \
+     FT_ULong  I = (FT_ULong)args[0];   \
+                                        \
+                                        \
+     if ( BOUNDSL( I, CUR.storeSize ) ) \
+     {                                  \
+       if ( CUR.pedantic_hinting )      \
+       {                                \
+         ARRAY_BOUND_ERROR;             \
+       }                                \
+       else                             \
+         args[0] = 0;                   \
+     }                                  \
+     else                               \
+       args[0] = CUR.storage[I];        \
+   }
+
+
+#define DO_WS                           \
+   {                                    \
+     FT_ULong  I = (FT_ULong)args[0];   \
+                                        \
+                                        \
+     if ( BOUNDSL( I, CUR.storeSize ) ) \
+     {                                  \
+       if ( CUR.pedantic_hinting )      \
+       {                                \
+         ARRAY_BOUND_ERROR;             \
+       }                                \
+     }                                  \
+     else                               \
+       CUR.storage[I] = args[1];        \
+   }
+
+
+#define DO_RCVT                          \
+   {                                     \
+     FT_ULong  I = (FT_ULong)args[0];    \
+                                         \
+                                         \
+     if ( BOUNDSL( I, CUR.cvtSize ) )    \
+     {                                   \
+       if ( CUR.pedantic_hinting )       \
+       {                                 \
+         ARRAY_BOUND_ERROR;              \
+       }                                 \
+       else                              \
+         args[0] = 0;                    \
+     }                                   \
+     else                                \
+       args[0] = CUR_Func_read_cvt( I ); \
+   }
+
+
+#define DO_WCVTP                         \
+   {                                     \
+     FT_ULong  I = (FT_ULong)args[0];    \
+                                         \
+                                         \
+     if ( BOUNDSL( I, CUR.cvtSize ) )    \
+     {                                   \
+       if ( CUR.pedantic_hinting )       \
+       {                                 \
+         ARRAY_BOUND_ERROR;              \
+       }                                 \
+     }                                   \
+     else                                \
+       CUR_Func_write_cvt( I, args[1] ); \
+   }
+
+
+#define DO_WCVTF                                                \
+   {                                                            \
+     FT_ULong  I = (FT_ULong)args[0];                           \
+                                                                \
+                                                                \
+     if ( BOUNDSL( I, CUR.cvtSize ) )                           \
+     {                                                          \
+       if ( CUR.pedantic_hinting )                              \
+       {                                                        \
+         ARRAY_BOUND_ERROR;                                     \
+       }                                                        \
+     }                                                          \
+     else                                                       \
+       CUR.cvt[I] = TT_MULFIX( args[1], CUR.tt_metrics.scale ); \
+   }
+
+
+#define DO_DEBUG                     \
+    CUR.error = TT_Err_Debug_OpCode;
+
+
+#define DO_ROUND                                                   \
+    args[0] = CUR_Func_round(                                      \
+                args[0],                                           \
+                CUR.tt_metrics.compensations[CUR.opcode - 0x68] );
+
+
+#define DO_NROUND                                                            \
+    args[0] = ROUND_None( args[0],                                           \
+                          CUR.tt_metrics.compensations[CUR.opcode - 0x6C] );
+
+
+#define DO_MAX               \
+    if ( args[1] > args[0] ) \
+      args[0] = args[1];
+
+
+#define DO_MIN               \
+    if ( args[1] < args[0] ) \
+      args[0] = args[1];
+
+
+#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+#undef  ARRAY_BOUND_ERROR
+#define ARRAY_BOUND_ERROR                   \
+    {                                       \
+      CUR.error = TT_Err_Invalid_Reference; \
+      return;                               \
+    }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SVTCA[a]:     Set (F and P) Vectors to Coordinate Axis                */
+  /* Opcode range: 0x00-0x01                                               */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_SVTCA( INS_ARG )
+  {
+    DO_SVTCA
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SPVTCA[a]:    Set PVector to Coordinate Axis                          */
+  /* Opcode range: 0x02-0x03                                               */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_SPVTCA( INS_ARG )
+  {
+    DO_SPVTCA
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SFVTCA[a]:    Set FVector to Coordinate Axis                          */
+  /* Opcode range: 0x04-0x05                                               */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_SFVTCA( INS_ARG )
+  {
+    DO_SFVTCA
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SPVTL[a]:     Set PVector To Line                                     */
+  /* Opcode range: 0x06-0x07                                               */
+  /* Stack:        uint32 uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_SPVTL( INS_ARG )
+  {
+    DO_SPVTL
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SFVTL[a]:     Set FVector To Line                                     */
+  /* Opcode range: 0x08-0x09                                               */
+  /* Stack:        uint32 uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_SFVTL( INS_ARG )
+  {
+    DO_SFVTL
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SFVTPV[]:     Set FVector To PVector                                  */
+  /* Opcode range: 0x0E                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_SFVTPV( INS_ARG )
+  {
+    DO_SFVTPV
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SPVFS[]:      Set PVector From Stack                                  */
+  /* Opcode range: 0x0A                                                    */
+  /* Stack:        f2.14 f2.14 -->                                         */
+  /*                                                                       */
+  static void
+  Ins_SPVFS( INS_ARG )
+  {
+    DO_SPVFS
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SFVFS[]:      Set FVector From Stack                                  */
+  /* Opcode range: 0x0B                                                    */
+  /* Stack:        f2.14 f2.14 -->                                         */
+  /*                                                                       */
+  static void
+  Ins_SFVFS( INS_ARG )
+  {
+    DO_SFVFS
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* GPV[]:        Get Projection Vector                                   */
+  /* Opcode range: 0x0C                                                    */
+  /* Stack:        ef2.14 --> ef2.14                                       */
+  /*                                                                       */
+  static void
+  Ins_GPV( INS_ARG )
+  {
+    DO_GPV
+  }
+
+
+  /*************************************************************************/
+  /* GFV[]:        Get Freedom Vector                                      */
+  /* Opcode range: 0x0D                                                    */
+  /* Stack:        ef2.14 --> ef2.14                                       */
+  /*                                                                       */
+  static void
+  Ins_GFV( INS_ARG )
+  {
+    DO_GFV
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SRP0[]:       Set Reference Point 0                                   */
+  /* Opcode range: 0x10                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SRP0( INS_ARG )
+  {
+    DO_SRP0
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SRP1[]:       Set Reference Point 1                                   */
+  /* Opcode range: 0x11                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SRP1( INS_ARG )
+  {
+    DO_SRP1
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SRP2[]:       Set Reference Point 2                                   */
+  /* Opcode range: 0x12                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SRP2( INS_ARG )
+  {
+    DO_SRP2
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* RTHG[]:       Round To Half Grid                                      */
+  /* Opcode range: 0x19                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_RTHG( INS_ARG )
+  {
+    DO_RTHG
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* RTG[]:        Round To Grid                                           */
+  /* Opcode range: 0x18                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_RTG( INS_ARG )
+  {
+    DO_RTG
+  }
+
+
+  /*************************************************************************/
+  /* RTDG[]:       Round To Double Grid                                    */
+  /* Opcode range: 0x3D                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_RTDG( INS_ARG )
+  {
+    DO_RTDG
+  }
+
+
+  /*************************************************************************/
+  /* RUTG[]:       Round Up To Grid                                        */
+  /* Opcode range: 0x7C                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_RUTG( INS_ARG )
+  {
+    DO_RUTG
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* RDTG[]:       Round Down To Grid                                      */
+  /* Opcode range: 0x7D                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_RDTG( INS_ARG )
+  {
+    DO_RDTG
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ROFF[]:       Round OFF                                               */
+  /* Opcode range: 0x7A                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_ROFF( INS_ARG )
+  {
+    DO_ROFF
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SROUND[]:     Super ROUND                                             */
+  /* Opcode range: 0x76                                                    */
+  /* Stack:        Eint8 -->                                               */
+  /*                                                                       */
+  static void
+  Ins_SROUND( INS_ARG )
+  {
+    DO_SROUND
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* S45ROUND[]:   Super ROUND 45 degrees                                  */
+  /* Opcode range: 0x77                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_S45ROUND( INS_ARG )
+  {
+    DO_S45ROUND
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SLOOP[]:      Set LOOP variable                                       */
+  /* Opcode range: 0x17                                                    */
+  /* Stack:        int32? -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SLOOP( INS_ARG )
+  {
+    DO_SLOOP
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SMD[]:        Set Minimum Distance                                    */
+  /* Opcode range: 0x1A                                                    */
+  /* Stack:        f26.6 -->                                               */
+  /*                                                                       */
+  static void
+  Ins_SMD( INS_ARG )
+  {
+    DO_SMD
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SCVTCI[]:     Set Control Value Table Cut In                          */
+  /* Opcode range: 0x1D                                                    */
+  /* Stack:        f26.6 -->                                               */
+  /*                                                                       */
+  static void
+  Ins_SCVTCI( INS_ARG )
+  {
+    DO_SCVTCI
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SSWCI[]:      Set Single Width Cut In                                 */
+  /* Opcode range: 0x1E                                                    */
+  /* Stack:        f26.6 -->                                               */
+  /*                                                                       */
+  static void
+  Ins_SSWCI( INS_ARG )
+  {
+    DO_SSWCI
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SSW[]:        Set Single Width                                        */
+  /* Opcode range: 0x1F                                                    */
+  /* Stack:        int32? -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SSW( INS_ARG )
+  {
+    DO_SSW
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FLIPON[]:     Set auto-FLIP to ON                                     */
+  /* Opcode range: 0x4D                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_FLIPON( INS_ARG )
+  {
+    DO_FLIPON
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FLIPOFF[]:    Set auto-FLIP to OFF                                    */
+  /* Opcode range: 0x4E                                                    */
+  /* Stack: -->                                                            */
+  /*                                                                       */
+  static void
+  Ins_FLIPOFF( INS_ARG )
+  {
+    DO_FLIPOFF
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SANGW[]:      Set ANGle Weight                                        */
+  /* Opcode range: 0x7E                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SANGW( INS_ARG )
+  {
+    /* instruction not supported anymore */
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SDB[]:        Set Delta Base                                          */
+  /* Opcode range: 0x5E                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SDB( INS_ARG )
+  {
+    DO_SDB
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SDS[]:        Set Delta Shift                                         */
+  /* Opcode range: 0x5F                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SDS( INS_ARG )
+  {
+    DO_SDS
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MPPEM[]:      Measure Pixel Per EM                                    */
+  /* Opcode range: 0x4B                                                    */
+  /* Stack:        --> Euint16                                             */
+  /*                                                                       */
+  static void
+  Ins_MPPEM( INS_ARG )
+  {
+    DO_MPPEM
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MPS[]:        Measure Point Size                                      */
+  /* Opcode range: 0x4C                                                    */
+  /* Stack:        --> Euint16                                             */
+  /*                                                                       */
+  static void
+  Ins_MPS( INS_ARG )
+  {
+    DO_MPS
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* DUP[]:        DUPlicate the top stack's element                       */
+  /* Opcode range: 0x20                                                    */
+  /* Stack:        StkElt --> StkElt StkElt                                */
+  /*                                                                       */
+  static void
+  Ins_DUP( INS_ARG )
+  {
+    DO_DUP
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* POP[]:        POP the stack's top element                             */
+  /* Opcode range: 0x21                                                    */
+  /* Stack:        StkElt -->                                              */
+  /*                                                                       */
+  static void
+  Ins_POP( INS_ARG )
+  {
+    /* nothing to do */
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* CLEAR[]:      CLEAR the entire stack                                  */
+  /* Opcode range: 0x22                                                    */
+  /* Stack:        StkElt... -->                                           */
+  /*                                                                       */
+  static void
+  Ins_CLEAR( INS_ARG )
+  {
+    DO_CLEAR
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SWAP[]:       SWAP the stack's top two elements                       */
+  /* Opcode range: 0x23                                                    */
+  /* Stack:        2 * StkElt --> 2 * StkElt                               */
+  /*                                                                       */
+  static void
+  Ins_SWAP( INS_ARG )
+  {
+    DO_SWAP
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* DEPTH[]:      return the stack DEPTH                                  */
+  /* Opcode range: 0x24                                                    */
+  /* Stack:        --> uint32                                              */
+  /*                                                                       */
+  static void
+  Ins_DEPTH( INS_ARG )
+  {
+    DO_DEPTH
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* CINDEX[]:     Copy INDEXed element                                    */
+  /* Opcode range: 0x25                                                    */
+  /* Stack:        int32 --> StkElt                                        */
+  /*                                                                       */
+  static void
+  Ins_CINDEX( INS_ARG )
+  {
+    DO_CINDEX
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* EIF[]:        End IF                                                  */
+  /* Opcode range: 0x59                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_EIF( INS_ARG )
+  {
+    /* nothing to do */
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* JROT[]:       Jump Relative On True                                   */
+  /* Opcode range: 0x78                                                    */
+  /* Stack:        StkElt int32 -->                                        */
+  /*                                                                       */
+  static void
+  Ins_JROT( INS_ARG )
+  {
+    DO_JROT
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* JMPR[]:       JuMP Relative                                           */
+  /* Opcode range: 0x1C                                                    */
+  /* Stack:        int32 -->                                               */
+  /*                                                                       */
+  static void
+  Ins_JMPR( INS_ARG )
+  {
+    DO_JMPR
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* JROF[]:       Jump Relative On False                                  */
+  /* Opcode range: 0x79                                                    */
+  /* Stack:        StkElt int32 -->                                        */
+  /*                                                                       */
+  static void
+  Ins_JROF( INS_ARG )
+  {
+    DO_JROF
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* LT[]:         Less Than                                               */
+  /* Opcode range: 0x50                                                    */
+  /* Stack:        int32? int32? --> bool                                  */
+  /*                                                                       */
+  static void
+  Ins_LT( INS_ARG )
+  {
+    DO_LT
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* LTEQ[]:       Less Than or EQual                                      */
+  /* Opcode range: 0x51                                                    */
+  /* Stack:        int32? int32? --> bool                                  */
+  /*                                                                       */
+  static void
+  Ins_LTEQ( INS_ARG )
+  {
+    DO_LTEQ
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* GT[]:         Greater Than                                            */
+  /* Opcode range: 0x52                                                    */
+  /* Stack:        int32? int32? --> bool                                  */
+  /*                                                                       */
+  static void
+  Ins_GT( INS_ARG )
+  {
+    DO_GT
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* GTEQ[]:       Greater Than or EQual                                   */
+  /* Opcode range: 0x53                                                    */
+  /* Stack:        int32? int32? --> bool                                  */
+  /*                                                                       */
+  static void
+  Ins_GTEQ( INS_ARG )
+  {
+    DO_GTEQ
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* EQ[]:         EQual                                                   */
+  /* Opcode range: 0x54                                                    */
+  /* Stack:        StkElt StkElt --> bool                                  */
+  /*                                                                       */
+  static void
+  Ins_EQ( INS_ARG )
+  {
+    DO_EQ
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* NEQ[]:        Not EQual                                               */
+  /* Opcode range: 0x55                                                    */
+  /* Stack:        StkElt StkElt --> bool                                  */
+  /*                                                                       */
+  static void
+  Ins_NEQ( INS_ARG )
+  {
+    DO_NEQ
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ODD[]:        Is ODD                                                  */
+  /* Opcode range: 0x56                                                    */
+  /* Stack:        f26.6 --> bool                                          */
+  /*                                                                       */
+  static void
+  Ins_ODD( INS_ARG )
+  {
+    DO_ODD
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* EVEN[]:       Is EVEN                                                 */
+  /* Opcode range: 0x57                                                    */
+  /* Stack:        f26.6 --> bool                                          */
+  /*                                                                       */
+  static void
+  Ins_EVEN( INS_ARG )
+  {
+    DO_EVEN
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* AND[]:        logical AND                                             */
+  /* Opcode range: 0x5A                                                    */
+  /* Stack:        uint32 uint32 --> uint32                                */
+  /*                                                                       */
+  static void
+  Ins_AND( INS_ARG )
+  {
+    DO_AND
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* OR[]:         logical OR                                              */
+  /* Opcode range: 0x5B                                                    */
+  /* Stack:        uint32 uint32 --> uint32                                */
+  /*                                                                       */
+  static void
+  Ins_OR( INS_ARG )
+  {
+    DO_OR
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* NOT[]:        logical NOT                                             */
+  /* Opcode range: 0x5C                                                    */
+  /* Stack:        StkElt --> uint32                                       */
+  /*                                                                       */
+  static void
+  Ins_NOT( INS_ARG )
+  {
+    DO_NOT
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ADD[]:        ADD                                                     */
+  /* Opcode range: 0x60                                                    */
+  /* Stack:        f26.6 f26.6 --> f26.6                                   */
+  /*                                                                       */
+  static void
+  Ins_ADD( INS_ARG )
+  {
+    DO_ADD
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SUB[]:        SUBtract                                                */
+  /* Opcode range: 0x61                                                    */
+  /* Stack:        f26.6 f26.6 --> f26.6                                   */
+  /*                                                                       */
+  static void
+  Ins_SUB( INS_ARG )
+  {
+    DO_SUB
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* DIV[]:        DIVide                                                  */
+  /* Opcode range: 0x62                                                    */
+  /* Stack:        f26.6 f26.6 --> f26.6                                   */
+  /*                                                                       */
+  static void
+  Ins_DIV( INS_ARG )
+  {
+    DO_DIV
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MUL[]:        MULtiply                                                */
+  /* Opcode range: 0x63                                                    */
+  /* Stack:        f26.6 f26.6 --> f26.6                                   */
+  /*                                                                       */
+  static void
+  Ins_MUL( INS_ARG )
+  {
+    DO_MUL
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ABS[]:        ABSolute value                                          */
+  /* Opcode range: 0x64                                                    */
+  /* Stack:        f26.6 --> f26.6                                         */
+  /*                                                                       */
+  static void
+  Ins_ABS( INS_ARG )
+  {
+    DO_ABS
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* NEG[]:        NEGate                                                  */
+  /* Opcode range: 0x65                                                    */
+  /* Stack: f26.6 --> f26.6                                                */
+  /*                                                                       */
+  static void
+  Ins_NEG( INS_ARG )
+  {
+    DO_NEG
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FLOOR[]:      FLOOR                                                   */
+  /* Opcode range: 0x66                                                    */
+  /* Stack:        f26.6 --> f26.6                                         */
+  /*                                                                       */
+  static void
+  Ins_FLOOR( INS_ARG )
+  {
+    DO_FLOOR
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* CEILING[]:    CEILING                                                 */
+  /* Opcode range: 0x67                                                    */
+  /* Stack:        f26.6 --> f26.6                                         */
+  /*                                                                       */
+  static void
+  Ins_CEILING( INS_ARG )
+  {
+    DO_CEILING
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* RS[]:         Read Store                                              */
+  /* Opcode range: 0x43                                                    */
+  /* Stack:        uint32 --> uint32                                       */
+  /*                                                                       */
+  static void
+  Ins_RS( INS_ARG )
+  {
+    DO_RS
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* WS[]:         Write Store                                             */
+  /* Opcode range: 0x42                                                    */
+  /* Stack:        uint32 uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_WS( INS_ARG )
+  {
+    DO_WS
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* WCVTP[]:      Write CVT in Pixel units                                */
+  /* Opcode range: 0x44                                                    */
+  /* Stack:        f26.6 uint32 -->                                        */
+  /*                                                                       */
+  static void
+  Ins_WCVTP( INS_ARG )
+  {
+    DO_WCVTP
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* WCVTF[]:      Write CVT in Funits                                     */
+  /* Opcode range: 0x70                                                    */
+  /* Stack:        uint32 uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_WCVTF( INS_ARG )
+  {
+    DO_WCVTF
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* RCVT[]:       Read CVT                                                */
+  /* Opcode range: 0x45                                                    */
+  /* Stack:        uint32 --> f26.6                                        */
+  /*                                                                       */
+  static void
+  Ins_RCVT( INS_ARG )
+  {
+    DO_RCVT
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* AA[]:         Adjust Angle                                            */
+  /* Opcode range: 0x7F                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_AA( INS_ARG )
+  {
+    /* intentionally no longer supported */
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* DEBUG[]:      DEBUG.  Unsupported.                                    */
+  /* Opcode range: 0x4F                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  /* Note: The original instruction pops a value from the stack.           */
+  /*                                                                       */
+  static void
+  Ins_DEBUG( INS_ARG )
+  {
+    DO_DEBUG
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ROUND[ab]:    ROUND value                                             */
+  /* Opcode range: 0x68-0x6B                                               */
+  /* Stack:        f26.6 --> f26.6                                         */
+  /*                                                                       */
+  static void
+  Ins_ROUND( INS_ARG )
+  {
+    DO_ROUND
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* NROUND[ab]:   No ROUNDing of value                                    */
+  /* Opcode range: 0x6C-0x6F                                               */
+  /* Stack:        f26.6 --> f26.6                                         */
+  /*                                                                       */
+  static void
+  Ins_NROUND( INS_ARG )
+  {
+    DO_NROUND
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MAX[]:        MAXimum                                                 */
+  /* Opcode range: 0x68                                                    */
+  /* Stack:        int32? int32? --> int32                                 */
+  /*                                                                       */
+  static void
+  Ins_MAX( INS_ARG )
+  {
+    DO_MAX
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MIN[]:        MINimum                                                 */
+  /* Opcode range: 0x69                                                    */
+  /* Stack:        int32? int32? --> int32                                 */
+  /*                                                                       */
+  static void
+  Ins_MIN( INS_ARG )
+  {
+    DO_MIN
+  }
+
+
+#endif  /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The following functions are called as is within the switch statement. */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MINDEX[]:     Move INDEXed element                                    */
+  /* Opcode range: 0x26                                                    */
+  /* Stack:        int32? --> StkElt                                       */
+  /*                                                                       */
+  static void
+  Ins_MINDEX( INS_ARG )
+  {
+    FT_Long  L, K;
+
+
+    L = args[0];
+
+    if ( L <= 0 || L > CUR.args )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+    }
+    else
+    {
+      K = CUR.stack[CUR.args - L];
+
+      FT_ARRAY_MOVE( &CUR.stack[CUR.args - L    ],
+                     &CUR.stack[CUR.args - L + 1],
+                     ( L - 1 ) );
+
+      CUR.stack[CUR.args - 1] = K;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ROLL[]:       ROLL top three elements                                 */
+  /* Opcode range: 0x8A                                                    */
+  /* Stack:        3 * StkElt --> 3 * StkElt                               */
+  /*                                                                       */
+  static void
+  Ins_ROLL( INS_ARG )
+  {
+    FT_Long  A, B, C;
+
+    FT_UNUSED_EXEC;
+
+
+    A = args[2];
+    B = args[1];
+    C = args[0];
+
+    args[2] = C;
+    args[1] = A;
+    args[0] = B;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MANAGING THE FLOW OF CONTROL                                          */
+  /*                                                                       */
+  /*   Instructions appear in the specification's order.                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static FT_Bool
+  SkipCode( EXEC_OP )
+  {
+    CUR.IP += CUR.length;
+
+    if ( CUR.IP < CUR.codeSize )
+    {
+      CUR.opcode = CUR.code[CUR.IP];
+
+      CUR.length = opcode_length[CUR.opcode];
+      if ( CUR.length < 0 )
+      {
+        if ( CUR.IP + 1 >= CUR.codeSize )
+          goto Fail_Overflow;
+        CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1];
+      }
+
+      if ( CUR.IP + CUR.length <= CUR.codeSize )
+        return SUCCESS;
+    }
+
+  Fail_Overflow:
+    CUR.error = TT_Err_Code_Overflow;
+    return FAILURE;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* IF[]:         IF test                                                 */
+  /* Opcode range: 0x58                                                    */
+  /* Stack:        StkElt -->                                              */
+  /*                                                                       */
+  static void
+  Ins_IF( INS_ARG )
+  {
+    FT_Int   nIfs;
+    FT_Bool  Out;
+
+
+    if ( args[0] != 0 )
+      return;
+
+    nIfs = 1;
+    Out = 0;
+
+    do
+    {
+      if ( SKIP_Code() == FAILURE )
+        return;
+
+      switch ( CUR.opcode )
+      {
+      case 0x58:      /* IF */
+        nIfs++;
+        break;
+
+      case 0x1B:      /* ELSE */
+        Out = FT_BOOL( nIfs == 1 );
+        break;
+
+      case 0x59:      /* EIF */
+        nIfs--;
+        Out = FT_BOOL( nIfs == 0 );
+        break;
+      }
+    } while ( Out == 0 );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ELSE[]:       ELSE                                                    */
+  /* Opcode range: 0x1B                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_ELSE( INS_ARG )
+  {
+    FT_Int  nIfs;
+
+    FT_UNUSED_ARG;
+
+
+    nIfs = 1;
+
+    do
+    {
+      if ( SKIP_Code() == FAILURE )
+        return;
+
+      switch ( CUR.opcode )
+      {
+      case 0x58:    /* IF */
+        nIfs++;
+        break;
+
+      case 0x59:    /* EIF */
+        nIfs--;
+        break;
+      }
+    } while ( nIfs != 0 );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* DEFINING AND USING FUNCTIONS AND INSTRUCTIONS                         */
+  /*                                                                       */
+  /*   Instructions appear in the specification's order.                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FDEF[]:       Function DEFinition                                     */
+  /* Opcode range: 0x2C                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_FDEF( INS_ARG )
+  {
+    FT_ULong       n;
+    TT_DefRecord*  rec;
+    TT_DefRecord*  limit;
+
+
+    /* some font programs are broken enough to redefine functions! */
+    /* We will then parse the current table.                       */
+
+    rec   = CUR.FDefs;
+    limit = rec + CUR.numFDefs;
+    n     = args[0];
+
+    for ( ; rec < limit; rec++ )
+    {
+      if ( rec->opc == n )
+        break;
+    }
+
+    if ( rec == limit )
+    {
+      /* check that there is enough room for new functions */
+      if ( CUR.numFDefs >= CUR.maxFDefs )
+      {
+        CUR.error = TT_Err_Too_Many_Function_Defs;
+        return;
+      }
+      CUR.numFDefs++;
+    }
+
+    /* Although FDEF takes unsigned 32-bit integer,  */
+    /* func # must be within unsigned 16-bit integer */
+    if ( n > 0xFFFFU )
+    {
+      CUR.error = TT_Err_Too_Many_Function_Defs;
+      return;
+    }
+
+    rec->range  = CUR.curRange;
+    rec->opc    = (FT_UInt16)n;
+    rec->start  = CUR.IP + 1;
+    rec->active = TRUE;
+
+    if ( n > CUR.maxFunc )
+      CUR.maxFunc = (FT_UInt16)n;
+
+    /* Now skip the whole function definition. */
+    /* We don't allow nested IDEFS & FDEFs.    */
+
+    while ( SKIP_Code() == SUCCESS )
+    {
+      switch ( CUR.opcode )
+      {
+      case 0x89:    /* IDEF */
+      case 0x2C:    /* FDEF */
+        CUR.error = TT_Err_Nested_DEFS;
+        return;
+
+      case 0x2D:   /* ENDF */
+        rec->end = CUR.IP;
+        return;
+      }
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ENDF[]:       END Function definition                                 */
+  /* Opcode range: 0x2D                                                    */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_ENDF( INS_ARG )
+  {
+    TT_CallRec*  pRec;
+
+    FT_UNUSED_ARG;
+
+
+    if ( CUR.callTop <= 0 )     /* We encountered an ENDF without a call */
+    {
+      CUR.error = TT_Err_ENDF_In_Exec_Stream;
+      return;
+    }
+
+    CUR.callTop--;
+
+    pRec = &CUR.callStack[CUR.callTop];
+
+    pRec->Cur_Count--;
+
+    CUR.step_ins = FALSE;
+
+    if ( pRec->Cur_Count > 0 )
+    {
+      CUR.callTop++;
+      CUR.IP = pRec->Cur_Restart;
+    }
+    else
+      /* Loop through the current function */
+      INS_Goto_CodeRange( pRec->Caller_Range,
+                          pRec->Caller_IP );
+
+    /* Exit the current call frame.                      */
+
+    /* NOTE: If the last instruction of a program is a   */
+    /*       CALL or LOOPCALL, the return address is     */
+    /*       always out of the code range.  This is a    */
+    /*       valid address, and it is why we do not test */
+    /*       the result of Ins_Goto_CodeRange() here!    */
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* CALL[]:       CALL function                                           */
+  /* Opcode range: 0x2B                                                    */
+  /* Stack:        uint32? -->                                             */
+  /*                                                                       */
+  static void
+  Ins_CALL( INS_ARG )
+  {
+    FT_ULong       F;
+    TT_CallRec*    pCrec;
+    TT_DefRecord*  def;
+
+
+    /* first of all, check the index */
+
+    F = args[0];
+    if ( BOUNDSL( F, CUR.maxFunc + 1 ) )
+      goto Fail;
+
+    /* Except for some old Apple fonts, all functions in a TrueType */
+    /* font are defined in increasing order, starting from 0.  This */
+    /* means that we normally have                                  */
+    /*                                                              */
+    /*    CUR.maxFunc+1 == CUR.numFDefs                             */
+    /*    CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc             */
+    /*                                                              */
+    /* If this isn't true, we need to look up the function table.   */
+
+    def = CUR.FDefs + F;
+    if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F )
+    {
+      /* look up the FDefs table */
+      TT_DefRecord*  limit;
+
+
+      def   = CUR.FDefs;
+      limit = def + CUR.numFDefs;
+
+      while ( def < limit && def->opc != F )
+        def++;
+
+      if ( def == limit )
+        goto Fail;
+    }
+
+    /* check that the function is active */
+    if ( !def->active )
+      goto Fail;
+
+    /* check the call stack */
+    if ( CUR.callTop >= CUR.callSize )
+    {
+      CUR.error = TT_Err_Stack_Overflow;
+      return;
+    }
+
+    pCrec = CUR.callStack + CUR.callTop;
+
+    pCrec->Caller_Range = CUR.curRange;
+    pCrec->Caller_IP    = CUR.IP + 1;
+    pCrec->Cur_Count    = 1;
+    pCrec->Cur_Restart  = def->start;
+    pCrec->Cur_End      = def->end;
+
+    CUR.callTop++;
+
+    INS_Goto_CodeRange( def->range,
+                        def->start );
+
+    CUR.step_ins = FALSE;
+    return;
+
+  Fail:
+    CUR.error = TT_Err_Invalid_Reference;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* LOOPCALL[]:   LOOP and CALL function                                  */
+  /* Opcode range: 0x2A                                                    */
+  /* Stack:        uint32? Eint16? -->                                     */
+  /*                                                                       */
+  static void
+  Ins_LOOPCALL( INS_ARG )
+  {
+    FT_ULong       F;
+    TT_CallRec*    pCrec;
+    TT_DefRecord*  def;
+
+
+    /* first of all, check the index */
+    F = args[1];
+    if ( BOUNDSL( F, CUR.maxFunc + 1 ) )
+      goto Fail;
+
+    /* Except for some old Apple fonts, all functions in a TrueType */
+    /* font are defined in increasing order, starting from 0.  This */
+    /* means that we normally have                                  */
+    /*                                                              */
+    /*    CUR.maxFunc+1 == CUR.numFDefs                             */
+    /*    CUR.FDefs[n].opc == n for n in 0..CUR.maxFunc             */
+    /*                                                              */
+    /* If this isn't true, we need to look up the function table.   */
+
+    def = CUR.FDefs + F;
+    if ( CUR.maxFunc + 1 != CUR.numFDefs || def->opc != F )
+    {
+      /* look up the FDefs table */
+      TT_DefRecord*  limit;
+
+
+      def   = CUR.FDefs;
+      limit = def + CUR.numFDefs;
+
+      while ( def < limit && def->opc != F )
+        def++;
+
+      if ( def == limit )
+        goto Fail;
+    }
+
+    /* check that the function is active */
+    if ( !def->active )
+      goto Fail;
+
+    /* check stack */
+    if ( CUR.callTop >= CUR.callSize )
+    {
+      CUR.error = TT_Err_Stack_Overflow;
+      return;
+    }
+
+    if ( args[0] > 0 )
+    {
+      pCrec = CUR.callStack + CUR.callTop;
+
+      pCrec->Caller_Range = CUR.curRange;
+      pCrec->Caller_IP    = CUR.IP + 1;
+      pCrec->Cur_Count    = (FT_Int)args[0];
+      pCrec->Cur_Restart  = def->start;
+      pCrec->Cur_End      = def->end;
+
+      CUR.callTop++;
+
+      INS_Goto_CodeRange( def->range, def->start );
+
+      CUR.step_ins = FALSE;
+    }
+    return;
+
+  Fail:
+    CUR.error = TT_Err_Invalid_Reference;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* IDEF[]:       Instruction DEFinition                                  */
+  /* Opcode range: 0x89                                                    */
+  /* Stack:        Eint8 -->                                               */
+  /*                                                                       */
+  static void
+  Ins_IDEF( INS_ARG )
+  {
+    TT_DefRecord*  def;
+    TT_DefRecord*  limit;
+
+
+    /*  First of all, look for the same function in our table */
+
+    def   = CUR.IDefs;
+    limit = def + CUR.numIDefs;
+
+    for ( ; def < limit; def++ )
+      if ( def->opc == (FT_ULong)args[0] )
+        break;
+
+    if ( def == limit )
+    {
+      /* check that there is enough room for a new instruction */
+      if ( CUR.numIDefs >= CUR.maxIDefs )
+      {
+        CUR.error = TT_Err_Too_Many_Instruction_Defs;
+        return;
+      }
+      CUR.numIDefs++;
+    }
+
+    /* opcode must be unsigned 8-bit integer */
+    if ( 0 > args[0] || args[0] > 0x00FF )
+    {
+      CUR.error = TT_Err_Too_Many_Instruction_Defs;
+      return;
+    }
+
+    def->opc    = (FT_Byte)args[0];
+    def->start  = CUR.IP + 1;
+    def->range  = CUR.curRange;
+    def->active = TRUE;
+
+    if ( (FT_ULong)args[0] > CUR.maxIns )
+      CUR.maxIns = (FT_Byte)args[0];
+
+    /* Now skip the whole function definition. */
+    /* We don't allow nested IDEFs & FDEFs.    */
+
+    while ( SKIP_Code() == SUCCESS )
+    {
+      switch ( CUR.opcode )
+      {
+      case 0x89:   /* IDEF */
+      case 0x2C:   /* FDEF */
+        CUR.error = TT_Err_Nested_DEFS;
+        return;
+      case 0x2D:   /* ENDF */
+        return;
+      }
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* PUSHING DATA ONTO THE INTERPRETER STACK                               */
+  /*                                                                       */
+  /*   Instructions appear in the specification's order.                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* NPUSHB[]:     PUSH N Bytes                                            */
+  /* Opcode range: 0x40                                                    */
+  /* Stack:        --> uint32...                                           */
+  /*                                                                       */
+  static void
+  Ins_NPUSHB( INS_ARG )
+  {
+    FT_UShort  L, K;
+
+
+    L = (FT_UShort)CUR.code[CUR.IP + 1];
+
+    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+    {
+      CUR.error = TT_Err_Stack_Overflow;
+      return;
+    }
+
+    for ( K = 1; K <= L; K++ )
+      args[K - 1] = CUR.code[CUR.IP + K + 1];
+
+    CUR.new_top += L;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* NPUSHW[]:     PUSH N Words                                            */
+  /* Opcode range: 0x41                                                    */
+  /* Stack:        --> int32...                                            */
+  /*                                                                       */
+  static void
+  Ins_NPUSHW( INS_ARG )
+  {
+    FT_UShort  L, K;
+
+
+    L = (FT_UShort)CUR.code[CUR.IP + 1];
+
+    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+    {
+      CUR.error = TT_Err_Stack_Overflow;
+      return;
+    }
+
+    CUR.IP += 2;
+
+    for ( K = 0; K < L; K++ )
+      args[K] = GET_ShortIns();
+
+    CUR.step_ins = FALSE;
+    CUR.new_top += L;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* PUSHB[abc]:   PUSH Bytes                                              */
+  /* Opcode range: 0xB0-0xB7                                               */
+  /* Stack:        --> uint32...                                           */
+  /*                                                                       */
+  static void
+  Ins_PUSHB( INS_ARG )
+  {
+    FT_UShort  L, K;
+
+
+    L = (FT_UShort)( CUR.opcode - 0xB0 + 1 );
+
+    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+    {
+      CUR.error = TT_Err_Stack_Overflow;
+      return;
+    }
+
+    for ( K = 1; K <= L; K++ )
+      args[K - 1] = CUR.code[CUR.IP + K];
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* PUSHW[abc]:   PUSH Words                                              */
+  /* Opcode range: 0xB8-0xBF                                               */
+  /* Stack:        --> int32...                                            */
+  /*                                                                       */
+  static void
+  Ins_PUSHW( INS_ARG )
+  {
+    FT_UShort  L, K;
+
+
+    L = (FT_UShort)( CUR.opcode - 0xB8 + 1 );
+
+    if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+    {
+      CUR.error = TT_Err_Stack_Overflow;
+      return;
+    }
+
+    CUR.IP++;
+
+    for ( K = 0; K < L; K++ )
+      args[K] = GET_ShortIns();
+
+    CUR.step_ins = FALSE;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MANAGING THE GRAPHICS STATE                                           */
+  /*                                                                       */
+  /*  Instructions appear in the specs' order.                             */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* GC[a]:        Get Coordinate projected onto                           */
+  /* Opcode range: 0x46-0x47                                               */
+  /* Stack:        uint32 --> f26.6                                        */
+  /*                                                                       */
+  /* XXX: UNDOCUMENTED: Measures from the original glyph must be taken     */
+  /*      along the dual projection vector!                                */
+  /*                                                                       */
+  static void
+  Ins_GC( INS_ARG )
+  {
+    FT_ULong    L;
+    FT_F26Dot6  R;
+
+
+    L = (FT_ULong)args[0];
+
+    if ( BOUNDSL( L, CUR.zp2.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      R = 0;
+    }
+    else
+    {
+      if ( CUR.opcode & 1 )
+        R = CUR_fast_dualproj( &CUR.zp2.org[L] );
+      else
+        R = CUR_fast_project( &CUR.zp2.cur[L] );
+    }
+
+    args[0] = R;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SCFS[]:       Set Coordinate From Stack                               */
+  /* Opcode range: 0x48                                                    */
+  /* Stack:        f26.6 uint32 -->                                        */
+  /*                                                                       */
+  /* Formula:                                                              */
+  /*                                                                       */
+  /*   OA := OA + ( value - OA.p )/( f.p ) * f                             */
+  /*                                                                       */
+  static void
+  Ins_SCFS( INS_ARG )
+  {
+    FT_Long    K;
+    FT_UShort  L;
+
+
+    L = (FT_UShort)args[0];
+
+    if ( BOUNDS( L, CUR.zp2.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      return;
+    }
+
+    K = CUR_fast_project( &CUR.zp2.cur[L] );
+
+    CUR_Func_move( &CUR.zp2, L, args[1] - K );
+
+    /* UNDOCUMENTED!  The MS rasterizer does that with */
+    /* twilight points (confirmed by Greg Hitchcock)   */
+    if ( CUR.GS.gep2 == 0 )
+      CUR.zp2.org[L] = CUR.zp2.cur[L];
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MD[a]:        Measure Distance                                        */
+  /* Opcode range: 0x49-0x4A                                               */
+  /* Stack:        uint32 uint32 --> f26.6                                 */
+  /*                                                                       */
+  /* XXX: UNDOCUMENTED: Measure taken in the original glyph must be along  */
+  /*                    the dual projection vector.                        */
+  /*                                                                       */
+  /* XXX: UNDOCUMENTED: Flag attributes are inverted!                      */
+  /*                      0 => measure distance in original outline        */
+  /*                      1 => measure distance in grid-fitted outline     */
+  /*                                                                       */
+  /* XXX: UNDOCUMENTED: `zp0 - zp1', and not `zp2 - zp1!                   */
+  /*                                                                       */
+  static void
+  Ins_MD( INS_ARG )
+  {
+    FT_UShort   K, L;
+    FT_F26Dot6  D;
+
+
+    K = (FT_UShort)args[1];
+    L = (FT_UShort)args[0];
+
+    if ( BOUNDS( L, CUR.zp0.n_points ) ||
+         BOUNDS( K, CUR.zp1.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      D = 0;
+    }
+    else
+    {
+      if ( CUR.opcode & 1 )
+        D = CUR_Func_project( CUR.zp0.cur + L, CUR.zp1.cur + K );
+      else
+      {
+        /* XXX: UNDOCUMENTED: twilight zone special case */
+
+        if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 )
+        {
+          FT_Vector*  vec1 = CUR.zp0.org + L;
+          FT_Vector*  vec2 = CUR.zp1.org + K;
+
+
+          D = CUR_Func_dualproj( vec1, vec2 );
+        }
+        else
+        {
+          FT_Vector*  vec1 = CUR.zp0.orus + L;
+          FT_Vector*  vec2 = CUR.zp1.orus + K;
+
+
+          if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
+          {
+            /* this should be faster */
+            D = CUR_Func_dualproj( vec1, vec2 );
+            D = TT_MULFIX( D, CUR.metrics.x_scale );
+          }
+          else
+          {
+            FT_Vector  vec;
+
+
+            vec.x = TT_MULFIX( vec1->x - vec2->x, CUR.metrics.x_scale );
+            vec.y = TT_MULFIX( vec1->y - vec2->y, CUR.metrics.y_scale );
+
+            D = CUR_fast_dualproj( &vec );
+          }
+        }
+      }
+    }
+
+    args[0] = D;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SDPVTL[a]:    Set Dual PVector to Line                                */
+  /* Opcode range: 0x86-0x87                                               */
+  /* Stack:        uint32 uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_SDPVTL( INS_ARG )
+  {
+    FT_Long    A, B, C;
+    FT_UShort  p1, p2;            /* was FT_Int in pas type ERROR */
+    FT_Int     aOpc = CUR.opcode;
+
+
+    p1 = (FT_UShort)args[1];
+    p2 = (FT_UShort)args[0];
+
+    if ( BOUNDS( p2, CUR.zp1.n_points ) ||
+         BOUNDS( p1, CUR.zp2.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      return;
+    }
+
+    {
+      FT_Vector* v1 = CUR.zp1.org + p2;
+      FT_Vector* v2 = CUR.zp2.org + p1;
+
+
+      A = v1->x - v2->x;
+      B = v1->y - v2->y;
+
+      /* If v1 == v2, SDPVTL behaves the same as */
+      /* SVTCA[X], respectively.                 */
+      /*                                         */
+      /* Confirmed by Greg Hitchcock.            */
+
+      if ( A == 0 && B == 0 )
+      {
+        A    = 0x4000;
+        aOpc = 0;
+      }
+    }
+
+    if ( ( aOpc & 1 ) != 0 )
+    {
+      C =  B;   /* counter clockwise rotation */
+      B =  A;
+      A = -C;
+    }
+
+    NORMalize( A, B, &CUR.GS.dualVector );
+
+    {
+      FT_Vector*  v1 = CUR.zp1.cur + p2;
+      FT_Vector*  v2 = CUR.zp2.cur + p1;
+
+
+      A = v1->x - v2->x;
+      B = v1->y - v2->y;
+    }
+
+    if ( ( aOpc & 1 ) != 0 )
+    {
+      C =  B;   /* counter clockwise rotation */
+      B =  A;
+      A = -C;
+    }
+
+    NORMalize( A, B, &CUR.GS.projVector );
+
+    GUESS_VECTOR( freeVector );
+
+    COMPUTE_Funcs();
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SZP0[]:       Set Zone Pointer 0                                      */
+  /* Opcode range: 0x13                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SZP0( INS_ARG )
+  {
+    switch ( (FT_Int)args[0] )
+    {
+    case 0:
+      CUR.zp0 = CUR.twilight;
+      break;
+
+    case 1:
+      CUR.zp0 = CUR.pts;
+      break;
+
+    default:
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      return;
+    }
+
+    CUR.GS.gep0 = (FT_UShort)args[0];
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SZP1[]:       Set Zone Pointer 1                                      */
+  /* Opcode range: 0x14                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SZP1( INS_ARG )
+  {
+    switch ( (FT_Int)args[0] )
+    {
+    case 0:
+      CUR.zp1 = CUR.twilight;
+      break;
+
+    case 1:
+      CUR.zp1 = CUR.pts;
+      break;
+
+    default:
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      return;
+    }
+
+    CUR.GS.gep1 = (FT_UShort)args[0];
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SZP2[]:       Set Zone Pointer 2                                      */
+  /* Opcode range: 0x15                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SZP2( INS_ARG )
+  {
+    switch ( (FT_Int)args[0] )
+    {
+    case 0:
+      CUR.zp2 = CUR.twilight;
+      break;
+
+    case 1:
+      CUR.zp2 = CUR.pts;
+      break;
+
+    default:
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      return;
+    }
+
+    CUR.GS.gep2 = (FT_UShort)args[0];
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SZPS[]:       Set Zone PointerS                                       */
+  /* Opcode range: 0x16                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SZPS( INS_ARG )
+  {
+    switch ( (FT_Int)args[0] )
+    {
+    case 0:
+      CUR.zp0 = CUR.twilight;
+      break;
+
+    case 1:
+      CUR.zp0 = CUR.pts;
+      break;
+
+    default:
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      return;
+    }
+
+    CUR.zp1 = CUR.zp0;
+    CUR.zp2 = CUR.zp0;
+
+    CUR.GS.gep0 = (FT_UShort)args[0];
+    CUR.GS.gep1 = (FT_UShort)args[0];
+    CUR.GS.gep2 = (FT_UShort)args[0];
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* INSTCTRL[]:   INSTruction ConTRoL                                     */
+  /* Opcode range: 0x8e                                                    */
+  /* Stack:        int32 int32 -->                                         */
+  /*                                                                       */
+  static void
+  Ins_INSTCTRL( INS_ARG )
+  {
+    FT_Long  K, L;
+
+
+    K = args[1];
+    L = args[0];
+
+    if ( K < 1 || K > 2 )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      return;
+    }
+
+    if ( L != 0 )
+        L = K;
+
+    CUR.GS.instruct_control = FT_BOOL(
+      ( (FT_Byte)CUR.GS.instruct_control & ~(FT_Byte)K ) | (FT_Byte)L );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SCANCTRL[]:   SCAN ConTRoL                                            */
+  /* Opcode range: 0x85                                                    */
+  /* Stack:        uint32? -->                                             */
+  /*                                                                       */
+  static void
+  Ins_SCANCTRL( INS_ARG )
+  {
+    FT_Int  A;
+
+
+    /* Get Threshold */
+    A = (FT_Int)( args[0] & 0xFF );
+
+    if ( A == 0xFF )
+    {
+      CUR.GS.scan_control = TRUE;
+      return;
+    }
+    else if ( A == 0 )
+    {
+      CUR.GS.scan_control = FALSE;
+      return;
+    }
+
+    if ( ( args[0] & 0x100 ) != 0 && CUR.tt_metrics.ppem <= A )
+      CUR.GS.scan_control = TRUE;
+
+    if ( ( args[0] & 0x200 ) != 0 && CUR.tt_metrics.rotated )
+      CUR.GS.scan_control = TRUE;
+
+    if ( ( args[0] & 0x400 ) != 0 && CUR.tt_metrics.stretched )
+      CUR.GS.scan_control = TRUE;
+
+    if ( ( args[0] & 0x800 ) != 0 && CUR.tt_metrics.ppem > A )
+      CUR.GS.scan_control = FALSE;
+
+    if ( ( args[0] & 0x1000 ) != 0 && CUR.tt_metrics.rotated )
+      CUR.GS.scan_control = FALSE;
+
+    if ( ( args[0] & 0x2000 ) != 0 && CUR.tt_metrics.stretched )
+      CUR.GS.scan_control = FALSE;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SCANTYPE[]:   SCAN TYPE                                               */
+  /* Opcode range: 0x8D                                                    */
+  /* Stack:        uint32? -->                                             */
+  /*                                                                       */
+  static void
+  Ins_SCANTYPE( INS_ARG )
+  {
+    if ( args[0] >= 0 )
+      CUR.GS.scan_type = (FT_Int)args[0];
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MANAGING OUTLINES                                                     */
+  /*                                                                       */
+  /*   Instructions appear in the specification's order.                   */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FLIPPT[]:     FLIP PoinT                                              */
+  /* Opcode range: 0x80                                                    */
+  /* Stack:        uint32... -->                                           */
+  /*                                                                       */
+  static void
+  Ins_FLIPPT( INS_ARG )
+  {
+    FT_UShort  point;
+
+    FT_UNUSED_ARG;
+
+
+    if ( CUR.top < CUR.GS.loop )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Too_Few_Arguments;
+      goto Fail;
+    }
+
+    while ( CUR.GS.loop > 0 )
+    {
+      CUR.args--;
+
+      point = (FT_UShort)CUR.stack[CUR.args];
+
+      if ( BOUNDS( point, CUR.pts.n_points ) )
+      {
+        if ( CUR.pedantic_hinting )
+        {
+          CUR.error = TT_Err_Invalid_Reference;
+          return;
+        }
+      }
+      else
+        CUR.pts.tags[point] ^= FT_CURVE_TAG_ON;
+
+      CUR.GS.loop--;
+    }
+
+  Fail:
+    CUR.GS.loop = 1;
+    CUR.new_top = CUR.args;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FLIPRGON[]:   FLIP RanGe ON                                           */
+  /* Opcode range: 0x81                                                    */
+  /* Stack:        uint32 uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_FLIPRGON( INS_ARG )
+  {
+    FT_UShort  I, K, L;
+
+
+    K = (FT_UShort)args[1];
+    L = (FT_UShort)args[0];
+
+    if ( BOUNDS( K, CUR.pts.n_points ) ||
+         BOUNDS( L, CUR.pts.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      return;
+    }
+
+    for ( I = L; I <= K; I++ )
+      CUR.pts.tags[I] |= FT_CURVE_TAG_ON;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* FLIPRGOFF:    FLIP RanGe OFF                                          */
+  /* Opcode range: 0x82                                                    */
+  /* Stack:        uint32 uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_FLIPRGOFF( INS_ARG )
+  {
+    FT_UShort  I, K, L;
+
+
+    K = (FT_UShort)args[1];
+    L = (FT_UShort)args[0];
+
+    if ( BOUNDS( K, CUR.pts.n_points ) ||
+         BOUNDS( L, CUR.pts.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      return;
+    }
+
+    for ( I = L; I <= K; I++ )
+      CUR.pts.tags[I] &= ~FT_CURVE_TAG_ON;
+  }
+
+
+  static FT_Bool
+  Compute_Point_Displacement( EXEC_OP_ FT_F26Dot6*   x,
+                                       FT_F26Dot6*   y,
+                                       TT_GlyphZone  zone,
+                                       FT_UShort*    refp )
+  {
+    TT_GlyphZoneRec  zp;
+    FT_UShort        p;
+    FT_F26Dot6       d;
+
+
+    if ( CUR.opcode & 1 )
+    {
+      zp = CUR.zp0;
+      p  = CUR.GS.rp1;
+    }
+    else
+    {
+      zp = CUR.zp1;
+      p  = CUR.GS.rp2;
+    }
+
+    if ( BOUNDS( p, zp.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      *refp = 0;
+      return FAILURE;
+    }
+
+    *zone = zp;
+    *refp = p;
+
+    d = CUR_Func_project( zp.cur + p, zp.org + p );
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    if ( CUR.face->unpatented_hinting )
+    {
+      if ( CUR.GS.both_x_axis )
+      {
+        *x = d;
+        *y = 0;
+      }
+      else
+      {
+        *x = 0;
+        *y = d;
+      }
+    }
+    else
+#endif
+    {
+      *x = TT_MULDIV( d,
+                      (FT_Long)CUR.GS.freeVector.x * 0x10000L,
+                      CUR.F_dot_P );
+      *y = TT_MULDIV( d,
+                      (FT_Long)CUR.GS.freeVector.y * 0x10000L,
+                      CUR.F_dot_P );
+    }
+
+    return SUCCESS;
+  }
+
+
+  static void
+  Move_Zp2_Point( EXEC_OP_ FT_UShort   point,
+                           FT_F26Dot6  dx,
+                           FT_F26Dot6  dy,
+                           FT_Bool     touch )
+  {
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    if ( CUR.face->unpatented_hinting )
+    {
+      if ( CUR.GS.both_x_axis )
+      {
+        CUR.zp2.cur[point].x += dx;
+        if ( touch )
+          CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;
+      }
+      else
+      {
+        CUR.zp2.cur[point].y += dy;
+        if ( touch )
+          CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;
+      }
+      return;
+    }
+#endif
+
+    if ( CUR.GS.freeVector.x != 0 )
+    {
+      CUR.zp2.cur[point].x += dx;
+      if ( touch )
+        CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;
+    }
+
+    if ( CUR.GS.freeVector.y != 0 )
+    {
+      CUR.zp2.cur[point].y += dy;
+      if ( touch )
+        CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SHP[a]:       SHift Point by the last point                           */
+  /* Opcode range: 0x32-0x33                                               */
+  /* Stack:        uint32... -->                                           */
+  /*                                                                       */
+  static void
+  Ins_SHP( INS_ARG )
+  {
+    TT_GlyphZoneRec  zp;
+    FT_UShort        refp;
+
+    FT_F26Dot6       dx,
+                     dy;
+    FT_UShort        point;
+
+    FT_UNUSED_ARG;
+
+
+    if ( CUR.top < CUR.GS.loop )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      goto Fail;
+    }
+
+    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
+      return;
+
+    while ( CUR.GS.loop > 0 )
+    {
+      CUR.args--;
+      point = (FT_UShort)CUR.stack[CUR.args];
+
+      if ( BOUNDS( point, CUR.zp2.n_points ) )
+      {
+        if ( CUR.pedantic_hinting )
+        {
+          CUR.error = TT_Err_Invalid_Reference;
+          return;
+        }
+      }
+      else
+        MOVE_Zp2_Point( point, dx, dy, TRUE );
+
+      CUR.GS.loop--;
+    }
+
+  Fail:
+    CUR.GS.loop = 1;
+    CUR.new_top = CUR.args;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SHC[a]:       SHift Contour                                           */
+  /* Opcode range: 0x34-35                                                 */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  /* UNDOCUMENTED: According to Greg Hitchcock, there is one (virtual)     */
+  /*               contour in the twilight zone, namely contour number     */
+  /*               zero.                                                   */
+  /*                                                                       */
+  static void
+  Ins_SHC( INS_ARG )
+  {
+    TT_GlyphZoneRec  zp;
+    FT_UShort        refp;
+    FT_F26Dot6       dx, dy;
+
+    FT_Short         contour, bounds;
+    FT_UShort        start, limit, i;
+
+
+    contour = (FT_UShort)args[0];
+    bounds  = ( CUR.GS.gep2 == 0 ) ? 1 : CUR.zp2.n_contours;
+
+    if ( BOUNDS( contour, bounds ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      return;
+    }
+
+    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
+      return;
+
+    if ( contour == 0 )
+      start = 0;
+    else
+      start = (FT_UShort)( CUR.zp2.contours[contour - 1] + 1 -
+                           CUR.zp2.first_point );
+
+    /* we use the number of points if in the twilight zone */
+    if ( CUR.GS.gep2 == 0 )
+      limit = CUR.zp2.n_points;
+    else
+      limit = (FT_UShort)( CUR.zp2.contours[contour] -
+                           CUR.zp2.first_point + 1 );
+
+    for ( i = start; i < limit; i++ )
+    {
+      if ( zp.cur != CUR.zp2.cur || refp != i )
+        MOVE_Zp2_Point( i, dx, dy, TRUE );
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SHZ[a]:       SHift Zone                                              */
+  /* Opcode range: 0x36-37                                                 */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_SHZ( INS_ARG )
+  {
+    TT_GlyphZoneRec  zp;
+    FT_UShort        refp;
+    FT_F26Dot6       dx,
+                     dy;
+
+    FT_UShort        limit, i;
+
+
+    if ( BOUNDS( args[0], 2 ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      return;
+    }
+
+    if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
+      return;
+
+    /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points.     */
+    /*      Twilight zone has no real contours, so use `n_points'. */
+    /*      Normal zone's `n_points' includes phantoms, so must    */
+    /*      use end of last contour.                               */
+    if ( CUR.GS.gep2 == 0 )
+      limit = (FT_UShort)CUR.zp2.n_points;
+    else if ( CUR.GS.gep2 == 1 && CUR.zp2.n_contours > 0 )
+      limit = (FT_UShort)( CUR.zp2.contours[CUR.zp2.n_contours - 1] + 1 );
+    else
+      limit = 0;
+
+    /* XXX: UNDOCUMENTED! SHZ doesn't touch the points */
+    for ( i = 0; i < limit; i++ )
+    {
+      if ( zp.cur != CUR.zp2.cur || refp != i )
+        MOVE_Zp2_Point( i, dx, dy, FALSE );
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* SHPIX[]:      SHift points by a PIXel amount                          */
+  /* Opcode range: 0x38                                                    */
+  /* Stack:        f26.6 uint32... -->                                     */
+  /*                                                                       */
+  static void
+  Ins_SHPIX( INS_ARG )
+  {
+    FT_F26Dot6  dx, dy;
+    FT_UShort   point;
+
+
+    if ( CUR.top < CUR.GS.loop + 1 )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      goto Fail;
+    }
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    if ( CUR.face->unpatented_hinting )
+    {
+      if ( CUR.GS.both_x_axis )
+      {
+        dx = TT_MulFix14( (FT_UInt32)args[0], 0x4000 );
+        dy = 0;
+      }
+      else
+      {
+        dx = 0;
+        dy = TT_MulFix14( (FT_UInt32)args[0], 0x4000 );
+      }
+    }
+    else
+#endif
+    {
+      dx = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.x );
+      dy = TT_MulFix14( (FT_UInt32)args[0], CUR.GS.freeVector.y );
+    }
+
+    while ( CUR.GS.loop > 0 )
+    {
+      CUR.args--;
+
+      point = (FT_UShort)CUR.stack[CUR.args];
+
+      if ( BOUNDS( point, CUR.zp2.n_points ) )
+      {
+        if ( CUR.pedantic_hinting )
+        {
+          CUR.error = TT_Err_Invalid_Reference;
+          return;
+        }
+      }
+      else
+        MOVE_Zp2_Point( point, dx, dy, TRUE );
+
+      CUR.GS.loop--;
+    }
+
+  Fail:
+    CUR.GS.loop = 1;
+    CUR.new_top = CUR.args;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MSIRP[a]:     Move Stack Indirect Relative Position                   */
+  /* Opcode range: 0x3A-0x3B                                               */
+  /* Stack:        f26.6 uint32 -->                                        */
+  /*                                                                       */
+  static void
+  Ins_MSIRP( INS_ARG )
+  {
+    FT_UShort   point;
+    FT_F26Dot6  distance;
+
+
+    point = (FT_UShort)args[0];
+
+    if ( BOUNDS( point,      CUR.zp1.n_points ) ||
+         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      return;
+    }
+
+    /* UNDOCUMENTED!  The MS rasterizer does that with */
+    /* twilight points (confirmed by Greg Hitchcock)   */
+    if ( CUR.GS.gep1 == 0 )
+    {
+      CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0];
+      CUR_Func_move_orig( &CUR.zp1, point, args[1] );
+      CUR.zp1.cur[point] = CUR.zp1.org[point];
+    }
+
+    distance = CUR_Func_project( CUR.zp1.cur + point,
+                                 CUR.zp0.cur + CUR.GS.rp0 );
+
+    CUR_Func_move( &CUR.zp1, point, args[1] - distance );
+
+    CUR.GS.rp1 = CUR.GS.rp0;
+    CUR.GS.rp2 = point;
+
+    if ( ( CUR.opcode & 1 ) != 0 )
+      CUR.GS.rp0 = point;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MDAP[a]:      Move Direct Absolute Point                              */
+  /* Opcode range: 0x2E-0x2F                                               */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_MDAP( INS_ARG )
+  {
+    FT_UShort   point;
+    FT_F26Dot6  cur_dist,
+                distance;
+
+
+    point = (FT_UShort)args[0];
+
+    if ( BOUNDS( point, CUR.zp0.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      return;
+    }
+
+    if ( ( CUR.opcode & 1 ) != 0 )
+    {
+      cur_dist = CUR_fast_project( &CUR.zp0.cur[point] );
+      distance = CUR_Func_round( cur_dist,
+                                 CUR.tt_metrics.compensations[0] ) - cur_dist;
+    }
+    else
+      distance = 0;
+
+    CUR_Func_move( &CUR.zp0, point, distance );
+
+    CUR.GS.rp0 = point;
+    CUR.GS.rp1 = point;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MIAP[a]:      Move Indirect Absolute Point                            */
+  /* Opcode range: 0x3E-0x3F                                               */
+  /* Stack:        uint32 uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_MIAP( INS_ARG )
+  {
+    FT_ULong    cvtEntry;
+    FT_UShort   point;
+    FT_F26Dot6  distance,
+                org_dist;
+
+
+    cvtEntry = (FT_ULong)args[1];
+    point    = (FT_UShort)args[0];
+
+    if ( BOUNDS( point,     CUR.zp0.n_points ) ||
+         BOUNDSL( cvtEntry, CUR.cvtSize )      )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      goto Fail;
+    }
+
+    /* UNDOCUMENTED!                                                      */
+    /*                                                                    */
+    /* The behaviour of an MIAP instruction is quite different when used  */
+    /* in the twilight zone.                                              */
+    /*                                                                    */
+    /* First, no control value cut-in test is performed as it would fail  */
+    /* anyway.  Second, the original point, i.e. (org_x,org_y) of         */
+    /* zp0.point, is set to the absolute, unrounded distance found in the */
+    /* CVT.                                                               */
+    /*                                                                    */
+    /* This is used in the CVT programs of the Microsoft fonts Arial,     */
+    /* Times, etc., in order to re-adjust some key font heights.  It      */
+    /* allows the use of the IP instruction in the twilight zone, which   */
+    /* otherwise would be invalid according to the specification.         */
+    /*                                                                    */
+    /* We implement it with a special sequence for the twilight zone.     */
+    /* This is a bad hack, but it seems to work.                          */
+    /*                                                                    */
+    /* Confirmed by Greg Hitchcock.                                       */
+
+    distance = CUR_Func_read_cvt( cvtEntry );
+
+    if ( CUR.GS.gep0 == 0 )   /* If in twilight zone */
+    {
+      CUR.zp0.org[point].x = TT_MulFix14( (FT_UInt32)distance,
+                                          CUR.GS.freeVector.x );
+      CUR.zp0.org[point].y = TT_MulFix14( (FT_UInt32)distance,
+                                          CUR.GS.freeVector.y ),
+      CUR.zp0.cur[point]   = CUR.zp0.org[point];
+    }
+
+    org_dist = CUR_fast_project( &CUR.zp0.cur[point] );
+
+    if ( ( CUR.opcode & 1 ) != 0 )   /* rounding and control cutin flag */
+    {
+      if ( FT_ABS( distance - org_dist ) > CUR.GS.control_value_cutin )
+        distance = org_dist;
+
+      distance = CUR_Func_round( distance, CUR.tt_metrics.compensations[0] );
+    }
+
+    CUR_Func_move( &CUR.zp0, point, distance - org_dist );
+
+  Fail:
+    CUR.GS.rp0 = point;
+    CUR.GS.rp1 = point;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MDRP[abcde]:  Move Direct Relative Point                              */
+  /* Opcode range: 0xC0-0xDF                                               */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_MDRP( INS_ARG )
+  {
+    FT_UShort   point;
+    FT_F26Dot6  org_dist, distance;
+
+
+    point = (FT_UShort)args[0];
+
+    if ( BOUNDS( point,      CUR.zp1.n_points ) ||
+         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      goto Fail;
+    }
+
+    /* XXX: Is there some undocumented feature while in the */
+    /*      twilight zone?                                  */
+
+    /* XXX: UNDOCUMENTED: twilight zone special case */
+
+    if ( CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 )
+    {
+      FT_Vector*  vec1 = &CUR.zp1.org[point];
+      FT_Vector*  vec2 = &CUR.zp0.org[CUR.GS.rp0];
+
+
+      org_dist = CUR_Func_dualproj( vec1, vec2 );
+    }
+    else
+    {
+      FT_Vector*  vec1 = &CUR.zp1.orus[point];
+      FT_Vector*  vec2 = &CUR.zp0.orus[CUR.GS.rp0];
+
+
+      if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
+      {
+        /* this should be faster */
+        org_dist = CUR_Func_dualproj( vec1, vec2 );
+        org_dist = TT_MULFIX( org_dist, CUR.metrics.x_scale );
+      }
+      else
+      {
+        FT_Vector  vec;
+
+
+        vec.x = TT_MULFIX( vec1->x - vec2->x, CUR.metrics.x_scale );
+        vec.y = TT_MULFIX( vec1->y - vec2->y, CUR.metrics.y_scale );
+
+        org_dist = CUR_fast_dualproj( &vec );
+      }
+    }
+
+    /* single width cut-in test */
+
+    if ( FT_ABS( org_dist - CUR.GS.single_width_value ) <
+         CUR.GS.single_width_cutin )
+    {
+      if ( org_dist >= 0 )
+        org_dist = CUR.GS.single_width_value;
+      else
+        org_dist = -CUR.GS.single_width_value;
+    }
+
+    /* round flag */
+
+    if ( ( CUR.opcode & 4 ) != 0 )
+      distance = CUR_Func_round(
+                   org_dist,
+                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
+    else
+      distance = ROUND_None(
+                   org_dist,
+                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
+
+    /* minimum distance flag */
+
+    if ( ( CUR.opcode & 8 ) != 0 )
+    {
+      if ( org_dist >= 0 )
+      {
+        if ( distance < CUR.GS.minimum_distance )
+          distance = CUR.GS.minimum_distance;
+      }
+      else
+      {
+        if ( distance > -CUR.GS.minimum_distance )
+          distance = -CUR.GS.minimum_distance;
+      }
+    }
+
+    /* now move the point */
+
+    org_dist = CUR_Func_project( CUR.zp1.cur + point,
+                                 CUR.zp0.cur + CUR.GS.rp0 );
+
+    CUR_Func_move( &CUR.zp1, point, distance - org_dist );
+
+  Fail:
+    CUR.GS.rp1 = CUR.GS.rp0;
+    CUR.GS.rp2 = point;
+
+    if ( ( CUR.opcode & 16 ) != 0 )
+      CUR.GS.rp0 = point;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MIRP[abcde]:  Move Indirect Relative Point                            */
+  /* Opcode range: 0xE0-0xFF                                               */
+  /* Stack:        int32? uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_MIRP( INS_ARG )
+  {
+    FT_UShort   point;
+    FT_ULong    cvtEntry;
+
+    FT_F26Dot6  cvt_dist,
+                distance,
+                cur_dist,
+                org_dist;
+
+
+    point    = (FT_UShort)args[0];
+    cvtEntry = (FT_ULong)( args[1] + 1 );
+
+    /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */
+
+    if ( BOUNDS( point,      CUR.zp1.n_points ) ||
+         BOUNDSL( cvtEntry,  CUR.cvtSize + 1 )  ||
+         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      goto Fail;
+    }
+
+    if ( !cvtEntry )
+      cvt_dist = 0;
+    else
+      cvt_dist = CUR_Func_read_cvt( cvtEntry - 1 );
+
+    /* single width test */
+
+    if ( FT_ABS( cvt_dist - CUR.GS.single_width_value ) <
+         CUR.GS.single_width_cutin )
+    {
+      if ( cvt_dist >= 0 )
+        cvt_dist =  CUR.GS.single_width_value;
+      else
+        cvt_dist = -CUR.GS.single_width_value;
+    }
+
+    /* UNDOCUMENTED!  The MS rasterizer does that with */
+    /* twilight points (confirmed by Greg Hitchcock)   */
+    if ( CUR.GS.gep1 == 0 )
+    {
+      CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x +
+                             TT_MulFix14( (FT_UInt32)cvt_dist,
+                                          CUR.GS.freeVector.x );
+      CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y +
+                             TT_MulFix14( (FT_UInt32)cvt_dist,
+                                          CUR.GS.freeVector.y );
+      CUR.zp1.cur[point]   = CUR.zp1.org[point];
+    }
+
+    org_dist = CUR_Func_dualproj( &CUR.zp1.org[point],
+                                  &CUR.zp0.org[CUR.GS.rp0] );
+    cur_dist = CUR_Func_project ( &CUR.zp1.cur[point],
+                                  &CUR.zp0.cur[CUR.GS.rp0] );
+
+    /* auto-flip test */
+
+    if ( CUR.GS.auto_flip )
+    {
+      if ( ( org_dist ^ cvt_dist ) < 0 )
+        cvt_dist = -cvt_dist;
+    }
+
+    /* control value cutin and round */
+
+    if ( ( CUR.opcode & 4 ) != 0 )
+    {
+      /* XXX: UNDOCUMENTED!  Only perform cut-in test when both points */
+      /*      refer to the same zone.                                  */
+
+      if ( CUR.GS.gep0 == CUR.GS.gep1 )
+      {
+        /* XXX: According to Greg Hitchcock, the following wording is */
+        /*      the right one:                                        */
+        /*                                                            */
+        /*        When the absolute difference between the value in   */
+        /*        the table [CVT] and the measurement directly from   */
+        /*        the outline is _greater_ than the cut_in value, the */
+        /*        outline measurement is used.                        */
+        /*                                                            */
+        /*      This is from `instgly.doc'.  The description in       */
+        /*      `ttinst2.doc', version 1.66, is thus incorrect since  */
+        /*      it implies `>=' instead of `>'.                       */
+
+        if ( FT_ABS( cvt_dist - org_dist ) > CUR.GS.control_value_cutin )
+          cvt_dist = org_dist;
+      }
+
+      distance = CUR_Func_round(
+                   cvt_dist,
+                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
+    }
+    else
+      distance = ROUND_None(
+                   cvt_dist,
+                   CUR.tt_metrics.compensations[CUR.opcode & 3] );
+
+    /* minimum distance test */
+
+    if ( ( CUR.opcode & 8 ) != 0 )
+    {
+      if ( org_dist >= 0 )
+      {
+        if ( distance < CUR.GS.minimum_distance )
+          distance = CUR.GS.minimum_distance;
+      }
+      else
+      {
+        if ( distance > -CUR.GS.minimum_distance )
+          distance = -CUR.GS.minimum_distance;
+      }
+    }
+
+    CUR_Func_move( &CUR.zp1, point, distance - cur_dist );
+
+  Fail:
+    CUR.GS.rp1 = CUR.GS.rp0;
+
+    if ( ( CUR.opcode & 16 ) != 0 )
+      CUR.GS.rp0 = point;
+
+    CUR.GS.rp2 = point;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ALIGNRP[]:    ALIGN Relative Point                                    */
+  /* Opcode range: 0x3C                                                    */
+  /* Stack:        uint32 uint32... -->                                    */
+  /*                                                                       */
+  static void
+  Ins_ALIGNRP( INS_ARG )
+  {
+    FT_UShort   point;
+    FT_F26Dot6  distance;
+
+    FT_UNUSED_ARG;
+
+
+    if ( CUR.top < CUR.GS.loop ||
+         BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      goto Fail;
+    }
+
+    while ( CUR.GS.loop > 0 )
+    {
+      CUR.args--;
+
+      point = (FT_UShort)CUR.stack[CUR.args];
+
+      if ( BOUNDS( point, CUR.zp1.n_points ) )
+      {
+        if ( CUR.pedantic_hinting )
+        {
+          CUR.error = TT_Err_Invalid_Reference;
+          return;
+        }
+      }
+      else
+      {
+        distance = CUR_Func_project( CUR.zp1.cur + point,
+                                     CUR.zp0.cur + CUR.GS.rp0 );
+
+        CUR_Func_move( &CUR.zp1, point, -distance );
+      }
+
+      CUR.GS.loop--;
+    }
+
+  Fail:
+    CUR.GS.loop = 1;
+    CUR.new_top = CUR.args;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ISECT[]:      moves point to InterSECTion                             */
+  /* Opcode range: 0x0F                                                    */
+  /* Stack:        5 * uint32 -->                                          */
+  /*                                                                       */
+  static void
+  Ins_ISECT( INS_ARG )
+  {
+    FT_UShort   point,
+                a0, a1,
+                b0, b1;
+
+    FT_F26Dot6  discriminant;
+
+    FT_F26Dot6  dx,  dy,
+                dax, day,
+                dbx, dby;
+
+    FT_F26Dot6  val;
+
+    FT_Vector   R;
+
+
+    point = (FT_UShort)args[0];
+
+    a0 = (FT_UShort)args[1];
+    a1 = (FT_UShort)args[2];
+    b0 = (FT_UShort)args[3];
+    b1 = (FT_UShort)args[4];
+
+    if ( BOUNDS( b0, CUR.zp0.n_points )  ||
+         BOUNDS( b1, CUR.zp0.n_points )  ||
+         BOUNDS( a0, CUR.zp1.n_points )  ||
+         BOUNDS( a1, CUR.zp1.n_points )  ||
+         BOUNDS( point, CUR.zp2.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      return;
+    }
+
+    dbx = CUR.zp0.cur[b1].x - CUR.zp0.cur[b0].x;
+    dby = CUR.zp0.cur[b1].y - CUR.zp0.cur[b0].y;
+
+    dax = CUR.zp1.cur[a1].x - CUR.zp1.cur[a0].x;
+    day = CUR.zp1.cur[a1].y - CUR.zp1.cur[a0].y;
+
+    dx = CUR.zp0.cur[b0].x - CUR.zp1.cur[a0].x;
+    dy = CUR.zp0.cur[b0].y - CUR.zp1.cur[a0].y;
+
+    CUR.zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH;
+
+    discriminant = TT_MULDIV( dax, -dby, 0x40 ) +
+                   TT_MULDIV( day, dbx, 0x40 );
+
+    if ( FT_ABS( discriminant ) >= 0x40 )
+    {
+      val = TT_MULDIV( dx, -dby, 0x40 ) + TT_MULDIV( dy, dbx, 0x40 );
+
+      R.x = TT_MULDIV( val, dax, discriminant );
+      R.y = TT_MULDIV( val, day, discriminant );
+
+      CUR.zp2.cur[point].x = CUR.zp1.cur[a0].x + R.x;
+      CUR.zp2.cur[point].y = CUR.zp1.cur[a0].y + R.y;
+    }
+    else
+    {
+      /* else, take the middle of the middles of A and B */
+
+      CUR.zp2.cur[point].x = ( CUR.zp1.cur[a0].x +
+                               CUR.zp1.cur[a1].x +
+                               CUR.zp0.cur[b0].x +
+                               CUR.zp0.cur[b1].x ) / 4;
+      CUR.zp2.cur[point].y = ( CUR.zp1.cur[a0].y +
+                               CUR.zp1.cur[a1].y +
+                               CUR.zp0.cur[b0].y +
+                               CUR.zp0.cur[b1].y ) / 4;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* ALIGNPTS[]:   ALIGN PoinTS                                            */
+  /* Opcode range: 0x27                                                    */
+  /* Stack:        uint32 uint32 -->                                       */
+  /*                                                                       */
+  static void
+  Ins_ALIGNPTS( INS_ARG )
+  {
+    FT_UShort   p1, p2;
+    FT_F26Dot6  distance;
+
+
+    p1 = (FT_UShort)args[0];
+    p2 = (FT_UShort)args[1];
+
+    if ( BOUNDS( p1, CUR.zp1.n_points ) ||
+         BOUNDS( p2, CUR.zp0.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      return;
+    }
+
+    distance = CUR_Func_project( CUR.zp0.cur + p2,
+                                 CUR.zp1.cur + p1 ) / 2;
+
+    CUR_Func_move( &CUR.zp1, p1, distance );
+    CUR_Func_move( &CUR.zp0, p2, -distance );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* IP[]:         Interpolate Point                                       */
+  /* Opcode range: 0x39                                                    */
+  /* Stack:        uint32... -->                                           */
+  /*                                                                       */
+
+  /* SOMETIMES, DUMBER CODE IS BETTER CODE */
+
+  static void
+  Ins_IP( INS_ARG )
+  {
+    FT_F26Dot6  old_range, cur_range;
+    FT_Vector*  orus_base;
+    FT_Vector*  cur_base;
+    FT_Int      twilight;
+
+    FT_UNUSED_ARG;
+
+
+    if ( CUR.top < CUR.GS.loop )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      goto Fail;
+    }
+
+    /*
+     * We need to deal in a special way with the twilight zone.
+     * Otherwise, by definition, the value of CUR.twilight.orus[n] is (0,0),
+     * for every n.
+     */
+    twilight = CUR.GS.gep0 == 0 || CUR.GS.gep1 == 0 || CUR.GS.gep2 == 0;
+
+    if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      goto Fail;
+    }
+
+    if ( twilight )
+      orus_base = &CUR.zp0.org[CUR.GS.rp1];
+    else
+      orus_base = &CUR.zp0.orus[CUR.GS.rp1];
+
+    cur_base = &CUR.zp0.cur[CUR.GS.rp1];
+
+    /* XXX: There are some glyphs in some braindead but popular */
+    /*      fonts out there (e.g. [aeu]grave in monotype.ttf)   */
+    /*      calling IP[] with bad values of rp[12].             */
+    /*      Do something sane when this odd thing happens.      */
+    if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) ||
+         BOUNDS( CUR.GS.rp2, CUR.zp1.n_points ) )
+    {
+      old_range = 0;
+      cur_range = 0;
+    }
+    else
+    {
+      if ( twilight )
+        old_range = CUR_Func_dualproj( &CUR.zp1.org[CUR.GS.rp2],
+                                       orus_base );
+      else if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
+        old_range = CUR_Func_dualproj( &CUR.zp1.orus[CUR.GS.rp2],
+                                       orus_base );
+      else
+      {
+        FT_Vector  vec;
+
+
+        vec.x = TT_MULFIX( CUR.zp1.orus[CUR.GS.rp2].x - orus_base->x,
+                           CUR.metrics.x_scale );
+        vec.y = TT_MULFIX( CUR.zp1.orus[CUR.GS.rp2].y - orus_base->y,
+                           CUR.metrics.y_scale );
+
+        old_range = CUR_fast_dualproj( &vec );
+      }
+
+      cur_range = CUR_Func_project ( &CUR.zp1.cur[CUR.GS.rp2], cur_base );
+    }
+
+    for ( ; CUR.GS.loop > 0; --CUR.GS.loop )
+    {
+      FT_UInt     point = (FT_UInt)CUR.stack[--CUR.args];
+      FT_F26Dot6  org_dist, cur_dist, new_dist;
+
+
+      /* check point bounds */
+      if ( BOUNDS( point, CUR.zp2.n_points ) )
+      {
+        if ( CUR.pedantic_hinting )
+        {
+          CUR.error = TT_Err_Invalid_Reference;
+          return;
+        }
+        continue;
+      }
+
+      if ( twilight )
+        org_dist = CUR_Func_dualproj( &CUR.zp2.org[point], orus_base );
+      else if ( CUR.metrics.x_scale == CUR.metrics.y_scale )
+        org_dist = CUR_Func_dualproj( &CUR.zp2.orus[point], orus_base );
+      else
+      {
+        FT_Vector  vec;
+
+
+        vec.x = TT_MULFIX( CUR.zp2.orus[point].x - orus_base->x,
+                           CUR.metrics.x_scale );
+        vec.y = TT_MULFIX( CUR.zp2.orus[point].y - orus_base->y,
+                           CUR.metrics.y_scale );
+
+        org_dist = CUR_fast_dualproj( &vec );
+      }
+
+      cur_dist = CUR_Func_project ( &CUR.zp2.cur[point], cur_base );
+
+      if ( org_dist )
+        new_dist = ( old_range != 0 )
+                     ? TT_MULDIV( org_dist, cur_range, old_range )
+                     : cur_dist;
+      else
+        new_dist = 0;
+
+      CUR_Func_move( &CUR.zp2, (FT_UShort)point, new_dist - cur_dist );
+    }
+
+  Fail:
+    CUR.GS.loop = 1;
+    CUR.new_top = CUR.args;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* UTP[a]:       UnTouch Point                                           */
+  /* Opcode range: 0x29                                                    */
+  /* Stack:        uint32 -->                                              */
+  /*                                                                       */
+  static void
+  Ins_UTP( INS_ARG )
+  {
+    FT_UShort  point;
+    FT_Byte    mask;
+
+
+    point = (FT_UShort)args[0];
+
+    if ( BOUNDS( point, CUR.zp0.n_points ) )
+    {
+      if ( CUR.pedantic_hinting )
+        CUR.error = TT_Err_Invalid_Reference;
+      return;
+    }
+
+    mask = 0xFF;
+
+    if ( CUR.GS.freeVector.x != 0 )
+      mask &= ~FT_CURVE_TAG_TOUCH_X;
+
+    if ( CUR.GS.freeVector.y != 0 )
+      mask &= ~FT_CURVE_TAG_TOUCH_Y;
+
+    CUR.zp0.tags[point] &= mask;
+  }
+
+
+  /* Local variables for Ins_IUP: */
+  typedef struct  IUP_WorkerRec_
+  {
+    FT_Vector*  orgs;   /* original and current coordinate */
+    FT_Vector*  curs;   /* arrays                          */
+    FT_Vector*  orus;
+    FT_UInt     max_points;
+
+  } IUP_WorkerRec, *IUP_Worker;
+
+
+  static void
+  _iup_worker_shift( IUP_Worker  worker,
+                     FT_UInt     p1,
+                     FT_UInt     p2,
+                     FT_UInt     p )
+  {
+    FT_UInt     i;
+    FT_F26Dot6  dx;
+
+
+    dx = worker->curs[p].x - worker->orgs[p].x;
+    if ( dx != 0 )
+    {
+      for ( i = p1; i < p; i++ )
+        worker->curs[i].x += dx;
+
+      for ( i = p + 1; i <= p2; i++ )
+        worker->curs[i].x += dx;
+    }
+  }
+
+
+  static void
+  _iup_worker_interpolate( IUP_Worker  worker,
+                           FT_UInt     p1,
+                           FT_UInt     p2,
+                           FT_UInt     ref1,
+                           FT_UInt     ref2 )
+  {
+    FT_UInt     i;
+    FT_F26Dot6  orus1, orus2, org1, org2, delta1, delta2;
+
+
+    if ( p1 > p2 )
+      return;
+
+    if ( BOUNDS( ref1, worker->max_points ) ||
+         BOUNDS( ref2, worker->max_points ) )
+      return;
+
+    orus1 = worker->orus[ref1].x;
+    orus2 = worker->orus[ref2].x;
+
+    if ( orus1 > orus2 )
+    {
+      FT_F26Dot6  tmp_o;
+      FT_UInt     tmp_r;
+
+
+      tmp_o = orus1;
+      orus1 = orus2;
+      orus2 = tmp_o;
+
+      tmp_r = ref1;
+      ref1  = ref2;
+      ref2  = tmp_r;
+    }
+
+    org1   = worker->orgs[ref1].x;
+    org2   = worker->orgs[ref2].x;
+    delta1 = worker->curs[ref1].x - org1;
+    delta2 = worker->curs[ref2].x - org2;
+
+    if ( orus1 == orus2 )
+    {
+      /* simple shift of untouched points */
+      for ( i = p1; i <= p2; i++ )
+      {
+        FT_F26Dot6  x = worker->orgs[i].x;
+
+
+        if ( x <= org1 )
+          x += delta1;
+        else
+          x += delta2;
+
+        worker->curs[i].x = x;
+      }
+    }
+    else
+    {
+      FT_Fixed  scale       = 0;
+      FT_Bool   scale_valid = 0;
+
+
+      /* interpolation */
+      for ( i = p1; i <= p2; i++ )
+      {
+        FT_F26Dot6  x = worker->orgs[i].x;
+
+
+        if ( x <= org1 )
+          x += delta1;
+
+        else if ( x >= org2 )
+          x += delta2;
+
+        else
+        {
+          if ( !scale_valid )
+          {
+            scale_valid = 1;
+            scale       = TT_MULDIV( org2 + delta2 - ( org1 + delta1 ),
+                                     0x10000L, orus2 - orus1 );
+          }
+
+          x = ( org1 + delta1 ) +
+              TT_MULFIX( worker->orus[i].x - orus1, scale );
+        }
+        worker->curs[i].x = x;
+      }
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* IUP[a]:       Interpolate Untouched Points                            */
+  /* Opcode range: 0x30-0x31                                               */
+  /* Stack:        -->                                                     */
+  /*                                                                       */
+  static void
+  Ins_IUP( INS_ARG )
+  {
+    IUP_WorkerRec  V;
+    FT_Byte        mask;
+
+    FT_UInt   first_point;   /* first point of contour        */
+    FT_UInt   end_point;     /* end point (last+1) of contour */
+
+    FT_UInt   first_touched; /* first touched point in contour   */
+    FT_UInt   cur_touched;   /* current touched point in contour */
+
+    FT_UInt   point;         /* current point   */
+    FT_Short  contour;       /* current contour */
+
+    FT_UNUSED_ARG;
+
+
+    /* ignore empty outlines */
+    if ( CUR.pts.n_contours == 0 )
+      return;
+
+    if ( CUR.opcode & 1 )
+    {
+      mask   = FT_CURVE_TAG_TOUCH_X;
+      V.orgs = CUR.pts.org;
+      V.curs = CUR.pts.cur;
+      V.orus = CUR.pts.orus;
+    }
+    else
+    {
+      mask   = FT_CURVE_TAG_TOUCH_Y;
+      V.orgs = (FT_Vector*)( (FT_Pos*)CUR.pts.org + 1 );
+      V.curs = (FT_Vector*)( (FT_Pos*)CUR.pts.cur + 1 );
+      V.orus = (FT_Vector*)( (FT_Pos*)CUR.pts.orus + 1 );
+    }
+    V.max_points = CUR.pts.n_points;
+
+    contour = 0;
+    point   = 0;
+
+    do
+    {
+      end_point   = CUR.pts.contours[contour] - CUR.pts.first_point;
+      first_point = point;
+
+      if ( BOUNDS ( end_point, CUR.pts.n_points ) )
+        end_point = CUR.pts.n_points - 1;
+
+      while ( point <= end_point && ( CUR.pts.tags[point] & mask ) == 0 )
+        point++;
+
+      if ( point <= end_point )
+      {
+        first_touched = point;
+        cur_touched   = point;
+
+        point++;
+
+        while ( point <= end_point )
+        {
+          if ( ( CUR.pts.tags[point] & mask ) != 0 )
+          {
+            _iup_worker_interpolate( &V,
+                                     cur_touched + 1,
+                                     point - 1,
+                                     cur_touched,
+                                     point );
+            cur_touched = point;
+          }
+
+          point++;
+        }
+
+        if ( cur_touched == first_touched )
+          _iup_worker_shift( &V, first_point, end_point, cur_touched );
+        else
+        {
+          _iup_worker_interpolate( &V,
+                                   (FT_UShort)( cur_touched + 1 ),
+                                   end_point,
+                                   cur_touched,
+                                   first_touched );
+
+          if ( first_touched > 0 )
+            _iup_worker_interpolate( &V,
+                                     first_point,
+                                     first_touched - 1,
+                                     cur_touched,
+                                     first_touched );
+        }
+      }
+      contour++;
+    } while ( contour < CUR.pts.n_contours );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* DELTAPn[]:    DELTA exceptions P1, P2, P3                             */
+  /* Opcode range: 0x5D,0x71,0x72                                          */
+  /* Stack:        uint32 (2 * uint32)... -->                              */
+  /*                                                                       */
+  static void
+  Ins_DELTAP( INS_ARG )
+  {
+    FT_ULong   k, nump;
+    FT_UShort  A;
+    FT_ULong   C;
+    FT_Long    B;
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    /* Delta hinting is covered by US Patent 5159668. */
+    if ( CUR.face->unpatented_hinting )
+    {
+      FT_Long  n = args[0] * 2;
+
+
+      if ( CUR.args < n )
+      {
+        if ( CUR.pedantic_hinting )
+          CUR.error = TT_Err_Too_Few_Arguments;
+        n = CUR.args;
+      }
+
+      CUR.args -= n;
+      CUR.new_top = CUR.args;
+      return;
+    }
+#endif
+
+    nump = (FT_ULong)args[0];   /* some points theoretically may occur more
+                                   than once, thus UShort isn't enough */
+
+    for ( k = 1; k <= nump; k++ )
+    {
+      if ( CUR.args < 2 )
+      {
+        if ( CUR.pedantic_hinting )
+          CUR.error = TT_Err_Too_Few_Arguments;
+        CUR.args = 0;
+        goto Fail;
+      }
+
+      CUR.args -= 2;
+
+      A = (FT_UShort)CUR.stack[CUR.args + 1];
+      B = CUR.stack[CUR.args];
+
+      /* XXX: Because some popular fonts contain some invalid DeltaP */
+      /*      instructions, we simply ignore them when the stacked   */
+      /*      point reference is off limit, rather than returning an */
+      /*      error.  As a delta instruction doesn't change a glyph  */
+      /*      in great ways, this shouldn't be a problem.            */
+
+      if ( !BOUNDS( A, CUR.zp0.n_points ) )
+      {
+        C = ( (FT_ULong)B & 0xF0 ) >> 4;
+
+        switch ( CUR.opcode )
+        {
+        case 0x5D:
+          break;
+
+        case 0x71:
+          C += 16;
+          break;
+
+        case 0x72:
+          C += 32;
+          break;
+        }
+
+        C += CUR.GS.delta_base;
+
+        if ( CURRENT_Ppem() == (FT_Long)C )
+        {
+          B = ( (FT_ULong)B & 0xF ) - 8;
+          if ( B >= 0 )
+            B++;
+          B = B * 64 / ( 1L << CUR.GS.delta_shift );
+
+          CUR_Func_move( &CUR.zp0, A, B );
+        }
+      }
+      else
+        if ( CUR.pedantic_hinting )
+          CUR.error = TT_Err_Invalid_Reference;
+    }
+
+  Fail:
+    CUR.new_top = CUR.args;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* DELTACn[]:    DELTA exceptions C1, C2, C3                             */
+  /* Opcode range: 0x73,0x74,0x75                                          */
+  /* Stack:        uint32 (2 * uint32)... -->                              */
+  /*                                                                       */
+  static void
+  Ins_DELTAC( INS_ARG )
+  {
+    FT_ULong  nump, k;
+    FT_ULong  A, C;
+    FT_Long   B;
+
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    /* Delta hinting is covered by US Patent 5159668. */
+    if ( CUR.face->unpatented_hinting )
+    {
+      FT_Long  n = args[0] * 2;
+
+
+      if ( CUR.args < n )
+      {
+        if ( CUR.pedantic_hinting )
+          CUR.error = TT_Err_Too_Few_Arguments;
+        n = CUR.args;
+      }
+
+      CUR.args -= n;
+      CUR.new_top = CUR.args;
+      return;
+    }
+#endif
+
+    nump = (FT_ULong)args[0];
+
+    for ( k = 1; k <= nump; k++ )
+    {
+      if ( CUR.args < 2 )
+      {
+        if ( CUR.pedantic_hinting )
+          CUR.error = TT_Err_Too_Few_Arguments;
+        CUR.args = 0;
+        goto Fail;
+      }
+
+      CUR.args -= 2;
+
+      A = (FT_ULong)CUR.stack[CUR.args + 1];
+      B = CUR.stack[CUR.args];
+
+      if ( BOUNDSL( A, CUR.cvtSize ) )
+      {
+        if ( CUR.pedantic_hinting )
+        {
+          CUR.error = TT_Err_Invalid_Reference;
+          return;
+        }
+      }
+      else
+      {
+        C = ( (FT_ULong)B & 0xF0 ) >> 4;
+
+        switch ( CUR.opcode )
+        {
+        case 0x73:
+          break;
+
+        case 0x74:
+          C += 16;
+          break;
+
+        case 0x75:
+          C += 32;
+          break;
+        }
+
+        C += CUR.GS.delta_base;
+
+        if ( CURRENT_Ppem() == (FT_Long)C )
+        {
+          B = ( (FT_ULong)B & 0xF ) - 8;
+          if ( B >= 0 )
+            B++;
+          B = B * 64 / ( 1L << CUR.GS.delta_shift );
+
+          CUR_Func_move_cvt( A, B );
+        }
+      }
+    }
+
+  Fail:
+    CUR.new_top = CUR.args;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* MISC. INSTRUCTIONS                                                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* GETINFO[]:    GET INFOrmation                                         */
+  /* Opcode range: 0x88                                                    */
+  /* Stack:        uint32 --> uint32                                       */
+  /*                                                                       */
+  static void
+  Ins_GETINFO( INS_ARG )
+  {
+    FT_Long  K;
+
+
+    K = 0;
+
+    /* We return MS rasterizer version 1.7 for the font scaler. */
+    if ( ( args[0] & 1 ) != 0 )
+      K = 35;
+
+    /* Has the glyph been rotated? */
+    if ( ( args[0] & 2 ) != 0 && CUR.tt_metrics.rotated )
+      K |= 0x80;
+
+    /* Has the glyph been stretched? */
+    if ( ( args[0] & 4 ) != 0 && CUR.tt_metrics.stretched )
+      K |= 1 << 8;
+
+    /* Are we hinting for grayscale? */
+    if ( ( args[0] & 32 ) != 0 && CUR.grayscale )
+      K |= 1 << 12;
+
+    args[0] = K;
+  }
+
+
+  static void
+  Ins_UNKNOWN( INS_ARG )
+  {
+    TT_DefRecord*  def   = CUR.IDefs;
+    TT_DefRecord*  limit = def + CUR.numIDefs;
+
+    FT_UNUSED_ARG;
+
+
+    for ( ; def < limit; def++ )
+    {
+      if ( (FT_Byte)def->opc == CUR.opcode && def->active )
+      {
+        TT_CallRec*  call;
+
+
+        if ( CUR.callTop >= CUR.callSize )
+        {
+          CUR.error = TT_Err_Stack_Overflow;
+          return;
+        }
+
+        call = CUR.callStack + CUR.callTop++;
+
+        call->Caller_Range = CUR.curRange;
+        call->Caller_IP    = CUR.IP + 1;
+        call->Cur_Count    = 1;
+        call->Cur_Restart  = def->start;
+        call->Cur_End      = def->end;
+
+        INS_Goto_CodeRange( def->range, def->start );
+
+        CUR.step_ins = FALSE;
+        return;
+      }
+    }
+
+    CUR.error = TT_Err_Invalid_Opcode;
+  }
+
+
+#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+  static
+  TInstruction_Function  Instruct_Dispatch[256] =
+  {
+    /* Opcodes are gathered in groups of 16. */
+    /* Please keep the spaces as they are.   */
+
+    /*  SVTCA  y  */  Ins_SVTCA,
+    /*  SVTCA  x  */  Ins_SVTCA,
+    /*  SPvTCA y  */  Ins_SPVTCA,
+    /*  SPvTCA x  */  Ins_SPVTCA,
+    /*  SFvTCA y  */  Ins_SFVTCA,
+    /*  SFvTCA x  */  Ins_SFVTCA,
+    /*  SPvTL //  */  Ins_SPVTL,
+    /*  SPvTL +   */  Ins_SPVTL,
+    /*  SFvTL //  */  Ins_SFVTL,
+    /*  SFvTL +   */  Ins_SFVTL,
+    /*  SPvFS     */  Ins_SPVFS,
+    /*  SFvFS     */  Ins_SFVFS,
+    /*  GPV       */  Ins_GPV,
+    /*  GFV       */  Ins_GFV,
+    /*  SFvTPv    */  Ins_SFVTPV,
+    /*  ISECT     */  Ins_ISECT,
+
+    /*  SRP0      */  Ins_SRP0,
+    /*  SRP1      */  Ins_SRP1,
+    /*  SRP2      */  Ins_SRP2,
+    /*  SZP0      */  Ins_SZP0,
+    /*  SZP1      */  Ins_SZP1,
+    /*  SZP2      */  Ins_SZP2,
+    /*  SZPS      */  Ins_SZPS,
+    /*  SLOOP     */  Ins_SLOOP,
+    /*  RTG       */  Ins_RTG,
+    /*  RTHG      */  Ins_RTHG,
+    /*  SMD       */  Ins_SMD,
+    /*  ELSE      */  Ins_ELSE,
+    /*  JMPR      */  Ins_JMPR,
+    /*  SCvTCi    */  Ins_SCVTCI,
+    /*  SSwCi     */  Ins_SSWCI,
+    /*  SSW       */  Ins_SSW,
+
+    /*  DUP       */  Ins_DUP,
+    /*  POP       */  Ins_POP,
+    /*  CLEAR     */  Ins_CLEAR,
+    /*  SWAP      */  Ins_SWAP,
+    /*  DEPTH     */  Ins_DEPTH,
+    /*  CINDEX    */  Ins_CINDEX,
+    /*  MINDEX    */  Ins_MINDEX,
+    /*  AlignPTS  */  Ins_ALIGNPTS,
+    /*  INS_0x28  */  Ins_UNKNOWN,
+    /*  UTP       */  Ins_UTP,
+    /*  LOOPCALL  */  Ins_LOOPCALL,
+    /*  CALL      */  Ins_CALL,
+    /*  FDEF      */  Ins_FDEF,
+    /*  ENDF      */  Ins_ENDF,
+    /*  MDAP[0]   */  Ins_MDAP,
+    /*  MDAP[1]   */  Ins_MDAP,
+
+    /*  IUP[0]    */  Ins_IUP,
+    /*  IUP[1]    */  Ins_IUP,
+    /*  SHP[0]    */  Ins_SHP,
+    /*  SHP[1]    */  Ins_SHP,
+    /*  SHC[0]    */  Ins_SHC,
+    /*  SHC[1]    */  Ins_SHC,
+    /*  SHZ[0]    */  Ins_SHZ,
+    /*  SHZ[1]    */  Ins_SHZ,
+    /*  SHPIX     */  Ins_SHPIX,
+    /*  IP        */  Ins_IP,
+    /*  MSIRP[0]  */  Ins_MSIRP,
+    /*  MSIRP[1]  */  Ins_MSIRP,
+    /*  AlignRP   */  Ins_ALIGNRP,
+    /*  RTDG      */  Ins_RTDG,
+    /*  MIAP[0]   */  Ins_MIAP,
+    /*  MIAP[1]   */  Ins_MIAP,
+
+    /*  NPushB    */  Ins_NPUSHB,
+    /*  NPushW    */  Ins_NPUSHW,
+    /*  WS        */  Ins_WS,
+    /*  RS        */  Ins_RS,
+    /*  WCvtP     */  Ins_WCVTP,
+    /*  RCvt      */  Ins_RCVT,
+    /*  GC[0]     */  Ins_GC,
+    /*  GC[1]     */  Ins_GC,
+    /*  SCFS      */  Ins_SCFS,
+    /*  MD[0]     */  Ins_MD,
+    /*  MD[1]     */  Ins_MD,
+    /*  MPPEM     */  Ins_MPPEM,
+    /*  MPS       */  Ins_MPS,
+    /*  FlipON    */  Ins_FLIPON,
+    /*  FlipOFF   */  Ins_FLIPOFF,
+    /*  DEBUG     */  Ins_DEBUG,
+
+    /*  LT        */  Ins_LT,
+    /*  LTEQ      */  Ins_LTEQ,
+    /*  GT        */  Ins_GT,
+    /*  GTEQ      */  Ins_GTEQ,
+    /*  EQ        */  Ins_EQ,
+    /*  NEQ       */  Ins_NEQ,
+    /*  ODD       */  Ins_ODD,
+    /*  EVEN      */  Ins_EVEN,
+    /*  IF        */  Ins_IF,
+    /*  EIF       */  Ins_EIF,
+    /*  AND       */  Ins_AND,
+    /*  OR        */  Ins_OR,
+    /*  NOT       */  Ins_NOT,
+    /*  DeltaP1   */  Ins_DELTAP,
+    /*  SDB       */  Ins_SDB,
+    /*  SDS       */  Ins_SDS,
+
+    /*  ADD       */  Ins_ADD,
+    /*  SUB       */  Ins_SUB,
+    /*  DIV       */  Ins_DIV,
+    /*  MUL       */  Ins_MUL,
+    /*  ABS       */  Ins_ABS,
+    /*  NEG       */  Ins_NEG,
+    /*  FLOOR     */  Ins_FLOOR,
+    /*  CEILING   */  Ins_CEILING,
+    /*  ROUND[0]  */  Ins_ROUND,
+    /*  ROUND[1]  */  Ins_ROUND,
+    /*  ROUND[2]  */  Ins_ROUND,
+    /*  ROUND[3]  */  Ins_ROUND,
+    /*  NROUND[0] */  Ins_NROUND,
+    /*  NROUND[1] */  Ins_NROUND,
+    /*  NROUND[2] */  Ins_NROUND,
+    /*  NROUND[3] */  Ins_NROUND,
+
+    /*  WCvtF     */  Ins_WCVTF,
+    /*  DeltaP2   */  Ins_DELTAP,
+    /*  DeltaP3   */  Ins_DELTAP,
+    /*  DeltaCn[0] */ Ins_DELTAC,
+    /*  DeltaCn[1] */ Ins_DELTAC,
+    /*  DeltaCn[2] */ Ins_DELTAC,
+    /*  SROUND    */  Ins_SROUND,
+    /*  S45Round  */  Ins_S45ROUND,
+    /*  JROT      */  Ins_JROT,
+    /*  JROF      */  Ins_JROF,
+    /*  ROFF      */  Ins_ROFF,
+    /*  INS_0x7B  */  Ins_UNKNOWN,
+    /*  RUTG      */  Ins_RUTG,
+    /*  RDTG      */  Ins_RDTG,
+    /*  SANGW     */  Ins_SANGW,
+    /*  AA        */  Ins_AA,
+
+    /*  FlipPT    */  Ins_FLIPPT,
+    /*  FlipRgON  */  Ins_FLIPRGON,
+    /*  FlipRgOFF */  Ins_FLIPRGOFF,
+    /*  INS_0x83  */  Ins_UNKNOWN,
+    /*  INS_0x84  */  Ins_UNKNOWN,
+    /*  ScanCTRL  */  Ins_SCANCTRL,
+    /*  SDPVTL[0] */  Ins_SDPVTL,
+    /*  SDPVTL[1] */  Ins_SDPVTL,
+    /*  GetINFO   */  Ins_GETINFO,
+    /*  IDEF      */  Ins_IDEF,
+    /*  ROLL      */  Ins_ROLL,
+    /*  MAX       */  Ins_MAX,
+    /*  MIN       */  Ins_MIN,
+    /*  ScanTYPE  */  Ins_SCANTYPE,
+    /*  InstCTRL  */  Ins_INSTCTRL,
+    /*  INS_0x8F  */  Ins_UNKNOWN,
+
+    /*  INS_0x90  */   Ins_UNKNOWN,
+    /*  INS_0x91  */   Ins_UNKNOWN,
+    /*  INS_0x92  */   Ins_UNKNOWN,
+    /*  INS_0x93  */   Ins_UNKNOWN,
+    /*  INS_0x94  */   Ins_UNKNOWN,
+    /*  INS_0x95  */   Ins_UNKNOWN,
+    /*  INS_0x96  */   Ins_UNKNOWN,
+    /*  INS_0x97  */   Ins_UNKNOWN,
+    /*  INS_0x98  */   Ins_UNKNOWN,
+    /*  INS_0x99  */   Ins_UNKNOWN,
+    /*  INS_0x9A  */   Ins_UNKNOWN,
+    /*  INS_0x9B  */   Ins_UNKNOWN,
+    /*  INS_0x9C  */   Ins_UNKNOWN,
+    /*  INS_0x9D  */   Ins_UNKNOWN,
+    /*  INS_0x9E  */   Ins_UNKNOWN,
+    /*  INS_0x9F  */   Ins_UNKNOWN,
+
+    /*  INS_0xA0  */   Ins_UNKNOWN,
+    /*  INS_0xA1  */   Ins_UNKNOWN,
+    /*  INS_0xA2  */   Ins_UNKNOWN,
+    /*  INS_0xA3  */   Ins_UNKNOWN,
+    /*  INS_0xA4  */   Ins_UNKNOWN,
+    /*  INS_0xA5  */   Ins_UNKNOWN,
+    /*  INS_0xA6  */   Ins_UNKNOWN,
+    /*  INS_0xA7  */   Ins_UNKNOWN,
+    /*  INS_0xA8  */   Ins_UNKNOWN,
+    /*  INS_0xA9  */   Ins_UNKNOWN,
+    /*  INS_0xAA  */   Ins_UNKNOWN,
+    /*  INS_0xAB  */   Ins_UNKNOWN,
+    /*  INS_0xAC  */   Ins_UNKNOWN,
+    /*  INS_0xAD  */   Ins_UNKNOWN,
+    /*  INS_0xAE  */   Ins_UNKNOWN,
+    /*  INS_0xAF  */   Ins_UNKNOWN,
+
+    /*  PushB[0]  */  Ins_PUSHB,
+    /*  PushB[1]  */  Ins_PUSHB,
+    /*  PushB[2]  */  Ins_PUSHB,
+    /*  PushB[3]  */  Ins_PUSHB,
+    /*  PushB[4]  */  Ins_PUSHB,
+    /*  PushB[5]  */  Ins_PUSHB,
+    /*  PushB[6]  */  Ins_PUSHB,
+    /*  PushB[7]  */  Ins_PUSHB,
+    /*  PushW[0]  */  Ins_PUSHW,
+    /*  PushW[1]  */  Ins_PUSHW,
+    /*  PushW[2]  */  Ins_PUSHW,
+    /*  PushW[3]  */  Ins_PUSHW,
+    /*  PushW[4]  */  Ins_PUSHW,
+    /*  PushW[5]  */  Ins_PUSHW,
+    /*  PushW[6]  */  Ins_PUSHW,
+    /*  PushW[7]  */  Ins_PUSHW,
+
+    /*  MDRP[00]  */  Ins_MDRP,
+    /*  MDRP[01]  */  Ins_MDRP,
+    /*  MDRP[02]  */  Ins_MDRP,
+    /*  MDRP[03]  */  Ins_MDRP,
+    /*  MDRP[04]  */  Ins_MDRP,
+    /*  MDRP[05]  */  Ins_MDRP,
+    /*  MDRP[06]  */  Ins_MDRP,
+    /*  MDRP[07]  */  Ins_MDRP,
+    /*  MDRP[08]  */  Ins_MDRP,
+    /*  MDRP[09]  */  Ins_MDRP,
+    /*  MDRP[10]  */  Ins_MDRP,
+    /*  MDRP[11]  */  Ins_MDRP,
+    /*  MDRP[12]  */  Ins_MDRP,
+    /*  MDRP[13]  */  Ins_MDRP,
+    /*  MDRP[14]  */  Ins_MDRP,
+    /*  MDRP[15]  */  Ins_MDRP,
+
+    /*  MDRP[16]  */  Ins_MDRP,
+    /*  MDRP[17]  */  Ins_MDRP,
+    /*  MDRP[18]  */  Ins_MDRP,
+    /*  MDRP[19]  */  Ins_MDRP,
+    /*  MDRP[20]  */  Ins_MDRP,
+    /*  MDRP[21]  */  Ins_MDRP,
+    /*  MDRP[22]  */  Ins_MDRP,
+    /*  MDRP[23]  */  Ins_MDRP,
+    /*  MDRP[24]  */  Ins_MDRP,
+    /*  MDRP[25]  */  Ins_MDRP,
+    /*  MDRP[26]  */  Ins_MDRP,
+    /*  MDRP[27]  */  Ins_MDRP,
+    /*  MDRP[28]  */  Ins_MDRP,
+    /*  MDRP[29]  */  Ins_MDRP,
+    /*  MDRP[30]  */  Ins_MDRP,
+    /*  MDRP[31]  */  Ins_MDRP,
+
+    /*  MIRP[00]  */  Ins_MIRP,
+    /*  MIRP[01]  */  Ins_MIRP,
+    /*  MIRP[02]  */  Ins_MIRP,
+    /*  MIRP[03]  */  Ins_MIRP,
+    /*  MIRP[04]  */  Ins_MIRP,
+    /*  MIRP[05]  */  Ins_MIRP,
+    /*  MIRP[06]  */  Ins_MIRP,
+    /*  MIRP[07]  */  Ins_MIRP,
+    /*  MIRP[08]  */  Ins_MIRP,
+    /*  MIRP[09]  */  Ins_MIRP,
+    /*  MIRP[10]  */  Ins_MIRP,
+    /*  MIRP[11]  */  Ins_MIRP,
+    /*  MIRP[12]  */  Ins_MIRP,
+    /*  MIRP[13]  */  Ins_MIRP,
+    /*  MIRP[14]  */  Ins_MIRP,
+    /*  MIRP[15]  */  Ins_MIRP,
+
+    /*  MIRP[16]  */  Ins_MIRP,
+    /*  MIRP[17]  */  Ins_MIRP,
+    /*  MIRP[18]  */  Ins_MIRP,
+    /*  MIRP[19]  */  Ins_MIRP,
+    /*  MIRP[20]  */  Ins_MIRP,
+    /*  MIRP[21]  */  Ins_MIRP,
+    /*  MIRP[22]  */  Ins_MIRP,
+    /*  MIRP[23]  */  Ins_MIRP,
+    /*  MIRP[24]  */  Ins_MIRP,
+    /*  MIRP[25]  */  Ins_MIRP,
+    /*  MIRP[26]  */  Ins_MIRP,
+    /*  MIRP[27]  */  Ins_MIRP,
+    /*  MIRP[28]  */  Ins_MIRP,
+    /*  MIRP[29]  */  Ins_MIRP,
+    /*  MIRP[30]  */  Ins_MIRP,
+    /*  MIRP[31]  */  Ins_MIRP
+  };
+
+
+#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* RUN                                                                   */
+  /*                                                                       */
+  /*  This function executes a run of opcodes.  It will exit in the        */
+  /*  following cases:                                                     */
+  /*                                                                       */
+  /*  - Errors (in which case it returns FALSE).                           */
+  /*                                                                       */
+  /*  - Reaching the end of the main code range (returns TRUE).            */
+  /*    Reaching the end of a code range within a function call is an      */
+  /*    error.                                                             */
+  /*                                                                       */
+  /*  - After executing one single opcode, if the flag `Instruction_Trap'  */
+  /*    is set to TRUE (returns TRUE).                                     */
+  /*                                                                       */
+  /*  On exit with TRUE, test IP < CodeSize to know whether it comes from  */
+  /*  an instruction trap or a normal termination.                         */
+  /*                                                                       */
+  /*                                                                       */
+  /*  Note: The documented DEBUG opcode pops a value from the stack.  This */
+  /*        behaviour is unsupported; here a DEBUG opcode is always an     */
+  /*        error.                                                         */
+  /*                                                                       */
+  /*                                                                       */
+  /* THIS IS THE INTERPRETER'S MAIN LOOP.                                  */
+  /*                                                                       */
+  /*  Instructions appear in the specification's order.                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /* documentation is in ttinterp.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  TT_RunIns( TT_ExecContext  exc )
+  {
+    FT_Long  ins_counter = 0;  /* executed instructions counter */
+
+
+#ifdef TT_CONFIG_OPTION_STATIC_RASTER
+    cur = *exc;
+#endif
+
+    /* set CVT functions */
+    CUR.tt_metrics.ratio = 0;
+    if ( CUR.metrics.x_ppem != CUR.metrics.y_ppem )
+    {
+      /* non-square pixels, use the stretched routines */
+      CUR.func_read_cvt  = Read_CVT_Stretched;
+      CUR.func_write_cvt = Write_CVT_Stretched;
+      CUR.func_move_cvt  = Move_CVT_Stretched;
+    }
+    else
+    {
+      /* square pixels, use normal routines */
+      CUR.func_read_cvt  = Read_CVT;
+      CUR.func_write_cvt = Write_CVT;
+      CUR.func_move_cvt  = Move_CVT;
+    }
+
+    COMPUTE_Funcs();
+    COMPUTE_Round( (FT_Byte)exc->GS.round_state );
+
+    do
+    {
+      CUR.opcode = CUR.code[CUR.IP];
+
+      FT_TRACE7(( "  " ));
+      FT_TRACE7(( opcode_name[CUR.opcode] ));
+      FT_TRACE7(( "\n" ));
+
+      if ( ( CUR.length = opcode_length[CUR.opcode] ) < 0 )
+      {
+        if ( CUR.IP + 1 >= CUR.codeSize )
+          goto LErrorCodeOverflow_;
+
+        CUR.length = 2 - CUR.length * CUR.code[CUR.IP + 1];
+      }
+
+      if ( CUR.IP + CUR.length > CUR.codeSize )
+        goto LErrorCodeOverflow_;
+
+      /* First, let's check for empty stack and overflow */
+      CUR.args = CUR.top - ( Pop_Push_Count[CUR.opcode] >> 4 );
+
+      /* `args' is the top of the stack once arguments have been popped. */
+      /* One can also interpret it as the index of the last argument.    */
+      if ( CUR.args < 0 )
+      {
+        FT_UShort  i;
+
+
+        if ( CUR.pedantic_hinting )
+        {
+          CUR.error = TT_Err_Too_Few_Arguments;
+          goto LErrorLabel_;
+        }
+
+        /* push zeroes onto the stack */
+        for ( i = 0; i < Pop_Push_Count[CUR.opcode] >> 4; i++ )
+          CUR.stack[i] = 0;
+        CUR.args = 0;
+      }
+
+      CUR.new_top = CUR.args + ( Pop_Push_Count[CUR.opcode] & 15 );
+
+      /* `new_top' is the new top of the stack, after the instruction's */
+      /* execution.  `top' will be set to `new_top' after the `switch'  */
+      /* statement.                                                     */
+      if ( CUR.new_top > CUR.stackSize )
+      {
+        CUR.error = TT_Err_Stack_Overflow;
+        goto LErrorLabel_;
+      }
+
+      CUR.step_ins = TRUE;
+      CUR.error    = TT_Err_Ok;
+
+#ifdef TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+      {
+        FT_Long*  args   = CUR.stack + CUR.args;
+        FT_Byte   opcode = CUR.opcode;
+
+
+#undef  ARRAY_BOUND_ERROR
+#define ARRAY_BOUND_ERROR  goto Set_Invalid_Ref
+
+
+        switch ( opcode )
+        {
+        case 0x00:  /* SVTCA y  */
+        case 0x01:  /* SVTCA x  */
+        case 0x02:  /* SPvTCA y */
+        case 0x03:  /* SPvTCA x */
+        case 0x04:  /* SFvTCA y */
+        case 0x05:  /* SFvTCA x */
+          {
+            FT_Short  AA, BB;
+
+
+            AA = (FT_Short)( ( opcode & 1 ) << 14 );
+            BB = (FT_Short)( AA ^ 0x4000 );
+
+            if ( opcode < 4 )
+            {
+              CUR.GS.projVector.x = AA;
+              CUR.GS.projVector.y = BB;
+
+              CUR.GS.dualVector.x = AA;
+              CUR.GS.dualVector.y = BB;
+            }
+            else
+            {
+              GUESS_VECTOR( projVector );
+            }
+
+            if ( ( opcode & 2 ) == 0 )
+            {
+              CUR.GS.freeVector.x = AA;
+              CUR.GS.freeVector.y = BB;
+            }
+            else
+            {
+              GUESS_VECTOR( freeVector );
+            }
+
+            COMPUTE_Funcs();
+          }
+          break;
+
+        case 0x06:  /* SPvTL // */
+        case 0x07:  /* SPvTL +  */
+          DO_SPVTL
+          break;
+
+        case 0x08:  /* SFvTL // */
+        case 0x09:  /* SFvTL +  */
+          DO_SFVTL
+          break;
+
+        case 0x0A:  /* SPvFS */
+          DO_SPVFS
+          break;
+
+        case 0x0B:  /* SFvFS */
+          DO_SFVFS
+          break;
+
+        case 0x0C:  /* GPV */
+          DO_GPV
+          break;
+
+        case 0x0D:  /* GFV */
+          DO_GFV
+          break;
+
+        case 0x0E:  /* SFvTPv */
+          DO_SFVTPV
+          break;
+
+        case 0x0F:  /* ISECT  */
+          Ins_ISECT( EXEC_ARG_ args );
+          break;
+
+        case 0x10:  /* SRP0 */
+          DO_SRP0
+          break;
+
+        case 0x11:  /* SRP1 */
+          DO_SRP1
+          break;
+
+        case 0x12:  /* SRP2 */
+          DO_SRP2
+          break;
+
+        case 0x13:  /* SZP0 */
+          Ins_SZP0( EXEC_ARG_ args );
+          break;
+
+        case 0x14:  /* SZP1 */
+          Ins_SZP1( EXEC_ARG_ args );
+          break;
+
+        case 0x15:  /* SZP2 */
+          Ins_SZP2( EXEC_ARG_ args );
+          break;
+
+        case 0x16:  /* SZPS */
+          Ins_SZPS( EXEC_ARG_ args );
+          break;
+
+        case 0x17:  /* SLOOP */
+          DO_SLOOP
+          break;
+
+        case 0x18:  /* RTG */
+          DO_RTG
+          break;
+
+        case 0x19:  /* RTHG */
+          DO_RTHG
+          break;
+
+        case 0x1A:  /* SMD */
+          DO_SMD
+          break;
+
+        case 0x1B:  /* ELSE */
+          Ins_ELSE( EXEC_ARG_ args );
+          break;
+
+        case 0x1C:  /* JMPR */
+          DO_JMPR
+          break;
+
+        case 0x1D:  /* SCVTCI */
+          DO_SCVTCI
+          break;
+
+        case 0x1E:  /* SSWCI */
+          DO_SSWCI
+          break;
+
+        case 0x1F:  /* SSW */
+          DO_SSW
+          break;
+
+        case 0x20:  /* DUP */
+          DO_DUP
+          break;
+
+        case 0x21:  /* POP */
+          /* nothing :-) */
+          break;
+
+        case 0x22:  /* CLEAR */
+          DO_CLEAR
+          break;
+
+        case 0x23:  /* SWAP */
+          DO_SWAP
+          break;
+
+        case 0x24:  /* DEPTH */
+          DO_DEPTH
+          break;
+
+        case 0x25:  /* CINDEX */
+          DO_CINDEX
+          break;
+
+        case 0x26:  /* MINDEX */
+          Ins_MINDEX( EXEC_ARG_ args );
+          break;
+
+        case 0x27:  /* ALIGNPTS */
+          Ins_ALIGNPTS( EXEC_ARG_ args );
+          break;
+
+        case 0x28:  /* ???? */
+          Ins_UNKNOWN( EXEC_ARG_ args );
+          break;
+
+        case 0x29:  /* UTP */
+          Ins_UTP( EXEC_ARG_ args );
+          break;
+
+        case 0x2A:  /* LOOPCALL */
+          Ins_LOOPCALL( EXEC_ARG_ args );
+          break;
+
+        case 0x2B:  /* CALL */
+          Ins_CALL( EXEC_ARG_ args );
+          break;
+
+        case 0x2C:  /* FDEF */
+          Ins_FDEF( EXEC_ARG_ args );
+          break;
+
+        case 0x2D:  /* ENDF */
+          Ins_ENDF( EXEC_ARG_ args );
+          break;
+
+        case 0x2E:  /* MDAP */
+        case 0x2F:  /* MDAP */
+          Ins_MDAP( EXEC_ARG_ args );
+          break;
+
+
+        case 0x30:  /* IUP */
+        case 0x31:  /* IUP */
+          Ins_IUP( EXEC_ARG_ args );
+          break;
+
+        case 0x32:  /* SHP */
+        case 0x33:  /* SHP */
+          Ins_SHP( EXEC_ARG_ args );
+          break;
+
+        case 0x34:  /* SHC */
+        case 0x35:  /* SHC */
+          Ins_SHC( EXEC_ARG_ args );
+          break;
+
+        case 0x36:  /* SHZ */
+        case 0x37:  /* SHZ */
+          Ins_SHZ( EXEC_ARG_ args );
+          break;
+
+        case 0x38:  /* SHPIX */
+          Ins_SHPIX( EXEC_ARG_ args );
+          break;
+
+        case 0x39:  /* IP    */
+          Ins_IP( EXEC_ARG_ args );
+          break;
+
+        case 0x3A:  /* MSIRP */
+        case 0x3B:  /* MSIRP */
+          Ins_MSIRP( EXEC_ARG_ args );
+          break;
+
+        case 0x3C:  /* AlignRP */
+          Ins_ALIGNRP( EXEC_ARG_ args );
+          break;
+
+        case 0x3D:  /* RTDG */
+          DO_RTDG
+          break;
+
+        case 0x3E:  /* MIAP */
+        case 0x3F:  /* MIAP */
+          Ins_MIAP( EXEC_ARG_ args );
+          break;
+
+        case 0x40:  /* NPUSHB */
+          Ins_NPUSHB( EXEC_ARG_ args );
+          break;
+
+        case 0x41:  /* NPUSHW */
+          Ins_NPUSHW( EXEC_ARG_ args );
+          break;
+
+        case 0x42:  /* WS */
+          DO_WS
+          break;
+
+      Set_Invalid_Ref:
+            CUR.error = TT_Err_Invalid_Reference;
+          break;
+
+        case 0x43:  /* RS */
+          DO_RS
+          break;
+
+        case 0x44:  /* WCVTP */
+          DO_WCVTP
+          break;
+
+        case 0x45:  /* RCVT */
+          DO_RCVT
+          break;
+
+        case 0x46:  /* GC */
+        case 0x47:  /* GC */
+          Ins_GC( EXEC_ARG_ args );
+          break;
+
+        case 0x48:  /* SCFS */
+          Ins_SCFS( EXEC_ARG_ args );
+          break;
+
+        case 0x49:  /* MD */
+        case 0x4A:  /* MD */
+          Ins_MD( EXEC_ARG_ args );
+          break;
+
+        case 0x4B:  /* MPPEM */
+          DO_MPPEM
+          break;
+
+        case 0x4C:  /* MPS */
+          DO_MPS
+          break;
+
+        case 0x4D:  /* FLIPON */
+          DO_FLIPON
+          break;
+
+        case 0x4E:  /* FLIPOFF */
+          DO_FLIPOFF
+          break;
+
+        case 0x4F:  /* DEBUG */
+          DO_DEBUG
+          break;
+
+        case 0x50:  /* LT */
+          DO_LT
+          break;
+
+        case 0x51:  /* LTEQ */
+          DO_LTEQ
+          break;
+
+        case 0x52:  /* GT */
+          DO_GT
+          break;
+
+        case 0x53:  /* GTEQ */
+          DO_GTEQ
+          break;
+
+        case 0x54:  /* EQ */
+          DO_EQ
+          break;
+
+        case 0x55:  /* NEQ */
+          DO_NEQ
+          break;
+
+        case 0x56:  /* ODD */
+          DO_ODD
+          break;
+
+        case 0x57:  /* EVEN */
+          DO_EVEN
+          break;
+
+        case 0x58:  /* IF */
+          Ins_IF( EXEC_ARG_ args );
+          break;
+
+        case 0x59:  /* EIF */
+          /* do nothing */
+          break;
+
+        case 0x5A:  /* AND */
+          DO_AND
+          break;
+
+        case 0x5B:  /* OR */
+          DO_OR
+          break;
+
+        case 0x5C:  /* NOT */
+          DO_NOT
+          break;
+
+        case 0x5D:  /* DELTAP1 */
+          Ins_DELTAP( EXEC_ARG_ args );
+          break;
+
+        case 0x5E:  /* SDB */
+          DO_SDB
+          break;
+
+        case 0x5F:  /* SDS */
+          DO_SDS
+          break;
+
+        case 0x60:  /* ADD */
+          DO_ADD
+          break;
+
+        case 0x61:  /* SUB */
+          DO_SUB
+          break;
+
+        case 0x62:  /* DIV */
+          DO_DIV
+          break;
+
+        case 0x63:  /* MUL */
+          DO_MUL
+          break;
+
+        case 0x64:  /* ABS */
+          DO_ABS
+          break;
+
+        case 0x65:  /* NEG */
+          DO_NEG
+          break;
+
+        case 0x66:  /* FLOOR */
+          DO_FLOOR
+          break;
+
+        case 0x67:  /* CEILING */
+          DO_CEILING
+          break;
+
+        case 0x68:  /* ROUND */
+        case 0x69:  /* ROUND */
+        case 0x6A:  /* ROUND */
+        case 0x6B:  /* ROUND */
+          DO_ROUND
+          break;
+
+        case 0x6C:  /* NROUND */
+        case 0x6D:  /* NROUND */
+        case 0x6E:  /* NRRUND */
+        case 0x6F:  /* NROUND */
+          DO_NROUND
+          break;
+
+        case 0x70:  /* WCVTF */
+          DO_WCVTF
+          break;
+
+        case 0x71:  /* DELTAP2 */
+        case 0x72:  /* DELTAP3 */
+          Ins_DELTAP( EXEC_ARG_ args );
+          break;
+
+        case 0x73:  /* DELTAC0 */
+        case 0x74:  /* DELTAC1 */
+        case 0x75:  /* DELTAC2 */
+          Ins_DELTAC( EXEC_ARG_ args );
+          break;
+
+        case 0x76:  /* SROUND */
+          DO_SROUND
+          break;
+
+        case 0x77:  /* S45Round */
+          DO_S45ROUND
+          break;
+
+        case 0x78:  /* JROT */
+          DO_JROT
+          break;
+
+        case 0x79:  /* JROF */
+          DO_JROF
+          break;
+
+        case 0x7A:  /* ROFF */
+          DO_ROFF
+          break;
+
+        case 0x7B:  /* ???? */
+          Ins_UNKNOWN( EXEC_ARG_ args );
+          break;
+
+        case 0x7C:  /* RUTG */
+          DO_RUTG
+          break;
+
+        case 0x7D:  /* RDTG */
+          DO_RDTG
+          break;
+
+        case 0x7E:  /* SANGW */
+        case 0x7F:  /* AA    */
+          /* nothing - obsolete */
+          break;
+
+        case 0x80:  /* FLIPPT */
+          Ins_FLIPPT( EXEC_ARG_ args );
+          break;
+
+        case 0x81:  /* FLIPRGON */
+          Ins_FLIPRGON( EXEC_ARG_ args );
+          break;
+
+        case 0x82:  /* FLIPRGOFF */
+          Ins_FLIPRGOFF( EXEC_ARG_ args );
+          break;
+
+        case 0x83:  /* UNKNOWN */
+        case 0x84:  /* UNKNOWN */
+          Ins_UNKNOWN( EXEC_ARG_ args );
+          break;
+
+        case 0x85:  /* SCANCTRL */
+          Ins_SCANCTRL( EXEC_ARG_ args );
+          break;
+
+        case 0x86:  /* SDPVTL */
+        case 0x87:  /* SDPVTL */
+          Ins_SDPVTL( EXEC_ARG_ args );
+          break;
+
+        case 0x88:  /* GETINFO */
+          Ins_GETINFO( EXEC_ARG_ args );
+          break;
+
+        case 0x89:  /* IDEF */
+          Ins_IDEF( EXEC_ARG_ args );
+          break;
+
+        case 0x8A:  /* ROLL */
+          Ins_ROLL( EXEC_ARG_ args );
+          break;
+
+        case 0x8B:  /* MAX */
+          DO_MAX
+          break;
+
+        case 0x8C:  /* MIN */
+          DO_MIN
+          break;
+
+        case 0x8D:  /* SCANTYPE */
+          Ins_SCANTYPE( EXEC_ARG_ args );
+          break;
+
+        case 0x8E:  /* INSTCTRL */
+          Ins_INSTCTRL( EXEC_ARG_ args );
+          break;
+
+        case 0x8F:
+          Ins_UNKNOWN( EXEC_ARG_ args );
+          break;
+
+        default:
+          if ( opcode >= 0xE0 )
+            Ins_MIRP( EXEC_ARG_ args );
+          else if ( opcode >= 0xC0 )
+            Ins_MDRP( EXEC_ARG_ args );
+          else if ( opcode >= 0xB8 )
+            Ins_PUSHW( EXEC_ARG_ args );
+          else if ( opcode >= 0xB0 )
+            Ins_PUSHB( EXEC_ARG_ args );
+          else
+            Ins_UNKNOWN( EXEC_ARG_ args );
+        }
+
+      }
+
+#else
+
+      Instruct_Dispatch[CUR.opcode]( EXEC_ARG_ &CUR.stack[CUR.args] );
+
+#endif /* TT_CONFIG_OPTION_INTERPRETER_SWITCH */
+
+      if ( CUR.error != TT_Err_Ok )
+      {
+        switch ( CUR.error )
+        {
+        case TT_Err_Invalid_Opcode: /* looking for redefined instructions */
+          {
+            TT_DefRecord*  def   = CUR.IDefs;
+            TT_DefRecord*  limit = def + CUR.numIDefs;
+
+
+            for ( ; def < limit; def++ )
+            {
+              if ( def->active && CUR.opcode == (FT_Byte)def->opc )
+              {
+                TT_CallRec*  callrec;
+
+
+                if ( CUR.callTop >= CUR.callSize )
+                {
+                  CUR.error = TT_Err_Invalid_Reference;
+                  goto LErrorLabel_;
+                }
+
+                callrec = &CUR.callStack[CUR.callTop];
+
+                callrec->Caller_Range = CUR.curRange;
+                callrec->Caller_IP    = CUR.IP + 1;
+                callrec->Cur_Count    = 1;
+                callrec->Cur_Restart  = def->start;
+                callrec->Cur_End      = def->end;
+
+                if ( INS_Goto_CodeRange( def->range, def->start ) == FAILURE )
+                  goto LErrorLabel_;
+
+                goto LSuiteLabel_;
+              }
+            }
+          }
+
+          CUR.error = TT_Err_Invalid_Opcode;
+          goto LErrorLabel_;
+
+#if 0
+          break;   /* Unreachable code warning suppression.             */
+                   /* Leave to remind in case a later change the editor */
+                   /* to consider break;                                */
+#endif
+
+        default:
+          goto LErrorLabel_;
+
+#if 0
+        break;
+#endif
+        }
+      }
+
+      CUR.top = CUR.new_top;
+
+      if ( CUR.step_ins )
+        CUR.IP += CUR.length;
+
+      /* increment instruction counter and check if we didn't */
+      /* run this program for too long (e.g. infinite loops). */
+      if ( ++ins_counter > MAX_RUNNABLE_OPCODES )
+        return TT_Err_Execution_Too_Long;
+
+    LSuiteLabel_:
+      if ( CUR.IP >= CUR.codeSize )
+      {
+        if ( CUR.callTop > 0 )
+        {
+          CUR.error = TT_Err_Code_Overflow;
+          goto LErrorLabel_;
+        }
+        else
+          goto LNo_Error_;
+      }
+    } while ( !CUR.instruction_trap );
+
+  LNo_Error_:
+
+#ifdef TT_CONFIG_OPTION_STATIC_RASTER
+    *exc = cur;
+#endif
+
+    return TT_Err_Ok;
+
+  LErrorCodeOverflow_:
+    CUR.error = TT_Err_Code_Overflow;
+
+  LErrorLabel_:
+
+#ifdef TT_CONFIG_OPTION_STATIC_RASTER
+    *exc = cur;
+#endif
+
+    /* If any errors have occurred, function tables may be broken. */
+    /* Force a re-execution of `prep' and `fpgm' tables if no      */
+    /* bytecode debugger is run.                                   */
+    if ( CUR.error && !CUR.instruction_trap )
+    {
+      FT_TRACE1(( "  The interpreter returned error 0x%x\n", CUR.error ));
+      exc->size->cvt_ready      = FALSE;
+    }
+
+    return CUR.error;
+  }
+
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+/* END */
diff --git a/src/truetype/ttinterp.h b/src/truetype/ttinterp.h
new file mode 100644 (file)
index 0000000..6d0fc03
--- /dev/null
@@ -0,0 +1,320 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttinterp.h                                                             */
+/*                                                                         */
+/*    TrueType bytecode interpreter (specification).                       */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTINTERP_H__
+#define __TTINTERP_H__
+
+#include <ft2build.h>
+#include "ttobjs.h"
+
+
+FT_BEGIN_HEADER
+
+
+#ifndef TT_CONFIG_OPTION_STATIC_INTERPRETER /* indirect implementation */
+
+#define EXEC_OP_   TT_ExecContext  exc,
+#define EXEC_OP    TT_ExecContext  exc
+#define EXEC_ARG_  exc,
+#define EXEC_ARG   exc
+
+#else                                       /* static implementation */
+
+#define EXEC_OP_   /* void */
+#define EXEC_OP    /* void */
+#define EXEC_ARG_  /* void */
+#define EXEC_ARG   /* void */
+
+#endif /* TT_CONFIG_OPTION_STATIC_INTERPRETER */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Rounding mode constants.                                              */
+  /*                                                                       */
+#define TT_Round_Off             5
+#define TT_Round_To_Half_Grid    0
+#define TT_Round_To_Grid         1
+#define TT_Round_To_Double_Grid  2
+#define TT_Round_Up_To_Grid      4
+#define TT_Round_Down_To_Grid    3
+#define TT_Round_Super           6
+#define TT_Round_Super_45        7
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Function types used by the interpreter, depending on various modes    */
+  /* (e.g. the rounding mode, whether to render a vertical or horizontal   */
+  /* line etc).                                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+  /* Rounding function */
+  typedef FT_F26Dot6
+  (*TT_Round_Func)( EXEC_OP_ FT_F26Dot6  distance,
+                             FT_F26Dot6  compensation );
+
+  /* Point displacement along the freedom vector routine */
+  typedef void
+  (*TT_Move_Func)( EXEC_OP_ TT_GlyphZone  zone,
+                            FT_UShort     point,
+                            FT_F26Dot6    distance );
+
+  /* Distance projection along one of the projection vectors */
+  typedef FT_F26Dot6
+  (*TT_Project_Func)( EXEC_OP_ FT_Pos   dx,
+                               FT_Pos   dy );
+
+  /* reading a cvt value.  Take care of non-square pixels if necessary */
+  typedef FT_F26Dot6
+  (*TT_Get_CVT_Func)( EXEC_OP_ FT_ULong  idx );
+
+  /* setting or moving a cvt value.  Take care of non-square pixels  */
+  /* if necessary                                                    */
+  typedef void
+  (*TT_Set_CVT_Func)( EXEC_OP_ FT_ULong    idx,
+                               FT_F26Dot6  value );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This structure defines a call record, used to manage function calls.  */
+  /*                                                                       */
+  typedef struct  TT_CallRec_
+  {
+    FT_Int   Caller_Range;
+    FT_Long  Caller_IP;
+    FT_Long  Cur_Count;
+    FT_Long  Cur_Restart;
+    FT_Long  Cur_End;
+
+  } TT_CallRec, *TT_CallStack;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The main structure for the interpreter which collects all necessary   */
+  /* variables and states.                                                 */
+  /*                                                                       */
+  typedef struct  TT_ExecContextRec_
+  {
+    TT_Face            face;
+    TT_Size            size;
+    FT_Memory          memory;
+
+    /* instructions state */
+
+    FT_Error           error;      /* last execution error */
+
+    FT_Long            top;        /* top of exec. stack   */
+
+    FT_UInt            stackSize;  /* size of exec. stack  */
+    FT_Long*           stack;      /* current exec. stack  */
+
+    FT_Long            args;
+    FT_UInt            new_top;    /* new top after exec.  */
+
+    TT_GlyphZoneRec    zp0,        /* zone records */
+                       zp1,
+                       zp2,
+                       pts,
+                       twilight;
+
+    FT_Size_Metrics    metrics;
+    TT_Size_Metrics    tt_metrics; /* size metrics */
+
+    TT_GraphicsState   GS;         /* current graphics state */
+
+    FT_Int             curRange;  /* current code range number   */
+    FT_Byte*           code;      /* current code range          */
+    FT_Long            IP;        /* current instruction pointer */
+    FT_Long            codeSize;  /* size of current range       */
+
+    FT_Byte            opcode;    /* current opcode              */
+    FT_Int             length;    /* length of current opcode    */
+
+    FT_Bool            step_ins;  /* true if the interpreter must */
+                                  /* increment IP after ins. exec */
+    FT_ULong           cvtSize;
+    FT_Long*           cvt;
+
+    FT_UInt            glyphSize; /* glyph instructions buffer size */
+    FT_Byte*           glyphIns;  /* glyph instructions buffer */
+
+    FT_UInt            numFDefs;  /* number of function defs         */
+    FT_UInt            maxFDefs;  /* maximum number of function defs */
+    TT_DefArray        FDefs;     /* table of FDefs entries          */
+
+    FT_UInt            numIDefs;  /* number of instruction defs */
+    FT_UInt            maxIDefs;  /* maximum number of ins defs */
+    TT_DefArray        IDefs;     /* table of IDefs entries     */
+
+    FT_UInt            maxFunc;   /* maximum function index     */
+    FT_UInt            maxIns;    /* maximum instruction index  */
+
+    FT_Int             callTop,    /* top of call stack during execution */
+                       callSize;   /* size of call stack */
+    TT_CallStack       callStack;  /* call stack */
+
+    FT_UShort          maxPoints;    /* capacity of this context's `pts' */
+    FT_Short           maxContours;  /* record, expressed in points and  */
+                                     /* contours.                        */
+
+    TT_CodeRangeTable  codeRangeTable;  /* table of valid code ranges */
+                                        /* useful for the debugger   */
+
+    FT_UShort          storeSize;  /* size of current storage */
+    FT_Long*           storage;    /* storage area            */
+
+    FT_F26Dot6         period;     /* values used for the */
+    FT_F26Dot6         phase;      /* `SuperRounding'     */
+    FT_F26Dot6         threshold;
+
+#if 0
+    /* this seems to be unused */
+    FT_Int             cur_ppem;   /* ppem along the current proj vector */
+#endif
+
+    FT_Bool            instruction_trap; /* If `True', the interpreter will */
+                                         /* exit after each instruction     */
+
+    TT_GraphicsState   default_GS;       /* graphics state resulting from   */
+                                         /* the prep program                */
+    FT_Bool            is_composite;     /* true if the glyph is composite  */
+    FT_Bool            pedantic_hinting; /* true if pedantic interpretation */
+
+    /* latest interpreter additions */
+
+    FT_Long            F_dot_P;    /* dot product of freedom and projection */
+                                   /* vectors                               */
+    TT_Round_Func      func_round; /* current rounding function             */
+
+    TT_Project_Func    func_project,   /* current projection function */
+                       func_dualproj,  /* current dual proj. function */
+                       func_freeProj;  /* current freedom proj. func  */
+
+    TT_Move_Func       func_move;      /* current point move function */
+    TT_Move_Func       func_move_orig; /* move original position function */
+
+    TT_Get_CVT_Func    func_read_cvt;  /* read a cvt entry              */
+    TT_Set_CVT_Func    func_write_cvt; /* write a cvt entry (in pixels) */
+    TT_Set_CVT_Func    func_move_cvt;  /* incr a cvt entry (in pixels)  */
+
+    FT_Bool            grayscale;      /* are we hinting for grayscale? */
+
+  } TT_ExecContextRec;
+
+
+  extern const TT_GraphicsState  tt_default_graphics_state;
+
+
+  FT_LOCAL( FT_Error )
+  TT_Goto_CodeRange( TT_ExecContext  exec,
+                     FT_Int          range,
+                     FT_Long         IP );
+
+  FT_LOCAL( FT_Error )
+  TT_Set_CodeRange( TT_ExecContext  exec,
+                    FT_Int          range,
+                    void*           base,
+                    FT_Long         length );
+
+  FT_LOCAL( FT_Error )
+  TT_Clear_CodeRange( TT_ExecContext  exec,
+                      FT_Int          range );
+
+
+  FT_LOCAL( FT_Error )
+  Update_Max( FT_Memory  memory,
+              FT_ULong*  size,
+              FT_Long    multiplier,
+              void*      _pbuff,
+              FT_ULong   new_max );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_New_Context                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Queries the face context for a given font.  Note that there is     */
+  /*    now a _single_ execution context in the TrueType driver which is   */
+  /*    shared among faces.                                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A handle to the source face object.                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    A handle to the execution context.  Initialized for `face'.        */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only the glyph loader and debugger should call this function.      */
+  /*                                                                       */
+  FT_EXPORT( TT_ExecContext )
+  TT_New_Context( TT_Driver  driver );
+
+  FT_LOCAL( FT_Error )
+  TT_Done_Context( TT_ExecContext  exec );
+
+  FT_LOCAL( FT_Error )
+  TT_Load_Context( TT_ExecContext  exec,
+                   TT_Face         face,
+                   TT_Size         size );
+
+  FT_LOCAL( FT_Error )
+  TT_Save_Context( TT_ExecContext  exec,
+                   TT_Size         ins );
+
+  FT_LOCAL( FT_Error )
+  TT_Run_Context( TT_ExecContext  exec,
+                  FT_Bool         debug );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_RunIns                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Executes one or more instruction in the execution context.  This   */
+  /*    is the main function of the TrueType opcode interpreter.           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    exec :: A handle to the target execution context.                  */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only the object manager and debugger should call this function.    */
+  /*                                                                       */
+  /*    This function is publicly exported because it is directly          */
+  /*    invoked by the TrueType debugger.                                  */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  TT_RunIns( TT_ExecContext  exec );
+
+
+FT_END_HEADER
+
+#endif /* __TTINTERP_H__ */
+
+
+/* END */
diff --git a/src/truetype/ttobjs.c b/src/truetype/ttobjs.c
new file mode 100644 (file)
index 0000000..814c713
--- /dev/null
@@ -0,0 +1,1286 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttobjs.c                                                               */
+/*                                                                         */
+/*    Objects manager (body).                                              */
+/*                                                                         */
+/*  Copyright 1996-2011                                                    */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_TRUETYPE_TAGS_H
+#include FT_INTERNAL_SFNT_H
+
+#include "ttgload.h"
+#include "ttpload.h"
+
+#include "tterrors.h"
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+#include "ttinterp.h"
+#endif
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+#include FT_TRUETYPE_UNPATENTED_H
+#endif
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.h"
+#endif
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttobjs
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                       GLYPH ZONE FUNCTIONS                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_glyphzone_done                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Deallocate a glyph zone.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    zone :: A pointer to the target glyph zone.                        */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  tt_glyphzone_done( TT_GlyphZone  zone )
+  {
+    FT_Memory  memory = zone->memory;
+
+
+    if ( memory )
+    {
+      FT_FREE( zone->contours );
+      FT_FREE( zone->tags );
+      FT_FREE( zone->cur );
+      FT_FREE( zone->org );
+      FT_FREE( zone->orus );
+
+      zone->max_points   = zone->n_points   = 0;
+      zone->max_contours = zone->n_contours = 0;
+      zone->memory       = NULL;
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_glyphzone_new                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Allocate a new glyph zone.                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    memory      :: A handle to the current memory object.              */
+  /*                                                                       */
+  /*    maxPoints   :: The capacity of glyph zone in points.               */
+  /*                                                                       */
+  /*    maxContours :: The capacity of glyph zone in contours.             */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    zone        :: A pointer to the target glyph zone record.          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_glyphzone_new( FT_Memory     memory,
+                    FT_UShort     maxPoints,
+                    FT_Short      maxContours,
+                    TT_GlyphZone  zone )
+  {
+    FT_Error  error;
+
+
+    FT_MEM_ZERO( zone, sizeof ( *zone ) );
+    zone->memory = memory;
+
+    if ( FT_NEW_ARRAY( zone->org,      maxPoints   ) ||
+         FT_NEW_ARRAY( zone->cur,      maxPoints   ) ||
+         FT_NEW_ARRAY( zone->orus,     maxPoints   ) ||
+         FT_NEW_ARRAY( zone->tags,     maxPoints   ) ||
+         FT_NEW_ARRAY( zone->contours, maxContours ) )
+    {
+      tt_glyphzone_done( zone );
+    }
+    else
+    {
+      zone->max_points   = maxPoints;
+      zone->max_contours = maxContours;
+    }
+
+    return error;
+  }
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+  /* Compare the face with a list of well-known `tricky' fonts. */
+  /* This list shall be expanded as we find more of them.       */
+
+  static FT_Bool
+  tt_check_trickyness_family( FT_String*  name )
+  {
+
+#define TRICK_NAMES_MAX_CHARACTERS  16
+#define TRICK_NAMES_COUNT            8
+
+    static const char trick_names[TRICK_NAMES_COUNT]
+                                 [TRICK_NAMES_MAX_CHARACTERS + 1] =
+    {
+      "DFKaiSho-SB",     /* dfkaisb.ttf */
+      "DFKaiShu",
+      "DFKai-SB",        /* kaiu.ttf */
+      "HuaTianKaiTi?",   /* htkt2.ttf */
+      "HuaTianSongTi?",  /* htst3.ttf */
+      "MingLiU",         /* mingliu.ttf & mingliu.ttc */
+      "PMingLiU",        /* mingliu.ttc */
+      "MingLi43",        /* mingli.ttf */
+    };
+
+    int  nn;
+
+
+    for ( nn = 0; nn < TRICK_NAMES_COUNT; nn++ )
+      if ( ft_strstr( name, trick_names[nn] ) )
+        return TRUE;
+
+    return FALSE;
+  }
+
+
+  /* XXX: This function should be in the `sfnt' module. */
+
+  /* Some PDF generators clear the checksums in the TrueType header table. */
+  /* For example, Quartz ContextPDF clears all entries, or Bullzip PDF     */
+  /* Printer clears the entries for subsetted subtables.  We thus have to  */
+  /* recalculate the checksums  where necessary.                           */
+
+  static FT_UInt32
+  tt_synth_sfnt_checksum( FT_Stream  stream,
+                          FT_ULong   length )
+  {
+    FT_Error   error;
+    FT_UInt32  checksum = 0;
+    int        i;
+
+
+    if ( FT_FRAME_ENTER( length ) )
+      return 0;
+
+    for ( ; length > 3; length -= 4 )
+      checksum += (FT_UInt32)FT_GET_ULONG();
+
+    for ( i = 3; length > 0; length --, i-- )
+      checksum += (FT_UInt32)( FT_GET_BYTE() << ( i * 8 ) );
+
+    FT_FRAME_EXIT();
+
+    return checksum;
+  }
+
+
+  /* XXX: This function should be in the `sfnt' module. */
+
+  static FT_ULong
+  tt_get_sfnt_checksum( TT_Face    face,
+                        FT_UShort  i )
+  {
+#if 0 /* if we believe the written value, use following part. */
+    if ( face->dir_tables[i].CheckSum )
+      return face->dir_tables[i].CheckSum;
+#endif
+
+    if ( !face->goto_table )
+      return 0;
+
+    if ( face->goto_table( face,
+                           face->dir_tables[i].Tag,
+                           face->root.stream,
+                           NULL ) )
+      return 0;
+
+    return (FT_ULong)tt_synth_sfnt_checksum( face->root.stream,
+                                             face->dir_tables[i].Length );
+  }
+
+
+  typedef struct tt_sfnt_id_rec_
+  {
+    FT_ULong  CheckSum;
+    FT_ULong  Length;
+
+  } tt_sfnt_id_rec;
+
+
+  static FT_Bool
+  tt_check_trickyness_sfnt_ids( TT_Face  face )
+  {
+#define TRICK_SFNT_IDS_PER_FACE   3
+#define TRICK_SFNT_IDS_NUM_FACES  13
+
+    static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES]
+                                       [TRICK_SFNT_IDS_PER_FACE] = {
+
+#define TRICK_SFNT_ID_cvt   0
+#define TRICK_SFNT_ID_fpgm  1
+#define TRICK_SFNT_ID_prep  2
+
+      { /* MingLiU 1995 */
+        { 0x05bcf058, 0x000002e4 }, /* cvt  */
+        { 0x28233bf1, 0x000087c4 }, /* fpgm */
+        { 0xa344a1ea, 0x000001e1 }  /* prep */
+      },
+      { /* MingLiU 1996- */
+        { 0x05bcf058, 0x000002e4 }, /* cvt  */
+        { 0x28233bf1, 0x000087c4 }, /* fpgm */
+        { 0xa344a1eb, 0x000001e1 }  /* prep */
+      },
+      { /* DFKaiShu */
+        { 0x11e5ead4, 0x00000350 }, /* cvt  */
+        { 0x5a30ca3b, 0x00009063 }, /* fpgm */
+        { 0x13a42602, 0x0000007e }  /* prep */
+      },
+      { /* HuaTianKaiTi */
+        { 0xfffbfffc, 0x00000008 }, /* cvt  */
+        { 0x9c9e48b8, 0x0000bea2 }, /* fpgm */
+        { 0x70020112, 0x00000008 }  /* prep */
+      },
+      { /* HuaTianSongTi */
+        { 0xfffbfffc, 0x00000008 }, /* cvt  */
+        { 0x0a5a0483, 0x00017c39 }, /* fpgm */
+        { 0x70020112, 0x00000008 }  /* prep */
+      },
+      { /* NEC fadpop7.ttf */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0x40c92555, 0x000000e5 }, /* fpgm */
+        { 0xa39b58e3, 0x0000117c }  /* prep */
+      },
+      { /* NEC fadrei5.ttf */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0x33c41652, 0x000000e5 }, /* fpgm */
+        { 0x26d6c52a, 0x00000f6a }  /* prep */
+      },
+      { /* NEC fangot7.ttf */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0x6db1651d, 0x0000019d }, /* fpgm */
+        { 0x6c6e4b03, 0x00002492 }  /* prep */
+      },
+      { /* NEC fangyo5.ttf */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0x40c92555, 0x000000e5 }, /* fpgm */
+        { 0xde51fad0, 0x0000117c }  /* prep */
+      },
+      { /* NEC fankyo5.ttf */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0x85e47664, 0x000000e5 }, /* fpgm */
+        { 0xa6c62831, 0x00001caa }  /* prep */
+      },
+      { /* NEC fanrgo5.ttf */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0x2d891cfd, 0x0000019d }, /* fpgm */
+        { 0xa0604633, 0x00001de8 }  /* prep */
+      },
+      { /* NEC fangot5.ttc */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0x40aa774c, 0x000001cb }, /* fpgm */
+        { 0x9b5caa96, 0x00001f9a }  /* prep */
+      },
+      { /* NEC fanmin3.ttc */
+        { 0x00000000, 0x00000000 }, /* cvt  */
+        { 0x0d3de9cb, 0x00000141 }, /* fpgm */
+        { 0xd4127766, 0x00002280 }  /* prep */
+      }
+    };
+
+    FT_ULong   checksum;
+    int        num_matched_ids[TRICK_SFNT_IDS_NUM_FACES];
+    FT_Bool    has_cvt, has_fpgm, has_prep;
+    FT_UShort  i;
+    int        j, k;
+
+
+    FT_MEM_SET( num_matched_ids, 0,
+                sizeof ( int ) * TRICK_SFNT_IDS_NUM_FACES );
+    has_cvt  = FALSE;
+    has_fpgm = FALSE;
+    has_prep = FALSE;
+
+    for ( i = 0; i < face->num_tables; i++ )
+    {
+      checksum = 0;
+
+      switch( face->dir_tables[i].Tag )
+      {
+      case TTAG_cvt:
+        k = TRICK_SFNT_ID_cvt;
+        has_cvt  = TRUE;
+        break;
+
+      case TTAG_fpgm:
+        k = TRICK_SFNT_ID_fpgm;
+        has_fpgm = TRUE;
+        break;
+
+      case TTAG_prep:
+        k = TRICK_SFNT_ID_prep;
+        has_prep = TRUE;
+        break;
+
+      default:
+        continue;
+      }
+
+      for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ )
+        if ( face->dir_tables[i].Length == sfnt_id[j][k].Length )
+        {
+          if ( !checksum )
+            checksum = tt_get_sfnt_checksum( face, i );
+
+          if ( sfnt_id[j][k].CheckSum == checksum )
+            num_matched_ids[j]++;
+
+          if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE )
+            return TRUE;
+        }
+    }
+
+    for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ )
+    {
+      if ( !has_cvt  && !sfnt_id[j][TRICK_SFNT_ID_cvt].Length )
+        num_matched_ids[j] ++;
+      if ( !has_fpgm && !sfnt_id[j][TRICK_SFNT_ID_fpgm].Length )
+        num_matched_ids[j] ++;
+      if ( !has_prep && !sfnt_id[j][TRICK_SFNT_ID_prep].Length )
+        num_matched_ids[j] ++;
+      if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE )
+        return TRUE;
+    }
+
+    return FALSE;
+  }
+
+
+  static FT_Bool
+  tt_check_trickyness( FT_Face  face )
+  {
+    if ( !face )
+      return FALSE;
+
+    /* For first, check the face name for quick check. */
+    if ( face->family_name                               &&
+         tt_check_trickyness_family( face->family_name ) )
+      return TRUE;
+
+    /* Type42 fonts may lack `name' tables, we thus try to identify */
+    /* tricky fonts by checking the checksums of Type42-persistent  */
+    /* sfnt tables (`cvt', `fpgm', and `prep').                     */
+    if ( tt_check_trickyness_sfnt_ids( (TT_Face)face ) )
+      return TRUE;
+
+    return FALSE;
+  }
+
+
+  /* Check whether `.notdef' is the only glyph in the `loca' table. */
+  static FT_Bool
+  tt_check_single_notdef( FT_Face  ttface )
+  {
+    FT_Bool   result = FALSE;
+
+    TT_Face   face = (TT_Face)ttface;
+    FT_UInt   asize;
+    FT_ULong  i;
+    FT_ULong  glyph_index = 0;
+    FT_UInt   count       = 0;
+
+
+    for( i = 0; i < face->num_locations; i++ )
+    {
+      tt_face_get_location( face, i, &asize );
+      if ( asize > 0 )
+      {
+        count += 1;
+        if ( count > 1 )
+          break;
+        glyph_index = i;
+      }
+    }
+
+    /* Only have a single outline. */
+    if ( count == 1 )
+    {
+      if ( glyph_index == 0 )
+        result = TRUE;
+      else
+      {
+        /* FIXME: Need to test glyphname == .notdef ? */
+        FT_Error error;
+        char buf[8];
+
+
+        error = FT_Get_Glyph_Name( ttface, glyph_index, buf, 8 );
+        if ( !error                                            &&
+             buf[0] == '.' && !ft_strncmp( buf, ".notdef", 8 ) )
+          result = TRUE;
+      }
+    }
+
+    return result;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_init                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initialize a given TrueType face object.                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream     :: The source font stream.                              */
+  /*                                                                       */
+  /*    face_index :: The index of the font face in the resource.          */
+  /*                                                                       */
+  /*    num_params :: Number of additional generic parameters.  Ignored.   */
+  /*                                                                       */
+  /*    params     :: Additional generic parameters.  Ignored.             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: The newly built face object.                         */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_init( FT_Stream      stream,
+                FT_Face        ttface,      /* TT_Face */
+                FT_Int         face_index,
+                FT_Int         num_params,
+                FT_Parameter*  params )
+  {
+    FT_Error      error;
+    FT_Library    library;
+    SFNT_Service  sfnt;
+    TT_Face       face = (TT_Face)ttface;
+
+
+    FT_TRACE2(( "TTF driver\n" ));
+
+    library = ttface->driver->root.library;
+
+    sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" );
+    if ( !sfnt )
+    {
+      FT_ERROR(( "tt_face_init: cannot access `sfnt' module\n" ));
+      error = TT_Err_Missing_Module;
+      goto Exit;
+    }
+
+    /* create input stream from resource */
+    if ( FT_STREAM_SEEK( 0 ) )
+      goto Exit;
+
+    /* check that we have a valid TrueType file */
+    error = sfnt->init_face( stream, face, face_index, num_params, params );
+    if ( error )
+      goto Exit;
+
+    /* We must also be able to accept Mac/GX fonts, as well as OT ones. */
+    /* The 0x00020000 tag is completely undocumented; some fonts from   */
+    /* Arphic made for Chinese Windows 3.1 have this.                   */
+    if ( face->format_tag != 0x00010000L &&    /* MS fonts  */
+         face->format_tag != 0x00020000L &&    /* CJK fonts for Win 3.1 */
+         face->format_tag != TTAG_true   )     /* Mac fonts */
+    {
+      FT_TRACE2(( "  not a TTF font\n" ));
+      goto Bad_Format;
+    }
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+    ttface->face_flags |= FT_FACE_FLAG_HINTER;
+#endif
+
+    /* If we are performing a simple font format check, exit immediately. */
+    if ( face_index < 0 )
+      return TT_Err_Ok;
+
+    /* Load font directory */
+    error = sfnt->load_face( stream, face, face_index, num_params, params );
+    if ( error )
+      goto Exit;
+
+    if ( tt_check_trickyness( ttface ) )
+      ttface->face_flags |= FT_FACE_FLAG_TRICKY;
+
+    error = tt_face_load_hdmx( face, stream );
+    if ( error )
+      goto Exit;
+
+    if ( FT_IS_SCALABLE( ttface ) )
+    {
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+      if ( !ttface->internal->incremental_interface )
+        error = tt_face_load_loca( face, stream );
+      if ( !error )
+        error = tt_face_load_cvt( face, stream );
+      if ( !error )
+        error = tt_face_load_fpgm( face, stream );
+      if ( !error )
+        error = tt_face_load_prep( face, stream );
+
+      /* Check the scalable flag based on `loca'. */
+      if ( !ttface->internal->incremental_interface &&
+           ttface->num_fixed_sizes                  &&
+           face->glyph_locations                    &&
+           tt_check_single_notdef( ttface )         )
+      {
+        FT_TRACE5(( "tt_face_init:"
+                    " Only the `.notdef' glyph has an outline.\n"
+                    "             "
+                    " Resetting scalable flag to FALSE.\n" ));
+
+        ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE;
+      }
+
+#else
+
+      if ( !error )
+        error = tt_face_load_loca( face, stream );
+      if ( !error )
+        error = tt_face_load_cvt( face, stream );
+      if ( !error )
+        error = tt_face_load_fpgm( face, stream );
+      if ( !error )
+        error = tt_face_load_prep( face, stream );
+
+      /* Check the scalable flag based on `loca'. */
+      if ( ttface->num_fixed_sizes          &&
+           face->glyph_locations            &&
+           tt_check_single_notdef( ttface ) )
+      {
+        FT_TRACE5(( "tt_face_init:"
+                    " Only the `.notdef' glyph has an outline.\n"
+                    "             "
+                    " Resetting scalable flag to FALSE.\n" ));
+
+        ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE;
+      }
+
+#endif
+
+    }
+
+#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING    ) && \
+    !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER )
+
+    {
+      FT_Bool  unpatented_hinting;
+      int      i;
+
+
+      /* Determine whether unpatented hinting is to be used for this face. */
+      unpatented_hinting = FT_BOOL
+        ( library->debug_hooks[FT_DEBUG_HOOK_UNPATENTED_HINTING] != NULL );
+
+      for ( i = 0; i < num_params && !face->unpatented_hinting; i++ )
+        if ( params[i].tag == FT_PARAM_TAG_UNPATENTED_HINTING )
+          unpatented_hinting = TRUE;
+
+      if ( !unpatented_hinting )
+        ttface->internal->ignore_unpatented_hinter = TRUE;
+    }
+
+#endif /* TT_CONFIG_OPTION_UNPATENTED_HINTING &&
+          !TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
+
+    /* initialize standard glyph loading routines */
+    TT_Init_Glyph_Loading( face );
+
+  Exit:
+    return error;
+
+  Bad_Format:
+    error = TT_Err_Unknown_File_Format;
+    goto Exit;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_done                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalize a given face object.                                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A pointer to the face object to destroy.                   */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  tt_face_done( FT_Face  ttface )           /* TT_Face */
+  {
+    TT_Face       face = (TT_Face)ttface;
+    FT_Memory     memory;
+    FT_Stream     stream;
+    SFNT_Service  sfnt;
+
+
+    if ( !face )
+      return;
+
+    memory = ttface->memory;
+    stream = ttface->stream;
+    sfnt   = (SFNT_Service)face->sfnt;
+
+    /* for `extended TrueType formats' (i.e. compressed versions) */
+    if ( face->extra.finalizer )
+      face->extra.finalizer( face->extra.data );
+
+    if ( sfnt )
+      sfnt->done_face( face );
+
+    /* freeing the locations table */
+    tt_face_done_loca( face );
+
+    tt_face_free_hdmx( face );
+
+    /* freeing the CVT */
+    FT_FREE( face->cvt );
+    face->cvt_size = 0;
+
+    /* freeing the programs */
+    FT_FRAME_RELEASE( face->font_program );
+    FT_FRAME_RELEASE( face->cvt_program );
+    face->font_program_size = 0;
+    face->cvt_program_size  = 0;
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    tt_done_blend( memory, face->blend );
+    face->blend = NULL;
+#endif
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                           SIZE  FUNCTIONS                             */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_size_run_fpgm                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Run the font program.                                              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    size     :: A handle to the size object.                           */
+  /*                                                                       */
+  /*    pedantic :: Set if bytecode execution should be pedantic.          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_size_run_fpgm( TT_Size  size,
+                    FT_Bool  pedantic )
+  {
+    TT_Face         face = (TT_Face)size->root.face;
+    TT_ExecContext  exec;
+    FT_Error        error;
+
+
+    /* debugging instances have their own context */
+    if ( size->debug )
+      exec = size->context;
+    else
+      exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;
+
+    if ( !exec )
+      return TT_Err_Could_Not_Find_Context;
+
+    TT_Load_Context( exec, face, size );
+
+    exec->callTop = 0;
+    exec->top     = 0;
+
+    exec->period    = 64;
+    exec->phase     = 0;
+    exec->threshold = 0;
+
+    exec->instruction_trap = FALSE;
+    exec->F_dot_P          = 0x10000L;
+
+    exec->pedantic_hinting = pedantic;
+
+    {
+      FT_Size_Metrics*  metrics    = &exec->metrics;
+      TT_Size_Metrics*  tt_metrics = &exec->tt_metrics;
+
+
+      metrics->x_ppem   = 0;
+      metrics->y_ppem   = 0;
+      metrics->x_scale  = 0;
+      metrics->y_scale  = 0;
+
+      tt_metrics->ppem  = 0;
+      tt_metrics->scale = 0;
+      tt_metrics->ratio = 0x10000L;
+    }
+
+    /* allow font program execution */
+    TT_Set_CodeRange( exec,
+                      tt_coderange_font,
+                      face->font_program,
+                      face->font_program_size );
+
+    /* disable CVT and glyph programs coderange */
+    TT_Clear_CodeRange( exec, tt_coderange_cvt );
+    TT_Clear_CodeRange( exec, tt_coderange_glyph );
+
+    if ( face->font_program_size > 0 )
+    {
+      error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 );
+
+      if ( !error )
+      {
+        FT_TRACE4(( "Executing `fpgm' table.\n" ));
+
+        error = face->interpreter( exec );
+      }
+    }
+    else
+      error = TT_Err_Ok;
+
+    if ( !error )
+      TT_Save_Context( exec, size );
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_size_run_prep                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Run the control value program.                                     */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    size     :: A handle to the size object.                           */
+  /*                                                                       */
+  /*    pedantic :: Set if bytecode execution should be pedantic.          */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_size_run_prep( TT_Size  size,
+                    FT_Bool  pedantic )
+  {
+    TT_Face         face = (TT_Face)size->root.face;
+    TT_ExecContext  exec;
+    FT_Error        error;
+
+
+    /* debugging instances have their own context */
+    if ( size->debug )
+      exec = size->context;
+    else
+      exec = ( (TT_Driver)FT_FACE_DRIVER( face ) )->context;
+
+    if ( !exec )
+      return TT_Err_Could_Not_Find_Context;
+
+    TT_Load_Context( exec, face, size );
+
+    exec->callTop = 0;
+    exec->top     = 0;
+
+    exec->instruction_trap = FALSE;
+
+    exec->pedantic_hinting = pedantic;
+
+    TT_Set_CodeRange( exec,
+                      tt_coderange_cvt,
+                      face->cvt_program,
+                      face->cvt_program_size );
+
+    TT_Clear_CodeRange( exec, tt_coderange_glyph );
+
+    if ( face->cvt_program_size > 0 )
+    {
+      error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 );
+
+      if ( !error && !size->debug )
+      {
+        FT_TRACE4(( "Executing `prep' table.\n" ));
+
+        error = face->interpreter( exec );
+      }
+    }
+    else
+      error = TT_Err_Ok;
+
+    /* save as default graphics state */
+    size->GS = exec->GS;
+
+    TT_Save_Context( exec, size );
+
+    return error;
+  }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+  static void
+  tt_size_done_bytecode( FT_Size  ftsize )
+  {
+    TT_Size    size   = (TT_Size)ftsize;
+    TT_Face    face   = (TT_Face)ftsize->face;
+    FT_Memory  memory = face->root.memory;
+
+
+    if ( size->debug )
+    {
+      /* the debug context must be deleted by the debugger itself */
+      size->context = NULL;
+      size->debug   = FALSE;
+    }
+
+    FT_FREE( size->cvt );
+    size->cvt_size = 0;
+
+    /* free storage area */
+    FT_FREE( size->storage );
+    size->storage_size = 0;
+
+    /* twilight zone */
+    tt_glyphzone_done( &size->twilight );
+
+    FT_FREE( size->function_defs );
+    FT_FREE( size->instruction_defs );
+
+    size->num_function_defs    = 0;
+    size->max_function_defs    = 0;
+    size->num_instruction_defs = 0;
+    size->max_instruction_defs = 0;
+
+    size->max_func = 0;
+    size->max_ins  = 0;
+
+    size->bytecode_ready = 0;
+    size->cvt_ready      = 0;
+  }
+
+
+  /* Initialize bytecode-related fields in the size object.       */
+  /* We do this only if bytecode interpretation is really needed. */
+  static FT_Error
+  tt_size_init_bytecode( FT_Size  ftsize,
+                         FT_Bool  pedantic )
+  {
+    FT_Error   error;
+    TT_Size    size = (TT_Size)ftsize;
+    TT_Face    face = (TT_Face)ftsize->face;
+    FT_Memory  memory = face->root.memory;
+    FT_Int     i;
+
+    FT_UShort       n_twilight;
+    TT_MaxProfile*  maxp = &face->max_profile;
+
+
+    size->bytecode_ready = 1;
+    size->cvt_ready      = 0;
+
+    size->max_function_defs    = maxp->maxFunctionDefs;
+    size->max_instruction_defs = maxp->maxInstructionDefs;
+
+    size->num_function_defs    = 0;
+    size->num_instruction_defs = 0;
+
+    size->max_func = 0;
+    size->max_ins  = 0;
+
+    size->cvt_size     = face->cvt_size;
+    size->storage_size = maxp->maxStorage;
+
+    /* Set default metrics */
+    {
+      TT_Size_Metrics*  metrics = &size->ttmetrics;
+
+
+      metrics->rotated   = FALSE;
+      metrics->stretched = FALSE;
+
+      /* set default compensation (all 0) */
+      for ( i = 0; i < 4; i++ )
+        metrics->compensations[i] = 0;
+    }
+
+    /* allocate function defs, instruction defs, cvt, and storage area */
+    if ( FT_NEW_ARRAY( size->function_defs,    size->max_function_defs    ) ||
+         FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) ||
+         FT_NEW_ARRAY( size->cvt,              size->cvt_size             ) ||
+         FT_NEW_ARRAY( size->storage,          size->storage_size         ) )
+      goto Exit;
+
+    /* reserve twilight zone */
+    n_twilight = maxp->maxTwilightPoints;
+
+    /* there are 4 phantom points (do we need this?) */
+    n_twilight += 4;
+
+    error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight );
+    if ( error )
+      goto Exit;
+
+    size->twilight.n_points = n_twilight;
+
+    size->GS = tt_default_graphics_state;
+
+    /* set `face->interpreter' according to the debug hook present */
+    {
+      FT_Library  library = face->root.driver->root.library;
+
+
+      face->interpreter = (TT_Interpreter)
+                            library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE];
+      if ( !face->interpreter )
+        face->interpreter = (TT_Interpreter)TT_RunIns;
+    }
+
+    /* Fine, now run the font program! */
+    error = tt_size_run_fpgm( size, pedantic );
+
+  Exit:
+    if ( error )
+      tt_size_done_bytecode( ftsize );
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_size_ready_bytecode( TT_Size  size,
+                          FT_Bool  pedantic )
+  {
+    FT_Error  error = TT_Err_Ok;
+
+
+    if ( !size->bytecode_ready )
+    {
+      error = tt_size_init_bytecode( (FT_Size)size, pedantic );
+      if ( error )
+        goto Exit;
+    }
+
+    /* rescale CVT when needed */
+    if ( !size->cvt_ready )
+    {
+      FT_UInt  i;
+      TT_Face  face = (TT_Face)size->root.face;
+
+
+      /* Scale the cvt values to the new ppem.          */
+      /* We use by default the y ppem to scale the CVT. */
+      for ( i = 0; i < size->cvt_size; i++ )
+        size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
+
+      /* all twilight points are originally zero */
+      for ( i = 0; i < (FT_UInt)size->twilight.n_points; i++ )
+      {
+        size->twilight.org[i].x = 0;
+        size->twilight.org[i].y = 0;
+        size->twilight.cur[i].x = 0;
+        size->twilight.cur[i].y = 0;
+      }
+
+      /* clear storage area */
+      for ( i = 0; i < (FT_UInt)size->storage_size; i++ )
+        size->storage[i] = 0;
+
+      size->GS = tt_default_graphics_state;
+
+      error = tt_size_run_prep( size, pedantic );
+      if ( !error )
+        size->cvt_ready = 1;
+    }
+
+  Exit:
+    return error;
+  }
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_size_init                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initialize a new TrueType size object.                             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    size :: A handle to the size object.                               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_size_init( FT_Size  ttsize )           /* TT_Size */
+  {
+    TT_Size   size  = (TT_Size)ttsize;
+    FT_Error  error = TT_Err_Ok;
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+    size->bytecode_ready = 0;
+    size->cvt_ready      = 0;
+#endif
+
+    size->ttmetrics.valid = FALSE;
+    size->strike_index    = 0xFFFFFFFFUL;
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_size_done                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The TrueType size object finalizer.                                */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    size :: A handle to the target size object.                        */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  tt_size_done( FT_Size  ttsize )           /* TT_Size */
+  {
+    TT_Size  size = (TT_Size)ttsize;
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+    if ( size->bytecode_ready )
+      tt_size_done_bytecode( ttsize );
+#endif
+
+    size->ttmetrics.valid = FALSE;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_size_reset                                                      */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Reset a TrueType size when resolutions and character dimensions    */
+  /*    have been changed.                                                 */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    size :: A handle to the target size object.                        */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_size_reset( TT_Size  size )
+  {
+    TT_Face           face;
+    FT_Error          error = TT_Err_Ok;
+    FT_Size_Metrics*  metrics;
+
+
+    size->ttmetrics.valid = FALSE;
+
+    face = (TT_Face)size->root.face;
+
+    metrics = &size->metrics;
+
+    /* copy the result from base layer */
+    *metrics = size->root.metrics;
+
+    if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 )
+      return TT_Err_Invalid_PPem;
+
+    /* This bit flag, if set, indicates that the ppems must be       */
+    /* rounded to integers.  Nearly all TrueType fonts have this bit */
+    /* set, as hinting won't work really well otherwise.             */
+    /*                                                               */
+    if ( face->header.Flags & 8 )
+    {
+      metrics->x_scale = FT_DivFix( metrics->x_ppem << 6,
+                                    face->root.units_per_EM );
+      metrics->y_scale = FT_DivFix( metrics->y_ppem << 6,
+                                    face->root.units_per_EM );
+
+      metrics->ascender =
+        FT_PIX_ROUND( FT_MulFix( face->root.ascender, metrics->y_scale ) );
+      metrics->descender =
+        FT_PIX_ROUND( FT_MulFix( face->root.descender, metrics->y_scale ) );
+      metrics->height =
+        FT_PIX_ROUND( FT_MulFix( face->root.height, metrics->y_scale ) );
+      metrics->max_advance =
+        FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width,
+                                 metrics->x_scale ) );
+    }
+
+    /* compute new transformation */
+    if ( metrics->x_ppem >= metrics->y_ppem )
+    {
+      size->ttmetrics.scale   = metrics->x_scale;
+      size->ttmetrics.ppem    = metrics->x_ppem;
+      size->ttmetrics.x_ratio = 0x10000L;
+      size->ttmetrics.y_ratio = FT_MulDiv( metrics->y_ppem,
+                                           0x10000L,
+                                           metrics->x_ppem );
+    }
+    else
+    {
+      size->ttmetrics.scale   = metrics->y_scale;
+      size->ttmetrics.ppem    = metrics->y_ppem;
+      size->ttmetrics.x_ratio = FT_MulDiv( metrics->x_ppem,
+                                           0x10000L,
+                                           metrics->y_ppem );
+      size->ttmetrics.y_ratio = 0x10000L;
+    }
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+    size->cvt_ready = 0;
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+    if ( !error )
+      size->ttmetrics.valid = TRUE;
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_driver_init                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initialize a given TrueType driver object.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    driver :: A handle to the target driver object.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_driver_init( FT_Module  ttdriver )     /* TT_Driver */
+  {
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    TT_Driver  driver = (TT_Driver)ttdriver;
+
+
+    if ( !TT_New_Context( driver ) )
+      return TT_Err_Could_Not_Find_Context;
+
+#else
+
+    FT_UNUSED( ttdriver );
+
+#endif
+
+    return TT_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_driver_done                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalize a given TrueType driver.                                  */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    driver :: A handle to the target TrueType driver.                  */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  tt_driver_done( FT_Module  ttdriver )     /* TT_Driver */
+  {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+    TT_Driver  driver = (TT_Driver)ttdriver;
+
+
+    /* destroy the execution context */
+    if ( driver->context )
+    {
+      TT_Done_Context( driver->context );
+      driver->context = NULL;
+    }
+#else
+    FT_UNUSED( ttdriver );
+#endif
+
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_slot_init                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initialize a new slot object.                                      */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    slot :: A handle to the slot object.                               */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_slot_init( FT_GlyphSlot  slot )
+  {
+    return FT_GlyphLoader_CreateExtra( slot->internal->loader );
+  }
+
+
+/* END */
diff --git a/src/truetype/ttobjs.h b/src/truetype/ttobjs.h
new file mode 100644 (file)
index 0000000..47e4129
--- /dev/null
@@ -0,0 +1,435 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttobjs.h                                                               */
+/*                                                                         */
+/*    Objects manager (specification).                                     */
+/*                                                                         */
+/*  Copyright 1996-2009, 2011-2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTOBJS_H__
+#define __TTOBJS_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_TRUETYPE_TYPES_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    TT_Driver                                                          */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a TrueType driver object.                              */
+  /*                                                                       */
+  typedef struct TT_DriverRec_*  TT_Driver;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    TT_Instance                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a TrueType size object.                                */
+  /*                                                                       */
+  typedef struct TT_SizeRec_*  TT_Size;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    TT_GlyphSlot                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a TrueType glyph slot object.                          */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    This is a direct typedef of FT_GlyphSlot, as there is nothing      */
+  /*    specific about the TrueType glyph slot.                            */
+  /*                                                                       */
+  typedef FT_GlyphSlot  TT_GlyphSlot;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    TT_GraphicsState                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The TrueType graphics state used during bytecode interpretation.   */
+  /*                                                                       */
+  typedef struct  TT_GraphicsState_
+  {
+    FT_UShort      rp0;
+    FT_UShort      rp1;
+    FT_UShort      rp2;
+
+    FT_UnitVector  dualVector;
+    FT_UnitVector  projVector;
+    FT_UnitVector  freeVector;
+
+#ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING
+    FT_Bool        both_x_axis;
+#endif
+
+    FT_Long        loop;
+    FT_F26Dot6     minimum_distance;
+    FT_Int         round_state;
+
+    FT_Bool        auto_flip;
+    FT_F26Dot6     control_value_cutin;
+    FT_F26Dot6     single_width_cutin;
+    FT_F26Dot6     single_width_value;
+    FT_Short       delta_base;
+    FT_Short       delta_shift;
+
+    FT_Byte        instruct_control;
+    /* According to Greg Hitchcock from Microsoft, the `scan_control'     */
+    /* variable as documented in the TrueType specification is a 32-bit   */
+    /* integer; the high-word part holds the SCANTYPE value, the low-word */
+    /* part the SCANCTRL value.  We separate it into two fields.          */
+    FT_Bool        scan_control;
+    FT_Int         scan_type;
+
+    FT_UShort      gep0;
+    FT_UShort      gep1;
+    FT_UShort      gep2;
+
+  } TT_GraphicsState;
+
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+  FT_LOCAL( void )
+  tt_glyphzone_done( TT_GlyphZone  zone );
+
+  FT_LOCAL( FT_Error )
+  tt_glyphzone_new( FT_Memory     memory,
+                    FT_UShort     maxPoints,
+                    FT_Short      maxContours,
+                    TT_GlyphZone  zone );
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*  EXECUTION SUBTABLES                                                  */
+  /*                                                                       */
+  /*  These sub-tables relate to instruction execution.                    */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#define TT_MAX_CODE_RANGES  3
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* There can only be 3 active code ranges at once:                       */
+  /*   - the Font Program                                                  */
+  /*   - the CVT Program                                                   */
+  /*   - a glyph's instructions set                                        */
+  /*                                                                       */
+  typedef enum  TT_CodeRange_Tag_
+  {
+    tt_coderange_none = 0,
+    tt_coderange_font,
+    tt_coderange_cvt,
+    tt_coderange_glyph
+
+  } TT_CodeRange_Tag;
+
+
+  typedef struct  TT_CodeRange_
+  {
+    FT_Byte*  base;
+    FT_ULong  size;
+
+  } TT_CodeRange;
+
+  typedef TT_CodeRange  TT_CodeRangeTable[TT_MAX_CODE_RANGES];
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Defines a function/instruction definition record.                     */
+  /*                                                                       */
+  typedef struct  TT_DefRecord_
+  {
+    FT_Int   range;      /* in which code range is it located? */
+    FT_Long  start;      /* where does it start?               */
+    FT_Long  end;        /* where does it end?                 */
+    FT_UInt  opc;        /* function #, or instruction code    */
+    FT_Bool  active;     /* is it active?                      */
+
+  } TT_DefRecord, *TT_DefArray;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Subglyph transformation record.                                       */
+  /*                                                                       */
+  typedef struct  TT_Transform_
+  {
+    FT_Fixed    xx, xy;     /* transformation matrix coefficients */
+    FT_Fixed    yx, yy;
+    FT_F26Dot6  ox, oy;     /* offsets        */
+
+  } TT_Transform;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* A note regarding non-squared pixels:                                  */
+  /*                                                                       */
+  /* (This text will probably go into some docs at some time; for now, it  */
+  /* is kept here to explain some definitions in the TT_Size_Metrics       */
+  /* record).                                                              */
+  /*                                                                       */
+  /* The CVT is a one-dimensional array containing values that control     */
+  /* certain important characteristics in a font, like the height of all   */
+  /* capitals, all lowercase letter, default spacing or stem width/height. */
+  /*                                                                       */
+  /* These values are found in FUnits in the font file, and must be scaled */
+  /* to pixel coordinates before being used by the CVT and glyph programs. */
+  /* Unfortunately, when using distinct x and y resolutions (or distinct x */
+  /* and y pointsizes), there are two possible scalings.                   */
+  /*                                                                       */
+  /* A first try was to implement a `lazy' scheme where all values were    */
+  /* scaled when first used.  However, while some values are always used   */
+  /* in the same direction, some others are used under many different      */
+  /* circumstances and orientations.                                       */
+  /*                                                                       */
+  /* I have found a simpler way to do the same, and it even seems to work  */
+  /* in most of the cases:                                                 */
+  /*                                                                       */
+  /* - All CVT values are scaled to the maximum ppem size.                 */
+  /*                                                                       */
+  /* - When performing a read or write in the CVT, a ratio factor is used  */
+  /*   to perform adequate scaling.  Example:                              */
+  /*                                                                       */
+  /*     x_ppem = 14                                                       */
+  /*     y_ppem = 10                                                       */
+  /*                                                                       */
+  /*   We choose ppem = x_ppem = 14 as the CVT scaling size.  All cvt      */
+  /*   entries are scaled to it.                                           */
+  /*                                                                       */
+  /*     x_ratio = 1.0                                                     */
+  /*     y_ratio = y_ppem/ppem (< 1.0)                                     */
+  /*                                                                       */
+  /*   We compute the current ratio like:                                  */
+  /*                                                                       */
+  /*   - If projVector is horizontal,                                      */
+  /*       ratio = x_ratio = 1.0                                           */
+  /*                                                                       */
+  /*   - if projVector is vertical,                                        */
+  /*       ratio = y_ratio                                                 */
+  /*                                                                       */
+  /*   - else,                                                             */
+  /*       ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) */
+  /*                                                                       */
+  /*   Reading a cvt value returns                                         */
+  /*     ratio * cvt[index]                                                */
+  /*                                                                       */
+  /*   Writing a cvt value in pixels:                                      */
+  /*     cvt[index] / ratio                                                */
+  /*                                                                       */
+  /*   The current ppem is simply                                          */
+  /*     ratio * ppem                                                      */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Metrics used by the TrueType size and context objects.                */
+  /*                                                                       */
+  typedef struct  TT_Size_Metrics_
+  {
+    /* for non-square pixels */
+    FT_Long     x_ratio;
+    FT_Long     y_ratio;
+
+    FT_UShort   ppem;               /* maximum ppem size              */
+    FT_Long     ratio;              /* current ratio                  */
+    FT_Fixed    scale;
+
+    FT_F26Dot6  compensations[4];   /* device-specific compensations  */
+
+    FT_Bool     valid;
+
+    FT_Bool     rotated;            /* `is the glyph rotated?'-flag   */
+    FT_Bool     stretched;          /* `is the glyph stretched?'-flag */
+
+  } TT_Size_Metrics;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TrueType size class.                                                  */
+  /*                                                                       */
+  typedef struct  TT_SizeRec_
+  {
+    FT_SizeRec         root;
+
+    /* we have our own copy of metrics so that we can modify */
+    /* it without affecting auto-hinting (when used)         */
+    FT_Size_Metrics    metrics;
+
+    TT_Size_Metrics    ttmetrics;
+
+    FT_ULong           strike_index;      /* 0xFFFFFFFF to indicate invalid */
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    FT_UInt            num_function_defs; /* number of function definitions */
+    FT_UInt            max_function_defs;
+    TT_DefArray        function_defs;     /* table of function definitions  */
+
+    FT_UInt            num_instruction_defs;  /* number of ins. definitions */
+    FT_UInt            max_instruction_defs;
+    TT_DefArray        instruction_defs;      /* table of ins. definitions  */
+
+    FT_UInt            max_func;
+    FT_UInt            max_ins;
+
+    TT_CodeRangeTable  codeRangeTable;
+
+    TT_GraphicsState   GS;
+
+    FT_ULong           cvt_size;      /* the scaled control value table */
+    FT_Long*           cvt;
+
+    FT_UShort          storage_size; /* The storage area is now part of */
+    FT_Long*           storage;      /* the instance                    */
+
+    TT_GlyphZoneRec    twilight;     /* The instance's twilight zone    */
+
+    /* debugging variables */
+
+    /* When using the debugger, we must keep the */
+    /* execution context tied to the instance    */
+    /* object rather than asking it on demand.   */
+
+    FT_Bool            debug;
+    TT_ExecContext     context;
+
+    FT_Bool            bytecode_ready;
+    FT_Bool            cvt_ready;
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+  } TT_SizeRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* TrueType driver class.                                                */
+  /*                                                                       */
+  typedef struct  TT_DriverRec_
+  {
+    FT_DriverRec     root;
+    TT_ExecContext   context;  /* execution context        */
+    TT_GlyphZoneRec  zone;     /* glyph loader points zone */
+
+    void*            extension_component;
+
+  } TT_DriverRec;
+
+
+  /* Note: All of the functions below (except tt_size_reset()) are used    */
+  /* as function pointers in a FT_Driver_ClassRec.  Therefore their        */
+  /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face,  */
+  /* TT_Size, etc., so that the compiler can confirm that the types and    */
+  /* number of parameters are correct.  In all cases the FT_xxx types are  */
+  /* cast to their TT_xxx counterparts inside the functions since FreeType */
+  /* will always use the TT driver to create them.                         */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Face functions                                                        */
+  /*                                                                       */
+  FT_LOCAL( FT_Error )
+  tt_face_init( FT_Stream      stream,
+                FT_Face        ttface,      /* TT_Face */
+                FT_Int         face_index,
+                FT_Int         num_params,
+                FT_Parameter*  params );
+
+  FT_LOCAL( void )
+  tt_face_done( FT_Face  ttface );          /* TT_Face */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Size functions                                                        */
+  /*                                                                       */
+  FT_LOCAL( FT_Error )
+  tt_size_init( FT_Size  ttsize );          /* TT_Size */
+
+  FT_LOCAL( void )
+  tt_size_done( FT_Size  ttsize );          /* TT_Size */
+
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+  FT_LOCAL( FT_Error )
+  tt_size_run_fpgm( TT_Size  size,
+                    FT_Bool  pedantic );
+
+  FT_LOCAL( FT_Error )
+  tt_size_run_prep( TT_Size  size,
+                    FT_Bool  pedantic );
+
+  FT_LOCAL( FT_Error )
+  tt_size_ready_bytecode( TT_Size  size,
+                          FT_Bool  pedantic );
+
+#endif /* TT_USE_BYTECODE_INTERPRETER */
+
+  FT_LOCAL( FT_Error )
+  tt_size_reset( TT_Size  size );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Driver functions                                                      */
+  /*                                                                       */
+  FT_LOCAL( FT_Error )
+  tt_driver_init( FT_Module  ttdriver );    /* TT_Driver */
+
+  FT_LOCAL( void )
+  tt_driver_done( FT_Module  ttdriver );    /* TT_Driver */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Slot functions                                                        */
+  /*                                                                       */
+  FT_LOCAL( FT_Error )
+  tt_slot_init( FT_GlyphSlot  slot );
+
+
+FT_END_HEADER
+
+#endif /* __TTOBJS_H__ */
+
+
+/* END */
diff --git a/src/truetype/ttpic.c b/src/truetype/ttpic.c
new file mode 100644 (file)
index 0000000..65ca845
--- /dev/null
@@ -0,0 +1,100 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttpic.c                                                                */
+/*                                                                         */
+/*    The FreeType position independent code services for truetype module. */
+/*                                                                         */
+/*  Copyright 2009, 2010 by                                                */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_INTERNAL_OBJECTS_H
+#include "ttpic.h"
+#include "tterrors.h"
+
+#ifdef FT_CONFIG_OPTION_PIC
+
+  /* forward declaration of PIC init functions from ttdriver.c */
+  FT_Error
+  FT_Create_Class_tt_services( FT_Library           library,
+                               FT_ServiceDescRec**  output_class );
+
+  void
+  FT_Destroy_Class_tt_services( FT_Library          library,
+                                FT_ServiceDescRec*  clazz );
+
+  void
+  FT_Init_Class_tt_service_gx_multi_masters(
+    FT_Service_MultiMastersRec*  sv_mm );
+
+  void
+  FT_Init_Class_tt_service_truetype_glyf(
+    FT_Service_TTGlyfRec*  sv_ttglyf );
+
+  void
+  tt_driver_class_pic_free( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Memory  memory = library->memory;
+
+
+    if ( pic_container->truetype )
+    {
+      TTModulePIC*  container = (TTModulePIC*)pic_container->truetype;
+
+
+      if ( container->tt_services )
+        FT_Destroy_Class_tt_services( library, container->tt_services );
+      container->tt_services = NULL;
+      FT_FREE( container );
+      pic_container->truetype = NULL;
+    }
+  }
+
+
+  FT_Error
+  tt_driver_class_pic_init( FT_Library  library )
+  {
+    FT_PIC_Container*  pic_container = &library->pic_container;
+    FT_Error           error         = TT_Err_Ok;
+    TTModulePIC*       container;
+    FT_Memory          memory        = library->memory;
+
+
+    /* allocate pointer, clear and set global container pointer */
+    if ( FT_ALLOC ( container, sizeof ( *container ) ) )
+      return error;
+    FT_MEM_SET( container, 0, sizeof ( *container ) );
+    pic_container->truetype = container;
+
+    /* initialize pointer table - this is how the module usually expects this data */
+    error = FT_Create_Class_tt_services( library,
+                                         &container->tt_services );
+    if ( error )
+      goto Exit;
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    FT_Init_Class_tt_service_gx_multi_masters(
+      &container->tt_service_gx_multi_masters );
+#endif
+    FT_Init_Class_tt_service_truetype_glyf(
+      &container->tt_service_truetype_glyf );
+Exit:
+    if ( error )
+      tt_driver_class_pic_free( library );
+    return error;
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+/* END */
diff --git a/src/truetype/ttpic.h b/src/truetype/ttpic.h
new file mode 100644 (file)
index 0000000..48f43a5
--- /dev/null
@@ -0,0 +1,66 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttpic.h                                                                */
+/*                                                                         */
+/*    The FreeType position independent code services for truetype module. */
+/*                                                                         */
+/*  Copyright 2009 by                                                      */
+/*  Oran Agra and Mickey Gabel.                                            */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTPIC_H__
+#define __TTPIC_H__
+
+
+FT_BEGIN_HEADER
+
+#ifndef FT_CONFIG_OPTION_PIC
+#define FT_TT_SERVICES_GET                   tt_services
+#define FT_TT_SERVICE_GX_MULTI_MASTERS_GET   tt_service_gx_multi_masters
+#define FT_TT_SERVICE_TRUETYPE_GLYF_GET      tt_service_truetype_glyf
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#include FT_MULTIPLE_MASTERS_H
+#include FT_SERVICE_MULTIPLE_MASTERS_H
+#include FT_SERVICE_TRUETYPE_GLYF_H
+
+  typedef struct TTModulePIC_
+  {
+    FT_ServiceDescRec* tt_services;
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    FT_Service_MultiMastersRec tt_service_gx_multi_masters;
+#endif
+    FT_Service_TTGlyfRec tt_service_truetype_glyf;
+  } TTModulePIC;
+
+#define GET_PIC(lib)                         ((TTModulePIC*)((lib)->pic_container.truetype))
+#define FT_TT_SERVICES_GET                   (GET_PIC(library)->tt_services)
+#define FT_TT_SERVICE_GX_MULTI_MASTERS_GET   (GET_PIC(library)->tt_service_gx_multi_masters)
+#define FT_TT_SERVICE_TRUETYPE_GLYF_GET      (GET_PIC(library)->tt_service_truetype_glyf)
+
+  /* see ttpic.c for the implementation */
+  void
+  tt_driver_class_pic_free( FT_Library  library );
+
+  FT_Error
+  tt_driver_class_pic_init( FT_Library  library );
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+ /* */
+
+FT_END_HEADER
+
+#endif /* __TTPIC_H__ */
+
+
+/* END */
diff --git a/src/truetype/ttpload.c b/src/truetype/ttpload.c
new file mode 100644 (file)
index 0000000..bb6005d
--- /dev/null
@@ -0,0 +1,599 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttpload.c                                                              */
+/*                                                                         */
+/*    TrueType-specific tables loader (body).                              */
+/*                                                                         */
+/*  Copyright 1996-2002, 2004-2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_STREAM_H
+#include FT_TRUETYPE_TAGS_H
+
+#include "ttpload.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include "ttgxvar.h"
+#endif
+
+#include "tterrors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_ttpload
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_loca                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the locations table.                                          */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: The input stream.                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_loca( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error  error;
+    FT_ULong  table_len;
+    FT_Int    shift;
+
+
+    /* we need the size of the `glyf' table for malformed `loca' tables */
+    error = face->goto_table( face, TTAG_glyf, stream, &face->glyf_len );
+
+    /* it is possible that a font doesn't have a glyf table at all */
+    /* or its size is zero                                         */
+    if ( error == TT_Err_Table_Missing )
+      face->glyf_len = 0;
+    else if ( error )
+      goto Exit;
+
+    FT_TRACE2(( "Locations " ));
+    error = face->goto_table( face, TTAG_loca, stream, &table_len );
+    if ( error )
+    {
+      error = TT_Err_Locations_Missing;
+      goto Exit;
+    }
+
+    if ( face->header.Index_To_Loc_Format != 0 )
+    {
+      shift = 2;
+
+      if ( table_len >= 0x40000L )
+      {
+        FT_TRACE2(( "table too large\n" ));
+        error = TT_Err_Invalid_Table;
+        goto Exit;
+      }
+      face->num_locations = table_len >> shift;
+    }
+    else
+    {
+      shift = 1;
+
+      if ( table_len >= 0x20000L )
+      {
+        FT_TRACE2(( "table too large\n" ));
+        error = TT_Err_Invalid_Table;
+        goto Exit;
+      }
+      face->num_locations = table_len >> shift;
+    }
+
+    if ( face->num_locations != (FT_ULong)face->root.num_glyphs + 1 )
+    {
+      FT_TRACE2(( "glyph count mismatch!  loca: %d, maxp: %d\n",
+                  face->num_locations - 1, face->root.num_glyphs ));
+
+      /* we only handle the case where `maxp' gives a larger value */
+      if ( face->num_locations <= (FT_ULong)face->root.num_glyphs )
+      {
+        FT_Long   new_loca_len =
+                    ( (FT_Long)( face->root.num_glyphs ) + 1 ) << shift;
+
+        TT_Table  entry = face->dir_tables;
+        TT_Table  limit = entry + face->num_tables;
+
+        FT_Long   pos  = FT_Stream_Pos( stream );
+        FT_Long   dist = 0x7FFFFFFFL;
+
+
+        /* compute the distance to next table in font file */
+        for ( ; entry < limit; entry++ )
+        {
+          FT_Long  diff = entry->Offset - pos;
+
+
+          if ( diff > 0 && diff < dist )
+            dist = diff;
+        }
+
+        if ( entry == limit )
+        {
+          /* `loca' is the last table */
+          dist = stream->size - pos;
+        }
+
+        if ( new_loca_len <= dist )
+        {
+          face->num_locations = face->root.num_glyphs + 1;
+          table_len           = new_loca_len;
+
+          FT_TRACE2(( "adjusting num_locations to %d\n",
+                      face->num_locations ));
+        }
+      }
+    }
+
+    /*
+     * Extract the frame.  We don't need to decompress it since
+     * we are able to parse it directly.
+     */
+    if ( FT_FRAME_EXTRACT( table_len, face->glyph_locations ) )
+      goto Exit;
+
+    FT_TRACE2(( "loaded\n" ));
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_ULong )
+  tt_face_get_location( TT_Face   face,
+                        FT_UInt   gindex,
+                        FT_UInt  *asize )
+  {
+    FT_ULong  pos1, pos2;
+    FT_Byte*  p;
+    FT_Byte*  p_limit;
+
+
+    pos1 = pos2 = 0;
+
+    if ( gindex < face->num_locations )
+    {
+      if ( face->header.Index_To_Loc_Format != 0 )
+      {
+        p       = face->glyph_locations + gindex * 4;
+        p_limit = face->glyph_locations + face->num_locations * 4;
+
+        pos1 = FT_NEXT_ULONG( p );
+        pos2 = pos1;
+
+        if ( p + 4 <= p_limit )
+          pos2 = FT_NEXT_ULONG( p );
+      }
+      else
+      {
+        p       = face->glyph_locations + gindex * 2;
+        p_limit = face->glyph_locations + face->num_locations * 2;
+
+        pos1 = FT_NEXT_USHORT( p );
+        pos2 = pos1;
+
+        if ( p + 2 <= p_limit )
+          pos2 = FT_NEXT_USHORT( p );
+
+        pos1 <<= 1;
+        pos2 <<= 1;
+      }
+    }
+
+    /* Check broken location data */
+    if ( pos1 > face->glyf_len )
+    {
+      FT_TRACE1(( "tt_face_get_location:"
+                  " too large offset=0x%08lx found for gid=0x%04lx,"
+                  " exceeding the end of glyf table (0x%08lx)\n",
+                  pos1, gindex, face->glyf_len ));
+      *asize = 0;
+      return 0;
+    }
+
+    if ( pos2 > face->glyf_len )
+    {
+      FT_TRACE1(( "tt_face_get_location:"
+                  " too large offset=0x%08lx found for gid=0x%04lx,"
+                  " truncate at the end of glyf table (0x%08lx)\n",
+                  pos2, gindex + 1, face->glyf_len ));
+      pos2 = face->glyf_len;
+    }
+
+    /* The `loca' table must be ordered; it refers to the length of */
+    /* an entry as the difference between the current and the next  */
+    /* position.  However, there do exist (malformed) fonts which   */
+    /* don't obey this rule, so we are only able to provide an      */
+    /* upper bound for the size.                                    */
+    /*                                                              */
+    /* We get (intentionally) a wrong, non-zero result in case the  */
+    /* `glyf' table is missing.                                     */
+    if ( pos2 >= pos1 )
+      *asize = (FT_UInt)( pos2 - pos1 );
+    else
+      *asize = (FT_UInt)( face->glyf_len - pos1 );
+
+    return pos1;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  tt_face_done_loca( TT_Face  face )
+  {
+    FT_Stream  stream = face->root.stream;
+
+
+    FT_FRAME_RELEASE( face->glyph_locations );
+    face->num_locations = 0;
+  }
+
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_cvt                                                   */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the control value table into a face object.                   */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: A handle to the input stream.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_cvt( TT_Face    face,
+                    FT_Stream  stream )
+  {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    FT_Error   error;
+    FT_Memory  memory = stream->memory;
+    FT_ULong   table_len;
+
+
+    FT_TRACE2(( "CVT " ));
+
+    error = face->goto_table( face, TTAG_cvt, stream, &table_len );
+    if ( error )
+    {
+      FT_TRACE2(( "is missing\n" ));
+
+      face->cvt_size = 0;
+      face->cvt      = NULL;
+      error          = TT_Err_Ok;
+
+      goto Exit;
+    }
+
+    face->cvt_size = table_len / 2;
+
+    if ( FT_NEW_ARRAY( face->cvt, face->cvt_size ) )
+      goto Exit;
+
+    if ( FT_FRAME_ENTER( face->cvt_size * 2L ) )
+      goto Exit;
+
+    {
+      FT_Short*  cur   = face->cvt;
+      FT_Short*  limit = cur + face->cvt_size;
+
+
+      for ( ; cur < limit; cur++ )
+        *cur = FT_GET_SHORT();
+    }
+
+    FT_FRAME_EXIT();
+    FT_TRACE2(( "loaded\n" ));
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+    if ( face->doblend )
+      error = tt_face_vary_cvt( face, stream );
+#endif
+
+  Exit:
+    return error;
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+    FT_UNUSED( face   );
+    FT_UNUSED( stream );
+
+    return TT_Err_Ok;
+
+#endif
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_fpgm                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the font program.                                             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: A handle to the input stream.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_fpgm( TT_Face    face,
+                     FT_Stream  stream )
+  {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    FT_Error  error;
+    FT_ULong  table_len;
+
+
+    FT_TRACE2(( "Font program " ));
+
+    /* The font program is optional */
+    error = face->goto_table( face, TTAG_fpgm, stream, &table_len );
+    if ( error )
+    {
+      face->font_program      = NULL;
+      face->font_program_size = 0;
+      error                   = TT_Err_Ok;
+
+      FT_TRACE2(( "is missing\n" ));
+    }
+    else
+    {
+      face->font_program_size = table_len;
+      if ( FT_FRAME_EXTRACT( table_len, face->font_program ) )
+        goto Exit;
+
+      FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size ));
+    }
+
+  Exit:
+    return error;
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+    FT_UNUSED( face   );
+    FT_UNUSED( stream );
+
+    return TT_Err_Ok;
+
+#endif
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_prep                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the cvt program.                                              */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream :: A handle to the input stream.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_prep( TT_Face    face,
+                     FT_Stream  stream )
+  {
+#ifdef TT_USE_BYTECODE_INTERPRETER
+
+    FT_Error  error;
+    FT_ULong  table_len;
+
+
+    FT_TRACE2(( "Prep program " ));
+
+    error = face->goto_table( face, TTAG_prep, stream, &table_len );
+    if ( error )
+    {
+      face->cvt_program      = NULL;
+      face->cvt_program_size = 0;
+      error                  = TT_Err_Ok;
+
+      FT_TRACE2(( "is missing\n" ));
+    }
+    else
+    {
+      face->cvt_program_size = table_len;
+      if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) )
+        goto Exit;
+
+      FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size ));
+    }
+
+  Exit:
+    return error;
+
+#else /* !TT_USE_BYTECODE_INTERPRETER */
+
+    FT_UNUSED( face   );
+    FT_UNUSED( stream );
+
+    return TT_Err_Ok;
+
+#endif
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    tt_face_load_hdmx                                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Load the `hdmx' table into the face object.                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face   :: A handle to the target face object.                      */
+  /*                                                                       */
+  /*    stream :: A handle to the input stream.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+
+  FT_LOCAL_DEF( FT_Error )
+  tt_face_load_hdmx( TT_Face    face,
+                     FT_Stream  stream )
+  {
+    FT_Error   error;
+    FT_Memory  memory = stream->memory;
+    FT_UInt    version, nn, num_records;
+    FT_ULong   table_size, record_size;
+    FT_Byte*   p;
+    FT_Byte*   limit;
+
+
+    /* this table is optional */
+    error = face->goto_table( face, TTAG_hdmx, stream, &table_size );
+    if ( error || table_size < 8 )
+      return TT_Err_Ok;
+
+    if ( FT_FRAME_EXTRACT( table_size, face->hdmx_table ) )
+      goto Exit;
+
+    p     = face->hdmx_table;
+    limit = p + table_size;
+
+    version     = FT_NEXT_USHORT( p );
+    num_records = FT_NEXT_USHORT( p );
+    record_size = FT_NEXT_ULONG( p );
+
+    /* The maximum number of bytes in an hdmx device record is the */
+    /* maximum number of glyphs + 2; this is 0xFFFF + 2; this is   */
+    /* the reason why `record_size' is a long (which we read as    */
+    /* unsigned long for convenience).  In practice, two bytes     */
+    /* sufficient to hold the size value.                          */
+    /*                                                             */
+    /* There are at least two fonts, HANNOM-A and HANNOM-B version */
+    /* 2.0 (2005), which get this wrong: The upper two bytes of    */
+    /* the size value are set to 0xFF instead of 0x00.  We catch   */
+    /* and fix this.                                               */
+
+    if ( record_size >= 0xFFFF0000UL )
+      record_size &= 0xFFFFU;
+
+    /* The limit for `num_records' is a heuristic value. */
+
+    if ( version != 0 || num_records > 255 || record_size > 0x10001L )
+    {
+      error = TT_Err_Invalid_File_Format;
+      goto Fail;
+    }
+
+    if ( FT_NEW_ARRAY( face->hdmx_record_sizes, num_records ) )
+      goto Fail;
+
+    for ( nn = 0; nn < num_records; nn++ )
+    {
+      if ( p + record_size > limit )
+        break;
+
+      face->hdmx_record_sizes[nn] = p[0];
+      p                          += record_size;
+    }
+
+    face->hdmx_record_count = nn;
+    face->hdmx_table_size   = table_size;
+    face->hdmx_record_size  = record_size;
+
+  Exit:
+    return error;
+
+  Fail:
+    FT_FRAME_RELEASE( face->hdmx_table );
+    face->hdmx_table_size = 0;
+    goto Exit;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  tt_face_free_hdmx( TT_Face  face )
+  {
+    FT_Stream  stream = face->root.stream;
+    FT_Memory  memory = stream->memory;
+
+
+    FT_FREE( face->hdmx_record_sizes );
+    FT_FRAME_RELEASE( face->hdmx_table );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Return the advance width table for a given pixel size if it is found  */
+  /* in the font's `hdmx' table (if any).                                  */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Byte* )
+  tt_face_get_device_metrics( TT_Face  face,
+                              FT_UInt  ppem,
+                              FT_UInt  gindex )
+  {
+    FT_UInt   nn;
+    FT_Byte*  result      = NULL;
+    FT_ULong  record_size = face->hdmx_record_size;
+    FT_Byte*  record      = face->hdmx_table + 8;
+
+
+    for ( nn = 0; nn < face->hdmx_record_count; nn++ )
+      if ( face->hdmx_record_sizes[nn] == ppem )
+      {
+        gindex += 2;
+        if ( gindex < record_size )
+          result = record + nn * record_size + gindex;
+        break;
+      }
+
+    return result;
+  }
+
+
+/* END */
diff --git a/src/truetype/ttpload.h b/src/truetype/ttpload.h
new file mode 100644 (file)
index 0000000..f61ac07
--- /dev/null
@@ -0,0 +1,75 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ttpload.h                                                              */
+/*                                                                         */
+/*    TrueType-specific tables loader (specification).                     */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2005, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __TTPLOAD_H__
+#define __TTPLOAD_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_TRUETYPE_TYPES_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_loca( TT_Face    face,
+                     FT_Stream  stream );
+
+  FT_LOCAL( FT_ULong )
+  tt_face_get_location( TT_Face   face,
+                        FT_UInt   gindex,
+                        FT_UInt  *asize );
+
+  FT_LOCAL( void )
+  tt_face_done_loca( TT_Face  face );
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_cvt( TT_Face    face,
+                    FT_Stream  stream );
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_fpgm( TT_Face    face,
+                     FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_prep( TT_Face    face,
+                     FT_Stream  stream );
+
+
+  FT_LOCAL( FT_Error )
+  tt_face_load_hdmx( TT_Face    face,
+                     FT_Stream  stream );
+
+
+  FT_LOCAL( void )
+  tt_face_free_hdmx( TT_Face  face );
+
+
+  FT_LOCAL( FT_Byte* )
+  tt_face_get_device_metrics( TT_Face    face,
+                              FT_UInt    ppem,
+                              FT_UInt    gindex );
+
+FT_END_HEADER
+
+#endif /* __TTPLOAD_H__ */
+
+
+/* END */
diff --git a/src/type1/Jamfile b/src/type1/Jamfile
new file mode 100644 (file)
index 0000000..8e366ba
--- /dev/null
@@ -0,0 +1,29 @@
+# FreeType 2 src/type1 Jamfile
+#
+# Copyright 2001 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) type1 ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = t1afm t1driver t1objs t1load t1gload t1parse ;
+  }
+  else
+  {
+    _sources = type1 ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/type1 Jamfile
diff --git a/src/type1/module.mk b/src/type1/module.mk
new file mode 100644 (file)
index 0000000..ade0210
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# FreeType 2 Type1 module definition
+#
+
+
+# Copyright 1996-2000, 2006 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.
+
+
+FTMODULE_H_COMMANDS += TYPE1_DRIVER
+
+define TYPE1_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, t1_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)type1     $(ECHO_DRIVER_DESC)Postscript font files with extension *.pfa or *.pfb$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/src/type1/rules.mk b/src/type1/rules.mk
new file mode 100644 (file)
index 0000000..15087b0
--- /dev/null
@@ -0,0 +1,73 @@
+#
+# FreeType 2 Type1 driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003 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.
+
+
+# Type1 driver directory
+#
+T1_DIR := $(SRC_DIR)/type1
+
+
+# compilation flags for the driver
+#
+T1_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(T1_DIR))
+
+
+# Type1 driver sources (i.e., C files)
+#
+T1_DRV_SRC := $(T1_DIR)/t1parse.c  \
+              $(T1_DIR)/t1load.c   \
+              $(T1_DIR)/t1driver.c \
+              $(T1_DIR)/t1afm.c    \
+              $(T1_DIR)/t1gload.c  \
+              $(T1_DIR)/t1objs.c
+
+# Type1 driver headers
+#
+T1_DRV_H := $(T1_DRV_SRC:%.c=%.h) \
+            $(T1_DIR)/t1tokens.h  \
+            $(T1_DIR)/t1errors.h
+
+
+# Type1 driver object(s)
+#
+#   T1_DRV_OBJ_M is used during `multi' builds
+#   T1_DRV_OBJ_S is used during `single' builds
+#
+T1_DRV_OBJ_M := $(T1_DRV_SRC:$(T1_DIR)/%.c=$(OBJ_DIR)/%.$O)
+T1_DRV_OBJ_S := $(OBJ_DIR)/type1.$O
+
+# Type1 driver source file for single build
+#
+T1_DRV_SRC_S := $(T1_DIR)/type1.c
+
+
+# Type1 driver - single object
+#
+$(T1_DRV_OBJ_S): $(T1_DRV_SRC_S) $(T1_DRV_SRC) $(FREETYPE_H) $(T1_DRV_H)
+       $(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(T1_DRV_SRC_S))
+
+
+# Type1 driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(T1_DIR)/%.c $(FREETYPE_H) $(T1_DRV_H)
+       $(T1_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(T1_DRV_OBJ_S)
+DRV_OBJS_M += $(T1_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/type1/t1afm.c b/src/type1/t1afm.c
new file mode 100644 (file)
index 0000000..1fff15d
--- /dev/null
@@ -0,0 +1,396 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1afm.c                                                                */
+/*                                                                         */
+/*    AFM support for Type 1 fonts (body).                                 */
+/*                                                                         */
+/*  Copyright 1996-2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include "t1afm.h"
+#include "t1errors.h"
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_t1afm
+
+
+  FT_LOCAL_DEF( void )
+  T1_Done_Metrics( FT_Memory     memory,
+                   AFM_FontInfo  fi )
+  {
+    FT_FREE( fi->KernPairs );
+    fi->NumKernPair = 0;
+
+    FT_FREE( fi->TrackKerns );
+    fi->NumTrackKern = 0;
+
+    FT_FREE( fi );
+  }
+
+
+  /* read a glyph name and return the equivalent glyph index */
+  static FT_Int
+  t1_get_index( const char*  name,
+                FT_Offset    len,
+                void*        user_data )
+  {
+    T1_Font  type1 = (T1_Font)user_data;
+    FT_Int   n;
+
+
+    /* PS string/name length must be < 16-bit */
+    if ( len > 0xFFFFU )
+      return 0;
+
+    for ( n = 0; n < type1->num_glyphs; n++ )
+    {
+      char*  gname = (char*)type1->glyph_names[n];
+
+
+      if ( gname && gname[0] == name[0]        &&
+           ft_strlen( gname ) == len           &&
+           ft_strncmp( gname, name, len ) == 0 )
+        return n;
+    }
+
+    return 0;
+  }
+
+
+#undef  KERN_INDEX
+#define KERN_INDEX( g1, g2 )  ( ( (FT_ULong)(g1) << 16 ) | (g2) )
+
+
+  /* compare two kerning pairs */
+  FT_CALLBACK_DEF( int )
+  compare_kern_pairs( const void*  a,
+                      const void*  b )
+  {
+    AFM_KernPair  pair1 = (AFM_KernPair)a;
+    AFM_KernPair  pair2 = (AFM_KernPair)b;
+
+    FT_ULong  index1 = KERN_INDEX( pair1->index1, pair1->index2 );
+    FT_ULong  index2 = KERN_INDEX( pair2->index1, pair2->index2 );
+
+
+    if ( index1 > index2 )
+      return 1;
+    else if ( index1 < index2 )
+      return -1;
+    else
+      return 0;
+  }
+
+
+  /* parse a PFM file -- for now, only read the kerning pairs */
+  static FT_Error
+  T1_Read_PFM( FT_Face       t1_face,
+               FT_Stream     stream,
+               AFM_FontInfo  fi )
+  {
+    FT_Error      error = T1_Err_Ok;
+    FT_Memory     memory = stream->memory;
+    FT_Byte*      start;
+    FT_Byte*      limit;
+    FT_Byte*      p;
+    AFM_KernPair  kp;
+    FT_Int        width_table_length;
+    FT_CharMap    oldcharmap;
+    FT_CharMap    charmap;
+    FT_Int        n;
+
+
+    start = (FT_Byte*)stream->cursor;
+    limit = (FT_Byte*)stream->limit;
+    p     = start;
+
+    /* Figure out how long the width table is.          */
+    /* This info is a little-endian short at offset 99. */
+    p = start + 99;
+    if ( p + 2 > limit )
+    {
+      error = T1_Err_Unknown_File_Format;
+      goto Exit;
+    }
+    width_table_length = FT_PEEK_USHORT_LE( p );
+
+    p += 18 + width_table_length;
+    if ( p + 0x12 > limit || FT_PEEK_USHORT_LE( p ) < 0x12 )
+      /* extension table is probably optional */
+      goto Exit;
+
+    /* Kerning offset is 14 bytes from start of extensions table. */
+    p += 14;
+    p = start + FT_PEEK_ULONG_LE( p );
+
+    if ( p == start )
+      /* zero offset means no table */
+      goto Exit;
+
+    if ( p + 2 > limit )
+    {
+      error = T1_Err_Unknown_File_Format;
+      goto Exit;
+    }
+
+    fi->NumKernPair = FT_PEEK_USHORT_LE( p );
+    p += 2;
+    if ( p + 4 * fi->NumKernPair > limit )
+    {
+      error = T1_Err_Unknown_File_Format;
+      goto Exit;
+    }
+
+    /* Actually, kerning pairs are simply optional! */
+    if ( fi->NumKernPair == 0 )
+      goto Exit;
+
+    /* allocate the pairs */
+    if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) )
+      goto Exit;
+
+    /* now, read each kern pair */
+    kp             = fi->KernPairs;
+    limit          = p + 4 * fi->NumKernPair;
+
+    /* PFM kerning data are stored by encoding rather than glyph index, */
+    /* so find the PostScript charmap of this font and install it       */
+    /* temporarily.  If we find no PostScript charmap, then just use    */
+    /* the default and hope it is the right one.                        */
+    oldcharmap = t1_face->charmap;
+    charmap    = NULL;
+
+    for ( n = 0; n < t1_face->num_charmaps; n++ )
+    {
+      charmap = t1_face->charmaps[n];
+      /* check against PostScript pseudo platform */
+      if ( charmap->platform_id == 7 )
+      {
+        error = FT_Set_Charmap( t1_face, charmap );
+        if ( error )
+          goto Exit;
+        break;
+      }
+    }
+
+    /* Kerning info is stored as:             */
+    /*                                        */
+    /*   encoding of first glyph (1 byte)     */
+    /*   encoding of second glyph (1 byte)    */
+    /*   offset (little-endian short)         */
+    for ( ; p < limit ; p += 4 )
+    {
+      kp->index1 = FT_Get_Char_Index( t1_face, p[0] );
+      kp->index2 = FT_Get_Char_Index( t1_face, p[1] );
+
+      kp->x = (FT_Int)FT_PEEK_SHORT_LE(p + 2);
+      kp->y = 0;
+
+      kp++;
+    }
+
+    if ( oldcharmap != NULL )
+      error = FT_Set_Charmap( t1_face, oldcharmap );
+    if ( error )
+      goto Exit;
+
+    /* now, sort the kern pairs according to their glyph indices */
+    ft_qsort( fi->KernPairs, fi->NumKernPair, sizeof ( AFM_KernPairRec ),
+              compare_kern_pairs );
+
+  Exit:
+    if ( error )
+    {
+      FT_FREE( fi->KernPairs );
+      fi->NumKernPair = 0;
+    }
+
+    return error;
+  }
+
+
+  /* parse a metrics file -- either AFM or PFM depending on what */
+  /* it turns out to be                                          */
+  FT_LOCAL_DEF( FT_Error )
+  T1_Read_Metrics( FT_Face    t1_face,
+                   FT_Stream  stream )
+  {
+    PSAux_Service  psaux;
+    FT_Memory      memory  = stream->memory;
+    AFM_ParserRec  parser;
+    AFM_FontInfo   fi      = NULL;
+    FT_Error       error   = T1_Err_Unknown_File_Format;
+    T1_Font        t1_font = &( (T1_Face)t1_face )->type1;
+
+
+    if ( FT_NEW( fi )                   ||
+         FT_FRAME_ENTER( stream->size ) )
+      goto Exit;
+
+    fi->FontBBox  = t1_font->font_bbox;
+    fi->Ascender  = t1_font->font_bbox.yMax;
+    fi->Descender = t1_font->font_bbox.yMin;
+
+    psaux = (PSAux_Service)( (T1_Face)t1_face )->psaux;
+    if ( psaux->afm_parser_funcs )
+    {
+      error = psaux->afm_parser_funcs->init( &parser,
+                                             stream->memory,
+                                             stream->cursor,
+                                             stream->limit );
+
+      if ( !error )
+      {
+        parser.FontInfo  = fi;
+        parser.get_index = t1_get_index;
+        parser.user_data = t1_font;
+
+        error = psaux->afm_parser_funcs->parse( &parser );
+        psaux->afm_parser_funcs->done( &parser );
+      }
+    }
+
+    if ( error == T1_Err_Unknown_File_Format )
+    {
+      FT_Byte*  start = stream->cursor;
+
+
+      /* MS Windows allows versions up to 0x3FF without complaining */
+      if ( stream->size > 6                              &&
+           start[1] < 4                                  &&
+           FT_PEEK_ULONG_LE( start + 2 ) == stream->size )
+        error = T1_Read_PFM( t1_face, stream, fi );
+    }
+
+    if ( !error )
+    {
+      t1_font->font_bbox = fi->FontBBox;
+
+      t1_face->bbox.xMin =   fi->FontBBox.xMin            >> 16;
+      t1_face->bbox.yMin =   fi->FontBBox.yMin            >> 16;
+      /* no `U' suffix here to 0xFFFF! */
+      t1_face->bbox.xMax = ( fi->FontBBox.xMax + 0xFFFF ) >> 16;
+      t1_face->bbox.yMax = ( fi->FontBBox.yMax + 0xFFFF ) >> 16;
+
+      /* no `U' suffix here to 0x8000! */
+      t1_face->ascender  = (FT_Short)( ( fi->Ascender  + 0x8000 ) >> 16 );
+      t1_face->descender = (FT_Short)( ( fi->Descender + 0x8000 ) >> 16 );
+
+      if ( fi->NumKernPair )
+      {
+        t1_face->face_flags |= FT_FACE_FLAG_KERNING;
+        ( (T1_Face)t1_face )->afm_data = fi;
+        fi = NULL;
+      }
+    }
+
+    FT_FRAME_EXIT();
+
+  Exit:
+    if ( fi != NULL )
+      T1_Done_Metrics( memory, fi );
+
+    return error;
+  }
+
+
+  /* find the kerning for a given glyph pair */
+  FT_LOCAL_DEF( void )
+  T1_Get_Kerning( AFM_FontInfo  fi,
+                  FT_UInt       glyph1,
+                  FT_UInt       glyph2,
+                  FT_Vector*    kerning )
+  {
+    AFM_KernPair  min, mid, max;
+    FT_ULong      idx = KERN_INDEX( glyph1, glyph2 );
+
+
+    /* simple binary search */
+    min = fi->KernPairs;
+    max = min + fi->NumKernPair - 1;
+
+    while ( min <= max )
+    {
+      FT_ULong  midi;
+
+
+      mid  = min + ( max - min ) / 2;
+      midi = KERN_INDEX( mid->index1, mid->index2 );
+
+      if ( midi == idx )
+      {
+        kerning->x = mid->x;
+        kerning->y = mid->y;
+
+        return;
+      }
+
+      if ( midi < idx )
+        min = mid + 1;
+      else
+        max = mid - 1;
+    }
+
+    kerning->x = 0;
+    kerning->y = 0;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Get_Track_Kerning( FT_Face    face,
+                        FT_Fixed   ptsize,
+                        FT_Int     degree,
+                        FT_Fixed*  kerning )
+  {
+    AFM_FontInfo  fi = (AFM_FontInfo)( (T1_Face)face )->afm_data;
+    FT_Int        i;
+
+
+    if ( !fi )
+      return T1_Err_Invalid_Argument;
+
+    for ( i = 0; i < fi->NumTrackKern; i++ )
+    {
+      AFM_TrackKern  tk = fi->TrackKerns + i;
+
+
+      if ( tk->degree != degree )
+        continue;
+
+      if ( ptsize < tk->min_ptsize )
+        *kerning = tk->min_kern;
+      else if ( ptsize > tk->max_ptsize )
+        *kerning = tk->max_kern;
+      else
+      {
+        *kerning = FT_MulDiv( ptsize - tk->min_ptsize,
+                              tk->max_kern - tk->min_kern,
+                              tk->max_ptsize - tk->min_ptsize ) +
+                   tk->min_kern;
+      }
+    }
+
+    return T1_Err_Ok;
+  }
+
+
+/* END */
diff --git a/src/type1/t1afm.h b/src/type1/t1afm.h
new file mode 100644 (file)
index 0000000..8eb1764
--- /dev/null
@@ -0,0 +1,54 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1afm.h                                                                */
+/*                                                                         */
+/*    AFM support for Type 1 fonts (specification).                        */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2006 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1AFM_H__
+#define __T1AFM_H__
+
+#include <ft2build.h>
+#include "t1objs.h"
+#include FT_INTERNAL_TYPE1_TYPES_H
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error )
+  T1_Read_Metrics( FT_Face    face,
+                   FT_Stream  stream );
+
+  FT_LOCAL( void )
+  T1_Done_Metrics( FT_Memory     memory,
+                   AFM_FontInfo  fi );
+
+  FT_LOCAL( void )
+  T1_Get_Kerning( AFM_FontInfo  fi,
+                  FT_UInt       glyph1,
+                  FT_UInt       glyph2,
+                  FT_Vector*    kerning );
+
+  FT_LOCAL( FT_Error )
+  T1_Get_Track_Kerning( FT_Face    face,
+                        FT_Fixed   ptsize,
+                        FT_Int     degree,
+                        FT_Fixed*  kerning );
+
+FT_END_HEADER
+
+#endif /* __T1AFM_H__ */
+
+
+/* END */
diff --git a/src/type1/t1driver.c b/src/type1/t1driver.c
new file mode 100644 (file)
index 0000000..e35d7b1
--- /dev/null
@@ -0,0 +1,730 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1driver.c                                                             */
+/*                                                                         */
+/*    Type 1 driver interface (body).                                      */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006, 2007, 2009, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include "t1driver.h"
+#include "t1gload.h"
+#include "t1load.h"
+
+#include "t1errors.h"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "t1afm.h"
+#endif
+
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+
+#include FT_SERVICE_MULTIPLE_MASTERS_H
+#include FT_SERVICE_GLYPH_DICT_H
+#include FT_SERVICE_XFREE86_NAME_H
+#include FT_SERVICE_POSTSCRIPT_NAME_H
+#include FT_SERVICE_POSTSCRIPT_CMAPS_H
+#include FT_SERVICE_POSTSCRIPT_INFO_H
+#include FT_SERVICE_KERNING_H
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_t1driver
+
+ /*
+  *  GLYPH DICT SERVICE
+  *
+  */
+
+  static FT_Error
+  t1_get_glyph_name( T1_Face     face,
+                     FT_UInt     glyph_index,
+                     FT_Pointer  buffer,
+                     FT_UInt     buffer_max )
+  {
+    FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max );
+
+    return T1_Err_Ok;
+  }
+
+
+  static FT_UInt
+  t1_get_name_index( T1_Face     face,
+                     FT_String*  glyph_name )
+  {
+    FT_Int      i;
+    FT_String*  gname;
+
+
+    for ( i = 0; i < face->type1.num_glyphs; i++ )
+    {
+      gname = face->type1.glyph_names[i];
+
+      if ( !ft_strcmp( glyph_name, gname ) )
+        return (FT_UInt)i;
+    }
+
+    return 0;
+  }
+
+
+  static const FT_Service_GlyphDictRec  t1_service_glyph_dict =
+  {
+    (FT_GlyphDict_GetNameFunc)  t1_get_glyph_name,
+    (FT_GlyphDict_NameIndexFunc)t1_get_name_index
+  };
+
+
+  /*
+   *  POSTSCRIPT NAME SERVICE
+   *
+   */
+
+  static const char*
+  t1_get_ps_name( T1_Face  face )
+  {
+    return (const char*) face->type1.font_name;
+  }
+
+
+  static const FT_Service_PsFontNameRec  t1_service_ps_name =
+  {
+    (FT_PsName_GetFunc)t1_get_ps_name
+  };
+
+
+  /*
+   *  MULTIPLE MASTERS SERVICE
+   *
+   */
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+  static const FT_Service_MultiMastersRec  t1_service_multi_masters =
+  {
+    (FT_Get_MM_Func)        T1_Get_Multi_Master,
+    (FT_Set_MM_Design_Func) T1_Set_MM_Design,
+    (FT_Set_MM_Blend_Func)  T1_Set_MM_Blend,
+    (FT_Get_MM_Var_Func)    T1_Get_MM_Var,
+    (FT_Set_Var_Design_Func)T1_Set_Var_Design
+  };
+#endif
+
+
+  /*
+   *  POSTSCRIPT INFO SERVICE
+   *
+   */
+
+  static FT_Error
+  t1_ps_get_font_info( FT_Face          face,
+                       PS_FontInfoRec*  afont_info )
+  {
+    *afont_info = ((T1_Face)face)->type1.font_info;
+
+    return T1_Err_Ok;
+  }
+
+
+  static FT_Error
+  t1_ps_get_font_extra( FT_Face           face,
+                        PS_FontExtraRec*  afont_extra )
+  {
+    *afont_extra = ((T1_Face)face)->type1.font_extra;
+
+    return T1_Err_Ok;
+  }
+
+
+  static FT_Int
+  t1_ps_has_glyph_names( FT_Face  face )
+  {
+    FT_UNUSED( face );
+
+    return 1;
+  }
+
+
+  static FT_Error
+  t1_ps_get_font_private( FT_Face         face,
+                          PS_PrivateRec*  afont_private )
+  {
+    *afont_private = ((T1_Face)face)->type1.private_dict;
+
+    return T1_Err_Ok;
+  }
+
+
+  static FT_Long
+  t1_ps_get_font_value( FT_Face       face,
+                        PS_Dict_Keys  key,
+                        FT_UInt       idx,
+                        void         *value,
+                        FT_Long       value_len )
+  {
+    FT_Long  retval = -1;
+    T1_Face  t1face = (T1_Face)face;
+    T1_Font  type1  = &t1face->type1;
+
+
+    switch ( key )
+    {
+    case PS_DICT_FONT_TYPE:
+      retval = sizeof ( type1->font_type );
+      if ( value && value_len >= retval )
+        *((FT_Byte *)value) = type1->font_type;
+      break;
+
+    case PS_DICT_FONT_MATRIX:
+      if ( idx < sizeof ( type1->font_matrix ) /
+                   sizeof ( type1->font_matrix.xx ) )
+      {
+        FT_Fixed  val = 0;
+
+
+        retval = sizeof ( val );
+        if ( value && value_len >= retval )
+        {
+          switch ( idx )
+          {
+          case 0:
+            val = type1->font_matrix.xx;
+            break;
+          case 1:
+            val = type1->font_matrix.xy;
+            break;
+          case 2:
+            val = type1->font_matrix.yx;
+            break;
+          case 3:
+            val = type1->font_matrix.yy;
+            break;
+          }
+          *((FT_Fixed *)value) = val;
+        }
+      }
+      break;
+
+    case PS_DICT_FONT_BBOX:
+      if ( idx < sizeof ( type1->font_bbox ) /
+                   sizeof ( type1->font_bbox.xMin ) )
+      {
+        FT_Fixed val = 0;
+
+
+        retval = sizeof ( val );
+        if ( value && value_len >= retval )
+        {
+          switch ( idx )
+          {
+          case 0:
+            val = type1->font_bbox.xMin;
+            break;
+          case 1:
+            val = type1->font_bbox.yMin;
+            break;
+          case 2:
+            val = type1->font_bbox.xMax;
+            break;
+          case 3:
+            val = type1->font_bbox.yMax;
+            break;
+          }
+          *((FT_Fixed *)value) = val;
+        }
+      }
+      break;
+
+    case PS_DICT_PAINT_TYPE:
+      retval = sizeof ( type1->paint_type );
+      if ( value && value_len >= retval )
+        *((FT_Byte *)value) = type1->paint_type;
+      break;
+
+    case PS_DICT_FONT_NAME:
+      retval = ft_strlen( type1->font_name ) + 1;
+      if ( value && value_len >= retval )
+        ft_memcpy( value, (void *)( type1->font_name ), retval );
+      break;
+
+    case PS_DICT_UNIQUE_ID:
+      retval = sizeof ( type1->private_dict.unique_id );
+      if ( value && value_len >= retval )
+        *((FT_Int *)value) = type1->private_dict.unique_id;
+      break;
+
+    case PS_DICT_NUM_CHAR_STRINGS:
+      retval = sizeof ( type1->num_glyphs );
+      if ( value && value_len >= retval )
+        *((FT_Int *)value) = type1->num_glyphs;
+      break;
+
+    case PS_DICT_CHAR_STRING_KEY:
+      if ( idx < (FT_UInt)type1->num_glyphs )
+      {
+        retval = ft_strlen( type1->glyph_names[idx] ) + 1;
+        if ( value && value_len >= retval )
+        {
+          ft_memcpy( value, (void *)( type1->glyph_names[idx] ), retval );
+          ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
+        }
+      }
+      break;
+
+    case PS_DICT_CHAR_STRING:
+      if ( idx < (FT_UInt)type1->num_glyphs )
+      {
+        retval = type1->charstrings_len[idx] + 1;
+        if ( value && value_len >= retval )
+        {
+          ft_memcpy( value, (void *)( type1->charstrings[idx] ),
+                     retval - 1 );
+          ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
+        }
+      }
+      break;
+
+    case PS_DICT_ENCODING_TYPE:
+      retval = sizeof ( type1->encoding_type );
+      if ( value && value_len >= retval )
+        *((T1_EncodingType *)value) = type1->encoding_type;
+      break;
+
+    case PS_DICT_ENCODING_ENTRY:
+      if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY &&
+           idx < (FT_UInt)type1->encoding.num_chars       )
+      {
+        retval = ft_strlen( type1->encoding.char_name[idx] ) + 1;
+        if ( value && value_len >= retval )
+        {
+          ft_memcpy( value, (void *)( type1->encoding.char_name[idx] ),
+                     retval - 1 );
+          ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
+        }
+      }
+      break;
+
+    case PS_DICT_NUM_SUBRS:
+      retval = sizeof ( type1->num_subrs );
+      if ( value && value_len >= retval )
+        *((FT_Int *)value) = type1->num_subrs;
+      break;
+
+    case PS_DICT_SUBR:
+      if ( idx < (FT_UInt)type1->num_subrs )
+      {
+        retval = type1->subrs_len[idx] + 1;
+        if ( value && value_len >= retval )
+        {
+          ft_memcpy( value, (void *)( type1->subrs[idx] ), retval - 1 );
+          ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
+        }
+      }
+      break;
+
+    case PS_DICT_STD_HW:
+      retval = sizeof ( type1->private_dict.standard_width[0] );
+      if ( value && value_len >= retval )
+        *((FT_UShort *)value) = type1->private_dict.standard_width[0];
+      break;
+
+    case PS_DICT_STD_VW:
+      retval = sizeof ( type1->private_dict.standard_height[0] );
+      if ( value && value_len >= retval )
+        *((FT_UShort *)value) = type1->private_dict.standard_height[0];
+      break;
+
+    case PS_DICT_NUM_BLUE_VALUES:
+      retval = sizeof ( type1->private_dict.num_blue_values );
+      if ( value && value_len >= retval )
+        *((FT_Byte *)value) = type1->private_dict.num_blue_values;
+      break;
+
+    case PS_DICT_BLUE_VALUE:
+      if ( idx < type1->private_dict.num_blue_values )
+      {
+        retval = sizeof ( type1->private_dict.blue_values[idx] );
+        if ( value && value_len >= retval )
+          *((FT_Short *)value) = type1->private_dict.blue_values[idx];
+      }
+      break;
+
+    case PS_DICT_BLUE_SCALE:
+      retval = sizeof ( type1->private_dict.blue_scale );
+      if ( value && value_len >= retval )
+        *((FT_Fixed *)value) = type1->private_dict.blue_scale;
+      break;
+
+    case PS_DICT_BLUE_FUZZ:
+      retval = sizeof ( type1->private_dict.blue_fuzz );
+      if ( value && value_len >= retval )
+        *((FT_Int *)value) = type1->private_dict.blue_fuzz;
+      break;
+
+    case PS_DICT_BLUE_SHIFT:
+      retval = sizeof ( type1->private_dict.blue_shift );
+      if ( value && value_len >= retval )
+        *((FT_Int *)value) = type1->private_dict.blue_shift;
+      break;
+
+    case PS_DICT_NUM_OTHER_BLUES:
+      retval = sizeof ( type1->private_dict.num_other_blues );
+      if ( value && value_len >= retval )
+        *((FT_Byte *)value) = type1->private_dict.num_other_blues;
+      break;
+
+    case PS_DICT_OTHER_BLUE:
+      if ( idx < type1->private_dict.num_other_blues )
+      {
+        retval = sizeof ( type1->private_dict.other_blues[idx] );
+        if ( value && value_len >= retval )
+          *((FT_Short *)value) = type1->private_dict.other_blues[idx];
+      }
+      break;
+
+    case PS_DICT_NUM_FAMILY_BLUES:
+      retval = sizeof ( type1->private_dict.num_family_blues );
+      if ( value && value_len >= retval )
+        *((FT_Byte *)value) = type1->private_dict.num_family_blues;
+      break;
+
+    case PS_DICT_FAMILY_BLUE:
+      if ( idx < type1->private_dict.num_family_blues )
+      {
+        retval = sizeof ( type1->private_dict.family_blues[idx] );
+        if ( value && value_len >= retval )
+          *((FT_Short *)value) = type1->private_dict.family_blues[idx];
+      }
+      break;
+
+    case PS_DICT_NUM_FAMILY_OTHER_BLUES:
+      retval = sizeof ( type1->private_dict.num_family_other_blues );
+      if ( value && value_len >= retval )
+        *((FT_Byte *)value) = type1->private_dict.num_family_other_blues;
+      break;
+
+    case PS_DICT_FAMILY_OTHER_BLUE:
+      if ( idx < type1->private_dict.num_family_other_blues )
+      {
+        retval = sizeof ( type1->private_dict.family_other_blues[idx] );
+        if ( value && value_len >= retval )
+          *((FT_Short *)value) = type1->private_dict.family_other_blues[idx];
+      }
+      break;
+
+    case PS_DICT_NUM_STEM_SNAP_H:
+      retval = sizeof ( type1->private_dict.num_snap_widths );
+      if ( value && value_len >= retval )
+        *((FT_Byte *)value) = type1->private_dict.num_snap_widths;
+      break;
+
+    case PS_DICT_STEM_SNAP_H:
+      if ( idx < type1->private_dict.num_snap_widths )
+      {
+        retval = sizeof ( type1->private_dict.snap_widths[idx] );
+        if ( value && value_len >= retval )
+          *((FT_Short *)value) = type1->private_dict.snap_widths[idx];
+      }
+      break;
+
+    case PS_DICT_NUM_STEM_SNAP_V:
+      retval = sizeof ( type1->private_dict.num_snap_heights );
+      if ( value && value_len >= retval )
+        *((FT_Byte *)value) = type1->private_dict.num_snap_heights;
+      break;
+
+    case PS_DICT_STEM_SNAP_V:
+      if ( idx < type1->private_dict.num_snap_heights )
+      {
+        retval = sizeof ( type1->private_dict.snap_heights[idx] );
+        if ( value && value_len >= retval )
+          *((FT_Short *)value) = type1->private_dict.snap_heights[idx];
+      }
+      break;
+
+    case PS_DICT_RND_STEM_UP:
+      retval = sizeof ( type1->private_dict.round_stem_up );
+      if ( value && value_len >= retval )
+        *((FT_Bool *)value) = type1->private_dict.round_stem_up;
+      break;
+
+    case PS_DICT_FORCE_BOLD:
+      retval = sizeof ( type1->private_dict.force_bold );
+      if ( value && value_len >= retval )
+        *((FT_Bool *)value) = type1->private_dict.force_bold;
+      break;
+
+    case PS_DICT_MIN_FEATURE:
+      if ( idx < sizeof ( type1->private_dict.min_feature ) /
+                   sizeof ( type1->private_dict.min_feature[0] ) )
+      {
+        retval = sizeof ( type1->private_dict.min_feature[idx] );
+        if ( value && value_len >= retval )
+          *((FT_Short *)value) = type1->private_dict.min_feature[idx];
+      }
+      break;
+
+    case PS_DICT_LEN_IV:
+      retval = sizeof ( type1->private_dict.lenIV );
+      if ( value && value_len >= retval )
+        *((FT_Int *)value) = type1->private_dict.lenIV;
+      break;
+
+    case PS_DICT_PASSWORD:
+      retval = sizeof ( type1->private_dict.password );
+      if ( value && value_len >= retval )
+        *((FT_Long *)value) = type1->private_dict.password;
+      break;
+
+    case PS_DICT_LANGUAGE_GROUP:
+      retval = sizeof ( type1->private_dict.language_group );
+      if ( value && value_len >= retval )
+        *((FT_Long *)value) = type1->private_dict.language_group;
+      break;
+
+    case PS_DICT_IS_FIXED_PITCH:
+      retval = sizeof ( type1->font_info.is_fixed_pitch );
+      if ( value && value_len >= retval )
+        *((FT_Bool *)value) = type1->font_info.is_fixed_pitch;
+      break;
+
+    case PS_DICT_UNDERLINE_POSITION:
+      retval = sizeof ( type1->font_info.underline_position );
+      if ( value && value_len >= retval )
+        *((FT_Short *)value) = type1->font_info.underline_position;
+      break;
+
+    case PS_DICT_UNDERLINE_THICKNESS:
+      retval = sizeof ( type1->font_info.underline_thickness );
+      if ( value && value_len >= retval )
+        *((FT_UShort *)value) = type1->font_info.underline_thickness;
+      break;
+
+    case PS_DICT_FS_TYPE:
+      retval = sizeof ( type1->font_extra.fs_type );
+      if ( value && value_len >= retval )
+        *((FT_UShort *)value) = type1->font_extra.fs_type;
+      break;
+
+    case PS_DICT_VERSION:
+      retval = ft_strlen( type1->font_info.version ) + 1;
+      if ( value && value_len >= retval )
+        ft_memcpy( value, (void *)( type1->font_info.version ), retval );
+      break;
+
+    case PS_DICT_NOTICE:
+      retval = ft_strlen( type1->font_info.notice ) + 1;
+      if ( value && value_len >= retval )
+        ft_memcpy( value, (void *)( type1->font_info.notice ), retval );
+      break;
+
+    case PS_DICT_FULL_NAME:
+      retval = ft_strlen( type1->font_info.full_name ) + 1;
+      if ( value && value_len >= retval )
+        ft_memcpy( value, (void *)( type1->font_info.full_name ), retval );
+      break;
+
+    case PS_DICT_FAMILY_NAME:
+      retval = ft_strlen( type1->font_info.family_name ) + 1;
+      if ( value && value_len >= retval )
+        ft_memcpy( value, (void *)( type1->font_info.family_name ), retval );
+      break;
+
+    case PS_DICT_WEIGHT:
+      retval = ft_strlen( type1->font_info.weight ) + 1;
+      if ( value && value_len >= retval )
+        ft_memcpy( value, (void *)( type1->font_info.weight ), retval );
+      break;
+
+    case PS_DICT_ITALIC_ANGLE:
+      retval = sizeof ( type1->font_info.italic_angle );
+      if ( value && value_len >= retval )
+        *((FT_Long *)value) = type1->font_info.italic_angle;
+      break;
+
+    default:
+      break;
+    }
+
+    return retval;
+  }
+
+
+  static const FT_Service_PsInfoRec  t1_service_ps_info =
+  {
+    (PS_GetFontInfoFunc)   t1_ps_get_font_info,
+    (PS_GetFontExtraFunc)  t1_ps_get_font_extra,
+    (PS_HasGlyphNamesFunc) t1_ps_has_glyph_names,
+    (PS_GetFontPrivateFunc)t1_ps_get_font_private,
+    (PS_GetFontValueFunc)  t1_ps_get_font_value,
+  };
+
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+  static const FT_Service_KerningRec  t1_service_kerning =
+  {
+    T1_Get_Track_Kerning,
+  };
+#endif
+
+
+  /*
+   *  SERVICE LIST
+   *
+   */
+
+  static const FT_ServiceDescRec  t1_services[] =
+  {
+    { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t1_service_ps_name },
+    { FT_SERVICE_ID_GLYPH_DICT,           &t1_service_glyph_dict },
+    { FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_TYPE_1 },
+    { FT_SERVICE_ID_POSTSCRIPT_INFO,      &t1_service_ps_info },
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+    { FT_SERVICE_ID_KERNING,              &t1_service_kerning },
+#endif
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+    { FT_SERVICE_ID_MULTI_MASTERS,        &t1_service_multi_masters },
+#endif
+    { NULL, NULL }
+  };
+
+
+  FT_CALLBACK_DEF( FT_Module_Interface )
+  Get_Interface( FT_Module         module,
+                 const FT_String*  t1_interface )
+  {
+    FT_UNUSED( module );
+
+    return ft_service_list_lookup( t1_services, t1_interface );
+  }
+
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    Get_Kerning                                                        */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A driver method used to return the kerning vector between two      */
+  /*    glyphs of the same face.                                           */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face        :: A handle to the source face object.                 */
+  /*                                                                       */
+  /*    left_glyph  :: The index of the left glyph in the kern pair.       */
+  /*                                                                       */
+  /*    right_glyph :: The index of the right glyph in the kern pair.      */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    kerning     :: The kerning vector.  This is in font units for      */
+  /*                   scalable formats, and in pixels for fixed-sizes     */
+  /*                   formats.                                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    Only horizontal layouts (left-to-right & right-to-left) are        */
+  /*    supported by this function.  Other layouts, or more sophisticated  */
+  /*    kernings are out of scope of this method (the basic driver         */
+  /*    interface is meant to be simple).                                  */
+  /*                                                                       */
+  /*    They can be implemented by format-specific interfaces.             */
+  /*                                                                       */
+  static FT_Error
+  Get_Kerning( FT_Face     t1face,        /* T1_Face */
+               FT_UInt     left_glyph,
+               FT_UInt     right_glyph,
+               FT_Vector*  kerning )
+  {
+    T1_Face  face = (T1_Face)t1face;
+
+
+    kerning->x = 0;
+    kerning->y = 0;
+
+    if ( face->afm_data )
+      T1_Get_Kerning( (AFM_FontInfo)face->afm_data,
+                      left_glyph,
+                      right_glyph,
+                      kerning );
+
+    return T1_Err_Ok;
+  }
+
+
+#endif /* T1_CONFIG_OPTION_NO_AFM */
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FT_Driver_ClassRec  t1_driver_class =
+  {
+    {
+      FT_MODULE_FONT_DRIVER       |
+      FT_MODULE_DRIVER_SCALABLE   |
+      FT_MODULE_DRIVER_HAS_HINTER,
+
+      sizeof ( FT_DriverRec ),
+
+      "type1",
+      0x10000L,
+      0x20000L,
+
+      0,   /* format interface */
+
+      T1_Driver_Init,
+      T1_Driver_Done,
+      Get_Interface,
+    },
+
+    sizeof ( T1_FaceRec ),
+    sizeof ( T1_SizeRec ),
+    sizeof ( T1_GlyphSlotRec ),
+
+    T1_Face_Init,
+    T1_Face_Done,
+    T1_Size_Init,
+    T1_Size_Done,
+    T1_GlyphSlot_Init,
+    T1_GlyphSlot_Done,
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+    ft_stub_set_char_sizes,
+    ft_stub_set_pixel_sizes,
+#endif
+    T1_Load_Glyph,
+
+#ifdef T1_CONFIG_OPTION_NO_AFM
+    0,                     /* FT_Face_GetKerningFunc */
+    0,                     /* FT_Face_AttachFunc     */
+#else
+    Get_Kerning,
+    T1_Read_Metrics,
+#endif
+    T1_Get_Advances,
+    T1_Size_Request,
+    0                      /* FT_Size_SelectFunc     */
+  };
+
+
+/* END */
diff --git a/src/type1/t1driver.h b/src/type1/t1driver.h
new file mode 100644 (file)
index 0000000..639cd4a
--- /dev/null
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1driver.h                                                             */
+/*                                                                         */
+/*    High-level Type 1 driver interface (specification).                  */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1DRIVER_H__
+#define __T1DRIVER_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DRIVER_H
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+
+  FT_EXPORT_VAR( const FT_Driver_ClassRec )  t1_driver_class;
+
+
+FT_END_HEADER
+
+#endif /* __T1DRIVER_H__ */
+
+
+/* END */
diff --git a/src/type1/t1errors.h b/src/type1/t1errors.h
new file mode 100644 (file)
index 0000000..8740530
--- /dev/null
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1errors.h                                                             */
+/*                                                                         */
+/*    Type 1 error codes (specification only).                             */
+/*                                                                         */
+/*  Copyright 2001, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the Type 1 error enumeration constants.   */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __T1ERRORS_H__
+#define __T1ERRORS_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  T1_Err_
+#define FT_ERR_BASE    FT_Mod_Err_Type1
+
+#include FT_ERRORS_H
+
+#endif /* __T1ERRORS_H__ */
+
+
+/* END */
diff --git a/src/type1/t1gload.c b/src/type1/t1gload.c
new file mode 100644 (file)
index 0000000..80e5453
--- /dev/null
@@ -0,0 +1,517 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1gload.c                                                              */
+/*                                                                         */
+/*    Type 1 Glyph Loader (body).                                          */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include "t1gload.h"
+#include FT_INTERNAL_CALC_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_OUTLINE_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+
+#include "t1errors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_t1gload
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /**********                                                      *********/
+  /**********            COMPUTE THE MAXIMUM ADVANCE WIDTH         *********/
+  /**********                                                      *********/
+  /**********    The following code is in charge of computing      *********/
+  /**********    the maximum advance width of the font.  It        *********/
+  /**********    quickly processes each glyph charstring to        *********/
+  /**********    extract the value from either a `sbw' or `seac'   *********/
+  /**********    operator.                                         *********/
+  /**********                                                      *********/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Parse_Glyph_And_Get_Char_String( T1_Decoder  decoder,
+                                      FT_UInt     glyph_index,
+                                      FT_Data*    char_string )
+  {
+    T1_Face   face  = (T1_Face)decoder->builder.face;
+    T1_Font   type1 = &face->type1;
+    FT_Error  error = T1_Err_Ok;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    FT_Incremental_InterfaceRec *inc =
+                      face->root.internal->incremental_interface;
+#endif
+
+
+    decoder->font_matrix = type1->font_matrix;
+    decoder->font_offset = type1->font_offset;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+    /* For incremental fonts get the character data using the */
+    /* callback function.                                     */
+    if ( inc )
+      error = inc->funcs->get_glyph_data( inc->object,
+                                          glyph_index, char_string );
+    else
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+    /* For ordinary fonts get the character data stored in the face record. */
+    {
+      char_string->pointer = type1->charstrings[glyph_index];
+      char_string->length  = (FT_Int)type1->charstrings_len[glyph_index];
+    }
+
+    if ( !error )
+      error = decoder->funcs.parse_charstrings(
+                decoder, (FT_Byte*)char_string->pointer,
+                char_string->length );
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+    /* Incremental fonts can optionally override the metrics. */
+    if ( !error && inc && inc->funcs->get_glyph_metrics )
+    {
+      FT_Incremental_MetricsRec  metrics;
+
+
+      metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x );
+      metrics.bearing_y = 0;
+      metrics.advance   = FIXED_TO_INT( decoder->builder.advance.x );
+      metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y );
+
+      error = inc->funcs->get_glyph_metrics( inc->object,
+                                             glyph_index, FALSE, &metrics );
+
+      decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x );
+      decoder->builder.advance.x      = INT_TO_FIXED( metrics.advance );
+      decoder->builder.advance.y      = INT_TO_FIXED( metrics.advance_v );
+    }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+    return error;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  T1_Parse_Glyph( T1_Decoder  decoder,
+                  FT_UInt     glyph_index )
+  {
+    FT_Data   glyph_data;
+    FT_Error  error = T1_Parse_Glyph_And_Get_Char_String(
+                        decoder, glyph_index, &glyph_data );
+
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+
+    if ( !error )
+    {
+      T1_Face  face = (T1_Face)decoder->builder.face;
+
+
+      if ( face->root.internal->incremental_interface )
+        face->root.internal->incremental_interface->funcs->free_glyph_data(
+          face->root.internal->incremental_interface->object,
+          &glyph_data );
+    }
+
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Compute_Max_Advance( T1_Face  face,
+                          FT_Pos*  max_advance )
+  {
+    FT_Error       error;
+    T1_DecoderRec  decoder;
+    FT_Int         glyph_index;
+    T1_Font        type1 = &face->type1;
+    PSAux_Service  psaux = (PSAux_Service)face->psaux;
+
+
+    FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );
+
+    *max_advance = 0;
+
+    /* initialize load decoder */
+    error = psaux->t1_decoder_funcs->init( &decoder,
+                                           (FT_Face)face,
+                                           0, /* size       */
+                                           0, /* glyph slot */
+                                           (FT_Byte**)type1->glyph_names,
+                                           face->blend,
+                                           0,
+                                           FT_RENDER_MODE_NORMAL,
+                                           T1_Parse_Glyph );
+    if ( error )
+      return error;
+
+    decoder.builder.metrics_only = 1;
+    decoder.builder.load_points  = 0;
+
+    decoder.num_subrs     = type1->num_subrs;
+    decoder.subrs         = type1->subrs;
+    decoder.subrs_len     = type1->subrs_len;
+
+    decoder.buildchar     = face->buildchar;
+    decoder.len_buildchar = face->len_buildchar;
+
+    *max_advance = 0;
+
+    /* for each glyph, parse the glyph charstring and extract */
+    /* the advance width                                      */
+    for ( glyph_index = 0; glyph_index < type1->num_glyphs; glyph_index++ )
+    {
+      /* now get load the unscaled outline */
+      error = T1_Parse_Glyph( &decoder, glyph_index );
+      if ( glyph_index == 0 || decoder.builder.advance.x > *max_advance )
+        *max_advance = decoder.builder.advance.x;
+
+      /* ignore the error if one occurred - skip to next glyph */
+    }
+
+    psaux->t1_decoder_funcs->done( &decoder );
+
+    return T1_Err_Ok;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Get_Advances( FT_Face    t1face,        /* T1_Face */
+                   FT_UInt    first,
+                   FT_UInt    count,
+                   FT_Int32   load_flags,
+                   FT_Fixed*  advances )
+  {
+    T1_Face        face  = (T1_Face)t1face;
+    T1_DecoderRec  decoder;
+    T1_Font        type1 = &face->type1;
+    PSAux_Service  psaux = (PSAux_Service)face->psaux;
+    FT_UInt        nn;
+    FT_Error       error;
+
+
+    if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+    {
+      for ( nn = 0; nn < count; nn++ )
+        advances[nn] = 0;
+
+      return T1_Err_Ok;
+    }
+
+    error = psaux->t1_decoder_funcs->init( &decoder,
+                                           (FT_Face)face,
+                                           0, /* size       */
+                                           0, /* glyph slot */
+                                           (FT_Byte**)type1->glyph_names,
+                                           face->blend,
+                                           0,
+                                           FT_RENDER_MODE_NORMAL,
+                                           T1_Parse_Glyph );
+    if ( error )
+      return error;
+
+    decoder.builder.metrics_only = 1;
+    decoder.builder.load_points  = 0;
+
+    decoder.num_subrs = type1->num_subrs;
+    decoder.subrs     = type1->subrs;
+    decoder.subrs_len = type1->subrs_len;
+
+    decoder.buildchar     = face->buildchar;
+    decoder.len_buildchar = face->len_buildchar;
+
+    for ( nn = 0; nn < count; nn++ )
+    {
+      error = T1_Parse_Glyph( &decoder, first + nn );
+      if ( !error )
+        advances[nn] = FIXED_TO_INT( decoder.builder.advance.x );
+      else
+        advances[nn] = 0;
+    }
+
+    return T1_Err_Ok;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Load_Glyph( FT_GlyphSlot  t1glyph,          /* T1_GlyphSlot */
+                 FT_Size       t1size,           /* T1_Size      */
+                 FT_UInt       glyph_index,
+                 FT_Int32      load_flags )
+  {
+    T1_GlyphSlot            glyph = (T1_GlyphSlot)t1glyph;
+    FT_Error                error;
+    T1_DecoderRec           decoder;
+    T1_Face                 face = (T1_Face)t1glyph->face;
+    FT_Bool                 hinting;
+    T1_Font                 type1         = &face->type1;
+    PSAux_Service           psaux         = (PSAux_Service)face->psaux;
+    const T1_Decoder_Funcs  decoder_funcs = psaux->t1_decoder_funcs;
+
+    FT_Matrix               font_matrix;
+    FT_Vector               font_offset;
+    FT_Data                 glyph_data;
+    FT_Bool                 must_finish_decoder = FALSE;
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    FT_Bool                 glyph_data_loaded = 0;
+#endif
+
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    if ( glyph_index >= (FT_UInt)face->root.num_glyphs &&
+         !face->root.internal->incremental_interface   )
+#else
+    if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
+    {
+      error = T1_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );
+
+    if ( load_flags & FT_LOAD_NO_RECURSE )
+      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
+
+    if ( t1size )
+    {
+      glyph->x_scale = t1size->metrics.x_scale;
+      glyph->y_scale = t1size->metrics.y_scale;
+    }
+    else
+    {
+      glyph->x_scale = 0x10000L;
+      glyph->y_scale = 0x10000L;
+    }
+
+    t1glyph->outline.n_points   = 0;
+    t1glyph->outline.n_contours = 0;
+
+    hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 &&
+                       ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
+
+    t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+    error = decoder_funcs->init( &decoder,
+                                 t1glyph->face,
+                                 t1size,
+                                 t1glyph,
+                                 (FT_Byte**)type1->glyph_names,
+                                 face->blend,
+                                 FT_BOOL( hinting ),
+                                 FT_LOAD_TARGET_MODE( load_flags ),
+                                 T1_Parse_Glyph );
+    if ( error )
+      goto Exit;
+
+    must_finish_decoder = TRUE;
+
+    decoder.builder.no_recurse = FT_BOOL(
+                                   ( load_flags & FT_LOAD_NO_RECURSE ) != 0 );
+
+    decoder.num_subrs     = type1->num_subrs;
+    decoder.subrs         = type1->subrs;
+    decoder.subrs_len     = type1->subrs_len;
+
+    decoder.buildchar     = face->buildchar;
+    decoder.len_buildchar = face->len_buildchar;
+
+    /* now load the unscaled outline */
+    error = T1_Parse_Glyph_And_Get_Char_String( &decoder, glyph_index,
+                                                &glyph_data );
+    if ( error )
+      goto Exit;
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    glyph_data_loaded = 1;
+#endif
+
+    font_matrix = decoder.font_matrix;
+    font_offset = decoder.font_offset;
+
+    /* save new glyph tables */
+    decoder_funcs->done( &decoder );
+
+    must_finish_decoder = FALSE;
+
+    /* now, set the metrics -- this is rather simple, as   */
+    /* the left side bearing is the xMin, and the top side */
+    /* bearing the yMax                                    */
+    if ( !error )
+    {
+      t1glyph->outline.flags &= FT_OUTLINE_OWNER;
+      t1glyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;
+
+      /* for composite glyphs, return only left side bearing and */
+      /* advance width                                           */
+      if ( load_flags & FT_LOAD_NO_RECURSE )
+      {
+        FT_Slot_Internal  internal = t1glyph->internal;
+
+
+        t1glyph->metrics.horiBearingX =
+          FIXED_TO_INT( decoder.builder.left_bearing.x );
+        t1glyph->metrics.horiAdvance  =
+          FIXED_TO_INT( decoder.builder.advance.x );
+
+        internal->glyph_matrix      = font_matrix;
+        internal->glyph_delta       = font_offset;
+        internal->glyph_transformed = 1;
+      }
+      else
+      {
+        FT_BBox            cbox;
+        FT_Glyph_Metrics*  metrics = &t1glyph->metrics;
+        FT_Vector          advance;
+
+
+        /* copy the _unscaled_ advance width */
+        metrics->horiAdvance =
+          FIXED_TO_INT( decoder.builder.advance.x );
+        t1glyph->linearHoriAdvance =
+          FIXED_TO_INT( decoder.builder.advance.x );
+        t1glyph->internal->glyph_transformed = 0;
+
+        if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+        {
+          /* make up vertical ones */
+          metrics->vertAdvance = ( face->type1.font_bbox.yMax -
+                                   face->type1.font_bbox.yMin ) >> 16;
+          t1glyph->linearVertAdvance = metrics->vertAdvance;
+        }
+        else
+        {
+          metrics->vertAdvance =
+            FIXED_TO_INT( decoder.builder.advance.y );
+          t1glyph->linearVertAdvance =
+            FIXED_TO_INT( decoder.builder.advance.y );
+        }
+
+        t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;
+
+        if ( t1size && t1size->metrics.y_ppem < 24 )
+          t1glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
+
+#if 1
+        /* apply the font matrix, if any */
+        if ( font_matrix.xx != 0x10000L || font_matrix.yy != font_matrix.xx ||
+             font_matrix.xy != 0        || font_matrix.yx != 0              )
+          FT_Outline_Transform( &t1glyph->outline, &font_matrix );
+
+        if ( font_offset.x || font_offset.y )
+          FT_Outline_Translate( &t1glyph->outline,
+                                font_offset.x,
+                                font_offset.y );
+
+        advance.x = metrics->horiAdvance;
+        advance.y = 0;
+        FT_Vector_Transform( &advance, &font_matrix );
+        metrics->horiAdvance = advance.x + font_offset.x;
+        advance.x = 0;
+        advance.y = metrics->vertAdvance;
+        FT_Vector_Transform( &advance, &font_matrix );
+        metrics->vertAdvance = advance.y + font_offset.y;
+#endif
+
+        if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )
+        {
+          /* scale the outline and the metrics */
+          FT_Int       n;
+          FT_Outline*  cur = decoder.builder.base;
+          FT_Vector*   vec = cur->points;
+          FT_Fixed     x_scale = glyph->x_scale;
+          FT_Fixed     y_scale = glyph->y_scale;
+
+
+          /* First of all, scale the points, if we are not hinting */
+          if ( !hinting || ! decoder.builder.hints_funcs )
+            for ( n = cur->n_points; n > 0; n--, vec++ )
+            {
+              vec->x = FT_MulFix( vec->x, x_scale );
+              vec->y = FT_MulFix( vec->y, y_scale );
+            }
+
+          /* Then scale the metrics */
+          metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
+          metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
+        }
+
+        /* compute the other metrics */
+        FT_Outline_Get_CBox( &t1glyph->outline, &cbox );
+
+        metrics->width  = cbox.xMax - cbox.xMin;
+        metrics->height = cbox.yMax - cbox.yMin;
+
+        metrics->horiBearingX = cbox.xMin;
+        metrics->horiBearingY = cbox.yMax;
+
+        if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
+        {
+          /* make up vertical ones */
+          ft_synthesize_vertical_metrics( metrics,
+                                          metrics->vertAdvance );
+        }
+      }
+
+      /* Set control data to the glyph charstrings.  Note that this is */
+      /* _not_ zero-terminated.                                        */
+      t1glyph->control_data = (FT_Byte*)glyph_data.pointer;
+      t1glyph->control_len  = glyph_data.length;
+    }
+
+
+  Exit:
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    if ( glyph_data_loaded && face->root.internal->incremental_interface )
+    {
+      face->root.internal->incremental_interface->funcs->free_glyph_data(
+        face->root.internal->incremental_interface->object,
+        &glyph_data );
+
+      /* Set the control data to null - it is no longer available if   */
+      /* loaded incrementally.                                         */
+      t1glyph->control_data = 0;
+      t1glyph->control_len  = 0;
+    }
+#endif
+
+    if ( must_finish_decoder )
+      decoder_funcs->done( &decoder );
+
+    return error;
+  }
+
+
+/* END */
diff --git a/src/type1/t1gload.h b/src/type1/t1gload.h
new file mode 100644 (file)
index 0000000..0bdea3a
--- /dev/null
@@ -0,0 +1,53 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1gload.h                                                              */
+/*                                                                         */
+/*    Type 1 Glyph Loader (specification).                                 */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2008, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1GLOAD_H__
+#define __T1GLOAD_H__
+
+
+#include <ft2build.h>
+#include "t1objs.h"
+
+
+FT_BEGIN_HEADER
+
+
+  FT_LOCAL( FT_Error )
+  T1_Compute_Max_Advance( T1_Face  face,
+                          FT_Pos*  max_advance );
+
+  FT_LOCAL( FT_Error )
+  T1_Get_Advances( FT_Face    face,
+                   FT_UInt    first,
+                   FT_UInt    count,
+                   FT_Int32   load_flags,
+                   FT_Fixed*  advances );
+
+  FT_LOCAL( FT_Error )
+  T1_Load_Glyph( FT_GlyphSlot  glyph,
+                 FT_Size       size,
+                 FT_UInt       glyph_index,
+                 FT_Int32      load_flags );
+
+
+FT_END_HEADER
+
+#endif /* __T1GLOAD_H__ */
+
+
+/* END */
diff --git a/src/type1/t1load.c b/src/type1/t1load.c
new file mode 100644 (file)
index 0000000..a0adfd4
--- /dev/null
@@ -0,0 +1,2243 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1load.c                                                               */
+/*                                                                         */
+/*    Type 1 font loader (body).                                           */
+/*                                                                         */
+/*  Copyright 1996-2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This is the new and improved Type 1 data loader for FreeType 2.  The  */
+  /* old loader has several problems: it is slow, complex, difficult to    */
+  /* maintain, and contains incredible hacks to make it accept some        */
+  /* ill-formed Type 1 fonts without hiccup-ing.  Moreover, about 5% of    */
+  /* the Type 1 fonts on my machine still aren't loaded correctly by it.   */
+  /*                                                                       */
+  /* This version is much simpler, much faster and also easier to read and */
+  /* maintain by a great order of magnitude.  The idea behind it is to     */
+  /* _not_ try to read the Type 1 token stream with a state machine (i.e.  */
+  /* a Postscript-like interpreter) but rather to perform simple pattern   */
+  /* matching.                                                             */
+  /*                                                                       */
+  /* Indeed, nearly all data definitions follow a simple pattern like      */
+  /*                                                                       */
+  /*  ... /Field <data> ...                                                */
+  /*                                                                       */
+  /* where <data> can be a number, a boolean, a string, or an array of     */
+  /* numbers.  There are a few exceptions, namely the encoding, font name, */
+  /* charstrings, and subrs; they are handled with a special pattern       */
+  /* matching routine.                                                     */
+  /*                                                                       */
+  /* All other common cases are handled very simply.  The matching rules   */
+  /* are defined in the file `t1tokens.h' through the use of several       */
+  /* macros calls PARSE_XXX.  This file is included twice here; the first  */
+  /* time to generate parsing callback functions, the second time to       */
+  /* generate a table of keywords (with pointers to the associated         */
+  /* callback functions).                                                  */
+  /*                                                                       */
+  /* The function `parse_dict' simply scans *linearly* a given dictionary  */
+  /* (either the top-level or private one) and calls the appropriate       */
+  /* callback when it encounters an immediate keyword.                     */
+  /*                                                                       */
+  /* This is by far the fastest way one can find to parse and read all     */
+  /* data.                                                                 */
+  /*                                                                       */
+  /* This led to tremendous code size reduction.  Note that later, the     */
+  /* glyph loader will also be _greatly_ simplified, and the automatic     */
+  /* hinter will replace the clumsy `t1hinter'.                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_CONFIG_CONFIG_H
+#include FT_MULTIPLE_MASTERS_H
+#include FT_INTERNAL_TYPE1_TYPES_H
+#include FT_INTERNAL_CALC_H
+
+#include "t1load.h"
+#include "t1errors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_t1load
+
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                    MULTIPLE MASTERS SUPPORT                   *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static FT_Error
+  t1_allocate_blend( T1_Face  face,
+                     FT_UInt  num_designs,
+                     FT_UInt  num_axis )
+  {
+    PS_Blend   blend;
+    FT_Memory  memory = face->root.memory;
+    FT_Error   error  = T1_Err_Ok;
+
+
+    blend = face->blend;
+    if ( !blend )
+    {
+      if ( FT_NEW( blend ) )
+        goto Exit;
+
+      blend->num_default_design_vector = 0;
+
+      face->blend = blend;
+    }
+
+    /* allocate design data if needed */
+    if ( num_designs > 0 )
+    {
+      if ( blend->num_designs == 0 )
+      {
+        FT_UInt  nn;
+
+
+        /* allocate the blend `private' and `font_info' dictionaries */
+        if ( FT_NEW_ARRAY( blend->font_infos[1], num_designs     ) ||
+             FT_NEW_ARRAY( blend->privates[1], num_designs       ) ||
+             FT_NEW_ARRAY( blend->bboxes[1], num_designs         ) ||
+             FT_NEW_ARRAY( blend->weight_vector, num_designs * 2 ) )
+          goto Exit;
+
+        blend->default_weight_vector = blend->weight_vector + num_designs;
+
+        blend->font_infos[0] = &face->type1.font_info;
+        blend->privates  [0] = &face->type1.private_dict;
+        blend->bboxes    [0] = &face->type1.font_bbox;
+
+        for ( nn = 2; nn <= num_designs; nn++ )
+        {
+          blend->privates[nn]   = blend->privates  [nn - 1] + 1;
+          blend->font_infos[nn] = blend->font_infos[nn - 1] + 1;
+          blend->bboxes[nn]     = blend->bboxes    [nn - 1] + 1;
+        }
+
+        blend->num_designs   = num_designs;
+      }
+      else if ( blend->num_designs != num_designs )
+        goto Fail;
+    }
+
+    /* allocate axis data if needed */
+    if ( num_axis > 0 )
+    {
+      if ( blend->num_axis != 0 && blend->num_axis != num_axis )
+        goto Fail;
+
+      blend->num_axis = num_axis;
+    }
+
+    /* allocate the blend design pos table if needed */
+    num_designs = blend->num_designs;
+    num_axis    = blend->num_axis;
+    if ( num_designs && num_axis && blend->design_pos[0] == 0 )
+    {
+      FT_UInt  n;
+
+
+      if ( FT_NEW_ARRAY( blend->design_pos[0], num_designs * num_axis ) )
+        goto Exit;
+
+      for ( n = 1; n < num_designs; n++ )
+        blend->design_pos[n] = blend->design_pos[0] + num_axis * n;
+    }
+
+  Exit:
+    return error;
+
+  Fail:
+    error = T1_Err_Invalid_File_Format;
+    goto Exit;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Get_Multi_Master( T1_Face           face,
+                       FT_Multi_Master*  master )
+  {
+    PS_Blend  blend = face->blend;
+    FT_UInt   n;
+    FT_Error  error;
+
+
+    error = T1_Err_Invalid_Argument;
+
+    if ( blend )
+    {
+      master->num_axis    = blend->num_axis;
+      master->num_designs = blend->num_designs;
+
+      for ( n = 0; n < blend->num_axis; n++ )
+      {
+        FT_MM_Axis*   axis = master->axis + n;
+        PS_DesignMap  map = blend->design_map + n;
+
+
+        axis->name    = blend->axis_names[n];
+        axis->minimum = map->design_points[0];
+        axis->maximum = map->design_points[map->num_points - 1];
+      }
+
+      error = T1_Err_Ok;
+    }
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Given a normalized (blend) coordinate, figure out the design          */
+  /* coordinate appropriate for that value.                                */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Fixed )
+  mm_axis_unmap( PS_DesignMap  axismap,
+                 FT_Fixed      ncv )
+  {
+    int  j;
+
+
+    if ( ncv <= axismap->blend_points[0] )
+      return INT_TO_FIXED( axismap->design_points[0] );
+
+    for ( j = 1; j < axismap->num_points; ++j )
+    {
+      if ( ncv <= axismap->blend_points[j] )
+      {
+        FT_Fixed  t = FT_MulDiv( ncv - axismap->blend_points[j - 1],
+                                 0x10000L,
+                                 axismap->blend_points[j] -
+                                   axismap->blend_points[j - 1] );
+
+        return INT_TO_FIXED( axismap->design_points[j - 1] ) +
+                 FT_MulDiv( t,
+                            axismap->design_points[j] -
+                              axismap->design_points[j - 1],
+                            1L );
+      }
+    }
+
+    return INT_TO_FIXED( axismap->design_points[axismap->num_points - 1] );
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Given a vector of weights, one for each design, figure out the        */
+  /* normalized axis coordinates which gave rise to those weights.         */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  mm_weights_unmap( FT_Fixed*  weights,
+                    FT_Fixed*  axiscoords,
+                    FT_UInt    axis_count )
+  {
+    FT_ASSERT( axis_count <= T1_MAX_MM_AXIS );
+
+    if ( axis_count == 1 )
+      axiscoords[0] = weights[1];
+
+    else if ( axis_count == 2 )
+    {
+      axiscoords[0] = weights[3] + weights[1];
+      axiscoords[1] = weights[3] + weights[2];
+    }
+
+    else if ( axis_count == 3 )
+    {
+      axiscoords[0] = weights[7] + weights[5] + weights[3] + weights[1];
+      axiscoords[1] = weights[7] + weights[6] + weights[3] + weights[2];
+      axiscoords[2] = weights[7] + weights[6] + weights[5] + weights[4];
+    }
+
+    else
+    {
+      axiscoords[0] = weights[15] + weights[13] + weights[11] + weights[9] +
+                        weights[7] + weights[5] + weights[3] + weights[1];
+      axiscoords[1] = weights[15] + weights[14] + weights[11] + weights[10] +
+                        weights[7] + weights[6] + weights[3] + weights[2];
+      axiscoords[2] = weights[15] + weights[14] + weights[13] + weights[12] +
+                        weights[7] + weights[6] + weights[5] + weights[4];
+      axiscoords[3] = weights[15] + weights[14] + weights[13] + weights[12] +
+                        weights[11] + weights[10] + weights[9] + weights[8];
+    }
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Just a wrapper around T1_Get_Multi_Master to support the different    */
+  /*  arguments needed by the GX var distortable fonts.                    */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  T1_Get_MM_Var( T1_Face      face,
+                 FT_MM_Var*  *master )
+  {
+    FT_Memory        memory = face->root.memory;
+    FT_MM_Var       *mmvar = NULL;
+    FT_Multi_Master  mmaster;
+    FT_Error         error;
+    FT_UInt          i;
+    FT_Fixed         axiscoords[T1_MAX_MM_AXIS];
+    PS_Blend         blend = face->blend;
+
+
+    error = T1_Get_Multi_Master( face, &mmaster );
+    if ( error )
+      goto Exit;
+    if ( FT_ALLOC( mmvar,
+                   sizeof ( FT_MM_Var ) +
+                     mmaster.num_axis * sizeof ( FT_Var_Axis ) ) )
+      goto Exit;
+
+    mmvar->num_axis        = mmaster.num_axis;
+    mmvar->num_designs     = mmaster.num_designs;
+    mmvar->num_namedstyles = (FT_UInt)-1;                /* Does not apply */
+    mmvar->axis            = (FT_Var_Axis*)&mmvar[1];
+                                      /* Point to axes after MM_Var struct */
+    mmvar->namedstyle      = NULL;
+
+    for ( i = 0 ; i < mmaster.num_axis; ++i )
+    {
+      mmvar->axis[i].name    = mmaster.axis[i].name;
+      mmvar->axis[i].minimum = INT_TO_FIXED( mmaster.axis[i].minimum);
+      mmvar->axis[i].maximum = INT_TO_FIXED( mmaster.axis[i].maximum);
+      mmvar->axis[i].def     = ( mmvar->axis[i].minimum +
+                                   mmvar->axis[i].maximum ) / 2;
+                            /* Does not apply.  But this value is in range */
+      mmvar->axis[i].strid   = (FT_UInt)-1;    /* Does not apply */
+      mmvar->axis[i].tag     = (FT_ULong)-1;   /* Does not apply */
+
+      if ( ft_strcmp( mmvar->axis[i].name, "Weight" ) == 0 )
+        mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'g', 'h', 't' );
+      else if ( ft_strcmp( mmvar->axis[i].name, "Width" ) == 0 )
+        mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'd', 't', 'h' );
+      else if ( ft_strcmp( mmvar->axis[i].name, "OpticalSize" ) == 0 )
+        mmvar->axis[i].tag = FT_MAKE_TAG( 'o', 'p', 's', 'z' );
+    }
+
+    if ( blend->num_designs == ( 1U << blend->num_axis ) )
+    {
+      mm_weights_unmap( blend->default_weight_vector,
+                        axiscoords,
+                        blend->num_axis );
+
+      for ( i = 0; i < mmaster.num_axis; ++i )
+        mmvar->axis[i].def = mm_axis_unmap( &blend->design_map[i],
+                                            axiscoords[i] );
+    }
+
+    *master = mmvar;
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Set_MM_Blend( T1_Face    face,
+                   FT_UInt    num_coords,
+                   FT_Fixed*  coords )
+  {
+    PS_Blend  blend = face->blend;
+    FT_Error  error;
+    FT_UInt   n, m;
+
+
+    error = T1_Err_Invalid_Argument;
+
+    if ( blend && blend->num_axis == num_coords )
+    {
+      /* recompute the weight vector from the blend coordinates */
+      error = T1_Err_Ok;
+
+      for ( n = 0; n < blend->num_designs; n++ )
+      {
+        FT_Fixed  result = 0x10000L;  /* 1.0 fixed */
+
+
+        for ( m = 0; m < blend->num_axis; m++ )
+        {
+          FT_Fixed  factor;
+
+
+          /* get current blend axis position */
+          factor = coords[m];
+          if ( factor < 0 )        factor = 0;
+          if ( factor > 0x10000L ) factor = 0x10000L;
+
+          if ( ( n & ( 1 << m ) ) == 0 )
+            factor = 0x10000L - factor;
+
+          result = FT_MulFix( result, factor );
+        }
+        blend->weight_vector[n] = result;
+      }
+
+      error = T1_Err_Ok;
+    }
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Set_MM_Design( T1_Face   face,
+                    FT_UInt   num_coords,
+                    FT_Long*  coords )
+  {
+    PS_Blend  blend = face->blend;
+    FT_Error  error;
+    FT_UInt   n, p;
+
+
+    error = T1_Err_Invalid_Argument;
+    if ( blend && blend->num_axis == num_coords )
+    {
+      /* compute the blend coordinates through the blend design map */
+      FT_Fixed  final_blends[T1_MAX_MM_DESIGNS];
+
+
+      for ( n = 0; n < blend->num_axis; n++ )
+      {
+        FT_Long       design  = coords[n];
+        FT_Fixed      the_blend;
+        PS_DesignMap  map     = blend->design_map + n;
+        FT_Long*      designs = map->design_points;
+        FT_Fixed*     blends  = map->blend_points;
+        FT_Int        before  = -1, after = -1;
+
+
+        for ( p = 0; p < (FT_UInt)map->num_points; p++ )
+        {
+          FT_Long  p_design = designs[p];
+
+
+          /* exact match? */
+          if ( design == p_design )
+          {
+            the_blend = blends[p];
+            goto Found;
+          }
+
+          if ( design < p_design )
+          {
+            after = p;
+            break;
+          }
+
+          before = p;
+        }
+
+        /* now interpolate if necessary */
+        if ( before < 0 )
+          the_blend = blends[0];
+
+        else if ( after < 0 )
+          the_blend = blends[map->num_points - 1];
+
+        else
+          the_blend = FT_MulDiv( design         - designs[before],
+                                 blends [after] - blends [before],
+                                 designs[after] - designs[before] );
+
+      Found:
+        final_blends[n] = the_blend;
+      }
+
+      error = T1_Set_MM_Blend( face, num_coords, final_blends );
+    }
+
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Just a wrapper around T1_Set_MM_Design to support the different       */
+  /* arguments needed by the GX var distortable fonts.                     */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  T1_Set_Var_Design( T1_Face    face,
+                     FT_UInt    num_coords,
+                     FT_Fixed*  coords )
+  {
+     FT_Long   lcoords[4];          /* maximum axis count is 4 */
+     FT_UInt   i;
+     FT_Error  error;
+
+
+     error = T1_Err_Invalid_Argument;
+     if ( num_coords <= 4 && num_coords > 0 )
+     {
+       for ( i = 0; i < num_coords; ++i )
+         lcoords[i] = FIXED_TO_INT( coords[i] );
+       error = T1_Set_MM_Design( face, num_coords, lcoords );
+     }
+
+     return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  T1_Done_Blend( T1_Face  face )
+  {
+    FT_Memory  memory = face->root.memory;
+    PS_Blend   blend  = face->blend;
+
+
+    if ( blend )
+    {
+      FT_UInt  num_designs = blend->num_designs;
+      FT_UInt  num_axis    = blend->num_axis;
+      FT_UInt  n;
+
+
+      /* release design pos table */
+      FT_FREE( blend->design_pos[0] );
+      for ( n = 1; n < num_designs; n++ )
+        blend->design_pos[n] = 0;
+
+      /* release blend `private' and `font info' dictionaries */
+      FT_FREE( blend->privates[1] );
+      FT_FREE( blend->font_infos[1] );
+      FT_FREE( blend->bboxes[1] );
+
+      for ( n = 0; n < num_designs; n++ )
+      {
+        blend->privates  [n] = 0;
+        blend->font_infos[n] = 0;
+        blend->bboxes    [n] = 0;
+      }
+
+      /* release weight vectors */
+      FT_FREE( blend->weight_vector );
+      blend->default_weight_vector = 0;
+
+      /* release axis names */
+      for ( n = 0; n < num_axis; n++ )
+        FT_FREE( blend->axis_names[n] );
+
+      /* release design map */
+      for ( n = 0; n < num_axis; n++ )
+      {
+        PS_DesignMap  dmap = blend->design_map + n;
+
+
+        FT_FREE( dmap->design_points );
+        dmap->num_points = 0;
+      }
+
+      FT_FREE( face->blend );
+    }
+  }
+
+
+  static void
+  parse_blend_axis_types( T1_Face    face,
+                          T1_Loader  loader )
+  {
+    T1_TokenRec  axis_tokens[T1_MAX_MM_AXIS];
+    FT_Int       n, num_axis;
+    FT_Error     error = T1_Err_Ok;
+    PS_Blend     blend;
+    FT_Memory    memory;
+
+
+    /* take an array of objects */
+    T1_ToTokenArray( &loader->parser, axis_tokens,
+                     T1_MAX_MM_AXIS, &num_axis );
+    if ( num_axis < 0 )
+    {
+      error = T1_Err_Ignore;
+      goto Exit;
+    }
+    if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS )
+    {
+      FT_ERROR(( "parse_blend_axis_types: incorrect number of axes: %d\n",
+                 num_axis ));
+      error = T1_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    /* allocate blend if necessary */
+    error = t1_allocate_blend( face, 0, (FT_UInt)num_axis );
+    if ( error )
+      goto Exit;
+
+    blend  = face->blend;
+    memory = face->root.memory;
+
+    /* each token is an immediate containing the name of the axis */
+    for ( n = 0; n < num_axis; n++ )
+    {
+      T1_Token    token = axis_tokens + n;
+      FT_Byte*    name;
+      FT_PtrDist  len;
+
+
+      /* skip first slash, if any */
+      if ( token->start[0] == '/' )
+        token->start++;
+
+      len = token->limit - token->start;
+      if ( len == 0 )
+      {
+        error = T1_Err_Invalid_File_Format;
+        goto Exit;
+      }
+
+      if ( FT_ALLOC( blend->axis_names[n], len + 1 ) )
+        goto Exit;
+
+      name = (FT_Byte*)blend->axis_names[n];
+      FT_MEM_COPY( name, token->start, len );
+      name[len] = 0;
+    }
+
+  Exit:
+    loader->parser.root.error = error;
+  }
+
+
+  static void
+  parse_blend_design_positions( T1_Face    face,
+                                T1_Loader  loader )
+  {
+    T1_TokenRec  design_tokens[T1_MAX_MM_DESIGNS];
+    FT_Int       num_designs;
+    FT_Int       num_axis;
+    T1_Parser    parser = &loader->parser;
+
+    FT_Error     error = T1_Err_Ok;
+    PS_Blend     blend;
+
+
+    /* get the array of design tokens -- compute number of designs */
+    T1_ToTokenArray( parser, design_tokens,
+                     T1_MAX_MM_DESIGNS, &num_designs );
+    if ( num_designs < 0 )
+    {
+      error = T1_Err_Ignore;
+      goto Exit;
+    }
+    if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS )
+    {
+      FT_ERROR(( "parse_blend_design_positions:"
+                 " incorrect number of designs: %d\n",
+                 num_designs ));
+      error = T1_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    {
+      FT_Byte*  old_cursor = parser->root.cursor;
+      FT_Byte*  old_limit  = parser->root.limit;
+      FT_Int    n;
+
+
+      blend    = face->blend;
+      num_axis = 0;  /* make compiler happy */
+
+      for ( n = 0; n < num_designs; n++ )
+      {
+        T1_TokenRec  axis_tokens[T1_MAX_MM_AXIS];
+        T1_Token     token;
+        FT_Int       axis, n_axis;
+
+
+        /* read axis/coordinates tokens */
+        token = design_tokens + n;
+        parser->root.cursor = token->start;
+        parser->root.limit  = token->limit;
+        T1_ToTokenArray( parser, axis_tokens, T1_MAX_MM_AXIS, &n_axis );
+
+        if ( n == 0 )
+        {
+          if ( n_axis <= 0 || n_axis > T1_MAX_MM_AXIS )
+          {
+            FT_ERROR(( "parse_blend_design_positions:"
+                       " invalid number of axes: %d\n",
+                       n_axis ));
+            error = T1_Err_Invalid_File_Format;
+            goto Exit;
+          }
+
+          num_axis = n_axis;
+          error = t1_allocate_blend( face, num_designs, num_axis );
+          if ( error )
+            goto Exit;
+          blend = face->blend;
+        }
+        else if ( n_axis != num_axis )
+        {
+          FT_ERROR(( "parse_blend_design_positions: incorrect table\n" ));
+          error = T1_Err_Invalid_File_Format;
+          goto Exit;
+        }
+
+        /* now read each axis token into the design position */
+        for ( axis = 0; axis < n_axis; axis++ )
+        {
+          T1_Token  token2 = axis_tokens + axis;
+
+
+          parser->root.cursor = token2->start;
+          parser->root.limit  = token2->limit;
+          blend->design_pos[n][axis] = T1_ToFixed( parser, 0 );
+        }
+      }
+
+      loader->parser.root.cursor = old_cursor;
+      loader->parser.root.limit  = old_limit;
+    }
+
+  Exit:
+    loader->parser.root.error = error;
+  }
+
+
+  static void
+  parse_blend_design_map( T1_Face    face,
+                          T1_Loader  loader )
+  {
+    FT_Error     error  = T1_Err_Ok;
+    T1_Parser    parser = &loader->parser;
+    PS_Blend     blend;
+    T1_TokenRec  axis_tokens[T1_MAX_MM_AXIS];
+    FT_Int       n, num_axis;
+    FT_Byte*     old_cursor;
+    FT_Byte*     old_limit;
+    FT_Memory    memory = face->root.memory;
+
+
+    T1_ToTokenArray( parser, axis_tokens,
+                     T1_MAX_MM_AXIS, &num_axis );
+    if ( num_axis < 0 )
+    {
+      error = T1_Err_Ignore;
+      goto Exit;
+    }
+    if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS )
+    {
+      FT_ERROR(( "parse_blend_design_map: incorrect number of axes: %d\n",
+                 num_axis ));
+      error = T1_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    old_cursor = parser->root.cursor;
+    old_limit  = parser->root.limit;
+
+    error = t1_allocate_blend( face, 0, num_axis );
+    if ( error )
+      goto Exit;
+    blend = face->blend;
+
+    /* now read each axis design map */
+    for ( n = 0; n < num_axis; n++ )
+    {
+      PS_DesignMap  map = blend->design_map + n;
+      T1_Token      axis_token;
+      T1_TokenRec   point_tokens[T1_MAX_MM_MAP_POINTS];
+      FT_Int        p, num_points;
+
+
+      axis_token = axis_tokens + n;
+
+      parser->root.cursor = axis_token->start;
+      parser->root.limit  = axis_token->limit;
+      T1_ToTokenArray( parser, point_tokens,
+                       T1_MAX_MM_MAP_POINTS, &num_points );
+
+      if ( num_points <= 0 || num_points > T1_MAX_MM_MAP_POINTS )
+      {
+        FT_ERROR(( "parse_blend_design_map: incorrect table\n" ));
+        error = T1_Err_Invalid_File_Format;
+        goto Exit;
+      }
+
+      /* allocate design map data */
+      if ( FT_NEW_ARRAY( map->design_points, num_points * 2 ) )
+        goto Exit;
+      map->blend_points = map->design_points + num_points;
+      map->num_points   = (FT_Byte)num_points;
+
+      for ( p = 0; p < num_points; p++ )
+      {
+        T1_Token  point_token;
+
+
+        point_token = point_tokens + p;
+
+        /* don't include delimiting brackets */
+        parser->root.cursor = point_token->start + 1;
+        parser->root.limit  = point_token->limit - 1;
+
+        map->design_points[p] = T1_ToInt( parser );
+        map->blend_points [p] = T1_ToFixed( parser, 0 );
+      }
+    }
+
+    parser->root.cursor = old_cursor;
+    parser->root.limit  = old_limit;
+
+  Exit:
+    parser->root.error = error;
+  }
+
+
+  static void
+  parse_weight_vector( T1_Face    face,
+                       T1_Loader  loader )
+  {
+    T1_TokenRec  design_tokens[T1_MAX_MM_DESIGNS];
+    FT_Int       num_designs;
+    FT_Error     error  = T1_Err_Ok;
+    T1_Parser    parser = &loader->parser;
+    PS_Blend     blend  = face->blend;
+    T1_Token     token;
+    FT_Int       n;
+    FT_Byte*     old_cursor;
+    FT_Byte*     old_limit;
+
+
+    T1_ToTokenArray( parser, design_tokens,
+                     T1_MAX_MM_DESIGNS, &num_designs );
+    if ( num_designs < 0 )
+    {
+      error = T1_Err_Ignore;
+      goto Exit;
+    }
+    if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS )
+    {
+      FT_ERROR(( "parse_weight_vector:"
+                 " incorrect number of designs: %d\n",
+                 num_designs ));
+      error = T1_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    if ( !blend || !blend->num_designs )
+    {
+      error = t1_allocate_blend( face, num_designs, 0 );
+      if ( error )
+        goto Exit;
+      blend = face->blend;
+    }
+    else if ( blend->num_designs != (FT_UInt)num_designs )
+    {
+      FT_ERROR(( "parse_weight_vector:"
+                 " /BlendDesignPosition and /WeightVector have\n"
+                 "                    "
+                 " different number of elements\n" ));
+      error = T1_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    old_cursor = parser->root.cursor;
+    old_limit  = parser->root.limit;
+
+    for ( n = 0; n < num_designs; n++ )
+    {
+      token = design_tokens + n;
+      parser->root.cursor = token->start;
+      parser->root.limit  = token->limit;
+
+      blend->default_weight_vector[n] =
+      blend->weight_vector[n]         = T1_ToFixed( parser, 0 );
+    }
+
+    parser->root.cursor = old_cursor;
+    parser->root.limit  = old_limit;
+
+  Exit:
+    parser->root.error = error;
+  }
+
+
+  /* e.g., /BuildCharArray [0 0 0 0 0 0 0 0] def           */
+  /* we're only interested in the number of array elements */
+  static void
+  parse_buildchar( T1_Face    face,
+                   T1_Loader  loader )
+  {
+    face->len_buildchar = T1_ToFixedArray( &loader->parser, 0, NULL, 0 );
+
+    return;
+  }
+
+
+#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */
+
+
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                      TYPE 1 SYMBOL PARSING                    *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static FT_Error
+  t1_load_keyword( T1_Face         face,
+                   T1_Loader       loader,
+                   const T1_Field  field )
+  {
+    FT_Error  error;
+    void*     dummy_object;
+    void**    objects;
+    FT_UInt   max_objects;
+    PS_Blend  blend = face->blend;
+
+
+    if ( blend && blend->num_designs == 0 )
+      blend = NULL;
+
+    /* if the keyword has a dedicated callback, call it */
+    if ( field->type == T1_FIELD_TYPE_CALLBACK )
+    {
+      field->reader( (FT_Face)face, loader );
+      error = loader->parser.root.error;
+      goto Exit;
+    }
+
+    /* now, the keyword is either a simple field, or a table of fields; */
+    /* we are now going to take care of it                              */
+    switch ( field->location )
+    {
+    case T1_FIELD_LOCATION_FONT_INFO:
+      dummy_object = &face->type1.font_info;
+      objects      = &dummy_object;
+      max_objects  = 0;
+
+      if ( blend )
+      {
+        objects     = (void**)blend->font_infos;
+        max_objects = blend->num_designs;
+      }
+      break;
+
+    case T1_FIELD_LOCATION_FONT_EXTRA:
+      dummy_object = &face->type1.font_extra;
+      objects      = &dummy_object;
+      max_objects  = 0;
+      break;
+
+    case T1_FIELD_LOCATION_PRIVATE:
+      dummy_object = &face->type1.private_dict;
+      objects      = &dummy_object;
+      max_objects  = 0;
+
+      if ( blend )
+      {
+        objects     = (void**)blend->privates;
+        max_objects = blend->num_designs;
+      }
+      break;
+
+    case T1_FIELD_LOCATION_BBOX:
+      dummy_object = &face->type1.font_bbox;
+      objects      = &dummy_object;
+      max_objects  = 0;
+
+      if ( blend )
+      {
+        objects     = (void**)blend->bboxes;
+        max_objects = blend->num_designs;
+      }
+      break;
+
+    case T1_FIELD_LOCATION_LOADER:
+      dummy_object = loader;
+      objects      = &dummy_object;
+      max_objects  = 0;
+      break;
+
+    case T1_FIELD_LOCATION_FACE:
+      dummy_object = face;
+      objects      = &dummy_object;
+      max_objects  = 0;
+      break;
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+    case T1_FIELD_LOCATION_BLEND:
+      dummy_object = face->blend;
+      objects      = &dummy_object;
+      max_objects  = 0;
+      break;
+#endif
+
+    default:
+      dummy_object = &face->type1;
+      objects      = &dummy_object;
+      max_objects  = 0;
+    }
+
+    if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY ||
+         field->type == T1_FIELD_TYPE_FIXED_ARRAY   )
+      error = T1_Load_Field_Table( &loader->parser, field,
+                                   objects, max_objects, 0 );
+    else
+      error = T1_Load_Field( &loader->parser, field,
+                             objects, max_objects, 0 );
+
+  Exit:
+    return error;
+  }
+
+
+  static void
+  parse_private( T1_Face    face,
+                 T1_Loader  loader )
+  {
+    FT_UNUSED( face );
+
+    loader->keywords_encountered |= T1_PRIVATE;
+  }
+
+
+  static int
+  read_binary_data( T1_Parser  parser,
+                    FT_Long*   size,
+                    FT_Byte**  base )
+  {
+    FT_Byte*  cur;
+    FT_Byte*  limit = parser->root.limit;
+
+
+    /* the binary data has one of the following formats */
+    /*                                                  */
+    /*   `size' [white*] RD white ....... ND            */
+    /*   `size' [white*] -| white ....... |-            */
+    /*                                                  */
+
+    T1_Skip_Spaces( parser );
+
+    cur = parser->root.cursor;
+
+    if ( cur < limit && ft_isdigit( *cur ) )
+    {
+      FT_Long  s = T1_ToInt( parser );
+
+
+      T1_Skip_PS_Token( parser );   /* `RD' or `-|' or something else */
+
+      /* there is only one whitespace char after the */
+      /* `RD' or `-|' token                          */
+      *base = parser->root.cursor + 1;
+
+      if ( s >= 0 && s < limit - *base )
+      {
+        parser->root.cursor += s + 1;
+        *size = s;
+        return !parser->root.error;
+      }
+    }
+
+    FT_ERROR(( "read_binary_data: invalid size field\n" ));
+    parser->root.error = T1_Err_Invalid_File_Format;
+    return 0;
+  }
+
+
+  /* We now define the routines to handle the `/Encoding', `/Subrs', */
+  /* and `/CharStrings' dictionaries.                                */
+
+  static void
+  t1_parse_font_matrix( T1_Face    face,
+                        T1_Loader  loader )
+  {
+    T1_Parser   parser = &loader->parser;
+    FT_Matrix*  matrix = &face->type1.font_matrix;
+    FT_Vector*  offset = &face->type1.font_offset;
+    FT_Face     root   = (FT_Face)&face->root;
+    FT_Fixed    temp[6];
+    FT_Fixed    temp_scale;
+    FT_Int      result;
+
+
+    result = T1_ToFixedArray( parser, 6, temp, 3 );
+
+    if ( result < 0 )
+    {
+      parser->root.error = T1_Err_Invalid_File_Format;
+      return;
+    }
+
+    temp_scale = FT_ABS( temp[3] );
+
+    if ( temp_scale == 0 )
+    {
+      FT_ERROR(( "t1_parse_font_matrix: invalid font matrix\n" ));
+      parser->root.error = T1_Err_Invalid_File_Format;
+      return;
+    }
+
+    /* Set Units per EM based on FontMatrix values.  We set the value to */
+    /* 1000 / temp_scale, because temp_scale was already multiplied by   */
+    /* 1000 (in t1_tofixed, from psobjs.c).                              */
+
+    root->units_per_EM = (FT_UShort)( FT_DivFix( 1000 * 0x10000L,
+                                                 temp_scale ) >> 16 );
+
+    /* we need to scale the values by 1.0/temp_scale */
+    if ( temp_scale != 0x10000L )
+    {
+      temp[0] = FT_DivFix( temp[0], temp_scale );
+      temp[1] = FT_DivFix( temp[1], temp_scale );
+      temp[2] = FT_DivFix( temp[2], temp_scale );
+      temp[4] = FT_DivFix( temp[4], temp_scale );
+      temp[5] = FT_DivFix( temp[5], temp_scale );
+      temp[3] = temp[3] < 0 ? -0x10000L : 0x10000L;
+    }
+
+    matrix->xx = temp[0];
+    matrix->yx = temp[1];
+    matrix->xy = temp[2];
+    matrix->yy = temp[3];
+
+    /* note that the offsets must be expressed in integer font units */
+    offset->x = temp[4] >> 16;
+    offset->y = temp[5] >> 16;
+  }
+
+
+  static void
+  parse_encoding( T1_Face    face,
+                  T1_Loader  loader )
+  {
+    T1_Parser  parser = &loader->parser;
+    FT_Byte*   cur;
+    FT_Byte*   limit  = parser->root.limit;
+
+    PSAux_Service  psaux = (PSAux_Service)face->psaux;
+
+
+    T1_Skip_Spaces( parser );
+    cur = parser->root.cursor;
+    if ( cur >= limit )
+    {
+      FT_ERROR(( "parse_encoding: out of bounds\n" ));
+      parser->root.error = T1_Err_Invalid_File_Format;
+      return;
+    }
+
+    /* if we have a number or `[', the encoding is an array, */
+    /* and we must load it now                               */
+    if ( ft_isdigit( *cur ) || *cur == '[' )
+    {
+      T1_Encoding  encode          = &face->type1.encoding;
+      FT_Int       count, n;
+      PS_Table     char_table      = &loader->encoding_table;
+      FT_Memory    memory          = parser->root.memory;
+      FT_Error     error;
+      FT_Bool      only_immediates = 0;
+
+
+      /* read the number of entries in the encoding; should be 256 */
+      if ( *cur == '[' )
+      {
+        count           = 256;
+        only_immediates = 1;
+        parser->root.cursor++;
+      }
+      else
+        count = (FT_Int)T1_ToInt( parser );
+
+      T1_Skip_Spaces( parser );
+      if ( parser->root.cursor >= limit )
+        return;
+
+      /* we use a T1_Table to store our charnames */
+      loader->num_chars = encode->num_chars = count;
+      if ( FT_NEW_ARRAY( encode->char_index, count )     ||
+           FT_NEW_ARRAY( encode->char_name,  count )     ||
+           FT_SET_ERROR( psaux->ps_table_funcs->init(
+                           char_table, count, memory ) ) )
+      {
+        parser->root.error = error;
+        return;
+      }
+
+      /* We need to `zero' out encoding_table.elements */
+      for ( n = 0; n < count; n++ )
+      {
+        char*  notdef = (char *)".notdef";
+
+
+        T1_Add_Table( char_table, n, notdef, 8 );
+      }
+
+      /* Now we need to read records of the form                */
+      /*                                                        */
+      /*   ... charcode /charname ...                           */
+      /*                                                        */
+      /* for each entry in our table.                           */
+      /*                                                        */
+      /* We simply look for a number followed by an immediate   */
+      /* name.  Note that this ignores correctly the sequence   */
+      /* that is often seen in type1 fonts:                     */
+      /*                                                        */
+      /*   0 1 255 { 1 index exch /.notdef put } for dup        */
+      /*                                                        */
+      /* used to clean the encoding array before anything else. */
+      /*                                                        */
+      /* Alternatively, if the array is directly given as       */
+      /*                                                        */
+      /*   /Encoding [ ... ]                                    */
+      /*                                                        */
+      /* we only read immediates.                               */
+
+      n = 0;
+      T1_Skip_Spaces( parser );
+
+      while ( parser->root.cursor < limit )
+      {
+        cur = parser->root.cursor;
+
+        /* we stop when we encounter a `def' or `]' */
+        if ( *cur == 'd' && cur + 3 < limit )
+        {
+          if ( cur[1] == 'e'         &&
+               cur[2] == 'f'         &&
+               IS_PS_DELIM( cur[3] ) )
+          {
+            FT_TRACE6(( "encoding end\n" ));
+            cur += 3;
+            break;
+          }
+        }
+        if ( *cur == ']' )
+        {
+          FT_TRACE6(( "encoding end\n" ));
+          cur++;
+          break;
+        }
+
+        /* check whether we've found an entry */
+        if ( ft_isdigit( *cur ) || only_immediates )
+        {
+          FT_Int  charcode;
+
+
+          if ( only_immediates )
+            charcode = n;
+          else
+          {
+            charcode = (FT_Int)T1_ToInt( parser );
+            T1_Skip_Spaces( parser );
+          }
+
+          cur = parser->root.cursor;
+
+          if ( *cur == '/' && cur + 2 < limit && n < count )
+          {
+            FT_PtrDist  len;
+
+
+            cur++;
+
+            parser->root.cursor = cur;
+            T1_Skip_PS_Token( parser );
+            if ( parser->root.error )
+              return;
+
+            len = parser->root.cursor - cur;
+
+            parser->root.error = T1_Add_Table( char_table, charcode,
+                                               cur, len + 1 );
+            if ( parser->root.error )
+              return;
+            char_table->elements[charcode][len] = '\0';
+
+            n++;
+          }
+          else if ( only_immediates )
+          {
+            /* Since the current position is not updated for           */
+            /* immediates-only mode we would get an infinite loop if   */
+            /* we don't do anything here.                              */
+            /*                                                         */
+            /* This encoding array is not valid according to the type1 */
+            /* specification (it might be an encoding for a CID type1  */
+            /* font, however), so we conclude that this font is NOT a  */
+            /* type1 font.                                             */
+            parser->root.error = FT_Err_Unknown_File_Format;
+            return;
+          }
+        }
+        else
+        {
+          T1_Skip_PS_Token( parser );
+          if ( parser->root.error )
+            return;
+        }
+
+        T1_Skip_Spaces( parser );
+      }
+
+      face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY;
+      parser->root.cursor       = cur;
+    }
+
+    /* Otherwise, we should have either `StandardEncoding', */
+    /* `ExpertEncoding', or `ISOLatin1Encoding'             */
+    else
+    {
+      if ( cur + 17 < limit                                            &&
+           ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 )
+        face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD;
+
+      else if ( cur + 15 < limit                                          &&
+                ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 )
+        face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT;
+
+      else if ( cur + 18 < limit                                             &&
+                ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 )
+        face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1;
+
+      else
+        parser->root.error = T1_Err_Ignore;
+    }
+  }
+
+
+  static void
+  parse_subrs( T1_Face    face,
+               T1_Loader  loader )
+  {
+    T1_Parser  parser = &loader->parser;
+    PS_Table   table  = &loader->subrs;
+    FT_Memory  memory = parser->root.memory;
+    FT_Error   error;
+    FT_Int     num_subrs;
+
+    PSAux_Service  psaux = (PSAux_Service)face->psaux;
+
+
+    T1_Skip_Spaces( parser );
+
+    /* test for empty array */
+    if ( parser->root.cursor < parser->root.limit &&
+         *parser->root.cursor == '['              )
+    {
+      T1_Skip_PS_Token( parser );
+      T1_Skip_Spaces  ( parser );
+      if ( parser->root.cursor >= parser->root.limit ||
+           *parser->root.cursor != ']'               )
+        parser->root.error = T1_Err_Invalid_File_Format;
+      return;
+    }
+
+    num_subrs = (FT_Int)T1_ToInt( parser );
+
+    /* position the parser right before the `dup' of the first subr */
+    T1_Skip_PS_Token( parser );         /* `array' */
+    if ( parser->root.error )
+      return;
+    T1_Skip_Spaces( parser );
+
+    /* initialize subrs array -- with synthetic fonts it is possible */
+    /* we get here twice                                             */
+    if ( !loader->num_subrs )
+    {
+      error = psaux->ps_table_funcs->init( table, num_subrs, memory );
+      if ( error )
+        goto Fail;
+    }
+
+    /* the format is simple:   */
+    /*                         */
+    /*   `index' + binary data */
+    /*                         */
+    for (;;)
+    {
+      FT_Long   idx, size;
+      FT_Byte*  base;
+
+
+      /* If the next token isn't `dup' we are done. */
+      if ( parser->root.cursor + 4 < parser->root.limit            &&
+           ft_strncmp( (char*)parser->root.cursor, "dup", 3 ) != 0 )
+        break;
+
+      T1_Skip_PS_Token( parser );       /* `dup' */
+
+      idx = T1_ToInt( parser );
+
+      if ( !read_binary_data( parser, &size, &base ) )
+        return;
+
+      /* The binary string is followed by one token, e.g. `NP' */
+      /* (bound to `noaccess put') or by two separate tokens:  */
+      /* `noaccess' & `put'.  We position the parser right     */
+      /* before the next `dup', if any.                        */
+      T1_Skip_PS_Token( parser );   /* `NP' or `|' or `noaccess' */
+      if ( parser->root.error )
+        return;
+      T1_Skip_Spaces  ( parser );
+
+      if ( parser->root.cursor + 4 < parser->root.limit            &&
+           ft_strncmp( (char*)parser->root.cursor, "put", 3 ) == 0 )
+      {
+        T1_Skip_PS_Token( parser ); /* skip `put' */
+        T1_Skip_Spaces  ( parser );
+      }
+
+      /* with synthetic fonts it is possible we get here twice */
+      if ( loader->num_subrs )
+        continue;
+
+      /* some fonts use a value of -1 for lenIV to indicate that */
+      /* the charstrings are unencoded                           */
+      /*                                                         */
+      /* thanks to Tom Kacvinsky for pointing this out           */
+      /*                                                         */
+      if ( face->type1.private_dict.lenIV >= 0 )
+      {
+        FT_Byte*  temp;
+
+
+        /* some fonts define empty subr records -- this is not totally */
+        /* compliant to the specification (which says they should at   */
+        /* least contain a `return'), but we support them anyway       */
+        if ( size < face->type1.private_dict.lenIV )
+        {
+          error = T1_Err_Invalid_File_Format;
+          goto Fail;
+        }
+
+        /* t1_decrypt() shouldn't write to base -- make temporary copy */
+        if ( FT_ALLOC( temp, size ) )
+          goto Fail;
+        FT_MEM_COPY( temp, base, size );
+        psaux->t1_decrypt( temp, size, 4330 );
+        size -= face->type1.private_dict.lenIV;
+        error = T1_Add_Table( table, (FT_Int)idx,
+                              temp + face->type1.private_dict.lenIV, size );
+        FT_FREE( temp );
+      }
+      else
+        error = T1_Add_Table( table, (FT_Int)idx, base, size );
+      if ( error )
+        goto Fail;
+    }
+
+    if ( !loader->num_subrs )
+      loader->num_subrs = num_subrs;
+
+    return;
+
+  Fail:
+    parser->root.error = error;
+  }
+
+
+#define TABLE_EXTEND  5
+
+
+  static void
+  parse_charstrings( T1_Face    face,
+                     T1_Loader  loader )
+  {
+    T1_Parser      parser       = &loader->parser;
+    PS_Table       code_table   = &loader->charstrings;
+    PS_Table       name_table   = &loader->glyph_names;
+    PS_Table       swap_table   = &loader->swap_table;
+    FT_Memory      memory       = parser->root.memory;
+    FT_Error       error;
+
+    PSAux_Service  psaux        = (PSAux_Service)face->psaux;
+
+    FT_Byte*       cur;
+    FT_Byte*       limit        = parser->root.limit;
+    FT_Int         n, num_glyphs;
+    FT_UInt        notdef_index = 0;
+    FT_Byte        notdef_found = 0;
+
+
+    num_glyphs = (FT_Int)T1_ToInt( parser );
+    /* some fonts like Optima-Oblique not only define the /CharStrings */
+    /* array but access it also                                        */
+    if ( num_glyphs == 0 || parser->root.error )
+      return;
+
+    /* initialize tables, leaving space for addition of .notdef, */
+    /* if necessary, and a few other glyphs to handle buggy      */
+    /* fonts which have more glyphs than specified.              */
+
+    /* for some non-standard fonts like `Optima' which provides  */
+    /* different outlines depending on the resolution it is      */
+    /* possible to get here twice                                */
+    if ( !loader->num_glyphs )
+    {
+      error = psaux->ps_table_funcs->init(
+                code_table, num_glyphs + 1 + TABLE_EXTEND, memory );
+      if ( error )
+        goto Fail;
+
+      error = psaux->ps_table_funcs->init(
+                name_table, num_glyphs + 1 + TABLE_EXTEND, memory );
+      if ( error )
+        goto Fail;
+
+      /* Initialize table for swapping index notdef_index and */
+      /* index 0 names and codes (if necessary).              */
+
+      error = psaux->ps_table_funcs->init( swap_table, 4, memory );
+      if ( error )
+        goto Fail;
+    }
+
+    n = 0;
+
+    for (;;)
+    {
+      FT_Long   size;
+      FT_Byte*  base;
+
+
+      /* the format is simple:        */
+      /*   `/glyphname' + binary data */
+
+      T1_Skip_Spaces( parser );
+
+      cur = parser->root.cursor;
+      if ( cur >= limit )
+        break;
+
+      /* we stop when we find a `def' or `end' keyword */
+      if ( cur + 3 < limit && IS_PS_DELIM( cur[3] ) )
+      {
+        if ( cur[0] == 'd' &&
+             cur[1] == 'e' &&
+             cur[2] == 'f' )
+        {
+          /* There are fonts which have this: */
+          /*                                  */
+          /*   /CharStrings 118 dict def      */
+          /*   Private begin                  */
+          /*   CharStrings begin              */
+          /*   ...                            */
+          /*                                  */
+          /* To catch this we ignore `def' if */
+          /* no charstring has actually been  */
+          /* seen.                            */
+          if ( n )
+            break;
+        }
+
+        if ( cur[0] == 'e' &&
+             cur[1] == 'n' &&
+             cur[2] == 'd' )
+          break;
+      }
+
+      T1_Skip_PS_Token( parser );
+      if ( parser->root.error )
+        return;
+
+      if ( *cur == '/' )
+      {
+        FT_PtrDist  len;
+
+
+        if ( cur + 1 >= limit )
+        {
+          error = T1_Err_Invalid_File_Format;
+          goto Fail;
+        }
+
+        cur++;                              /* skip `/' */
+        len = parser->root.cursor - cur;
+
+        if ( !read_binary_data( parser, &size, &base ) )
+          return;
+
+        /* for some non-standard fonts like `Optima' which provides */
+        /* different outlines depending on the resolution it is     */
+        /* possible to get here twice                               */
+        if ( loader->num_glyphs )
+          continue;
+
+        error = T1_Add_Table( name_table, n, cur, len + 1 );
+        if ( error )
+          goto Fail;
+
+        /* add a trailing zero to the name table */
+        name_table->elements[n][len] = '\0';
+
+        /* record index of /.notdef */
+        if ( *cur == '.'                                              &&
+             ft_strcmp( ".notdef",
+                        (const char*)(name_table->elements[n]) ) == 0 )
+        {
+          notdef_index = n;
+          notdef_found = 1;
+        }
+
+        if ( face->type1.private_dict.lenIV >= 0 &&
+             n < num_glyphs + TABLE_EXTEND       )
+        {
+          FT_Byte*  temp;
+
+
+          if ( size <= face->type1.private_dict.lenIV )
+          {
+            error = T1_Err_Invalid_File_Format;
+            goto Fail;
+          }
+
+          /* t1_decrypt() shouldn't write to base -- make temporary copy */
+          if ( FT_ALLOC( temp, size ) )
+            goto Fail;
+          FT_MEM_COPY( temp, base, size );
+          psaux->t1_decrypt( temp, size, 4330 );
+          size -= face->type1.private_dict.lenIV;
+          error = T1_Add_Table( code_table, n,
+                                temp + face->type1.private_dict.lenIV, size );
+          FT_FREE( temp );
+        }
+        else
+          error = T1_Add_Table( code_table, n, base, size );
+        if ( error )
+          goto Fail;
+
+        n++;
+      }
+    }
+
+    loader->num_glyphs = n;
+
+    /* if /.notdef is found but does not occupy index 0, do our magic. */
+    if ( notdef_found                                                 &&
+         ft_strcmp( ".notdef", (const char*)name_table->elements[0] ) )
+    {
+      /* Swap glyph in index 0 with /.notdef glyph.  First, add index 0  */
+      /* name and code entries to swap_table.  Then place notdef_index   */
+      /* name and code entries into swap_table.  Then swap name and code */
+      /* entries at indices notdef_index and 0 using values stored in    */
+      /* swap_table.                                                     */
+
+      /* Index 0 name */
+      error = T1_Add_Table( swap_table, 0,
+                            name_table->elements[0],
+                            name_table->lengths [0] );
+      if ( error )
+        goto Fail;
+
+      /* Index 0 code */
+      error = T1_Add_Table( swap_table, 1,
+                            code_table->elements[0],
+                            code_table->lengths [0] );
+      if ( error )
+        goto Fail;
+
+      /* Index notdef_index name */
+      error = T1_Add_Table( swap_table, 2,
+                            name_table->elements[notdef_index],
+                            name_table->lengths [notdef_index] );
+      if ( error )
+        goto Fail;
+
+      /* Index notdef_index code */
+      error = T1_Add_Table( swap_table, 3,
+                            code_table->elements[notdef_index],
+                            code_table->lengths [notdef_index] );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( name_table, notdef_index,
+                            swap_table->elements[0],
+                            swap_table->lengths [0] );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( code_table, notdef_index,
+                            swap_table->elements[1],
+                            swap_table->lengths [1] );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( name_table, 0,
+                            swap_table->elements[2],
+                            swap_table->lengths [2] );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( code_table, 0,
+                            swap_table->elements[3],
+                            swap_table->lengths [3] );
+      if ( error )
+        goto Fail;
+
+    }
+    else if ( !notdef_found )
+    {
+      /* notdef_index is already 0, or /.notdef is undefined in   */
+      /* charstrings dictionary.  Worry about /.notdef undefined. */
+      /* We take index 0 and add it to the end of the table(s)    */
+      /* and add our own /.notdef glyph to index 0.               */
+
+      /* 0 333 hsbw endchar */
+      FT_Byte  notdef_glyph[] = { 0x8B, 0xF7, 0xE1, 0x0D, 0x0E };
+      char*    notdef_name    = (char *)".notdef";
+
+
+      error = T1_Add_Table( swap_table, 0,
+                            name_table->elements[0],
+                            name_table->lengths [0] );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( swap_table, 1,
+                            code_table->elements[0],
+                            code_table->lengths [0] );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( name_table, 0, notdef_name, 8 );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( code_table, 0, notdef_glyph, 5 );
+
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( name_table, n,
+                            swap_table->elements[0],
+                            swap_table->lengths [0] );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( code_table, n,
+                            swap_table->elements[1],
+                            swap_table->lengths [1] );
+      if ( error )
+        goto Fail;
+
+      /* we added a glyph. */
+      loader->num_glyphs += 1;
+    }
+
+    return;
+
+  Fail:
+    parser->root.error = error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* Define the token field static variables.  This is a set of            */
+  /* T1_FieldRec variables.                                                */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static
+  const T1_FieldRec  t1_keywords[] =
+  {
+
+#include "t1tokens.h"
+
+    /* now add the special functions... */
+    T1_FIELD_CALLBACK( "FontMatrix",           t1_parse_font_matrix,
+                       T1_FIELD_DICT_FONTDICT )
+    T1_FIELD_CALLBACK( "Encoding",             parse_encoding,
+                       T1_FIELD_DICT_FONTDICT )
+    T1_FIELD_CALLBACK( "Subrs",                parse_subrs,
+                       T1_FIELD_DICT_PRIVATE )
+    T1_FIELD_CALLBACK( "CharStrings",          parse_charstrings,
+                       T1_FIELD_DICT_PRIVATE )
+    T1_FIELD_CALLBACK( "Private",              parse_private,
+                       T1_FIELD_DICT_FONTDICT )
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+    T1_FIELD_CALLBACK( "BlendDesignPositions", parse_blend_design_positions,
+                       T1_FIELD_DICT_FONTDICT )
+    T1_FIELD_CALLBACK( "BlendDesignMap",       parse_blend_design_map,
+                       T1_FIELD_DICT_FONTDICT )
+    T1_FIELD_CALLBACK( "BlendAxisTypes",       parse_blend_axis_types,
+                       T1_FIELD_DICT_FONTDICT )
+    T1_FIELD_CALLBACK( "WeightVector",         parse_weight_vector,
+                       T1_FIELD_DICT_FONTDICT )
+    T1_FIELD_CALLBACK( "BuildCharArray",       parse_buildchar,
+                       T1_FIELD_DICT_PRIVATE )
+#endif
+
+    { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }
+  };
+
+
+#define T1_FIELD_COUNT                                           \
+          ( sizeof ( t1_keywords ) / sizeof ( t1_keywords[0] ) )
+
+
+  static FT_Error
+  parse_dict( T1_Face    face,
+              T1_Loader  loader,
+              FT_Byte*   base,
+              FT_Long    size )
+  {
+    T1_Parser  parser = &loader->parser;
+    FT_Byte   *limit, *start_binary = NULL;
+    FT_Bool    have_integer = 0;
+
+
+    parser->root.cursor = base;
+    parser->root.limit  = base + size;
+    parser->root.error  = T1_Err_Ok;
+
+    limit = parser->root.limit;
+
+    T1_Skip_Spaces( parser );
+
+    while ( parser->root.cursor < limit )
+    {
+      FT_Byte*  cur;
+
+
+      cur = parser->root.cursor;
+
+      /* look for `eexec' */
+      if ( IS_PS_TOKEN( cur, limit, "eexec" ) )
+        break;
+
+      /* look for `closefile' which ends the eexec section */
+      else if ( IS_PS_TOKEN( cur, limit, "closefile" ) )
+        break;
+
+      /* in a synthetic font the base font starts after a           */
+      /* `FontDictionary' token that is placed after a Private dict */
+      else if ( IS_PS_TOKEN( cur, limit, "FontDirectory" ) )
+      {
+        if ( loader->keywords_encountered & T1_PRIVATE )
+          loader->keywords_encountered |=
+            T1_FONTDIR_AFTER_PRIVATE;
+        parser->root.cursor += 13;
+      }
+
+      /* check whether we have an integer */
+      else if ( ft_isdigit( *cur ) )
+      {
+        start_binary = cur;
+        T1_Skip_PS_Token( parser );
+        if ( parser->root.error )
+          goto Exit;
+        have_integer = 1;
+      }
+
+      /* in valid Type 1 fonts we don't see `RD' or `-|' directly */
+      /* since those tokens are handled by parse_subrs and        */
+      /* parse_charstrings                                        */
+      else if ( *cur == 'R' && cur + 6 < limit && *(cur + 1) == 'D' &&
+                have_integer )
+      {
+        FT_Long   s;
+        FT_Byte*  b;
+
+
+        parser->root.cursor = start_binary;
+        if ( !read_binary_data( parser, &s, &b ) )
+          return T1_Err_Invalid_File_Format;
+        have_integer = 0;
+      }
+
+      else if ( *cur == '-' && cur + 6 < limit && *(cur + 1) == '|' &&
+                have_integer )
+      {
+        FT_Long   s;
+        FT_Byte*  b;
+
+
+        parser->root.cursor = start_binary;
+        if ( !read_binary_data( parser, &s, &b ) )
+          return T1_Err_Invalid_File_Format;
+        have_integer = 0;
+      }
+
+      /* look for immediates */
+      else if ( *cur == '/' && cur + 2 < limit )
+      {
+        FT_PtrDist  len;
+
+
+        cur++;
+
+        parser->root.cursor = cur;
+        T1_Skip_PS_Token( parser );
+        if ( parser->root.error )
+          goto Exit;
+
+        len = parser->root.cursor - cur;
+
+        if ( len > 0 && len < 22 && parser->root.cursor < limit )
+        {
+          /* now compare the immediate name to the keyword table */
+          T1_Field  keyword = (T1_Field)t1_keywords;
+
+
+          for (;;)
+          {
+            FT_Byte*  name;
+
+
+            name = (FT_Byte*)keyword->ident;
+            if ( !name )
+              break;
+
+            if ( cur[0] == name[0]                                  &&
+                 len == (FT_PtrDist)ft_strlen( (const char *)name ) &&
+                 ft_memcmp( cur, name, len ) == 0                   )
+            {
+              /* We found it -- run the parsing callback!     */
+              /* We record every instance of every field      */
+              /* (until we reach the base font of a           */
+              /* synthetic font) to deal adequately with      */
+              /* multiple master fonts; this is also          */
+              /* necessary because later PostScript           */
+              /* definitions override earlier ones.           */
+
+              /* Once we encounter `FontDirectory' after      */
+              /* `/Private', we know that this is a synthetic */
+              /* font; except for `/CharStrings' we are not   */
+              /* interested in anything that follows this     */
+              /* `FontDirectory'.                             */
+
+              /* MM fonts have more than one /Private token at */
+              /* the top level; let's hope that all the junk   */
+              /* that follows the first /Private token is not  */
+              /* interesting to us.                            */
+
+              /* According to Adobe Tech Note #5175 (CID-Keyed */
+              /* Font Installation for ATM Software) a `begin' */
+              /* must be followed by exactly one `end', and    */
+              /* `begin' -- `end' pairs must be accurately     */
+              /* paired.  We could use this to distinguish     */
+              /* between the global Private and the Private    */
+              /* dict that is a member of the Blend dict.      */
+
+              const FT_UInt dict =
+                ( loader->keywords_encountered & T1_PRIVATE )
+                    ? T1_FIELD_DICT_PRIVATE
+                    : T1_FIELD_DICT_FONTDICT;
+
+              if ( !( dict & keyword->dict ) )
+              {
+                FT_TRACE1(( "parse_dict: found %s but ignoring it "
+                            "since it is in the wrong dictionary\n",
+                            keyword->ident ));
+                break;
+              }
+
+              if ( !( loader->keywords_encountered &
+                      T1_FONTDIR_AFTER_PRIVATE     )                  ||
+                   ft_strcmp( (const char*)name, "CharStrings" ) == 0 )
+              {
+                parser->root.error = t1_load_keyword( face,
+                                                      loader,
+                                                      keyword );
+                if ( parser->root.error != T1_Err_Ok )
+                {
+                  if ( FT_ERROR_BASE( parser->root.error ) == FT_Err_Ignore )
+                    parser->root.error = T1_Err_Ok;
+                  else
+                    return parser->root.error;
+                }
+              }
+              break;
+            }
+
+            keyword++;
+          }
+        }
+
+        have_integer = 0;
+      }
+      else
+      {
+        T1_Skip_PS_Token( parser );
+        if ( parser->root.error )
+          goto Exit;
+        have_integer = 0;
+      }
+
+      T1_Skip_Spaces( parser );
+    }
+
+  Exit:
+    return parser->root.error;
+  }
+
+
+  static void
+  t1_init_loader( T1_Loader  loader,
+                  T1_Face    face )
+  {
+    FT_UNUSED( face );
+
+    FT_MEM_ZERO( loader, sizeof ( *loader ) );
+    loader->num_glyphs = 0;
+    loader->num_chars  = 0;
+
+    /* initialize the tables -- simply set their `init' field to 0 */
+    loader->encoding_table.init  = 0;
+    loader->charstrings.init     = 0;
+    loader->glyph_names.init     = 0;
+    loader->subrs.init           = 0;
+    loader->swap_table.init      = 0;
+    loader->fontdata             = 0;
+    loader->keywords_encountered = 0;
+  }
+
+
+  static void
+  t1_done_loader( T1_Loader  loader )
+  {
+    T1_Parser  parser = &loader->parser;
+
+
+    /* finalize tables */
+    T1_Release_Table( &loader->encoding_table );
+    T1_Release_Table( &loader->charstrings );
+    T1_Release_Table( &loader->glyph_names );
+    T1_Release_Table( &loader->swap_table );
+    T1_Release_Table( &loader->subrs );
+
+    /* finalize parser */
+    T1_Finalize_Parser( parser );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Open_Face( T1_Face  face )
+  {
+    T1_LoaderRec   loader;
+    T1_Parser      parser;
+    T1_Font        type1 = &face->type1;
+    PS_Private     priv  = &type1->private_dict;
+    FT_Error       error;
+
+    PSAux_Service  psaux = (PSAux_Service)face->psaux;
+
+
+    t1_init_loader( &loader, face );
+
+    /* default values */
+    face->ndv_idx          = -1;
+    face->cdv_idx          = -1;
+    face->len_buildchar    = 0;
+
+    priv->blue_shift       = 7;
+    priv->blue_fuzz        = 1;
+    priv->lenIV            = 4;
+    priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L );
+    priv->blue_scale       = (FT_Fixed)( 0.039625 * 0x10000L * 1000 );
+
+    parser = &loader.parser;
+    error  = T1_New_Parser( parser,
+                            face->root.stream,
+                            face->root.memory,
+                            psaux );
+    if ( error )
+      goto Exit;
+
+    error = parse_dict( face, &loader,
+                        parser->base_dict, parser->base_len );
+    if ( error )
+      goto Exit;
+
+    error = T1_Get_Private_Dict( parser, psaux );
+    if ( error )
+      goto Exit;
+
+    error = parse_dict( face, &loader,
+                        parser->private_dict, parser->private_len );
+    if ( error )
+      goto Exit;
+
+    /* ensure even-ness of `num_blue_values' */
+    priv->num_blue_values &= ~1;
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+    if ( face->blend                                                     &&
+         face->blend->num_default_design_vector != 0                     &&
+         face->blend->num_default_design_vector != face->blend->num_axis )
+    {
+      /* we don't use it currently so just warn, reset, and ignore */
+      FT_ERROR(( "T1_Open_Face(): /DesignVector contains %u entries "
+                 "while there are %u axes.\n",
+                 face->blend->num_default_design_vector,
+                 face->blend->num_axis ));
+
+      face->blend->num_default_design_vector = 0;
+    }
+
+    /* the following can happen for MM instances; we then treat the */
+    /* font as a normal PS font                                     */
+    if ( face->blend                                             &&
+         ( !face->blend->num_designs || !face->blend->num_axis ) )
+      T1_Done_Blend( face );
+
+    /* another safety check */
+    if ( face->blend )
+    {
+      FT_UInt  i;
+
+
+      for ( i = 0; i < face->blend->num_axis; i++ )
+        if ( !face->blend->design_map[i].num_points )
+        {
+          T1_Done_Blend( face );
+          break;
+        }
+    }
+
+    if ( face->blend )
+    {
+      if ( face->len_buildchar > 0 )
+      {
+        FT_Memory  memory = face->root.memory;
+
+
+        if ( FT_NEW_ARRAY( face->buildchar, face->len_buildchar ) )
+        {
+          FT_ERROR(( "T1_Open_Face: cannot allocate BuildCharArray\n" ));
+          face->len_buildchar = 0;
+          goto Exit;
+        }
+      }
+    }
+    else
+      face->len_buildchar = 0;
+
+#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */
+
+    /* now, propagate the subrs, charstrings, and glyphnames tables */
+    /* to the Type1 data                                            */
+    type1->num_glyphs = loader.num_glyphs;
+
+    if ( loader.subrs.init )
+    {
+      loader.subrs.init  = 0;
+      type1->num_subrs   = loader.num_subrs;
+      type1->subrs_block = loader.subrs.block;
+      type1->subrs       = loader.subrs.elements;
+      type1->subrs_len   = loader.subrs.lengths;
+    }
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    if ( !face->root.internal->incremental_interface )
+#endif
+      if ( !loader.charstrings.init )
+      {
+        FT_ERROR(( "T1_Open_Face: no `/CharStrings' array in face\n" ));
+        error = T1_Err_Invalid_File_Format;
+      }
+
+    loader.charstrings.init  = 0;
+    type1->charstrings_block = loader.charstrings.block;
+    type1->charstrings       = loader.charstrings.elements;
+    type1->charstrings_len   = loader.charstrings.lengths;
+
+    /* we copy the glyph names `block' and `elements' fields; */
+    /* the `lengths' field must be released later             */
+    type1->glyph_names_block    = loader.glyph_names.block;
+    type1->glyph_names          = (FT_String**)loader.glyph_names.elements;
+    loader.glyph_names.block    = 0;
+    loader.glyph_names.elements = 0;
+
+    /* we must now build type1.encoding when we have a custom array */
+    if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY )
+    {
+      FT_Int    charcode, idx, min_char, max_char;
+      FT_Byte*  char_name;
+      FT_Byte*  glyph_name;
+
+
+      /* OK, we do the following: for each element in the encoding  */
+      /* table, look up the index of the glyph having the same name */
+      /* the index is then stored in type1.encoding.char_index, and */
+      /* the name to type1.encoding.char_name                       */
+
+      min_char = 0;
+      max_char = 0;
+
+      charcode = 0;
+      for ( ; charcode < loader.encoding_table.max_elems; charcode++ )
+      {
+        type1->encoding.char_index[charcode] = 0;
+        type1->encoding.char_name [charcode] = (char *)".notdef";
+
+        char_name = loader.encoding_table.elements[charcode];
+        if ( char_name )
+          for ( idx = 0; idx < type1->num_glyphs; idx++ )
+          {
+            glyph_name = (FT_Byte*)type1->glyph_names[idx];
+            if ( ft_strcmp( (const char*)char_name,
+                            (const char*)glyph_name ) == 0 )
+            {
+              type1->encoding.char_index[charcode] = (FT_UShort)idx;
+              type1->encoding.char_name [charcode] = (char*)glyph_name;
+
+              /* Change min/max encoded char only if glyph name is */
+              /* not /.notdef                                      */
+              if ( ft_strcmp( (const char*)".notdef",
+                              (const char*)glyph_name ) != 0 )
+              {
+                if ( charcode < min_char )
+                  min_char = charcode;
+                if ( charcode >= max_char )
+                  max_char = charcode + 1;
+              }
+              break;
+            }
+          }
+      }
+
+      type1->encoding.code_first = min_char;
+      type1->encoding.code_last  = max_char;
+      type1->encoding.num_chars  = loader.num_chars;
+    }
+
+  Exit:
+    t1_done_loader( &loader );
+    return error;
+  }
+
+
+/* END */
diff --git a/src/type1/t1load.h b/src/type1/t1load.h
new file mode 100644 (file)
index 0000000..546fc33
--- /dev/null
@@ -0,0 +1,102 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1load.h                                                               */
+/*                                                                         */
+/*    Type 1 font loader (specification).                                  */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2004, 2006, 2007 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1LOAD_H__
+#define __T1LOAD_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+#include FT_MULTIPLE_MASTERS_H
+
+#include "t1parse.h"
+
+
+FT_BEGIN_HEADER
+
+
+  typedef struct  T1_Loader_
+  {
+    T1_ParserRec  parser;          /* parser used to read the stream */
+
+    FT_Int        num_chars;       /* number of characters in encoding */
+    PS_TableRec   encoding_table;  /* PS_Table used to store the       */
+                                   /* encoding character names         */
+
+    FT_Int        num_glyphs;
+    PS_TableRec   glyph_names;
+    PS_TableRec   charstrings;
+    PS_TableRec   swap_table;      /* For moving .notdef glyph to index 0. */
+
+    FT_Int        num_subrs;
+    PS_TableRec   subrs;
+    FT_Bool       fontdata;
+
+    FT_UInt       keywords_encountered; /* T1_LOADER_ENCOUNTERED_XXX */
+
+  } T1_LoaderRec, *T1_Loader;
+
+
+  /* treatment of some keywords differs depending on whether */
+  /* they precede or follow certain other keywords           */
+
+#define T1_PRIVATE                ( 1 << 0 )
+#define T1_FONTDIR_AFTER_PRIVATE  ( 1 << 1 )
+
+
+  FT_LOCAL( FT_Error )
+  T1_Open_Face( T1_Face  face );
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+  FT_LOCAL( FT_Error )
+  T1_Get_Multi_Master( T1_Face           face,
+                       FT_Multi_Master*  master );
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Get_MM_Var( T1_Face      face,
+                 FT_MM_Var*  *master );
+
+  FT_LOCAL( FT_Error )
+  T1_Set_MM_Blend( T1_Face    face,
+                   FT_UInt    num_coords,
+                   FT_Fixed*  coords );
+
+  FT_LOCAL( FT_Error )
+  T1_Set_MM_Design( T1_Face   face,
+                    FT_UInt   num_coords,
+                    FT_Long*  coords );
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Set_Var_Design( T1_Face    face,
+                     FT_UInt    num_coords,
+                     FT_Fixed*  coords );
+
+  FT_LOCAL( void )
+  T1_Done_Blend( T1_Face  face );
+
+#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */
+
+
+FT_END_HEADER
+
+#endif /* __T1LOAD_H__ */
+
+
+/* END */
diff --git a/src/type1/t1objs.c b/src/type1/t1objs.c
new file mode 100644 (file)
index 0000000..b685f2f
--- /dev/null
@@ -0,0 +1,615 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1objs.c                                                               */
+/*                                                                         */
+/*    Type 1 objects manager (body).                                       */
+/*                                                                         */
+/*  Copyright 1996-2009, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_CALC_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_TRUETYPE_IDS_H
+
+#include "t1gload.h"
+#include "t1load.h"
+
+#include "t1errors.h"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "t1afm.h"
+#endif
+
+#include FT_SERVICE_POSTSCRIPT_CMAPS_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_t1objs
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                            SIZE FUNCTIONS                             */
+  /*                                                                       */
+  /*  note that we store the global hints in the size's "internal" root    */
+  /*  field                                                                */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  static PSH_Globals_Funcs
+  T1_Size_Get_Globals_Funcs( T1_Size  size )
+  {
+    T1_Face           face     = (T1_Face)size->root.face;
+    PSHinter_Service  pshinter = (PSHinter_Service)face->pshinter;
+    FT_Module         module;
+
+
+    module = FT_Get_Module( size->root.face->driver->root.library,
+                            "pshinter" );
+    return ( module && pshinter && pshinter->get_globals_funcs )
+           ? pshinter->get_globals_funcs( module )
+           : 0 ;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  T1_Size_Done( FT_Size  t1size )          /* T1_Size */
+  {
+    T1_Size  size = (T1_Size)t1size;
+
+
+    if ( size->root.internal )
+    {
+      PSH_Globals_Funcs  funcs;
+
+
+      funcs = T1_Size_Get_Globals_Funcs( size );
+      if ( funcs )
+        funcs->destroy( (PSH_Globals)size->root.internal );
+
+      size->root.internal = 0;
+    }
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Size_Init( FT_Size  t1size )      /* T1_Size */
+  {
+    T1_Size            size  = (T1_Size)t1size;
+    FT_Error           error = T1_Err_Ok;
+    PSH_Globals_Funcs  funcs = T1_Size_Get_Globals_Funcs( size );
+
+
+    if ( funcs )
+    {
+      PSH_Globals  globals;
+      T1_Face      face = (T1_Face)size->root.face;
+
+
+      error = funcs->create( size->root.face->memory,
+                             &face->type1.private_dict, &globals );
+      if ( !error )
+        size->root.internal = (FT_Size_Internal)(void*)globals;
+    }
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Size_Request( FT_Size          t1size,     /* T1_Size */
+                   FT_Size_Request  req )
+  {
+    T1_Size            size  = (T1_Size)t1size;
+    PSH_Globals_Funcs  funcs = T1_Size_Get_Globals_Funcs( size );
+
+
+    FT_Request_Metrics( size->root.face, req );
+
+    if ( funcs )
+      funcs->set_scale( (PSH_Globals)size->root.internal,
+                        size->root.metrics.x_scale,
+                        size->root.metrics.y_scale,
+                        0, 0 );
+
+    return T1_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                            SLOT  FUNCTIONS                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+  FT_LOCAL_DEF( void )
+  T1_GlyphSlot_Done( FT_GlyphSlot  slot )
+  {
+    slot->internal->glyph_hints = 0;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_GlyphSlot_Init( FT_GlyphSlot  slot )
+  {
+    T1_Face           face;
+    PSHinter_Service  pshinter;
+
+
+    face     = (T1_Face)slot->face;
+    pshinter = (PSHinter_Service)face->pshinter;
+
+    if ( pshinter )
+    {
+      FT_Module  module;
+
+
+      module = FT_Get_Module( slot->face->driver->root.library,
+                              "pshinter" );
+      if ( module )
+      {
+        T1_Hints_Funcs  funcs;
+
+
+        funcs = pshinter->get_t1_funcs( module );
+        slot->internal->glyph_hints = (void*)funcs;
+      }
+    }
+
+    return 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                            FACE  FUNCTIONS                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    T1_Face_Done                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The face object destructor.                                        */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face :: A typeless pointer to the face object to destroy.          */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  T1_Face_Done( FT_Face  t1face )         /* T1_Face */
+  {
+    T1_Face    face = (T1_Face)t1face;
+    FT_Memory  memory;
+    T1_Font    type1;
+
+
+    if ( !face )
+      return;
+
+    memory = face->root.memory;
+    type1  = &face->type1;
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+    /* release multiple masters information */
+    FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );
+
+    if ( face->buildchar )
+    {
+      FT_FREE( face->buildchar );
+
+      face->buildchar     = NULL;
+      face->len_buildchar = 0;
+    }
+
+    T1_Done_Blend( face );
+    face->blend = 0;
+#endif
+
+    /* release font info strings */
+    {
+      PS_FontInfo  info = &type1->font_info;
+
+
+      FT_FREE( info->version );
+      FT_FREE( info->notice );
+      FT_FREE( info->full_name );
+      FT_FREE( info->family_name );
+      FT_FREE( info->weight );
+    }
+
+    /* release top dictionary */
+    FT_FREE( type1->charstrings_len );
+    FT_FREE( type1->charstrings );
+    FT_FREE( type1->glyph_names );
+
+    FT_FREE( type1->subrs );
+    FT_FREE( type1->subrs_len );
+
+    FT_FREE( type1->subrs_block );
+    FT_FREE( type1->charstrings_block );
+    FT_FREE( type1->glyph_names_block );
+
+    FT_FREE( type1->encoding.char_index );
+    FT_FREE( type1->encoding.char_name );
+    FT_FREE( type1->font_name );
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+    /* release afm data if present */
+    if ( face->afm_data )
+      T1_Done_Metrics( memory, (AFM_FontInfo)face->afm_data );
+#endif
+
+    /* release unicode map, if any */
+#if 0
+    FT_FREE( face->unicode_map_rec.maps );
+    face->unicode_map_rec.num_maps = 0;
+    face->unicode_map              = NULL;
+#endif
+
+    face->root.family_name = NULL;
+    face->root.style_name  = NULL;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    T1_Face_Init                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    The face object constructor.                                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    stream     ::  input stream where to load font data.               */
+  /*                                                                       */
+  /*    face_index :: The index of the font face in the resource.          */
+  /*                                                                       */
+  /*    num_params :: Number of additional generic parameters.  Ignored.   */
+  /*                                                                       */
+  /*    params     :: Additional generic parameters.  Ignored.             */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    face       :: The face record to build.                            */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  T1_Face_Init( FT_Stream      stream,
+                FT_Face        t1face,          /* T1_Face */
+                FT_Int         face_index,
+                FT_Int         num_params,
+                FT_Parameter*  params )
+  {
+    T1_Face             face = (T1_Face)t1face;
+    FT_Error            error;
+    FT_Service_PsCMaps  psnames;
+    PSAux_Service       psaux;
+    T1_Font             type1 = &face->type1;
+    PS_FontInfo         info = &type1->font_info;
+
+    FT_UNUSED( num_params );
+    FT_UNUSED( params );
+    FT_UNUSED( stream );
+
+
+    face->root.num_faces = 1;
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
+    face->psnames = psnames;
+
+    face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
+                                           "psaux" );
+    psaux = (PSAux_Service)face->psaux;
+    if ( !psaux )
+    {
+      FT_ERROR(( "T1_Face_Init: cannot access `psaux' module\n" ));
+      error = T1_Err_Missing_Module;
+      goto Exit;
+    }
+
+    face->pshinter = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
+                                              "pshinter" );
+
+    FT_TRACE2(( "Type 1 driver\n" ));
+
+    /* open the tokenizer; this will also check the font format */
+    error = T1_Open_Face( face );
+    if ( error )
+      goto Exit;
+
+    /* if we just wanted to check the format, leave successfully now */
+    if ( face_index < 0 )
+      goto Exit;
+
+    /* check the face index */
+    if ( face_index > 0 )
+    {
+      FT_ERROR(( "T1_Face_Init: invalid face index\n" ));
+      error = T1_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    /* now load the font program into the face object */
+
+    /* initialize the face object fields */
+
+    /* set up root face fields */
+    {
+      FT_Face  root = (FT_Face)&face->root;
+
+
+      root->num_glyphs = type1->num_glyphs;
+      root->face_index = 0;
+
+      root->face_flags = FT_FACE_FLAG_SCALABLE    |
+                         FT_FACE_FLAG_HORIZONTAL  |
+                         FT_FACE_FLAG_GLYPH_NAMES |
+                         FT_FACE_FLAG_HINTER;
+
+      if ( info->is_fixed_pitch )
+        root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+      if ( face->blend )
+        root->face_flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
+
+      /* XXX: TODO -- add kerning with .afm support */
+
+
+      /* The following code to extract the family and the style is very   */
+      /* simplistic and might get some things wrong.  For a full-featured */
+      /* algorithm you might have a look at the whitepaper given at       */
+      /*                                                                  */
+      /*   http://blogs.msdn.com/text/archive/2007/04/23/wpf-font-selection-model.aspx */
+
+      /* get style name -- be careful, some broken fonts only */
+      /* have a `/FontName' dictionary entry!                 */
+      root->family_name = info->family_name;
+      root->style_name  = NULL;
+
+      if ( root->family_name )
+      {
+        char*  full   = info->full_name;
+        char*  family = root->family_name;
+
+
+        if ( full )
+        {
+          FT_Bool  the_same = TRUE;
+
+
+          while ( *full )
+          {
+            if ( *full == *family )
+            {
+              family++;
+              full++;
+            }
+            else
+            {
+              if ( *full == ' ' || *full == '-' )
+                full++;
+              else if ( *family == ' ' || *family == '-' )
+                family++;
+              else
+              {
+                the_same = FALSE;
+
+                if ( !*family )
+                  root->style_name = full;
+                break;
+              }
+            }
+          }
+
+          if ( the_same )
+            root->style_name = (char *)"Regular";
+        }
+      }
+      else
+      {
+        /* do we have a `/FontName'? */
+        if ( type1->font_name )
+          root->family_name = type1->font_name;
+      }
+
+      if ( !root->style_name )
+      {
+        if ( info->weight )
+          root->style_name = info->weight;
+        else
+          /* assume `Regular' style because we don't know better */
+          root->style_name = (char *)"Regular";
+      }
+
+      /* compute style flags */
+      root->style_flags = 0;
+      if ( info->italic_angle )
+        root->style_flags |= FT_STYLE_FLAG_ITALIC;
+      if ( info->weight )
+      {
+        if ( !ft_strcmp( info->weight, "Bold"  ) ||
+             !ft_strcmp( info->weight, "Black" ) )
+          root->style_flags |= FT_STYLE_FLAG_BOLD;
+      }
+
+      /* no embedded bitmap support */
+      root->num_fixed_sizes = 0;
+      root->available_sizes = 0;
+
+      root->bbox.xMin =   type1->font_bbox.xMin            >> 16;
+      root->bbox.yMin =   type1->font_bbox.yMin            >> 16;
+      /* no `U' suffix here to 0xFFFF! */
+      root->bbox.xMax = ( type1->font_bbox.xMax + 0xFFFF ) >> 16;
+      root->bbox.yMax = ( type1->font_bbox.yMax + 0xFFFF ) >> 16;
+
+      /* Set units_per_EM if we didn't set it in t1_parse_font_matrix. */
+      if ( !root->units_per_EM )
+        root->units_per_EM = 1000;
+
+      root->ascender  = (FT_Short)( root->bbox.yMax );
+      root->descender = (FT_Short)( root->bbox.yMin );
+
+      root->height = (FT_Short)( ( root->units_per_EM * 12 ) / 10 );
+      if ( root->height < root->ascender - root->descender )
+        root->height = (FT_Short)( root->ascender - root->descender );
+
+      /* now compute the maximum advance width */
+      root->max_advance_width =
+        (FT_Short)( root->bbox.xMax );
+      {
+        FT_Pos  max_advance;
+
+
+        error = T1_Compute_Max_Advance( face, &max_advance );
+
+        /* in case of error, keep the standard width */
+        if ( !error )
+          root->max_advance_width = (FT_Short)FIXED_TO_INT( max_advance );
+        else
+          error = T1_Err_Ok;   /* clear error */
+      }
+
+      root->max_advance_height = root->height;
+
+      root->underline_position  = (FT_Short)info->underline_position;
+      root->underline_thickness = (FT_Short)info->underline_thickness;
+    }
+
+    {
+      FT_Face  root = &face->root;
+
+
+      if ( psnames )
+      {
+        FT_CharMapRec    charmap;
+        T1_CMap_Classes  cmap_classes = psaux->t1_cmap_classes;
+        FT_CMap_Class    clazz;
+
+
+        charmap.face = root;
+
+        /* first of all, try to synthesize a Unicode charmap */
+        charmap.platform_id = TT_PLATFORM_MICROSOFT;
+        charmap.encoding_id = TT_MS_ID_UNICODE_CS;
+        charmap.encoding    = FT_ENCODING_UNICODE;
+
+        error = FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL );
+        if ( error && FT_Err_No_Unicode_Glyph_Name != error )
+          goto Exit;
+        error = FT_Err_Ok;
+
+        /* now, generate an Adobe Standard encoding when appropriate */
+        charmap.platform_id = TT_PLATFORM_ADOBE;
+        clazz               = NULL;
+
+        switch ( type1->encoding_type )
+        {
+        case T1_ENCODING_TYPE_STANDARD:
+          charmap.encoding    = FT_ENCODING_ADOBE_STANDARD;
+          charmap.encoding_id = TT_ADOBE_ID_STANDARD;
+          clazz               = cmap_classes->standard;
+          break;
+
+        case T1_ENCODING_TYPE_EXPERT:
+          charmap.encoding    = FT_ENCODING_ADOBE_EXPERT;
+          charmap.encoding_id = TT_ADOBE_ID_EXPERT;
+          clazz               = cmap_classes->expert;
+          break;
+
+        case T1_ENCODING_TYPE_ARRAY:
+          charmap.encoding    = FT_ENCODING_ADOBE_CUSTOM;
+          charmap.encoding_id = TT_ADOBE_ID_CUSTOM;
+          clazz               = cmap_classes->custom;
+          break;
+
+        case T1_ENCODING_TYPE_ISOLATIN1:
+          charmap.encoding    = FT_ENCODING_ADOBE_LATIN_1;
+          charmap.encoding_id = TT_ADOBE_ID_LATIN_1;
+          clazz               = cmap_classes->unicode;
+          break;
+
+        default:
+          ;
+        }
+
+        if ( clazz )
+          error = FT_CMap_New( clazz, NULL, &charmap, NULL );
+
+#if 0
+        /* Select default charmap */
+        if (root->num_charmaps)
+          root->charmap = root->charmaps[0];
+#endif
+      }
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    T1_Driver_Init                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a given Type 1 driver object.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    driver :: A handle to the target driver object.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  T1_Driver_Init( FT_Module  driver )
+  {
+    FT_UNUSED( driver );
+
+    return T1_Err_Ok;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    T1_Driver_Done                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Finalizes a given Type 1 driver.                                   */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    driver :: A handle to the target Type 1 driver.                    */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  T1_Driver_Done( FT_Module  driver )
+  {
+    FT_UNUSED( driver );
+  }
+
+
+/* END */
diff --git a/src/type1/t1objs.h b/src/type1/t1objs.h
new file mode 100644 (file)
index 0000000..54ccbb9
--- /dev/null
@@ -0,0 +1,160 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1objs.h                                                               */
+/*                                                                         */
+/*    Type 1 objects manager (specification).                              */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2006, 2011 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1OBJS_H__
+#define __T1OBJS_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_CONFIG_CONFIG_H
+#include FT_INTERNAL_TYPE1_TYPES_H
+
+
+FT_BEGIN_HEADER
+
+
+  /* The following structures must be defined by the hinter */
+  typedef struct T1_Size_Hints_   T1_Size_Hints;
+  typedef struct T1_Glyph_Hints_  T1_Glyph_Hints;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    T1_Size                                                            */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a Type 1 size object.                                  */
+  /*                                                                       */
+  typedef struct T1_SizeRec_*  T1_Size;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    T1_GlyphSlot                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a Type 1 glyph slot object.                            */
+  /*                                                                       */
+  typedef struct T1_GlyphSlotRec_*  T1_GlyphSlot;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    T1_CharMap                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A handle to a Type 1 character mapping object.                     */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The Type 1 format doesn't use a charmap but an encoding table.     */
+  /*    The driver is responsible for making up charmap objects            */
+  /*    corresponding to these tables.                                     */
+  /*                                                                       */
+  typedef struct T1_CharMapRec_*   T1_CharMap;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /*                  HERE BEGINS THE TYPE1 SPECIFIC STUFF                 */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    T1_SizeRec                                                         */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Type 1 size record.                                                */
+  /*                                                                       */
+  typedef struct  T1_SizeRec_
+  {
+    FT_SizeRec  root;
+
+  } T1_SizeRec;
+
+
+  FT_LOCAL( void )
+  T1_Size_Done( FT_Size  size );
+
+  FT_LOCAL( FT_Error )
+  T1_Size_Request( FT_Size          size,
+                   FT_Size_Request  req );
+
+  FT_LOCAL( FT_Error )
+  T1_Size_Init( FT_Size  size );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Type>                                                                */
+  /*    T1_GlyphSlotRec                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Type 1 glyph slot record.                                          */
+  /*                                                                       */
+  typedef struct  T1_GlyphSlotRec_
+  {
+    FT_GlyphSlotRec  root;
+
+    FT_Bool          hint;
+    FT_Bool          scaled;
+
+    FT_Int           max_points;
+    FT_Int           max_contours;
+
+    FT_Fixed         x_scale;
+    FT_Fixed         y_scale;
+
+  } T1_GlyphSlotRec;
+
+
+  FT_LOCAL( FT_Error )
+  T1_Face_Init( FT_Stream      stream,
+                FT_Face        face,
+                FT_Int         face_index,
+                FT_Int         num_params,
+                FT_Parameter*  params );
+
+  FT_LOCAL( void )
+  T1_Face_Done( FT_Face  face );
+
+  FT_LOCAL( FT_Error )
+  T1_GlyphSlot_Init( FT_GlyphSlot  slot );
+
+  FT_LOCAL( void )
+  T1_GlyphSlot_Done( FT_GlyphSlot  slot );
+
+  FT_LOCAL( FT_Error )
+  T1_Driver_Init( FT_Module  driver );
+
+  FT_LOCAL( void )
+  T1_Driver_Done( FT_Module  driver );
+
+
+FT_END_HEADER
+
+#endif /* __T1OBJS_H__ */
+
+
+/* END */
diff --git a/src/type1/t1parse.c b/src/type1/t1parse.c
new file mode 100644 (file)
index 0000000..4955279
--- /dev/null
@@ -0,0 +1,494 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1parse.c                                                              */
+/*                                                                         */
+/*    Type 1 parser (body).                                                */
+/*                                                                         */
+/*  Copyright 1996-2005, 2008, 2009, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The Type 1 parser is in charge of the following:                      */
+  /*                                                                       */
+  /*  - provide an implementation of a growing sequence of objects called  */
+  /*    a `T1_Table' (used to build various tables needed by the loader).  */
+  /*                                                                       */
+  /*  - opening .pfb and .pfa files to extract their top-level and private */
+  /*    dictionaries.                                                      */
+  /*                                                                       */
+  /*  - read numbers, arrays & strings from any dictionary.                */
+  /*                                                                       */
+  /* See `t1load.c' to see how data is loaded from the font file.          */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+
+#include "t1parse.h"
+
+#include "t1errors.h"
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_t1parse
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                   INPUT STREAM PARSER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /* see Adobe Technical Note 5040.Download_Fonts.pdf */
+
+  static FT_Error
+  read_pfb_tag( FT_Stream   stream,
+                FT_UShort  *atag,
+                FT_ULong   *asize )
+  {
+    FT_Error   error;
+    FT_UShort  tag;
+    FT_ULong   size;
+
+
+    *atag  = 0;
+    *asize = 0;
+
+    if ( !FT_READ_USHORT( tag ) )
+    {
+      if ( tag == 0x8001U || tag == 0x8002U )
+      {
+        if ( !FT_READ_ULONG_LE( size ) )
+          *asize = size;
+      }
+
+      *atag = tag;
+    }
+
+    return error;
+  }
+
+
+  static FT_Error
+  check_type1_format( FT_Stream    stream,
+                      const char*  header_string,
+                      size_t       header_length )
+  {
+    FT_Error   error;
+    FT_UShort  tag;
+    FT_ULong   dummy;
+
+
+    if ( FT_STREAM_SEEK( 0 ) )
+      goto Exit;
+
+    error = read_pfb_tag( stream, &tag, &dummy );
+    if ( error )
+      goto Exit;
+
+    /* We assume that the first segment in a PFB is always encoded as   */
+    /* text.  This might be wrong (and the specification doesn't insist */
+    /* on that), but we have never seen a counterexample.               */
+    if ( tag != 0x8001U && FT_STREAM_SEEK( 0 ) )
+      goto Exit;
+
+    if ( !FT_FRAME_ENTER( header_length ) )
+    {
+      error = T1_Err_Ok;
+
+      if ( ft_memcmp( stream->cursor, header_string, header_length ) != 0 )
+        error = T1_Err_Unknown_File_Format;
+
+      FT_FRAME_EXIT();
+    }
+
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_New_Parser( T1_Parser      parser,
+                 FT_Stream      stream,
+                 FT_Memory      memory,
+                 PSAux_Service  psaux )
+  {
+    FT_Error   error;
+    FT_UShort  tag;
+    FT_ULong   size;
+
+
+    psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory );
+
+    parser->stream       = stream;
+    parser->base_len     = 0;
+    parser->base_dict    = 0;
+    parser->private_len  = 0;
+    parser->private_dict = 0;
+    parser->in_pfb       = 0;
+    parser->in_memory    = 0;
+    parser->single_block = 0;
+
+    /* check the header format */
+    error = check_type1_format( stream, "%!PS-AdobeFont", 14 );
+    if ( error )
+    {
+      if ( error != T1_Err_Unknown_File_Format )
+        goto Exit;
+
+      error = check_type1_format( stream, "%!FontType", 10 );
+      if ( error )
+      {
+        FT_TRACE2(( "  not a Type 1 font\n" ));
+        goto Exit;
+      }
+    }
+
+    /******************************************************************/
+    /*                                                                */
+    /* Here a short summary of what is going on:                      */
+    /*                                                                */
+    /*   When creating a new Type 1 parser, we try to locate and load */
+    /*   the base dictionary if this is possible (i.e., for PFB       */
+    /*   files).  Otherwise, we load the whole font into memory.      */
+    /*                                                                */
+    /*   When `loading' the base dictionary, we only setup pointers   */
+    /*   in the case of a memory-based stream.  Otherwise, we         */
+    /*   allocate and load the base dictionary in it.                 */
+    /*                                                                */
+    /*   parser->in_pfb is set if we are in a binary (`.pfb') font.   */
+    /*   parser->in_memory is set if we have a memory stream.         */
+    /*                                                                */
+
+    /* try to compute the size of the base dictionary;     */
+    /* look for a Postscript binary file tag, i.e., 0x8001 */
+    if ( FT_STREAM_SEEK( 0L ) )
+      goto Exit;
+
+    error = read_pfb_tag( stream, &tag, &size );
+    if ( error )
+      goto Exit;
+
+    if ( tag != 0x8001U )
+    {
+      /* assume that this is a PFA file for now; an error will */
+      /* be produced later when more things are checked        */
+      if ( FT_STREAM_SEEK( 0L ) )
+        goto Exit;
+      size = stream->size;
+    }
+    else
+      parser->in_pfb = 1;
+
+    /* now, try to load `size' bytes of the `base' dictionary we */
+    /* found previously                                          */
+
+    /* if it is a memory-based resource, set up pointers */
+    if ( !stream->read )
+    {
+      parser->base_dict = (FT_Byte*)stream->base + stream->pos;
+      parser->base_len  = size;
+      parser->in_memory = 1;
+
+      /* check that the `size' field is valid */
+      if ( FT_STREAM_SKIP( size ) )
+        goto Exit;
+    }
+    else
+    {
+      /* read segment in memory -- this is clumsy, but so does the format */
+      if ( FT_ALLOC( parser->base_dict, size )       ||
+           FT_STREAM_READ( parser->base_dict, size ) )
+        goto Exit;
+      parser->base_len = size;
+    }
+
+    parser->root.base   = parser->base_dict;
+    parser->root.cursor = parser->base_dict;
+    parser->root.limit  = parser->root.cursor + parser->base_len;
+
+  Exit:
+    if ( error && !parser->in_memory )
+      FT_FREE( parser->base_dict );
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  T1_Finalize_Parser( T1_Parser  parser )
+  {
+    FT_Memory  memory = parser->root.memory;
+
+
+    /* always free the private dictionary */
+    FT_FREE( parser->private_dict );
+
+    /* free the base dictionary only when we have a disk stream */
+    if ( !parser->in_memory )
+      FT_FREE( parser->base_dict );
+
+    parser->root.funcs.done( &parser->root );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Get_Private_Dict( T1_Parser      parser,
+                       PSAux_Service  psaux )
+  {
+    FT_Stream  stream = parser->stream;
+    FT_Memory  memory = parser->root.memory;
+    FT_Error   error  = T1_Err_Ok;
+    FT_ULong   size;
+
+
+    if ( parser->in_pfb )
+    {
+      /* in the case of the PFB format, the private dictionary can be  */
+      /* made of several segments.  We thus first read the number of   */
+      /* segments to compute the total size of the private dictionary  */
+      /* then re-read them into memory.                                */
+      FT_Long    start_pos = FT_STREAM_POS();
+      FT_UShort  tag;
+
+
+      parser->private_len = 0;
+      for (;;)
+      {
+        error = read_pfb_tag( stream, &tag, &size );
+        if ( error )
+          goto Fail;
+
+        if ( tag != 0x8002U )
+          break;
+
+        parser->private_len += size;
+
+        if ( FT_STREAM_SKIP( size ) )
+          goto Fail;
+      }
+
+      /* Check that we have a private dictionary there */
+      /* and allocate private dictionary buffer        */
+      if ( parser->private_len == 0 )
+      {
+        FT_ERROR(( "T1_Get_Private_Dict:"
+                   " invalid private dictionary section\n" ));
+        error = T1_Err_Invalid_File_Format;
+        goto Fail;
+      }
+
+      if ( FT_STREAM_SEEK( start_pos )                           ||
+           FT_ALLOC( parser->private_dict, parser->private_len ) )
+        goto Fail;
+
+      parser->private_len = 0;
+      for (;;)
+      {
+        error = read_pfb_tag( stream, &tag, &size );
+        if ( error || tag != 0x8002U )
+        {
+          error = T1_Err_Ok;
+          break;
+        }
+
+        if ( FT_STREAM_READ( parser->private_dict + parser->private_len,
+                             size ) )
+          goto Fail;
+
+        parser->private_len += size;
+      }
+    }
+    else
+    {
+      /* We have already `loaded' the whole PFA font file into memory; */
+      /* if this is a memory resource, allocate a new block to hold    */
+      /* the private dict.  Otherwise, simply overwrite into the base  */
+      /* dictionary block in the heap.                                 */
+
+      /* first of all, look at the `eexec' keyword */
+      FT_Byte*  cur   = parser->base_dict;
+      FT_Byte*  limit = cur + parser->base_len;
+      FT_Byte   c;
+
+
+    Again:
+      for (;;)
+      {
+        c = cur[0];
+        if ( c == 'e' && cur + 9 < limit )  /* 9 = 5 letters for `eexec' + */
+                                            /* newline + 4 chars           */
+        {
+          if ( cur[1] == 'e' &&
+               cur[2] == 'x' &&
+               cur[3] == 'e' &&
+               cur[4] == 'c' )
+            break;
+        }
+        cur++;
+        if ( cur >= limit )
+        {
+          FT_ERROR(( "T1_Get_Private_Dict:"
+                     " could not find `eexec' keyword\n" ));
+          error = T1_Err_Invalid_File_Format;
+          goto Exit;
+        }
+      }
+
+      /* check whether `eexec' was real -- it could be in a comment */
+      /* or string (as e.g. in u003043t.gsf from ghostscript)       */
+
+      parser->root.cursor = parser->base_dict;
+      parser->root.limit  = cur + 9;
+
+      cur   = parser->root.cursor;
+      limit = parser->root.limit;
+
+      while ( cur < limit )
+      {
+        if ( *cur == 'e' && ft_strncmp( (char*)cur, "eexec", 5 ) == 0 )
+          goto Found;
+
+        T1_Skip_PS_Token( parser );
+        if ( parser->root.error )
+          break;
+        T1_Skip_Spaces  ( parser );
+        cur = parser->root.cursor;
+      }
+
+      /* we haven't found the correct `eexec'; go back and continue */
+      /* searching                                                  */
+
+      cur   = limit;
+      limit = parser->base_dict + parser->base_len;
+      goto Again;
+
+      /* now determine where to write the _encrypted_ binary private  */
+      /* dictionary.  We overwrite the base dictionary for disk-based */
+      /* resources and allocate a new block otherwise                 */
+
+    Found:
+      parser->root.limit = parser->base_dict + parser->base_len;
+
+      T1_Skip_PS_Token( parser );
+      cur = parser->root.cursor;
+
+      /* according to the Type1 spec, the first cipher byte must not be  */
+      /* an ASCII whitespace character code (blank, tab, carriage return */
+      /* or line feed).  We have seen Type 1 fonts with two line feed    */
+      /* characters...  So skip now all whitespace character codes.      */
+      while ( cur < limit       &&
+              ( *cur == ' '  ||
+                *cur == '\t' ||
+                *cur == '\r' ||
+                *cur == '\n' ) )
+        ++cur;
+      if ( cur >= limit )
+      {
+        FT_ERROR(( "T1_Get_Private_Dict:"
+                   " `eexec' not properly terminated\n" ));
+        error = T1_Err_Invalid_File_Format;
+        goto Exit;
+      }
+
+      size = parser->base_len - ( cur - parser->base_dict );
+
+      if ( parser->in_memory )
+      {
+        /* note that we allocate one more byte to put a terminating `0' */
+        if ( FT_ALLOC( parser->private_dict, size + 1 ) )
+          goto Fail;
+        parser->private_len = size;
+      }
+      else
+      {
+        parser->single_block = 1;
+        parser->private_dict = parser->base_dict;
+        parser->private_len  = size;
+        parser->base_dict    = 0;
+        parser->base_len     = 0;
+      }
+
+      /* now determine whether the private dictionary is encoded in binary */
+      /* or hexadecimal ASCII format -- decode it accordingly              */
+
+      /* we need to access the next 4 bytes (after the final \r following */
+      /* the `eexec' keyword); if they all are hexadecimal digits, then   */
+      /* we have a case of ASCII storage                                  */
+
+      if ( ft_isxdigit( cur[0] ) && ft_isxdigit( cur[1] ) &&
+           ft_isxdigit( cur[2] ) && ft_isxdigit( cur[3] ) )
+      {
+        /* ASCII hexadecimal encoding */
+        FT_Long  len;
+
+
+        parser->root.cursor = cur;
+        (void)psaux->ps_parser_funcs->to_bytes( &parser->root,
+                                                parser->private_dict,
+                                                parser->private_len,
+                                                &len,
+                                                0 );
+        parser->private_len = len;
+
+        /* put a safeguard */
+        parser->private_dict[len] = '\0';
+      }
+      else
+        /* binary encoding -- copy the private dict */
+        FT_MEM_MOVE( parser->private_dict, cur, size );
+    }
+
+    /* we now decrypt the encoded binary private dictionary */
+    psaux->t1_decrypt( parser->private_dict, parser->private_len, 55665U );
+
+    if ( parser->private_len < 4 )
+    {
+      FT_ERROR(( "T1_Get_Private_Dict:"
+                 " invalid private dictionary section\n" ));
+      error = T1_Err_Invalid_File_Format;
+      goto Fail;
+    }
+
+    /* replace the four random bytes at the beginning with whitespace */
+    parser->private_dict[0] = ' ';
+    parser->private_dict[1] = ' ';
+    parser->private_dict[2] = ' ';
+    parser->private_dict[3] = ' ';
+
+    parser->root.base   = parser->private_dict;
+    parser->root.cursor = parser->private_dict;
+    parser->root.limit  = parser->root.cursor + parser->private_len;
+
+  Fail:
+  Exit:
+    return error;
+  }
+
+
+/* END */
diff --git a/src/type1/t1parse.h b/src/type1/t1parse.h
new file mode 100644 (file)
index 0000000..fb1c8a8
--- /dev/null
@@ -0,0 +1,135 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1parse.h                                                              */
+/*                                                                         */
+/*    Type 1 parser (specification).                                       */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2008 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T1PARSE_H__
+#define __T1PARSE_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_TYPE1_TYPES_H
+#include FT_INTERNAL_STREAM_H
+
+
+FT_BEGIN_HEADER
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Struct>                                                              */
+  /*    T1_ParserRec                                                       */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A PS_ParserRec is an object used to parse a Type 1 fonts very      */
+  /*    quickly.                                                           */
+  /*                                                                       */
+  /* <Fields>                                                              */
+  /*    root         :: The root parser.                                   */
+  /*                                                                       */
+  /*    stream       :: The current input stream.                          */
+  /*                                                                       */
+  /*    base_dict    :: A pointer to the top-level dictionary.             */
+  /*                                                                       */
+  /*    base_len     :: The length in bytes of the top dictionary.         */
+  /*                                                                       */
+  /*    private_dict :: A pointer to the private dictionary.               */
+  /*                                                                       */
+  /*    private_len  :: The length in bytes of the private dictionary.     */
+  /*                                                                       */
+  /*    in_pfb       :: A boolean.  Indicates that we are handling a PFB   */
+  /*                    file.                                              */
+  /*                                                                       */
+  /*    in_memory    :: A boolean.  Indicates a memory-based stream.       */
+  /*                                                                       */
+  /*    single_block :: A boolean.  Indicates that the private dictionary  */
+  /*                    is stored in lieu of the base dictionary.          */
+  /*                                                                       */
+  typedef struct  T1_ParserRec_
+  {
+    PS_ParserRec  root;
+    FT_Stream     stream;
+
+    FT_Byte*      base_dict;
+    FT_ULong      base_len;
+
+    FT_Byte*      private_dict;
+    FT_ULong      private_len;
+
+    FT_Bool       in_pfb;
+    FT_Bool       in_memory;
+    FT_Bool       single_block;
+
+  } T1_ParserRec, *T1_Parser;
+
+
+#define T1_Add_Table( p, i, o, l )  (p)->funcs.add( (p), i, o, l )
+#define T1_Done_Table( p )          \
+          do                        \
+          {                         \
+            if ( (p)->funcs.done )  \
+              (p)->funcs.done( p ); \
+          } while ( 0 )
+#define T1_Release_Table( p )          \
+          do                           \
+          {                            \
+            if ( (p)->funcs.release )  \
+              (p)->funcs.release( p ); \
+          } while ( 0 )
+
+
+#define T1_Skip_Spaces( p )    (p)->root.funcs.skip_spaces( &(p)->root )
+#define T1_Skip_PS_Token( p )  (p)->root.funcs.skip_PS_token( &(p)->root )
+
+#define T1_ToInt( p )       (p)->root.funcs.to_int( &(p)->root )
+#define T1_ToFixed( p, t )  (p)->root.funcs.to_fixed( &(p)->root, t )
+
+#define T1_ToCoordArray( p, m, c )                           \
+          (p)->root.funcs.to_coord_array( &(p)->root, m, c )
+#define T1_ToFixedArray( p, m, f, t )                           \
+          (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t )
+#define T1_ToToken( p, t )                          \
+          (p)->root.funcs.to_token( &(p)->root, t )
+#define T1_ToTokenArray( p, t, m, c )                           \
+          (p)->root.funcs.to_token_array( &(p)->root, t, m, c )
+
+#define T1_Load_Field( p, f, o, m, pf )                         \
+          (p)->root.funcs.load_field( &(p)->root, f, o, m, pf )
+
+#define T1_Load_Field_Table( p, f, o, m, pf )                         \
+          (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf )
+
+
+  FT_LOCAL( FT_Error )
+  T1_New_Parser( T1_Parser      parser,
+                 FT_Stream      stream,
+                 FT_Memory      memory,
+                 PSAux_Service  psaux );
+
+  FT_LOCAL( FT_Error )
+  T1_Get_Private_Dict( T1_Parser      parser,
+                       PSAux_Service  psaux );
+
+  FT_LOCAL( void )
+  T1_Finalize_Parser( T1_Parser  parser );
+
+
+FT_END_HEADER
+
+#endif /* __T1PARSE_H__ */
+
+
+/* END */
diff --git a/src/type1/t1tokens.h b/src/type1/t1tokens.h
new file mode 100644 (file)
index 0000000..e37276b
--- /dev/null
@@ -0,0 +1,143 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t1tokens.h                                                             */
+/*                                                                         */
+/*    Type 1 tokenizer (specification).                                    */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2006, 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PS_FontInfoRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FONT_INFO
+
+  T1_FIELD_STRING( "version",            version,
+                   T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_STRING( "Notice",             notice,
+                   T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_STRING( "FullName",           full_name,
+                   T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_STRING( "FamilyName",         family_name,
+                   T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_STRING( "Weight",             weight,
+                   T1_FIELD_DICT_FONTDICT )
+
+  /* we use pointers to detect modifications made by synthetic fonts */
+  T1_FIELD_NUM   ( "ItalicAngle",        italic_angle,
+                   T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_BOOL  ( "isFixedPitch",       is_fixed_pitch,
+                   T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_NUM   ( "UnderlinePosition",  underline_position,
+                   T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_NUM   ( "UnderlineThickness", underline_thickness,
+                   T1_FIELD_DICT_FONTDICT )
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PS_FontExtraRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FONT_EXTRA
+
+  T1_FIELD_NUM   ( "FSType", fs_type,
+                   T1_FIELD_DICT_FONTDICT )
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PS_PrivateRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_PRIVATE
+
+  T1_FIELD_NUM       ( "UniqueID",         unique_id,
+                       T1_FIELD_DICT_FONTDICT | T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM       ( "lenIV",            lenIV,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM       ( "LanguageGroup",    language_group,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM       ( "password",         password,
+                       T1_FIELD_DICT_PRIVATE )
+
+  T1_FIELD_FIXED_1000( "BlueScale",        blue_scale,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM       ( "BlueShift",        blue_shift,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM       ( "BlueFuzz",         blue_fuzz,
+                       T1_FIELD_DICT_PRIVATE )
+
+  T1_FIELD_NUM_TABLE ( "BlueValues",       blue_values,        14,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM_TABLE ( "OtherBlues",       other_blues,        10,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM_TABLE ( "FamilyBlues",      family_blues,       14,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10,
+                       T1_FIELD_DICT_PRIVATE )
+
+  T1_FIELD_NUM_TABLE2( "StdHW",            standard_width,      1,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM_TABLE2( "StdVW",            standard_height,     1,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM_TABLE2( "MinFeature",       min_feature,         2,
+                       T1_FIELD_DICT_PRIVATE )
+
+  T1_FIELD_NUM_TABLE ( "StemSnapH",        snap_widths,        12,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM_TABLE ( "StemSnapV",        snap_heights,       12,
+                       T1_FIELD_DICT_PRIVATE )
+
+  T1_FIELD_FIXED     ( "ExpansionFactor",  expansion_factor,
+                       T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_BOOL      ( "ForceBold",        force_bold,
+                       T1_FIELD_DICT_PRIVATE )
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  T1_FontRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FONT_DICT
+
+  T1_FIELD_KEY  ( "FontName",    font_name,    T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_NUM  ( "PaintType",   paint_type,   T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_NUM  ( "FontType",    font_type,    T1_FIELD_DICT_FONTDICT )
+  T1_FIELD_FIXED( "StrokeWidth", stroke_width, T1_FIELD_DICT_FONTDICT )
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  FT_BBox
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_BBOX
+
+  T1_FIELD_BBOX( "FontBBox", xMin, T1_FIELD_DICT_FONTDICT )
+
+
+#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  T1_FaceRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FACE
+
+  T1_FIELD_NUM( "NDV", ndv_idx, T1_FIELD_DICT_PRIVATE )
+  T1_FIELD_NUM( "CDV", cdv_idx, T1_FIELD_DICT_PRIVATE )
+
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PS_BlendRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_BLEND
+
+  T1_FIELD_NUM_TABLE( "DesignVector", default_design_vector,
+                      T1_MAX_MM_DESIGNS, T1_FIELD_DICT_FONTDICT )
+
+
+#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */
+
+
+/* END */
diff --git a/src/type1/type1.c b/src/type1/type1.c
new file mode 100644 (file)
index 0000000..ccc12be
--- /dev/null
@@ -0,0 +1,33 @@
+/***************************************************************************/
+/*                                                                         */
+/*  type1.c                                                                */
+/*                                                                         */
+/*    FreeType Type 1 driver component (body only).                        */
+/*                                                                         */
+/*  Copyright 1996-2001 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include <ft2build.h>
+#include "t1parse.c"
+#include "t1load.c"
+#include "t1objs.c"
+#include "t1driver.c"
+#include "t1gload.c"
+
+#ifndef T1_CONFIG_OPTION_NO_AFM
+#include "t1afm.c"
+#endif
+
+
+/* END */
diff --git a/src/type42/Jamfile b/src/type42/Jamfile
new file mode 100644 (file)
index 0000000..00371d5
--- /dev/null
@@ -0,0 +1,29 @@
+# FreeType 2 src/type42 Jamfile
+#
+# Copyright 2002 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) type42 ;
+
+{
+  local  _sources ;
+
+  if $(FT2_MULTI)
+  {
+    _sources = t42objs t42parse t42drivr ;
+  }
+  else
+  {
+    _sources = type42 ;
+  }
+
+  Library  $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/type42 Jamfile
diff --git a/src/type42/module.mk b/src/type42/module.mk
new file mode 100644 (file)
index 0000000..b3f10a8
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# FreeType 2 Type42 module definition
+#
+
+
+# Copyright 2002, 2006 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.
+
+
+FTMODULE_H_COMMANDS += TYPE42_DRIVER
+
+define TYPE42_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, t42_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)type42    $(ECHO_DRIVER_DESC)Type 42 font files with no known extension$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/src/type42/rules.mk b/src/type42/rules.mk
new file mode 100644 (file)
index 0000000..eac1081
--- /dev/null
@@ -0,0 +1,70 @@
+#
+# FreeType 2 Type42 driver configuration rules
+#
+
+
+# Copyright 2002, 2003, 2008 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.
+
+
+# Type42 driver directory
+#
+T42_DIR := $(SRC_DIR)/type42
+
+
+# compilation flags for the driver
+#
+T42_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(T42_DIR))
+
+
+# Type42 driver source
+#
+T42_DRV_SRC := $(T42_DIR)/t42objs.c  \
+               $(T42_DIR)/t42parse.c \
+               $(T42_DIR)/t42drivr.c
+
+# Type42 driver headers
+#
+T42_DRV_H := $(T42_DRV_SRC:%.c=%.h) \
+             $(T42_DIR)/t42error.h  \
+             $(T42_DIR)/t42types.h
+
+
+# Type42 driver object(s)
+#
+#   T42_DRV_OBJ_M is used during `multi' builds
+#   T42_DRV_OBJ_S is used during `single' builds
+#
+T42_DRV_OBJ_M := $(T42_DRV_SRC:$(T42_DIR)/%.c=$(OBJ_DIR)/%.$O)
+T42_DRV_OBJ_S := $(OBJ_DIR)/type42.$O
+
+# Type42 driver source file for single build
+#
+T42_DRV_SRC_S := $(T42_DIR)/type42.c
+
+
+# Type42 driver - single object
+#
+$(T42_DRV_OBJ_S): $(T42_DRV_SRC_S) $(T42_DRV_SRC) $(FREETYPE_H) $(T42_DRV_H)
+       $(T42_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(T42_DRV_SRC_S))
+
+
+# Type42 driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(T42_DIR)/%.c $(FREETYPE_H) $(T42_DRV_H)
+       $(T42_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(T42_DRV_OBJ_S)
+DRV_OBJS_M += $(T42_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/type42/t42drivr.c b/src/type42/t42drivr.c
new file mode 100644 (file)
index 0000000..9b93209
--- /dev/null
@@ -0,0 +1,247 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t42drivr.c                                                             */
+/*                                                                         */
+/*    High-level Type 42 driver interface (body).                          */
+/*                                                                         */
+/*  Copyright 2002-2004, 2006, 2007, 2009, 2011 by Roberto Alameda.        */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This driver implements Type42 fonts as described in the               */
+  /* Technical Note #5012 from Adobe, with these limitations:              */
+  /*                                                                       */
+  /* 1) CID Fonts are not currently supported.                             */
+  /* 2) Incremental fonts making use of the GlyphDirectory keyword         */
+  /*    will be loaded, but the rendering will be using the TrueType       */
+  /*    tables.                                                            */
+  /* 3) As for Type1 fonts, CDevProc is not supported.                     */
+  /* 4) The Metrics dictionary is not supported.                           */
+  /* 5) AFM metrics are not supported.                                     */
+  /*                                                                       */
+  /* In other words, this driver supports Type42 fonts derived from        */
+  /* TrueType fonts in a non-CID manner, as done by usual conversion       */
+  /* programs.                                                             */
+  /*                                                                       */
+  /*************************************************************************/
+
+
+#include "t42drivr.h"
+#include "t42objs.h"
+#include "t42error.h"
+#include FT_INTERNAL_DEBUG_H
+
+#include FT_SERVICE_XFREE86_NAME_H
+#include FT_SERVICE_GLYPH_DICT_H
+#include FT_SERVICE_POSTSCRIPT_NAME_H
+#include FT_SERVICE_POSTSCRIPT_INFO_H
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_t42
+
+
+  /*
+   *
+   *  GLYPH DICT SERVICE
+   *
+   */
+
+  static FT_Error
+  t42_get_glyph_name( T42_Face    face,
+                      FT_UInt     glyph_index,
+                      FT_Pointer  buffer,
+                      FT_UInt     buffer_max )
+  {
+    FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max );
+
+    return T42_Err_Ok;
+  }
+
+
+  static FT_UInt
+  t42_get_name_index( T42_Face    face,
+                      FT_String*  glyph_name )
+  {
+    FT_Int      i;
+    FT_String*  gname;
+
+
+    for ( i = 0; i < face->type1.num_glyphs; i++ )
+    {
+      gname = face->type1.glyph_names[i];
+
+      if ( glyph_name[0] == gname[0] && !ft_strcmp( glyph_name, gname ) )
+        return (FT_UInt)ft_atol( (const char *)face->type1.charstrings[i] );
+    }
+
+    return 0;
+  }
+
+
+  static const FT_Service_GlyphDictRec  t42_service_glyph_dict =
+  {
+    (FT_GlyphDict_GetNameFunc)  t42_get_glyph_name,
+    (FT_GlyphDict_NameIndexFunc)t42_get_name_index
+  };
+
+
+  /*
+   *
+   *  POSTSCRIPT NAME SERVICE
+   *
+   */
+
+  static const char*
+  t42_get_ps_font_name( T42_Face  face )
+  {
+    return (const char*)face->type1.font_name;
+  }
+
+
+  static const FT_Service_PsFontNameRec  t42_service_ps_font_name =
+  {
+    (FT_PsName_GetFunc)t42_get_ps_font_name
+  };
+
+
+  /*
+   *
+   *  POSTSCRIPT INFO SERVICE
+   *
+   */
+
+  static FT_Error
+  t42_ps_get_font_info( FT_Face          face,
+                        PS_FontInfoRec*  afont_info )
+  {
+    *afont_info = ((T42_Face)face)->type1.font_info;
+
+    return T42_Err_Ok;
+  }
+
+
+  static FT_Error
+  t42_ps_get_font_extra( FT_Face           face,
+                         PS_FontExtraRec*  afont_extra )
+  {
+    *afont_extra = ((T42_Face)face)->type1.font_extra;
+
+    return T42_Err_Ok;
+  }
+
+
+  static FT_Int
+  t42_ps_has_glyph_names( FT_Face  face )
+  {
+    FT_UNUSED( face );
+
+    return 1;
+  }
+
+
+  static FT_Error
+  t42_ps_get_font_private( FT_Face         face,
+                           PS_PrivateRec*  afont_private )
+  {
+    *afont_private = ((T42_Face)face)->type1.private_dict;
+
+    return T42_Err_Ok;
+  }
+
+
+  static const FT_Service_PsInfoRec  t42_service_ps_info =
+  {
+    (PS_GetFontInfoFunc)   t42_ps_get_font_info,
+    (PS_GetFontExtraFunc)  t42_ps_get_font_extra,
+    (PS_HasGlyphNamesFunc) t42_ps_has_glyph_names,
+    (PS_GetFontPrivateFunc)t42_ps_get_font_private,
+    (PS_GetFontValueFunc)  NULL             /* not implemented */
+  };
+
+
+  /*
+   *
+   *  SERVICE LIST
+   *
+   */
+
+  static const FT_ServiceDescRec  t42_services[] =
+  {
+    { FT_SERVICE_ID_GLYPH_DICT,           &t42_service_glyph_dict },
+    { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t42_service_ps_font_name },
+    { FT_SERVICE_ID_POSTSCRIPT_INFO,      &t42_service_ps_info },
+    { FT_SERVICE_ID_XF86_NAME,            FT_XF86_FORMAT_TYPE_42 },
+    { NULL, NULL }
+  };
+
+
+  FT_CALLBACK_DEF( FT_Module_Interface )
+  T42_Get_Interface( FT_Module         module,
+                     const FT_String*  t42_interface )
+  {
+    FT_UNUSED( module );
+
+    return ft_service_list_lookup( t42_services, t42_interface );
+  }
+
+
+  const FT_Driver_ClassRec  t42_driver_class =
+  {
+    {
+      FT_MODULE_FONT_DRIVER       |
+      FT_MODULE_DRIVER_SCALABLE   |
+#ifdef TT_USE_BYTECODE_INTERPRETER
+      FT_MODULE_DRIVER_HAS_HINTER,
+#else
+      0,
+#endif
+
+      sizeof ( T42_DriverRec ),
+
+      "type42",
+      0x10000L,
+      0x20000L,
+
+      0,    /* format interface */
+
+      T42_Driver_Init,
+      T42_Driver_Done,
+      T42_Get_Interface,
+    },
+
+    sizeof ( T42_FaceRec ),
+    sizeof ( T42_SizeRec ),
+    sizeof ( T42_GlyphSlotRec ),
+
+    T42_Face_Init,
+    T42_Face_Done,
+    T42_Size_Init,
+    T42_Size_Done,
+    T42_GlyphSlot_Init,
+    T42_GlyphSlot_Done,
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+    ft_stub_set_char_sizes,
+    ft_stub_set_pixel_sizes,
+#endif
+    T42_GlyphSlot_Load,
+
+    0,                 /* FT_Face_GetKerningFunc  */
+    0,                 /* FT_Face_AttachFunc      */
+
+    0,                 /* FT_Face_GetAdvancesFunc */
+    T42_Size_Request,
+    T42_Size_Select
+  };
+
+
+/* END */
diff --git a/src/type42/t42drivr.h b/src/type42/t42drivr.h
new file mode 100644 (file)
index 0000000..9a1e97e
--- /dev/null
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t42drivr.h                                                             */
+/*                                                                         */
+/*    High-level Type 42 driver interface (specification).                 */
+/*                                                                         */
+/*  Copyright 2002 by Roberto Alameda.                                     */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T42DRIVR_H__
+#define __T42DRIVR_H__
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_DRIVER_H
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+
+  FT_EXPORT_VAR( const FT_Driver_ClassRec )  t42_driver_class;
+
+
+FT_END_HEADER
+
+
+#endif /* __T42DRIVR_H__ */
+
+
+/* END */
diff --git a/src/type42/t42error.h b/src/type42/t42error.h
new file mode 100644 (file)
index 0000000..217ae8b
--- /dev/null
@@ -0,0 +1,41 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t42error.h                                                             */
+/*                                                                         */
+/*    Type 42 error codes (specification only).                            */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the Type 42 error enumeration constants.  */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __T42ERROR_H__
+#define __T42ERROR_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  T42_Err_
+#define FT_ERR_BASE    FT_Mod_Err_Type42
+
+#include FT_ERRORS_H
+
+#endif /* __T42ERROR_H__ */
+
+
+/* END */
diff --git a/src/type42/t42objs.c b/src/type42/t42objs.c
new file mode 100644 (file)
index 0000000..c6053af
--- /dev/null
@@ -0,0 +1,679 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t42objs.c                                                              */
+/*                                                                         */
+/*    Type 42 objects manager (body).                                      */
+/*                                                                         */
+/*  Copyright 2002-2009, 2011                                              */
+/*  by Roberto Alameda.                                                    */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "t42objs.h"
+#include "t42parse.h"
+#include "t42error.h"
+#include FT_INTERNAL_DEBUG_H
+#include FT_LIST_H
+#include FT_TRUETYPE_IDS_H
+
+
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_t42
+
+
+  static FT_Error
+  T42_Open_Face( T42_Face  face )
+  {
+    T42_LoaderRec  loader;
+    T42_Parser     parser;
+    T1_Font        type1 = &face->type1;
+    FT_Memory      memory = face->root.memory;
+    FT_Error       error;
+
+    PSAux_Service  psaux  = (PSAux_Service)face->psaux;
+
+
+    t42_loader_init( &loader, face );
+
+    parser = &loader.parser;
+
+    if ( FT_ALLOC( face->ttf_data, 12 ) )
+      goto Exit;
+
+    error = t42_parser_init( parser,
+                             face->root.stream,
+                             memory,
+                             psaux);
+    if ( error )
+      goto Exit;
+
+    error = t42_parse_dict( face, &loader,
+                            parser->base_dict, parser->base_len );
+    if ( error )
+      goto Exit;
+
+    if ( type1->font_type != 42 )
+    {
+      FT_ERROR(( "T42_Open_Face: cannot handle FontType %d\n",
+                 type1->font_type ));
+      error = T42_Err_Unknown_File_Format;
+      goto Exit;
+    }
+
+    /* now, propagate the charstrings and glyphnames tables */
+    /* to the Type1 data                                    */
+    type1->num_glyphs = loader.num_glyphs;
+
+    if ( !loader.charstrings.init )
+    {
+      FT_ERROR(( "T42_Open_Face: no charstrings array in face\n" ));
+      error = T42_Err_Invalid_File_Format;
+    }
+
+    loader.charstrings.init  = 0;
+    type1->charstrings_block = loader.charstrings.block;
+    type1->charstrings       = loader.charstrings.elements;
+    type1->charstrings_len   = loader.charstrings.lengths;
+
+    /* we copy the glyph names `block' and `elements' fields; */
+    /* the `lengths' field must be released later             */
+    type1->glyph_names_block    = loader.glyph_names.block;
+    type1->glyph_names          = (FT_String**)loader.glyph_names.elements;
+    loader.glyph_names.block    = 0;
+    loader.glyph_names.elements = 0;
+
+    /* we must now build type1.encoding when we have a custom array */
+    if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY )
+    {
+      FT_Int    charcode, idx, min_char, max_char;
+      FT_Byte*  char_name;
+      FT_Byte*  glyph_name;
+
+
+      /* OK, we do the following: for each element in the encoding   */
+      /* table, look up the index of the glyph having the same name  */
+      /* as defined in the CharStrings array.                        */
+      /* The index is then stored in type1.encoding.char_index, and  */
+      /* the name in type1.encoding.char_name                        */
+
+      min_char = 0;
+      max_char = 0;
+
+      charcode = 0;
+      for ( ; charcode < loader.encoding_table.max_elems; charcode++ )
+      {
+        type1->encoding.char_index[charcode] = 0;
+        type1->encoding.char_name [charcode] = (char *)".notdef";
+
+        char_name = loader.encoding_table.elements[charcode];
+        if ( char_name )
+          for ( idx = 0; idx < type1->num_glyphs; idx++ )
+          {
+            glyph_name = (FT_Byte*)type1->glyph_names[idx];
+            if ( ft_strcmp( (const char*)char_name,
+                            (const char*)glyph_name ) == 0 )
+            {
+              type1->encoding.char_index[charcode] = (FT_UShort)idx;
+              type1->encoding.char_name [charcode] = (char*)glyph_name;
+
+              /* Change min/max encoded char only if glyph name is */
+              /* not /.notdef                                      */
+              if ( ft_strcmp( (const char*)".notdef",
+                              (const char*)glyph_name ) != 0 )
+              {
+                if ( charcode < min_char )
+                  min_char = charcode;
+                if ( charcode >= max_char )
+                  max_char = charcode + 1;
+              }
+              break;
+            }
+          }
+      }
+
+      type1->encoding.code_first = min_char;
+      type1->encoding.code_last  = max_char;
+      type1->encoding.num_chars  = loader.num_chars;
+    }
+
+  Exit:
+    t42_loader_done( &loader );
+    return error;
+  }
+
+
+  /***************** Driver Functions *************/
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T42_Face_Init( FT_Stream      stream,
+                 FT_Face        t42face,       /* T42_Face */
+                 FT_Int         face_index,
+                 FT_Int         num_params,
+                 FT_Parameter*  params )
+  {
+    T42_Face            face  = (T42_Face)t42face;
+    FT_Error            error;
+    FT_Service_PsCMaps  psnames;
+    PSAux_Service       psaux;
+    FT_Face             root  = (FT_Face)&face->root;
+    T1_Font             type1 = &face->type1;
+    PS_FontInfo         info  = &type1->font_info;
+
+    FT_UNUSED( num_params );
+    FT_UNUSED( params );
+    FT_UNUSED( face_index );
+    FT_UNUSED( stream );
+
+
+    face->ttf_face       = NULL;
+    face->root.num_faces = 1;
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
+    face->psnames = psnames;
+
+    face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
+                                           "psaux" );
+    psaux = (PSAux_Service)face->psaux;
+    if ( !psaux )
+    {
+      FT_ERROR(( "T42_Face_Init: cannot access `psaux' module\n" ));
+      error = T42_Err_Missing_Module;
+      goto Exit;
+    }
+
+    FT_TRACE2(( "Type 42 driver\n" ));
+
+    /* open the tokenizer, this will also check the font format */
+    error = T42_Open_Face( face );
+    if ( error )
+      goto Exit;
+
+    /* if we just wanted to check the format, leave successfully now */
+    if ( face_index < 0 )
+      goto Exit;
+
+    /* check the face index */
+    if ( face_index > 0 )
+    {
+      FT_ERROR(( "T42_Face_Init: invalid face index\n" ));
+      error = T42_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    /* Now load the font program into the face object */
+
+    /* Init the face object fields */
+    /* Now set up root face fields */
+
+    root->num_glyphs   = type1->num_glyphs;
+    root->num_charmaps = 0;
+    root->face_index   = 0;
+
+    root->face_flags = FT_FACE_FLAG_SCALABLE    |
+                       FT_FACE_FLAG_HORIZONTAL  |
+                       FT_FACE_FLAG_GLYPH_NAMES;
+
+    if ( info->is_fixed_pitch )
+      root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+    /* We only set this flag if we have the patented bytecode interpreter. */
+    /* There are no known `tricky' Type42 fonts that could be loaded with  */
+    /* the unpatented interpreter.                                         */
+#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+    root->face_flags |= FT_FACE_FLAG_HINTER;
+#endif
+
+    /* XXX: TODO -- add kerning with .afm support */
+
+    /* get style name -- be careful, some broken fonts only */
+    /* have a `/FontName' dictionary entry!                 */
+    root->family_name = info->family_name;
+    /* assume "Regular" style if we don't know better */
+    root->style_name = (char *)"Regular";
+    if ( root->family_name )
+    {
+      char*  full   = info->full_name;
+      char*  family = root->family_name;
+
+
+      if ( full )
+      {
+        while ( *full )
+        {
+          if ( *full == *family )
+          {
+            family++;
+            full++;
+          }
+          else
+          {
+            if ( *full == ' ' || *full == '-' )
+              full++;
+            else if ( *family == ' ' || *family == '-' )
+              family++;
+            else
+            {
+              if ( !*family )
+                root->style_name = full;
+              break;
+            }
+          }
+        }
+      }
+    }
+    else
+    {
+      /* do we have a `/FontName'? */
+      if ( type1->font_name )
+        root->family_name = type1->font_name;
+    }
+
+    /* no embedded bitmap support */
+    root->num_fixed_sizes = 0;
+    root->available_sizes = 0;
+
+    /* Load the TTF font embedded in the T42 font */
+    {
+      FT_Open_Args  args;
+
+
+      args.flags       = FT_OPEN_MEMORY;
+      args.memory_base = face->ttf_data;
+      args.memory_size = face->ttf_size;
+
+      if ( num_params )
+      {
+        args.flags     |= FT_OPEN_PARAMS;
+        args.num_params = num_params;
+        args.params     = params;
+      }
+
+      error = FT_Open_Face( FT_FACE_LIBRARY( face ),
+                            &args, 0, &face->ttf_face );
+    }
+
+    if ( error )
+      goto Exit;
+
+    FT_Done_Size( face->ttf_face->size );
+
+    /* Ignore info in FontInfo dictionary and use the info from the  */
+    /* loaded TTF font.  The PostScript interpreter also ignores it. */
+    root->bbox         = face->ttf_face->bbox;
+    root->units_per_EM = face->ttf_face->units_per_EM;
+
+    root->ascender  = face->ttf_face->ascender;
+    root->descender = face->ttf_face->descender;
+    root->height    = face->ttf_face->height;
+
+    root->max_advance_width  = face->ttf_face->max_advance_width;
+    root->max_advance_height = face->ttf_face->max_advance_height;
+
+    root->underline_position  = (FT_Short)info->underline_position;
+    root->underline_thickness = (FT_Short)info->underline_thickness;
+
+    /* compute style flags */
+    root->style_flags = 0;
+    if ( info->italic_angle )
+      root->style_flags |= FT_STYLE_FLAG_ITALIC;
+
+    if ( face->ttf_face->style_flags & FT_STYLE_FLAG_BOLD )
+      root->style_flags |= FT_STYLE_FLAG_BOLD;
+
+    if ( face->ttf_face->face_flags & FT_FACE_FLAG_VERTICAL )
+      root->face_flags |= FT_FACE_FLAG_VERTICAL;
+
+    {
+      if ( psnames )
+      {
+        FT_CharMapRec    charmap;
+        T1_CMap_Classes  cmap_classes = psaux->t1_cmap_classes;
+        FT_CMap_Class    clazz;
+
+
+        charmap.face = root;
+
+        /* first of all, try to synthesize a Unicode charmap */
+        charmap.platform_id = TT_PLATFORM_MICROSOFT;
+        charmap.encoding_id = TT_MS_ID_UNICODE_CS;
+        charmap.encoding    = FT_ENCODING_UNICODE;
+
+        error = FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL );
+        if ( error && FT_Err_No_Unicode_Glyph_Name != error )
+          goto Exit;
+        error = FT_Err_Ok;
+
+        /* now, generate an Adobe Standard encoding when appropriate */
+        charmap.platform_id = TT_PLATFORM_ADOBE;
+        clazz               = NULL;
+
+        switch ( type1->encoding_type )
+        {
+        case T1_ENCODING_TYPE_STANDARD:
+          charmap.encoding    = FT_ENCODING_ADOBE_STANDARD;
+          charmap.encoding_id = TT_ADOBE_ID_STANDARD;
+          clazz               = cmap_classes->standard;
+          break;
+
+        case T1_ENCODING_TYPE_EXPERT:
+          charmap.encoding    = FT_ENCODING_ADOBE_EXPERT;
+          charmap.encoding_id = TT_ADOBE_ID_EXPERT;
+          clazz               = cmap_classes->expert;
+          break;
+
+        case T1_ENCODING_TYPE_ARRAY:
+          charmap.encoding    = FT_ENCODING_ADOBE_CUSTOM;
+          charmap.encoding_id = TT_ADOBE_ID_CUSTOM;
+          clazz               = cmap_classes->custom;
+          break;
+
+        case T1_ENCODING_TYPE_ISOLATIN1:
+          charmap.encoding    = FT_ENCODING_ADOBE_LATIN_1;
+          charmap.encoding_id = TT_ADOBE_ID_LATIN_1;
+          clazz               = cmap_classes->unicode;
+          break;
+
+        default:
+          ;
+        }
+
+        if ( clazz )
+          error = FT_CMap_New( clazz, NULL, &charmap, NULL );
+
+#if 0
+        /* Select default charmap */
+        if ( root->num_charmaps )
+          root->charmap = root->charmaps[0];
+#endif
+      }
+    }
+  Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  T42_Face_Done( FT_Face  t42face )
+  {
+    T42_Face     face = (T42_Face)t42face;
+    T1_Font      type1;
+    PS_FontInfo  info;
+    FT_Memory    memory;
+
+
+    if ( !face )
+      return;
+
+    type1  = &face->type1;
+    info   = &type1->font_info;
+    memory = face->root.memory;
+
+    /* delete internal ttf face prior to freeing face->ttf_data */
+    if ( face->ttf_face )
+      FT_Done_Face( face->ttf_face );
+
+    /* release font info strings */
+    FT_FREE( info->version );
+    FT_FREE( info->notice );
+    FT_FREE( info->full_name );
+    FT_FREE( info->family_name );
+    FT_FREE( info->weight );
+
+    /* release top dictionary */
+    FT_FREE( type1->charstrings_len );
+    FT_FREE( type1->charstrings );
+    FT_FREE( type1->glyph_names );
+
+    FT_FREE( type1->charstrings_block );
+    FT_FREE( type1->glyph_names_block );
+
+    FT_FREE( type1->encoding.char_index );
+    FT_FREE( type1->encoding.char_name );
+    FT_FREE( type1->font_name );
+
+    FT_FREE( face->ttf_data );
+
+#if 0
+    /* release afm data if present */
+    if ( face->afm_data )
+      T1_Done_AFM( memory, (T1_AFM*)face->afm_data );
+#endif
+
+    /* release unicode map, if any */
+    FT_FREE( face->unicode_map.maps );
+    face->unicode_map.num_maps = 0;
+
+    face->root.family_name = 0;
+    face->root.style_name  = 0;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    T42_Driver_Init                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Initializes a given Type 42 driver object.                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    driver :: A handle to the target driver object.                    */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0 means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  T42_Driver_Init( FT_Module  module )        /* T42_Driver */
+  {
+    T42_Driver  driver = (T42_Driver)module;
+    FT_Module   ttmodule;
+
+
+    ttmodule = FT_Get_Module( module->library, "truetype" );
+    if ( !ttmodule )
+    {
+      FT_ERROR(( "T42_Driver_Init: cannot access `truetype' module\n" ));
+      return T42_Err_Missing_Module;
+    }
+
+    driver->ttclazz = (FT_Driver_Class)ttmodule->clazz;
+
+    return T42_Err_Ok;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  T42_Driver_Done( FT_Module  module )
+  {
+    FT_UNUSED( module );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T42_Size_Init( FT_Size  size )         /* T42_Size */
+  {
+    T42_Size  t42size = (T42_Size)size;
+    FT_Face   face    = size->face;
+    T42_Face  t42face = (T42_Face)face;
+    FT_Size   ttsize;
+    FT_Error  error   = T42_Err_Ok;
+
+
+    error = FT_New_Size( t42face->ttf_face, &ttsize );
+    t42size->ttsize = ttsize;
+
+    FT_Activate_Size( ttsize );
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T42_Size_Request( FT_Size          t42size,      /* T42_Size */
+                    FT_Size_Request  req )
+  {
+    T42_Size  size = (T42_Size)t42size;
+    T42_Face  face = (T42_Face)t42size->face;
+    FT_Error  error;
+
+
+    FT_Activate_Size( size->ttsize );
+
+    error = FT_Request_Size( face->ttf_face, req );
+    if ( !error )
+      t42size->metrics = face->ttf_face->size->metrics;
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T42_Size_Select( FT_Size   t42size,         /* T42_Size */
+                   FT_ULong  strike_index )
+  {
+    T42_Size  size = (T42_Size)t42size;
+    T42_Face  face = (T42_Face)t42size->face;
+    FT_Error  error;
+
+
+    FT_Activate_Size( size->ttsize );
+
+    error = FT_Select_Size( face->ttf_face, (FT_Int)strike_index );
+    if ( !error )
+      t42size->metrics = face->ttf_face->size->metrics;
+
+    return error;
+
+  }
+
+
+  FT_LOCAL_DEF( void )
+  T42_Size_Done( FT_Size  t42size )             /* T42_Size */
+  {
+    T42_Size     size    = (T42_Size)t42size;
+    FT_Face      face    = t42size->face;
+    T42_Face     t42face = (T42_Face)face;
+    FT_ListNode  node;
+
+
+    node = FT_List_Find( &t42face->ttf_face->sizes_list, size->ttsize );
+    if ( node )
+    {
+      FT_Done_Size( size->ttsize );
+      size->ttsize = NULL;
+    }
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T42_GlyphSlot_Init( FT_GlyphSlot  t42slot )        /* T42_GlyphSlot */
+  {
+    T42_GlyphSlot  slot    = (T42_GlyphSlot)t42slot;
+    FT_Face        face    = t42slot->face;
+    T42_Face       t42face = (T42_Face)face;
+    FT_GlyphSlot   ttslot;
+    FT_Error       error   = T42_Err_Ok;
+
+
+    if ( face->glyph == NULL )
+    {
+      /* First glyph slot for this face */
+      slot->ttslot = t42face->ttf_face->glyph;
+    }
+    else
+    {
+      error = FT_New_GlyphSlot( t42face->ttf_face, &ttslot );
+      slot->ttslot = ttslot;
+    }
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  T42_GlyphSlot_Done( FT_GlyphSlot  t42slot )       /* T42_GlyphSlot */
+  {
+    T42_GlyphSlot  slot = (T42_GlyphSlot)t42slot;
+
+
+    FT_Done_GlyphSlot( slot->ttslot );
+  }
+
+
+  static void
+  t42_glyphslot_clear( FT_GlyphSlot  slot )
+  {
+    /* free bitmap if needed */
+    ft_glyphslot_free_bitmap( slot );
+
+    /* clear all public fields in the glyph slot */
+    FT_ZERO( &slot->metrics );
+    FT_ZERO( &slot->outline );
+    FT_ZERO( &slot->bitmap );
+
+    slot->bitmap_left   = 0;
+    slot->bitmap_top    = 0;
+    slot->num_subglyphs = 0;
+    slot->subglyphs     = 0;
+    slot->control_data  = 0;
+    slot->control_len   = 0;
+    slot->other         = 0;
+    slot->format        = FT_GLYPH_FORMAT_NONE;
+
+    slot->linearHoriAdvance = 0;
+    slot->linearVertAdvance = 0;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T42_GlyphSlot_Load( FT_GlyphSlot  glyph,
+                      FT_Size       size,
+                      FT_UInt       glyph_index,
+                      FT_Int32      load_flags )
+  {
+    FT_Error         error;
+    T42_GlyphSlot    t42slot = (T42_GlyphSlot)glyph;
+    T42_Size         t42size = (T42_Size)size;
+    FT_Driver_Class  ttclazz = ((T42_Driver)glyph->face->driver)->ttclazz;
+
+
+    t42_glyphslot_clear( t42slot->ttslot );
+    error = ttclazz->load_glyph( t42slot->ttslot,
+                                 t42size->ttsize,
+                                 glyph_index,
+                                 load_flags | FT_LOAD_NO_BITMAP );
+
+    if ( !error )
+    {
+      glyph->metrics = t42slot->ttslot->metrics;
+
+      glyph->linearHoriAdvance = t42slot->ttslot->linearHoriAdvance;
+      glyph->linearVertAdvance = t42slot->ttslot->linearVertAdvance;
+
+      glyph->format  = t42slot->ttslot->format;
+      glyph->outline = t42slot->ttslot->outline;
+
+      glyph->bitmap      = t42slot->ttslot->bitmap;
+      glyph->bitmap_left = t42slot->ttslot->bitmap_left;
+      glyph->bitmap_top  = t42slot->ttslot->bitmap_top;
+
+      glyph->num_subglyphs = t42slot->ttslot->num_subglyphs;
+      glyph->subglyphs     = t42slot->ttslot->subglyphs;
+
+      glyph->control_data  = t42slot->ttslot->control_data;
+      glyph->control_len   = t42slot->ttslot->control_len;
+    }
+
+    return error;
+  }
+
+
+/* END */
diff --git a/src/type42/t42objs.h b/src/type42/t42objs.h
new file mode 100644 (file)
index 0000000..02d1325
--- /dev/null
@@ -0,0 +1,124 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t42objs.h                                                              */
+/*                                                                         */
+/*    Type 42 objects manager (specification).                             */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2006, 2007, 2011 by Roberto Alameda.             */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T42OBJS_H__
+#define __T42OBJS_H__
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_TYPE1_TABLES_H
+#include FT_INTERNAL_TYPE1_TYPES_H
+#include "t42types.h"
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_DRIVER_H
+#include FT_SERVICE_POSTSCRIPT_CMAPS_H
+#include FT_INTERNAL_POSTSCRIPT_HINTS_H
+
+
+FT_BEGIN_HEADER
+
+
+  /* Type42 size */
+  typedef struct  T42_SizeRec_
+  {
+    FT_SizeRec  root;
+    FT_Size     ttsize;
+
+  } T42_SizeRec, *T42_Size;
+
+
+  /* Type42 slot */
+  typedef struct  T42_GlyphSlotRec_
+  {
+    FT_GlyphSlotRec  root;
+    FT_GlyphSlot     ttslot;
+
+  } T42_GlyphSlotRec, *T42_GlyphSlot;
+
+
+  /* Type 42 driver */
+  typedef struct  T42_DriverRec_
+  {
+    FT_DriverRec     root;
+    FT_Driver_Class  ttclazz;
+    void*            extension_component;
+
+  } T42_DriverRec, *T42_Driver;
+
+
+  /* */
+
+
+  FT_LOCAL( FT_Error )
+  T42_Face_Init( FT_Stream      stream,
+                 FT_Face        face,
+                 FT_Int         face_index,
+                 FT_Int         num_params,
+                 FT_Parameter*  params );
+
+
+  FT_LOCAL( void )
+  T42_Face_Done( FT_Face  face );
+
+
+  FT_LOCAL( FT_Error )
+  T42_Size_Init( FT_Size  size );
+
+
+  FT_LOCAL( FT_Error )
+  T42_Size_Request( FT_Size          size,
+                    FT_Size_Request  req );
+
+
+  FT_LOCAL( FT_Error )
+  T42_Size_Select( FT_Size   size,
+                   FT_ULong  strike_index );
+
+
+  FT_LOCAL( void )
+  T42_Size_Done( FT_Size  size );
+
+
+  FT_LOCAL( FT_Error )
+  T42_GlyphSlot_Init( FT_GlyphSlot  slot );
+
+
+  FT_LOCAL( FT_Error )
+  T42_GlyphSlot_Load( FT_GlyphSlot  glyph,
+                      FT_Size       size,
+                      FT_UInt       glyph_index,
+                      FT_Int32      load_flags );
+
+  FT_LOCAL( void )
+  T42_GlyphSlot_Done( FT_GlyphSlot  slot );
+
+
+  FT_LOCAL( FT_Error )
+  T42_Driver_Init( FT_Module  module );
+
+  FT_LOCAL( void )
+  T42_Driver_Done( FT_Module  module );
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __T42OBJS_H__ */
+
+
+/* END */
diff --git a/src/type42/t42parse.c b/src/type42/t42parse.c
new file mode 100644 (file)
index 0000000..468b463
--- /dev/null
@@ -0,0 +1,1188 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t42parse.c                                                             */
+/*                                                                         */
+/*    Type 42 font parser (body).                                          */
+/*                                                                         */
+/*  Copyright 2002-2012 by                                                 */
+/*  Roberto Alameda.                                                       */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "t42parse.h"
+#include "t42error.h"
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_t42
+
+
+  static void
+  t42_parse_font_matrix( T42_Face    face,
+                         T42_Loader  loader );
+  static void
+  t42_parse_encoding( T42_Face    face,
+                      T42_Loader  loader );
+
+  static void
+  t42_parse_charstrings( T42_Face    face,
+                         T42_Loader  loader );
+
+  static void
+  t42_parse_sfnts( T42_Face    face,
+                   T42_Loader  loader );
+
+
+  /* as Type42 fonts have no Private dict,         */
+  /* we set the last argument of T1_FIELD_XXX to 0 */
+  static const
+  T1_FieldRec  t42_keywords[] =
+  {
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  T1_FontInfo
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FONT_INFO
+
+    T1_FIELD_STRING( "version",            version,             0 )
+    T1_FIELD_STRING( "Notice",             notice,              0 )
+    T1_FIELD_STRING( "FullName",           full_name,           0 )
+    T1_FIELD_STRING( "FamilyName",         family_name,         0 )
+    T1_FIELD_STRING( "Weight",             weight,              0 )
+    T1_FIELD_NUM   ( "ItalicAngle",        italic_angle,        0 )
+    T1_FIELD_BOOL  ( "isFixedPitch",       is_fixed_pitch,      0 )
+    T1_FIELD_NUM   ( "UnderlinePosition",  underline_position,  0 )
+    T1_FIELD_NUM   ( "UnderlineThickness", underline_thickness, 0 )
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  PS_FontExtraRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FONT_EXTRA
+
+    T1_FIELD_NUM   ( "FSType",             fs_type,             0 )
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  T1_FontRec
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_FONT_DICT
+
+    T1_FIELD_KEY  ( "FontName",    font_name,    0 )
+    T1_FIELD_NUM  ( "PaintType",   paint_type,   0 )
+    T1_FIELD_NUM  ( "FontType",    font_type,    0 )
+    T1_FIELD_FIXED( "StrokeWidth", stroke_width, 0 )
+
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  FT_BBox
+#undef  T1CODE
+#define T1CODE        T1_FIELD_LOCATION_BBOX
+
+    T1_FIELD_BBOX("FontBBox", xMin, 0 )
+
+    T1_FIELD_CALLBACK( "FontMatrix",  t42_parse_font_matrix, 0 )
+    T1_FIELD_CALLBACK( "Encoding",    t42_parse_encoding,    0 )
+    T1_FIELD_CALLBACK( "CharStrings", t42_parse_charstrings, 0 )
+    T1_FIELD_CALLBACK( "sfnts",       t42_parse_sfnts,       0 )
+
+    { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }
+  };
+
+
+#define T1_Add_Table( p, i, o, l )  (p)->funcs.add( (p), i, o, l )
+#define T1_Done_Table( p )          \
+          do                        \
+          {                         \
+            if ( (p)->funcs.done )  \
+              (p)->funcs.done( p ); \
+          } while ( 0 )
+#define T1_Release_Table( p )          \
+          do                           \
+          {                            \
+            if ( (p)->funcs.release )  \
+              (p)->funcs.release( p ); \
+          } while ( 0 )
+
+#define T1_Skip_Spaces( p )    (p)->root.funcs.skip_spaces( &(p)->root )
+#define T1_Skip_PS_Token( p )  (p)->root.funcs.skip_PS_token( &(p)->root )
+
+#define T1_ToInt( p )                          \
+          (p)->root.funcs.to_int( &(p)->root )
+#define T1_ToBytes( p, b, m, n, d )                          \
+          (p)->root.funcs.to_bytes( &(p)->root, b, m, n, d )
+
+#define T1_ToFixedArray( p, m, f, t )                           \
+          (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t )
+#define T1_ToToken( p, t )                          \
+          (p)->root.funcs.to_token( &(p)->root, t )
+
+#define T1_Load_Field( p, f, o, m, pf )                         \
+          (p)->root.funcs.load_field( &(p)->root, f, o, m, pf )
+#define T1_Load_Field_Table( p, f, o, m, pf )                         \
+          (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf )
+
+
+  /********************* Parsing Functions ******************/
+
+  FT_LOCAL_DEF( FT_Error )
+  t42_parser_init( T42_Parser     parser,
+                   FT_Stream      stream,
+                   FT_Memory      memory,
+                   PSAux_Service  psaux )
+  {
+    FT_Error  error = T42_Err_Ok;
+    FT_Long   size;
+
+
+    psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory );
+
+    parser->stream    = stream;
+    parser->base_len  = 0;
+    parser->base_dict = 0;
+    parser->in_memory = 0;
+
+    /*******************************************************************/
+    /*                                                                 */
+    /* Here a short summary of what is going on:                       */
+    /*                                                                 */
+    /*   When creating a new Type 42 parser, we try to locate and load */
+    /*   the base dictionary, loading the whole font into memory.      */
+    /*                                                                 */
+    /*   When `loading' the base dictionary, we only set up pointers   */
+    /*   in the case of a memory-based stream.  Otherwise, we allocate */
+    /*   and load the base dictionary in it.                           */
+    /*                                                                 */
+    /*   parser->in_memory is set if we have a memory stream.          */
+    /*                                                                 */
+
+    if ( FT_STREAM_SEEK( 0L ) ||
+         FT_FRAME_ENTER( 17 ) )
+      goto Exit;
+
+    if ( ft_memcmp( stream->cursor, "%!PS-TrueTypeFont", 17 ) != 0 )
+    {
+      FT_TRACE2(( "  not a Type42 font\n" ));
+      error = T42_Err_Unknown_File_Format;
+    }
+
+    FT_FRAME_EXIT();
+
+    if ( error || FT_STREAM_SEEK( 0 ) )
+      goto Exit;
+
+    size = stream->size;
+
+    /* now, try to load `size' bytes of the `base' dictionary we */
+    /* found previously                                          */
+
+    /* if it is a memory-based resource, set up pointers */
+    if ( !stream->read )
+    {
+      parser->base_dict = (FT_Byte*)stream->base + stream->pos;
+      parser->base_len  = size;
+      parser->in_memory = 1;
+
+      /* check that the `size' field is valid */
+      if ( FT_STREAM_SKIP( size ) )
+        goto Exit;
+    }
+    else
+    {
+      /* read segment in memory */
+      if ( FT_ALLOC( parser->base_dict, size )       ||
+           FT_STREAM_READ( parser->base_dict, size ) )
+        goto Exit;
+
+      parser->base_len = size;
+    }
+
+    parser->root.base   = parser->base_dict;
+    parser->root.cursor = parser->base_dict;
+    parser->root.limit  = parser->root.cursor + parser->base_len;
+
+  Exit:
+    if ( error && !parser->in_memory )
+      FT_FREE( parser->base_dict );
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  t42_parser_done( T42_Parser  parser )
+  {
+    FT_Memory  memory = parser->root.memory;
+
+
+    /* free the base dictionary only when we have a disk stream */
+    if ( !parser->in_memory )
+      FT_FREE( parser->base_dict );
+
+    parser->root.funcs.done( &parser->root );
+  }
+
+
+  static int
+  t42_is_space( FT_Byte  c )
+  {
+    return ( c == ' '  || c == '\t'              ||
+             c == '\r' || c == '\n' || c == '\f' ||
+             c == '\0'                           );
+  }
+
+
+  static void
+  t42_parse_font_matrix( T42_Face    face,
+                         T42_Loader  loader )
+  {
+    T42_Parser  parser = &loader->parser;
+    FT_Matrix*  matrix = &face->type1.font_matrix;
+    FT_Vector*  offset = &face->type1.font_offset;
+    FT_Face     root   = (FT_Face)&face->root;
+    FT_Fixed    temp[6];
+    FT_Fixed    temp_scale;
+
+
+    (void)T1_ToFixedArray( parser, 6, temp, 3 );
+
+    temp_scale = FT_ABS( temp[3] );
+
+    /* Set Units per EM based on FontMatrix values.  We set the value to */
+    /* 1000 / temp_scale, because temp_scale was already multiplied by   */
+    /* 1000 (in t1_tofixed, from psobjs.c).                              */
+
+    root->units_per_EM = (FT_UShort)( FT_DivFix( 1000 * 0x10000L,
+                                                 temp_scale ) >> 16 );
+
+    /* we need to scale the values by 1.0/temp_scale */
+    if ( temp_scale != 0x10000L )
+    {
+      temp[0] = FT_DivFix( temp[0], temp_scale );
+      temp[1] = FT_DivFix( temp[1], temp_scale );
+      temp[2] = FT_DivFix( temp[2], temp_scale );
+      temp[4] = FT_DivFix( temp[4], temp_scale );
+      temp[5] = FT_DivFix( temp[5], temp_scale );
+      temp[3] = 0x10000L;
+    }
+
+    matrix->xx = temp[0];
+    matrix->yx = temp[1];
+    matrix->xy = temp[2];
+    matrix->yy = temp[3];
+
+    /* note that the offsets must be expressed in integer font units */
+    offset->x = temp[4] >> 16;
+    offset->y = temp[5] >> 16;
+  }
+
+
+  static void
+  t42_parse_encoding( T42_Face    face,
+                      T42_Loader  loader )
+  {
+    T42_Parser  parser = &loader->parser;
+    FT_Byte*    cur;
+    FT_Byte*    limit  = parser->root.limit;
+
+    PSAux_Service  psaux  = (PSAux_Service)face->psaux;
+
+
+    T1_Skip_Spaces( parser );
+    cur = parser->root.cursor;
+    if ( cur >= limit )
+    {
+      FT_ERROR(( "t42_parse_encoding: out of bounds\n" ));
+      parser->root.error = T42_Err_Invalid_File_Format;
+      return;
+    }
+
+    /* if we have a number or `[', the encoding is an array, */
+    /* and we must load it now                               */
+    if ( ft_isdigit( *cur ) || *cur == '[' )
+    {
+      T1_Encoding  encode          = &face->type1.encoding;
+      FT_UInt      count, n;
+      PS_Table     char_table      = &loader->encoding_table;
+      FT_Memory    memory          = parser->root.memory;
+      FT_Error     error;
+      FT_Bool      only_immediates = 0;
+
+
+      /* read the number of entries in the encoding; should be 256 */
+      if ( *cur == '[' )
+      {
+        count           = 256;
+        only_immediates = 1;
+        parser->root.cursor++;
+      }
+      else
+        count = (FT_UInt)T1_ToInt( parser );
+
+      T1_Skip_Spaces( parser );
+      if ( parser->root.cursor >= limit )
+        return;
+
+      /* we use a T1_Table to store our charnames */
+      loader->num_chars = encode->num_chars = count;
+      if ( FT_NEW_ARRAY( encode->char_index, count )     ||
+           FT_NEW_ARRAY( encode->char_name,  count )     ||
+           FT_SET_ERROR( psaux->ps_table_funcs->init(
+                           char_table, count, memory ) ) )
+      {
+        parser->root.error = error;
+        return;
+      }
+
+      /* We need to `zero' out encoding_table.elements */
+      for ( n = 0; n < count; n++ )
+      {
+        char*  notdef = (char *)".notdef";
+
+
+        T1_Add_Table( char_table, n, notdef, 8 );
+      }
+
+      /* Now we need to read records of the form                */
+      /*                                                        */
+      /*   ... charcode /charname ...                           */
+      /*                                                        */
+      /* for each entry in our table.                           */
+      /*                                                        */
+      /* We simply look for a number followed by an immediate   */
+      /* name.  Note that this ignores correctly the sequence   */
+      /* that is often seen in type42 fonts:                    */
+      /*                                                        */
+      /*   0 1 255 { 1 index exch /.notdef put } for dup        */
+      /*                                                        */
+      /* used to clean the encoding array before anything else. */
+      /*                                                        */
+      /* Alternatively, if the array is directly given as       */
+      /*                                                        */
+      /*   /Encoding [ ... ]                                    */
+      /*                                                        */
+      /* we only read immediates.                               */
+
+      n = 0;
+      T1_Skip_Spaces( parser );
+
+      while ( parser->root.cursor < limit )
+      {
+        cur = parser->root.cursor;
+
+        /* we stop when we encounter `def' or `]' */
+        if ( *cur == 'd' && cur + 3 < limit )
+        {
+          if ( cur[1] == 'e'          &&
+               cur[2] == 'f'          &&
+               t42_is_space( cur[3] ) )
+          {
+            FT_TRACE6(( "encoding end\n" ));
+            cur += 3;
+            break;
+          }
+        }
+        if ( *cur == ']' )
+        {
+          FT_TRACE6(( "encoding end\n" ));
+          cur++;
+          break;
+        }
+
+        /* check whether we have found an entry */
+        if ( ft_isdigit( *cur ) || only_immediates )
+        {
+          FT_Int  charcode;
+
+
+          if ( only_immediates )
+            charcode = n;
+          else
+          {
+            charcode = (FT_Int)T1_ToInt( parser );
+            T1_Skip_Spaces( parser );
+          }
+
+          cur = parser->root.cursor;
+
+          if ( *cur == '/' && cur + 2 < limit && n < count )
+          {
+            FT_PtrDist  len;
+
+
+            cur++;
+
+            parser->root.cursor = cur;
+            T1_Skip_PS_Token( parser );
+            if ( parser->root.error )
+              return;
+
+            len = parser->root.cursor - cur;
+
+            parser->root.error = T1_Add_Table( char_table, charcode,
+                                               cur, len + 1 );
+            if ( parser->root.error )
+              return;
+            char_table->elements[charcode][len] = '\0';
+
+            n++;
+          }
+        }
+        else
+        {
+          T1_Skip_PS_Token( parser );
+          if ( parser->root.error )
+            return;
+        }
+
+        T1_Skip_Spaces( parser );
+      }
+
+      face->type1.encoding_type  = T1_ENCODING_TYPE_ARRAY;
+      parser->root.cursor        = cur;
+    }
+
+    /* Otherwise, we should have either `StandardEncoding', */
+    /* `ExpertEncoding', or `ISOLatin1Encoding'             */
+    else
+    {
+      if ( cur + 17 < limit                                            &&
+           ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 )
+        face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD;
+
+      else if ( cur + 15 < limit                                          &&
+                ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 )
+        face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT;
+
+      else if ( cur + 18 < limit                                             &&
+                ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 )
+        face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1;
+
+      else
+      {
+        FT_ERROR(( "t42_parse_encoding: invalid token\n" ));
+        parser->root.error = T42_Err_Invalid_File_Format;
+      }
+    }
+  }
+
+
+  typedef enum  T42_Load_Status_
+  {
+    BEFORE_START,
+    BEFORE_TABLE_DIR,
+    OTHER_TABLES
+
+  } T42_Load_Status;
+
+
+  static void
+  t42_parse_sfnts( T42_Face    face,
+                   T42_Loader  loader )
+  {
+    T42_Parser  parser = &loader->parser;
+    FT_Memory   memory = parser->root.memory;
+    FT_Byte*    cur;
+    FT_Byte*    limit  = parser->root.limit;
+    FT_Error    error;
+    FT_Int      num_tables = 0;
+    FT_ULong    count, ttf_size = 0;
+
+    FT_Long     n, string_size, old_string_size, real_size;
+    FT_Byte*    string_buf = NULL;
+    FT_Bool     allocated  = 0;
+
+    T42_Load_Status  status;
+
+
+    /* The format is                                */
+    /*                                              */
+    /*   /sfnts [ <hexstring> <hexstring> ... ] def */
+    /*                                              */
+    /* or                                           */
+    /*                                              */
+    /*   /sfnts [                                   */
+    /*      <num_bin_bytes> RD <binary data>        */
+    /*      <num_bin_bytes> RD <binary data>        */
+    /*      ...                                     */
+    /*   ] def                                      */
+    /*                                              */
+    /* with exactly one space after the `RD' token. */
+
+    T1_Skip_Spaces( parser );
+
+    if ( parser->root.cursor >= limit || *parser->root.cursor++ != '[' )
+    {
+      FT_ERROR(( "t42_parse_sfnts: can't find begin of sfnts vector\n" ));
+      error = T42_Err_Invalid_File_Format;
+      goto Fail;
+    }
+
+    T1_Skip_Spaces( parser );
+    status          = BEFORE_START;
+    string_size     = 0;
+    old_string_size = 0;
+    count           = 0;
+
+    while ( parser->root.cursor < limit )
+    {
+      cur = parser->root.cursor;
+
+      if ( *cur == ']' )
+      {
+        parser->root.cursor++;
+        goto Exit;
+      }
+
+      else if ( *cur == '<' )
+      {
+        T1_Skip_PS_Token( parser );
+        if ( parser->root.error )
+          goto Exit;
+
+        /* don't include delimiters */
+        string_size = (FT_Long)( ( parser->root.cursor - cur - 2 + 1 ) / 2 );
+        if ( FT_REALLOC( string_buf, old_string_size, string_size ) )
+          goto Fail;
+
+        allocated = 1;
+
+        parser->root.cursor = cur;
+        (void)T1_ToBytes( parser, string_buf, string_size, &real_size, 1 );
+        old_string_size = string_size;
+        string_size = real_size;
+      }
+
+      else if ( ft_isdigit( *cur ) )
+      {
+        if ( allocated )
+        {
+          FT_ERROR(( "t42_parse_sfnts: "
+                     "can't handle mixed binary and hex strings\n" ));
+          error = T42_Err_Invalid_File_Format;
+          goto Fail;
+        }
+
+        string_size = T1_ToInt( parser );
+        if ( string_size < 0 )
+        {
+          FT_ERROR(( "t42_parse_sfnts: invalid string size\n" ));
+          error = T42_Err_Invalid_File_Format;
+          goto Fail;
+        }
+
+        T1_Skip_PS_Token( parser );             /* `RD' */
+        if ( parser->root.error )
+          return;
+
+        string_buf = parser->root.cursor + 1;   /* one space after `RD' */
+
+        if ( limit - parser->root.cursor < string_size )
+        {
+          FT_ERROR(( "t42_parse_sfnts: too many binary data\n" ));
+          error = T42_Err_Invalid_File_Format;
+          goto Fail;
+        }
+        else
+          parser->root.cursor += string_size + 1;
+      }
+
+      if ( !string_buf )
+      {
+        FT_ERROR(( "t42_parse_sfnts: invalid data in sfnts array\n" ));
+        error = T42_Err_Invalid_File_Format;
+        goto Fail;
+      }
+
+      /* A string can have a trailing zero (odd) byte for padding. */
+      /* Ignore it.                                                */
+      if ( ( string_size & 1 ) && string_buf[string_size - 1] == 0 )
+        string_size--;
+
+      if ( !string_size )
+      {
+        FT_ERROR(( "t42_parse_sfnts: invalid string\n" ));
+        error = T42_Err_Invalid_File_Format;
+        goto Fail;
+      }
+
+      for ( n = 0; n < string_size; n++ )
+      {
+        switch ( status )
+        {
+        case BEFORE_START:
+          /* load offset table, 12 bytes */
+          if ( count < 12 )
+          {
+            face->ttf_data[count++] = string_buf[n];
+            continue;
+          }
+          else
+          {
+            num_tables = 16 * face->ttf_data[4] + face->ttf_data[5];
+            status     = BEFORE_TABLE_DIR;
+            ttf_size   = 12 + 16 * num_tables;
+
+            if ( FT_REALLOC( face->ttf_data, 12, ttf_size ) )
+              goto Fail;
+          }
+          /* fall through */
+
+        case BEFORE_TABLE_DIR:
+          /* the offset table is read; read the table directory */
+          if ( count < ttf_size )
+          {
+            face->ttf_data[count++] = string_buf[n];
+            continue;
+          }
+          else
+          {
+            int       i;
+            FT_ULong  len;
+
+
+            for ( i = 0; i < num_tables; i++ )
+            {
+              FT_Byte*  p = face->ttf_data + 12 + 16 * i + 12;
+
+
+              len = FT_PEEK_ULONG( p );
+
+              /* Pad to a 4-byte boundary length */
+              ttf_size += ( len + 3 ) & ~3;
+            }
+
+            status         = OTHER_TABLES;
+            face->ttf_size = ttf_size;
+
+            /* there are no more than 256 tables, so no size check here */
+            if ( FT_REALLOC( face->ttf_data, 12 + 16 * num_tables,
+                             ttf_size + 1 ) )
+              goto Fail;
+          }
+          /* fall through */
+
+        case OTHER_TABLES:
+          /* all other tables are just copied */
+          if ( count >= ttf_size )
+          {
+            FT_ERROR(( "t42_parse_sfnts: too many binary data\n" ));
+            error = T42_Err_Invalid_File_Format;
+            goto Fail;
+          }
+          face->ttf_data[count++] = string_buf[n];
+        }
+      }
+
+      T1_Skip_Spaces( parser );
+    }
+
+    /* if control reaches this point, the format was not valid */
+    error = T42_Err_Invalid_File_Format;
+
+  Fail:
+    parser->root.error = error;
+
+  Exit:
+    if ( allocated )
+      FT_FREE( string_buf );
+  }
+
+
+  static void
+  t42_parse_charstrings( T42_Face    face,
+                         T42_Loader  loader )
+  {
+    T42_Parser     parser       = &loader->parser;
+    PS_Table       code_table   = &loader->charstrings;
+    PS_Table       name_table   = &loader->glyph_names;
+    PS_Table       swap_table   = &loader->swap_table;
+    FT_Memory      memory       = parser->root.memory;
+    FT_Error       error;
+
+    PSAux_Service  psaux        = (PSAux_Service)face->psaux;
+
+    FT_Byte*       cur;
+    FT_Byte*       limit        = parser->root.limit;
+    FT_UInt        n;
+    FT_UInt        notdef_index = 0;
+    FT_Byte        notdef_found = 0;
+
+
+    T1_Skip_Spaces( parser );
+
+    if ( parser->root.cursor >= limit )
+    {
+      FT_ERROR(( "t42_parse_charstrings: out of bounds\n" ));
+      error = T42_Err_Invalid_File_Format;
+      goto Fail;
+    }
+
+    if ( ft_isdigit( *parser->root.cursor ) )
+    {
+      loader->num_glyphs = (FT_UInt)T1_ToInt( parser );
+      if ( parser->root.error )
+        return;
+    }
+    else if ( *parser->root.cursor == '<' )
+    {
+      /* We have `<< ... >>'.  Count the number of `/' in the dictionary */
+      /* to get its size.                                                */
+      FT_UInt  count = 0;
+
+
+      T1_Skip_PS_Token( parser );
+      if ( parser->root.error )
+        return;
+      T1_Skip_Spaces( parser );
+      cur = parser->root.cursor;
+
+      while ( parser->root.cursor < limit )
+      {
+        if ( *parser->root.cursor == '/' )
+          count++;
+        else if ( *parser->root.cursor == '>' )
+        {
+          loader->num_glyphs  = count;
+          parser->root.cursor = cur;        /* rewind */
+          break;
+        }
+        T1_Skip_PS_Token( parser );
+        if ( parser->root.error )
+          return;
+        T1_Skip_Spaces( parser );
+      }
+    }
+    else
+    {
+      FT_ERROR(( "t42_parse_charstrings: invalid token\n" ));
+      error = T42_Err_Invalid_File_Format;
+      goto Fail;
+    }
+
+    if ( parser->root.cursor >= limit )
+    {
+      FT_ERROR(( "t42_parse_charstrings: out of bounds\n" ));
+      error = T42_Err_Invalid_File_Format;
+      goto Fail;
+    }
+
+    /* initialize tables */
+
+    error = psaux->ps_table_funcs->init( code_table,
+                                         loader->num_glyphs,
+                                         memory );
+    if ( error )
+      goto Fail;
+
+    error = psaux->ps_table_funcs->init( name_table,
+                                         loader->num_glyphs,
+                                         memory );
+    if ( error )
+      goto Fail;
+
+    /* Initialize table for swapping index notdef_index and */
+    /* index 0 names and codes (if necessary).              */
+
+    error = psaux->ps_table_funcs->init( swap_table, 4, memory );
+    if ( error )
+      goto Fail;
+
+    n = 0;
+
+    for (;;)
+    {
+      /* The format is simple:                   */
+      /*   `/glyphname' + index [+ def]          */
+
+      T1_Skip_Spaces( parser );
+
+      cur = parser->root.cursor;
+      if ( cur >= limit )
+        break;
+
+      /* We stop when we find an `end' keyword or '>' */
+      if ( *cur   == 'e'          &&
+           cur + 3 < limit        &&
+           cur[1] == 'n'          &&
+           cur[2] == 'd'          &&
+           t42_is_space( cur[3] ) )
+        break;
+      if ( *cur == '>' )
+        break;
+
+      T1_Skip_PS_Token( parser );
+      if ( parser->root.error )
+        return;
+
+      if ( *cur == '/' )
+      {
+        FT_PtrDist  len;
+
+
+        if ( cur + 1 >= limit )
+        {
+          FT_ERROR(( "t42_parse_charstrings: out of bounds\n" ));
+          error = T42_Err_Invalid_File_Format;
+          goto Fail;
+        }
+
+        cur++;                              /* skip `/' */
+        len = parser->root.cursor - cur;
+
+        error = T1_Add_Table( name_table, n, cur, len + 1 );
+        if ( error )
+          goto Fail;
+
+        /* add a trailing zero to the name table */
+        name_table->elements[n][len] = '\0';
+
+        /* record index of /.notdef */
+        if ( *cur == '.'                                              &&
+             ft_strcmp( ".notdef",
+                        (const char*)(name_table->elements[n]) ) == 0 )
+        {
+          notdef_index = n;
+          notdef_found = 1;
+        }
+
+        T1_Skip_Spaces( parser );
+
+        cur = parser->root.cursor;
+
+        (void)T1_ToInt( parser );
+        if ( parser->root.cursor >= limit )
+        {
+          FT_ERROR(( "t42_parse_charstrings: out of bounds\n" ));
+          error = T42_Err_Invalid_File_Format;
+          goto Fail;
+        }
+
+        len = parser->root.cursor - cur;
+
+        error = T1_Add_Table( code_table, n, cur, len + 1 );
+        if ( error )
+          goto Fail;
+
+        code_table->elements[n][len] = '\0';
+
+        n++;
+        if ( n >= loader->num_glyphs )
+          break;
+      }
+    }
+
+    loader->num_glyphs = n;
+
+    if ( !notdef_found )
+    {
+      FT_ERROR(( "t42_parse_charstrings: no /.notdef glyph\n" ));
+      error = T42_Err_Invalid_File_Format;
+      goto Fail;
+    }
+
+    /* if /.notdef does not occupy index 0, do our magic. */
+    if ( ft_strcmp( (const char*)".notdef",
+                    (const char*)name_table->elements[0] ) )
+    {
+      /* Swap glyph in index 0 with /.notdef glyph.  First, add index 0  */
+      /* name and code entries to swap_table.  Then place notdef_index   */
+      /* name and code entries into swap_table.  Then swap name and code */
+      /* entries at indices notdef_index and 0 using values stored in    */
+      /* swap_table.                                                     */
+
+      /* Index 0 name */
+      error = T1_Add_Table( swap_table, 0,
+                            name_table->elements[0],
+                            name_table->lengths [0] );
+      if ( error )
+        goto Fail;
+
+      /* Index 0 code */
+      error = T1_Add_Table( swap_table, 1,
+                            code_table->elements[0],
+                            code_table->lengths [0] );
+      if ( error )
+        goto Fail;
+
+      /* Index notdef_index name */
+      error = T1_Add_Table( swap_table, 2,
+                            name_table->elements[notdef_index],
+                            name_table->lengths [notdef_index] );
+      if ( error )
+        goto Fail;
+
+      /* Index notdef_index code */
+      error = T1_Add_Table( swap_table, 3,
+                            code_table->elements[notdef_index],
+                            code_table->lengths [notdef_index] );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( name_table, notdef_index,
+                            swap_table->elements[0],
+                            swap_table->lengths [0] );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( code_table, notdef_index,
+                            swap_table->elements[1],
+                            swap_table->lengths [1] );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( name_table, 0,
+                            swap_table->elements[2],
+                            swap_table->lengths [2] );
+      if ( error )
+        goto Fail;
+
+      error = T1_Add_Table( code_table, 0,
+                            swap_table->elements[3],
+                            swap_table->lengths [3] );
+      if ( error )
+        goto Fail;
+
+    }
+
+    return;
+
+  Fail:
+    parser->root.error = error;
+  }
+
+
+  static FT_Error
+  t42_load_keyword( T42_Face    face,
+                    T42_Loader  loader,
+                    T1_Field    field )
+  {
+    FT_Error  error;
+    void*     dummy_object;
+    void**    objects;
+    FT_UInt   max_objects = 0;
+
+
+    /* if the keyword has a dedicated callback, call it */
+    if ( field->type == T1_FIELD_TYPE_CALLBACK )
+    {
+      field->reader( (FT_Face)face, loader );
+      error = loader->parser.root.error;
+      goto Exit;
+    }
+
+    /* now the keyword is either a simple field or a table of fields; */
+    /* we are now going to take care of it                            */
+
+    switch ( field->location )
+    {
+    case T1_FIELD_LOCATION_FONT_INFO:
+      dummy_object = &face->type1.font_info;
+      break;
+
+    case T1_FIELD_LOCATION_FONT_EXTRA:
+      dummy_object = &face->type1.font_extra;
+      break;
+
+    case T1_FIELD_LOCATION_BBOX:
+      dummy_object = &face->type1.font_bbox;
+      break;
+
+    default:
+      dummy_object = &face->type1;
+    }
+
+    objects = &dummy_object;
+
+    if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY ||
+         field->type == T1_FIELD_TYPE_FIXED_ARRAY   )
+      error = T1_Load_Field_Table( &loader->parser, field,
+                                   objects, max_objects, 0 );
+    else
+      error = T1_Load_Field( &loader->parser, field,
+                             objects, max_objects, 0 );
+
+   Exit:
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  t42_parse_dict( T42_Face    face,
+                  T42_Loader  loader,
+                  FT_Byte*    base,
+                  FT_Long     size )
+  {
+    T42_Parser  parser     = &loader->parser;
+    FT_Byte*    limit;
+    FT_Int      n_keywords = (FT_Int)( sizeof ( t42_keywords ) /
+                                         sizeof ( t42_keywords[0] ) );
+
+
+    parser->root.cursor = base;
+    parser->root.limit  = base + size;
+    parser->root.error  = T42_Err_Ok;
+
+    limit = parser->root.limit;
+
+    T1_Skip_Spaces( parser );
+
+    while ( parser->root.cursor < limit )
+    {
+      FT_Byte*  cur;
+
+
+      cur = parser->root.cursor;
+
+      /* look for `FontDirectory' which causes problems for some fonts */
+      if ( *cur == 'F' && cur + 25 < limit                    &&
+           ft_strncmp( (char*)cur, "FontDirectory", 13 ) == 0 )
+      {
+        FT_Byte*  cur2;
+
+
+        /* skip the `FontDirectory' keyword */
+        T1_Skip_PS_Token( parser );
+        T1_Skip_Spaces  ( parser );
+        cur = cur2 = parser->root.cursor;
+
+        /* look up the `known' keyword */
+        while ( cur < limit )
+        {
+          if ( *cur == 'k' && cur + 5 < limit             &&
+                ft_strncmp( (char*)cur, "known", 5 ) == 0 )
+            break;
+
+          T1_Skip_PS_Token( parser );
+          if ( parser->root.error )
+            goto Exit;
+          T1_Skip_Spaces  ( parser );
+          cur = parser->root.cursor;
+        }
+
+        if ( cur < limit )
+        {
+          T1_TokenRec  token;
+
+
+          /* skip the `known' keyword and the token following it */
+          T1_Skip_PS_Token( parser );
+          T1_ToToken( parser, &token );
+
+          /* if the last token was an array, skip it! */
+          if ( token.type == T1_TOKEN_TYPE_ARRAY )
+            cur2 = parser->root.cursor;
+        }
+        parser->root.cursor = cur2;
+      }
+
+      /* look for immediates */
+      else if ( *cur == '/' && cur + 2 < limit )
+      {
+        FT_PtrDist  len;
+
+
+        cur++;
+
+        parser->root.cursor = cur;
+        T1_Skip_PS_Token( parser );
+        if ( parser->root.error )
+          goto Exit;
+
+        len = parser->root.cursor - cur;
+
+        if ( len > 0 && len < 22 && parser->root.cursor < limit )
+        {
+          int  i;
+
+
+          /* now compare the immediate name to the keyword table */
+
+          /* loop through all known keywords */
+          for ( i = 0; i < n_keywords; i++ )
+          {
+            T1_Field  keyword = (T1_Field)&t42_keywords[i];
+            FT_Byte   *name   = (FT_Byte*)keyword->ident;
+
+
+            if ( !name )
+              continue;
+
+            if ( cur[0] == name[0]                                  &&
+                 len == (FT_PtrDist)ft_strlen( (const char *)name ) &&
+                 ft_memcmp( cur, name, len ) == 0                   )
+            {
+              /* we found it -- run the parsing callback! */
+              parser->root.error = t42_load_keyword( face,
+                                                     loader,
+                                                     keyword );
+              if ( parser->root.error )
+                return parser->root.error;
+              break;
+            }
+          }
+        }
+      }
+      else
+      {
+        T1_Skip_PS_Token( parser );
+        if ( parser->root.error )
+          goto Exit;
+      }
+
+      T1_Skip_Spaces( parser );
+    }
+
+  Exit:
+    return parser->root.error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  t42_loader_init( T42_Loader  loader,
+                   T42_Face    face )
+  {
+    FT_UNUSED( face );
+
+    FT_MEM_ZERO( loader, sizeof ( *loader ) );
+    loader->num_glyphs = 0;
+    loader->num_chars  = 0;
+
+    /* initialize the tables -- simply set their `init' field to 0 */
+    loader->encoding_table.init = 0;
+    loader->charstrings.init    = 0;
+    loader->glyph_names.init    = 0;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  t42_loader_done( T42_Loader  loader )
+  {
+    T42_Parser  parser = &loader->parser;
+
+
+    /* finalize tables */
+    T1_Release_Table( &loader->encoding_table );
+    T1_Release_Table( &loader->charstrings );
+    T1_Release_Table( &loader->glyph_names );
+    T1_Release_Table( &loader->swap_table );
+
+    /* finalize parser */
+    t42_parser_done( parser );
+  }
+
+
+/* END */
diff --git a/src/type42/t42parse.h b/src/type42/t42parse.h
new file mode 100644 (file)
index 0000000..f77ec4a
--- /dev/null
@@ -0,0 +1,90 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t42parse.h                                                             */
+/*                                                                         */
+/*    Type 42 font parser (specification).                                 */
+/*                                                                         */
+/*  Copyright 2002, 2003 by Roberto Alameda.                               */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T42PARSE_H__
+#define __T42PARSE_H__
+
+
+#include "t42objs.h"
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+
+
+FT_BEGIN_HEADER
+
+  typedef struct  T42_ParserRec_
+  {
+    PS_ParserRec  root;
+    FT_Stream     stream;
+
+    FT_Byte*      base_dict;
+    FT_Long       base_len;
+
+    FT_Bool       in_memory;
+
+  } T42_ParserRec, *T42_Parser;
+
+
+  typedef struct  T42_Loader_
+  {
+    T42_ParserRec  parser;          /* parser used to read the stream */
+
+    FT_UInt        num_chars;       /* number of characters in encoding */
+    PS_TableRec    encoding_table;  /* PS_Table used to store the       */
+                                    /* encoding character names         */
+
+    FT_UInt        num_glyphs;
+    PS_TableRec    glyph_names;
+    PS_TableRec    charstrings;
+    PS_TableRec    swap_table;      /* For moving .notdef glyph to index 0. */
+
+  } T42_LoaderRec, *T42_Loader;
+
+
+  FT_LOCAL( FT_Error )
+  t42_parser_init( T42_Parser     parser,
+                   FT_Stream      stream,
+                   FT_Memory      memory,
+                   PSAux_Service  psaux );
+
+  FT_LOCAL( void )
+  t42_parser_done( T42_Parser  parser );
+
+
+  FT_LOCAL( FT_Error )
+  t42_parse_dict( T42_Face    face,
+                  T42_Loader  loader,
+                  FT_Byte*    base,
+                  FT_Long     size );
+
+
+  FT_LOCAL( void )
+  t42_loader_init( T42_Loader  loader,
+                   T42_Face    face );
+
+  FT_LOCAL( void )
+  t42_loader_done( T42_Loader  loader );
+
+
+ /* */
+
+FT_END_HEADER
+
+
+#endif /* __T42PARSE_H__ */
+
+
+/* END */
diff --git a/src/type42/t42types.h b/src/type42/t42types.h
new file mode 100644 (file)
index 0000000..c7c2db4
--- /dev/null
@@ -0,0 +1,56 @@
+/***************************************************************************/
+/*                                                                         */
+/*  t42types.h                                                             */
+/*                                                                         */
+/*    Type 42 font data types (specification only).                        */
+/*                                                                         */
+/*  Copyright 2002, 2003, 2006, 2008 by Roberto Alameda.                   */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __T42TYPES_H__
+#define __T42TYPES_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_TYPE1_TABLES_H
+#include FT_INTERNAL_TYPE1_TYPES_H
+#include FT_INTERNAL_POSTSCRIPT_HINTS_H
+
+
+FT_BEGIN_HEADER
+
+
+  typedef struct  T42_FaceRec_
+  {
+    FT_FaceRec      root;
+    T1_FontRec      type1;
+    const void*     psnames;
+    const void*     psaux;
+#if 0
+    const void*     afm_data;
+#endif
+    FT_Byte*        ttf_data;
+    FT_ULong        ttf_size;
+    FT_Face         ttf_face;
+    FT_CharMapRec   charmaprecs[2];
+    FT_CharMap      charmaps[2];
+    PS_UnicodesRec  unicode_map;
+
+  } T42_FaceRec, *T42_Face;
+
+
+FT_END_HEADER
+
+#endif /* __T42TYPES_H__ */
+
+
+/* END */
diff --git a/src/type42/type42.c b/src/type42/type42.c
new file mode 100644 (file)
index 0000000..d13df56
--- /dev/null
@@ -0,0 +1,25 @@
+/***************************************************************************/
+/*                                                                         */
+/*  type42.c                                                               */
+/*                                                                         */
+/*    FreeType Type 42 driver component.                                   */
+/*                                                                         */
+/*  Copyright 2002 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+#define FT_MAKE_OPTION_SINGLE_OBJECT
+
+#include <ft2build.h>
+#include "t42objs.c"
+#include "t42parse.c"
+#include "t42drivr.c"
+
+/* END */
diff --git a/src/winfonts/Jamfile b/src/winfonts/Jamfile
new file mode 100644 (file)
index 0000000..71cf567
--- /dev/null
@@ -0,0 +1,16 @@
+# FreeType 2 src/winfonts Jamfile
+#
+# Copyright 2001 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.
+
+SubDir  FT2_TOP $(FT2_SRC_DIR) winfonts ;
+
+Library  $(FT2_LIB) : winfnt.c ;
+
+# end of src/winfonts Jamfile
diff --git a/src/winfonts/fnterrs.h b/src/winfonts/fnterrs.h
new file mode 100644 (file)
index 0000000..463ba77
--- /dev/null
@@ -0,0 +1,42 @@
+/***************************************************************************/
+/*                                                                         */
+/*  fnterrs.h                                                              */
+/*                                                                         */
+/*    Win FNT/FON error codes (specification only).                        */
+/*                                                                         */
+/*  Copyright 2001, 2012 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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* This file is used to define the Windows FNT/FON error enumeration     */
+  /* constants.                                                            */
+  /*                                                                       */
+  /*************************************************************************/
+
+#ifndef __FNTERRS_H__
+#define __FNTERRS_H__
+
+#include FT_MODULE_ERRORS_H
+
+#undef __FTERRORS_H__
+
+#undef  FT_ERR_PREFIX
+#define FT_ERR_PREFIX  FNT_Err_
+#define FT_ERR_BASE    FT_Mod_Err_Winfonts
+
+#include FT_ERRORS_H
+
+#endif /* __FNTERRS_H__ */
+
+
+/* END */
diff --git a/src/winfonts/module.mk b/src/winfonts/module.mk
new file mode 100644 (file)
index 0000000..b44d7f0
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# FreeType 2 Windows FNT/FON module definition
+#
+
+
+# Copyright 1996-2000, 2006 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.
+
+
+FTMODULE_H_COMMANDS += WINDOWS_DRIVER
+
+define WINDOWS_DRIVER
+$(OPEN_DRIVER) FT_Driver_ClassRec, winfnt_driver_class $(CLOSE_DRIVER)
+$(ECHO_DRIVER)winfnt    $(ECHO_DRIVER_DESC)Windows bitmap fonts with extension *.fnt or *.fon$(ECHO_DRIVER_DONE)
+endef
+
+# EOF
diff --git a/src/winfonts/rules.mk b/src/winfonts/rules.mk
new file mode 100644 (file)
index 0000000..71a7df2
--- /dev/null
@@ -0,0 +1,65 @@
+#
+# FreeType 2 Windows FNT/FON driver configuration rules
+#
+
+
+# Copyright 1996-2000, 2001, 2003 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.
+
+
+# Windows driver directory
+#
+FNT_DIR := $(SRC_DIR)/winfonts
+
+
+FNT_COMPILE := $(FT_COMPILE) $I$(subst /,$(COMPILER_SEP),$(FNT_DIR))
+
+
+# Windows driver sources (i.e., C files)
+#
+FNT_DRV_SRC := $(FNT_DIR)/winfnt.c
+
+# Windows driver headers
+#
+FNT_DRV_H := $(FNT_DRV_SRC:%.c=%.h) \
+             $(FNT_DIR)/fnterrs.h
+
+
+# Windows driver object(s)
+#
+#   FNT_DRV_OBJ_M is used during `multi' builds
+#   FNT_DRV_OBJ_S is used during `single' builds
+#
+FNT_DRV_OBJ_M := $(FNT_DRV_SRC:$(FNT_DIR)/%.c=$(OBJ_DIR)/%.$O)
+FNT_DRV_OBJ_S := $(OBJ_DIR)/winfnt.$O
+
+# Windows driver source file for single build
+#
+FNT_DRV_SRC_S := $(FNT_DIR)/winfnt.c
+
+
+# Windows driver - single object
+#
+$(FNT_DRV_OBJ_S): $(FNT_DRV_SRC_S) $(FNT_DRV_SRC) $(FREETYPE_H) $(FNT_DRV_H)
+       $(FNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $(FNT_DRV_SRC_S))
+
+
+# Windows driver - multiple objects
+#
+$(OBJ_DIR)/%.$O: $(FNT_DIR)/%.c $(FREETYPE_H) $(FNT_DRV_H)
+       $(FNT_COMPILE) $T$(subst /,$(COMPILER_SEP),$@ $<)
+
+
+# update main driver object lists
+#
+DRV_OBJS_S += $(FNT_DRV_OBJ_S)
+DRV_OBJS_M += $(FNT_DRV_OBJ_M)
+
+
+# EOF
diff --git a/src/winfonts/winfnt.c b/src/winfonts/winfnt.c
new file mode 100644 (file)
index 0000000..a551896
--- /dev/null
@@ -0,0 +1,1159 @@
+/***************************************************************************/
+/*                                                                         */
+/*  winfnt.c                                                               */
+/*                                                                         */
+/*    FreeType font driver for Windows FNT/FON files                       */
+/*                                                                         */
+/*  Copyright 1996-2004, 2006-2012 by                                      */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*  Copyright 2003 Huw D M Davies for Codeweavers                          */
+/*  Copyright 2007 Dmitry Timoshkov for Codeweavers                        */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include <ft2build.h>
+#include FT_WINFONTS_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_TRUETYPE_IDS_H
+
+#include "winfnt.h"
+#include "fnterrs.h"
+#include FT_SERVICE_WINFNT_H
+#include FT_SERVICE_XFREE86_NAME_H
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* The macro FT_COMPONENT is used in trace mode.  It is an implicit      */
+  /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log  */
+  /* messages during execution.                                            */
+  /*                                                                       */
+#undef  FT_COMPONENT
+#define FT_COMPONENT  trace_winfnt
+
+
+  static const FT_Frame_Field  winmz_header_fields[] =
+  {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  WinMZ_HeaderRec
+
+    FT_FRAME_START( 64 ),
+      FT_FRAME_USHORT_LE ( magic ),
+      FT_FRAME_SKIP_BYTES( 29 * 2 ),
+      FT_FRAME_ULONG_LE  ( lfanew ),
+    FT_FRAME_END
+  };
+
+  static const FT_Frame_Field  winne_header_fields[] =
+  {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  WinNE_HeaderRec
+
+    FT_FRAME_START( 40 ),
+      FT_FRAME_USHORT_LE ( magic ),
+      FT_FRAME_SKIP_BYTES( 34 ),
+      FT_FRAME_USHORT_LE ( resource_tab_offset ),
+      FT_FRAME_USHORT_LE ( rname_tab_offset ),
+    FT_FRAME_END
+  };
+
+  static const FT_Frame_Field  winpe32_header_fields[] =
+  {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  WinPE32_HeaderRec
+
+    FT_FRAME_START( 248 ),
+      FT_FRAME_ULONG_LE  ( magic ),   /* PE00 */
+      FT_FRAME_USHORT_LE ( machine ), /* 0x014c - i386 */
+      FT_FRAME_USHORT_LE ( number_of_sections ),
+      FT_FRAME_SKIP_BYTES( 12 ),
+      FT_FRAME_USHORT_LE ( size_of_optional_header ),
+      FT_FRAME_SKIP_BYTES( 2 ),
+      FT_FRAME_USHORT_LE ( magic32 ), /* 0x10b */
+      FT_FRAME_SKIP_BYTES( 110 ),
+      FT_FRAME_ULONG_LE  ( rsrc_virtual_address ),
+      FT_FRAME_ULONG_LE  ( rsrc_size ),
+      FT_FRAME_SKIP_BYTES( 104 ),
+    FT_FRAME_END
+  };
+
+  static const FT_Frame_Field  winpe32_section_fields[] =
+  {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  WinPE32_SectionRec
+
+    FT_FRAME_START( 40 ),
+      FT_FRAME_BYTES     ( name, 8 ),
+      FT_FRAME_SKIP_BYTES( 4 ),
+      FT_FRAME_ULONG_LE  ( virtual_address ),
+      FT_FRAME_ULONG_LE  ( size_of_raw_data ),
+      FT_FRAME_ULONG_LE  ( pointer_to_raw_data ),
+      FT_FRAME_SKIP_BYTES( 16 ),
+    FT_FRAME_END
+  };
+
+  static const FT_Frame_Field  winpe_rsrc_dir_fields[] =
+  {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  WinPE_RsrcDirRec
+
+    FT_FRAME_START( 16 ),
+      FT_FRAME_ULONG_LE ( characteristics ),
+      FT_FRAME_ULONG_LE ( time_date_stamp ),
+      FT_FRAME_USHORT_LE( major_version ),
+      FT_FRAME_USHORT_LE( minor_version ),
+      FT_FRAME_USHORT_LE( number_of_named_entries ),
+      FT_FRAME_USHORT_LE( number_of_id_entries ),
+    FT_FRAME_END
+  };
+
+  static const FT_Frame_Field  winpe_rsrc_dir_entry_fields[] =
+  {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  WinPE_RsrcDirEntryRec
+
+    FT_FRAME_START( 8 ),
+      FT_FRAME_ULONG_LE( name ),
+      FT_FRAME_ULONG_LE( offset ),
+    FT_FRAME_END
+  };
+
+  static const FT_Frame_Field  winpe_rsrc_data_entry_fields[] =
+  {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  WinPE_RsrcDataEntryRec
+
+    FT_FRAME_START( 16 ),
+      FT_FRAME_ULONG_LE( offset_to_data ),
+      FT_FRAME_ULONG_LE( size ),
+      FT_FRAME_ULONG_LE( code_page ),
+      FT_FRAME_ULONG_LE( reserved ),
+    FT_FRAME_END
+  };
+
+  static const FT_Frame_Field  winfnt_header_fields[] =
+  {
+#undef  FT_STRUCTURE
+#define FT_STRUCTURE  FT_WinFNT_HeaderRec
+
+    FT_FRAME_START( 148 ),
+      FT_FRAME_USHORT_LE( version ),
+      FT_FRAME_ULONG_LE ( file_size ),
+      FT_FRAME_BYTES    ( copyright, 60 ),
+      FT_FRAME_USHORT_LE( file_type ),
+      FT_FRAME_USHORT_LE( nominal_point_size ),
+      FT_FRAME_USHORT_LE( vertical_resolution ),
+      FT_FRAME_USHORT_LE( horizontal_resolution ),
+      FT_FRAME_USHORT_LE( ascent ),
+      FT_FRAME_USHORT_LE( internal_leading ),
+      FT_FRAME_USHORT_LE( external_leading ),
+      FT_FRAME_BYTE     ( italic ),
+      FT_FRAME_BYTE     ( underline ),
+      FT_FRAME_BYTE     ( strike_out ),
+      FT_FRAME_USHORT_LE( weight ),
+      FT_FRAME_BYTE     ( charset ),
+      FT_FRAME_USHORT_LE( pixel_width ),
+      FT_FRAME_USHORT_LE( pixel_height ),
+      FT_FRAME_BYTE     ( pitch_and_family ),
+      FT_FRAME_USHORT_LE( avg_width ),
+      FT_FRAME_USHORT_LE( max_width ),
+      FT_FRAME_BYTE     ( first_char ),
+      FT_FRAME_BYTE     ( last_char ),
+      FT_FRAME_BYTE     ( default_char ),
+      FT_FRAME_BYTE     ( break_char ),
+      FT_FRAME_USHORT_LE( bytes_per_row ),
+      FT_FRAME_ULONG_LE ( device_offset ),
+      FT_FRAME_ULONG_LE ( face_name_offset ),
+      FT_FRAME_ULONG_LE ( bits_pointer ),
+      FT_FRAME_ULONG_LE ( bits_offset ),
+      FT_FRAME_BYTE     ( reserved ),
+      FT_FRAME_ULONG_LE ( flags ),
+      FT_FRAME_USHORT_LE( A_space ),
+      FT_FRAME_USHORT_LE( B_space ),
+      FT_FRAME_USHORT_LE( C_space ),
+      FT_FRAME_ULONG_LE ( color_table_offset ),
+      FT_FRAME_BYTES    ( reserved1, 16 ),
+    FT_FRAME_END
+  };
+
+
+  static void
+  fnt_font_done( FNT_Face face )
+  {
+    FT_Memory  memory = FT_FACE( face )->memory;
+    FT_Stream  stream = FT_FACE( face )->stream;
+    FNT_Font   font   = face->font;
+
+
+    if ( !font )
+      return;
+
+    if ( font->fnt_frame )
+      FT_FRAME_RELEASE( font->fnt_frame );
+    FT_FREE( font->family_name );
+
+    FT_FREE( font );
+    face->font = 0;
+  }
+
+
+  static FT_Error
+  fnt_font_load( FNT_Font   font,
+                 FT_Stream  stream )
+  {
+    FT_Error          error;
+    FT_WinFNT_Header  header = &font->header;
+    FT_Bool           new_format;
+    FT_UInt           size;
+
+
+    /* first of all, read the FNT header */
+    if ( FT_STREAM_SEEK( font->offset )                        ||
+         FT_STREAM_READ_FIELDS( winfnt_header_fields, header ) )
+      goto Exit;
+
+    /* check header */
+    if ( header->version != 0x200 &&
+         header->version != 0x300 )
+    {
+      FT_TRACE2(( "  not a Windows FNT file\n" ));
+      error = FNT_Err_Unknown_File_Format;
+      goto Exit;
+    }
+
+    new_format = FT_BOOL( font->header.version == 0x300 );
+    size       = new_format ? 148 : 118;
+
+    if ( header->file_size < size )
+    {
+      FT_TRACE2(( "  not a Windows FNT file\n" ));
+      error = FNT_Err_Unknown_File_Format;
+      goto Exit;
+    }
+
+    /* Version 2 doesn't have these fields */
+    if ( header->version == 0x200 )
+    {
+      header->flags   = 0;
+      header->A_space = 0;
+      header->B_space = 0;
+      header->C_space = 0;
+
+      header->color_table_offset = 0;
+    }
+
+    if ( header->file_type & 1 )
+    {
+      FT_TRACE2(( "[can't handle vector FNT fonts]\n" ));
+      error = FNT_Err_Unknown_File_Format;
+      goto Exit;
+    }
+
+    /* this is a FNT file/table; extract its frame */
+    if ( FT_STREAM_SEEK( font->offset )                         ||
+         FT_FRAME_EXTRACT( header->file_size, font->fnt_frame ) )
+      goto Exit;
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  fnt_face_get_dll_font( FNT_Face  face,
+                         FT_Int    face_index )
+  {
+    FT_Error         error;
+    FT_Stream        stream = FT_FACE( face )->stream;
+    FT_Memory        memory = FT_FACE( face )->memory;
+    WinMZ_HeaderRec  mz_header;
+
+
+    face->font = 0;
+
+    /* does it begin with an MZ header? */
+    if ( FT_STREAM_SEEK( 0 )                                      ||
+         FT_STREAM_READ_FIELDS( winmz_header_fields, &mz_header ) )
+      goto Exit;
+
+    error = FNT_Err_Unknown_File_Format;
+    if ( mz_header.magic == WINFNT_MZ_MAGIC )
+    {
+      /* yes, now look for an NE header in the file */
+      WinNE_HeaderRec  ne_header;
+
+
+      FT_TRACE2(( "MZ signature found\n" ));
+
+      if ( FT_STREAM_SEEK( mz_header.lfanew )                       ||
+           FT_STREAM_READ_FIELDS( winne_header_fields, &ne_header ) )
+        goto Exit;
+
+      error = FNT_Err_Unknown_File_Format;
+      if ( ne_header.magic == WINFNT_NE_MAGIC )
+      {
+        /* good, now look into the resource table for each FNT resource */
+        FT_ULong   res_offset  = mz_header.lfanew +
+                                   ne_header.resource_tab_offset;
+        FT_UShort  size_shift;
+        FT_UShort  font_count  = 0;
+        FT_ULong   font_offset = 0;
+
+
+        FT_TRACE2(( "NE signature found\n" ));
+
+        if ( FT_STREAM_SEEK( res_offset )                    ||
+             FT_FRAME_ENTER( ne_header.rname_tab_offset -
+                             ne_header.resource_tab_offset ) )
+          goto Exit;
+
+        size_shift = FT_GET_USHORT_LE();
+
+        for (;;)
+        {
+          FT_UShort  type_id, count;
+
+
+          type_id = FT_GET_USHORT_LE();
+          if ( !type_id )
+            break;
+
+          count = FT_GET_USHORT_LE();
+
+          if ( type_id == 0x8008U )
+          {
+            font_count  = count;
+            font_offset = (FT_ULong)( FT_STREAM_POS() + 4 +
+                                      ( stream->cursor - stream->limit ) );
+            break;
+          }
+
+          stream->cursor += 4 + count * 12;
+        }
+
+        FT_FRAME_EXIT();
+
+        if ( !font_count || !font_offset )
+        {
+          FT_TRACE2(( "this file doesn't contain any FNT resources\n" ));
+          error = FNT_Err_Invalid_File_Format;
+          goto Exit;
+        }
+
+        /* loading `winfnt_header_fields' needs at least 118 bytes;    */
+        /* use this as a rough measure to check the expected font size */
+        if ( font_count * 118UL > stream->size )
+        {
+          FT_TRACE2(( "invalid number of faces\n" ));
+          error = FNT_Err_Invalid_File_Format;
+          goto Exit;
+        }
+
+        face->root.num_faces = font_count;
+
+        if ( face_index >= font_count )
+        {
+          error = FNT_Err_Invalid_Argument;
+          goto Exit;
+        }
+        else if ( face_index < 0 )
+          goto Exit;
+
+        if ( FT_NEW( face->font ) )
+          goto Exit;
+
+        if ( FT_STREAM_SEEK( font_offset + face_index * 12 ) ||
+             FT_FRAME_ENTER( 12 )                            )
+          goto Fail;
+
+        face->font->offset   = (FT_ULong)FT_GET_USHORT_LE() << size_shift;
+        face->font->fnt_size = (FT_ULong)FT_GET_USHORT_LE() << size_shift;
+
+        stream->cursor += 8;
+
+        FT_FRAME_EXIT();
+
+        error = fnt_font_load( face->font, stream );
+      }
+      else if ( ne_header.magic == WINFNT_PE_MAGIC )
+      {
+        WinPE32_HeaderRec       pe32_header;
+        WinPE32_SectionRec      pe32_section;
+        WinPE_RsrcDirRec        root_dir, name_dir, lang_dir;
+        WinPE_RsrcDirEntryRec   dir_entry1, dir_entry2, dir_entry3;
+        WinPE_RsrcDataEntryRec  data_entry;
+
+        FT_Long    root_dir_offset, name_dir_offset, lang_dir_offset;
+        FT_UShort  i, j, k;
+
+
+        FT_TRACE2(( "PE signature found\n" ));
+
+        if ( FT_STREAM_SEEK( mz_header.lfanew )                           ||
+             FT_STREAM_READ_FIELDS( winpe32_header_fields, &pe32_header ) )
+          goto Exit;
+
+        FT_TRACE2(( "magic %04lx, machine %02x, number_of_sections %u, "
+                    "size_of_optional_header %02x\n"
+                    "magic32 %02x, rsrc_virtual_address %04lx, "
+                    "rsrc_size %04lx\n",
+                    pe32_header.magic, pe32_header.machine,
+                    pe32_header.number_of_sections,
+                    pe32_header.size_of_optional_header,
+                    pe32_header.magic32, pe32_header.rsrc_virtual_address,
+                    pe32_header.rsrc_size ));
+
+        if ( pe32_header.magic != WINFNT_PE_MAGIC /* check full signature */ ||
+             pe32_header.machine != 0x014c /* i386 */                        ||
+             pe32_header.size_of_optional_header != 0xe0 /* FIXME */         ||
+             pe32_header.magic32 != 0x10b                                    )
+        {
+          FT_TRACE2(( "this file has an invalid PE header\n" ));
+          error = FNT_Err_Invalid_File_Format;
+          goto Exit;
+        }
+
+        face->root.num_faces = 0;
+
+        for ( i = 0; i < pe32_header.number_of_sections; i++ )
+        {
+          if ( FT_STREAM_READ_FIELDS( winpe32_section_fields,
+                                      &pe32_section ) )
+            goto Exit;
+
+          FT_TRACE2(( "name %.8s, va %04lx, size %04lx, offset %04lx\n",
+                      pe32_section.name, pe32_section.virtual_address,
+                      pe32_section.size_of_raw_data,
+                      pe32_section.pointer_to_raw_data ));
+
+          if ( pe32_header.rsrc_virtual_address ==
+                 pe32_section.virtual_address )
+            goto Found_rsrc_section;
+        }
+
+        FT_TRACE2(( "this file doesn't contain any resources\n" ));
+        error = FNT_Err_Invalid_File_Format;
+        goto Exit;
+
+      Found_rsrc_section:
+        FT_TRACE2(( "found resources section %.8s\n", pe32_section.name ));
+
+        if ( FT_STREAM_SEEK( pe32_section.pointer_to_raw_data )        ||
+             FT_STREAM_READ_FIELDS( winpe_rsrc_dir_fields, &root_dir ) )
+          goto Exit;
+
+        root_dir_offset = pe32_section.pointer_to_raw_data;
+
+        for ( i = 0; i < root_dir.number_of_named_entries +
+                           root_dir.number_of_id_entries; i++ )
+        {
+          if ( FT_STREAM_SEEK( root_dir_offset + 16 + i * 8 )      ||
+               FT_STREAM_READ_FIELDS( winpe_rsrc_dir_entry_fields,
+                                      &dir_entry1 )                )
+            goto Exit;
+
+          if ( !(dir_entry1.offset & 0x80000000UL ) /* DataIsDirectory */ )
+          {
+            error = FNT_Err_Invalid_File_Format;
+            goto Exit;
+          }
+
+          dir_entry1.offset &= ~0x80000000UL;
+
+          name_dir_offset = pe32_section.pointer_to_raw_data +
+                            dir_entry1.offset;
+
+          if ( FT_STREAM_SEEK( pe32_section.pointer_to_raw_data +
+                               dir_entry1.offset )                       ||
+               FT_STREAM_READ_FIELDS( winpe_rsrc_dir_fields, &name_dir ) )
+            goto Exit;
+
+          for ( j = 0; j < name_dir.number_of_named_entries +
+                             name_dir.number_of_id_entries; j++ )
+          {
+            if ( FT_STREAM_SEEK( name_dir_offset + 16 + j * 8 )      ||
+                 FT_STREAM_READ_FIELDS( winpe_rsrc_dir_entry_fields,
+                                        &dir_entry2 )                )
+              goto Exit;
+
+            if ( !(dir_entry2.offset & 0x80000000UL ) /* DataIsDirectory */ )
+            {
+              error = FNT_Err_Invalid_File_Format;
+              goto Exit;
+            }
+
+            dir_entry2.offset &= ~0x80000000UL;
+
+            lang_dir_offset = pe32_section.pointer_to_raw_data +
+                                dir_entry2.offset;
+
+            if ( FT_STREAM_SEEK( pe32_section.pointer_to_raw_data +
+                                   dir_entry2.offset )                     ||
+                 FT_STREAM_READ_FIELDS( winpe_rsrc_dir_fields, &lang_dir ) )
+              goto Exit;
+
+            for ( k = 0; k < lang_dir.number_of_named_entries +
+                               lang_dir.number_of_id_entries; k++ )
+            {
+              if ( FT_STREAM_SEEK( lang_dir_offset + 16 + k * 8 )      ||
+                   FT_STREAM_READ_FIELDS( winpe_rsrc_dir_entry_fields,
+                                          &dir_entry3 )                )
+                goto Exit;
+
+              if ( dir_entry2.offset & 0x80000000UL /* DataIsDirectory */ )
+              {
+                error = FNT_Err_Invalid_File_Format;
+                goto Exit;
+              }
+
+              if ( dir_entry1.name == 8 /* RT_FONT */ )
+              {
+                if ( FT_STREAM_SEEK( root_dir_offset + dir_entry3.offset ) ||
+                     FT_STREAM_READ_FIELDS( winpe_rsrc_data_entry_fields,
+                                            &data_entry )                  )
+                  goto Exit;
+
+                FT_TRACE2(( "found font #%lu, offset %04lx, "
+                            "size %04lx, cp %lu\n",
+                            dir_entry2.name,
+                            pe32_section.pointer_to_raw_data +
+                              data_entry.offset_to_data -
+                              pe32_section.virtual_address,
+                            data_entry.size, data_entry.code_page ));
+
+                if ( face_index == face->root.num_faces )
+                {
+                  if ( FT_NEW( face->font ) )
+                    goto Exit;
+
+                  face->font->offset   = pe32_section.pointer_to_raw_data +
+                                           data_entry.offset_to_data -
+                                           pe32_section.virtual_address;
+                  face->font->fnt_size = data_entry.size;
+
+                  error = fnt_font_load( face->font, stream );
+                  if ( error )
+                  {
+                    FT_TRACE2(( "font #%lu load error %d\n",
+                                dir_entry2.name, error ));
+                    goto Fail;
+                  }
+                  else
+                    FT_TRACE2(( "font #%lu successfully loaded\n",
+                                dir_entry2.name ));
+                }
+
+                face->root.num_faces++;
+              }
+            }
+          }
+        }
+      }
+
+      if ( !face->root.num_faces )
+      {
+        FT_TRACE2(( "this file doesn't contain any RT_FONT resources\n" ));
+        error = FNT_Err_Invalid_File_Format;
+        goto Exit;
+      }
+
+      if ( face_index >= face->root.num_faces )
+      {
+        error = FNT_Err_Invalid_Argument;
+        goto Exit;
+      }
+    }
+
+  Fail:
+    if ( error )
+      fnt_font_done( face );
+
+  Exit:
+    return error;
+  }
+
+
+  typedef struct  FNT_CMapRec_
+  {
+    FT_CMapRec  cmap;
+    FT_UInt32   first;
+    FT_UInt32   count;
+
+  } FNT_CMapRec, *FNT_CMap;
+
+
+  static FT_Error
+  fnt_cmap_init( FNT_CMap  cmap )
+  {
+    FNT_Face  face = (FNT_Face)FT_CMAP_FACE( cmap );
+    FNT_Font  font = face->font;
+
+
+    cmap->first = (FT_UInt32)  font->header.first_char;
+    cmap->count = (FT_UInt32)( font->header.last_char - cmap->first + 1 );
+
+    return 0;
+  }
+
+
+  static FT_UInt
+  fnt_cmap_char_index( FNT_CMap   cmap,
+                       FT_UInt32  char_code )
+  {
+    FT_UInt  gindex = 0;
+
+
+    char_code -= cmap->first;
+    if ( char_code < cmap->count )
+      /* we artificially increase the glyph index; */
+      /* FNT_Load_Glyph reverts to the right one   */
+      gindex = (FT_UInt)( char_code + 1 );
+    return gindex;
+  }
+
+
+  static FT_UInt32
+  fnt_cmap_char_next( FNT_CMap    cmap,
+                      FT_UInt32  *pchar_code )
+  {
+    FT_UInt    gindex = 0;
+    FT_UInt32  result = 0;
+    FT_UInt32  char_code = *pchar_code + 1;
+
+
+    if ( char_code <= cmap->first )
+    {
+      result = cmap->first;
+      gindex = 1;
+    }
+    else
+    {
+      char_code -= cmap->first;
+      if ( char_code < cmap->count )
+      {
+        result = cmap->first + char_code;
+        gindex = (FT_UInt)( char_code + 1 );
+      }
+    }
+
+    *pchar_code = result;
+    return gindex;
+  }
+
+
+  static const FT_CMap_ClassRec  fnt_cmap_class_rec =
+  {
+    sizeof ( FNT_CMapRec ),
+
+    (FT_CMap_InitFunc)     fnt_cmap_init,
+    (FT_CMap_DoneFunc)     NULL,
+    (FT_CMap_CharIndexFunc)fnt_cmap_char_index,
+    (FT_CMap_CharNextFunc) fnt_cmap_char_next,
+
+    NULL, NULL, NULL, NULL, NULL
+  };
+
+  static FT_CMap_Class const  fnt_cmap_class = &fnt_cmap_class_rec;
+
+
+  static void
+  FNT_Face_Done( FT_Face  fntface )       /* FNT_Face */
+  {
+    FNT_Face   face = (FNT_Face)fntface;
+    FT_Memory  memory;
+
+
+    if ( !face )
+      return;
+
+    memory = FT_FACE_MEMORY( face );
+
+    fnt_font_done( face );
+
+    FT_FREE( fntface->available_sizes );
+    fntface->num_fixed_sizes = 0;
+  }
+
+
+  static FT_Error
+  FNT_Face_Init( FT_Stream      stream,
+                 FT_Face        fntface,        /* FNT_Face */
+                 FT_Int         face_index,
+                 FT_Int         num_params,
+                 FT_Parameter*  params )
+  {
+    FNT_Face   face   = (FNT_Face)fntface;
+    FT_Error   error;
+    FT_Memory  memory = FT_FACE_MEMORY( face );
+
+    FT_UNUSED( num_params );
+    FT_UNUSED( params );
+
+
+    FT_TRACE2(( "Windows FNT driver\n" ));
+
+    /* try to load font from a DLL */
+    error = fnt_face_get_dll_font( face, face_index );
+    if ( !error && face_index < 0 )
+      goto Exit;
+
+    if ( error == FNT_Err_Unknown_File_Format )
+    {
+      /* this didn't work; try to load a single FNT font */
+      FNT_Font  font;
+
+      if ( FT_NEW( face->font ) )
+        goto Exit;
+
+      fntface->num_faces = 1;
+
+      font           = face->font;
+      font->offset   = 0;
+      font->fnt_size = stream->size;
+
+      error = fnt_font_load( font, stream );
+
+      if ( !error )
+      {
+        if ( face_index > 0 )
+          error = FNT_Err_Invalid_Argument;
+        else if ( face_index < 0 )
+          goto Exit;
+      }
+    }
+
+    if ( error )
+      goto Fail;
+
+    /* we now need to fill the root FT_Face fields */
+    /* with relevant information                   */
+    {
+      FT_Face     root = FT_FACE( face );
+      FNT_Font    font = face->font;
+      FT_PtrDist  family_size;
+
+
+      root->face_index = face_index;
+
+      root->face_flags = FT_FACE_FLAG_FIXED_SIZES |
+                         FT_FACE_FLAG_HORIZONTAL;
+
+      if ( font->header.avg_width == font->header.max_width )
+        root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+      if ( font->header.italic )
+        root->style_flags |= FT_STYLE_FLAG_ITALIC;
+
+      if ( font->header.weight >= 800 )
+        root->style_flags |= FT_STYLE_FLAG_BOLD;
+
+      /* set up the `fixed_sizes' array */
+      if ( FT_NEW_ARRAY( root->available_sizes, 1 ) )
+        goto Fail;
+
+      root->num_fixed_sizes = 1;
+
+      {
+        FT_Bitmap_Size*  bsize = root->available_sizes;
+        FT_UShort        x_res, y_res;
+
+
+        bsize->width  = font->header.avg_width;
+        bsize->height = (FT_Short)(
+          font->header.pixel_height + font->header.external_leading );
+        bsize->size   = font->header.nominal_point_size << 6;
+
+        x_res = font->header.horizontal_resolution;
+        if ( !x_res )
+          x_res = 72;
+
+        y_res = font->header.vertical_resolution;
+        if ( !y_res )
+          y_res = 72;
+
+        bsize->y_ppem = FT_MulDiv( bsize->size, y_res, 72 );
+        bsize->y_ppem = FT_PIX_ROUND( bsize->y_ppem );
+
+        /*
+         * this reads:
+         *
+         * the nominal height is larger than the bbox's height
+         *
+         * => nominal_point_size contains incorrect value;
+         *    use pixel_height as the nominal height
+         */
+        if ( bsize->y_ppem > ( font->header.pixel_height << 6 ) )
+        {
+          FT_TRACE2(( "use pixel_height as the nominal height\n" ));
+
+          bsize->y_ppem = font->header.pixel_height << 6;
+          bsize->size   = FT_MulDiv( bsize->y_ppem, 72, y_res );
+        }
+
+        bsize->x_ppem = FT_MulDiv( bsize->size, x_res, 72 );
+        bsize->x_ppem = FT_PIX_ROUND( bsize->x_ppem );
+      }
+
+      {
+        FT_CharMapRec  charmap;
+
+
+        charmap.encoding    = FT_ENCODING_NONE;
+        /* initial platform/encoding should indicate unset status? */
+        charmap.platform_id = TT_PLATFORM_APPLE_UNICODE;
+        charmap.encoding_id = TT_APPLE_ID_DEFAULT;
+        charmap.face        = root;
+
+        if ( font->header.charset == FT_WinFNT_ID_MAC )
+        {
+          charmap.encoding    = FT_ENCODING_APPLE_ROMAN;
+          charmap.platform_id = TT_PLATFORM_MACINTOSH;
+/*        charmap.encoding_id = TT_MAC_ID_ROMAN; */
+        }
+
+        error = FT_CMap_New( fnt_cmap_class,
+                             NULL,
+                             &charmap,
+                             NULL );
+        if ( error )
+          goto Fail;
+
+        /* Select default charmap */
+        if ( root->num_charmaps )
+          root->charmap = root->charmaps[0];
+      }
+
+      /* set up remaining flags */
+
+      if ( font->header.last_char < font->header.first_char )
+      {
+        FT_TRACE2(( "invalid number of glyphs\n" ));
+        error = FNT_Err_Invalid_File_Format;
+        goto Fail;
+      }
+
+      /* reserve one slot for the .notdef glyph at index 0 */
+      root->num_glyphs = font->header.last_char -
+                         font->header.first_char + 1 + 1;
+
+      if ( font->header.face_name_offset >= font->header.file_size )
+      {
+        FT_TRACE2(( "invalid family name offset\n" ));
+        error = FNT_Err_Invalid_File_Format;
+        goto Fail;
+      }
+      family_size = font->header.file_size - font->header.face_name_offset;
+      /* Some broken fonts don't delimit the face name with a final */
+      /* NULL byte -- the frame is erroneously one byte too small.  */
+      /* We thus allocate one more byte, setting it explicitly to   */
+      /* zero.                                                      */
+      if ( FT_ALLOC( font->family_name, family_size + 1 ) )
+        goto Fail;
+
+      FT_MEM_COPY( font->family_name,
+                   font->fnt_frame + font->header.face_name_offset,
+                   family_size );
+
+      font->family_name[family_size] = '\0';
+
+      if ( FT_REALLOC( font->family_name,
+                       family_size,
+                       ft_strlen( font->family_name ) + 1 ) )
+        goto Fail;
+
+      root->family_name = font->family_name;
+      root->style_name  = (char *)"Regular";
+
+      if ( root->style_flags & FT_STYLE_FLAG_BOLD )
+      {
+        if ( root->style_flags & FT_STYLE_FLAG_ITALIC )
+          root->style_name = (char *)"Bold Italic";
+        else
+          root->style_name = (char *)"Bold";
+      }
+      else if ( root->style_flags & FT_STYLE_FLAG_ITALIC )
+        root->style_name = (char *)"Italic";
+    }
+    goto Exit;
+
+  Fail:
+    FNT_Face_Done( fntface );
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  FNT_Size_Select( FT_Size   size,
+                   FT_ULong  strike_index )
+  {
+    FNT_Face          face   = (FNT_Face)size->face;
+    FT_WinFNT_Header  header = &face->font->header;
+
+    FT_UNUSED( strike_index );
+
+
+    FT_Select_Metrics( size->face, 0 );
+
+    size->metrics.ascender    = header->ascent * 64;
+    size->metrics.descender   = -( header->pixel_height -
+                                   header->ascent ) * 64;
+    size->metrics.max_advance = header->max_width * 64;
+
+    return FNT_Err_Ok;
+  }
+
+
+  static FT_Error
+  FNT_Size_Request( FT_Size          size,
+                    FT_Size_Request  req )
+  {
+    FNT_Face          face    = (FNT_Face)size->face;
+    FT_WinFNT_Header  header  = &face->font->header;
+    FT_Bitmap_Size*   bsize   = size->face->available_sizes;
+    FT_Error          error   = FNT_Err_Invalid_Pixel_Size;
+    FT_Long           height;
+
+
+    height = FT_REQUEST_HEIGHT( req );
+    height = ( height + 32 ) >> 6;
+
+    switch ( req->type )
+    {
+    case FT_SIZE_REQUEST_TYPE_NOMINAL:
+      if ( height == ( ( bsize->y_ppem + 32 ) >> 6 ) )
+        error = FNT_Err_Ok;
+      break;
+
+    case FT_SIZE_REQUEST_TYPE_REAL_DIM:
+      if ( height == header->pixel_height )
+        error = FNT_Err_Ok;
+      break;
+
+    default:
+      error = FNT_Err_Unimplemented_Feature;
+      break;
+    }
+
+    if ( error )
+      return error;
+    else
+      return FNT_Size_Select( size, 0 );
+  }
+
+
+  static FT_Error
+  FNT_Load_Glyph( FT_GlyphSlot  slot,
+                  FT_Size       size,
+                  FT_UInt       glyph_index,
+                  FT_Int32      load_flags )
+  {
+    FNT_Face    face   = (FNT_Face)FT_SIZE_FACE( size );
+    FNT_Font    font;
+    FT_Error    error  = FNT_Err_Ok;
+    FT_Byte*    p;
+    FT_Int      len;
+    FT_Bitmap*  bitmap = &slot->bitmap;
+    FT_ULong    offset;
+    FT_Bool     new_format;
+
+    FT_UNUSED( load_flags );
+
+
+    if ( !face )
+    {
+      error = FNT_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    font = face->font;
+
+    if ( !font ||
+         glyph_index >= (FT_UInt)( FT_FACE( face )->num_glyphs ) )
+    {
+      error = FNT_Err_Invalid_Argument;
+      goto Exit;
+    }
+
+    if ( glyph_index > 0 )
+      glyph_index--;                           /* revert to real index */
+    else
+      glyph_index = font->header.default_char; /* the .notdef glyph */
+
+    new_format = FT_BOOL( font->header.version == 0x300 );
+    len        = new_format ? 6 : 4;
+
+    /* jump to glyph entry */
+    p = font->fnt_frame + ( new_format ? 148 : 118 ) + len * glyph_index;
+
+    bitmap->width = FT_NEXT_SHORT_LE( p );
+
+    if ( new_format )
+      offset = FT_NEXT_ULONG_LE( p );
+    else
+      offset = FT_NEXT_USHORT_LE( p );
+
+    if ( offset >= font->header.file_size )
+    {
+      FT_TRACE2(( "invalid FNT offset\n" ));
+      error = FNT_Err_Invalid_File_Format;
+      goto Exit;
+    }
+
+    /* jump to glyph data */
+    p = font->fnt_frame + /* font->header.bits_offset */ + offset;
+
+    /* allocate and build bitmap */
+    {
+      FT_Memory  memory = FT_FACE_MEMORY( slot->face );
+      FT_Int     pitch  = ( bitmap->width + 7 ) >> 3;
+      FT_Byte*   column;
+      FT_Byte*   write;
+
+
+      bitmap->pitch      = pitch;
+      bitmap->rows       = font->header.pixel_height;
+      bitmap->pixel_mode = FT_PIXEL_MODE_MONO;
+
+      if ( offset + pitch * bitmap->rows >= font->header.file_size )
+      {
+        FT_TRACE2(( "invalid bitmap width\n" ));
+        error = FNT_Err_Invalid_File_Format;
+        goto Exit;
+      }
+
+      /* note: since glyphs are stored in columns and not in rows we */
+      /*       can't use ft_glyphslot_set_bitmap                     */
+      if ( FT_ALLOC_MULT( bitmap->buffer, pitch, bitmap->rows ) )
+        goto Exit;
+
+      column = (FT_Byte*)bitmap->buffer;
+
+      for ( ; pitch > 0; pitch--, column++ )
+      {
+        FT_Byte*  limit = p + bitmap->rows;
+
+
+        for ( write = column; p < limit; p++, write += bitmap->pitch )
+          *write = *p;
+      }
+    }
+
+    slot->internal->flags = FT_GLYPH_OWN_BITMAP;
+    slot->bitmap_left     = 0;
+    slot->bitmap_top      = font->header.ascent;
+    slot->format          = FT_GLYPH_FORMAT_BITMAP;
+
+    /* now set up metrics */
+    slot->metrics.width        = bitmap->width << 6;
+    slot->metrics.height       = bitmap->rows << 6;
+    slot->metrics.horiAdvance  = bitmap->width << 6;
+    slot->metrics.horiBearingX = 0;
+    slot->metrics.horiBearingY = slot->bitmap_top << 6;
+
+    ft_synthesize_vertical_metrics( &slot->metrics,
+                                    bitmap->rows << 6 );
+
+  Exit:
+    return error;
+  }
+
+
+  static FT_Error
+  winfnt_get_header( FT_Face               face,
+                     FT_WinFNT_HeaderRec  *aheader )
+  {
+    FNT_Font  font = ((FNT_Face)face)->font;
+
+
+    *aheader = font->header;
+
+    return 0;
+  }
+
+
+  static const FT_Service_WinFntRec  winfnt_service_rec =
+  {
+    winfnt_get_header
+  };
+
+ /*
+  *  SERVICE LIST
+  *
+  */
+
+  static const FT_ServiceDescRec  winfnt_services[] =
+  {
+    { FT_SERVICE_ID_XF86_NAME, FT_XF86_FORMAT_WINFNT },
+    { FT_SERVICE_ID_WINFNT,    &winfnt_service_rec },
+    { NULL, NULL }
+  };
+
+
+  static FT_Module_Interface
+  winfnt_get_service( FT_Module         module,
+                      const FT_String*  service_id )
+  {
+    FT_UNUSED( module );
+
+    return ft_service_list_lookup( winfnt_services, service_id );
+  }
+
+
+
+
+  FT_CALLBACK_TABLE_DEF
+  const FT_Driver_ClassRec  winfnt_driver_class =
+  {
+    {
+      FT_MODULE_FONT_DRIVER        |
+      FT_MODULE_DRIVER_NO_OUTLINES,
+      sizeof ( FT_DriverRec ),
+
+      "winfonts",
+      0x10000L,
+      0x20000L,
+
+      0,
+
+      0,                  /* FT_Module_Constructor */
+      0,                  /* FT_Module_Destructor  */
+      winfnt_get_service
+    },
+
+    sizeof ( FNT_FaceRec ),
+    sizeof ( FT_SizeRec ),
+    sizeof ( FT_GlyphSlotRec ),
+
+    FNT_Face_Init,
+    FNT_Face_Done,
+    0,                    /* FT_Size_InitFunc */
+    0,                    /* FT_Size_DoneFunc */
+    0,                    /* FT_Slot_InitFunc */
+    0,                    /* FT_Slot_DoneFunc */
+
+#ifdef FT_CONFIG_OPTION_OLD_INTERNALS
+    ft_stub_set_char_sizes,
+    ft_stub_set_pixel_sizes,
+#endif
+    FNT_Load_Glyph,
+
+    0,                    /* FT_Face_GetKerningFunc  */
+    0,                    /* FT_Face_AttachFunc      */
+    0,                    /* FT_Face_GetAdvancesFunc */
+
+    FNT_Size_Request,
+    FNT_Size_Select
+  };
+
+
+/* END */
diff --git a/src/winfonts/winfnt.h b/src/winfonts/winfnt.h
new file mode 100644 (file)
index 0000000..b7a8073
--- /dev/null
@@ -0,0 +1,171 @@
+/***************************************************************************/
+/*                                                                         */
+/*  winfnt.h                                                               */
+/*                                                                         */
+/*    FreeType font driver for Windows FNT/FON files                       */
+/*                                                                         */
+/*  Copyright 1996-2001, 2002, 2003, 2004, 2007 by                         */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*  Copyright 2007 Dmitry Timoshkov for Codeweavers                        */
+/*                                                                         */
+/*  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.                                        */
+/*                                                                         */
+/***************************************************************************/
+
+
+#ifndef __WINFNT_H__
+#define __WINFNT_H__
+
+
+#include <ft2build.h>
+#include FT_WINFONTS_H
+#include FT_INTERNAL_DRIVER_H
+
+
+FT_BEGIN_HEADER
+
+#ifdef FT_CONFIG_OPTION_PIC
+#error "this module does not support PIC yet"
+#endif
+
+  typedef struct  WinMZ_HeaderRec_
+  {
+    FT_UShort  magic;
+    /* skipped content */
+    FT_UShort  lfanew;
+
+  } WinMZ_HeaderRec;
+
+
+  typedef struct  WinNE_HeaderRec_
+  {
+    FT_UShort  magic;
+    /* skipped content */
+    FT_UShort  resource_tab_offset;
+    FT_UShort  rname_tab_offset;
+
+  } WinNE_HeaderRec;
+
+
+  typedef struct  WinPE32_HeaderRec_
+  {
+    FT_ULong   magic;
+    FT_UShort  machine;
+    FT_UShort  number_of_sections;
+    /* skipped content */
+    FT_UShort  size_of_optional_header;
+    /* skipped content */
+    FT_UShort  magic32;
+    /* skipped content */
+    FT_ULong   rsrc_virtual_address;
+    FT_ULong   rsrc_size;
+    /* skipped content */
+
+  } WinPE32_HeaderRec;
+
+
+  typedef struct  WinPE32_SectionRec_
+  {
+    FT_Byte   name[8];
+    /* skipped content */
+    FT_ULong  virtual_address;
+    FT_ULong  size_of_raw_data;
+    FT_ULong  pointer_to_raw_data;
+    /* skipped content */
+
+  } WinPE32_SectionRec;
+
+
+  typedef struct  WinPE_RsrcDirRec_
+  {
+    FT_ULong   characteristics;
+    FT_ULong   time_date_stamp;
+    FT_UShort  major_version;
+    FT_UShort  minor_version;
+    FT_UShort  number_of_named_entries;
+    FT_UShort  number_of_id_entries;
+
+  } WinPE_RsrcDirRec;
+
+
+  typedef struct  WinPE_RsrcDirEntryRec_
+  {
+    FT_ULong  name;
+    FT_ULong  offset;
+
+  } WinPE_RsrcDirEntryRec;
+
+
+  typedef struct  WinPE_RsrcDataEntryRec_
+  {
+    FT_ULong  offset_to_data;
+    FT_ULong  size;
+    FT_ULong  code_page;
+    FT_ULong  reserved;
+
+  } WinPE_RsrcDataEntryRec;
+
+
+  typedef struct  WinNameInfoRec_
+  {
+    FT_UShort  offset;
+    FT_UShort  length;
+    FT_UShort  flags;
+    FT_UShort  id;
+    FT_UShort  handle;
+    FT_UShort  usage;
+
+  } WinNameInfoRec;
+
+
+  typedef struct  WinResourceInfoRec_
+  {
+    FT_UShort  type_id;
+    FT_UShort  count;
+
+  } WinResourceInfoRec;
+
+
+#define WINFNT_MZ_MAGIC  0x5A4D
+#define WINFNT_NE_MAGIC  0x454E
+#define WINFNT_PE_MAGIC  0x4550
+
+
+  typedef struct  FNT_FontRec_
+  {
+    FT_ULong             offset;
+
+    FT_WinFNT_HeaderRec  header;
+
+    FT_Byte*             fnt_frame;
+    FT_ULong             fnt_size;
+    FT_String*           family_name;
+
+  } FNT_FontRec, *FNT_Font;
+
+
+  typedef struct  FNT_FaceRec_
+  {
+    FT_FaceRec     root;
+    FNT_Font       font;
+
+    FT_CharMap     charmap_handle;
+    FT_CharMapRec  charmap;  /* a single charmap per face */
+
+  } FNT_FaceRec, *FNT_Face;
+
+
+  FT_EXPORT_VAR( const FT_Driver_ClassRec )  winfnt_driver_class;
+
+
+FT_END_HEADER
+
+
+#endif /* __WINFNT_H__ */
+
+
+/* END */
diff --git a/version.sed b/version.sed
new file mode 100644 (file)
index 0000000..c281ff5
--- /dev/null
@@ -0,0 +1,5 @@
+#! /usr/bin/sed -nf
+
+s/^#define  *FREETYPE_MAJOR  *\([^ ][^ ]*\).*$/freetype_major="\1" ;/p
+s/^#define  *FREETYPE_MINOR  *\([^ ][^ ]*\).*$/freetype_minor=".\1" ;/p
+s/^#define  *FREETYPE_PATCH  *\([^ ][^ ]*\).*$/freetype_patch=".\1" ;/p
diff --git a/vms_make.com b/vms_make.com
new file mode 100644 (file)
index 0000000..1aa83e7
--- /dev/null
@@ -0,0 +1,1286 @@
+$! make Freetype2 under OpenVMS
+$!
+$! Copyright 2003, 2004, 2006, 2007 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.
+$!
+$!
+$! External libraries (like Freetype, XPM, etc.) are supported via the
+$! config file VMSLIB.DAT. Please check the sample file, which is part of this
+$! distribution, for the information you need to provide
+$!
+$! This procedure currently does support the following commandline options
+$! in arbitrary order
+$!
+$! * DEBUG - Compile modules with /noopt/debug and link shareable image
+$!           with /debug
+$! * LOPTS - Options to be passed to the link command
+$! * CCOPT - Options to be passed to the C compiler
+$!
+$! In case of problems with the install you might contact me at
+$! zinser@zinser.no-ip.info(preferred) or
+$! zinser@sysdev.deutsche-boerse.com (work)
+$!
+$! Make procedure history for Freetype2
+$!
+$!------------------------------------------------------------------------------
+$! Version history
+$! 0.01 20040401 First version to receive a number
+$! 0.02 20041030 Add error handling, Freetype 2.1.9
+$!
+$ on error then goto err_exit
+$ true  = 1
+$ false = 0
+$ tmpnam = "temp_" + f$getjpi("","pid")
+$ tt = tmpnam + ".txt"
+$ tc = tmpnam + ".c"
+$ th = tmpnam + ".h"
+$ its_decc = false
+$ its_vaxc = false
+$ its_gnuc = false
+$!
+$! Setup variables holding "config" information
+$!
+$ Make    = ""
+$ ccopt   = "/name=as_is/float=ieee"
+$ lopts   = ""
+$ dnsrl   = ""
+$ aconf_in_file = "config.hin"
+$ name    = "Freetype2"
+$ mapfile =  name + ".map"
+$ optfile =  name + ".opt"
+$ s_case  = false
+$ liblist = ""
+$!
+$ whoami = f$parse(f$environment("Procedure"),,,,"NO_CONCEAL")
+$ mydef  = F$parse(whoami,,,"DEVICE")
+$ mydir  = f$parse(whoami,,,"DIRECTORY") - "]["
+$ myproc = f$parse(whoami,,,"Name") + f$parse(whoami,,,"type")
+$!
+$! Check for MMK/MMS
+$!
+$ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS"
+$ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK"
+$!
+$! Which command parameters were given
+$!
+$ gosub check_opts
+$!
+$! Create option file
+$!
+$ open/write optf 'optfile'
+$!
+$! Pull in external libraries
+$!
+$ create libs.opt
+$ open/write libsf libs.opt
+$ gosub check_create_vmslib
+$!
+$! Create objects
+$!
+$ if libdefs .nes. ""
+$ then
+$   ccopt = ccopt + "/define=(" + f$extract(0,f$length(libdefs)-1,libdefs) + ")"
+$ endif
+$!
+$ if f$locate("AS_IS",f$edit(ccopt,"UPCASE")) .lt. f$length(ccopt) -
+    then s_case = true
+$ gosub crea_mms
+$!
+$ 'Make' /macro=(comp_flags="''ccopt'")
+$ purge/nolog [...]descrip.mms
+$!
+$! Add them to options
+$!
+$FLOOP:
+$  file = f$edit(f$search("[...]*.obj"),"UPCASE")
+$  if (file .nes. "")
+$  then
+$    if f$locate("DEMOS",file) .eqs. f$length(file) then write optf file
+$    goto floop
+$  endif
+$!
+$ close optf
+$!
+$!
+$! Alpha gets a shareable image
+$!
+$ If f$getsyi("HW_MODEL") .gt. 1024
+$ Then
+$   write sys$output "Creating freetype2shr.exe"
+$   call anal_obj_axp 'optfile' _link.opt
+$   open/append  optf 'optfile'
+$   if s_case then WRITE optf "case_sensitive=YES"
+$   close optf
+$   LINK_/NODEB/SHARE=[.lib]freetype2shr.exe -
+                            'optfile'/opt,libs.opt/opt,_link.opt/opt
+$ endif
+$!
+$ exit
+$!
+$
+$ERR_LIB:
+$ write sys$output "Error reading config file vmslib.dat"
+$ goto err_exit
+$FT2_ERR:
+$ write sys$output "Could not locate Freetype 2 include files"
+$ goto err_exit
+$ERR_EXIT:
+$ set message/facil/ident/sever/text
+$ close/nolog optf
+$ close/nolog out
+$ close/nolog libdata
+$ close/nolog in
+$ close/nolog atmp
+$ close/nolog xtmp
+$ write sys$output "Exiting..."
+$ exit 2
+$!
+$!------------------------------------------------------------------------------
+$!
+$! If MMS/MMK are available dump out the descrip.mms if required
+$!
+$CREA_MMS:
+$ write sys$output "Creating descrip.mms files ..."
+$ write sys$output "... Main directory"
+$ create descrip.mms
+$ open/append out descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 build system -- top-level Makefile for OpenVMS
+#
+
+
+# Copyright 2001 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.
+$ EOD
+$ write out "CFLAGS = ", ccopt
+$ copy sys$input: out
+$ deck
+
+
+all :
+        define freetype [--.include.freetype]
+        define psaux [-.psaux]
+        define autofit [-.autofit]
+        define autohint [-.autohint]
+        define base [-.base]
+        define cache [-.cache]
+        define cff [-.cff]
+        define cid [-.cid]
+        define pcf [-.pcf]
+        define psnames [-.psnames]
+        define raster [-.raster]
+        define sfnt [-.sfnt]
+        define smooth [-.smooth]
+        define truetype [-.truetype]
+        define type1 [-.type1]
+        define winfonts [-.winfonts]
+        if f$search("lib.dir") .eqs. "" then create/directory [.lib]
+        set default [.builds.vms]
+        $(MMS)$(MMSQUALIFIERS)
+#        set default [--.src.autofit]
+#        $(MMS)$(MMSQUALIFIERS)
+        set default [--.src.autohint]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.base]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.bdf]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.cache]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.cff]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.cid]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.gzip]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.lzw]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.otvalid]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.pcf]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.pfr]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.psaux]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.pshinter]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.psnames]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.raster]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.sfnt]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.smooth]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.truetype]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.type1]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.type42]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [-.winfonts]
+        $(MMS)$(MMSQUALIFIERS)
+        set default [--]
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.builds.vms] directory"
+$ create [.builds.vms]descrip.mms
+$ open/append out [.builds.vms]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 system rules for VMS
+#
+
+
+# Copyright 2001 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([],[--.include],[--.src.base])
+
+OBJS=ftsystem.obj
+
+all : $(OBJS)
+        library/create [--.lib]freetype.olb $(OBJS)
+
+ftsystem.obj : ftsystem.c ftconfig.h
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.autofit] directory"
+$ create [.src.autofit]descrip.mms
+$ open/append out [.src.autofit]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 auto-fit module compilation rules for VMS
+#
+
+
+# Copyright 2002 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.
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.autofit])
+
+OBJS=afangles.obj,afhints.obj,aflatin.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.autohint] directory"
+$ create [.src.autohint]descrip.mms
+$ open/append out [.src.autohint]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 auto-hinter module compilation rules for VMS
+#
+
+
+# Copyright 2001, 2002 Catharon Productions Inc.
+#
+# This file is part of the Catharon Typography Project and shall only
+# be used, modified, and distributed under the terms of the Catharon
+# Open Source License that should come with this file under the name
+# `CatharonLicense.txt'.  By continuing to use, modify, or distribute
+# this file you indicate that you have read the license and
+# understand and accept it fully.
+#
+# Note that this license is compatible with the FreeType license.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/incl=([--.include],[--.src.autohint])
+
+OBJS=autohint.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.base] directory"
+$ create [.src.base]descrip.mms
+$ open/append out [.src.base]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 base layer compilation rules for VMS
+#
+
+
+# Copyright 2001, 2003 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.builds.vms],[--.include],[--.src.base])
+
+OBJS=ftbase.obj,ftinit.obj,ftglyph.obj,ftdebug.obj,ftbdf.obj,ftmm.obj,\
+     fttype1.obj,ftxf86.obj,ftpfr.obj,ftstroke.obj,ftwinfnt.obj,ftbbox.obj,\
+     ftbitmap.obj ftlcdfil.obj ftgasp.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.bdf] directory"
+$ create [.src.bdf]descrip.mms
+$ open/append out [.src.bdf]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 BDF driver compilation rules for VMS
+#
+
+
+# Copyright 2002 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.bdf])
+
+OBJS=bdf.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.cache] directory"
+$ create [.src.cache]descrip.mms
+$ open/append out [.src.cache]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 Cache compilation rules for VMS
+#
+
+
+# Copyright 2001, 2002, 2003, 2004 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.cache])
+
+OBJS=ftcache.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+ftcache.obj : ftcache.c ftcbasic.c ftccache.c ftccmap.c ftcglyph.c ftcimage.c \
+              ftcmanag.c ftcmru.c ftcsbits.c
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.cff] directory"
+$ create [.src.cff]descrip.mms
+$ open/append out [.src.cff]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 OpenType/CFF driver compilation rules for VMS
+#
+
+
+# Copyright 2001, 2002 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.cff])
+
+OBJS=cff.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.cid] directory"
+$ create [.src.cid]descrip.mms
+$ open/append out [.src.cid]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 CID driver compilation rules for VMS
+#
+
+
+# Copyright 2001 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.cid])
+
+OBJS=type1cid.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.gzip] directory"
+$ create [.src.gzip]descrip.mms
+$ open/append out [.src.gzip]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 GZip support compilation rules for VMS
+#
+
+
+# Copyright 2002 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.
+$EOD
+$ if libincs .nes. "" then write out "LIBINCS = ", libincs - ",", ","
+$ write out "COMP_FLAGS = ", ccopt
+$ copy sys$input: out
+$ deck
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=($(LIBINCS)[--.include],[--.src.gzip])
+
+OBJS=ftgzip.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.lzw] directory"
+$ create [.src.lzw]descrip.mms
+$ open/append out [.src.lzw]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 LZW support compilation rules for VMS
+#
+
+
+# Copyright 2004 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.
+$EOD
+$ if libincs .nes. "" then write out "LIBINCS = ", libincs - ",", ","
+$ write out "COMP_FLAGS = ", ccopt
+$ copy sys$input: out
+$ deck
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=($(LIBINCS)[--.include],[--.src.lzw])
+
+OBJS=ftlzw.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.otlayout] directory"
+$ create [.src.otlayout]descrip.mms
+$ open/append out [.src.otlayout]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 OT layout compilation rules for VMS
+#
+
+
+# Copyright 2004 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.otlayout])
+
+OBJS=otlbase.obj,otlcommn.obj,otlgdef.obj,otlgpos.obj,otlgsub.obj,\
+     otljstf.obj,otlparse.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.otvalid] directory"
+$ create [.src.otvalid]descrip.mms
+$ open/append out [.src.otvalid]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 OpenType validation module compilation rules for VMS
+#
+
+
+# Copyright 2004 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.otvalid])
+
+OBJS=otvalid.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.pcf] directory"
+$ create [.src.pcf]descrip.mms
+$ open/append out [.src.pcf]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 pcf driver compilation rules for VMS
+#
+
+
+# Copyright (C) 2001, 2002 by
+# Francesco Zappa Nardelli
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.pcf])
+
+OBJS=pcf.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.pfr] directory"
+$ create [.src.pfr]descrip.mms
+$ open/append out [.src.pfr]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 PFR driver compilation rules for VMS
+#
+
+
+# Copyright 2002 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.pfr])
+
+OBJS=pfr.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.psaux] directory"
+$ create [.src.psaux]descrip.mms
+$ open/append out [.src.psaux]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 PSaux driver compilation rules for VMS
+#
+
+
+# Copyright 2001, 2002 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.psaux])
+
+OBJS=psaux.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.pshinter] directory"
+$ create [.src.pshinter]descrip.mms
+$ open/append out [.src.pshinter]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 PSHinter driver compilation rules for OpenVMS
+#
+
+
+# Copyright 2001, 2002 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.psnames])
+
+OBJS=pshinter.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.psnames] directory"
+$ create [.src.psnames]descrip.mms
+$ open/append out [.src.psnames]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 PSNames driver compilation rules for VMS
+#
+
+
+# Copyright 2001, 2002 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.psnames])
+
+OBJS=psnames.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.raster] directory"
+$ create [.src.raster]descrip.mms
+$ open/append out [.src.raster]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 renderer module compilation rules for VMS
+#
+
+
+# Copyright 2001 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.raster])
+
+OBJS=raster.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.sfnt] directory"
+$ create [.src.sfnt]descrip.mms
+$ open/append out [.src.sfnt]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 SFNT driver compilation rules for VMS
+#
+
+
+# Copyright 2001, 2002 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.sfnt])
+
+OBJS=sfnt.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.smooth] directory"
+$ create [.src.smooth]descrip.mms
+$ open/append out [.src.smooth]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 smooth renderer module compilation rules for VMS
+#
+
+
+# Copyright 2001 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.smooth])
+
+OBJS=smooth.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.truetype] directory"
+$ create [.src.truetype]descrip.mms
+$ open/append out [.src.truetype]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 TrueType driver compilation rules for VMS
+#
+
+
+# Copyright 2001, 2002 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.truetype])
+
+OBJS=truetype.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.type1] directory"
+$ create [.src.type1]descrip.mms
+$ open/append out [.src.type1]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 Type1 driver compilation rules for VMS
+#
+
+
+# Copyright 1996-2000, 2002 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.type1])
+
+OBJS=type1.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+type1.obj : type1.c t1parse.c t1load.c t1objs.c t1driver.c t1gload.c t1afm.c
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.type42] directory"
+$ create [.src.type42]descrip.mms
+$ open/append out [.src.type42]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 Type 42 driver compilation rules for VMS
+#
+
+
+# Copyright 2002 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.type42])
+
+OBJS=type42.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ write sys$output "... [.src.winfonts] directory"
+$ create [.src.winfonts]descrip.mms
+$ open/append out [.src.winfonts]descrip.mms
+$ copy sys$input: out
+$ deck
+#
+# FreeType 2 Windows FNT/FON driver compilation rules for VMS
+#
+
+
+# Copyright 2001, 2002 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.
+
+
+CFLAGS=$(COMP_FLAGS)$(DEBUG)/include=([--.include],[--.src.winfonts])
+
+OBJS=winfnt.obj
+
+all : $(OBJS)
+        library [--.lib]freetype.olb $(OBJS)
+
+# EOF
+$ eod
+$ close out
+$ return
+$!------------------------------------------------------------------------------
+$!
+$! Check command line options and set symbols accordingly
+$!
+$ CHECK_OPTS:
+$ i = 1
+$ OPT_LOOP:
+$ if i .lt. 9
+$ then
+$   cparm = f$edit(p'i',"upcase")
+$   if cparm .eqs. "DEBUG"
+$   then
+$     ccopt = ccopt + "/noopt/deb"
+$     lopts = lopts + "/deb"
+$   endif
+$   if f$locate("CCOPT=",cparm) .lt. f$length(cparm)
+$   then
+$     start = f$locate("=",cparm) + 1
+$     len   = f$length(cparm) - start
+$     ccopt = ccopt + f$extract(start,len,cparm)
+$   endif
+$   if cparm .eqs. "LINK" then linkonly = true
+$   if f$locate("LOPTS=",cparm) .lt. f$length(cparm)
+$   then
+$     start = f$locate("=",cparm) + 1
+$     len   = f$length(cparm) - start
+$     lopts = lopts + f$extract(start,len,cparm)
+$   endif
+$   if f$locate("CC=",cparm) .lt. f$length(cparm)
+$   then
+$     start  = f$locate("=",cparm) + 1
+$     len    = f$length(cparm) - start
+$     cc_com = f$extract(start,len,cparm)
+      if (cc_com .nes. "DECC") .and. -
+         (cc_com .nes. "VAXC") .and. -
+        (cc_com .nes. "GNUC")
+$     then
+$       write sys$output "Unsupported compiler choice ''cc_com' ignored"
+$       write sys$output "Use DECC, VAXC, or GNUC instead"
+$     else
+$      if cc_com .eqs. "DECC" then its_decc = true
+$      if cc_com .eqs. "VAXC" then its_vaxc = true
+$      if cc_com .eqs. "GNUC" then its_gnuc = true
+$     endif
+$   endif
+$   if f$locate("MAKE=",cparm) .lt. f$length(cparm)
+$   then
+$     start  = f$locate("=",cparm) + 1
+$     len    = f$length(cparm) - start
+$     mmks = f$extract(start,len,cparm)
+$     if (mmks .eqs. "MMK") .or. (mmks .eqs. "MMS")
+$     then
+$       make = mmks
+$     else
+$       write sys$output "Unsupported make choice ''mmks' ignored"
+$       write sys$output "Use MMK or MMS instead"
+$     endif
+$   endif
+$   i = i + 1
+$   goto opt_loop
+$ endif
+$ return
+$!------------------------------------------------------------------------------
+$!
+$! Take care of driver file with information about external libraries
+$!
+$! Version history
+$! 0.01 20040220 First version to receive a number
+$! 0.02 20040229 Echo current procedure name; use general error exit handler
+$!               Remove xpm hack -> Replaced by more general dnsrl handling
+$CHECK_CREATE_VMSLIB:
+$!
+$ if f$search("VMSLIB.DAT") .eqs. ""
+$ then
+$   type/out=vmslib.dat sys$input
+!
+! This is a simple driver file with information used by vms_make.com to
+! check if external libraries (like t1lib and freetype) are available on
+! the system.
+!
+! Layout of the file:
+!
+!    - Lines starting with ! are treated as comments
+!    - Elements in a data line are separated by # signs
+!    - The elements need to be listed in the following order
+!      1.) Name of the Library (only used for informative messages
+!                               from vms_make.com)
+!      2.) Location where the object library can be found
+!      3.) Location where the include files for the library can be found
+!      4.) Include file used to verify library location
+!      5.) CPP define to pass to the build to indicate availability of
+!          the library
+!
+! Example: The following lines show how definitions
+!          might look like. They are site specific and the locations of the
+!          library and include files need almost certainly to be changed.
+!
+! Location: All of the libaries can be found at the following addresses
+!
+!   ZLIB:     http://zinser.no-ip.info/vms/sw/zlib.htmlx
+!
+ZLIB # sys$library:libz.olb # sys$library: # zlib.h # FT_CONFIG_OPTION_SYSTEM_ZLIB
+$   write sys$output "New driver file vmslib.dat created."
+$   write sys$output "Please customize libary locations for your site"
+$   write sys$output "and afterwards re-execute ''myproc'"
+$   goto err_exit
+$ endif
+$!
+$! Init symbols used to hold CPP definitions and include path
+$!
+$ libdefs = ""
+$ libincs = ""
+$!
+$! Open data file with location of libraries
+$!
+$ open/read/end=end_lib/err=err_lib libdata VMSLIB.DAT
+$LIB_LOOP:
+$ read/end=end_lib libdata libline
+$ libline = f$edit(libline, "UNCOMMENT,COLLAPSE")
+$ if libline .eqs. "" then goto LIB_LOOP ! Comment line
+$ libname = f$edit(f$element(0,"#",libline),"UPCASE")
+$ write sys$output "Processing ''libname' setup ..."
+$ libloc  = f$element(1,"#",libline)
+$ libsrc  = f$element(2,"#",libline)
+$ testinc = f$element(3,"#",libline)
+$ cppdef  = f$element(4,"#",libline)
+$ old_cpp = f$locate("=1",cppdef)
+$ if old_cpp.lt.f$length(cppdef) then cppdef = f$extract(0,old_cpp,cppdef)
+$ if f$search("''libloc'").eqs. ""
+$ then
+$   write sys$output "Can not find library ''libloc' - Skipping ''libname'"
+$   goto LIB_LOOP
+$ endif
+$ libsrc_elem = 0
+$ libsrc_found = false
+$LIBSRC_LOOP:
+$ libsrcdir = f$element(libsrc_elem,",",libsrc)
+$ if (libsrcdir .eqs. ",") then goto END_LIBSRC
+$ if f$search("''libsrcdir'''testinc'") .nes. "" then libsrc_found = true
+$ libsrc_elem = libsrc_elem + 1
+$ goto LIBSRC_LOOP
+$END_LIBSRC:
+$ if .not. libsrc_found
+$ then
+$   write sys$output "Can not find includes at ''libsrc' - Skipping ''libname'"
+$   goto LIB_LOOP
+$ endif
+$ if (cppdef .nes. "") then libdefs = libdefs +  cppdef + ","
+$ libincs = libincs + "," + libsrc
+$ lqual = "/lib"
+$ libtype = f$edit(f$parse(libloc,,,"TYPE"),"UPCASE")
+$ if f$locate("EXE",libtype) .lt. f$length(libtype) then lqual = "/share"
+$ write optf libloc , lqual
+$ if (f$trnlnm("topt") .nes. "") then write topt libloc , lqual
+$!
+$! Nasty hack to get the freetype includes to work
+$!
+$ ft2def = false
+$ if ((libname .eqs. "FREETYPE") .and. -
+      (f$locate("FREETYPE2",cppdef) .lt. f$length(cppdef)))
+$ then
+$   if ((f$search("freetype:freetype.h") .nes. "") .and. -
+        (f$search("freetype:[internal]ftobjs.h") .nes. ""))
+$   then
+$     write sys$output "Will use local definition of freetype logical"
+$   else
+$     ft2elem = 0
+$FT2_LOOP:
+$     ft2srcdir = f$element(ft2elem,",",libsrc)
+$     if f$search("''ft2srcdir'''testinc'") .nes. ""
+$     then
+$        if f$search("''ft2srcdir'internal.dir") .nes. ""
+$        then
+$          ft2dev  = f$parse("''ft2srcdir'",,,"device","no_conceal")
+$          ft2dir  = f$parse("''ft2srcdir'",,,"directory","no_conceal")
+$          ft2conc = f$locate("][",ft2dir)
+$          ft2len  = f$length(ft2dir)
+$          if ft2conc .lt. ft2len
+$          then
+$             ft2dir = f$extract(0,ft2conc,ft2dir) + -
+                       f$extract(ft2conc+2,ft2len-2,ft2dir)
+$          endif
+$          ft2dir = ft2dir - "]" + ".]"
+$          define freetype 'ft2dev''ft2dir','ft2srcdir'
+$          ft2def = true
+$        else
+$          goto ft2_err
+$        endif
+$     else
+$       ft2elem = ft2elem + 1
+$       goto ft2_loop
+$     endif
+$   endif
+$ endif
+$ goto LIB_LOOP
+$END_LIB:
+$ close libdata
+$ return
+$!------------------------------------------------------------------------------
+$!
+$! Analyze Object files for OpenVMS AXP to extract Procedure and Data
+$! information to build a symbol vector for a shareable image
+$! All the "brains" of this logic was suggested by Hartmut Becker
+$! (Hartmut.Becker@compaq.com). All the bugs were introduced by me
+$! (zinser@decus.de), so if you do have problem reports please do not
+$! bother Hartmut/HP, but get in touch with me
+$!
+$! Version history
+$! 0.01 20040006 Skip over shareable images in option file
+$!
+$ ANAL_OBJ_AXP: Subroutine
+$ V = 'F$Verify(0)
+$ SAY := "WRITE_ SYS$OUTPUT"
+$
+$ IF F$SEARCH("''P1'") .EQS. ""
+$ THEN
+$    SAY "ANAL_OBJ_AXP-E-NOSUCHFILE:  Error, inputfile ''p1' not available"
+$    goto exit_aa
+$ ENDIF
+$ IF "''P2'" .EQS. ""
+$ THEN
+$    SAY "ANAL_OBJ_AXP:  Error, no output file provided"
+$    goto exit_aa
+$ ENDIF
+$
+$ open/read in 'p1
+$ create a.tmp
+$ open/append atmp a.tmp
+$ loop:
+$ read/end=end_loop in line
+$ if f$locate("/SHARE",f$edit(line,"upcase")) .lt. f$length(line)
+$ then
+$   write sys$output "ANAL_SKP_SHR-i-skipshare, ''line'"
+$   goto loop
+$ endif
+$ if f$locate("/LIB",f$edit(line,"upcase")) .lt. f$length(line)
+$ then
+$   write libsf line
+$   write sys$output "ANAL_SKP_LIB-i-skiplib, ''line'"
+$   goto loop
+$ endif
+$ f= f$search(line)
+$ if f .eqs. ""
+$ then
+$      write sys$output "ANAL_OBJ_AXP-w-nosuchfile, ''line'"
+$      goto loop
+$ endif
+$ def/user sys$output nl:
+$ def/user sys$error nl:
+$ anal/obj/gsd 'f /out=x.tmp
+$ open/read xtmp x.tmp
+$ XLOOP:
+$ read/end=end_xloop xtmp xline
+$ xline = f$edit(xline,"compress")
+$ write atmp xline
+$ goto xloop
+$ END_XLOOP:
+$ close xtmp
+$ goto loop
+$ end_loop:
+$ close in
+$ close atmp
+$ if f$search("a.tmp") .eqs. "" -
+       then $ exit
+$ ! all global definitions
+$ search a.tmp "symbol:","EGSY$V_DEF 1","EGSY$V_NORM 1"/out=b.tmp
+$ ! all procedures
+$ search b.tmp "EGSY$V_NORM 1"/wind=(0,1) /out=c.tmp
+$ search c.tmp "symbol:"/out=d.tmp
+$ def/user sys$output nl:
+$ edito/edt/command=sys$input d.tmp
+sub/symbol: "/symbol_vector=(/whole
+sub/"/=PROCEDURE)/whole
+exit
+$ ! all data
+$ search b.tmp "EGSY$V_DEF 1"/wind=(0,1) /out=e.tmp
+$ search e.tmp "symbol:"/out=f.tmp
+$ def/user sys$output nl:
+$ edito/edt/command=sys$input f.tmp
+sub/symbol: "/symbol_vector=(/whole
+sub/"/=DATA)/whole
+exit
+$ sort/nodupl d.tmp,f.tmp 'p2'
+$ delete a.tmp;*,b.tmp;*,c.tmp;*,d.tmp;*,e.tmp;*,f.tmp;*
+$ if f$search("x.tmp") .nes. "" -
+       then $ delete x.tmp;*
+$!
+$ close libsf
+$ EXIT_AA:
+$ if V then set verify
+$ endsubroutine